agentix-cli 0.26.0 → 0.28.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.
- package/README.md +67 -118
- package/apps/mac-helper/Sources/AgentXHelper/AXTree.swift +159 -0
- package/apps/mac-helper/Sources/AgentXHelper/Brand.swift +63 -0
- package/apps/mac-helper/Sources/AgentXHelper/Focus.swift +97 -0
- package/apps/mac-helper/Sources/AgentXHelper/HUD.swift +179 -0
- package/apps/mac-helper/Sources/AgentXHelper/OCR.swift +117 -0
- package/apps/mac-helper/Sources/AgentXHelper/Pointer.swift +309 -0
- package/apps/mac-helper/Sources/AgentXHelper/Screens.swift +67 -0
- package/apps/mac-helper/Sources/AgentXHelper/Typer.swift +185 -0
- package/apps/mac-helper/Sources/AgentXHelper/Vision.swift +201 -0
- package/apps/mac-helper/Sources/AgentXHelper/main.swift +265 -0
- package/apps/mac-helper/build.sh +39 -0
- package/apps/mac-voice/Resources/Info.plist +18 -0
- package/apps/mac-voice/Sources/AgentXVoice/AgentClient.swift +108 -0
- package/apps/mac-voice/Sources/AgentXVoice/Brand.swift +123 -0
- package/apps/mac-voice/Sources/AgentXVoice/Config.swift +68 -0
- package/apps/mac-voice/Sources/AgentXVoice/Hold.swift +74 -0
- package/apps/mac-voice/Sources/AgentXVoice/Hotkey.swift +76 -0
- package/apps/mac-voice/Sources/AgentXVoice/Markdown.swift +140 -0
- package/apps/mac-voice/Sources/AgentXVoice/Panel.swift +275 -0
- package/apps/mac-voice/Sources/AgentXVoice/Progress.swift +147 -0
- package/apps/mac-voice/Sources/AgentXVoice/Recorder.swift +139 -0
- package/apps/mac-voice/Sources/AgentXVoice/ResultCard.swift +162 -0
- package/apps/mac-voice/Sources/AgentXVoice/SmartPaste.swift +72 -0
- package/apps/mac-voice/Sources/AgentXVoice/Speech.swift +192 -0
- package/apps/mac-voice/Sources/AgentXVoice/StepLabel.swift +159 -0
- package/apps/mac-voice/Sources/AgentXVoice/main.swift +380 -0
- package/apps/mac-voice/build.sh +32 -0
- package/dist/{App-BPNHIGUX.js → App-CKPH3HHF.js} +2 -2
- package/dist/{ChatApp-6XSSZB4U.js → ChatApp-MX7IG4K2.js} +2 -2
- package/dist/agent-2U574KBZ.js +2 -0
- package/dist/article-fields-L4D2BOGY.js +2 -0
- package/dist/article-quality-44ONVGLN.js +3 -0
- package/dist/article-quality-44ONVGLN.js.map +1 -0
- package/dist/{audit-JU3HWISB.js → audit-4245CX6P.js} +2 -2
- package/dist/backfill-MTD2B62I.js +6 -0
- package/dist/backfill-MTD2B62I.js.map +1 -0
- package/dist/{board-dashboard-M3372FLO.js → board-dashboard-QR7CVTKA.js} +1411 -453
- package/dist/board-dashboard-QR7CVTKA.js.map +1 -0
- package/dist/{builtin-FRKAQMFS.js → builtin-B67DMJ3M.js} +2 -2
- package/dist/calibration-ILS5OI44.js +2 -0
- package/dist/{chunk-V3U4OF7L.js → chunk-3LYM22IV.js} +46 -48
- package/dist/chunk-3LYM22IV.js.map +1 -0
- package/dist/chunk-3SCPRYJB.js +5 -0
- package/dist/chunk-3SCPRYJB.js.map +1 -0
- package/dist/chunk-4BR7D2OU.js +36 -0
- package/dist/chunk-4BR7D2OU.js.map +1 -0
- package/dist/{chunk-P4VWIVKN.js → chunk-52ZPELD2.js} +403 -29
- package/dist/chunk-52ZPELD2.js.map +1 -0
- package/dist/chunk-5IA2CYHN.js +5 -0
- package/dist/{chunk-O6YPEOQF.js.map → chunk-5IA2CYHN.js.map} +1 -1
- package/dist/chunk-64CAIB3C.js +9 -0
- package/dist/chunk-64CAIB3C.js.map +1 -0
- package/dist/{chunk-5U35WAZF.js → chunk-77OV7346.js} +6 -6
- package/dist/chunk-77OV7346.js.map +1 -0
- package/dist/chunk-AJ5RMU7X.js +2 -0
- package/dist/chunk-AJ5RMU7X.js.map +1 -0
- package/dist/chunk-AJONZWLT.js +2 -0
- package/dist/chunk-AJONZWLT.js.map +1 -0
- package/dist/chunk-BH3GTCZ6.js +2 -0
- package/dist/chunk-BH3GTCZ6.js.map +1 -0
- package/dist/chunk-E3UJHQGN.js +1189 -0
- package/dist/chunk-E3UJHQGN.js.map +1 -0
- package/dist/chunk-EVWEG3VD.js +3 -0
- package/dist/chunk-EVWEG3VD.js.map +1 -0
- package/dist/chunk-F4HZTZHW.js +2 -0
- package/dist/chunk-F4HZTZHW.js.map +1 -0
- package/dist/chunk-F6CNF7V3.js +25 -0
- package/dist/chunk-F6CNF7V3.js.map +1 -0
- package/dist/chunk-FIOB3MEX.js +2 -0
- package/dist/{chunk-H5D7ATXS.js → chunk-FKBGJYWQ.js} +5 -5
- package/dist/chunk-FKBGJYWQ.js.map +1 -0
- package/dist/{chunk-BVGJSPW4.js → chunk-G2HMRDUQ.js} +7 -7
- package/dist/chunk-G2HMRDUQ.js.map +1 -0
- package/dist/chunk-H2QQU2XV.js +109 -0
- package/dist/chunk-H2QQU2XV.js.map +1 -0
- package/dist/{chunk-LDHPMJ7M.js → chunk-IWMW5432.js} +3 -3
- package/dist/chunk-IWMW5432.js.map +1 -0
- package/dist/chunk-K33GIBSE.js +2 -0
- package/dist/chunk-K33GIBSE.js.map +1 -0
- package/dist/chunk-L2WSPY6S.js +2 -0
- package/dist/chunk-L2WSPY6S.js.map +1 -0
- package/dist/chunk-LCIREYTD.js +54 -0
- package/dist/chunk-LCIREYTD.js.map +1 -0
- package/dist/chunk-MHIMGM4G.js +126 -0
- package/dist/chunk-MHIMGM4G.js.map +1 -0
- package/dist/chunk-P5ZBBEPL.js +13 -0
- package/dist/chunk-P5ZBBEPL.js.map +1 -0
- package/dist/{chunk-JTJIPNXY.js → chunk-PNWNVOEZ.js} +1 -1
- package/dist/chunk-PNWNVOEZ.js.map +1 -0
- package/dist/chunk-QHTQPBHU.js +45 -0
- package/dist/chunk-QHTQPBHU.js.map +1 -0
- package/dist/chunk-S2MNL5V6.js +2 -0
- package/dist/chunk-S2MNL5V6.js.map +1 -0
- package/dist/chunk-SCTIUFL4.js +5 -0
- package/dist/{chunk-K2CAPYES.js.map → chunk-SCTIUFL4.js.map} +1 -1
- package/dist/chunk-ULLAE6LE.js +157 -0
- package/dist/chunk-ULLAE6LE.js.map +1 -0
- package/dist/{chunk-DJEZ2HVU.js → chunk-VDMYBPYB.js} +1 -1
- package/dist/chunk-VDMYBPYB.js.map +1 -0
- package/dist/chunk-VIH7ARPF.js +547 -0
- package/dist/chunk-VIH7ARPF.js.map +1 -0
- package/dist/chunk-W5C2GDNC.js +32 -0
- package/dist/{chunk-JP5IEXR7.js.map → chunk-W5C2GDNC.js.map} +1 -1
- package/dist/chunk-WPMX3VGI.js +3 -0
- package/dist/chunk-WPMX3VGI.js.map +1 -0
- package/dist/chunk-YLBERT7N.js +24 -0
- package/dist/chunk-YLBERT7N.js.map +1 -0
- package/dist/chunk-YLGIZRHV.js +114 -0
- package/dist/chunk-YLGIZRHV.js.map +1 -0
- package/dist/chunk-ZMYGXHPT.js +121 -0
- package/dist/chunk-ZMYGXHPT.js.map +1 -0
- package/dist/chunk-ZTEU5JVQ.js +2 -0
- package/dist/chunk-ZTEU5JVQ.js.map +1 -0
- package/dist/{chunk-2WVX3LEC.js → chunk-ZVP6GB4G.js} +1 -1
- package/dist/chunk-ZVP6GB4G.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/client-ZLSXGPTV.js +2 -0
- package/dist/{compaction-NWEMOSHA.js → compaction-FD4R23HZ.js} +4 -4
- package/dist/config-HMW3EBZL.js +2 -0
- package/dist/config-mutator-4SZ5YEVD.js +2 -0
- package/dist/{conflict-detector-D7VIYPDI.js → conflict-detector-ZPOT3M2C.js} +2 -2
- package/dist/conflict-detector-ZPOT3M2C.js.map +1 -0
- package/dist/context-planner-AQHJMVY2.js +17 -0
- package/dist/context-planner-AQHJMVY2.js.map +1 -0
- package/dist/debug-3MEUO2P2.js +2 -0
- package/dist/{discover-XJXQXXIO.js → discover-D4VVRNAI.js} +2 -2
- package/dist/discover-D4VVRNAI.js.map +1 -0
- package/dist/doctor-LRYV3QLK.js +2 -0
- package/dist/editor-chat-OB7IQOB5.js +137 -0
- package/dist/editor-chat-OB7IQOB5.js.map +1 -0
- package/dist/entry-triage-LK34TSQD.js +2 -0
- package/dist/entry-triage-LK34TSQD.js.map +1 -0
- package/dist/facts-YVEJOM7O.js +22 -0
- package/dist/facts-YVEJOM7O.js.map +1 -0
- package/dist/heal-FVLBHYP7.js +2 -0
- package/dist/index.d.ts +1040 -64
- package/dist/index.js +12 -19
- package/dist/index.js.map +1 -1
- package/dist/{ingest-whatsapp-LZE62INA.js → ingest-whatsapp-NS4OWDOU.js} +2 -2
- package/dist/loader-4ZGTK7LD.js +2 -0
- package/dist/loader-BOKE5M5S.js +2 -0
- package/dist/memory-extract-F5ZHWY5E.js +2 -0
- package/dist/{migrate-v2-QO7SLKIM.js → migrate-v2-V4WN2VVM.js} +2 -2
- package/dist/ntfy-X7EPB3TG.js +4 -0
- package/dist/ntfy-X7EPB3TG.js.map +1 -0
- package/dist/processes-WU23U2OJ.js +2 -0
- package/dist/program-GSZ5AYAM.js +2 -0
- package/dist/{projects-api-KRME2YKZ.js → projects-api-QE6L65SK.js} +2 -2
- package/dist/{projects-mutate-3NHVG437.js → projects-mutate-MY7JTLSZ.js} +2 -2
- package/dist/providers-KO2DODIO.js +2 -0
- package/dist/query-SQDHE4HV.js +2 -0
- package/dist/questions-4B4KSPXG.js +3 -0
- package/dist/questions-4B4KSPXG.js.map +1 -0
- package/dist/recipes-7S4MC5OJ.js +2 -0
- package/dist/registry-LE6FWYZC.js +2 -0
- package/dist/review-candidates-RQU5KNZM.js +4 -0
- package/dist/review-candidates-RQU5KNZM.js.map +1 -0
- package/dist/review-store-B4YE3EFK.js +4 -0
- package/dist/review-store-B4YE3EFK.js.map +1 -0
- package/dist/{rotation-memo-B3EXXSEH.js → rotation-memo-7T75BLEX.js} +2 -2
- package/dist/routing-ILERJXB6.js +2 -0
- package/dist/runner-YRBVNYTY.js +2 -0
- package/dist/scheduler-BFM3EINS.js +2 -0
- package/dist/seat-7WM7II2B.js +2 -0
- package/dist/select-X4KVMOP5.js +2 -0
- package/dist/select-X4KVMOP5.js.map +1 -0
- package/dist/store-MCOA6N4F.js +2 -0
- package/dist/{subagent-WV7QKQ3L.js → subagent-2SJHSSJS.js} +2 -2
- package/dist/{surface-usage-PRL6Z4U3.js → surface-usage-NS74AXSE.js} +2 -2
- package/dist/timers-PCB4ZIBD.js +2 -0
- package/dist/triage-backtest-JNO7RKX7.js +2 -0
- package/dist/triage-backtest-JNO7RKX7.js.map +1 -0
- package/dist/types-H5ENIUIT.js +2 -0
- package/dist/types-OIFU3KSQ.js +2 -0
- package/dist/types-OIFU3KSQ.js.map +1 -0
- package/dist/web/workflow-editor.global.js +1542 -0
- package/dist/web/workflow-editor.global.js.map +1 -0
- package/dist/{whatsapp-state-XMTCSRXU.js → whatsapp-state-6D6FHHD2.js} +2 -2
- package/dist/wiki-2AUFSIKO.js +2 -0
- package/dist/wiki-2AUFSIKO.js.map +1 -0
- package/dist/workflows/templates/branching.yaml +1 -1
- package/dist/{workspace-setup-TBQAHYHJ.js → workspace-setup-B3F3TUDE.js} +2 -2
- package/dist/workspace-setup-B3F3TUDE.js.map +1 -0
- package/package.json +14 -3
- package/scripts/postinstall.mjs +80 -0
- package/dist/agent-5QMITZT6.js +0 -2
- package/dist/architect-SEPWMWS4.js +0 -2
- package/dist/board-dashboard-M3372FLO.js.map +0 -1
- package/dist/chunk-2WVX3LEC.js.map +0 -1
- package/dist/chunk-3WQFCIB6.js +0 -24
- package/dist/chunk-3WQFCIB6.js.map +0 -1
- package/dist/chunk-4YCH6IZV.js +0 -2
- package/dist/chunk-53NRX2NA.js +0 -2
- package/dist/chunk-53NRX2NA.js.map +0 -1
- package/dist/chunk-5U35WAZF.js.map +0 -1
- package/dist/chunk-BFXONUUN.js +0 -108
- package/dist/chunk-BFXONUUN.js.map +0 -1
- package/dist/chunk-BFZUG66X.js +0 -45
- package/dist/chunk-BFZUG66X.js.map +0 -1
- package/dist/chunk-BTHHSY7D.js +0 -13
- package/dist/chunk-BTHHSY7D.js.map +0 -1
- package/dist/chunk-BVGJSPW4.js.map +0 -1
- package/dist/chunk-D46VZ7K7.js +0 -116
- package/dist/chunk-D46VZ7K7.js.map +0 -1
- package/dist/chunk-DJEZ2HVU.js.map +0 -1
- package/dist/chunk-E5CXCI33.js +0 -155
- package/dist/chunk-E5CXCI33.js.map +0 -1
- package/dist/chunk-FDWOECJY.js +0 -54
- package/dist/chunk-FDWOECJY.js.map +0 -1
- package/dist/chunk-H5D7ATXS.js.map +0 -1
- package/dist/chunk-HR4JSRZS.js +0 -3
- package/dist/chunk-HR4JSRZS.js.map +0 -1
- package/dist/chunk-ISEBLHWX.js +0 -118
- package/dist/chunk-ISEBLHWX.js.map +0 -1
- package/dist/chunk-JP5IEXR7.js +0 -32
- package/dist/chunk-JTJIPNXY.js.map +0 -1
- package/dist/chunk-K2CAPYES.js +0 -5
- package/dist/chunk-LDHPMJ7M.js.map +0 -1
- package/dist/chunk-METYYZKQ.js +0 -1115
- package/dist/chunk-METYYZKQ.js.map +0 -1
- package/dist/chunk-MTAPOCGA.js +0 -47
- package/dist/chunk-MTAPOCGA.js.map +0 -1
- package/dist/chunk-O6YPEOQF.js +0 -5
- package/dist/chunk-P4VWIVKN.js.map +0 -1
- package/dist/chunk-SR3X25TN.js +0 -3
- package/dist/chunk-SR3X25TN.js.map +0 -1
- package/dist/chunk-UHE5FCPB.js +0 -431
- package/dist/chunk-UHE5FCPB.js.map +0 -1
- package/dist/chunk-V3U4OF7L.js.map +0 -1
- package/dist/chunk-VJUTQAPJ.js +0 -2
- package/dist/chunk-VJUTQAPJ.js.map +0 -1
- package/dist/chunk-VT5XYFDD.js +0 -126
- package/dist/chunk-VT5XYFDD.js.map +0 -1
- package/dist/client-HGKAC6VP.js +0 -2
- package/dist/config-A4RWEJHV.js +0 -2
- package/dist/config-mutator-MNSFUN7D.js +0 -2
- package/dist/conflict-detector-D7VIYPDI.js.map +0 -1
- package/dist/context-planner-45GEWKGL.js +0 -17
- package/dist/context-planner-45GEWKGL.js.map +0 -1
- package/dist/debug-N3B5NVJU.js +0 -2
- package/dist/discover-XJXQXXIO.js.map +0 -1
- package/dist/doctor-3Q36ZFE6.js +0 -2
- package/dist/heal-HZ3EQD52.js +0 -2
- package/dist/loader-5CA3O5GM.js +0 -2
- package/dist/loader-6IHUCPVO.js +0 -2
- package/dist/memory-extract-AENFVVO5.js +0 -2
- package/dist/processes-UIC4XXA6.js +0 -2
- package/dist/program-SAUNRCCD.js +0 -2
- package/dist/providers-L27BJ5A6.js +0 -2
- package/dist/query-HZYYRCLU.js +0 -2
- package/dist/recipes-EPLE2SNT.js +0 -2
- package/dist/registry-HK3WQ7BS.js +0 -2
- package/dist/runner-BFYDWPUO.js +0 -2
- package/dist/scheduler-6T2SU5ST.js +0 -2
- package/dist/store-I3HEWVLQ.js +0 -2
- package/dist/timers-5LPZN55J.js +0 -2
- package/dist/types-VECTMYTO.js +0 -2
- package/dist/types-Y6ZCZ52Z.js +0 -2
- package/dist/wiki-M6YNRFC4.js +0 -2
- /package/dist/{App-BPNHIGUX.js.map → App-CKPH3HHF.js.map} +0 -0
- /package/dist/{ChatApp-6XSSZB4U.js.map → ChatApp-MX7IG4K2.js.map} +0 -0
- /package/dist/{agent-5QMITZT6.js.map → agent-2U574KBZ.js.map} +0 -0
- /package/dist/{architect-SEPWMWS4.js.map → article-fields-L4D2BOGY.js.map} +0 -0
- /package/dist/{audit-JU3HWISB.js.map → audit-4245CX6P.js.map} +0 -0
- /package/dist/{builtin-FRKAQMFS.js.map → builtin-B67DMJ3M.js.map} +0 -0
- /package/dist/{chunk-4YCH6IZV.js.map → calibration-ILS5OI44.js.map} +0 -0
- /package/dist/{client-HGKAC6VP.js.map → chunk-FIOB3MEX.js.map} +0 -0
- /package/dist/{config-A4RWEJHV.js.map → client-ZLSXGPTV.js.map} +0 -0
- /package/dist/{compaction-NWEMOSHA.js.map → compaction-FD4R23HZ.js.map} +0 -0
- /package/dist/{config-mutator-MNSFUN7D.js.map → config-HMW3EBZL.js.map} +0 -0
- /package/dist/{debug-N3B5NVJU.js.map → config-mutator-4SZ5YEVD.js.map} +0 -0
- /package/dist/{doctor-3Q36ZFE6.js.map → debug-3MEUO2P2.js.map} +0 -0
- /package/dist/{heal-HZ3EQD52.js.map → doctor-LRYV3QLK.js.map} +0 -0
- /package/dist/{loader-5CA3O5GM.js.map → heal-FVLBHYP7.js.map} +0 -0
- /package/dist/{ingest-whatsapp-LZE62INA.js.map → ingest-whatsapp-NS4OWDOU.js.map} +0 -0
- /package/dist/{loader-6IHUCPVO.js.map → loader-4ZGTK7LD.js.map} +0 -0
- /package/dist/{memory-extract-AENFVVO5.js.map → loader-BOKE5M5S.js.map} +0 -0
- /package/dist/{processes-UIC4XXA6.js.map → memory-extract-F5ZHWY5E.js.map} +0 -0
- /package/dist/{migrate-v2-QO7SLKIM.js.map → migrate-v2-V4WN2VVM.js.map} +0 -0
- /package/dist/{program-SAUNRCCD.js.map → processes-WU23U2OJ.js.map} +0 -0
- /package/dist/{providers-L27BJ5A6.js.map → program-GSZ5AYAM.js.map} +0 -0
- /package/dist/{projects-api-KRME2YKZ.js.map → projects-api-QE6L65SK.js.map} +0 -0
- /package/dist/{projects-mutate-3NHVG437.js.map → projects-mutate-MY7JTLSZ.js.map} +0 -0
- /package/dist/{query-HZYYRCLU.js.map → providers-KO2DODIO.js.map} +0 -0
- /package/dist/{recipes-EPLE2SNT.js.map → query-SQDHE4HV.js.map} +0 -0
- /package/dist/{registry-HK3WQ7BS.js.map → recipes-7S4MC5OJ.js.map} +0 -0
- /package/dist/{runner-BFYDWPUO.js.map → registry-LE6FWYZC.js.map} +0 -0
- /package/dist/{rotation-memo-B3EXXSEH.js.map → rotation-memo-7T75BLEX.js.map} +0 -0
- /package/dist/{scheduler-6T2SU5ST.js.map → routing-ILERJXB6.js.map} +0 -0
- /package/dist/{store-I3HEWVLQ.js.map → runner-YRBVNYTY.js.map} +0 -0
- /package/dist/{surface-usage-PRL6Z4U3.js.map → scheduler-BFM3EINS.js.map} +0 -0
- /package/dist/{timers-5LPZN55J.js.map → seat-7WM7II2B.js.map} +0 -0
- /package/dist/{types-VECTMYTO.js.map → store-MCOA6N4F.js.map} +0 -0
- /package/dist/{subagent-WV7QKQ3L.js.map → subagent-2SJHSSJS.js.map} +0 -0
- /package/dist/{types-Y6ZCZ52Z.js.map → surface-usage-NS74AXSE.js.map} +0 -0
- /package/dist/{wiki-M6YNRFC4.js.map → timers-PCB4ZIBD.js.map} +0 -0
- /package/dist/{workspace-setup-TBQAHYHJ.js.map → types-H5ENIUIT.js.map} +0 -0
- /package/dist/{whatsapp-state-XMTCSRXU.js.map → whatsapp-state-6D6FHHD2.js.map} +0 -0
package/dist/chunk-MTAPOCGA.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import{a as ie}from"./chunk-M4AMWP3H.js";import{b as oe}from"./chunk-AFRHKA7B.js";import{a as Ae,c as $e,d as Te,f as De,g as Pe,h as We}from"./chunk-D46VZ7K7.js";import{a as y,b as j}from"./chunk-ISEBLHWX.js";import{existsSync as bt,mkdirSync as Ne,readFileSync as vt,writeFileSync as It,renameSync as St}from"fs";import{resolve as Ee,dirname as Rt}from"path";var xe=class{filePath;log;constructor(e={}){let t=e.baseDir??Ee(process.cwd(),".agentx");this.filePath=Ee(t,"handover.json"),this.log=e.log??console.error.bind(console,"[handover]"),Ne(t,{recursive:!0})}key(e,t,r){return`${e}::${t}::${r||"-"}`}load(){if(!bt(this.filePath))return{version:1,overrides:{}};try{let e=vt(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){Ne(Rt(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp-${process.pid}`;It(t,JSON.stringify(e,null,2)),St(t,this.filePath)}get(e,t,r){let o=this.load().overrides[this.key(e,t,r)];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(),r={...e,createdAt:e.createdAt??new Date().toISOString()};return t.overrides[this.key(r.channel,r.chatId,r.accountId)]=r,this.save(t),r}remove(e,t,r){let s=this.load(),o=this.key(e,t,r);return o in s.overrides?(delete s.overrides[o],this.save(s),!0):!1}consumeSummary(e,t,r){let s=this.load(),o=s.overrides[this.key(e,t,r)];if(!o||!o.summary||o.summaryConsumedAt)return;let i=o.summary;return o.summaryConsumedAt=new Date().toISOString(),this.save(s),i}listActive(){let e=this.load(),t=Date.now();return Object.values(e.overrides).filter(r=>!r.expiresAt||Date.parse(r.expiresAt)>=t)}listByAgent(e){let t=this.listActive();return{incoming:t.filter(r=>r.toAgent===e),outgoing:t.filter(r=>r.fromAgent===e)}}};import{existsSync as b,mkdirSync as Et,readdirSync as z,readFileSync as G,unlinkSync as V,writeFileSync as de}from"fs";import{resolve as R,relative as le}from"path";import Oe from"js-yaml";var At=new Set(["branch","gateway.parallel","rule","signal.wait","subProcess","timer.boundary","checkpoint"]),k=class extends Error{constructor(t,r){super(t);this.mark=r;this.name="WorkflowYamlError"}};function x(n,e={}){if(!n||n.trim()==="")throw new k(`${A(e)}empty file \u2014 workflow YAML must contain at least an id, version, title, and one node.`);let t;try{t=Oe.loadAll(n)}catch(s){let o=s?.mark;throw new k(`${A(e)}YAML parse error: ${s?.reason??s?.message??s}`+(o?` (line ${o.line+1}, column ${o.column+1})`:""),o)}if(t.length===0||t.length===1&&t[0]==null)throw new k(`${A(e)}YAML produced no document.`);if(t.length>1)throw new k(`${A(e)}multi-document YAML is not supported in v1; one workflow per file.`);let r=t[0];if(typeof r!="object"||r===null||Array.isArray(r)){let s=Array.isArray(r)?"array":typeof r;throw new k(`${A(e)}top-level YAML must be a mapping (got ${s}).`)}return je(r,e)}function je(n,e={}){if(!("flow"in n))return n;let t=n.flow;if(t==null){let c={...n};return delete c.flow,c}if(!Array.isArray(t))throw new k(`${A(e)}flow must be an array of node ids (got ${typeof t}).`);for(let c of t)if(typeof c!="string")throw new k(`${A(e)}flow entries must be strings (got ${typeof c}).`);let r=t,s=Array.isArray(n.nodes)?n.nodes:[],o=new Map;for(let c of s)c&&typeof c=="object"&&typeof c.id=="string"&&typeof c.type=="string"&&o.set(c.id,c.type);for(let c of r){if(!o.has(c))throw new k(`${A(e)}flow references unknown node "${c}".`);let f=o.get(c);if(At.has(f))throw new k(`${A(e)}flow cannot include ${f} node "${c}"; use explicit edges for ${f} nodes.`)}let i=[];for(let c=0;c<r.length-1;c++)i.push({from:r[c],to:r[c+1]});let a=Array.isArray(n.edges)?n.edges:[],d=new Set,l=[];for(let c of a){if(!c||typeof c!="object")continue;let f=_e(c.from,c.fromPort,c.to);f&&!d.has(f)?(d.add(f),l.push(c)):f||l.push(c)}for(let c of i){let f=_e(c.from,void 0,c.to);f&&!d.has(f)&&(d.add(f),l.push(c))}let p={...n,edges:l};return delete p.flow,p}function _e(n,e,t){return typeof n!="string"||typeof t!="string"?null:`${n}::${typeof e=="string"?e:""}::${t}`}function A(n){return n.filePath?`${n.filePath}: `:""}function Y(n){return Oe.dump(n,{noRefs:!0,lineWidth:100,sortKeys:!1})}import{Document as $t,isMap as J,isSeq as Tt,isScalar as Fe,parseDocument as Dt}from"yaml";function Ce(n,e){let t=Dt(n);if(!t.contents||!J(t.contents)){let r=new $t(e);return t.commentBefore&&(r.commentBefore=t.commentBefore),String(r)}return ae(t,t.contents,e),String(t)}function ae(n,e,t){let r=Object.keys(t),s=new Set(r),o=new Map;for(let a of e.items){let d=Nt(a);d!==null&&o.set(d,a)}let i=[];for(let a of r){let d=t[a],l=o.get(a);l?(Pt(n,l,d),i.push(l)):i.push(n.createPair(a,d))}e.items=i}function Pt(n,e,t){let r=e.value;if(t==null){e.value=n.createNode(null);return}if(typeof t!="object"){e.value=n.createNode(t);return}if(Array.isArray(t)){Tt(r)?Wt(n,r,t):e.value=n.createNode(t);return}J(r)?ae(n,r,t):e.value=n.createNode(t)}function Wt(n,e,t){if(!(t.length>0&&t.every(i=>i&&typeof i=="object"&&typeof i.id=="string"))){let i=n.createNode(t);e.items=i.items;return}let s=new Map;for(let i of e.items)if(J(i)){let a=i.get("id",!0);Fe(a)&&typeof a.value=="string"&&s.set(a.value,i)}let o=[];for(let i of t){let a=i.id,d=s.get(a);d&&J(d)?(ae(n,d,i),o.push(d)):o.push(n.createNode(i))}e.items=o}function Nt(n){let e=n.key;return Fe(e)&&typeof e.value=="string"?e.value:typeof e=="string"?e:null}var ce=class{baseDir;constructor(e={}){this.baseDir=e.baseDir??R(process.cwd(),".agentx/workflows"),Et(this.baseDir,{recursive:!0})}pathFor(e){return this.pathForJson(e)}pathForJson(e){return R(this.baseDir,`${e}.json`)}pathForYaml(e){return R(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=R(this.baseDir,e),r=G(t,"utf-8");return e.endsWith(".json")?JSON.parse(r):x(r,{filePath:e})}list(){if(!b(this.baseDir))return[];let e=new Map;for(let r of z(this.baseDir,{withFileTypes:!0})){if(!r.isFile()||!this.isWorkflowFile(r.name))continue;let s=this.idFromFilename(r.name),o=e.get(s)??[];o.push(r.name),e.set(s,o)}let t=[];for(let[,r]of e)if(!(r.length>1))try{let s=this.readAndParse(r[0]),o=y.safeParse(s);o.success&&t.push(o.data)}catch{}return t.sort((r,s)=>r.id.localeCompare(s.id))}validateAll(){let e=[];if(!b(this.baseDir))return e;let t=new Map;for(let r of z(this.baseDir,{withFileTypes:!0})){if(!r.isFile()||!this.isWorkflowFile(r.name))continue;let s=this.idFromFilename(r.name),o=t.get(s)??[];o.push(r.name),t.set(s,o)}for(let[r,s]of t){if(s.length>1){let c=[...s].sort();for(let f of c)e.push({id:r,path:le(this.baseDir,R(this.baseDir,f)),issues:[`duplicate workflow id "${r}" \u2014 found ${c.join(" and ")}; delete one to disambiguate`],isValid:!1});continue}let o=s[0],i=R(this.baseDir,o),a=le(this.baseDir,i),d;try{d=this.readAndParse(o)}catch(c){let f=c instanceof k?c.message:`parse error: ${c?.message??c}`;e.push({id:r,path:a,issues:[f],isValid:!1});continue}let l=y.safeParse(d);if(!l.success){let c=l.error.issues.map(f=>`${f.path.join(".")||"<root>"}: ${f.message}`);e.push({id:String(d?.id??r),path:a,issues:c,isValid:!1});continue}let p=j(l.data);e.push({workflow:l.data,issues:p,isValid:p.length===0})}return e}get(e){let t=this.pathForJson(e),r=this.pathForYaml(e),s=R(this.baseDir,`${e}.yml`),o=b(t),i=b(r)||b(s);if(o&&i)return null;if(o)try{let d=JSON.parse(G(t,"utf-8")),l=y.safeParse(d);return l.success?l.data:null}catch{return null}let a=b(r)?r:b(s)?s:null;if(a)try{let d=G(a,"utf-8"),l=x(d,{filePath:le(this.baseDir,a)}),p=y.safeParse(l);return p.success?p.data:null}catch{return null}if(!b(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 p=this.readAndParse(d.name),c=y.safeParse(p);if(c.success&&c.data.id===e)return c.data}catch{}return null}save(e,t={}){let r=new Date().toISOString().slice(0,10),s=y.parse({...e,created:e.created||r,updated:r}),o=this.pathForYaml(s.id),i=R(this.baseDir,`${s.id}.yml`),a=b(o)?o:b(i)?i:null;if(!a&&b(this.baseDir)){for(let d of z(this.baseDir,{withFileTypes:!0}))if(!(!d.isFile()||!this.isWorkflowFile(d.name))&&!d.name.endsWith(".json"))try{let l=this.readAndParse(d.name),p=y.safeParse(l);if(p.success&&p.data.id===s.id){a=R(this.baseDir,d.name);break}}catch{}}if(a&&t.convertFromYaml)return V(a),de(this.pathForJson(s.id),JSON.stringify(s,null,2)+`
|
|
2
|
-
`),s;if(a){let d=G(a,"utf-8");try{let l=Ce(d,s);return de(a,l),s}catch(l){let p=new Error(`yaml round-trip failed for "${s.id}" at ${a}: ${l?.message??l}`);throw p.yamlPath=a,p}}return de(this.pathForJson(s.id),JSON.stringify(s,null,2)+`
|
|
3
|
-
`),s}delete(e){let t=this.pathForJson(e),r=this.pathForYaml(e),s=R(this.baseDir,`${e}.yml`),o=!1;return b(t)&&(V(t),o=!0),b(r)&&(V(r),o=!0),b(s)&&(V(s),o=!0),o}};import{createHash as xt,randomUUID as _t}from"crypto";import{appendFileSync as Me,existsSync as _,mkdirSync as Le,readdirSync as He,readFileSync as ue,statSync as Ue,unlinkSync as qe,writeFileSync as Ot}from"fs";import{resolve as N}from"path";function jt(n){return n.replace(/[^a-zA-Z0-9._:#@-]/g,"_").slice(0,200)}function T(n,e,t){return xt("sha1").update(`${n}|${e}|${t}`).digest("hex").slice(0,16)}var pe=class{baseDir;runsDir;indexDir;nodeId;constructor(e){this.baseDir=e.baseDir??N(process.cwd(),".agentx/workflows"),this.runsDir=N(this.baseDir,"_runs"),this.indexDir=N(this.baseDir,"_index"),this.nodeId=e.nodeId,Le(this.runsDir,{recursive:!0}),Le(this.indexDir,{recursive:!0})}runPath(e){return N(this.runsDir,`${e}.jsonl`)}indexPath(e){return N(this.indexDir,`${e.backend}__${jt(e.id)}.json`)}create(e){let t=new Date().toISOString(),r=_t(),s={id:r,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??r,depth:e.depth??0,joinCounters:{},createdAt:t,updatedAt:t};return this.appendSnapshot(s),this.writeIndex(e.entityRef,s.id),s}get(e){let t=this.runPath(e);if(!_(t))return null;let r=ue(t,"utf-8").trim();if(!r)return null;let s=null;for(let o of r.split(`
|
|
4
|
-
`)){let i;try{i=JSON.parse(o)}catch{continue}if(i.v===2){if(i.kind==="snapshot")s=i.run;else if(i.kind==="exec"&&s&&s.id===i.runId){let a=s;s={...a,history:[...a.history,i.entry],pending:i.pending,status:i.status??a.status,pausedAt:i.pausedAt===null?void 0:i.pausedAt??a.pausedAt,context:i.context??a.context,joinCounters:i.joinCounters??a.joinCounters,updatedAt:i.entry.at}}}}return s}getActiveByEntity(e){let t=this.indexPath(e);if(!_(t))return null;try{return JSON.parse(ue(t,"utf-8")).runId}catch{return null}}getHomeNodeByEntity(e){let t=this.indexPath(e);if(!_(t))return null;try{return JSON.parse(ue(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 r={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};Me(this.runPath(e.runId),JSON.stringify(r)+`
|
|
5
|
-
`);let s=e.status??t.status;return s==="completed"||s==="failed"||s==="canceled"?this.clearIndex(t.entityRef):this.writeIndex(t.entityRef,t.id),this.get(e.runId)}setStatus(e,t){let r=this.get(e);if(!r)return null;let s={...r,status:t,updatedAt:new Date().toISOString()};return this.appendSnapshot(s),t!=="running"&&t!=="paused"&&this.clearIndex(s.entityRef),s}list(e={}){if(!_(this.runsDir))return[];let t=He(this.runsDir).filter(s=>s.endsWith(".jsonl")).map(s=>({name:s,mtime:Ue(N(this.runsDir,s)).mtimeMs})).sort((s,o)=>o.mtime-s.mtime),r=[];for(let s of t){let o=this.get(s.name.replace(/\.jsonl$/,""));if(o&&!(e.workflowId&&o.workflowId!==e.workflowId)&&(r.push(o),e.limit&&r.length>=e.limit))break}return r}prune(e){if(!_(this.runsDir))return 0;let t=Date.now()-e.maxDays*24*60*60*1e3,r=[];for(let o of He(this.runsDir)){if(!o.endsWith(".jsonl"))continue;let i=N(this.runsDir,o),a=Ue(i).mtimeMs,d=this.get(o.replace(/\.jsonl$/,""));d&&(d.status==="running"||d.status==="paused"||r.push({file:i,run:d,mtime:a}))}r.sort((o,i)=>i.mtime-o.mtime);let s=0;for(let o=0;o<r.length;o++){let i=r[o],a=i.mtime<t,d=o>=e.maxRuns;if(a||d)try{qe(i.file),s++}catch{}}return s}appendSnapshot(e){let t={v:2,kind:"snapshot",run:e};Me(this.runPath(e.id),JSON.stringify(t)+`
|
|
6
|
-
`)}writeIndex(e,t){Ot(this.indexPath(e),JSON.stringify({runId:t,homeNode:this.nodeId,updatedAt:new Date().toISOString()},null,2)+`
|
|
7
|
-
`)}clearIndex(e){let t=this.indexPath(e);if(_(t))try{qe(t)}catch{}}};import{existsSync as Be,mkdirSync as Ft,readFileSync as Ct,unlinkSync as Mt,writeFileSync as Lt}from"fs";import{resolve as fe}from"path";import{z as O}from"zod";var Ke=O.object({version:O.literal(1),nodes:O.record(O.object({x:O.number(),y:O.number()}))}),ge=class{baseDir;layoutsDir;constructor(e={}){this.baseDir=e.baseDir??fe(process.cwd(),".agentx/workflows"),this.layoutsDir=fe(this.baseDir,"_layouts"),Ft(this.layoutsDir,{recursive:!0})}pathFor(e){let t=e.replace(/[^a-zA-Z0-9._-]/g,"_");return fe(this.layoutsDir,`${t}.json`)}get(e){let t=this.pathFor(e);if(!Be(t))return null;try{let r=Ke.safeParse(JSON.parse(Ct(t,"utf-8")));return r.success?r.data:null}catch{return null}}save(e,t){let r=Ke.parse(t);return Lt(this.pathFor(e),JSON.stringify(r,null,2)+`
|
|
8
|
-
`),r}sync(e,t){let r=this.get(e);if(!r)return null;let s={};for(let i of t)r.nodes[i]&&(s[i]=r.nodes[i]);let o={version:1,nodes:s};return this.save(e,o)}delete(e){let t=this.pathFor(e);return Be(t)?(Mt(t),!0):!1}};function Ye(n){return new Set(n.toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter(e=>e.length>3))}function Ht(n,e){if(n.size===0||e.size===0)return 0;let t=0;for(let r of n)e.has(r)&&t++;return t/Math.max(n.size,e.size)}function Ut(n,e){let t=Ye(n.message),r=e.filter(o=>o.state==="active"&&(o.status??"active")==="active"),s=null;for(let o of r){let i=0,a=[];if(o.ownerAgent&&o.ownerAgent===n.agentId&&(i+=.25,a.push("owner-agent")),n.channel&&o.tags.includes(n.channel)&&(i+=.15,a.push("channel-tag")),n.intentPath?.length&&o.intentPath.length){let c=n.intentPath.filter((f,g)=>o.intentPath[g]===f).length;c>0&&(i+=Math.min(.3,c*.1),a.push("intent-path"))}let d=[o.id,o.title,o.description??"",...o.tags].join(" "),l=Ht(t,Ye(d));l>0&&(i+=Math.min(.35,l),a.push("text-similarity")),(o.matchCount??0)>0&&(i+=Math.min(.1,o.matchCount*.01),a.push("prior-matches"));let p=Math.max(0,Math.min(1,i));(!s||p>s.confidence)&&(s={workflow:o,confidence:p,reasons:a})}return s&&s.confidence>0?s:null}function me(n){let{workflow:e,fromNodeId:t,selectedPort:r}=n,s=e.nodes.find(a=>a.id===t);if(!s)return{nextPending:[]};let o=e.edges.filter(a=>a.from===t);return{nextPending:(s.type==="branch"?o.filter(a=>(a.fromPort??"")===(r??"")):o).map(a=>a.to)}}function he(n,e){let t=n.config.cases??[],r=n.config.default??"";for(let s of t)if(qt(s.when,e))return s.to;return r}function qt(n,e){let t=n.params??{},r=String(t.path??""),s=Z(e,r);switch(n.kind){case"equals":return s===t.value;case"contains":return typeof s=="string"?s.includes(String(t.value??"")):Array.isArray(s)?s.some(o=>o===t.value):!1;case"matches":{if(typeof s!="string")return!1;try{return new RegExp(String(t.regex??"")).test(s)}catch{return!1}}case"exists":return s!=null&&s!=="";default:return!1}}function Z(n,e){if(!e)return;let t=e.split("."),r=n;for(let s of t){if(r==null||typeof r!="object")return;r=r[s]}return r}function X(n){let e=n.nodes.find(r=>r.type.startsWith("trigger."));if(!e)return null;let t=n.edges.filter(r=>r.from===e.id).map(r=>r.to);return{triggerId:e.id,pending:t}}function D(n,e){return n.nodes.find(t=>t.id===e)}function Bt(n,e,t){let r=n.split(".");if(r[0]==="env"){if(r.length!==2)return"";let o=r[1];if(!t.has(o))return"";let i=process.env[o];return typeof i=="string"?i:""}let s=e;for(let o of r){if(s==null||typeof s!="object")return"";s=s[o]}return s==null?"":typeof s=="object"?JSON.stringify(s):String(s)}function E(n,e,t={}){let r=new Set(t.envAllow||[]);return n.replace(/\{\{\s*([a-zA-Z_][a-zA-Z0-9_.-]*)\s*\}\}/g,(s,o)=>Bt(o,e,r))}function h(n,e,t={}){let r={};for(let[s,o]of Object.entries(n))typeof o=="string"?r[s]=E(o,e,t):Array.isArray(o)?r[s]=o.map(i=>typeof i=="string"?E(i,e,t):i):o&&typeof o=="object"?r[s]=h(o,e,t):r[s]=o;return r}var we=class{active=new Map;waiters=new Map;async acquire(e,t){let r=this.active.get(e)??0;if(r<t){this.active.set(e,r+1);return}return new Promise(s=>{let o=this.waiters.get(e)??[];o.push({resolve:()=>{this.active.set(e,(this.active.get(e)??0)+1),s()}}),this.waiters.set(e,o)})}release(e){let t=this.active.get(e)??0;this.active.set(e,Math.max(0,t-1));let r=this.waiters.get(e);r&&r.length>0&&r.shift().resolve()}stats(e){return{active:this.active.get(e)??0,waiting:this.waiters.get(e)?.length??0}}},Q=new we;function Je(n,e){return`${n}:${e}`}var F=async n=>({output:n.run.context[n.node.id]??{}}),Kt=async n=>{let e=n.node.config,t=String(e.agentId??""),r=String(e.prompt??"");if(!t)return{error:`agent node "${n.node.id}" missing config.agentId`};let s=E(r,n.run.context,{envAllow:n.workflow.envAllow}),o=typeof e.timeoutMinutes=="number"?e.timeoutMinutes:void 0,i=typeof e.maxConcurrent=="number"&&e.maxConcurrent>0?e.maxConcurrent:null,a=i?Je(n.workflow.id,n.node.id):null;if(a&&i){let l=Q.stats(a);l.active>=i&&n.log(`[node:${n.node.id}] gated: ${l.active} active (cap ${i}), ${l.waiting+1} waiting`),await Q.acquire(a,i)}let d=Date.now();try{let l=await n.agents.execute({agentId:t,message:s,workflowRunId:n.run.id,timeoutMinutes:o}),p=Date.now()-d;if(l.error){let g=l.errorKind??"unknown";return n.log(`[node:${n.node.id}] agent "${t}" failed (${g}): ${l.error}`),{error:`[${g}] ${l.error}`}}let f=String(e.resultParser??"noqta-result-token")==="json"?hn(l.content):Ge(l.content);return{output:{reply:l.content,result:f.result,json:f.json,taskId:l.taskId,durationMs:p}}}catch(l){return n.log(`[node:${n.node.id}] agent "${t}" threw: ${l.message}`),{error:l.message}}finally{a&&Q.release(a)}},Yt=async n=>{let e=he(n.node,n.run.context);return e?{output:{port:e},port:e}:(n.log(`[node:${n.node.id}] branch matched no case and no default port`),{output:{port:null}})},Jt=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.channel??""),r=String(e.chatId??""),s=String(e.text??"");if(!t||!r){let a=String(n.node.config.chatId??""),d=String(n.node.config.channel??""),l=[];return t||l.push(`channel config="${d}" rendered=""`),r||l.push(`chatId config="${a}" rendered=""`),(/\{\{\s*env\./.test(a)||/\{\{\s*env\./.test(d))&&l.push("(env.* templates only resolve for names listed in workflow.envAllow and actually set in process.env)"),{error:`action.send "${n.node.id}" needs channel + chatId \u2014 ${l.join("; ")}`}}let o=ke(n,e.accountId),i=n.channels[t];if(i?.send)try{return{output:{messageId:await i.send({channel:t,chatId:r,text:s,...o?{accountId:o}:{}})??null}}}catch(a){return{error:`action.send failed: ${a.message}`}}if(n.forwardChannelSend)try{return{output:{messageId:(await n.forwardChannelSend({channel:t,chatId:r,text:s,accountId:o})).messageId,viaMesh:!0}}}catch(a){return n.log(`[node:${n.node.id}] mesh-forward of "${t}" send failed: ${a.message}`),{error:`action.send via mesh failed: ${a.message}`}}return n.log(`[node:${n.node.id}] adapter "${t}" not available locally and no mesh forwarder`),{error:`channel "${t}" not available (no local adapter, no mesh route)`}},zt=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.channel??"gitlab"),r=String(e.project??""),s=String(e.title??""),o=String(e.description??""),i=Array.isArray(e.labels)?e.labels.map(String):[],a=Array.isArray(e.assignees)?e.assignees.map(String):[];if(!r||!s)return{error:`action.createIssue "${n.node.id}" needs project + title`};let d=be(n),l=n.channels[t];if(!l?.createIssue)return{error:`channel "${t}" does not support createIssue`};try{let p=await l.createIssue({project:r,title:s,description:o,labels:i,assignees:a,agentId:d});return p?{output:{issue:{iid:p.iid,url:p.url,webUrl:p.url}}}:{error:"createIssue returned null (see adapter log)"}}catch(p){return{error:`action.createIssue failed: ${p.message}`}}},Gt=async()=>({output:{}}),Vt=async n=>{let e=n.node.config,t=String(e.name??n.node.id),r=e.waitFor??{},s=e.resumeMatch??{};return{paused:!0,pausedAt:{kind:"checkpoint",nodeId:n.node.id,checkpointName:t,resumeMatch:{...r,...s}}}},Zt=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.channel??"gitlab"),r=String(e.project??""),s=String(e.iid??""),o=Array.isArray(e.add)?e.add.map(String):[],i=Array.isArray(e.remove)?e.remove.map(String):[];if(!r||!s)return{error:`action.setLabel "${n.node.id}" needs project + iid (try {{trigger.project}} / {{trigger.issue.iid}})`};if(o.length===0&&i.length===0)return{output:{skipped:!0,reason:"no labels to add or remove"}};let a=n.channels[t];if(!a?.setLabels)return{error:`channel "${t}" does not support setLabels`};let d=be(n),l=e.kind==="merge_request"?"merge_request":"issue";return{output:{labels:await a.setLabels({project:r,kind:l,iid:s,add:o,remove:i,agentId:d})??[],add:o,remove:i}}},Xt=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.channel??"gitlab"),r=String(e.project??""),s=String(e.iid??"");if(!r||!s)return{error:`action.readLabel "${n.node.id}" needs project + iid`};let o=n.channels[t];if(!o?.getLabels)return{error:`channel "${t}" does not support getLabels`};let i=e.kind==="merge_request"?"merge_request":"issue";return{output:{labels:await o.getLabels({project:r,kind:i,iid:s})??[]}}},Qt=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.channel??""),r=String(e.chatId??""),s=String(e.messageId??""),o=String(e.emoji??"\u{1F440}");if(!t||!r||!s)return{error:`action.react "${n.node.id}" needs channel + chatId + messageId`};let i=ke(n,e.accountId),a=n.channels[t];if(!a?.react)return{error:`channel "${t}" does not support react`};try{return await a.react(r,s,o,i),{output:{emoji:o}}}catch(d){return{error:`action.react failed: ${d.message}`}}},en=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.channel??""),r=String(e.chatId??""),s=String(e.messageId??""),o=String(e.text??""),i=e.parseMode?String(e.parseMode):void 0;if(!t||!r||!s||!o)return{error:`action.editMessage "${n.node.id}" needs channel + chatId + messageId + text`};let a=ke(n,e.accountId),d=n.channels[t];if(!d?.editMessage)return{error:`channel "${t}" does not support editMessage`};try{return{output:{edited:await d.editMessage(r,s,o,i,a)}}}catch(l){return{error:`action.editMessage failed: ${l.message}`}}},tn=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.channel??"gitlab"),r=String(e.chatId??""),s=Number(e.durationMs??0);if(!r||!s)return{error:`action.logTime "${n.node.id}" needs chatId + durationMs`};let o=n.channels[t];if(!o?.logTimeSpent)return{error:`channel "${t}" does not support logTimeSpent`};let i=be(n);try{return await o.logTimeSpent(r,s,i),{output:{durationMs:s}}}catch(a){return{error:`action.logTime failed: ${a.message}`}}},nn=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.url??"");if(!t)return{error:`action.callHTTP "${n.node.id}" needs url`};let r=String(e.method??"POST").toUpperCase(),s=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 i=await fetch(t,{method:r,headers:s,body:o}),a=await i.text(),d=a;try{d=JSON.parse(a)}catch{}return{output:{ok:i.ok,status:i.status,body:d}}}catch(i){return{error:`action.callHTTP failed: ${i.message}`}}},rn=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.actionId??e.id??"");if(!t)return{error:`action.run "${n.node.id}" needs actionId`};let r=e.inputs&&typeof e.inputs=="object"?e.inputs:{},{ActionStore:s}=await import("./store-I3HEWVLQ.js"),{runAction:o}=await import("./runner-BFYDWPUO.js"),i=new s().get(t);if(!i)return{error:`action.run "${n.node.id}": no action "${t}" in registry`};try{let a=await o(i,r),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}`}}},sn=async n=>{let e=h(n.node.config,n.run.context,{envAllow:n.workflow.envAllow}),t=String(e.name??"");if(!t)return{error:`action.builtin "${n.node.id}" needs a "name" (e.g. "http.fetch")`};let r=e.input&&typeof e.input=="object"?e.input:{},{runBuiltin:s,getBuiltin:o}=await import("./builtin-FRKAQMFS.js");if(!o(t))return{error:`action.builtin "${n.node.id}": unknown built-in "${t}"`};try{return{output:await s(t,r)}}catch(i){let a=i?.name==="ZodError"?`validation: ${i.message}`:i?.message||String(i);return{error:`action.builtin "${t}" failed: ${a}`}}},on=async n=>{let e=n.node.config,t=n.run.context;return typeof e.path=="string"&&e.path?{output:{value:Z(t,e.path)}}:e.template&&typeof e.template=="object"?{output:h(e.template,t,{envAllow:n.workflow.envAllow})}:{output:{}}};function an(n){if(n!=null){if(typeof n=="number")return new Date(Date.now()+n*6e4).toISOString();if(typeof n=="object"&&n&&"minutes"in n){let e=Number(n.minutes);if(Number.isFinite(e))return new Date(Date.now()+e*6e4).toISOString()}if(typeof n=="string"){let e=/^P(?:([0-9]+)D)?(?:T(?:([0-9]+)H)?(?:([0-9]+)M)?(?:([0-9]+)S)?)?$/.exec(n);if(e){let t=Number(e[1]??0),r=Number(e[2]??0),s=Number(e[3]??0),o=Number(e[4]??0),i=((t*24+r)*60+s)*6e4+o*1e3;if(i>0)return new Date(Date.now()+i).toISOString()}}}}var dn=async n=>{let e=n.node.config,t=h(e,n.run.context,{envAllow:n.workflow.envAllow}),r=String(t.workflowId??"");if(!r)return{error:`subProcess "${n.node.id}" missing config.workflowId`};let s=n.run.depth??0,o=n.workflow.maxChildDepth??5;if(s+1>=o)return{error:`max child workflow depth ${o} exceeded at ${n.workflow.id} \u2192 ${r} (parent depth ${s})`};let i=e.inputMap,a={};if(i==="*")a={...n.run.context};else if(i&&typeof i=="object")for(let[d,l]of Object.entries(i))l&&typeof l=="object"&&!Array.isArray(l)?a[d]=h(l,n.run.context,{envAllow:n.workflow.envAllow}):typeof l=="string"&&(a[d]={value:E(l,n.run.context,{envAllow:n.workflow.envAllow})});return{paused:!0,pausedAt:{kind:"subProcess",nodeId:n.node.id,childRunId:"",childWorkflowId:r},spawnChild:{workflowId:r,input:a}}},ln=F,cn=async n=>{let e=n.node.config,t=h(e,n.run.context,{envAllow:n.workflow.envAllow}),r=String(t.name??"");if(!r)return{error:`signal.emit "${n.node.id}" missing config.name`};let s=t.scope==="global"?"global":"workflow",o=t.payload&&typeof t.payload=="object"?t.payload:{};return{output:{emittedAt:new Date().toISOString(),name:r,scope:s,payload:o},emitSignal:{name:r,scope:s,payload:o}}},un=async n=>{let e=n.node.config,t=h(e,n.run.context,{envAllow:n.workflow.envAllow}),r=String(t.name??"");if(!r)return{error:`signal.wait "${n.node.id}" missing config.name`};let s=t.scope==="global"?"global":"workflow",o=e.match&&typeof e.match=="object"?e.match:{};return{paused:!0,pausedAt:{kind:"signalWait",nodeId:n.node.id,signalName:r,match:o,scope:s}}},pn=async n=>{let e=n.node.config,t=h(e,n.run.context,{envAllow:n.workflow.envAllow}),r=an(t.after??e.after);return r?{paused:!0,pausedAt:{kind:"timerWait",nodeId:n.node.id,fireAt:r}}:{error:`timer.boundary "${n.node.id}" needs config.after (duration or minutes)`}},fn=async()=>({output:{}}),gn=async n=>{let e=n.node.config,r=(Array.isArray(e.inputs)?e.inputs:[]).map(i=>typeof i=="string"?E(i,n.run.context,{envAllow:n.workflow.envAllow}):i),s=Array.isArray(e.rules)?e.rules:[];for(let i of s){let a=Array.isArray(i.when)?i.when:[];if(a.length!==r.length)continue;let d=!0;for(let l=0;l<a.length;l++)if(!mn(a[l],r[l])){d=!1;break}if(d)return{output:{...i.output??{},matchedPort:i.to??""},port:i.to}}let o=e.default;return{output:{...o?.output??{},matchedPort:o?.to??""},port:o?.to}};function mn(n,e){if(n==null||n==="*")return!0;let t=String(n),r=typeof e=="number"?e:String(e??""),s=/^(>=|<=|>|<)\s*(-?\d+(?:\.\d+)?)$/.exec(t);if(s){let o=s[1],i=Number(s[2]),a=typeof r=="number"?r:Number(r);if(Number.isNaN(a))return!1;switch(o){case">":return a>i;case"<":return a<i;case">=":return a>=i;case"<=":return a<=i}}if(t.startsWith("!="))return String(r)!==t.slice(2);if(t.startsWith("/")&&t.endsWith("/")&&t.length>2)try{return new RegExp(t.slice(1,-1)).test(String(r))}catch{return!1}return String(r)===t}var ze={"trigger.channel":F,"trigger.manual":F,"trigger.cron":F,"trigger.hook":F,"trigger.form":ln,agent:Kt,branch:Yt,transform:on,"gateway.parallel":fn,rule:gn,"action.send":Jt,"action.createIssue":zt,"action.setLabel":Zt,"action.readLabel":Xt,"action.react":Qt,"action.editMessage":en,"action.logTime":tn,"action.callHTTP":nn,"action.run":rn,"action.builtin":sn,subProcess:dn,"signal.emit":cn,"signal.wait":un,"timer.boundary":pn,checkpoint:Vt,end:Gt};function ye(n){return ze[n]}function ke(n,e){if(typeof e=="string"&&e)return e;let t=n.workflow.nodes.find(o=>o.type.startsWith("trigger."));if(!t)return;let s=n.run.context[t.id]?.accountId;return typeof s=="string"&&s?s:void 0}function be(n){for(let e=n.run.history.length-1;e>=0;e--){let t=n.run.history[e],r=n.workflow.nodes.find(s=>s.id===t.nodeId);if(r?.type==="agent")return r.config.agentId??void 0}}function Ge(n){if(!n)return{};let e=n.match(/\bRESULT:\s*([a-z][a-z0-9_-]*)/i);if(e)return{result:e[1].toLowerCase()};let t=n.match(/\[(APPROVED|REJECTED|CHANGES[-_]REQUESTED|DONE|FAILED|SKIPPED)\]/i);return t?{result:t[1].toLowerCase().replace("_","-")}:{}}function hn(n){let{result:e}=Ge(n);if(!n)return{result:e};let t=n.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 ee(n,e){if(n.name!==e.name||n.scope==="workflow"&&n.workflowId!==e.workflowId)return!1;for(let[t,r]of Object.entries(n.match??{}))if(!(r===void 0||r===""||r==="*")&&e.payload[t]!==r)return!1;return!0}function wn(n,e,t=Date.now){return{ts:t(),source:"workflow",sourceEventId:`${n.workflowId}:${n.eventId}`,project:n.project,subject:`workflow:${n.workflowId}:entity:${n.entityRef.backend}:${n.entityRef.id}`,intent:`workflow.${n.triggerSource}`,rawJson:e}}function yn(n){return n.claimed&&n.runId?{agentId:`workflow-run:${n.runId}`,outcome:"dispatched",reason:n.reason??"claimed"}:n.claimed&&!n.runId?{agentId:null,outcome:"halted",reason:n.reason??"claimed-but-no-run"}:{agentId:null,outcome:"halted",reason:n.reason??"not-claimed"}}function kn(n){return{decidedBy:"workflow-dispatcher",decide:()=>({agentId:n.agentId,outcome:n.outcome==="deduped"?"halted":n.outcome,reason:n.outcome==="deduped"?`legacy-dedup: ${n.reason??""}`.trim():n.reason??null})}}function Ve(n,e,t,r,s=Date.now){let o=wn(e,t,s),i=yn(r),a=kn(i),d=De(n,o,a,s);return Pe(n,"workflow",d,i,s),d}function Ze(n,e,t=Ae()){return n.prepare(`
|
|
9
|
-
INSERT INTO task_traces (
|
|
10
|
-
task_id, agent_id, channel, chat_id, workflow_run_id, workflow_id,
|
|
11
|
-
workflow_node_id, intent_event_id, intent_decided_by, resume_session_id,
|
|
12
|
-
model, status, started_at, message_preview, original_message
|
|
13
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'in-flight', ?, ?, ?)
|
|
14
|
-
`).run(t,e.agentId,e.channel??null,e.chatId??null,e.workflowRunId??null,e.workflowId??null,e.workflowNodeId??null,e.intentEventId??null,e.intentDecidedBy??null,e.resumeSessionId??null,e.model??null,Date.now(),e.messagePreview??null,e.originalMessage??null),t}function Xe(n,e,t){let r=Date.now();n.prepare(`
|
|
15
|
-
UPDATE task_traces SET
|
|
16
|
-
status = ?,
|
|
17
|
-
final_session_id = ?,
|
|
18
|
-
input_tokens = ?,
|
|
19
|
-
output_tokens = ?,
|
|
20
|
-
cache_read_tokens = ?,
|
|
21
|
-
cache_create_tokens = ?,
|
|
22
|
-
error = ?,
|
|
23
|
-
final_response = COALESCE(?, final_response),
|
|
24
|
-
finished_at = ?,
|
|
25
|
-
duration_ms = ? - started_at
|
|
26
|
-
WHERE task_id = ?
|
|
27
|
-
`).run(t.status,t.finalSessionId??null,t.inputTokens??null,t.outputTokens??null,t.cacheReadTokens??null,t.cacheCreateTokens??null,t.error??null,t.finalResponse??null,r,r,e)}function Cr(n,e,t){let r=Date.now();return n.transaction(()=>{let i=(n.prepare("SELECT MAX(seq) AS max_seq FROM task_trace_steps WHERE task_id = ?").get(e)?.max_seq??-1)+1;return n.prepare(`
|
|
28
|
-
INSERT INTO task_trace_steps (
|
|
29
|
-
task_id, seq, name, action, status, input_summary, output_summary, error, ms, started_at
|
|
30
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
31
|
-
`).run(e,i,t.name,t.action??null,t.status??null,t.inputSummary??null,t.outputSummary??null,t.error??null,t.ms??null,r),i})()}function Qe(n){return{taskId:n.task_id,agentId:n.agent_id,channel:n.channel??null,chatId:n.chat_id??null,workflowRunId:n.workflow_run_id??null,workflowId:n.workflow_id??null,workflowNodeId:n.workflow_node_id??null,intentEventId:n.intent_event_id??null,intentDecidedBy:n.intent_decided_by??null,resumeSessionId:n.resume_session_id??null,finalSessionId:n.final_session_id??null,model:n.model??null,status:n.status,startedAt:n.started_at,finishedAt:n.finished_at??null,durationMs:n.duration_ms??null,inputTokens:n.input_tokens??null,outputTokens:n.output_tokens??null,cacheReadTokens:n.cache_read_tokens??null,cacheCreateTokens:n.cache_create_tokens??null,error:n.error??null,messagePreview:n.message_preview??null,originalMessage:n.original_message??null,finalResponse:n.final_response??null}}function bn(n){return{taskId:n.task_id,seq:n.seq,name:n.name,action:n.action??null,status:n.status??null,inputSummary:n.input_summary??null,outputSummary:n.output_summary??null,error:n.error??null,ms:n.ms??null,startedAt:n.started_at}}function et(n,e){let t=n.prepare("SELECT * FROM task_traces WHERE task_id = ?").get(e);if(!t)return null;let r=n.prepare("SELECT * FROM task_trace_steps WHERE task_id = ? ORDER BY seq").all(e);return{task:Qe(t),steps:r.map(bn)}}function Mr(n){let e=Date.now();return n.prepare(`
|
|
32
|
-
UPDATE task_traces
|
|
33
|
-
SET status = 'canceled',
|
|
34
|
-
error = 'daemon-restart (orphaned in-flight)',
|
|
35
|
-
finished_at = ?
|
|
36
|
-
WHERE status = 'in-flight'
|
|
37
|
-
`).run(e).changes??0}function tt(n,e={}){let t=[],r=[];e.agentId&&(t.push("agent_id = ?"),r.push(e.agentId)),e.channel&&(t.push("channel = ?"),r.push(e.channel)),e.chatId&&(t.push("chat_id = ?"),r.push(e.chatId)),e.workflowRunId&&(t.push("workflow_run_id = ?"),r.push(e.workflowRunId)),e.status&&(t.push("status = ?"),r.push(e.status)),e.since!==void 0&&(t.push("started_at >= ?"),r.push(e.since)),e.until!==void 0&&(t.push("started_at <= ?"),r.push(e.until));let s=Math.max(1,Math.min(e.limit??100,1e3)),o=`
|
|
38
|
-
SELECT * FROM task_traces
|
|
39
|
-
${t.length>0?"WHERE "+t.join(" AND "):""}
|
|
40
|
-
ORDER BY started_at DESC
|
|
41
|
-
LIMIT ?
|
|
42
|
-
`;return r.push(s),n.prepare(o).all(...r).map(Qe)}var vn=4e3,In=8,ve=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 oe({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})}catch{}}async commit(e,t){let s=(this.commitChains.get(e)??Promise.resolve()).then(()=>t(),()=>t());return this.commitChains.set(e,s.then(()=>{},()=>{})),s}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 r of t){if(r.status!=="paused"||!r.pausedAt||r.pausedAt.kind!=="signalWait")continue;let s={name:r.pausedAt.signalName,scope:r.pausedAt.scope,workflowId:r.workflowId,match:r.pausedAt.match??{}};if(!ee(s,e))continue;let o=this.store.list().find(i=>i.id===r.workflowId);o&&(await this.commit(r.id,()=>{let i=this.runs.get(r.id);if(!i||i.status!=="paused"||!i.pausedAt||i.pausedAt.kind!=="signalWait"||!ee({name:i.pausedAt.signalName,scope:i.pausedAt.scope,workflowId:i.workflowId,match:i.pausedAt.match??{}},e))return;let a=D(o,i.pausedAt.nodeId),d=a?o.edges.filter(p=>p.from===a.id).map(p=>p.to):[],l={receivedAt:new Date().toISOString(),name:e.name,payload:e.payload};this.runs.recordExecution({runId:i.id,entry:{at:l.receivedAt,nodeId:i.pausedAt.nodeId,inputKeys:[],status:"resumed",output:l,idempotencyKey:T(i.id,i.pausedAt.nodeId,`signal:${e.name}:${e.emittedAt}`)},nextPending:d,status:"running",pausedAt:null,context:{...i.context,[i.pausedAt.nodeId]:l}}),this.log(`[workflow:${o.id}] run ${i.id} resumed from signal "${e.name}"`),this.emitRunEvent({runId:i.id,workflowId:o.id,nodeId:i.pausedAt.nodeId,phase:"resumed",status:"running",note:`signal:${e.name}`})}),this.walk(o,r.id,`signal:${e.name}`).catch(i=>this.log(`[workflow:${o.id}] walk-after-signal failed: ${i.message}`)))}}async resumeFromTimer(e){let t=this.store.list().find(r=>r.id===(this.runs.get(e.runId)?.workflowId??""));t&&(await this.commit(e.runId,()=>{let r=this.runs.get(e.runId);if(!r||r.status!=="paused"||!r.pausedAt||r.pausedAt.kind!=="timerWait"||r.pausedAt.nodeId!==e.nodeId)return;let s=D(t,e.nodeId),o=s?t.edges.filter(d=>d.from===s.id).map(d=>d.to):[],i=new Date().toISOString(),a={firedAt:i,scheduledFor:e.fireAt};this.runs.recordExecution({runId:r.id,entry:{at:i,nodeId:e.nodeId,inputKeys:[],status:"resumed",output:a,idempotencyKey:T(r.id,e.nodeId,`timer:${e.id}`)},nextPending:o,status:"running",pausedAt:null,context:{...r.context,[e.nodeId]:a}}),this.log(`[workflow:${t.id}] run ${r.id} resumed from timer "${e.nodeId}" (fired ${i})`),this.emitRunEvent({runId:r.id,workflowId:t.id,nodeId:e.nodeId,phase:"resumed",status:"running",note:`timer:${e.id}`})}),this.walk(t,e.runId,`timer:${e.id}`).catch(r=>this.log(`[workflow:${t.id}] walk-after-timer failed: ${r.message}`)))}async dispatchWorkflow(e){let t=this.store.list().find(i=>i.id===e.workflowId);if(!t)return this.log(`[workflows] dispatchWorkflow: workflow "${e.workflowId}" not found`),{claimed:!1,run:null};let s=t.nodes.find(i=>i.type.startsWith("trigger."))?.config??{},o={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,o)}startChannelAck(e,t){let r=String(t.channel??""),s=String(t.chatId??"");if(!r||!s)return;let o=this.channels[r];if(!o)return;let i=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(s,d,"\u{1F440}",i)).catch(()=>{})}catch{}if(this.ackTypingTimers.has(e)||!o.sendTyping)return;let l=()=>{try{Promise.resolve(o.sendTyping(s,i)).catch(()=>{})}catch{}};l();let p=setInterval(l,vn);this.ackTypingTimers.set(e,p)}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),s=t.some(a=>a.fanOut)?t:t.slice(0,1),o=[],i=[];for(let a of s){let d=await this.dispatchOne(a,e.entityRef,e.event,e.trigger);d.claimed&&o.push(a),d.run&&i.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:i}}matchByTrigger(e,t){let r=this.store.list(),s=[];for(let o of r){if(o.state&&o.state!=="active")continue;if(t){if(!o.mesh?.allowRemote)continue;let l=o.mesh.peers;if(l&&l.length>0&&!l.includes(t.peer))continue}let i=o.nodes.find(l=>l.type.startsWith("trigger."));if(!i)continue;let a=i.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!=="*"&&te(e.source,d.chat)!==te(e.source,e.chat))continue;if(d.labels?.length){let l=new Set(e.labels??[]);if(!d.labels.some(c=>l.has(c)))continue}}s.push(o)}return s.sort((o,i)=>i.priority-o.priority||o.id.localeCompare(i.id))}async dispatchOne(e,t,r,s){let o=await this.dispatchOneLegacy(e,t,r,s);if(Te("workflow")!=="off")try{Ve($e(),{workflowId:e.id,eventId:r.id,triggerSource:s.source,project:s.project??null,entityRef:t},JSON.stringify({event:r,trigger:s,entityRef:t}),{claimed:o.claimed,runId:o.run?.id??null})}catch(i){this.log(`[ledger] workflow ${e.id} run ${o.run?.id??"?"} record failed: ${i?.message??i}`)}return o}async dispatchOneLegacy(e,t,r,s){let o=this.runs.getActiveByEntity(t),i=o?this.runs.getHomeNodeByEntity(t):null;if(o&&i&&i!==this.nodeId){if(!this.forwarder)return this.log(`[workflow:${e.id}] run ${o} home'd on "${i}" but no forwarder \u2014 dropping`),{claimed:!1,run:null};try{await this.forwarder.forwardTransition(i,{workflowId:e.id,event:r,entityRef:t})}catch(d){this.log(`[workflow:${e.id}] forward to "${i}" 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(!Rn(a.pausedAt.resumeMatch,s,r))return this.log(`[workflow:${e.id}] run ${a.id} paused but event doesn't match resumeMatch \u2014 dropping`),{claimed:!1,run:null};let d=D(e,a.pausedAt.nodeId),l=d?e.edges.filter(w=>w.from===d.id).map(w=>w.to):[],p={at:new Date().toISOString(),nodeId:a.pausedAt.nodeId,inputKeys:[],status:"resumed",output:{event:r.payload},idempotencyKey:T(a.id,a.pausedAt.nodeId,`resume:${r.id}`)},c={...a.context,[a.pausedAt.nodeId]:{event:r.payload}},f=a.pausedAt.checkpointName,g=this.runs.recordExecution({runId:a.id,entry:p,nextPending:l,status:"running",pausedAt:null,context:c});g&&(a=g),this.log(`[workflow:${e.id}] run ${a.id} resumed from checkpoint "${f}"`),s.source.endsWith("-message")&&this.startChannelAck(a.id,r.payload)}else return a.status==="running"?(this.log(`[workflow:${e.id}] run ${a.id} already running; dropping concurrent event ${r.id}`),{claimed:!0,run:null}):(this.log(`[workflow:${e.id}] run ${a.id} is ${a.status}; dropping event ${r.id}`),{claimed:!1,run:null});else{let d=X(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]:r.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}),s.source.endsWith("-message")&&this.startChannelAck(a.id,r.payload)}return this.walk(e,a.id,r.id),{claimed:!0,run:a}}async walk(e,t,r){try{await this.walkInner(e,t,r)}finally{this.stopChannelAck(t)}}async walkInner(e,t,r){let s=this.runs.get(t);if(s)for(;s.status==="running"&&s.pending.length>0;){let o=s.pending.slice(0,In);await Promise.allSettled(o.map(a=>this.executeNodeAndCommit(e,t,a,r)));let i=this.runs.get(t);if(!i||(s=i,s.status!=="running"))return}}async executeNodeAndCommit(e,t,r,s){let o=T(t,r,s),i=await this.commit(t,()=>{let u=this.runs.get(t);if(!u)return{kind:"done"};if(u.status!=="running")return{kind:"done"};let v=D(e,r);if(!v)return this.log(`[workflow:${e.id}] missing node "${r}" \u2014 marking run failed`),this.runs.recordExecution({runId:t,entry:{at:new Date().toISOString(),nodeId:r,inputKeys:[],status:"failed",idempotencyKey:o,note:"node definition missing from workflow"},nextPending:u.pending.filter(S=>S!==r),status:"failed"}),{kind:"done"};let P=ye(v.type);return P?u.history.some(S=>S.idempotencyKey===o)?(this.runs.recordExecution({runId:t,entry:{at:new Date().toISOString(),nodeId:r,inputKeys:[],status:"skipped",idempotencyKey:o+"_dedup",note:"duplicate execution dropped"},nextPending:u.pending.filter(S=>S!==r)}),{kind:"done"}):{kind:"go",run:u,node:v,handler:P}:(this.log(`[workflow:${e.id}] no handler for node type "${v.type}"`),this.runs.recordExecution({runId:t,entry:{at:new Date().toISOString(),nodeId:r,inputKeys:[],status:"failed",idempotencyKey:o,note:`no handler for node type "${v.type}"`},nextPending:u.pending.filter(S=>S!==r),status:"failed"}),{kind:"done"})});if(i.kind==="done")return;let{run:a,node:d,handler:l}=i,p=e.edges.filter(u=>u.to===r).map(u=>u.from),c;if(d.type!=="agent"){let u=ie();if(u)try{c=Ze(u,{agentId:`workflow:${d.type}`,channel:"workflow",chatId:`${e.id}:${r}`,workflowRunId:t,workflowId:e.id,workflowNodeId:r,messagePreview:`${d.type} ${r}`})}catch{}}let f=d.retry??{maxAttempts:1,backoffMs:1e3},g={error:"retry-loop did not run"},w=0;for(;w<f.maxAttempts;){w++;try{g=await l({workflow:e,run:a,node:d,channels:this.channels,agents:this.agents,forwardChannelSend:this.forwarder?.forwardChannelSend?.bind(this.forwarder),log:this.log})}catch(u){this.log(`[workflow:${e.id}] handler "${d.type}" threw: ${u.message}`),g={error:u.message}}if(!g.error||g.paused)break;if(w<f.maxAttempts){let u=f.backoffMs*Math.pow(2,w-1);this.log(`[workflow:${e.id}] node "${r}" failed (attempt ${w}/${f.maxAttempts}): ${g.error.slice(0,120)} \u2014 retrying in ${u}ms`),await new Promise(v=>setTimeout(v,u))}}if(c){let u=ie();if(u)try{Xe(u,c,{status:g.error?"error":"ok",error:g.error??null})}catch{}}await this.commit(t,async()=>{let u=this.runs.get(t);if(!u)return;let v=new Date().toISOString(),P=u.pending.filter(m=>m!==r);if(g.error){let m=u.status==="running"?"failed":void 0;this.runs.recordExecution({runId:t,entry:{at:v,nodeId:r,inputKeys:p,status:"failed",idempotencyKey:o,note:g.error.slice(0,200)},nextPending:P,status:m}),this.emitRunEvent({runId:t,workflowId:e.id,nodeId:r,phase:"failed",status:m??u.status,note:g.error.slice(0,200)});return}if(g.paused&&g.pausedAt){let m=g.pausedAt,$=null;if(g.spawnChild&&m.kind==="subProcess"){if($=await this.spawnChild({parent:u,parentNodeId:r,childWorkflowId:g.spawnChild.workflowId,input:g.spawnChild.input}),!$){this.runs.recordExecution({runId:t,entry:{at:v,nodeId:r,inputKeys:p,status:"failed",idempotencyKey:o,note:`subProcess: child workflow "${g.spawnChild.workflowId}" not found`},nextPending:P,status:"failed"});return}m={...m,childRunId:$.id}}if(this.runs.recordExecution({runId:t,entry:{at:v,nodeId:r,inputKeys:p,status:"paused",idempotencyKey:o},nextPending:P,status:"paused",pausedAt:m}),this.emitRunEvent({runId:t,workflowId:e.id,nodeId:r,phase:"paused",status:"paused",note:m.kind}),$&&this.kickChildWalk($),m.kind==="timerWait")try{this.timers.schedule({runId:t,workflowId:e.id,nodeId:m.nodeId,fireAt:m.fireAt,cancelKey:`${t}:${m.nodeId}`})}catch(Re){this.log(`[workflow:${e.id}] timer schedule failed: ${Re.message}`)}return}let S=g.output??{},gt={...u.context,[r]:S},{nextPending:mt}=me({workflow:e,fromNodeId:r,selectedPort:g.port}),se=[],q={...u.joinCounters??{}};for(let m of mt){let $=D(e,m);if(!($?.type==="gateway.parallel"&&String($.config?.mode??"fanOut")==="join")){se.push(m);continue}let K=q[m]??[];K.includes(r)||K.push(r),q[m]=K;let yt=e.edges.filter(kt=>kt.to===m).length;K.length>=yt&&(se.push(m),delete q[m])}let ht=[...P,...se],B=d.type==="end",wt=u.status==="running"?B?String(d.config.status??"completed"):"running":void 0,W=this.runs.recordExecution({runId:t,entry:{at:v,nodeId:r,inputKeys:p,status:"ok",output:S,idempotencyKey:o},nextPending:B?[]:ht,status:wt,context:gt,joinCounters:q});this.emitRunEvent({runId:t,workflowId:e.id,nodeId:r,phase:B?"completed":"ok",status:W?.status??u.status}),g.emitSignal&&this.emitSignal({name:g.emitSignal.name,scope:g.emitSignal.scope,workflowId:e.id,payload:g.emitSignal.payload}),B&&W&&W.parentRunId&&W.parentNodeId&&this.resumeParent({parentRunId:W.parentRunId,parentNodeId:W.parentNodeId,childRun:W}).catch(m=>this.log(`[workflow:${e.id}] resumeParent failed: ${m.message}`))})}async spawnChild(e){let t=this.store.list().find(a=>a.id===e.childWorkflowId);if(!t)return null;let r=X(t);if(!r)return this.log(`[workflow:${t.id}] no trigger node \u2014 cannot spawn as child`),null;let s={...e.input};s[r.triggerId]={...s[r.triggerId]??{},parentRunId:e.parent.id,parentNodeId:e.parentNodeId};let o={backend:"agentx-internal",id:`subprocess:${e.parent.id}:${e.parentNodeId}`},i=this.runs.create({workflowId:t.id,initialPending:r.pending,entityRef:o,initialContext:s,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 ${i.id} spawned from ${e.parent.id}/${e.parentNodeId} (depth ${i.depth})`),i}kickChildWalk(e){let t=this.store.list().find(r=>r.id===e.workflowId);t&&this.walk(t,e.id,`spawn:${e.parentRunId}:${e.parentNodeId}`).catch(r=>this.log(`[workflow:${t.id}] child walk failed: ${r.message}`))}async resumeParent(e){let t=this.runs.get(e.parentRunId);if(!t)return;let r=this.store.list().find(s=>s.id===t.workflowId);r&&(await this.commit(e.parentRunId,()=>{let s=this.runs.get(e.parentRunId);if(!s||s.status!=="paused"||!s.pausedAt||s.pausedAt.kind!=="subProcess"||s.pausedAt.nodeId!==e.parentNodeId||s.pausedAt.childRunId!==e.childRun.id)return;let o=D(r,e.parentNodeId),i=o?r.edges.filter(d=>d.from===o.id).map(d=>d.to):[],a={childRunId:e.childRun.id,status:e.childRun.status,output:Sn(e.childRun)};this.runs.recordExecution({runId:s.id,entry:{at:new Date().toISOString(),nodeId:e.parentNodeId,inputKeys:[],status:"resumed",output:a,idempotencyKey:T(s.id,e.parentNodeId,`child:${e.childRun.id}`)},nextPending:i,status:"running",pausedAt:null,context:{...s.context,[e.parentNodeId]:a}}),this.log(`[workflow:${r.id}] parent run ${s.id} resumed from subProcess child ${e.childRun.id}`),this.emitRunEvent({runId:s.id,workflowId:r.id,nodeId:e.parentNodeId,phase:"resumed",status:"running",note:`child:${e.childRun.id}`})}),this.walk(r,e.parentRunId,`child:${e.childRun.id}`))}};function Sn(n){for(let e=n.history.length-1;e>=0;e--){let t=n.history[e];if(t.status==="ok"&&t.output&&Object.keys(t.output).length>0)return t.output}return{}}function Rn(n,e,t){let r=o=>{let i=n[o];if(i===void 0||i===""||i==="*")return!0;if(Array.isArray(i)){let a=new Set(e.labels??[]);return i.some(d=>a.has(String(d)))}return o==="chat"?te(e.source,String(i))===te(e.source,e.chat):e[o]===i};if(!r("source")||!r("project")||!r("repo")||!r("chat"))return!1;let s=n.eventIdLike;return!(typeof s=="string"&&s&&!t.id.includes(s))}function te(n,e){return e==null?"":n==="whatsapp-message"?e.replace(/@s\.whatsapp\.net$|@g\.us$/i,"").replace(/[\s+()]/g,""):e}function An(n){return{"pre:channel-message":async e=>{let t=e.msg;if(!t)return{};let r=$n(t.channel);if(!r)return{};let s=t.group?.id??t.sender.id,o={backend:t.channel,id:`${t.channel}:${s}`},{claimed:i}=await n.dispatch({trigger:{source:r,chat:s},entityRef:o,event:{id:`${t.channel}:${t.accountId}:${t.id}`,payload:Tn(t)}});return i.length===0?{}:i.every(d=>d.nodes.find(p=>p.type.startsWith("trigger."))?.config?.passthrough===!0)?{}:{blocked:!0,message:`handled by workflow${i.length>1?"s":""}: ${i.map(d=>d.id).join(", ")}`}},"on:gitlab-issue":async e=>{let t=e.project,r=e.iid,s=e.issueEvent;if(!t||r===void 0)return{};let o=Array.isArray(s?.object_attributes?.labels)?s.object_attributes.labels.map(d=>typeof d=="string"?d:d?.title).filter(Boolean):s?.labels?.map(d=>d?.title)??[],i=s?.assignees??s?.object_attributes?.assignee_ids??[],a={backend:"gitlab",id:`${t}#${r}`};return await n.dispatch({trigger:{source:"gitlab-issue",project:t,labels:o},entityRef:a,event:{id:`gitlab-issue:${t}:${r}:${s?.object_attributes?.updated_at||s?.object_attributes?.action||"evt"}`,payload:{issue:{iid:r,title:s?.object_attributes?.title,description:s?.object_attributes?.description,url:s?.object_attributes?.url,action:s?.object_attributes?.action,labels:o,assignees:i},project:t,channel:"gitlab",chatId:`${t}:issue:${r}`}}}),{}},"on:gitlab-mr":async e=>{let t=e.project,r=e.iid,s=e.mrEvent;if(!t||r===void 0)return{};let o=Array.isArray(e.labels)?e.labels:Array.isArray(s?.object_attributes?.labels)?s.object_attributes.labels.map(l=>typeof l=="string"?l:l?.title).filter(Boolean):[],i=s?.assignees??s?.object_attributes?.assignee_ids??[],a=s?.reviewers??[],d={backend:"gitlab",id:`${t}!${r}`};return await n.dispatch({trigger:{source:"gitlab-mr",project:t,labels:o},entityRef:d,event:{id:`gitlab-mr:${t}:${r}:${s?.object_attributes?.updated_at||s?.object_attributes?.action||"evt"}`,payload:{mr:{iid:r,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:i,reviewers:a},project:t,channel:"gitlab",chatId:`${t}:merge_request:${r}`,iid:r,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,r=e.noteId,s=e.noteableType,o=e.noteableIid,i=e.text,a=e.authorUsername,d=e.mentions??[];if(!t||!r||!s||!o)return{};let l=s==="merge_request"?{backend:"gitlab",id:`${t}!${o}`}:{backend:"gitlab",id:`${t}#${o}`};return await n.dispatch({trigger:{source:"gitlab-note",project:t},entityRef:l,event:{id:`gitlab-note:${t}:${s}:${o}:${r}`,payload:{note:{id:r,text:i,author:a,mentions:d,noteableType:s,noteableIid:o,noteableTitle:e.noteableTitle},project:t,channel:"gitlab",chatId:`${t}:${s}:${o}`,noteId:r,noteableType:s,noteableIid:o,text:i,author:a,mentions:d}}}),{}},"on:gitlab-pipeline":async e=>{let t=e.project,r=e.pipelineId,s=e.status,o=e.ref;if(!t||!s)return{};let a=e.raw?.merge_request?.iid;if(!a)return{};let d={backend:"gitlab",id:`${t}!${a}`};return await n.dispatch({trigger:{source:"gitlab-pipeline",project:t},entityRef:d,event:{id:`gitlab-pipeline:${t}:${r}:${s}`,payload:{pipeline:{id:r,status:s,ref:o},project:t,channel:"gitlab",chatId:`${t}:merge_request:${a}`}}}),{}}}}function $n(n){switch(n){case"telegram":return"telegram-message";case"whatsapp":return"whatsapp-message";case"discord":return"discord-message";case"slack":return"slack-message";default:return null}}function Tn(n){let e=n.group?.id??n.sender.id;return{channel:n.channel,chatId:e,accountId:n.accountId,text:n.text,fromJid:n.sender.id,sender:{id:n.sender.id,name:n.sender.name,username:n.sender.username},contact:n.channelMeta?.facts?{facts:n.channelMeta.facts}:void 0,group:n.group?{id:n.group.id,name:n.group.name}:void 0,channelMeta:n.channelMeta,replyTo:n.replyTo,replyToText:n.replyToText,media:n.media,event:{id:n.id,timestamp:n.timestamp?.toISOString?.()??new Date().toISOString()}}}function Dn(n){let e=n.store.list(),t=0,r=0;for(let s of e){if(s.state&&s.state!=="active"){n.log(`[workflows] ${s.id} state=${s.state} \u2014 skipping trigger registration`);continue}let o=s.nodes.find(i=>i.type.startsWith("trigger."));if(o){if(o.type==="trigger.cron"){let i=o.config;if(!i.spec){n.log(`[workflows] ${s.id} trigger.cron missing config.spec \u2014 skipping`);continue}Wn({workflowId:s.id,triggerNodeId:o.id,spec:i.spec,timezone:i.timezone??"UTC"},n.dispatcher,n.log),t++}else if(o.type==="trigger.hook"){let i=o.config;if(!i.event||!i.event.startsWith("on:")){n.log(`[workflows] ${s.id} trigger.hook config.event must start with "on:" \u2014 skipping`);continue}n.hooks.registerHandler(i.event,`workflows:${s.id}`,async a=>{try{let d=typeof a.project=="string"?a.project:void 0;if(s.project&&d&&s.project!==d)return{};if(i.filter){if(Array.isArray(i.filter.action)&&i.filter.action.length>0){let f=typeof a.action=="string"?a.action:void 0;if(!f||!i.filter.action.includes(f))return{}}if(Array.isArray(i.filter.mentions)&&i.filter.mentions.length>0){let f=Array.isArray(a.mentions)?a.mentions.map(u=>u.toLowerCase().replace(/^@/,"")):[];if(!i.filter.mentions.map(u=>u.toLowerCase().replace(/^@/,"")).some(u=>f.includes(u)))return{}}if(Array.isArray(i.filter.noteableType)&&i.filter.noteableType.length>0){let f=typeof a.noteableType=="string"?a.noteableType.toLowerCase():void 0,g=i.filter.noteableType.map(w=>w.toLowerCase());if(!f||!g.includes(f))return{}}if(Array.isArray(i.filter.assigneesAdded)&&i.filter.assigneesAdded.length>0){let f=Array.isArray(a.assigneesAdded)?a.assigneesAdded.map(u=>u.toLowerCase().replace(/^@/,"")):[];if(!i.filter.assigneesAdded.map(u=>u.toLowerCase().replace(/^@/,"")).some(u=>f.includes(u)))return{}}if(Array.isArray(i.filter.reviewersAdded)&&i.filter.reviewersAdded.length>0){let f=Array.isArray(a.reviewersAdded)?a.reviewersAdded.map(u=>u.toLowerCase().replace(/^@/,"")):[];if(!i.filter.reviewersAdded.map(u=>u.toLowerCase().replace(/^@/,"")).some(u=>f.includes(u)))return{}}if(Array.isArray(i.filter.labelsAdded)&&i.filter.labelsAdded.length>0){let f=Array.isArray(a.labelsAdded)?a.labelsAdded.map(u=>u.toLowerCase()):[];if(!i.filter.labelsAdded.map(u=>u.toLowerCase()).some(u=>f.includes(u)))return{}}}let l=Pn(s.id,i.event,a);if(await n.dispatcher.dispatchWorkflow({workflowId:s.id,entityRef:{backend:"hook",id:l},event:{id:`hook:${i.event}:${Date.now().toString(36)}`,payload:{hookEvent:i.event,...a}}}),i.passthrough)return{};let p=a.__workflowClaimed;return{modified:{__workflowClaimed:[...Array.isArray(p)?p:[],s.id]}}}catch(d){return n.log(`[workflows] ${s.id} hook dispatch failed: ${d.message}`),{}}},60),r++}}}return{cronTimers:t,hookSubscribers:r}}function Pn(n,e,t){let r=typeof t.project=="string"?t.project:"",s=t.iid!=null?String(t.iid):"";if(e==="on:gitlab-issue"&&r&&s)return`${n}:${e}:${r}#${s}`;if(e==="on:gitlab-mr"&&r&&s)return`${n}:${e}:${r}!${s}`;if(e==="on:gitlab-pipeline"&&r){let o=t.pipelineId!=null?String(t.pipelineId):"";if(o)return`${n}:${e}:${r}@pipeline:${o}`}return`${n}:${e}:${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function Wn(n,e,t){let r=()=>{let s;try{s=We(n.spec,new Date,n.timezone)}catch(i){t(`[workflows] ${n.workflowId} cron spec invalid: ${i.message}`);return}let o=Math.max(1e3,s.getTime()-Date.now());setTimeout(()=>{(async()=>{let i=`cron:${n.workflowId}:${s.toISOString()}`;try{await e.dispatchWorkflow({workflowId:n.workflowId,trigger:{source:"cron"},entityRef:{backend:"cron",id:`${n.workflowId}@${s.toISOString()}`},event:{id:i,payload:{now:s.toISOString(),spec:n.spec,workflowId:n.workflowId}}})}catch(a){t(`[workflows] ${n.workflowId} cron dispatch failed: ${a.message}`)}finally{r()}})()},o)};r()}import{existsSync as re,mkdirSync as Ie,readFileSync as En,readdirSync as xn,renameSync as _n,unlinkSync as On,writeFileSync as nt}from"fs";import{basename as rt,resolve as I}from"path";function M(n,e="workflow"){return n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,52)||e}function st(n,e=900){let t=String(n??"").trim();return t.length>e?`${t.slice(0,e)}...`:t}var jn={merge_request:"mr",pull_request:"mr",pr:"mr",push:"push",issue:"issue",issues:"issue"},Fn=[["prod",/\b(prod(?:uction)?|live)\b/],["staging",/\b(stag(?:ing|e)?|qa|preprod|pre-prod)\b/],["dev",/\b(dev|development|local)\b/]],Cn=[["rollback",/\b(rollback|revert|undo)\b/],["deploy",/\b(deploy|deployment|rollout|release|ship)\b/],["fix",/\b(fix|repair|patch|resolve|hotfix)\b/],["migrate",/\b(migration|migrate)\b/],["review",/\b(review|inspect|audit|approve)\b/],["triage",/\b(triage|classify|categorize|label)\b/],["implement",/\b(implement|add|build|create|introduce)\b/],["refactor",/\b(refactor|rename|restructure|cleanup)\b/],["test",/\b(test|verify|validate|qa)\b/],["update",/\b(update|upgrade|bump)\b/]];function L(n,e=[]){let t={},s=(n.chatId||"").split(":");if(s.length>=2&&s[0].includes("/")){let a=s[0],d=a.split("/").pop()||a;t.project=M(d,"project"),t.kind=M(jn[s[1]]||s[1],"task")}let o=String(n.messagePreview||"").toLowerCase();if(!!!(t.project&&t.kind)){for(let[a,d]of Cn)if(d.test(o)){t.intent=a;break}}for(let[a,d]of Fn)if(d.test(o)){t.environment=a;break}return t}function ot(n,e){let t=[n.project,n.kind,n.intent,n.environment,n.variation].filter(Boolean);if(t.length>=2)return t.map(o=>M(o)).join("-")+"-draft";let r=M(e.messagePreview||"","task").slice(0,32),s=e.taskId.slice(-6).toLowerCase();return`${r||"task"}-${s}-draft`}function Mn(n,e=[]){let t=new Set;n.channel&&t.add(n.channel),n.agentId&&t.add(n.agentId);for(let r of e)r.action&&t.add(M(r.action,"action"));return Array.from(t).slice(0,12)}function Ln(n){let e=n.filter(t=>t.status!=="error").filter(t=>t.name!=="system").slice(0,16);return e.length===0?"No structured steps were captured; use the original message and final result as the procedure evidence.":e.map((t,r)=>{let s=[t.name,t.action].filter(Boolean).join(":"),o=st(t.outputSummary||t.inputSummary||t.error||"",220);return`${r+1}. ${s}${o?` \u2014 ${o}`:""}`}).join(`
|
|
43
|
-
`)}function ne(n,e=[],t={}){let r=L(n,e),s=t.id||ot(r,n),o=t.sourceTaskIds?.length?t.sourceTaskIds:[n.taskId],i=st(n.messagePreview,72)||`Task ${n.taskId.slice(0,8)}`,a=["Replay the cleaned successful procedure represented by this absorbed task trace.","","Original task:","{{trigger.input.message}}","","Procedure evidence, with failed turns and incidental retries removed where possible:",Ln(e),"","Use the current run input values where provided. Keep the final answer concise and operational."].join(`
|
|
44
|
-
`);return y.parse({id:s,version:2,title:`Draft: ${i}`,description:`Generated from task trace ${n.taskId}. Review before promotion.`,status:"draft",state:"disabled",tags:Mn(n,e),entity:n.chatId||void 0,generatedFrom:t.generatedFrom??"task-trace",sourceTaskIds:o,confidence:t.confidence??.55,workflowVersion:"draft-1",ownerAgent:n.agentId,nodes:[{id:"trigger",type:"trigger.manual",config:{inputSchema:{type:"object",properties:{message:{type:"string"},taskId:{type:"string"}}}}},{id:"run_cleaned_task",type:"agent",config:{agentId:n.agentId,prompt:a}},{id:"done",type:"end",config:{status:"completed",output:"{{run_cleaned_task.reply}}"}}],edges:[{from:"trigger",to:"run_cleaned_task"},{from:"run_cleaned_task",to:"done"}],envAllow:[],retention:{maxRuns:500,maxDays:90},maxChildDepth:5})}async function it(n,e=[],t={}){let r=L(n,e),s=t.id||ot(r,n),o=t.sourceTaskIds?.length?t.sourceTaskIds:[n.taskId],i=t.confidence??.55;if(t.viaAgent)try{let{architectWorkflowViaAgent:a}=await import("./architect-SEPWMWS4.js"),d=await a(n,e,s,o,i,{agentId:t.viaAgent,daemonUrl:t.daemonUrl});return{workflow:d.workflow,usedLlm:!0,via:d.via}}catch(a){let d=a?.message||String(a);return t.log?.(`[architect] agent path (${t.viaAgent}) failed for ${n.taskId.slice(0,8)}, falling back to deterministic: ${d}`),{workflow:ne(n,e,t),usedLlm:!1,error:d}}if(t.model)try{let{architectWorkflowFromTrace:a}=await import("./architect-SEPWMWS4.js"),d=await a(n,e,s,o,i,{model:t.model});return{workflow:d.workflow,usedLlm:!0,via:`direct:${d.model}`}}catch(a){let d=a?.message||String(a);return t.log?.(`[architect] direct API failed for ${n.taskId.slice(0,8)}, falling back to deterministic: ${d}`),{workflow:ne(n,e,t),usedLlm:!1,error:d}}return{workflow:ne(n,e,t),usedLlm:!1}}function at(n){let e=y.safeParse(n);return e.success?j(e.data):e.error.issues.map(t=>`${t.path.join(".")||"<root>"}: ${t.message}`)}var Hn=new Set(["agent","action.run","action.send","action.builtin","action.callHTTP","action.createIssue","action.setLabel","action.readLabel","action.react","action.editMessage","action.logTime","transform","extract.structured","branch","rule","subProcess"]);function Un(n){return n.nodes.filter(t=>Hn.has(t.type)).length>0&&n.nodes.length>=3}function H(n=process.cwd()){return I(n,".agentx/workflows/_drafts")}function U(n){return I(n,"_drafts")}function qn(n=process.cwd()){return I(n,".agentx/workflows/_drafts/_rejected")}function Bn(n){return I(U(n),"_rejected")}function dt(n,e="yaml",t=process.cwd()){return I(H(t),`${n}.${e}`)}function Kn(n,e,t="yaml"){return I(U(e),`${n}.${t}`)}function Yn(n,e={}){let t=e.format??"yaml",r=e.workflowDir?U(e.workflowDir):H(e.baseDir);Ie(r,{recursive:!0});let s=e.workflowDir?Kn(n.id,e.workflowDir,t):dt(n.id,t,e.baseDir);if(!e.force&&re(s))throw new Error(`draft already exists: ${s}`);let o=t==="json"?JSON.stringify(n,null,2)+`
|
|
45
|
-
`:Y(n);return nt(s,o),s}function lt(n){let e=En(n,"utf-8"),t=/\.(ya?ml)$/i.test(n)?x(e,{filePath:rt(n)}):JSON.parse(e);return y.parse(t)}function Jn(n=process.cwd(),e={}){let t=e.workflowDir?U(e.workflowDir):H(n);return re(t)?xn(t,{withFileTypes:!0}).filter(r=>r.isFile()&&/\.(json|ya?ml)$/i.test(r.name)).map(r=>{let s=I(t,r.name);return{id:r.name.replace(/\.(json|ya?ml)$/i,""),path:s,workflow:lt(s)}}).sort((r,s)=>r.id.localeCompare(s.id)):[]}function Se(n,e=process.cwd(),t={}){let r=t.workflowDir?U(t.workflowDir):H(e);for(let s of["yaml","yml","json"]){let o=I(r,`${n}.${s}`);if(re(o))return{id:n,path:o,workflow:lt(o)}}return null}function zn(n,e={}){let t=Se(n,e.baseDir,{workflowDir:e.workflowDir});if(!t)throw new Error(`draft not found: ${n}`);let r=e.format??(t.path.endsWith(".json")?"json":"yaml"),s=y.parse({...t.workflow,status:"active",state:"active",updated:new Date().toISOString().slice(0,10)}),o=at(s);if(o.length)throw new Error(`draft is invalid: ${o.join("; ")}`);let i=e.workflowDir??I(e.baseDir??process.cwd(),".agentx/workflows"),a=I(i,`${s.id}.${r}`);if(!e.replace&&re(a))throw new Error(`workflow already exists: ${a}`);return Ie(i,{recursive:!0}),nt(a,r==="json"?JSON.stringify(s,null,2)+`
|
|
46
|
-
`:Y(s)),On(t.path),{workflow:s,from:t.path,to:a}}function Gn(n,e=process.cwd(),t={}){let r=Se(n,e,{workflowDir:t.workflowDir});if(!r)throw new Error(`draft not found: ${n}`);let s=t.workflowDir?Bn(t.workflowDir):qn(e);Ie(s,{recursive:!0});let o=I(s,`${Date.now().toString(36)}-${rt(r.path)}`);return _n(r.path,o),o}var Vn=30;function Zn(n,e={}){let t=e.minMessageLength??Vn;return tt(n,{agentId:e.agentId,status:"ok",since:e.since,limit:e.limit??1e3}).filter(r=>!r.workflowRunId).filter(r=>(r.messagePreview||"").trim().length>=t).filter(r=>!(r.chatId||"").startsWith("architect-"))}function Xn(n){let e=L(n);if(e.project&&e.kind)return[e.project,e.kind,e.intent,e.environment].filter(Boolean).join(":");let t=(n.messagePreview||"").toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter(r=>r.length>3).slice(0,6).join("-");return[n.channel||"unknown",t||"task"].join(":")}function Qn(n,e={}){let t=new Map;for(let s of n){let o=Xn(s),i=t.get(o)??[];i.push(s),t.set(o,i)}let r=Math.max(1,e.minClusterSize??3);return Array.from(t.entries()).map(([s,o])=>{let i=L(o[0]),a=(i.project?.05:0)+(i.kind?.05:0)+(i.intent?.1:0)+(i.environment?.05:0),d=.45+o.length*.1;return{key:s,traces:o.sort((l,p)=>p.startedAt-l.startedAt),confidence:Math.min(.95,d+a)}}).filter(s=>s.traces.length>=r).sort((s,o)=>o.confidence-s.confidence||o.traces.length-s.traces.length).slice(0,Math.max(1,e.max??10))}async function er(n,e,t={}){let r=[];for(let s of e){let o=s.traces[0],i=et(n,o.taskId),a=s.traces.map(l=>l.taskId),d=await it(o,i?.steps??[],{sourceTaskIds:a,confidence:s.confidence,generatedFrom:t.viaAgent||t.model?"llm-architect":"workflow-absorb",model:t.model,viaAgent:t.viaAgent,daemonUrl:t.daemonUrl,log:t.log});r.push({id:d.workflow.id,workflow:d.workflow,sourceTaskIds:a,confidence:s.confidence,reason:`${s.traces.length} similar successful task traces${d.usedLlm?` (LLM-architected via ${d.via})`:""}`,usedLlm:d.usedLlm,via:d.via})}return r}function ct(n){return n.nodes.find(r=>r.type.startsWith("trigger."))?.config?.inputSchema??null}function ut(n,e){if(!n||!e?.properties)return{};let t=n.match(/^([^:]+\/[^:]+):([^:]+):(.+)$/);if(!t)return{};let[,r,s,o]=t,i={};if(e.properties.project&&(i.project=r),s==="push"){let a=o.match(/^refs\/heads\/(.+)$/);a&&e.properties.ref&&(i.ref=a[1])}else{let a=Number(o);Number.isFinite(a)&&(e.properties.id&&(i.id=a),e.properties.iid&&(i.iid=a),e.properties.mrId&&(i.mrId=a),e.properties.issueId&&(i.issueId=a),e.properties.prId&&(i.prId=a))}return i}function pt(n,e){if(!n?.properties)return e;let t={...e};for(let[r,s]of Object.entries(n.properties))t[r]===void 0&&s&&"default"in s&&(t[r]=s.default);return t}function ft(n,e){return!n?.required||!Array.isArray(n.required)?[]:n.required.filter(t=>{let r=e[t];return r===void 0||r===""||r===null})}function tr(n,e){let t=ct(n);if(!t?.properties){let d={};for(let[l,p]of Object.entries(e))p!==void 0&&(d[l]=p);return{inputs:d,missing:[],filledFrom:{passthrough:Object.keys(d),chatId:[],defaults:[]}}}let r={};for(let d of["message","agentId","channel","chatId","senderId","senderUsername"])t.properties[d]&&e[d]!==void 0&&(r[d]=e[d]);let s=ut(e.chatId,t),o={...r,...s},i={...o};o=pt(t,o);let a=Object.keys(o).filter(d=>i[d]===void 0&&o[d]!==void 0);return{inputs:o,missing:ft(t,o),filledFrom:{passthrough:Object.keys(r),chatId:Object.keys(s),defaults:a}}}export{xe as a,k as b,x as c,Y as d,ce as e,pe as f,ge as g,Ze as h,Xe as i,Cr as j,et as k,Mr as l,tt as m,ve as n,An as o,Dn as p,ne as q,it as r,at as s,Un as t,Yn as u,Jn as v,Se as w,zn as x,Gn as y,Zn as z,Qn as A,er as B,Ut as C,tr as D};
|
|
47
|
-
//# sourceMappingURL=chunk-MTAPOCGA.js.map
|