@elisym/cli 0.12.0 → 0.14.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/llm/providers/http.ts","../src/llm/providers/anthropic.ts","../src/llm/providers/openai-compatible.ts","../src/llm/providers/deepseek.ts","../src/llm/providers/google.ts","../src/llm/providers/openai.ts","../src/llm/providers/xai.ts","../src/llm/registry.ts","../src/llm/index.ts","../src/commands/init.ts","../src/index.ts","../src/commands/profile.ts","../src/diagnostics.ts","../src/helpers.ts","../src/ledger.ts","../src/commands/start.ts","../src/llm/resolve.ts","../src/llm/cache.ts","../src/llm/keys.ts","../src/logging.ts","../src/runtime.ts","../src/skill/index.ts","../src/skill/non-llm-skills.ts","../src/skill/script-skill.ts","../src/skill/loader.ts","../src/transport/nostr.ts","../src/watchdog.ts","../src/commands/wallet.ts","../src/version.ts"],"names":["resolve","bodyLooksLikeBilling","fetchModels","verifyKey","verifyKeyDeep","DEFAULT_MAX_TOKENS","DEFAULT_MODEL","FALLBACK_MODELS","BILLING_BODY_MARKERS","descriptor","yaml","isAddress","writeSecrets","readFileSync","skillList","calculateProtocolFee","SdkStaticFileSkill","SdkStaticScriptSkill","SdkDynamicScriptSkill","NATIVE_SOL","SdkScriptSkill","createSolanaRpc","address","formatAssetAmount","USDC_SOLANA_DEVNET","join","RELAYS","jobRequestKind","toDTag","listAgents","cmdInit","loadAgent","isEncrypted","formatSol","dirname","ElisymIdentity","nip19"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,SAAS,gBAAA,GAA0B;AACjC,EAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA;AACjD,EAAA,GAAA,CAAI,IAAA,GAAO,YAAA;AACX,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAA,CAAgB,IAAY,MAAA,EAAqC;AACxE,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,gBAAA,EAAkB,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,aAAY,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,IAC7C,CAAA;AACA,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,kBAAkB,CAAA;AAAA,IAC3B,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,OAAA,EAAQ;AACR,MAAAA,QAAAA,EAAQ;AAAA,IACV,GAAG,EAAE,CAAA;AACL,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAC1D,CAAC,CAAA;AACH;AAEA,eAAsB,gBAAA,CACpB,GAAA,EACA,IAAA,EACA,MAAA,EACmB;AACnB,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,gBAAA,EAAiB;AAAA,EACzB;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,cAAc,CAAA;AACjE,EAAA,MAAM,OAAA,GAAU,MAAY,UAAA,CAAW,KAAA,EAAM;AAC7C,EAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AACzD,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,MAAM,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,CAAA;AAAA,EAChE,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,EAC9C;AACF;AAEA,eAAsB,cAAA,CACpB,GAAA,EACA,IAAA,EACA,MAAA,EACmB;AACnB,EAAA,KAAA,IAAS,OAAA,GAAU,KAAK,OAAA,EAAA,EAAW;AACjC,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,gBAAA,CAAiB,GAAA,EAAK,IAAA,EAAM,MAAM,CAAA;AAAA,IACrD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAA,GAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,EAAA;AACnD,MAAA,IAAI,OAAA,IAAW,WAAA,IAAe,IAAA,KAAS,YAAA,EAAc;AACnD,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,eAAA,CAAgB,KAAK,GAAA,CAAI,GAAA,GAAO,KAAK,OAAA,EAAS,GAAI,GAAG,MAAM,CAAA;AACjE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,MAAM,OAAA,IAAW,WAAA,IAAe,CAAC,kBAAA,CAAmB,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACrF,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrD,IAAA,MAAM,QAAQ,UAAA,GACV,IAAA,CAAK,IAAI,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA,GAAI,GAAA,IAAQ,MAAO,CAAA,IAAK,OAAA,EAAS,GAAM,CAAA,GACvE,IAAA,CAAK,IAAI,GAAA,GAAO,CAAA,IAAK,SAAS,GAAI,CAAA;AACtC,IAAA,MAAM,SAAS,IAAA,EAAM,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACnD,IAAA,MAAM,eAAA,CAAgB,OAAO,MAAM,CAAA;AAAA,EACrC;AACF;AAxFA,IAOM,gBACA,WAAA,EACA,kBAAA;AATN,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAOA,IAAM,cAAA,GAAiB,IAAA;AACvB,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,kBAAA,uBAAyB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACmK5D,eAAe,WAAA,CAAY,QAAgB,MAAA,EAAyC;AAClF,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,MACrB,gDAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAQ,qBAAqB,YAAA;AAAa,OACpE;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAO,eAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,EAAK;AAC/D,IAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,eAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,eAAA;AAAA,EACT;AACF;AAEA,eAAe,SAAA,CAAU,QAAgB,MAAA,EAAmD;AAC1F,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,MACrB,6CAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAQ,qBAAqB,YAAA;AAAa,OACpE;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,SAAS,IAAA,EAAM,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACnD,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AACA,IAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACjE,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACvE;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO,QAAQ,QAAA,CAAS,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,KACvD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,aAAA,EAAe,OAAO,OAAA,EAAQ;AAAA,EAC5D;AACF;AAIA,SAAS,qBAAqB,IAAA,EAAuB;AACnD,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,OAAO,qBAAqB,IAAA,CAAK,CAAC,WAAW,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AACrE;AAWA,eAAe,aAAA,CACb,MAAA,EACA,KAAA,EACA,MAAA,EAC6B;AAC7B,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,MACrB,uCAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,WAAA,EAAa,MAAA;AAAA,UACb,mBAAA,EAAqB;AAAA,SACvB;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,KAAA;AAAA,UACA,UAAA,EAAY,CAAA;AAAA,UACZ,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,KAAK;AAAA,SAC1C;AAAA,OACH;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,SAAS,IAAA,EAAM,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACnD,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AACA,IAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACjE,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACvE;AACA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACvE;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,oBAAA,CAAqB,IAAI,CAAA,EAAG;AACzD,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACvE;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO,QAAQ,QAAA,CAAS,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,KACvD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,aAAA,EAAe,OAAO,OAAA,EAAQ;AAAA,EAC5D;AACF;AA5RA,IAkBM,aAAA,EACA,kBAAA,EACA,eAAA,EA2BO,eAAA,EA+KP,oBAAA,EAgEO,kBAAA;AA9Rb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AAgBA,IAAA,SAAA,EAAA;AAEA,IAAM,aAAA,GAAgB,2BAAA;AACtB,IAAM,kBAAA,GAAqB,IAAA;AAC3B,IAAM,eAAA,GAAkB,CAAC,mBAAA,EAAqB,2BAAA,EAA6B,iBAAiB,CAAA;AA2BrF,IAAM,kBAAN,MAA2C;AAAA,MAIhD,YAA6B,MAAA,EAA+B;AAA/B,QAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,MAAgC;AAAA,MAHrD,OAAA,GAAU,CAAA;AAAA,MACV,QAAA,GAAW,CAAA;AAAA,MAIX,UAAU,KAAA,EAAyC;AACzD,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,CAAC,KAAA,EAAO;AACnC,UAAA;AAAA,QACF;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,YAAA,IAAgB,CAAA;AAC1C,QAAA,MAAM,YAAA,GAAe,MAAM,aAAA,IAAiB,CAAA;AAC5C,QAAA,IAAA,CAAK,OAAA,IAAW,WAAA;AAChB,QAAA,IAAA,CAAK,QAAA,IAAY,YAAA;AACjB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,QAAA,EAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,YAAA,EAAe,WAAW,CAAA,KAAA,EAAQ,YAAY,CAAA,YAAA,EAAe,IAAA,CAAK,OAAO,CAAA,KAAA,EAAQ,KAAK,QAAQ,CAAA,CAAA;AAAA,SAC5H;AAAA,MACF;AAAA,MAEA,MAAM,QAAA,CAAS,YAAA,EAAsB,SAAA,EAAmB,MAAA,EAAuC;AAC7F,QAAA,MAAM,WAAW,MAAM,cAAA;AAAA,UACrB,uCAAA;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB,kBAAA;AAAA,cAChB,WAAA,EAAa,KAAK,MAAA,CAAO,MAAA;AAAA,cACzB,mBAAA,EAAqB;AAAA,aACvB;AAAA,YACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,cACnB,UAAA,EAAY,KAAK,MAAA,CAAO,SAAA;AAAA,cACxB,MAAA,EAAQ,YAAA;AAAA,cACR,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,WAAW;AAAA,aAChD;AAAA,WACH;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAA,CAAS,MAAM,IAAI,MAAM,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,QACpF;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,KAAK,CAAA;AACzB,QAAA,MAAM,SAAA,GAAY,KAAK,OAAA,EAAS,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,MAAM,CAAA;AACrE,QAAA,OAAO,WAAW,IAAA,IAAQ,EAAA;AAAA,MAC5B;AAAA,MAEA,MAAM,iBAAA,CACJ,YAAA,EACA,QAAA,EACA,OACA,MAAA,EAC2B;AAC3B,QAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UAC1C,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,YAAA,EAAc;AAAA,YACZ,IAAA,EAAM,QAAA;AAAA,YACN,YAAY,MAAA,CAAO,WAAA;AAAA,cACjB,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,KAAU;AAAA,gBAC7B,KAAA,CAAM,IAAA;AAAA,gBACN,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,MAAM,WAAA;AAAY,eAClD;AAAA,aACH;AAAA,YACA,QAAA,EAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAI;AAAA;AACvF,SACF,CAAE,CAAA;AAEF,QAAA,MAAM,WAAW,MAAM,cAAA;AAAA,UACrB,uCAAA;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB,kBAAA;AAAA,cAChB,WAAA,EAAa,KAAK,MAAA,CAAO,MAAA;AAAA,cACzB,mBAAA,EAAqB;AAAA,aACvB;AAAA,YACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,cACnB,UAAA,EAAY,KAAK,MAAA,CAAO,SAAA;AAAA,cACxB,MAAA,EAAQ,YAAA;AAAA,cACR,QAAA;AAAA,cACA,KAAA,EAAO;AAAA,aACR;AAAA,WACH;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAA,CAAS,MAAM,IAAI,MAAM,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,QACpF;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,KAAK,CAAA;AACzB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAEjC,QAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,UAAU,CAAA;AACpE,QAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,UAAA,MAAM,KAAA,GAAoB,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,YACjD,EAAA,EAAI,MAAM,EAAA,IAAM,EAAA;AAAA,YAChB,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,YACpB,SAAA,EAAW,KAAA,CAAM,KAAA,IAAS;AAAC,WAC7B,CAAE,CAAA;AACF,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,UAAA;AAAA,YACN,KAAA;AAAA,YACA,gBAAA,EAAkB,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA;AAAQ,WACjD;AAAA,QACF;AACA,QAAA,MAAM,YAAY,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,MAAM,CAAA;AAC/D,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,QAAQ,EAAA,EAAG;AAAA,MACrD;AAAA,MAEA,yBAAyB,OAAA,EAAkC;AACzD,QAAA,OAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,cAChC,IAAA,EAAM,aAAA;AAAA,cACN,aAAa,MAAA,CAAO,MAAA;AAAA,cACpB,SAAS,MAAA,CAAO;AAAA,aAClB,CAAE;AAAA;AACJ,SACF;AAAA,MACF;AAAA,KACF;AAoDA,IAAM,oBAAA,GAAuB,CAAC,gBAAA,EAAkB,SAAA,EAAW,cAAc,CAAA;AAgElE,IAAM,kBAAA,GAA4C;AAAA,MACvD,EAAA,EAAI,WAAA;AAAA,MACJ,WAAA,EAAa,oBAAA;AAAA,MACb,MAAA,EAAQ,mBAAA;AAAA,MACR,YAAA,EAAc,aAAA;AAAA,MACd,cAAA,EAAgB,eAAA;AAAA,MAChB,WAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA,EAAc,CAAC,MAAA,KACb,IAAI,eAAA,CAAgB;AAAA,QAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,KAAA,EAAO,OAAO,KAAA,IAAS,aAAA;AAAA,QACvB,SAAA,EAAW,OAAO,SAAA,IAAa,kBAAA;AAAA,QAC/B,UAAU,MAAA,CAAO;AAAA,OAClB;AAAA,KACL;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1GO,SAAS,+BACd,MAAA,EACuB;AACvB,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,uBAAA,EAAyB,GAAI,MAAA,CAAO,mBAAA,IAAuB,EAAG,CAAA;AAEzF,EAAA,SAASC,sBAAqB,IAAA,EAAuB;AACnD,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,IAAA,OAAO,eAAe,IAAA,CAAK,CAAC,WAAW,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,EAC/D;AAEA,EAAA,eAAeC,YAAAA,CAAY,QAAgB,MAAA,EAAyC;AAClF,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,QACrB,CAAA,EAAG,OAAO,OAAO,CAAA,OAAA,CAAA;AAAA,QACjB,EAAE,QAAQ,KAAA,EAAO,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAG,EAAE;AAAA,QAChE;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,MAAA,CAAO,cAAA;AAAA,MAChB;AACA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,cAAwB,EAAC;AAC/B,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG;AACnC,QAAA,MAAM,MAAA,GAAS,OAAO,UAAA,GAAa,MAAA,CAAO,WAAW,KAAA,CAAM,EAAE,IAAI,KAAA,CAAM,EAAA;AACvE,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,QACzB;AAAA,MACF;AACA,MAAA,WAAA,CAAY,IAAA,EAAK;AACjB,MAAA,OAAO,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,MAAA,CAAO,cAAA;AAAA,IACvD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA,CAAO,cAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,eAAeC,UAAAA,CAAU,QAAgB,MAAA,EAAmD;AAC1F,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,QACrB,CAAA,EAAG,OAAO,OAAO,CAAA,OAAA,CAAA;AAAA,QACjB,EAAE,QAAQ,KAAA,EAAO,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAG,EAAE;AAAA,QAChE;AAAA,OACF;AACA,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,SAAS,IAAA,EAAM,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACnD,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AACA,MAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACjE,MAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,QAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,MACvE;AACA,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ,aAAA;AAAA,QACR,KAAA,EAAO,QAAQ,QAAA,CAAS,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,OACvD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,aAAA,EAAe,OAAO,OAAA,EAAQ;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,eAAeC,cAAAA,CACb,MAAA,EACA,KAAA,EACA,MAAA,EAC6B;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,QACrB,CAAA,EAAG,OAAO,OAAO,CAAA,iBAAA,CAAA;AAAA,QACjB;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,aAAA,EAAe,UAAU,MAAM,CAAA;AAAA,WACjC;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,KAAA;AAAA,YACA,UAAA,EAAY,CAAA;AAAA,YACZ,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,KAAK;AAAA,WAC1C;AAAA,SACH;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,SAAS,IAAA,EAAM,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACnD,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AACA,MAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACjE,MAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,QAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,MACvE;AACA,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,MACvE;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,WAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,KAAQH,qBAAAA,CAAqB,IAAI,CAAA,EAAG;AACtF,QAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,MACvE;AACA,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ,aAAA;AAAA,QACR,KAAA,EAAO,QAAQ,QAAA,CAAS,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,OACvD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,aAAA,EAAe,OAAO,OAAA,EAAQ;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,SAAS,aAAa,YAAA,EAAgD;AACpE,IAAA,OAAO,IAAI,sBAAA,CAAuB;AAAA,MAChC,QAAQ,YAAA,CAAa,MAAA;AAAA,MACrB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,KAAA,EAAO,YAAA,CAAa,KAAA,IAAS,MAAA,CAAO,YAAA;AAAA,MACpC,SAAA,EAAW,aAAa,SAAA,IAAaI,mBAAAA;AAAA,MACrC,eAAe,MAAA,CAAO,WAAA;AAAA,MACtB,UAAU,YAAA,CAAa;AAAA,KACxB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,CAAO,EAAA;AAAA,IACX,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,WAAA,EAAAH,YAAAA;AAAA,IACA,SAAA,EAAAC,UAAAA;AAAA,IACA,aAAA,EAAAC,cAAAA;AAAA,IACA;AAAA,GACF;AACF;AAtUA,IAoBMC,qBACA,uBAAA,EAiCO,sBAAA;AAtDb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAkBA,IAAA,SAAA,EAAA;AAEA,IAAMA,mBAAAA,GAAqB,IAAA;AAC3B,IAAM,uBAAA,GAA0B,CAAC,gBAAA,EAAkB,SAAA,EAAW,sBAAsB,cAAc,CAAA;AAiC3F,IAAM,yBAAN,MAAkD;AAAA,MAIvD,YAA6B,MAAA,EAAsC;AAAtC,QAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,MAAuC;AAAA,MAH5D,OAAA,GAAU,CAAA;AAAA,MACV,QAAA,GAAW,CAAA;AAAA,MAIX,UAAU,KAAA,EAAsC;AACtD,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,CAAC,KAAA,EAAO;AACnC,UAAA;AAAA,QACF;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,aAAA,IAAiB,CAAA;AAC3C,QAAA,MAAM,YAAA,GAAe,MAAM,iBAAA,IAAqB,CAAA;AAChD,QAAA,IAAA,CAAK,OAAA,IAAW,WAAA;AAChB,QAAA,IAAA,CAAK,QAAA,IAAY,YAAA;AACjB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,QAAA,EAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,YAAA,EAAe,WAAW,CAAA,KAAA,EAAQ,YAAY,CAAA,YAAA,EAAe,IAAA,CAAK,OAAO,CAAA,KAAA,EAAQ,KAAK,QAAQ,CAAA,CAAA;AAAA,SAC5H;AAAA,MACF;AAAA,MAEA,MAAM,QAAA,CAAS,YAAA,EAAsB,SAAA,EAAmB,MAAA,EAAuC;AAC7F,QAAA,MAAM,WAAW,MAAM,cAAA;AAAA,UACrB,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,iBAAA,CAAA;AAAA,UACtB;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB,kBAAA;AAAA,cAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,aAC7C;AAAA,YACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,cACnB,UAAA,EAAY,KAAK,MAAA,CAAO,SAAA;AAAA,cACxB,QAAA,EAAU;AAAA,gBACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA,EAAa;AAAA,gBACxC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAA;AAAU;AACrC,aACD;AAAA,WACH;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,YAAA,EAAe,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,MAAM,QAAA,CAAS,IAAA,EAAM,CAAA;AAAA,WACrF;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,KAAK,CAAA;AACzB,QAAA,OAAO,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,MAChD;AAAA,MAEA,MAAM,iBAAA,CACJ,YAAA,EACA,QAAA,EACA,OACA,MAAA,EAC2B;AAC3B,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UACvC,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,aAAa,IAAA,CAAK,WAAA;AAAA,YAClB,UAAA,EAAY;AAAA,cACV,IAAA,EAAM,QAAA;AAAA,cACN,YAAY,MAAA,CAAO,WAAA;AAAA,gBACjB,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,KAAU;AAAA,kBAC7B,KAAA,CAAM,IAAA;AAAA,kBACN,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,MAAM,WAAA;AAAY,iBAClD;AAAA,eACH;AAAA,cACA,QAAA,EAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAI;AAAA;AACvF;AACF,SACF,CAAE,CAAA;AAEF,QAAA,MAAM,WAAW,MAAM,cAAA;AAAA,UACrB,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,iBAAA,CAAA;AAAA,UACtB;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB,kBAAA;AAAA,cAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,aAC7C;AAAA,YACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,cACnB,UAAA,EAAY,KAAK,MAAA,CAAO,SAAA;AAAA,cACxB,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,YAAA,EAAa,EAAG,GAAG,QAAQ,CAAA;AAAA,cACjE,KAAA,EAAO;AAAA,aACR;AAAA,WACH;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,YAAA,EAAe,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,MAAM,QAAA,CAAS,IAAA,EAAM,CAAA;AAAA,WACrF;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,KAAK,CAAA;AACzB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG,OAAA;AACnC,QAAA,MAAM,SAAA,GAAY,OAAA,EAAS,UAAA,IAAc,EAAC;AAE1C,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,MAAM,KAAA,GAAoB,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS;AAChD,YAAA,IAAI,IAAA;AACJ,YAAA,IAAI;AACF,cAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU,aAAa,IAAI,CAAA;AAAA,YACpD,CAAA,CAAA,MAAQ;AACN,cAAA,IAAA,GAAO,EAAC;AAAA,YACV;AACA,YAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,IAAM,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,IAAA,IAAQ,EAAA,EAAI,SAAA,EAAW,IAAA,EAAK;AAAA,UAC/E,CAAC,CAAA;AACD,UAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,kBAAkB,OAAA,EAAQ;AAAA,QAC9D;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,WAAW,EAAA,EAAG;AAAA,MACtD;AAAA,MAEA,yBAAyB,OAAA,EAAkC;AACzD,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,UAC9B,IAAA,EAAM,MAAA;AAAA,UACN,cAAc,MAAA,CAAO,MAAA;AAAA,UACrB,SAAS,MAAA,CAAO;AAAA,SAClB,CAAE,CAAA;AAAA,MACJ;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChLA,IAUMC,gBACAC,gBAAAA,EAEO,iBAAA;AAbb,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAQA,IAAA,sBAAA,EAAA;AAEA,IAAMD,cAAAA,GAAgB,eAAA;AACtB,IAAMC,gBAAAA,GAAkB,CAAC,eAAA,EAAiB,mBAAmB,CAAA;AAEtD,IAAM,oBAA2C,8BAAA,CAA+B;AAAA,MACrF,EAAA,EAAI,UAAA;AAAA,MACJ,WAAA,EAAa,UAAA;AAAA,MACb,MAAA,EAAQ,kBAAA;AAAA,MACR,OAAA,EAAS,6BAAA;AAAA,MACT,YAAA,EAAcD,cAAAA;AAAA,MACd,cAAA,EAAgBC;AAAA,KACjB,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACHD,SAAS,iBAAiB,EAAA,EAA2B;AACnD,EAAA,MAAM,QAAA,GAAW,GAAG,UAAA,CAAW,aAAa,IAAI,EAAA,CAAG,KAAA,CAAM,aAAA,CAAc,MAAM,CAAA,GAAI,EAAA;AACjF,EAAA,OAAO,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,GAAI,QAAA,GAAW,IAAA;AACpD;AApBA,IAaMD,cAAAA,EACAC,kBACA,aAAA,EAOO,eAAA;AAtBb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AAWA,IAAA,sBAAA,EAAA;AAEA,IAAMD,cAAAA,GAAgB,kBAAA;AACtB,IAAMC,gBAAAA,GAAkB,CAAC,gBAAA,EAAkB,kBAAA,EAAoB,kBAAkB,CAAA;AACjF,IAAM,aAAA,GAAgB,SAAA;AAOf,IAAM,kBAAyC,8BAAA,CAA+B;AAAA,MACnF,EAAA,EAAI,QAAA;AAAA,MACJ,WAAA,EAAa,iBAAA;AAAA,MACb,MAAA,EAAQ,gBAAA;AAAA,MACR,OAAA,EAAS,yDAAA;AAAA,MACT,YAAA,EAAcD,cAAAA;AAAA,MACd,cAAA,EAAgBC,gBAAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACsBM,SAAS,uBAAuB,KAAA,EAAwB;AAC7D,EAAA,OAAO,OAAO,IAAA,CAAK,KAAK,CAAA,IAAK,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAC3D;AAuIA,eAAeL,YAAAA,CAAY,QAAgB,MAAA,EAAyC;AAClF,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,MACrB,kCAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAG,OAC/C;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAOK,gBAAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,IAAA,IAAQ,EAAC,EAC3B,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,EAAE,CAAA,CACvB,MAAA;AAAA,MACC,CAAC,QACE,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IACnB,EAAA,CAAG,WAAW,IAAI,CAAA,IAClB,GAAG,UAAA,CAAW,IAAI,KAClB,EAAA,CAAG,UAAA,CAAW,IAAI,CAAA,IAClB,EAAA,CAAG,WAAW,UAAU,CAAA,KAC1B,CAAC,EAAA,CAAG,QAAA,CAAS,UAAU,CAAA,IACvB,CAAC,GAAG,QAAA,CAAS,UAAU,KACvB,CAAC,EAAA,CAAG,SAAS,OAAO,CAAA,IACpB,CAAC,EAAA,CAAG,QAAA,CAAS,KAAK,CAAA,IAClB,CAAC,EAAA,CAAG,QAAA,CAAS,SAAS;AAAA,MAEzB,IAAA,EAAK;AACR,IAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAASA,gBAAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAOA,gBAAAA;AAAA,EACT;AACF;AAEA,eAAeJ,UAAAA,CAAU,QAAgB,MAAA,EAAmD;AAC1F,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,MACrB,kCAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAG,OAC/C;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,SAAS,IAAA,EAAM,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACnD,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AACA,IAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACjE,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACvE;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO,QAAQ,QAAA,CAAS,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,KACvD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,aAAA,EAAe,OAAO,OAAA,EAAQ;AAAA,EAC5D;AACF;AAIA,SAASF,sBAAqB,IAAA,EAAuB;AACnD,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,OAAOO,sBAAqB,IAAA,CAAK,CAAC,WAAW,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AACrE;AAUA,eAAeJ,cAAAA,CACb,MAAA,EACA,KAAA,EACA,MAAA,EAC6B;AAC7B,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,uBAAuB,KAAK,CAAA;AAC9C,IAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,MACrB,4CAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,UAAU,MAAM,CAAA;AAAA,SACjC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,KAAA;AAAA,UACA,GAAI,YAAY,EAAE,qBAAA,EAAuB,GAAE,GAAI,EAAE,YAAY,CAAA,EAAE;AAAA,UAC/D,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,KAAK;AAAA,SAC1C;AAAA,OACH;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,SAAS,IAAA,EAAM,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACnD,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AACA,IAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACjE,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACvE;AACA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACvE;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAOH,qBAAAA,CAAqB,IAAI,CAAA,EAAG;AACzD,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACvE;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAOA,qBAAAA,CAAqB,IAAI,CAAA,EAAG;AACzD,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,WAAW,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACvE;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO,QAAQ,QAAA,CAAS,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,KACvD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,aAAA,EAAe,OAAO,OAAA,EAAQ;AAAA,EAC5D;AACF;AA9TA,IAoBMK,cAAAA,EACAD,mBAAAA,EACAE,gBAAAA,EAkCO,YAAA,EAsMPC,qBAAAA,EAkEO,eAAA;AAhUb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AAkBA,IAAA,SAAA,EAAA;AAEA,IAAMF,cAAAA,GAAgB,aAAA;AACtB,IAAMD,mBAAAA,GAAqB,IAAA;AAC3B,IAAME,gBAAAA,GAAkB,CAAC,QAAA,EAAU,aAAA,EAAe,SAAS,CAAA;AAkCpD,IAAM,eAAN,MAAwC;AAAA,MAI7C,YAA6B,MAAA,EAA4B;AAA5B,QAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,MAA6B;AAAA,MAHlD,OAAA,GAAU,CAAA;AAAA,MACV,QAAA,GAAW,CAAA;AAAA,MAIX,gBAAA,GAA4B;AAClC,QAAA,OAAO,sBAAA,CAAuB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,MACjD;AAAA,MAEQ,UAAU,KAAA,EAAsC;AACtD,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,CAAC,KAAA,EAAO;AACnC,UAAA;AAAA,QACF;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,aAAA,IAAiB,CAAA;AAC3C,QAAA,MAAM,YAAA,GAAe,MAAM,iBAAA,IAAqB,CAAA;AAChD,QAAA,IAAA,CAAK,OAAA,IAAW,WAAA;AAChB,QAAA,IAAA,CAAK,QAAA,IAAY,YAAA;AACjB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,QAAA,EAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,YAAA,EAAe,WAAW,CAAA,KAAA,EAAQ,YAAY,CAAA,YAAA,EAAe,IAAA,CAAK,OAAO,CAAA,KAAA,EAAQ,KAAK,QAAQ,CAAA,CAAA;AAAA,SAC5H;AAAA,MACF;AAAA,MAEA,MAAM,QAAA,CAAS,YAAA,EAAsB,SAAA,EAAmB,MAAA,EAAuC;AAC7F,QAAA,MAAM,SAAA,GAAY,KAAK,gBAAA,EAAiB;AACxC,QAAA,MAAM,WAAW,MAAM,cAAA;AAAA,UACrB,4CAAA;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB,kBAAA;AAAA,cAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,aAC7C;AAAA,YACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,cACnB,GAAI,SAAA,GACA,EAAE,qBAAA,EAAuB,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,GAC/C,EAAE,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AAAA,cACxC,QAAA,EAAU;AAAA,gBACR,EAAE,IAAA,EAAM,SAAA,GAAY,WAAA,GAAc,QAAA,EAAU,SAAS,YAAA,EAAa;AAAA,gBAClE,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAA;AAAU;AACrC,aACD;AAAA,WACH;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAA,CAAS,MAAM,IAAI,MAAM,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,QACjF;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,KAAK,CAAA;AACzB,QAAA,OAAO,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,MAChD;AAAA,MAEA,MAAM,iBAAA,CACJ,YAAA,EACA,QAAA,EACA,OACA,MAAA,EAC2B;AAC3B,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UACvC,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,aAAa,IAAA,CAAK,WAAA;AAAA,YAClB,UAAA,EAAY;AAAA,cACV,IAAA,EAAM,QAAA;AAAA,cACN,YAAY,MAAA,CAAO,WAAA;AAAA,gBACjB,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,KAAU;AAAA,kBAC7B,KAAA,CAAM,IAAA;AAAA,kBACN,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,MAAM,WAAA;AAAY,iBAClD;AAAA,eACH;AAAA,cACA,QAAA,EAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAI;AAAA;AACvF;AACF,SACF,CAAE,CAAA;AAEF,QAAA,MAAM,SAAA,GAAY,KAAK,gBAAA,EAAiB;AACxC,QAAA,MAAM,WAAW,MAAM,cAAA;AAAA,UACrB,4CAAA;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB,kBAAA;AAAA,cAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,aAC7C;AAAA,YACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,cACnB,GAAI,SAAA,GACA,EAAE,qBAAA,EAAuB,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,GAC/C,EAAE,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AAAA,cACxC,QAAA,EAAU;AAAA,gBACR,EAAE,IAAA,EAAM,SAAA,GAAY,WAAA,GAAc,QAAA,EAAU,SAAS,YAAA,EAAa;AAAA,gBAClE,GAAG;AAAA,eACL;AAAA,cACA,KAAA,EAAO;AAAA,aACR;AAAA,WACH;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAA,CAAS,MAAM,IAAI,MAAM,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,QACjF;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,KAAK,CAAA;AACzB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG,OAAA;AACnC,QAAA,MAAM,SAAA,GAAY,OAAA,EAAS,UAAA,IAAc,EAAC;AAE1C,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,MAAM,KAAA,GAAoB,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS;AAChD,YAAA,IAAI,IAAA;AACJ,YAAA,IAAI;AACF,cAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU,aAAa,IAAI,CAAA;AAAA,YACpD,CAAA,CAAA,MAAQ;AACN,cAAA,IAAA,GAAO,EAAC;AAAA,YACV;AACA,YAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,IAAM,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,IAAA,IAAQ,EAAA,EAAI,SAAA,EAAW,IAAA,EAAK;AAAA,UAC/E,CAAC,CAAA;AACD,UAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,kBAAkB,OAAA,EAAQ;AAAA,QAC9D;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,WAAW,EAAA,EAAG;AAAA,MACtD;AAAA,MAEA,yBAAyB,OAAA,EAAkC;AACzD,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,UAC9B,IAAA,EAAM,MAAA;AAAA,UACN,cAAc,MAAA,CAAO,MAAA;AAAA,UACrB,SAAS,MAAA,CAAO;AAAA,SAClB,CAAE,CAAA;AAAA,MACJ;AAAA,KACF;AAmEA,IAAMC,qBAAAA,GAAuB,CAAC,gBAAA,EAAkB,SAAA,EAAW,sBAAsB,cAAc,CAAA;AAkExF,IAAM,eAAA,GAAyC;AAAA,MACpD,EAAA,EAAI,QAAA;AAAA,MACJ,WAAA,EAAa,cAAA;AAAA,MACb,MAAA,EAAQ,gBAAA;AAAA,MACR,YAAA,EAAcF,cAAAA;AAAA,MACd,cAAA,EAAgBC,gBAAAA;AAAA,MAChB,WAAA,EAAAL,YAAAA;AAAA,MACA,SAAA,EAAAC,UAAAA;AAAA,MACA,aAAA,EAAAC,cAAAA;AAAA,MACA,YAAA,EAAc,CAAC,MAAA,KACb,IAAI,YAAA,CAAa;AAAA,QACf,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,KAAA,EAAO,OAAO,KAAA,IAASE,cAAAA;AAAA,QACvB,SAAA,EAAW,OAAO,SAAA,IAAaD,mBAAAA;AAAA,QAC/B,UAAU,MAAA,CAAO;AAAA,OAClB,CAAA;AAAA,MACH,gBAAA,EAAkB;AAAA,KACpB;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjVA,IAWMC,gBACAC,gBAAAA,EAEO,YAAA;AAdb,IAAA,QAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0BAAA,GAAA;AASA,IAAA,sBAAA,EAAA;AAEA,IAAMD,cAAAA,GAAgB,aAAA;AACtB,IAAMC,gBAAAA,GAAkB,CAAC,QAAA,EAAU,QAAA,EAAU,aAAa,CAAA;AAEnD,IAAM,eAAsC,8BAAA,CAA+B;AAAA,MAChF,EAAA,EAAI,KAAA;AAAA,MACJ,WAAA,EAAa,YAAA;AAAA,MACb,MAAA,EAAQ,aAAA;AAAA,MACR,OAAA,EAAS,qBAAA;AAAA,MACT,YAAA,EAAcD,cAAAA;AAAA,MACd,cAAA,EAAgBC;AAAA,KACjB,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACqEM,SAAS,oBAAoB,UAAA,EAAyC;AAC3E,EAAA,QAAA,CAAS,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,UAAU,CAAA;AACxC;AAGO,SAAS,eAAe,EAAA,EAA+C;AAC5E,EAAA,OAAO,QAAA,CAAS,IAAI,EAAE,CAAA;AACxB;AAGO,SAAS,gBAAA,GAA4C;AAC1D,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA;AACrC;AAGO,SAAS,wBAAA,GAAqC;AACnD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAA;AACnC;AA3GA,IAoFM,QAAA;AApFN,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAiBA,IAAA,cAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,QAAA,EAAA;AA+DA,IAAM,QAAA,uBAAe,GAAA,EAAmC;AA2BxD,IAAA,mBAAA,CAAoB,kBAAkB,CAAA;AACtC,IAAA,mBAAA,CAAoB,eAAe,CAAA;AACnC,IAAA,mBAAA,CAAoB,YAAY,CAAA;AAChC,IAAA,mBAAA,CAAoB,eAAe,CAAA;AACnC,IAAA,mBAAA,CAAoB,iBAAiB,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtE9B,SAAS,gBAAgB,MAAA,EAA8B;AAC5D,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA;AACjD,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,KAAA,GAAQ,wBAAA,EAAyB,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,QAAA;AACvD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,OAAO,QAAQ,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,UAAA,CAAW,MAAM,CAAA,8BAAA,CAAgC,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,WAAW,YAAA,CAAa;AAAA,IAC7B,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,UAAU,MAAA,CAAO;AAAA,GAClB,CAAA;AACH;AAkCA,eAAsB,mBAAA,CACpB,QAAA,EACA,MAAA,EACA,KAAA,EACA,MAAA,EAC6B;AAC7B,EAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO,yBAAyB,QAAQ,CAAA,CAAA;AAAA,KAC1C;AAAA,EACF;AACA,EAAA,OAAO,UAAA,CAAW,aAAA,CAAc,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AACvD;AA7GA,IAAA,QAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kBAAA,GAAA;AAmBA,IAAA,aAAA,EAAA;AAGA,IAAA,aAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtBA,IAAA,YAAA,GAAA,EAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,WAAA,EAAA,MAAAL;AAAA,CAAA,CAAA;AA0CA,SAAS,gBAAA,GAA+B;AACtC,EAAA,OAAO,iBAAiB,KAAA,CAAM;AAAA,IAC5B,WAAA,EAAa,oBAAA;AAAA,IACb,MAAA,EAAQ,CAAC,GAAG,MAAM,CAAA;AAAA,IAClB,UAAU,EAAC;AAAA,IACX,UAAU;AAAC,GACZ,CAAA;AACH;AAQA,eAAsBA,YAAAA,CAAY,UAAkB,MAAA,EAAmC;AACrF,EAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sBAAA,EAAyB,QAAQ,CAAA,uBAAA,CAAyB,CAAA;AACvE,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,UAAA,CAAW,WAAA,CAAY,MAAM,CAAA;AAAA,EAC5C,SAAS,CAAA,EAAQ;AACf,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4BAAA,EAA+B,CAAA,CAAE,OAAO,CAAA,iBAAA,CAAmB,CAAA;AACxE,IAAA,OAAO,UAAA,CAAW,cAAA;AAAA,EACpB;AACF;AAEA,SAAS,WAAW,OAAA,EAAmC;AACrD,EAAA,OAAO,OAAA,CAAQ,QAAQ,SAAA,GAAY,MAAA;AACrC;AAEA,eAAsB,OAAA,CAAQ,OAAA,EAAkB,OAAA,GAAuB,EAAC,EAAkB;AACxF,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,OAAO,UAAU,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAExB,EAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AAEtC,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,QAAA,EAAU;AACtC,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AAGA,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,QAAA;AAG5C,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,MAAM,CAAA;AAC9C,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AAC5C,IAAA,QAAA,GAAW,iBAAiB,KAAA,CAAM,IAAA,CAAK,MAAM,GAAG,CAAA,IAAK,EAAE,CAAA;AACvD,IAAA,OAAA,CAAQ,GAAA,CAAI,0BAA0B,UAAU;AAAA,CAAI,CAAA;AAAA,EACtD,CAAA,MAAA,IAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,QAAA,GAAW,gBAAA,EAAiB;AAC5B,IAAA,OAAA,CAAQ,IAAI,6EAA6E,CAAA;AAAA,EAC3F;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,OAAA,EAAS,QAAQ,CAAA;AAK1D,EAAA,MAAM,MAAA,GAAS,WAAW,OAAO,CAAA;AACjC,EAAA,MAAM,YAAA,GACJ,WAAW,MAAA,GAAS,aAAA,CAAc,SAAS,CAAA,GAAI,gBAAA,CAAiB,WAAW,GAAG,CAAA;AAChF,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,OAAA,EAAU,SAAS,CAAA,oBAAA,EAAuB,YAAY,CAAA,8GAAA;AAAA,OACxD;AAAA,IACF;AACA,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,MAC1C;AAAA,QACE,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,CAAA,OAAA,EAAU,SAAS,CAAA,oBAAA,EAAuB,YAAY,CAAA,oBAAA,CAAA;AAAA,QAC/D,OAAA,EAAS;AAAA;AACX,KACD,CAAA;AACD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AACtB,MAAA;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,MAAA,KAAW,SAAA,IAAa,aAAA,CAAc,SAAS,CAAA,EAAG;AAC3D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,QACvC;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,CAAA,gBAAA,EAAmB,SAAS,CAAA,sBAAA,EAAyB,SAAS,CAAA,iCAAA,CAAA;AAAA,UACvE,OAAA,EAAS;AAAA;AACX,OACD,CAAA;AACD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AACtB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,MAAA,KAAW,MAAA,IAAU,gBAAA,CAAiB,SAAA,EAAW,GAAG,CAAA,EAAG;AAChE,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,QACxC;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,0BAA0B,SAAS,CAAA,mDAAA,CAAA;AAAA,UAC5C,OAAA,EAAS;AAAA;AACX,OACD,CAAA;AACD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AACtB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAA,GAAO,QAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,QAAQ,CAAA;AACxC,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,cAAA,GAAiB,MAAA,CAAO,MAAA;AAAA,EAC1B;AAKA,EAAA,IAAI,kBAAA;AACJ,EAAA,MAAM,iBAAA,GAAoB,KAAK,GAAA,EAAK,QAAA;AACpC,EAAA,IAAI,IAAA,CAAK,OAAO,iBAAA,EAAmB;AACjC,IAAA,MAAM,UAAA,GAAa,eAAe,iBAAiB,CAAA;AACnD,IAAA,MAAM,SAAS,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,GAAI,MAAA;AAC7D,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,kBAAA,GAAqB,MAAA;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,UAAA,CAAW,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAAA,IAC9D,WAAW,cAAA,EAAgB;AACzB,MAAA,kBAAA,GAAqB,cAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,YAAY,WAAA,IAAe,iBAAA;AACzC,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,QACvC;AAAA,UACE,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,GAAG,KAAK,CAAA,SAAA,CAAA;AAAA,UACjB,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AACD,MAAA,kBAAA,GAAqB,MAAA,IAAU,MAAA;AAAA,IACjC;AAAA,EACF;AAMA,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAClD,EAAA,IAAI,IAAA,CAAK,GAAA,IAAO,CAAC,QAAA,IAAY,iBAAA,EAAmB;AAC9C,IAAA,MAAM,gBAAA,GAAmB,kBAAiB,CAAE,MAAA;AAAA,MAC1C,CAAC,UAAA,KAAe,UAAA,CAAW,EAAA,KAAO;AAAA,KACpC;AACA,IAAA,KAAA,MAAW,cAAc,gBAAA,EAAkB;AACzC,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA;AACjD,MAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,QAC/C;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,gBAAA;AAAA,UACN,OAAA,EAAS,CAAA,UAAA,EAAa,UAAA,CAAW,WAAW,CAAA,6DAAA,CAAA;AAAA,UAC5C,OAAA,EAAS,QAAQ,WAAW;AAAA;AAC9B,OACD,CAAA;AACD,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,iBAAA,CAAkB,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,WAAW,CAAA;AAChD,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,UAAA,CAAW,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAAA,MAC9D,CAAA,MAAO;AACL,QAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,UAC9C;AAAA,YACE,IAAA,EAAM,UAAA;AAAA,YACN,IAAA,EAAM,eAAA;AAAA,YACN,OAAA,EAAS,CAAA,EAAG,UAAA,CAAW,WAAW,CAAA,SAAA,CAAA;AAAA,YAClC,IAAA,EAAM;AAAA;AACR,SACD,CAAA;AACD,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,iBAAA,CAAkB,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,aAAa,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAMA,EAAA,IAAI,UAAA,GAAa,EAAA;AACjB,EAAA,MAAM,aAAA,GAAgB,QAAQ,GAAA,CAAI,iBAAA;AAClC,EAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,IAAA,UAAA,GAAa,OAAA,CAAQ,UAAA;AAAA,EACvB,CAAA,MAAA,IAAW,kBAAkB,MAAA,EAAW;AACtC,IAAA,UAAA,GAAa,aAAA;AAAA,EACf,CAAA,MAAA,IAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,UAAA,GAAa,EAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO;AAAA,MACnC;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,sDAAA;AAAA,QACT,IAAA,EAAM;AAAA;AACR,KACD,CAAA;AACD,IAAA,UAAA,GAAa,OAAO,UAAA,IAAc,EAAA;AAClC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,QAClD;AAAA,UACE,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS,qBAAA;AAAA,UACT,IAAA,EAAM,GAAA;AAAA,UACN,QAAA,EAAU,CAAC,KAAA,KAAkB,KAAA,KAAU,UAAA,IAAc;AAAA;AACvD,OACD,CAAA;AACI,IACP;AAAA,EACF;AAGA,EAAA,MAAM,mBAAmB,iBAAA,EAAkB;AAC3C,EAAA,MAAM,WAAA,GAAc,aAAa,gBAAgB,CAAA;AACjD,EAAA,MAAM,iBAAiB,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,SAAS,KAAK,CAAA;AAMnE,EAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,EAAE,QAAQ,IAAA,EAAM,SAAA,EAAW,KAAK,CAAA;AACrE,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAoB,iBAAiB,CAAA;AAC/D,EAAA,IAAI,IAAA,CAAK,OAAO,kBAAA,EAAoB;AAClC,IAAA,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,kBAAkB,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,WAAA,CAAY,aAAa,CAAA;AACnD,EAAA,MAAM,gBAAA,CAAiB,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AACxC,EAAA,MAAM,yBAAA,CAA0B,QAAQ,GAAG,CAAA;AAC3C,EAAA,MAAM,YAAA;AAAA,IACJ,OAAA,CAAQ,GAAA;AAAA,IACR;AAAA,MACE,gBAAA,EAAkB,cAAA;AAAA,MAClB,cAAc,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa;AAAA,KAClE;AAAA,IACA,UAAA,IAAc;AAAA,GAChB;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,CAAW,WAAW,CAAA;AACzC,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,SAAA,EAAc,SAAS,CAAA,WAAA,EAAc,MAAM,CAAA,EAAA,CAAI,CAAA;AAC3D,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AACxC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,IAAI,CAAA,CAAE,CAAA;AACjC,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,OAAA,EAAS;AAC7B,IAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAe,IAAA,CAAK,SAAS,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AAAA,EACzD;AACA,EAAA,OAAA,CAAQ,GAAA,EAAI;AACd;AAEA,eAAe,gBAAA,CACb,SACA,QAAA,EACiB;AACjB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IAC1C;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,aAAA;AAAA,MACT,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,QAAA,IAAI;AACF,UAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,UAAA,OAAO,IAAA;AAAA,QACT,SAAS,CAAA,EAAQ;AACf,UAAA,OAAO,CAAA,CAAE,OAAA;AAAA,QACX;AAAA,MACF;AAAA;AACF,GACD,CAAA;AACD,EAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,EAAA,OAAO,SAAA;AACT;AAEA,eAAe,WAAW,QAAA,EAEyB;AACjD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IAC5C;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,cAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IAC5C;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,kCAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IACxC;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,gEAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IACvC;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,gEAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IAC9C;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,eAAA;AAAA,MACN,OAAA,EAAS,8DAAA;AAAA,MACT,OAAA,EAAS,EAAA;AAAA,MACT,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OAAO,SAAA,CAAU,KAAK,CAAA,IAAK,wBAAA;AAAA,MAC7B;AAAA;AACF,GACD,CAAA;AAED,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN;AAAA,KAGF;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IAC5C;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,eAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,0EAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACT;AAAA,QACA,GAAG,gBAAA,EAAiB,CAAE,GAAA,CAAI,CAACO,WAAAA,MAAgB;AAAA,UACzC,MAAMA,WAAAA,CAAW,WAAA;AAAA,UACjB,OAAOA,WAAAA,CAAW;AAAA,SACpB,CAAE;AAAA;AACJ;AACF,GACD,CAAA;AAED,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,cAAc,WAAA,IAAe,MAAA;AAAA,IAC7B,WAAA;AAAA,IACA,SAAS,OAAA,IAAW,MAAA;AAAA,IACpB,QAAQ,MAAA,IAAU,MAAA;AAAA,IAClB,MAAA,EAAQ,CAAC,GAAG,MAAM,CAAA;AAAA,IAClB,QAAA,EAAU,aAAA,GAAgB,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,aAAA,EAAe,CAAA,GAAI,EAAC;AAAA,IAC9F,UAAU;AAAC,GACb;AAEA,EAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,IAAA,MAAMC,KAAAA,GAAmB,gBAAA,CAAiB,KAAA,CAAM,QAAQ,CAAA;AACxD,IAAA,OAAO,EAAE,MAAAA,KAAAA,EAAK;AAAA,EAChB;AAEA,EAAA,MAAM,UAAA,GAAa,eAAe,WAAW,CAAA;AAC7C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,WAAW,CAAA,iBAAA,CAAmB,CAAA;AAAA,EACvE;AACA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA;AAC5C,EAAA,IAAI,MAAA,GAA6B,MAAA;AACjC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,MAC5C;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,CAAA,EAAG,UAAA,CAAW,WAAW,CAAA,SAAA,CAAA;AAAA,QAClC,IAAA,EAAM;AAAA;AACR,KACD,CAAA;AACD,IAAA,MAAA,GAAS,WAAA,IAAe,MAAA;AAAA,EAC1B;AAEA,EAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,MAAMR,YAAAA,CAAY,WAAA,EAAa,UAAU,EAAE,CAAA;AAC1D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IACtC;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,QAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IAC1C;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,aAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,MAAM,IAAA,GAAmB,iBAAiB,KAAA,CAAM;AAAA,IAC9C,GAAG,QAAA;AAAA,IACH,KAAK,EAAE,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,YAAY,SAAA;AAAU,GAC5D,CAAA;AAGD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,GAAS,SAAY,MAAA,EAAO;AACrD;AAleA,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sBAAA,GAAA;AAgCA,IAAA,QAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjBA,SAAA,EAAA;;;ACDA,QAAA,EAAA;AAEA,eAAsB,WAAW,IAAA,EAAyC;AACxE,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,OAAO,UAAU,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAExB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AACnC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,MAAM,oDAAoD,CAAA;AAClE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,MACzC;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,eAAA;AAAA,QACT,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UAC9B,MAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,MAAM,CAAA,CAAA,CAAA;AAAA,UACpC,OAAO,KAAA,CAAM;AAAA,SACf,CAAE;AAAA;AACJ,KACD,CAAA;AACD,IAAA,IAAA,GAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,QAAQ,GAAA,CAAI,iBAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAA,EAAO,KAAK,UAAU,CAAA;AAErD,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,iBAAA,EAAsB,IAAI,CAAA,GAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAAA,CAAK,CAAA;AAE9D,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,OAAO,CAAC,IAAA,EAAM;AACZ,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,MACxC;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,eAAA;AAAA,QACT,OAAA,EAAS;AAAA,UACP;AAAA,YACE,MAAM,CAAA,sBAAA,EAAyB,QAAA,CAAS,OAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,YACtE,KAAA,EAAO;AAAA,WACT;AAAA,UACA;AAAA,YACE,IAAA,EAAM,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,WAAW,gBAAgB,CAAA,CAAA,CAAA;AAAA,YACrE,KAAA,EAAO;AAAA,WACT;AAAA,UACA;AAAA,YACE,IAAA,EAAM,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,QAAA,IAAY,gBAAgB,CAAA,GAAA,EAAM,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,KAAA,IAAS,GAAG,CAAA,CAAA,CAAA;AAAA,YAC9F,KAAA,EAAO;AAAA,WACT;AAAA,UACA,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AAChC;AACF,KACD,CAAA;AAED,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,IAAA,GAAO,IAAA;AACP,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,MAAA,CAAO;AAAA,QACpC;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,aAAA;AAAA,UACN,OAAA,EAAS,wBAAA;AAAA,UACT,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,YAAA,IAAgB;AAAA,SACvC;AAAA,QACA;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,aAAA;AAAA,UACN,OAAA,EAAS,cAAA;AAAA,UACT,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe;AAAA,SACtC;AAAA,QACA;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,gDAAA;AAAA,UACT,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW;AAAA,SAClC;AAAA,QACA;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,gDAAA;AAAA,UACT,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU;AAAA;AACjC,OACD,CAAA;AAED,MAAA,MAAM,QAAA,GAAuB;AAAA,QAC3B,GAAG,MAAA,CAAO,IAAA;AAAA,QACV,YAAA,EAAc,QAAQ,WAAA,IAAe,MAAA;AAAA,QACrC,WAAA,EAAa,QAAQ,WAAA,IAAe,EAAA;AAAA,QACpC,OAAA,EAAS,QAAQ,OAAA,IAAW,MAAA;AAAA,QAC5B,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,OAC5B;AACA,MAAA,MAAM,SAAA,CAAU,MAAA,CAAO,GAAA,EAAK,QAAQ,CAAA;AACpC,MAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,MAAA,OAAA,CAAQ,IAAI,sBAAsB,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,YAAY,QAAA,EAAU;AACxB,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACtC,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,MAAA,CAAO;AAAA,QACpC;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,kCAAA;AAAA,UACT,OAAA,EAAS,SAAS,OAAA,IAAW,EAAA;AAAA,UAC7B,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,YAAA,IAAI,CAAC,KAAA,EAAO;AACV,cAAA,OAAO,IAAA;AAAA,YACT;AACA,YAAA,OAAOS,SAAAA,CAAU,KAAK,CAAA,IAAK,wBAAA;AAAA,UAC7B;AAAA;AACF,OACD,CAAA;AAED,MAAA,MAAM,QAAA,GAAuB;AAAA,QAC3B,GAAG,MAAA,CAAO,IAAA;AAAA,QACV,QAAA,EAAU,OAAA,CAAQ,OAAA,GACd,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,IACjE;AAAC,OACP;AACA,MAAA,MAAM,SAAA,CAAU,MAAA,CAAO,GAAA,EAAK,QAAQ,CAAA;AACpC,MAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,MAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AAAA,IACnC;AAEA,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,MAAM,eAAA,GAAkB,gBAAA,EAAiB,CAAE,GAAA,CAAI,CAAC,UAAA,MAAgB;AAAA,QAC9D,MAAM,UAAA,CAAW,WAAA;AAAA,QACjB,OAAO,UAAA,CAAW;AAAA,OACpB,CAAE,CAAA;AACF,MAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,QAAA,OAAA,CAAQ,MAAM,kCAAkC,CAAA;AAChD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,gBAAgB,CAAC,CAAA;AACrC,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAA,CAAQ,MAAM,kCAAkC,CAAA;AAChD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,QAC5C;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,aAAA;AAAA,UACN,OAAA,EAAS,uEAAA;AAAA,UACT,OAAA,EAAS,eAAA;AAAA,UACT,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,YAAY,WAAA,CAAY;AAAA;AACpD,OACD,CAAA;AACD,MAAA,MAAM,iBAAA,GAAoB,eAAe,WAAW,CAAA;AACpD,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,WAAW,CAAA,iBAAA,CAAmB,CAAA;AAAA,MACvE;AAEA,MAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkB,MAAA,CAAO,OAAA,EAAS,WAAW,CAAA;AACtE,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,QACvC;AAAA,UACE,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,CAAA,EAAG,iBAAA,CAAkB,WAAW,aAAa,gBAAgB,CAAA,gCAAA,CAAA;AAAA,UACtE,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAA,IAAU,YAAA,CAAa,MAAA,CAAO,SAAS,WAAW,CAAA;AAEnE,MAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,MAAA,MAAM,EAAE,WAAA,EAAAT,YAAAA,EAAY,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,SAAA,EAAA,EAAA,YAAA,CAAA,CAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,MAAMA,YAAAA,CAAY,WAAA,EAAa,QAAQ,CAAA;AAEtD,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,QACtC;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,OAAA,EAAS,QAAA;AAAA,UACT,OAAA,EAAS,MAAA;AAAA,UACT,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK;AAAA;AAC5B,OACD,CAAA;AAED,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,QAC1C;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,aAAA;AAAA,UACT,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,UAAA,IAAc;AAAA;AAC1C,OACD,CAAA;AAID,MAAA,MAAM,gBAAA,GAAmB,kBAAiB,CAAE,MAAA;AAAA,QAC1C,CAAC,UAAA,KAAe,UAAA,CAAW,EAAA,KAAO;AAAA,OACpC;AACA,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,MAAA,KAAA,MAAW,cAAc,gBAAA,EAAkB;AACzC,QAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,MAAA,CAAO,OAAA,EAAS,WAAW,EAAE,CAAA;AAC9D,QAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,UAC5C;AAAA,YACE,IAAA,EAAM,UAAA;AAAA,YACN,IAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,CAAA,EAAG,UAAA,CAAW,WAAW,iCAAiC,MAAM,CAAA,gCAAA,CAAA;AAAA,YACzE,IAAA,EAAM;AAAA;AACR,SACD,CAAA;AACD,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,WAAW,CAAA;AAAA,QAC1C;AAAA,MACF;AAEA,MAAA,MAAM,UAAoB,EAAE,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,YAAY,SAAA,EAAU;AAChF,MAAA,MAAM,WAAuB,EAAE,GAAG,MAAA,CAAO,IAAA,EAAM,KAAK,OAAA,EAAQ;AAC5D,MAAA,MAAM,SAAA,CAAU,MAAA,CAAO,GAAA,EAAK,QAAQ,CAAA;AACpC,MAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AAEd,MAAA,IAAI,MAAA,IAAU,SAAA,CAAU,IAAA,GAAO,CAAA,EAAG;AAChC,QAAA,MAAM,cAAA,GAAyC;AAAA,UAC7C,GAAI,MAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB;AAAC,SACtC;AACA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,cAAA,CAAe,WAAW,CAAA,GAAI,MAAA;AAAA,QAChC;AACA,QAAA,KAAA,MAAW,CAAC,UAAA,EAAY,GAAG,CAAA,IAAK,SAAA,EAAW;AACzC,UAAA,cAAA,CAAe,UAAU,CAAA,GAAI,GAAA;AAAA,QAC/B;AACA,QAAA,MAAM,WAAA,GAAuB;AAAA,UAC3B,GAAG,MAAA,CAAO,OAAA;AAAA,UACV,YAAA,EAAc;AAAA,SAChB;AACA,QAAA,MAAMU,YAAAA,CAAa,MAAA,CAAO,GAAA,EAAK,WAAA,EAAa,UAAU,CAAA;AACtD,QAAA,MAAA,CAAO,OAAA,GAAU,WAAA;AAAA,MACnB;AACA,MAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,IAAI,CAAA;AAAA,CAAY,CAAA;AAC1C;AAEA,SAAS,QAAA,CAAS,KAAA,EAAe,GAAA,GAAM,EAAA,EAAY;AACjD,EAAA,IAAI,KAAA,CAAM,UAAU,GAAA,EAAK;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,GAAI,QAAA;AACnC;AAGA,SAAS,iBAAA,CAAkB,SAAkB,UAAA,EAA4B;AACvE,EAAA,OAAO,OAAA,CAAQ,YAAA,GAAe,UAAU,CAAA,GAAI,KAAA,GAAQ,SAAA;AACtD;AAGA,SAAS,YAAA,CAAa,SAAkB,UAAA,EAA4B;AAClE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,GAAe,UAAU,CAAA;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAC7C;ACpQA,IAAM,oBAAA,GAAuB,GAAA;AAW7B,SAAS,cAAc,GAAA,EAAoD;AACzE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,KAAa,MAAA,IAAU,OAAO,QAAA,KAAa,QAAA;AACnE,IAAA,MAAM,WAAA,GAAc,WAAW,GAAA,GAAM,EAAA;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,MAAA,GAAS,IAAI,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA,GAAI,WAAA;AAClE,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,QAAA,EAAU,IAAA,EAAK;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,QAAA,CACb,IAAA,EACA,IAAA,EACA,SAAA,EACiD;AACjD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACZ,QAAAA,KAAY;AAC9B,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,MAAA,EAAO;AAC1B,IAAA,IAAI,OAAA,GAAU,KAAA;AAEd,IAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAAyD;AACvE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA;AAAA,MACF;AACA,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAAA,SAAQ,MAAM,CAAA;AAAA,IAChB,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,MAAA,CAAO,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA;AAEtE,IAAA,MAAA,CAAO,IAAA,CAAK,WAAW,MAAM;AAC3B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,MAAA,CAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,SAAS,CAAA;AAAA,IACzC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC5B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,MAAA,CAAO,EAAE,KAAA,EAAO,GAAA,CAAI,OAAA,EAAS,CAAA;AAAA,IAC/B,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;AAEA,eAAsB,WAAA,CACpB,MAAA,EACA,MAAA,EACA,SAAA,GAAoB,oBAAA,EACS;AAC7B,EAAA,MAAM,UAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,CAAO,MAAM,EAAE,KAAA,EAAO,uBAAA,EAAyB,GAAA,IAAO,uBAAuB,CAAA;AAC7E,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,EAAC,EAAG,KAAA,EAAO,aAAA,EAAe,CAAA;AACtE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,MAAA;AACvB,IAAA,IAAI,MAAgB,EAAC;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,MAAM,EAAE,GAAA,EAAK,MAAM,CAAA;AACjD,MAAA,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,OAAO,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,MAAA,CAAO,KAAA;AAAA,QACL,EAAE,KAAA,EAAO,qBAAA,EAAuB,GAAA,EAAK,IAAA,EAAM,OAAO,OAAA,EAAQ;AAAA,QAC1D;AAAA,OACF;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,EAAC,EAAG,KAAA,EAAO,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAA,EAAI,CAAA;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAM,MAAM,SAAS,CAAA;AAClD,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,MAAA,CAAO,KAAA;AAAA,QACL,EAAE,OAAO,mBAAA,EAAqB,GAAA,EAAK,MAAM,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW,KAAA,CAAM,MAAA,EAAO;AAAA,QAC5E;AAAA,OACF;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,EAAM,MAAM,GAAA,EAAK,SAAA,EAAW,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,IAChE,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAA;AAAA,QACL,EAAE,OAAO,qBAAA,EAAuB,GAAA,EAAK,MAAM,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,QACzE;AAAA,OACF;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,CAAA,KAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,CAAA;AAAA,IACrE;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AC3GO,IAAM,mBAAA,GAAsB,EAAA;AAC5B,IAAM,oBAAA,GAAuB,CAAA;AAC7B,IAAM,sBAAA,GAAyB,EAAA;AAC/B,IAAM,0BAAA,GAA6B,IAAI,EAAA,GAAK,GAAA;AAC5C,IAAM,yBAAA,GAA4B,GAAA;AAClC,IAAM,8BAAA,GAAiC,KAAK,EAAA,GAAK,GAAA;AACjD,IAAM,6BAAA,GAAgC,IAAA;AAUtC,IAAM,gCAAA,GAAmC,CAAA;AAIzC,SAAS,UAAU,QAAA,EAA0B;AAClD,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,cAAA;AAC3B,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,+BAAA;AACT;AAqDA,eAAsB,gBAAA,CACpB,KACA,KAAA,EACiB;AACjB,EAAA,MAAM,OAAO,kBAAA,CAAmB,IAAA;AAChC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CACpB,uBAAA;AAAA,MACC,KAAA;AAAA,MACA,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAA,EAAE;AAAA,MACtB,EAAE,QAAA,EAAU,YAAA,EAAc,UAAA,EAAY,WAAA;AAAY,MAEnD,IAAA,EAAK;AACR,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,KAAA,MAAW,KAAA,IAAS,SAAS,KAAA,EAAO;AAClC,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA;AAG7B,MAAA,MAAM,GAAA,GAAM,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,MAAA;AAC/C,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,KAAA,IAAS,OAAO,GAAG,CAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AC/FA,IAAM,iBAAA,GAA0D;AAAA,EAC9D,IAAA,EAAM,CAAC,UAAA,EAAY,QAAQ,CAAA;AAAA,EAC3B,QAAA,EAAU,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,EAChC,WAAW,EAAC;AAAA,EACZ,QAAQ;AACV,CAAA;AAEO,IAAM,YAAN,MAAgB;AAAA,EACb,OAAA,uBAAc,GAAA,EAAyB;AAAA,EACvC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOR,YAAY,UAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEQ,IAAA,GAAa;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMa,YAAAA,CAAa,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC9C,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF,SAAS,CAAA,EAAQ;AAEf,MAAA,IAAI,CAAA,EAAG,SAAS,QAAA,EAAU;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,CAAA,EAAG,OAAA,IAAW,eAAe,CAAA,CAAE,CAAA;AACxE,QAAA,IAAI;AACF,UAAA,UAAA,CAAW,KAAK,IAAA,EAAM,IAAA,CAAK,OAAO,WAAA,GAAc,IAAA,CAAK,KAAK,CAAA;AAAA,QAC5D,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC7B,IAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAClC,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,GAAO,MAAA;AACxB,IAAA,aAAA,CAAc,KAAK,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/C,IAAA,UAAA,CAAW,GAAA,EAAK,KAAK,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,WAAW,KAAA,EAA0D;AACnE,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG;AAClC,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,CAAA;AAC3E,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA,EAEA,aAAA,CAAc,KAAA,EAAe,SAAA,EAAoB,cAAA,EAA+B;AAC9E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,QAAA,KAAA,CAAM,UAAA,GAAa,SAAA;AAAA,MACrB;AACA,MAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,QAAA,KAAA,CAAM,eAAA,GAAkB,cAAA;AAAA,MAC1B;AACA,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAAA;AAAA,EAGQ,UAAA,CAAW,OAAe,EAAA,EAA2C;AAC3E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,EAAG;AACjD,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,KAAA,CAAM,MAAA,GAAS,EAAA;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,OAAe,MAAA,EAAsB;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,UAAU,CAAA;AAC/C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,cAAc,KAAA,EAAqB;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,WAAW,CAAA;AAChD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,WAAW,KAAA,EAAqB;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAA;AAC7C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,KAAA,EAAqB;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,WAAA,EAAA;AACN,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,UAAU,KAAA,EAAyC;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG,MAAA;AAAA,EAClC;AAAA,EAEA,WAAA,GAA6B;AAC3B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAA,IAAU,CAAA,CAAE,WAAW,UAAU,CAAA;AAAA,EAChG;AAAA;AAAA,EAGA,EAAA,CAAG,UAAA,GAAa,CAAA,GAAI,EAAA,GAAK,KAAK,EAAA,EAAU;AACtC,IAAA,IAAA,CAAK,eAAA,CAAgB,aAAa,GAAI,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgB,WAAA,EAA6B;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,GAAI,CAAA;AAC5E,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,KAAK,OAAA,EAAS;AACtC,MAAA,IAAA,CACG,KAAA,CAAM,WAAW,WAAA,IAAe,KAAA,CAAM,WAAW,QAAA,KAClD,KAAA,CAAM,aAAa,MAAA,EACnB;AACA,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,QAAA,OAAA,IAAW,CAAA;AAAA,MACb;AAAA,IACF;AACA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF,CAAA;;;AC1IA,QAAA,EAAA;;;AChCO,IAAMR,mBAAAA,GAAqB,IAAA;AAsB3B,SAAS,eAAA,CACd,OACA,YAAA,EACuB;AACvB,EAAA,MAAM,WAAW,KAAA,CAAM,WAAA;AACvB,EAAA,MAAM,eAAA,GAAkB,QAAA,EAAU,QAAA,KAAa,MAAA,IAAa,SAAS,KAAA,KAAU,MAAA;AAE/E,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,QAAA,GAAW,QAAA,CAAS,QAAA;AACpB,IAAA,KAAA,GAAQ,QAAA,CAAS,KAAA;AAAA,EACnB,WAAW,YAAA,EAAc;AACvB,IAAA,QAAA,GAAW,YAAA,CAAa,QAAA;AACxB,IAAA,KAAA,GAAQ,YAAA,CAAa,KAAA;AAAA,EACvB;AAEA,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,EAAO;AACvB,IAAA,OAAO;AAAA,MACL,OACE,CAAA,OAAA,EAAU,KAAA,CAAM,SAAS,CAAA,KAAA,EAAQ,MAAM,WAAW,CAAA,gJAAA;AAAA,KAGtD;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,QAAA,EAAU,SAAA,IAAa,YAAA,EAAc,UAAA,IAAcA,mBAAAA;AAErE,EAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,SAAA,EAAU;AACtC;;;AC9CO,SAAS,YAAY,MAAA,EAAkC;AAC5D,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,WAAW,MAAA,CAAO;AAAA,GACnB,CAAA;AACH;AAQO,SAAS,wBAAA,CACd,UACA,YAAA,EAC8B;AAC9B,EAAA,MAAM,eAAA,GAAkB,QAAA,EAAU,QAAA,KAAa,MAAA,IAAa,SAAS,KAAA,KAAU,MAAA;AAC/E,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,QAAA,GAAW,QAAA,CAAS,QAAA;AACpB,IAAA,KAAA,GAAQ,QAAA,CAAS,KAAA;AAAA,EACnB,WAAW,YAAA,EAAc;AACvB,IAAA,QAAA,GAAW,YAAA,CAAa,QAAA;AACxB,IAAA,KAAA,GAAQ,YAAA,CAAa,KAAA;AAAA,EACvB;AACA,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,EAAO;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAA,GAAY,QAAA,EAAU,SAAA,IAAa,YAAA,EAAc,UAAA,IAAcA,mBAAAA;AACrE,EAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,SAAA,EAAU;AACtC;;;AC1CA,aAAA,EAAA;AAiBO,SAAS,sBAAsB,KAAA,EAA0D;AAC9F,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,eAAA,EAAgB,GAAI,KAAA;AAE/C,EAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAMS,aAAY,eAAA,CAAgB,MAAA,GAAS,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,QAAA;AAC5E,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,UAAA,EAAa,QAAQ,CAAA,2CAAA,EAA8CA,UAAS,CAAA,EAAA;AAAA,KACrF;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,YAAA,GAAe,QAAQ,CAAA;AACxD,EAAA,IAAI,OAAO,gBAAA,KAAqB,QAAA,IAAY,gBAAA,CAAiB,SAAS,CAAA,EAAG;AACvE,IAAA,OAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,MAAA,EAAQ,sBAAA,EAAuB;AAAA,EACpE;AAEA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA;AAC9C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAM;AAAA,EAC3C;AAEA,EAAA,MAAM,YAAY,eAAA,CAAgB,MAAA,GAAS,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,QAAA;AAC5E,EAAA,OAAO;AAAA,IACL,KAAA,EACE,aAAa,QAAQ,CAAA,0CAAA,EAA6C,SAAS,CAAA,4BAAA,EAC/C,QAAQ,CAAA,iDAAA,EAAoD,UAAA,CAAW,MAAM,CAAA,CAAA;AAAA,GAC7G;AACF;ACpBA,SAAS,aAAa,OAAA,EAAsC;AAC1D,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,EACjB;AACA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,SAAA;AAC7B,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAA,CAAa,OAAA,GAA+B,EAAC,EAAc;AACzE,EAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,EAAA,MAAM,WAAA,GAAkC;AAAA,IACtC,IAAA,EAAM,YAAA;AAAA,IACN,KAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,oBAAA;AAAA,MACP,QAAQ,UAAA;AAAW;AACrB,GACF;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa,OAAA,CAAQ,WAAW,CAAA;AAAA,EAChD,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,KAAQ,IAAA,EAAM;AAC/B,IAAA,MAAA,GAAS,IAAA,CAAK;AAAA,MACZ,GAAG,WAAA;AAAA,MACH,SAAA,EAAW;AAAA,QACT,MAAA,EAAQ,aAAA;AAAA,QACR,SAAS,EAAE,WAAA,EAAa,GAAG,QAAA,EAAU,IAAA,EAAM,eAAe,UAAA;AAAW;AACvE,KACD,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EAChD;AAEA,EAAA,SAAS,cAAc,IAAA,EAAoB;AACzC,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAA,EAAK,IAAI;AAAA,CAAI,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;ACpDA,IAAM,OAAA,GAAU,IAAI,qBAAA,EAAsB;AAC1C,IAAM,qBAAA,GAAwB,KAAK,EAAA,GAAK,GAAA;AACxC,IAAM,mBAAA,GAAsB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAChD,IAAM,oBAAA,GAAuB,IAAI,EAAA,GAAK,GAAA;AAKtC,IAAM,sBAAsB,EAAA,GAAK,GAAA;AAkCjC,SAAS,eAAA,CAAgB,MAAgB,MAAA,EAA+B;AACtE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,EAAA,OAAO,OAAO,aAAA,IAAiB,CAAA;AACjC;AAGA,SAAS,eAAA,CAAgB,MAAgB,MAAA,EAA8B;AACrE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,EAAA,OAAO,OAAO,KAAA,IAAS,UAAA;AACzB;AAUA,IAAMN,qBAAAA,GAAuB,CAAC,gBAAA,EAAkB,SAAA,EAAW,gBAAgB,oBAAoB,CAAA;AAE/F,SAASP,sBAAqB,IAAA,EAAuB;AACnD,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,OAAOO,sBAAqB,IAAA,CAAK,CAAC,WAAW,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AACrE;AAaA,SAAS,kBACP,KAAA,EAC4C;AAC5C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,cAAA,EAAgB;AAChD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAM,cAAA,CAAe,QAAA;AAAA,MAC/B,KAAA,EAAO,MAAM,cAAA,CAAe;AAAA,KAC9B;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,KAAA,IAAS,KAAA,CAAM,aAAa,QAAA,IAAY,KAAA,CAAM,aAAa,KAAA,EAAO;AACnF,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAM,WAAA,CAAY,QAAA;AAAA,MAC5B,KAAA,EAAO,MAAM,WAAA,CAAY;AAAA,KAC3B;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,oBAAA,GAAuB,KAAK,EAAA,GAAK,GAAA;AACvC,IAAM,qBAAA,GAAwB,EAAA;AAC9B,IAAM,0BAAA,GAA6B,GAAA;AACnC,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,kBAAA,GAAqB,YAAA;AAEpB,IAAM,eAAN,MAAmB;AAAA,EA8BxB,WAAA,CACU,WACA,MAAA,EACA,QAAA,EACA,QACA,MAAA,EACA,SAAA,GAA8B,EAAC,EAC/B,aAAA,EACR;AAPQ,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAER,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAA;AAC5C,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,iBAAA,GAAoB,EAAA;AAAA,EACxE;AAAA,EAxCQ,KAAA;AAAA,EACA,QAAA,uBAAe,GAAA,EAAY;AAAA,EAC3B,OAAA,GAAU,CAAA;AAAA,EACV,YAAA;AAAA,EACA,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAAA,EACtC,mBAAA,uBAA0B,GAAA,EAAqB;AAAA,EAC/C,gBAAA,GAA0D,IAAA;AAAA,EAC1D,UAAA,GAAoD,IAAA;AAAA,EACpD,OAAA,GAAU,KAAA;AAAA;AAAA,EAEV,kBAAwC,0BAAA,CAA2B;AAAA,IACzE,QAAA,EAAU,oBAAA;AAAA,IACV,YAAA,EAAc,qBAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACV,CAAA;AAAA;AAAA,EAEO,gBAAsC,0BAAA,CAA2B;AAAA,IACvE,QAAA,EAAU,oBAAA;AAAA,IACV,YAAA,EAAc,0BAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACV,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,kBAAqC,uBAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyC7D,0BAAA,CACN,KAAA,EACA,GAAA,EACA,GAAA,EACA,KAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,CAAA;AAEjC,IAAA,IAAI,eAAe,2BAAA,EAA6B;AAC9C,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAa,QAAA;AACpC,MAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAa,KAAA;AACjC,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,EAAO;AAKvB,QAAA,GAAA;AAAA,UACE,GAAG,GAAG,CAAA,sBAAA,EAAyB,IAAI,QAAQ,CAAA,gCAAA,EAAmC,MAAM,IAAI,CAAA,uEAAA;AAAA,SAC1F;AACA,QAAA;AAAA,MACF;AACA,MAAA,GAAA;AAAA,QACE,CAAA,EAAG,GAAG,CAAA,yCAAA,EAA4C,GAAA,CAAI,QAAQ,CAAA,WAAA,EAAc,QAAQ,IAAI,KAAK,CAAA,wFAAA;AAAA,OAC/F;AACA,MAAA,IAAA,CAAK,cAAc,oBAAA,CAAqB,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,IAAI,OAAO,CAAA;AAC/E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,cAAA,EAAgB;AAChD,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,MAAA,MAAM,KAAA,GAAQ,gCAAA,CAAiC,IAAA,CAAK,OAAO,CAAA;AAC3D,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC9B,MAAA,MAAM,QAAQ,KAAA,CAAM,CAAC,KAAK,EAAA,EAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAC1C,MAAA,MAAM,kBAAkB,MAAA,KAAW,GAAA;AACnC,MAAA,MAAM,YAAA,GAAe,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA;AAClD,MAAA,MAAM,YAAA,GAAe,MAAA,KAAW,GAAA,IAAOP,qBAAAA,CAAqB,IAAI,CAAA;AAChE,MAAA,MAAM,YAAA,GAAe,MAAA,KAAW,GAAA,IAAOA,qBAAAA,CAAqB,IAAI,CAAA;AAChE,MAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,gBAAgB,CAAC,YAAA,IAAgB,CAAC,YAAA,EAAc;AACvE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAgC,eAAe,SAAA,GAAY,SAAA;AACjE,MAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,QAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,MAAM,cAAA,CAAe,KAAA;AACnC,MAAA,GAAA;AAAA,QACE,CAAA,EAAG,GAAG,CAAA,4BAAA,EAA+B,MAAM,KAAK,MAAM,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,wFAAA;AAAA,OACvF;AACA,MAAA,IAAA,CAAK,aAAA,CAAc,oBAAA,CAAqB,QAAA,EAAU,KAAA,EAAO,QAAQ,IAAI,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,mBAAA,GAAoD;AAGhE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,QAAA,EAAU;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,SAAA,EAAY,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,0GAAA;AAAA,OAEjC;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,qBAAqB,QAAQ,CAAA;AAC/C,IAAA,MAAM,MAAM,eAAA,CAAgB,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,GAAA,EAAK,WAAW,EAAE,YAAA,EAAc,MAAM,CAAA;AAC7E,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,EAC5D;AAAA,EAEA,MAAM,GAAA,GAAqB;AACzB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,KAAA,IAAS,OAAA,CAAQ,GAAA;AAG5C,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAgB,mBAAmB,CAAA;AAG/C,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAG9B,IAAA,IAAA,CAAK,gBAAA,GAAmB,WAAA;AAAA,MACtB,MAAM,IAAA,CAAK,kBAAA,EAAmB,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,CAAI,CAAA,gBAAA,EAAmB,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,MACxE,IAAA,CAAK,OAAO,oBAAA,GAAuB;AAAA,KACrC;AAGA,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AAClC,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,MAAA,CAAO,gBAAgB,mBAAmB,CAAA;AAAA,MACjD,SAAS,CAAA,EAAQ;AACf,QAAA,GAAA,CAAI,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,MAC9B;AACA,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,SAAA,EAAU,EAAG;AAC/B,QAAA,GAAA,CAAI,uEAAuE,CAAA;AAAA,MAC7E;AAAA,IACF,GAAG,qBAAqB,CAAA;AAGxB,IAAA,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,CAAC,GAAA,KAAQ;AAC5B,MAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS;AACvC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,EAAG;AAChC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AACpC,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,YAAA,EAAc;AACrC,QAAA,IAAA,CAAK,SAAA,CACF,YAAA,CAAa,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,oCAAA,EAAsC,CAAA,CAClF,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AACjB,QAAA;AAAA,MACF;AAKA,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,GAAA,CAAI,UAAU,EAAE,OAAA,EAAS;AACtD,QAAA,IAAA,CAAK,SAAA,CACF,YAAA,CAAa,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,+BAAA,EAAiC,CAAA,CAC7E,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AACjB,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,kBAAkB,EAAE,OAAA,EAAS;AACxD,QAAA,IAAA,CAAK,SAAA,CACF,YAAA,CAAa,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,8BAAA,EAAgC,CAAA,CAC5E,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AACjB,QAAA;AAAA,MACF;AAOA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAC1C,MAAA,MAAM,SAAA,GAAY,OAAA,EAAS,IAAA,KAAS,KAAA,IAAS,QAAQ,aAAA,KAAkB,CAAA;AACvE,MAAA,IAAI,kBAAA;AACJ,MAAA,IAAI,WAAA;AACJ,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,cAAc,IAAA,CAAK,mBAAmB,EAAE,OAAA,EAAS;AACzE,UAAA,IAAA,CAAK,SAAA,CACF,YAAA,CAAa,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,+BAAA,EAAiC,CAAA,CAC7E,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AACjB,UAAA;AAAA,QACF;AACA,QAAA,kBAAA,GAAqB,KAAK,eAAA,CAAgB,qBAAA;AAAA,UACxC,OAAA,CAAQ,IAAA;AAAA,UACR,OAAA,CAAQ;AAAA,SACV;AACA,QAAA,WAAA,GAAc,kBAAA,CAAmB,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,IAAI,CAAA;AAC7D,QAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,WAAW,EAAE,OAAA,EAAS;AACjD,UAAA,IAAA,CAAK,SAAA,CACF,YAAA,CAAa,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,+BAAA,EAAiC,CAAA,CAC7E,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AACjB,UAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AACzC,MAAA,IAAA,CAAK,aAAA,CAAc,MAAM,kBAAkB,CAAA;AAC3C,MAAA,IAAI,SAAA,IAAa,sBAAsB,WAAA,EAAa;AAClD,QAAA,IAAA,CAAK,eAAA,CAAgB,aAAA,CAAc,KAAA,CAAM,mBAAmB,CAAA;AAC5D,QAAA,kBAAA,CAAmB,MAAM,WAAW,CAAA;AAAA,MACtC;AAEA,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,GAAG,CAAA;AAClC,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAC3B,MAAA,IAAA,CAAK,OAAA,EAAA;AAEL,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA,CAClC,KAAA,CAAM,CAAC,CAAA,KAAW;AACjB,QAAA,IAAA,CAAK,SAAA,CAAU,UAAA,GAAa,GAAA,CAAI,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,MAClD,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,OAAA,EAAA;AAAA,MACP,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,8CAA8C,CAAA;AAKlD,IAAA,MAAM,IAAI,OAAA,CAAc,CAACD,QAAAA,KAAY;AACnC,MAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAMA,UAAQ,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAErF,MAAA,IAAI,YAAA,GAAe,KAAA;AACnB,MAAA,MAAM,WAAW,MAAY;AAC3B,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA;AAAA,QACF;AACA,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,GAAA,CAAI,kBAAkB,CAAA;AACtB,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,UAAA,CAAW,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,GAAI,EAAE,KAAA,EAAM;AAAA,MAChD,CAAA;AACA,MAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,QAAQ,CAAA;AAC7B,MAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,QAAQ,CAAA;AAAA,IAChC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,eAAA,CAAgB,cAAc,KAAA,EAAM;AACzC,IAAA,IAAA,CAAK,gBAAgB,gBAAA,EAAiB;AAAA,EACxC;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,UAAU,MAAA,IAAS;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,MAAA,CAAC,KAAK,SAAA,CAAU,KAAA,IAAS,QAAQ,GAAA,EAAK,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,KAAA,MAAW,UAAA,IAAc,KAAK,mBAAA,EAAqB;AACjD,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB;AACA,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,aAAA,CAAc,KAAK,gBAAgB,CAAA;AACnC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AACA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,UAAU,IAAA,EAAK;AAAA,EACtB;AAAA;AAAA,EAGA,MAAc,WAAW,GAAA,EAAiC;AACxD,IAAA,IAAI,SAAA;AACJ,IAAA,MAAM,QAAA,GAAW,IAAI,eAAA,EAAgB;AACrC,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,QAAQ,CAAA;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,IAAA,CAAK;AAAA,QACjB,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK,QAAA,CAAS,MAAM,CAAA;AAAA,QACpC,IAAI,OAAA,CAAe,CAAC,CAAA,EAAG,MAAA,KAAW;AAChC,UAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,YAAA,QAAA,CAAS,KAAA,EAAM;AACf,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAAA,UAC5C,GAAG,oBAAoB,CAAA;AAAA,QACzB,CAAC;AAAA,OACF,CAAA;AAAA,IACH,SAAS,CAAA,EAAQ;AACf,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,KAAA,IAAS,OAAA,CAAQ,GAAA;AAC5C,MAAA,GAAA,CAAI,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,SAAA,EAAY,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAGpD,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,IAAI,KAAK,CAAA;AACrD,MAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,QAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAAA,MAClC;AACA,MAAA,IAAA,CAAK,SAAA,CAAU,UAAA,GAAa,GAAA,CAAI,KAAA,EAAO,EAAE,OAAO,CAAA;AAGhD,MAAA,MAAM,WAAA,GAAc,EAAE,OAAA,EAAS,QAAA,CAAS,KAAK,CAAA,GACzC,2BAAA,GACC,EAAE,OAAA,IAAW,eAAA;AAClB,MAAA,MAAM,IAAA,CAAK,SAAA,CACR,YAAA,CAAa,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACnB,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,QAAQ,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,UAAA,CAAW,GAAA,EAAkB,MAAA,EAAqC;AAC9E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,KAAA,IAAS,OAAA,CAAQ,GAAA;AAG5C,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,MAAA,CAAO,gBAAA,EAAkB;AAC9C,MAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,GAAA,CAAI,MAAM,MAAM,CAAA,YAAA,EAAe,MAAA,CAAO,gBAAgB,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9F;AAiBA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,kBAAkB,OAAO,CAAA;AAC5C,IAAA,IAAI,IAAA,CAAK,iBAAiB,UAAA,EAAY;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,aAAA,CAAc,WAAA,CAAY,UAAA,CAAW,QAAA,EAAU,WAAW,KAAK,CAAA;AAAA,MAC5E,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC9D,QAAA,GAAA,CAAI,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,+BAAA,EAAkC,MAAM,CAAA,CAAE,CAAA;AACvE,QAAA,MAAM,IAAA,CAAK,SAAA,CACR,YAAA,CAAa,GAAA,EAAK;AAAA,UACjB,IAAA,EAAM,OAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AACjB,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAM,KAAK,MAAM,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAM,KAAK,MAAM,CAAA;AACtD,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,cAAA;AAGJ,IAAA,IAAA,CAAK,OAAO,UAAA,CAAW;AAAA,MACrB,QAAQ,GAAA,CAAI,KAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAY,GAAA,CAAI,SAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,aAAa,GAAA,CAAI,UAAA;AAAA,MACjB,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,UAAA,EAAY,MAAA;AAAA,MACZ,cAAA,EAAgB,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAAA,MAC3C,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,KACzC,CAAA;AAED,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,eAAe,GAAA,EAAK,QAAA,EAAU,UAAU,MAAM,CAAA;AACxE,MAAA,SAAA,GAAY,MAAA,CAAO,SAAA;AACnB,MAAA,cAAA,GAAiB,MAAA,CAAO,cAAA;AAExB,MAAA,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,KAAA,EAAO,WAAW,cAAc,CAAA;AAC9D,MAAA,GAAA;AAAA,QACE,IAAI,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,qBAAA,EAAwB,iBAAA;AAAA,UAC/C,QAAA;AAAA,UACA,OAAO,SAAS;AAAA,SACjB,CAAA;AAAA,OACH;AACA,MAAA,IAAA,CAAK,SAAA,CAAU,iBAAA,GAAoB,GAAA,CAAI,KAAA,EAAO,SAAS,CAAA;AAAA,IACzD;AAGA,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,GAAA,EAAK,EAAE,MAAM,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAG7E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,6BAAA,GAAgC,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,GAAA,CAAI,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,mBAAA,EAAsB,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAS/D,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA;AAAA,QACnB;AAAA,UACE,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,OAAO,GAAA,CAAI;AAAA,SACb;AAAA,QACA,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,MAAA;AAAO,OAC7B;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,IAAI,KAAK,CAAA;AAC1D,MAAA,MAAM,GAAA;AAAA,IACR;AAMA,IAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,OAAO,IAAI,CAAA;AAC/C,IAAA,GAAA,CAAI,IAAI,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,oCAAA,CAAsC,CAAA;AAGnE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,cAAc,GAAA,EAAK,MAAA,CAAO,MAAM,SAAS,CAAA;AAC9E,IAAA,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAEnC,IAAA,GAAA,CAAI,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,aAAA,EAAgB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAK,CAAA;AACtE,IAAA,IAAA,CAAK,SAAA,CAAU,cAAA,GAAiB,GAAA,CAAI,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAA,CACZ,GAAA,EACA,QAAA,EACA,UACA,MAAA,EACwD;AACxD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,KAAA,IAAS,OAAA,CAAQ,GAAA;AAE5C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe;AAC9B,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAGtD,IAAA,MAAM,UAAU,OAAA,CAAQ,oBAAA;AAAA,MACtB,KAAK,MAAA,CAAO,aAAA;AAAA,MACZ,QAAA;AAAA,MACA,cAAA;AAAA,MACA,EAAE,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAoB,OAAO,QAAA;AAAS,KAChE;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAE1C,IAAA,MAAM,GAAA,GAAMe,oBAAAA,CAAqB,QAAA,EAAU,cAAA,CAAe,MAAM,CAAA;AAChE,IAAA,MAAM,YAAY,QAAA,GAAW,GAAA;AAE7B,IAAA,GAAA;AAAA,MACE,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAC,uBAAuB,iBAAA,CAAkB,QAAA,EAAU,OAAO,QAAQ,CAAC,CAAC,CAAA,OAAA,EAClF,iBAAA,CAAkB,UAAU,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA,CAAA;AAAA,KACrD;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,KAAA,EAAO,QAAW,WAAW,CAAA;AAG3D,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,GAAA,EAAK;AAAA,MACrC,IAAA,EAAM,kBAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,cAAA,EAAgB,WAAA;AAAA,MAChB,KAAA,EAAO;AAAA,KACR,CAAA;AAeD,IAAA,MAAM,MAAM,eAAA,CAAgB,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AAC1D,IAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,IAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY,KAAA,EAAM;AAC7C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,WAAA,CAAY,KAAA,EAAM;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,YAAA,EAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,MAC/D;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,kBAAA,GAAqB,GAAA;AACpD,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,mBAAmB,CAAA;AAEjE,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,IAAI,OAAA,CAA+B,CAACf,UAAS,MAAA,KAAW;AACrE,QAAA,IAAI,OAAA,GAAU,KAAA;AACd,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,IAAI,UAAA,GAAoC,EAAE,QAAA,EAAU,KAAA,EAAM;AAE1D,QAAA,MAAM,GAAA,GAAM,CAAC,QAAA,KAAoC;AAC/C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA;AAAA,UACF;AACA,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,UAAAA,SAAQ,QAAQ,CAAA;AAAA,QAClB,CAAA;AAEA,QAAA,MAAM,IAAA,GAAO,CAAC,QAAA,EAAiC,MAAA,KAAmB;AAChE,UAAA,IAAI,OAAA,EAAS;AACX,YAAA;AAAA,UACF;AACA,UAAA,UAAA,GAAa,QAAA;AACb,UAAA,OAAA,IAAW,CAAA;AACX,UAAA,GAAA,CAAI,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,SAAA,EAAY,MAAM,CAAA,CAAE,CAAA;AACjD,UAAA,IAAI,YAAY,CAAA,EAAG;AACjB,YAAA,OAAA,GAAU,IAAA;AACV,YAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,YAAAA,SAAQ,UAAU,CAAA;AAAA,UACpB;AAAA,QACF,CAAA;AAGA,QAAA,IAAA,CAAK,SAAA,CACF,uBAAA,CAAwB,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,UAAA,EAAY,WAAA,CAAY,MAAA,EAAQ,gBAAgB,CAAA,CACvF,IAAA,CAAK,OAAO,GAAA,KAAQ;AACnB,UAAA,IAAI,OAAA,EAAS;AACX,YAAA;AAAA,UACF;AACA,UAAA,IAAI,CAAC,GAAA,EAAK;AACR,YAAA,IAAA,CAAK,EAAE,QAAA,EAAU,KAAA,EAAM,EAAG,yCAAyC,CAAA;AACnE,YAAA;AAAA,UACF;AACA,UAAA,GAAA,CAAI,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,uBAAA,EAA0B,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,CAAK,CAAA;AAC3E,UAAA,IAAI;AACF,YAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,aAAA,CAAc,GAAA,EAAK,SAAS,cAAA,EAAgB;AAAA,cACzE,WAAA,EAAa;AAAA,aACd,CAAA;AACD,YAAA,IAAI,SAAS,QAAA,EAAU;AACrB,cAAA,GAAA,CAAI,QAAQ,CAAA;AAAA,YACd,CAAA,MAAO;AACL,cAAA,MAAM,MAAA,GAAU,SAAgC,KAAA,IAAS,SAAA;AACzD,cAAA,IAAA,CAAK,QAAA,EAAU,CAAA,wBAAA,EAA2B,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,YACrD;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,IAAA;AAAA,cACE,EAAE,UAAU,KAAA,EAAM;AAAA,cAClB,mBAAmB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,aACrE;AAAA,UACF;AAAA,QACF,CAAC,CAAA,CACA,KAAA;AAAA,UAAM,CAAC,GAAA,KACN,IAAA;AAAA,YACE,EAAE,UAAU,KAAA,EAAM;AAAA,YAClB,mBAAmB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACrE,SACF;AAGF,QAAA,OAAA,CACG,cAAc,GAAA,EAAK,OAAA,EAAS,cAAc,CAAA,CAC1C,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,UAAA,IAAI,SAAS,QAAA,EAAU;AACrB,YAAA,GAAA,CAAI,QAAQ,CAAA;AAAA,UACd,CAAA,MAAO;AACL,YAAA,MAAM,MAAA,GAAU,SAAgC,KAAA,IAAS,SAAA;AACzD,YAAA,IAAA,CAAK,QAAA,EAAU,CAAA,wBAAA,EAA2B,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,UACrD;AAAA,QACF,CAAC,CAAA,CACA,KAAA;AAAA,UAAM,CAAC,GAAA,KACN,IAAA;AAAA,YACE,EAAE,UAAU,KAAA,EAAM;AAAA,YAClB,mBAAmB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACrE,SACF;AAGF,QAAA,MAAM,QAAA,GAAW,WAAW,MAAM;AAChC,UAAA,IAAI,OAAA,EAAS;AACX,YAAA;AAAA,UACF;AACA,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,GAAA,CAAI,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,mBAAA,EAAsB,UAAU,CAAA,OAAA,CAAS,CAAA;AACtE,UAAAA,SAAQ,UAAU,CAAA;AAAA,QACpB,GAAG,UAAU,CAAA;AAGb,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,UAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA;AACjD,UAAA,GAAA,CAAI,IAAA,GAAO,YAAA;AACX,UAAA,MAAA,CAAO,GAAG,CAAA;AACV,UAAA;AAAA,QACF;AACA,QAAA,MAAA,EAAQ,gBAAA;AAAA,UACN,OAAA;AAAA,UACA,MAAM;AACJ,YAAA,IAAI,OAAA,EAAS;AACX,cAAA;AAAA,YACF;AACA,YAAA,OAAA,GAAU,IAAA;AACV,YAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,YAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA;AACjD,YAAA,GAAA,CAAI,IAAA,GAAO,YAAA;AACX,YAAA,MAAA,CAAO,GAAG,CAAA;AAAA,UACZ,CAAA;AAAA,UACA,EAAE,MAAM,IAAA;AAAK,SACf;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,KAAA,EAAM;AAClB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAAA,MAClD;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,OAAO,EAAE,SAAA,EAAW,cAAA,EAAgB,WAAA,EAAY;AAAA,IAClD;AAGA,IAAA,GAAA;AAAA,MACE,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,0FAAA,EAC2B,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,UAAA;AAAA,KAC/E;AACA,IAAA,MAAM,IAAA,CAAK,SAAA,CACR,YAAA,CAAa,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,iBAAA,EAAmB,CAAA,CAC/D,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACjB,IAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,EACnC;AAAA,EAEA,MAAc,kBAAA,GAAoC;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AACpF,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,KAAA,IAAS,OAAA,CAAQ,GAAA;AAC5C,IAAA,GAAA,CAAI,CAAA,WAAA,EAAc,OAAA,CAAQ,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAElD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,KAAA,CAAM,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAoB;AACvD,QAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AAEnC,QAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AAChD,YAAA,MAAM,KAAK,SAAA,CACR,YAAA;AAAA,cACC;AAAA,gBACE,OAAO,KAAA,CAAM,MAAA;AAAA,gBACb,OAAO,KAAA,CAAM,KAAA;AAAA,gBACb,WAAW,KAAA,CAAM,UAAA;AAAA,gBACjB,MAAM,KAAA,CAAM,IAAA;AAAA,gBACZ,YAAY,KAAA,CAAM,WAAA;AAAA,gBAClB,SAAA,EAAW,KAAA;AAAA,gBACX;AAAA,eACF;AAAA,cACA,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,8CAAA;AAA+C,aAC3E,CACC,MAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UACnB,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,MAAM,cAAA,EAAgB;AACzB,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,YAAA,EAAc;AACrC,QAAA;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAC9B,MAAA,IAAA,CAAK,OAAA,EAAA;AACL,MAAA,IAAA,CAAK,MAAM,YAAY;AACrB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,GAAG,CAAA;AAAA,QACxC,SAAS,CAAA,EAAQ;AACf,UAAA,GAAA,CAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,oBAAA,EAAuB,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,QACpE,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AACjC,UAAA,IAAA,CAAK,OAAA,EAAA;AAAA,QACP;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,CACZ,KAAA,EACA,GAAA,EACe;AACf,IAAA,MAAM,aAAA,GAAgB,IAAI,eAAA,EAAgB;AAC1C,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,aAAa,CAAA;AAC1C,IAAA,MAAM,UAAU,UAAA,CAAW,MAAM,aAAA,CAAc,KAAA,IAAS,oBAAoB,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,cAAe,CAAA;AACjD,MAAA,MAAM,OAAA,GAAuB;AAAA,QAC3B,OAAO,KAAA,CAAM,MAAA;AAAA,QACb,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,WAAW,KAAA,CAAM,UAAA;AAAA,QACjB,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,YAAY,KAAA,CAAM,WAAA;AAAA,QAClB,SAAA,EAAW,KAAA;AAAA,QACX;AAAA,OACF;AAEA,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,UAAA,IAAc,KAAA,CAAM,WAAW,KAAA,CAAA,EAAW;AAE7D,QAAA,MAAM,KAAK,SAAA,CAAU,aAAA,CAAc,SAAS,KAAA,CAAM,MAAA,EAAQ,MAAM,UAAU,CAAA;AAC1E,QAAA,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AACtC,QAAA,GAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,wBAAA,CAA0B,CAAA;AAAA,MAC5D,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,KAAW,MAAA,EAAQ;AAClC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAM,IAAI,CAAA;AAC1C,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,GAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,6CAAA,CAA+C,CAAA;AAC/E,UAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AACnC,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,aAAA,GAAgB,CAAA,IAAK,CAAC,MAAM,UAAA,EAAY;AAChD,UAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,YAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA;AAAA,cAC1B,KAAA;AAAA,cACA,KAAA,CAAM,aAAA;AAAA,cACN,GAAA;AAAA,cACA,aAAA,CAAc;AAAA,aAChB;AACA,YAAA,IAAI,CAAC,QAAA,EAAU;AACb,cAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AACnC,cAAA;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,iDAAA,CAAmD,CAAA;AACnF,YAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AACnC,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA;AAAA,UACzB;AAAA,YACE,MAAM,KAAA,CAAM,KAAA;AAAA,YACZ,WAAW,KAAA,CAAM,UAAA;AAAA,YACjB,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,OAAO,KAAA,CAAM;AAAA,WACf;AAAA,UACA,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,cAAc,MAAA;AAAO,SACnD;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAI,CAAA;AAClD,QAAA,MAAM,KAAK,SAAA,CAAU,aAAA,CAAc,SAAS,MAAA,CAAO,IAAA,EAAM,MAAM,UAAU,CAAA;AACzE,QAAA,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AACtC,QAAA,GAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,qCAAA,CAAuC,CAAA;AAAA,MACzE;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,aAAa,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,eAAA,CACZ,KAAA,EACA,aAAA,EACA,KACA,MAAA,EACkB;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,eAAgB,CAAA;AACjD,MAAA,MAAM,MAAM,eAAA,CAAgB,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AAC1D,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAEtD,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,YAAA;AACJ,QAAA,MAAM,YAAA,GAAe,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACrD,UAAA,YAAA,GAAe,MAAM;AACnB,YAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA;AACjD,YAAA,GAAA,CAAI,IAAA,GAAO,YAAA;AACX,YAAA,MAAA,CAAO,GAAG,CAAA;AAAA,UACZ,CAAA;AACA,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,YAAA,EAAa;AACb,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,YAAA,EAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,QAC/D,CAAC,CAAA;AACD,QAAA,IAAI;AACF,UAAA,MAAA,GAAS,MAAM,QAAQ,IAAA,CAAK;AAAA,YAC1B,OAAA,CAAQ,aAAA,CAAc,GAAA,EAAK,OAAA,EAAS,cAAc,CAAA;AAAA,YAClD;AAAA,WACD,CAAA;AAAA,QACH,CAAA,SAAE;AACA,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAAA,UAClD;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAA,CAAc,GAAA,EAAK,SAAS,cAAc,CAAA;AAAA,MACnE;AAEA,MAAA,IAAI,OAAO,QAAA,EAAU;AACnB,QAAA,MAAM,GAAA,GAAMe,oBAAAA,CAAqB,aAAA,EAAe,cAAA,CAAe,MAAM,CAAA;AACrE,QAAA,MAAM,YAAY,aAAA,GAAgB,GAAA;AAClC,QAAA,IAAA,CAAK,OAAO,aAAA,CAAc,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,eAAe,CAAA;AACxE,QAAA,GAAA,CAAI,CAAA,CAAA,EAAI,MAAM,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,iCAAA,EAAoC,SAAS,CAAA,UAAA,CAAY,CAAA;AACzF,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,GAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,sDAAA,CAAwD,CAAA;AACxF,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,CAAA,EAAQ;AACf,MAAA,GAAA,CAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,2CAAA,EAA8C,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACzF,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF,CAAA;ACv3BO,IAAM,gBAAN,MAAoB;AAAA,EACjB,SAAkB,EAAC;AAAA,EACnB,YAAA,GAA8B,IAAA;AAAA,EAEtC,SAAS,KAAA,EAAoB;AAC3B,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,KAAK,MAAA,CAAO,MAAA;AAAA,IAClC;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,IAAA,EAA8B;AAMlC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAC,UAAU,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,KAAM,GAAG,CAAA;AACrE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,YAAA,CAAa,QAAA,CAAS,GAAG,CAAC,CAAA;AAC1E,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAKA,IAAA,MAAM,iBAAiB,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,IAAO,QAAQ,QAAQ,CAAA;AACjE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAK,YAAA,KAAiB,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,GAAK,IAAA;AAAA,EACxE;AAAA,EAEA,eAAA,GAA4B;AAC1B,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAAA,EAClD;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,KAAW,CAAA;AAAA,EAChC;AAAA,EAEA,GAAA,GAAe;AACb,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF,CAAA;ACzJO,IAAM,kBAAN,MAAuC;AAAA,EAC5C,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,GAAkB,aAAA;AAAA,EAClB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA;AAAA,EACA,WAAA;AAAA,EACQ,KAAA;AAAA,EAER,YAAY,MAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AACnB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA;AAClB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,iBAAA,CAAmB;AAAA,MAClC,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,eAAe,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA,MACtD,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAmB,GAAA,EAAyC;AACxE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,EACtC;AACF,CAAA;AAUO,IAAM,oBAAN,MAAyC;AAAA,EAC9C,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,GAAkB,eAAA;AAAA,EAClB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA;AAAA,EACA,WAAA;AAAA,EACQ,KAAA;AAAA,EAER,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AACnB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA;AAClB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,mBAAA,CAAqB;AAAA,MACpC,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,eAAe,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA,MACtD,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAmB,GAAA,EAAyC;AACxE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,EACtC;AACF,CAAA;AAEO,IAAM,qBAAN,MAA0C;AAAA,EAC/C,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,GAAkB,gBAAA;AAAA,EAClB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA;AAAA,EACA,WAAA;AAAA,EACQ,KAAA;AAAA,EAER,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AACnB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA;AAClB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,oBAAA,CAAsB;AAAA,MACrC,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,eAAe,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA,MACtD,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAmB,GAAA,EAAyC;AACxE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,EACtC;AACF,CAAA;AC5IO,IAAM,cAAN,MAAmC;AAAA,EACxC,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,GAAkB,KAAA;AAAA,EACT,WAAA;AAAA,EACT,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA;AAAA,EACQ,KAAA;AAAA,EAER,WAAA,CACE,IAAA,EACA,WAAA,EACA,YAAA,EACA,aAAA,EACA,YAAA,EACA,gBAAA,EACA,cAAA,EACA,WAAA,EACA,aAAA,EACA,aAAA,EACA,MAAA,EACA,WAAA,EACA;AAGA,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,aAAA;AAEJ,IAAA,IAAI,iBAAiB,MAAA,IAAa,OAAO,YAAA,KAAiB,QAAA,IAAY,WAAW,YAAA,EAAc;AAE7F,MAAA,KAAA,GAAQ,YAAA;AACR,MAAA,KAAA,GAAQ,gBAAA;AACR,MAAA,SAAA,GAAY,cAAA;AACZ,MAAA,QAAA,GAAW,WAAA;AACX,MAAA,YAAA,GAAe,aAAA;AACf,MAAA,KAAA,GAAQ,aAAA;AACR,MAAA,aAAA,GAAgB,MAAA;AAAA,IAClB,CAAA,MAAO;AAEL,MAAA,KAAA,GAAQC,UAAAA;AACR,MAAA,KAAA,GAAQ,YAAA;AACR,MAAA,SAAA,GAAY,gBAAA;AACZ,MAAA,QAAA,GAAW,cAAA;AACX,MAAA,YAAA,GAAe,WAAA;AACf,MAAA,KAAA,GAAQ,aAAA;AACR,MAAA,aAAA,GAAgB,aAAA;AAAA,IAClB;AAEA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,GAAA,GAAM,QAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,aAAA,CAAe;AAAA,MAC9B,IAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,MAC/C,KAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAmB,GAAA,EAAyC;AACxE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,EACtC;AACF,CAAA;;;AC9FA,SAAS,aAAA,CACP,MAAA,EACA,SAAA,EACA,SAAA,EACO;AACP,EAAA,IAAI,KAAA;AACJ,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,KAAA;AACH,MAAA,KAAA,GAAQ,IAAI,WAAA;AAAA,QACV,MAAA,CAAO,IAAA;AAAA,QACP,MAAA,CAAO,WAAA;AAAA,QACP,MAAA,CAAO,YAAA;AAAA,QACP,MAAA,CAAO,OAAO,aAAa,CAAA;AAAA,QAC3B,MAAA,CAAO,KAAA;AAAA,QACP,MAAA,CAAO,KAAA;AAAA,QACP,MAAA,CAAO,SAAA;AAAA,QACP,SAAA;AAAA,QACA,MAAA,CAAO,YAAA;AAAA,QACP,MAAA,CAAO,KAAA;AAAA,QACP,MAAA,CAAO,aAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AACA,MAAA;AAAA,IACF,KAAK,aAAA,EAAe;AAClB,MAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,UAAA,EAAa,OAAO,IAAI,CAAA,6DAAA;AAAA,SAC1B;AAAA,MACF;AACA,MAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,SAAA,EAAW,MAAA,CAAO,UAAU,CAAA;AACrE,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,UAAA,EAAa,OAAO,IAAI,CAAA,qDAAA;AAAA,SAC1B;AAAA,MACF;AACA,MAAA,KAAA,GAAQ,IAAI,eAAA,CAAgB;AAAA,QAC1B,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,aAAA,EAAe,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA;AAAA,QAC1C,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,cAAA;AAAA,QACA,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,GAAA,EAAK,SAAA;AAAA,QACL,aAAa,MAAA,CAAO;AAAA,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,eAAA;AAAA,IACL,KAAK,gBAAA,EAAkB;AACrB,MAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC/B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,UAAA,EAAa,MAAA,CAAO,IAAI,CAAA,6CAAA,EAAgD,OAAO,IAAI,CAAA,CAAA;AAAA,SACrF;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,SAAA,EAAW,MAAA,CAAO,MAAM,CAAA;AAC7D,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,MAAA,CAAO,IAAI,CAAA,gDAAA,CAAkD,CAAA;AAAA,MAC5F;AACA,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,KAAS,eAAA,GAAkB,iBAAA,GAAoB,kBAAA;AACnE,MAAA,KAAA,GAAQ,IAAI,IAAA,CAAK;AAAA,QACf,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,aAAA,EAAe,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA;AAAA,QAC1C,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,UAAA;AAAA,QACA,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,eAAA,EAAiB,OAAO,eAAA,IAAmB,yBAAA;AAAA,QAC3C,SAAA;AAAA,QACA,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,GAAA,EAAK,SAAA;AAAA,QACL,aAAa,MAAA,CAAO;AAAA,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAAA;AAEF,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,KAAA,CAAM,YAAY,MAAA,CAAO,SAAA;AAAA,EAC3B;AACA,EAAA,OAAO,KAAA;AACT;AAYO,SAAS,iBAAA,CAAkB,SAAA,EAAmB,OAAA,GAA6B,EAAC,EAAY;AAC7F,EAAA,MAAM,SAAkB,EAAC;AAEzB,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,YAAY,SAAS,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AACvC,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,CAAE,aAAY,EAAG;AACtC,QAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUP,YAAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AACjD,MAAA,MAAM,EAAE,WAAA,EAAa,YAAA,EAAa,GAAI,aAAa,OAAO,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,WAAA,EAAa,YAAA,EAAc;AAAA,QACjE,eAAA,EAAiB;AAAA,OAClB,CAAA;AACD,MAAA,MAAA,CAAO,KAAK,aAAA,CAAc,MAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,IACjE,SAAS,CAAA,EAAY;AACnB,MAAA,MAAM,UAAU,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACzD,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,KAAK,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AC/HA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,KAAM,WAAA,IAAe,CAAA,CAAE,CAAC,CAAA,KAAM,OAAO,CAAA;AACxE;AAEA,IAAM,oBAAA,GAAuB,KAAK,EAAA,GAAK,GAAA;AAEhC,IAAM,iBAAN,MAAqB;AAAA,EAM1B,WAAA,CACU,MAAA,EACA,QAAA,EACA,WAAA,EACR;AAHQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EACP;AAAA,EATK,GAAA,GAAwB,IAAA;AAAA,EACxB,OAAA,GAAU,IAAI,UAAA,CAAmB,GAAM,CAAA;AAAA,EACvC,WAAA,GAAc,KAAK,GAAA,EAAI;AAAA,EACvB,KAAA,GAA6C,IAAA;AAAA;AAAA,EASrD,MAAM,KAAA,EAAyC;AAC7C,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAGb,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,GAAA,EAAI;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,cAAc,CAAA;AAEjD,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,sBAAA;AAAA,MACjC,IAAA,CAAK,QAAA;AAAA,MACL,KAAA;AAAA,MACA,CAAC,KAAA,KAAiB;AAChB,QAAA,IAAA,CAAK,WAAA,GAAc,KAAK,GAAA,EAAI;AAG5B,QAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AAC9B,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAGzB,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,CAAC,MAAM,QAAQ,CAAA;AAC1E,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,CAAC,CAAA,KAAM,GAAG,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAE,CAAA;AACpE,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,KAAM,KAAK,CAAA;AACpD,QAAA,MAAM,SAAA,GAAY,YAAY,KAAK,CAAA;AAGnC,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,KAAM,GAAG,CAAA;AAChD,QAAA,IAAI,SAAA,GAAY,MAAA;AAChB,QAAA,IAAI,IAAA,GAAO,CAAC,CAAA,EAAG;AACb,UAAA,SAAA,GAAY,KAAK,CAAC,CAAA;AAAA,QACpB;AACA,QAAA,MAAM,QAAQ,SAAA,GAAY,KAAA,CAAM,UAAW,IAAA,GAAO,CAAC,KAAK,KAAA,CAAM,OAAA;AAE9D,QAAA,KAAA,CAAM;AAAA,UACJ,OAAO,KAAA,CAAM,EAAA;AAAA,UACb,KAAA;AAAA,UACA,SAAA;AAAA,UACA,IAAA;AAAA,UACA,YAAY,KAAA,CAAM,MAAA;AAAA,UAClB,GAAA,EAAK,SAAS,CAAC,CAAA,GAAI,SAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,UAC7C,SAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,uBAAA,CACE,KAAA,EACA,cAAA,EACA,MAAA,EACA,SAAA,EACwB;AACxB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACb,QAAAA,KAAY;AAC9B,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,MAAM,MAAA,GAAiB;AAAA,QACrB,KAAA,EAAO,CAAC,iBAAiB,CAAA;AAAA,QACzB,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,QACZ,OAAA,EAAS,CAAC,cAAc,CAAA;AAAA,QACxB,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,QACf,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI;AAAA,OACzC;AAEA,MAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAuB;AACrC,QAAA,IAAI,OAAA,EAAS;AACX,UAAA;AAAA,QACF;AACA,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AACA,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,QAAA,GAAA,CAAI,KAAA,EAAM;AACV,QAAAA,SAAQ,GAAG,CAAA;AAAA,MACb,CAAA;AAEA,MAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,SAAA,CAAU,MAAA,EAAQ,CAAC,KAAA,KAAiB;AAC/D,QAAA,IAAI,OAAA,EAAS;AACX,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACvB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,KAAM,QAAQ,CAAA,GAAI,CAAC,CAAA;AAC5D,QAAA,IAAI,WAAW,mBAAA,EAAqB;AAClC,UAAA;AAAA,QACF;AACA,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,KAAM,IAAI,CAAA;AAClD,QAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,QAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,QAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,WAAW,CAAA,EAAG;AAC/C,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,QAAA,EAAU;AAC7C,UAAA;AAAA,QACF;AACA,QAAA,MAAA,CAAO,GAAG,CAAA;AAAA,MACZ,CAAC,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,CAAA;AACjC,MAAA,MAAM,KAAA,GACJ,SAAA,KAAc,MAAA,IAAa,SAAA,GAAY,CAAA,GAAI,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,CAAA,EAAG,SAAS,CAAA,GAAI,IAAA;AAEzF,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IAC1D,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAA,CAAa,GAAA,EAAkB,MAAA,EAA0C;AAC7E,IAAA,IAAI,MAAA,CAAO,SAAS,kBAAA,EAAoB;AACtC,MAAA,MAAM,IAAA,CAAK,OAAO,WAAA,CAAY,6BAAA;AAAA,QAC5B,IAAA,CAAK,QAAA;AAAA,QACL,GAAA,CAAI,QAAA;AAAA,QACJ,MAAA,CAAO,MAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AAAA,IACF,CAAA,MAAA,IAAW,MAAA,CAAO,IAAA,KAAS,YAAA,EAAc;AACvC,MAAA,MAAM,KAAK,MAAA,CAAO,WAAA,CAAY,yBAAyB,IAAA,CAAK,QAAA,EAAU,IAAI,QAAQ,CAAA;AAAA,IACpF,CAAA,MAAA,IAAW,MAAA,CAAO,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,MAAM,IAAA,CAAK,OAAO,WAAA,CAAY,mBAAA;AAAA,QAC5B,IAAA,CAAK,QAAA;AAAA,QACL,GAAA,CAAI,QAAA;AAAA,QACJ,MAAA,CAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAA,CACJ,GAAA,EACA,OAAA,EACA,MAAA,EACA,UAAU,CAAA,EACO;AACjB,IAAA,OAAO,IAAA,CAAK,OAAO,WAAA,CAAY,wBAAA;AAAA,MAC7B,IAAA,CAAK,QAAA;AAAA,MACL,GAAA,CAAI,QAAA;AAAA,MACJ,OAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,CAAU,YAAY,oBAAA,EAA+B;AACnD,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,WAAA,GAAc,SAAA;AAAA,EACzC;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IACvB;AAAA,EACF;AACF,CAAA;;;ACrLO,SAAS,cAAc,IAAA,EAA8B;AAC1D,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA,GAAkB,0BAAA;AAAA,IAClB,cAAA,GAAiB,yBAAA;AAAA,IACjB,kBAAA,GAAqB,8BAAA;AAAA,IACrB,iBAAA,GAAoB,6BAAA;AAAA,IACpB,MAAM,IAAA,CAAK;AAAA,GACb,GAAI,IAAA;AAEJ,EAAA,IAAI,OAAA,GAAqB,MAAA,CAAO,IAAA,CAAK,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACtE,EAAA,IAAI,OAAA,GAAU,KAAA;AAGd,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,aAAa,GAAA,EAAI;AAErB,EAAA,MAAM,sBAAA,GACJ,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,kBAAkB,CAAA,GAAI,gCAAA;AAQlD,EAAA,MAAM,0BAA0B,MAAY;AAC1C,IAAA,SAAA,CAAU,IAAA,EAAK;AAGf,IAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAClB,IAAA,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,MAAM,CAAA;AACvD,IAAA,SAAA,CAAU,OAAA,EAAQ;AAAA,EACpB,CAAA;AASA,EAAA,MAAM,uBAAuB,MAAe;AAC1C,IAAA,MAAM,WAAW,GAAA,EAAI;AACrB,IAAA,MAAM,QAAQ,QAAA,GAAW,UAAA;AACzB,IAAA,UAAA,GAAa,QAAA;AACb,IAAA,IAAI,SAAS,sBAAA,EAAwB;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,GAAA;AAAA,MACE,CAAA,oBAAA,EAAuB,KAAK,CAAA,WAAA,EAAc,sBAAsB,CAAA,gEAAA;AAAA,KAElE;AACA,IAAA,MAAA,EAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,YAAA,EAAc,QAAQ,gBAAA,EAAkB,KAAA,EAAO,KAAA,EAAM,EAAG,YAAY,CAAA;AAC1F,IAAA,uBAAA,EAAwB;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,YAAY,YAAY;AACzC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA;AAAA,IACF;AACA,IAAA,IAAI,sBAAqB,EAAG;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA;AAAA,IACF;AACA,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,cAAc,CAAA;AACjD,MAAA,IAAI,WAAW,EAAA,EAAI;AACjB,QAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,kEAAkE,CAAA;AACtE,MAAA,MAAA,EAAQ,KAAK,EAAE,KAAA,EAAO,cAAc,MAAA,EAAQ,cAAA,IAAkB,YAAY,CAAA;AAC1E,MAAA,uBAAA,EAAwB;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,GAAA,CAAI,CAAA,8BAAA,EAAiC,YAAY,CAAA,CAAE,CAAA;AACnD,MAAA,MAAA,EAAQ,KAAK,EAAE,KAAA,EAAO,eAAe,KAAA,EAAO,YAAA,IAAgB,4BAA4B,CAAA;AAAA,IAC1F,CAAA,SAAE;AACA,MAAA,SAAA,GAAY,KAAA;AAAA,IACd;AAAA,EACF,GAAG,eAAe,CAAA;AAOlB,EAAA,MAAM,aAAA,GAAgB,YAAY,YAAY;AAC5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA;AAAA,IACF;AACA,IAAA,IAAI,sBAAqB,EAAG;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA;AAAA,IACF;AACA,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,KAAK,SAAA,CAAU,QAAA,CAAS,WAAW,iBAAiB,CAAA;AAChF,MAAA,IAAI,OAAA,IAAW,OAAO,MAAA,EAAQ;AAC5B,QAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,gEAAgE,CAAA;AACpE,MAAA,MAAA,EAAQ,KAAK,EAAE,KAAA,EAAO,cAAc,MAAA,EAAQ,kBAAA,IAAsB,YAAY,CAAA;AAC9E,MAAA,uBAAA,EAAwB;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,GAAA,CAAI,CAAA,kCAAA,EAAqC,YAAY,CAAA,CAAE,CAAA;AACvD,MAAA,MAAA,EAAQ,IAAA;AAAA,QACN,EAAE,KAAA,EAAO,iBAAA,EAAmB,KAAA,EAAO,YAAA,EAAa;AAAA,QAChD;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,GAAe,KAAA;AAAA,IACjB;AAAA,EACF,GAAG,kBAAkB,CAAA;AAErB,EAAA,OAAO;AAAA,IACL,IAAA,GAAa;AACX,MAAA,IAAI,OAAA,EAAS;AACX,QAAA;AAAA,MACF;AACA,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,aAAA,CAAc,UAAU,CAAA;AACxB,MAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAChB;AAAA,GACF;AACF;;;AXhIA,eAAsB,QAAA,CACpB,OAAA,EACA,OAAA,GAAwB,EAAC,EACV;AACf,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAGxB,EAAA,MAAM,SAAA,GAAY,MAAM,qBAAA,CAAsB,OAAA,EAAS,GAAG,CAAA;AAC1D,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,SAAA,EAAW,GAAG,CAAA;AAIvD,EAAA,MAAM,OAAA,GACJ,OAAA,CAAQ,OAAA,KAAY,IAAA,IACpB,OAAA,CAAQ,IAAI,YAAA,KAAiB,GAAA,IAC7B,OAAA,CAAQ,GAAA,CAAI,SAAA,KAAc,OAAA;AAC5B,EAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAc,GAAI,YAAA,CAAa;AAAA,IAC7C,OAAA;AAAA,IACA,GAAA,EAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,KAAK;AAAA,GAClC,CAAA;AAGD,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,iBAAA,EAAsB,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA;AAAA,CAAQ,CAAA;AACrE,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,wBAAA,EAA2B,SAAS,CAAA,oCAAA,EAAuC,SAAS,CAAA;AAAA;AAAA,KACtF;AAAA,EACF;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAI,sEAAsE,CAAA;AAAA,EACpF;AAGA,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,KAAU,QAAQ,CAAA;AAChF,EAAA,MAAM,gBAAgB,UAAA,EAAY,OAAA;AAClC,EAAA,MAAM,aAAA,GAAgB,YAAY,OAAA,IAAW,QAAA;AAE7C,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,UAAU,aAAa,CAAA;AACtC,MAAA,MAAM,GAAA,GAAMqB,gBAAgB,MAAM,CAAA;AAClC,MAAA,MAAM,aAAA,GAAgBC,QAAQ,aAAa,CAAA;AAC3C,MAAA,MAAM,CAAC,EAAE,KAAA,EAAO,eAAA,IAAmB,WAAW,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QAClE,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,CAAE,IAAA,EAAK;AAAA,QACnC,gBAAA,CAAiB,KAAK,aAAa;AAAA,OACpC,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,OAAO,eAAe,CAAA;AAEtC,MAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,aAAa,CAAA,CAAE,CAAA;AAC5C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,aAAa,CAAA,CAAE,CAAA;AAC5C,MAAA,IAAI,OAAA,CAAQ,IAAI,cAAA,EAAgB;AAC9B,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,SAAA,CAAW,CAAA;AAAA,MACpE;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA,cAAA,EAAiB,SAAA,CAAU,OAAO,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,UAAA,CAAY,CAAA;AACvE,MAAA,OAAA,CAAQ,IAAI,CAAA,cAAA,EAAiBC,iBAAAA,CAAkBC,kBAAAA,EAAoB,WAAW,CAAC,CAAA,CAAE,CAAA;AAEjF,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,OAAA,CAAQ,IAAI,gEAAgE,CAAA;AAAA,MAC9E;AACA,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd,SAAS,CAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kBAAA,EAAqB,CAAA,CAAE,OAAO;AAAA,CAAI,CAAA;AAAA,IACjD;AAAA,EACF;AAYA,EAAA,MAAM,SAAA,GAA+B,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAI;AACtD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB,EAAC;AAChD,EAAA,KAAA,MAAW,UAAA,IAAc,kBAAiB,EAAG;AAC3C,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,UAAA,CAAW,EAAE,CAAA;AACzC,IAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,CAAY,SAAS,CAAA,EAAG;AAC7D,MAAA,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA,GAAI,WAAA;AAAA,IACjC;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,CAAO,GAAG,CAAA;AACnC,EAAA,MAAM,YAAY,KAAA,CAAM,MAAA;AACxB,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,SAAA,EAAW,EAAE,WAAW,CAAA;AAE5D,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,SAAS;AAAA,CAAI,CAAA;AACrD,IAAA,OAAA,CAAQ,MAAM,4DAA4D,CAAA;AAC1E,IAAA,OAAA,CAAQ,KAAA,CAAM,cAAc,SAAS,CAAA;AAAA,CAAsB,CAAA;AAC3D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,aAAA,EAAc;AACnC,EAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AACvB,IAAA,MAAM,KAAA,GACJ,KAAA,CAAM,aAAA,GAAgB,CAAA,GAClBD,iBAAAA,CAAkB,KAAA,CAAM,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,aAAa,CAAC,CAAA,GAC1D,MAAA;AACN,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EACtF;AACA,EAAA,OAAA,CAAQ,GAAA,EAAI;AAGZ,EAAA,MAAM,UAAU,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAgB,CAAC,CAAA;AACzD,EAAA,IAAI,OAAA,IAAW,CAAC,aAAA,EAAe;AAC7B,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAcA,EAAA,MAAM,YAAY,SAAA,CAAU,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,KAAK,CAAA;AAClE,EAAA,MAAM,kBAAkB,SAAA,CAAU,MAAA;AAAA,IAChC,CAAC,UAAU,KAAA,CAAM,IAAA,KAAS,SAAS,KAAA,CAAM,WAAA,EAAa,QAAA,IAAY,KAAA,CAAM,WAAA,EAAa;AAAA,GACvF;AAIA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAsD;AAE/E,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAA8B;AACvD,EAAA,MAAM,yBAAA,uBAAgC,GAAA,EAA2B;AACjE,EAAA,IAAI,oBAAA;AACJ,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAuB;AAClD,EAAA,MAAM,aAAA,GAAgB,IAAI,gBAAA,EAAiB;AAE3C,EAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,eAAA,CAAgB,SAAS,CAAA,EAAG;AACtD,IAAA,MAAM,mBAA6B,EAAC;AAEpC,IAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,MAAM,WAAA,GAAcE,IAAAA,CAAK,SAAA,EAAW,KAAA,CAAM,MAAM,UAAU,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,eAAA;AAAA,QACb,EAAE,SAAA,EAAW,KAAA,CAAM,MAAM,WAAA,EAAa,WAAA,EAAa,MAAM,WAAA,EAAY;AAAA,QACrE,OAAO,IAAA,CAAK;AAAA,OACd;AACA,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,gBAAA,CAAiB,IAAA,CAAK,OAAO,KAAK,CAAA;AAClC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,YAAY,MAAM,CAAA;AACnC,MAAA,YAAA,CAAa,GAAA,CAAI,UAAU,MAAM,CAAA;AACjC,MAAA,YAAA,CAAa,IAAI,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI;AAAA,QACtD,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,OAAO,MAAA,CAAO;AAAA,OACf,CAAA;AACD,MAAA,KAAA,CAAM,cAAA,GAAiB;AAAA,QACrB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,WAAW,MAAA,CAAO;AAAA,OACpB;AACA,MAAA,MAAM,OAAO,yBAAA,CAA0B,GAAA,CAAI,MAAA,CAAO,QAAQ,KAAK,EAAC;AAChE,MAAA,IAAA,CAAK,IAAA,CAAK,MAAM,IAAI,CAAA;AACpB,MAAA,yBAAA,CAA0B,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,IAAI,CAAA;AAAA,IACrD;AAMA,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAa,QAAA;AACpC,MAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAa,KAAA;AACjC,MAAA,YAAA,CAAa,GAAA,CAAI,GAAG,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA;AAC7D,MAAA,MAAM,IAAA,GAAO,yBAAA,CAA0B,GAAA,CAAI,QAAQ,KAAK,EAAC;AACzD,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9B,QAAA,IAAA,CAAK,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACtB;AACA,MAAA,yBAAA,CAA0B,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,IAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MAChC;AACA,MAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChB,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,MAAA,CAAO,KAAK,GAAA,EAAK;AACnB,MAAA,MAAM,kBAAA,GAAuC;AAAA,QAC3C,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,QAAA;AAAA,QAC1B,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAA;AAAA,QACvB,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI;AAAA,OAC7B;AACA,MAAA,MAAM,QAAA,GAAW,YAAY,kBAAkB,CAAA;AAC/C,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,QAAA,oBAAA,GAAuB,QAAA;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAyB;AACnD,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,UAAU,CAAA,IAAK,yBAAA,EAA2B;AAC9D,MAAA,MAAM,YAAY,qBAAA,CAAsB;AAAA,QACtC,QAAA;AAAA,QACA,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,eAAA,EAAiB;AAAA,OAClB,CAAA;AACD,MAAA,IAAI,WAAW,SAAA,EAAW;AACxB,QAAA,SAAA,CAAU,IAAA,CAAK,UAAU,KAAK,CAAA;AAC9B,QAAA;AAAA,MACF;AACA,MAAA,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,SAAA,CAAU,MAAM,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,KAAA,MAAW,WAAW,SAAA,EAAW;AAC/B,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,IAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MAChC;AACA,MAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChB,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAOA,IAAA,KAAA,MAAW,GAAG,IAAI,CAAA,IAAK,YAAA,EAAc;AACnC,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAC9C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GACJ,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,EAAG,UAAU,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa,CAAA,QAAA,CAAA;AACzE,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,YAAA,EAAe,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,IAAA,CAAM,CAAA;AACrE,MAAA,MAAM,eAAe,MAAM,mBAAA,CAAoB,KAAK,QAAA,EAAU,MAAA,EAAQ,KAAK,KAAK,CAAA;AAChF,MAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAC/C,MAAA,MAAM,WAAW,OAAO,MAAA,KACtB,UAAA,GACI,UAAA,CAAW,cAAc,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,MAAM,IACnD,EAAE,EAAA,EAAI,OAAgB,MAAA,EAAQ,aAAA,EAAwB,OAAO,eAAA,EAAgB;AACnF,MAAA,aAAA,CAAc,QAAA,CAAS;AAAA,QACrB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ;AAAA,OACD,CAAA;AACD,MAAA,aAAA,CAAc,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,YAAY,CAAA;AAC1D,MAAA,IAAI,aAAa,EAAA,EAAI;AACnB,QAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,MAClB,CAAA,MAAA,IAAW,YAAA,CAAa,MAAA,KAAW,SAAA,EAAW;AAC5C,QAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,QAAA,OAAA,CAAQ,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,4BAAA,EAA+B,YAAA,CAAa,MAAM,CAAA,EAAA,CAAI,CAAA;AACxF,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,4CAAA,EAA+C,SAAS,CAAA,UAAA,EAAa,MAAM,CAAA;AAAA;AAAA,SAC7E;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB,CAAA,MAAA,IAAW,YAAA,CAAa,MAAA,KAAW,SAAA,EAAW;AAC5C,QAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,QAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,GAAO,CAAA,CAAA,EAAI,YAAA,CAAa,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AAC3E,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,OAAO,IAAA,CAAK,QAAQ,sCAAsC,IAAA,CAAK,KAAK,IAAI,MAAM,CAAA;AAAA,SAChF;AACA,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,0DAA0D,MAAM,CAAA;AAAA;AAAA,SAClE;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,qBAAA,EAAwB,KAAK,QAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,EAAA,EAAK,aAAa,KAAK,CAAA;AAAA;AAAA,SAC5E;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,CAAA,IAAK,YAAA,EAAc;AAC7C,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AAChD,MAAA,IAAI,CAAC,MAAA,EAAQ;AAGX,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6CAAA,EAAgD,MAAA,CAAO,QAAQ,CAAA;AAAA,CAAM,CAAA;AACnF,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,MAAA,GAAoB;AAAA,QACxB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,MAAA;AAAA,QACA,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,QAAA,EAAU;AAAA,OACZ;AACA,MAAA,cAAA,CAAe,GAAA,CAAI,QAAA,EAAU,eAAA,CAAgB,MAAM,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,6DAA6D,CAAA;AAAA,EAC3E;AAEA,EAAA,MAAM,qBACJ,oBAAA,KAAyB,MAAA,GAAY,cAAA,CAAe,GAAA,CAAI,oBAAoB,CAAA,GAAI,MAAA;AAElF,EAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAAuD;AACrE,IAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,QAAA,EAAU,MAAA,CAAO,KAAK,GAAG,CAAA;AACjE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,cAAA,CAAe,GAAA,CAAI,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,EAC/C,CAAA;AAEA,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,GAAA,EAAK,kBAAA;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA,EAAkB,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe;AAAA,GAC/C;AAGA,EAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AAEnE,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,CAAQ,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AACvE,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAC,GAAGC,MAAM,CAAA;AAC9E,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,EAAE,QAAQ,CAAA;AAK1C,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,eAAA,KAAoB,GAAA,EAAK;AACvC,IAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,IAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,MAAA,EAAQ,MAAM,CAAA;AAChD,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,SAAA,GAAY,OAAO,GAAA,CAAI,MAAA,GAAS,IAAI,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AACjE,MAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAW;AAClC,QAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,MAAA,CAAO,GAAG,OAAO,SAAS,CAAA,aAAA,EAAgB,MAAA,CAAO,SAAS,CAAA,EAAA,CAAI,CAAA;AAAA,MAC5F,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,MAAA,CAAO,GAAG,CAAA,IAAA,EAAO,SAAS,CAAA,SAAA,EAAY,MAAA,CAAO,KAAA,IAAS,GAAG,CAAA,CAAE,CAAA;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,EAAa;AAC/B,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,MAAA,CAAO,GAAG,CAAA;AAClD,EAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,EAAA,MAAM,aAAa,MAAM,iBAAA;AAAA,IACvB,OAAO,IAAA,CAAK,OAAA;AAAA,IACZ,MAAA,CAAO,GAAA;AAAA,IACP,UAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,CAAC,OAAA,KAAa,eAAA,GAAkB,eAAA,IAAmB;AAAA,GACrD;AACA,EAAA,MAAM,YAAY,MAAM,iBAAA;AAAA,IACtB,OAAO,IAAA,CAAK,MAAA;AAAA,IACZ,MAAA,CAAO,GAAA;AAAA,IACP,UAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,CAAC,OAAA,KAAa,eAAA,GAAkB,eAAA,IAAmB;AAAA,GACrD;AAEA,EAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,IAAI,MAAM,KAAA,IAAS,CAAC,MAAM,SAAA,IAAa,CAAC,MAAM,GAAA,EAAK;AACjD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAAY,KAAA,CAAM,GAAA;AACxB,IAAA,MAAM,UAAA,GAAa,SAAS,SAAS,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,EAAI,MAAM,SAAS,CAAA,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAUD,IAAAA,CAAK,SAAA,EAAW,KAAA,CAAM,SAAS,CAAA;AAC/C,IAAA,MAAM,MAAM,MAAM,aAAA;AAAA,MAChB,QAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAO,eAAA,GAAkB;AAAA,KAC3B;AACA,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,KAAA,CAAM,KAAA,GAAQ,GAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,eAAA,CAAgB,MAAA,CAAO,GAAA,EAAK,UAAU,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,SAAA,CAAU,cAAA;AAAA,MACrB,QAAA;AAAA,MACA,MAAA,CAAO,KAAK,YAAA,IAAgB,SAAA;AAAA,MAC5B,MAAA,CAAO,KAAK,WAAA,IAAe,EAAA;AAAA,MAC3B,UAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,gBAAA,GAAmB,IAAA;AACnB,IAAA,MAAA,CAAO,MAAM,EAAE,KAAA,EAAO,eAAe,IAAA,EAAM,CAAA,IAAK,mBAAmB,CAAA;AAAA,EACrE,SAAS,CAAA,EAAQ;AACf,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAC1D,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,EAAkB,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA,CAAE,OAAA,EAAQ,EAAG,wBAAwB,CAAA;AAAA,EAC9F;AAGA,EAAA,MAAM,KAAA,GAAQ,CAACE,cAAAA,CAAe,mBAAmB,CAAC,CAAA;AAElD,EAAA,SAAS,UAAU,KAAA,EAA8C;AAC/D,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,KAAS,aAAA,IAAiB,MAAM,IAAA,KAAS,eAAA;AAChE,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,GAAI,QAAA,GAAW,EAAE,MAAA,EAAQ,IAAA,KAAS,EAAC;AAAA,MACnC,SAAS,aAAA,GACL;AAAA,QACE,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,aAAA;AAAA,QACT,OAAA,EAAS,aAAA;AAAA,QACT,WAAW,KAAA,CAAM,aAAA;AAAA,QACjB,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAAA,QACnB,GAAI,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK,GAAI,EAAC;AAAA,QACrD,QAAA,EAAU,MAAM,KAAA,CAAM,QAAA;AAAA,QACtB,MAAA,EAAQ,MAAM,KAAA,CAAM;AAAA,OACtB,GACA;AAAA,KACN;AAAA,EACF;AAEA,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,SAAA,CAAU,iBAAA,CAAkB,UAAU,SAAA,CAAU,KAAK,GAAG,KAAK,CAAA;AAC1E,MAAA,cAAA,IAAkB,CAAA;AAClB,MAAA,MAAA,CAAO,KAAA;AAAA,QACL,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,KAAA,EAAO,KAAA,EAAO,MAAM,IAAA,EAAK;AAAA,QACvD;AAAA,OACF;AAAA,IACF,SAAS,CAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,KAAK,CAAA,uBAAA,EAA0B,KAAA,CAAM,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAClE,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAE,KAAA,EAAO,gBAAA,EAAkB,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,QAC5E;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU;AAAA,MACjD,KAAA,EAAO,CAAC,KAAK,CAAA;AAAA,MACb,OAAA,EAAS,CAAC,QAAA,CAAS,SAAS,CAAA;AAAA,MAC5B,IAAA,EAAM,CAAC,QAAQ;AAAA,KAChB,CAAA;AAMD,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAMC,MAAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAC/D,IAAA,KAAA,MAAW,MAAM,cAAA,EAAgB;AAC/B,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAgB,CAAA,CAAE,CAAC,CAAA,KAAM,GAAG,CAAA,GAAI,CAAC,CAAA;AAC5D,MAAA,IAAI,CAAC,IAAA,IAAQ,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AACjC,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,OAAO,CAAA;AAClC,QAAA,IAAI,KAAK,IAAA,EAAM;AACb,UAAA,MAAM,MAAA,CAAO,SAAA,CAAU,gBAAA,CAAiB,QAAA,EAAU,KAAK,IAAI,CAAA;AAC3D,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,QACxD;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAC5B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,6BAAA,EAAgC,mBAAmB,IAAA,GAAO,QAAQ,MAAM,cAAc,CAAA,CAAA,EAAI,UAAU,MAAM,CAAA,8BAAA;AAAA,KAC5G;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,qBAAqB,MAAA,CAAO,MAAM,gBAAgB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACpF;AAGA,EAAA,MAAM,MAAA,GAAS,CAAC,YAAA,EAAsB,KAAA,KAAwB;AAC5D,IAAA,MAAA,CAAO,KAAK,QAAA,CAAS,QAAA,EAAU,cAAc,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACpE,CAAA;AAGA,EAAA,MAAM,YAAY,IAAI,cAAA,CAAe,QAAQ,QAAA,EAAU,CAAC,mBAAmB,CAAC,CAAA;AAC5E,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAEvC,EAAA,MAAM,aAAA,GAA+B;AAAA,IACnC,oBAAoB,QAAA,CAAS,mBAAA;AAAA,IAC7B,iBAAA,EAAmB,mBAAA;AAAA,IACnB,kBAAA,EAAoB,oBAAA;AAAA,IACpB,oBAAA,EAAsB,sBAAA;AAAA,IACtB,OAAA,EAAS,aAAA;AAAA,IACT;AAAA,GACF;AAKA,EAAA,MAAM,eAAe,eAAA,CAAgB,OAAA,CAAQ,IAAI,cAAA,IAAkB,SAAA,CAAuB,CAAC,CAAA;AAC3F,EAAA,MAAA,CAAO,KAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,iBAAA;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,aAAA;AAAA,MACT,MAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,GACF;AAKA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAsB;AACrC,IAAA,aAAA,CAAc,GAAG,CAAA;AACjB,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,cAAA,IAAkB,GAAG,CAAA;AAAA,EAC5C,CAAA;AAEA,EAAA,MAAM,WAAW,aAAA,CAAc;AAAA,IAC7B,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAK,OAAA;AAAA,IACL;AAAA,GACD,CAAA;AAED,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG;AACzB,IAAA,YAAA,GAAe,gBAAA,CAAiB;AAAA,MAC9B,OAAA,EAAS,aAAA;AAAA,MACT,GAAA,EAAK;AAAA,KACN,CAAA;AACD,IAAA,OAAA,CAAQ,0DAA0D,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,UAAU,IAAI,YAAA;AAAA,IAClB,SAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,MACE,aAAA,EAAe,CAAC,GAAA,KAAQ;AACtB,QAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,QAAQ,CAAA,IAAK,SAAA;AAEpD,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,CAAC,CAAA,OAAA,EAAU,GAAG;AAAA,CAAI,CAAA;AACvE,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,OAAO,GAAA,CAAI,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,CAAA;AAAA,MAC1E,CAAA;AAAA,MACA,cAAA,EAAgB,CAAC,KAAA,KAAU;AACzB,QAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,QAAA,EAAW,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,CAAgB,CAAA;AAClE,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,eAAA,EAAiB,OAAO,CAAA;AAAA,MAC/C,CAAA;AAAA,MACA,UAAA,EAAY,CAAC,KAAA,EAAO,KAAA,KAAU;AAC5B,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,CAAC,CAAA,UAAA,EAAa,KAAK;AAAA,CAAI,CAAA;AACxE,QAAA,MAAA,CAAO,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,OAAO,CAAA;AAAA,MACnD,CAAA;AAAA,MACA,KAAA,EAAO,OAAA;AAAA,MACP,QAAQ,MAAM;AACZ,QAAA,QAAA,CAAS,IAAA,EAAK;AACd,QAAA,YAAA,EAAc,IAAA,EAAK;AAAA,MACrB;AAAA,KACF;AAAA,IACA;AAAA,GACF;AAGA,EAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAClD,EAAA,MAAM,QAAQ,GAAA,EAAI;AACpB;AAQO,SAAS,gBAAgB,GAAA,EAAqB;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAA,CAAO,QAAA,GAAW,EAAA;AAClB,IAAA,MAAA,CAAO,QAAA,GAAW,EAAA;AAClB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,IAAI,MAAA,GAAS,EAAA;AACnD,IAAA,MAAA,CAAO,MAAA,GAAS,EAAA;AAChB,IAAA,OAAO,CAAA,EAAG,MAAA,CAAO,QAAA,EAAU,GAAG,MAAM,CAAA,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,uBAAA;AAAA,EACT;AACF;AAGA,eAAe,kBACb,KAAA,EACA,QAAA,EACA,KAAA,EACA,KAAA,EACA,UACA,aAAA,EAC6B;AAC7B,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,KAAA,EAAO,QAAQ,CAAA;AACrD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0BAAA,EAA6B,KAAK,CAAA,6CAAA,CAA+C,CAAA;AAC9F,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,aAAA,CAAc,OAAO,OAAA,EAAS,KAAA,EAAO,OAAO,QAAA,EAAU,MAAM,aAAA,CAAc,IAAI,CAAC,CAAA;AACxF;AAOA,SAAS,qBAAA,CAAsB,OAAe,QAAA,EAAiC;AAC7E,EAAA,MAAM,SAAA,GAAY5B,QAAQ,QAAQ,CAAA;AAClC,EAAA,MAAM,SAAA,GAAYA,OAAAA,CAAQ,SAAA,EAAW,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,SAAA,EAAW,SAAS,CAAA;AACzC,EAAA,IAAI,GAAA,KAAQ,EAAA,IAAM,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA,EAAG;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA;AACT;AAGA,eAAe,cACb,QAAA,EACA,OAAA,EACA,KAAA,EACA,KAAA,EACA,UACA,aAAA,EAC6B;AAC7B,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,KAAA,EAAO,UAAU,OAAO,CAAA;AAC7D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,QAAA,CAAS,OAAO,CAAC,CAAA,GAAA,CAAK,CAAA;AACjD,IAAA,MAAM,IAAA,GAAOa,aAAa,OAAO,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,WAAW,QAAQ,CAAA,CAAE,OAAO,IAAI,CAAA,CAAE,OAAO,KAAK,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAC,CAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,CAAO,UAAU,IAAA,EAAM,QAAA,CAAS,OAAO,CAAC,CAAA;AAChE,IAAA,KAAA,CAAM,QAAQ,CAAA,GAAI,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AAC3C,IAAA,aAAA,EAAc;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,GAAG,CAAA,CAAE,CAAA;AAChC,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,CAAA,EAAQ;AACf,IAAA,OAAA,CAAQ,IAAA,CAAK,wBAAwB,QAAA,CAAS,OAAO,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACtE,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,OAAO,eAAA,CAAgB,KAAK,KAAK,CAAA;AACnC;AAEA,IAAM,uBAAA,GAA0B,CAAA;AAMhC,eAAe,qBAAA,CACb,SACA,GAAA,EAC6B;AAC7B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,MAAMgB,UAAAA,CAAW,GAAG,CAAA;AACnC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAA,CAAQ,IAAI,yDAAyD,CAAA;AACrE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,OAAO,UAAU,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACxB,IAAA,EAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,EAAG,KAAA,CAAM,aAAA,GAAgB,mBAAA,GAAsB,EAAE,CAAA,CAAA,CAAA;AAAA,MACrF,OAAO,KAAA,CAAM;AAAA,KACf,CAAE,CAAA;AAAA,IACF,EAAE,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAO,SAAA;AAAU,GACjD;AACA,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,IACzC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,UAAA,EAAY,OAAA,EAAS,yBAAyB,OAAA;AAAQ,GAC7E,CAAA;AACD,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,MAAM,EAAE,OAAA,EAAAC,QAAAA,EAAQ,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,SAAA,EAAA,EAAA,YAAA,CAAA,CAAA;AAC1B,IAAA,MAAMA,QAAAA,EAAQ;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA;AACT;AAEA,eAAe,mBAAA,CAAoB,MAAc,GAAA,EAAmC;AAClF,EAAA,MAAM,aAAA,GAAgB,QAAQ,GAAA,CAAI,iBAAA;AAClC,EAAA,IAAI;AACF,IAAA,OAAO,MAAMC,SAAAA,CAAU,IAAA,EAAM,GAAA,EAAK,aAAa,CAAA;AAAA,EACjD,SAAS,CAAA,EAAQ;AACf,IAAA,MAAMC,YAAAA,GAAc,oBAAA,CAAqB,IAAA,CAAK,CAAA,EAAG,WAAW,EAAE,CAAA;AAC9D,IAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,IAAA,CAAK,CAAA,EAAG,WAAW,EAAE,CAAA;AACpE,IAAA,IAAI,CAACA,YAAAA,IAAe,CAAC,iBAAA,EAAmB;AACtC,MAAA,MAAM,CAAA;AAAA,IACR;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO;AACxB,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,OAAO,UAAU,CAAA;AACrD,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,uBAAA,EAAyB,WAAW,CAAA,EAAG;AACtE,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,MAC3C;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,gCAAA;AAAA,QACT,IAAA,EAAM;AAAA;AACR,KACD,CAAA;AACD,IAAA,IAAI;AACF,MAAA,OAAO,MAAMD,SAAAA,CAAU,IAAA,EAAM,GAAA,EAAK,UAAU,CAAA;AAAA,IAC9C,SAAS,CAAA,EAAQ;AACf,MAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,CAAA,EAAG,OAAA,IAAW,EAAE,CAAA,EAAG;AAChD,QAAA,MAAM,CAAA;AAAA,MACR;AACA,MAAA,MAAM,YAAY,uBAAA,GAA0B,OAAA;AAC5C,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,OAAA,CAAQ,MAAM,iCAAiC,CAAA;AAC/C,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,SAAS,CAAA,iBAAA,CAAmB,CAAA;AAAA,IACrE;AAAA,EACF;AACA,EAAA,MAAM,IAAI,MAAM,aAAa,CAAA;AAC/B;AYnzBA,eAAsB,UAAU,IAAA,EAAyC;AACvE,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAExB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,MAAA,GAAS,MAAMF,UAAAA,CAAW,GAAG,CAAA;AACnC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,MAAM,kBAAkB,CAAA;AAChC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,OAAO,UAAU,CAAA;AACrD,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,SAAS,MAAA,CAAO;AAAA,MACzC;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,eAAA;AAAA,QACT,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UAC9B,MAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,MAAM,CAAA,CAAA,CAAA;AAAA,UACpC,OAAO,KAAA,CAAM;AAAA,SACf,CAAE;AAAA;AACJ,KACD,CAAA;AACD,IAAA,IAAA,GAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,QAAQ,GAAA,CAAI,iBAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,MAAME,SAAAA,CAAU,IAAA,EAAO,KAAK,UAAU,CAAA;AAErD,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,KAAU,QAAQ,CAAA;AAChF,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,OAAA,CAAQ,MAAM,+CAA+C,CAAA;AAC7D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAMV,gBAAgB,MAAM,CAAA;AAClC,EAAA,MAAM,aAAA,GAAgBC,OAAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAChD,EAAA,MAAM,EAAE,OAAO,OAAA,EAAQ,GAAI,MAAM,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,CAAE,IAAA,EAAK;AACpE,EAAA,MAAM,WAAA,GAAc,MAAM,gBAAA,CAAiB,GAAA,EAAK,aAAa,CAAA;AAE7D,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,SAAA,EAAc,IAAI,CAAA,CAAE,CAAA;AAChC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AAC9C,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AAC9C,EAAA,OAAA,CAAQ,GAAA,CAAI,kBAAkBW,SAAAA,CAAU,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,UAAA,CAAY,CAAA;AAChF,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmBV,iBAAAA,CAAkBC,kBAAAA,EAAoB,WAAW,CAAC;AAAA,CAAI,CAAA;AACvF;ACzCA,SAAS,kBAAA,GAA6B;AACpC,EAAA,IAAI;AAEF,IAAA,MAAM,IAAA,GAAOU,OAAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAMrB,YAAAA,CAAaY,IAAAA,CAAK,MAAM,IAAA,EAAM,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA;AAG9E,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAEO,IAAM,kBAA0B,kBAAA,EAAmB;;;AlBZ1D,OAAA,CAAQ,mBAAmB,SAAS,CAAA;AAapC,SAAS,KAA0B,EAAA,EAAmC;AACpE,EAAA,OAAO,UAAU,IAAA,KAA2B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IAClB,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AACpE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAA;AACF;AAEA,IAAM,OAAA,GAAU,IAAI,OAAA,EAAQ,CACzB,IAAA,CAAK,QAAQ,CAAA,CACb,WAAA,CAAY,yCAAyC,CAAA,CACrD,OAAA,CAAQ,eAAe,CAAA;AAG1B,OAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,oBAAoB,CAAA,CAChC,MAAA,CAAO,qBAAA,EAAuB,4DAA4D,CAAA,CAC1F,MAAA;AAAA,EACC,YAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA,CAAO,SAAA,EAAW,0EAA0E,CAAA,CAC5F,MAAA;AAAA,EACC,sBAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,OAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,IAAA,CAAK,OAAO,IAAA,EAA0B,OAAA,KAAyB;AAC7D,IAAA,MAAM,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,EAC7B,CAAC;AACH,CAAA;AAGF,OAAA,CACG,OAAA,CAAQ,gBAAgB,CAAA,CACxB,WAAA,CAAY,8CAA8C,CAAA,CAC1D,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAG1B,OAAA,CACG,OAAA,CAAQ,cAAc,CAAA,CACtB,WAAA,CAAY,8BAA8B,CAAA,CAC1C,MAAA;AAAA,EACC,eAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,IAAA,CAAK,OAAO,IAAA,EAA0B,OAAA,KAAmC;AACvE,IAAA,MAAM,QAAA,CAAS,MAAM,OAAO,CAAA;AAAA,EAC9B,CAAC;AACH,CAAA;AAGF,OAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,iDAAiD,CAAA,CAC7D,MAAA;AAAA,EACC,KAAK,YAAY;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,MAAA,GAAS,MAAMI,UAAAA,CAAW,GAAG,CAAA;AACnC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,IAAI,4DAA4D,CAAA;AACxE,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,WAAW,CAAA;AACvB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAME,SAAAA,CAAU,KAAA,CAAM,MAAM,GAAG,CAAA;AAC9C,QAAA,MAAM,QAAA,GAAWI,cAAAA,CAAe,OAAA,CAAQ,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AACvE,QAAA,MAAM,IAAA,GAAOC,KAAAA,CAAM,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA;AAChD,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,OAAA,GACrC,CAAA,WAAA,EAAc,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,CAAE,OAAO,CAAA,CAAA,GAC7C,EAAA;AACJ,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,aAAA,GAAgB,mBAAA,GAAsB,EAAA;AAC3D,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA;AAAA,MAC9E,SAAS,CAAA,EAAQ;AACf,QAAA,MAAM,OAAO,oBAAA,CAAqB,IAAA,CAAK,GAAG,OAAA,IAAW,EAAE,IAAI,cAAA,GAAiB,EAAA;AAC5E,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,MACxD;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd,CAAC;AACH,CAAA;AAGF,OAAA,CAAQ,OAAA,CAAQ,eAAe,CAAA,CAAE,WAAA,CAAY,qBAAqB,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAE1F,OAAA,CAAQ,KAAA,EAAM","file":"index.js","sourcesContent":["/**\n * Shared HTTP helpers for provider clients: timeout-aware fetch and a\n * retry wrapper that handles 429/5xx with exponential backoff and\n * `Retry-After`. Provider descriptors compose these so each new\n * provider does not re-derive timeout/abort plumbing.\n */\n\nconst LLM_TIMEOUT_MS = 120_000;\nconst MAX_RETRIES = 2;\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\n\nfunction createAbortError(): Error {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n return err;\n}\n\nfunction sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n };\n const onAbort = (): void => {\n cleanup();\n reject(createAbortError());\n };\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nexport async function fetchWithTimeout(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), LLM_TIMEOUT_MS);\n const onAbort = (): void => controller.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n }\n}\n\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n let response: Response;\n try {\n response = await fetchWithTimeout(url, init, signal);\n } catch (error) {\n const name = error instanceof Error ? error.name : '';\n if (attempt >= MAX_RETRIES || name === 'AbortError') {\n throw error;\n }\n await sleepWithSignal(Math.min(1000 * 2 ** attempt, 8000), signal);\n continue;\n }\n if (response.ok || attempt >= MAX_RETRIES || !RETRYABLE_STATUSES.has(response.status)) {\n return response;\n }\n const retryAfter = response.headers.get('retry-after');\n const delay = retryAfter\n ? Math.min(parseInt(retryAfter, 10) * 1000 || 1000 * 2 ** attempt, 30_000)\n : Math.min(1000 * 2 ** attempt, 8000);\n await response.body?.cancel().catch(() => undefined);\n await sleepWithSignal(delay, signal);\n }\n}\n","/**\n * Anthropic provider descriptor + client.\n *\n * Exports a pure `LlmProviderDescriptor`; `../registry.ts` imports it\n * statically and registers it at module init. Imports from the registry\n * are type-only to keep the dependency edge one-way.\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MODEL = 'claude-haiku-4-5-20251001';\nconst DEFAULT_MAX_TOKENS = 4096;\nconst FALLBACK_MODELS = ['claude-sonnet-4-6', 'claude-haiku-4-5-20251001', 'claude-opus-4-6'];\n\ninterface AnthropicContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n}\n\ninterface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n}\n\ninterface AnthropicResponse {\n content?: AnthropicContentBlock[];\n usage?: AnthropicUsage;\n}\n\ninterface AnthropicClientConfig {\n apiKey: string;\n model: string;\n maxTokens: number;\n logUsage?: boolean;\n}\n\nexport class AnthropicClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: AnthropicClientConfig) {}\n\n private logTokens(usage: AnthropicUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.input_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const response = await fetchWithRetry(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: systemPrompt,\n messages: [{ role: 'user', content: userInput }],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as AnthropicResponse;\n this.logTokens(data.usage);\n const textBlock = data.content?.find((block) => block.type === 'text');\n return textBlock?.text ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const anthropicTools = tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n }));\n\n const response = await fetchWithRetry(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: systemPrompt,\n messages,\n tools: anthropicTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as AnthropicResponse;\n this.logTokens(data.usage);\n const content = data.content ?? [];\n\n const toolUses = content.filter((block) => block.type === 'tool_use');\n if (toolUses.length > 0) {\n const calls: ToolCall[] = toolUses.map((block) => ({\n id: block.id ?? '',\n name: block.name ?? '',\n arguments: block.input ?? {},\n }));\n return {\n type: 'tool_use',\n calls,\n assistantMessage: { role: 'assistant', content },\n };\n }\n const textBlock = content.find((block) => block.type === 'text');\n return { type: 'text', text: textBlock?.text ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return [\n {\n role: 'user',\n content: results.map((result) => ({\n type: 'tool_result',\n tool_use_id: result.callId,\n content: result.content,\n })),\n },\n ];\n }\n}\n\nasync function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/models?limit=1000',\n {\n method: 'GET',\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n },\n signal,\n );\n if (!response.ok) {\n return FALLBACK_MODELS;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const models = (data.data ?? []).map((entry) => entry.id).sort();\n return models.length > 0 ? models : FALLBACK_MODELS;\n } catch {\n return FALLBACK_MODELS;\n }\n}\n\nasync function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/models?limit=1',\n {\n method: 'GET',\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient'];\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Deep verification: actually invokes the messages endpoint with\n * max_tokens=1. Costs a fraction of a cent per probe but distinguishes\n * billing-exhausted accounts from valid ones - `/v1/models` returns 200\n * even when the org has $0 balance.\n *\n * Use this at startup, runtime preflight, and heartbeat. Use the cheap\n * `verifyKey` only for UI commands where billing isn't relevant.\n */\nasync function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: 1,\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 400 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nexport const ANTHROPIC_PROVIDER: LlmProviderDescriptor = {\n id: 'anthropic',\n displayName: 'Anthropic (Claude)',\n envVar: 'ANTHROPIC_API_KEY',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient: (config) =>\n new AnthropicClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n logUsage: config.logUsage,\n }),\n};\n","/**\n * Shared OpenAI-compatible client + descriptor factory.\n *\n * Powers providers that speak the OpenAI Chat Completions wire format\n * (xAI, Google's Gemini compat endpoint, DeepSeek). The native OpenAI\n * descriptor lives in `./openai.ts` and stays separate because it\n * carries OpenAI-specific reasoning-model quirks (`max_completion_tokens`,\n * `developer` role) the others don't need.\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { CreateLlmClientConfig, LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MAX_TOKENS = 4096;\nconst DEFAULT_BILLING_MARKERS = ['credit balance', 'billing', 'insufficient_quota', 'insufficient'];\n\ninterface OpenAIToolCall {\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\ninterface OpenAIMessage {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n}\n\ninterface OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAICompatibleClientConfig {\n apiKey: string;\n baseUrl: string;\n model: string;\n maxTokens: number;\n /** Provider name used in error messages (e.g. \"xAI\", \"Google\", \"DeepSeek\"). */\n providerLabel: string;\n logUsage?: boolean;\n}\n\nexport class OpenAICompatibleClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: OpenAICompatibleClientConfig) {}\n\n private logTokens(usage: OpenAIUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.prompt_tokens ?? 0;\n const outputTokens = usage.completion_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const response = await fetchWithRetry(\n `${this.config.baseUrl}/chat/completions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(\n `${this.config.providerLabel} API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n },\n }));\n\n const response = await fetchWithRetry(\n `${this.config.baseUrl}/chat/completions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n messages: [{ role: 'system', content: systemPrompt }, ...messages],\n tools: openaiTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(\n `${this.config.providerLabel} API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n const toolCalls = message?.tool_calls ?? [];\n\n if (toolCalls.length > 0) {\n const calls: ToolCall[] = toolCalls.map((call) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(call.function?.arguments ?? '{}') as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: call.id ?? '', name: call.function?.name ?? '', arguments: args };\n });\n return { type: 'tool_use', calls, assistantMessage: message };\n }\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return results.map((result) => ({\n role: 'tool',\n tool_call_id: result.callId,\n content: result.content,\n }));\n }\n}\n\nexport interface OpenAICompatibleProviderConfig {\n id: string;\n displayName: string;\n envVar: string;\n /** Base URL up to but not including `/chat/completions` or `/models`, no trailing slash. */\n baseUrl: string;\n defaultModel: string;\n fallbackModels: string[];\n /**\n * Optional transform applied to each `data[].id` returned by `/models`.\n * Returning `null` drops the entry. Use to strip prefixes (Gemini's\n * compat endpoint returns `models/<id>`) or filter non-chat models.\n */\n mapModelId?: (id: string) => string | null;\n /** Extra billing-detection markers concatenated with the shared defaults. */\n extraBillingMarkers?: string[];\n}\n\nexport function createOpenAICompatibleProvider(\n config: OpenAICompatibleProviderConfig,\n): LlmProviderDescriptor {\n const billingMarkers = [...DEFAULT_BILLING_MARKERS, ...(config.extraBillingMarkers ?? [])];\n\n function bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return billingMarkers.some((marker) => lower.includes(marker));\n }\n\n async function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/models`,\n { method: 'GET', headers: { Authorization: `Bearer ${apiKey}` } },\n signal,\n );\n if (!response.ok) {\n return config.fallbackModels;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const transformed: string[] = [];\n for (const entry of data.data ?? []) {\n const mapped = config.mapModelId ? config.mapModelId(entry.id) : entry.id;\n if (mapped) {\n transformed.push(mapped);\n }\n }\n transformed.sort();\n return transformed.length > 0 ? transformed : config.fallbackModels;\n } catch {\n return config.fallbackModels;\n }\n }\n\n async function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/models`,\n { method: 'GET', headers: { Authorization: `Bearer ${apiKey}` } },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n }\n\n async function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n ): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/chat/completions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n max_tokens: 1,\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if ((response.status === 400 || response.status === 429) && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n }\n\n function createClient(clientConfig: CreateLlmClientConfig): LlmClient {\n return new OpenAICompatibleClient({\n apiKey: clientConfig.apiKey,\n baseUrl: config.baseUrl,\n model: clientConfig.model ?? config.defaultModel,\n maxTokens: clientConfig.maxTokens ?? DEFAULT_MAX_TOKENS,\n providerLabel: config.displayName,\n logUsage: clientConfig.logUsage,\n });\n }\n\n return {\n id: config.id,\n displayName: config.displayName,\n envVar: config.envVar,\n defaultModel: config.defaultModel,\n fallbackModels: config.fallbackModels,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient,\n };\n}\n","/**\n * DeepSeek provider descriptor.\n *\n * DeepSeek's API is OpenAI-compatible at `https://api.deepseek.com/v1`,\n * so this is a thin wrapper around `createOpenAICompatibleProvider`.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'deepseek-chat';\nconst FALLBACK_MODELS = ['deepseek-chat', 'deepseek-reasoner'];\n\nexport const DEEPSEEK_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'deepseek',\n displayName: 'DeepSeek',\n envVar: 'DEEPSEEK_API_KEY',\n baseUrl: 'https://api.deepseek.com/v1',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n});\n","/**\n * Google (Gemini) provider descriptor.\n *\n * Uses Google's OpenAI-compatible endpoint at\n * `https://generativelanguage.googleapis.com/v1beta/openai`. The\n * `/models` route returns ids prefixed with `models/`; the model id\n * mapper strips that prefix and drops non-Gemini entries (embeddings,\n * legacy PaLM, etc.) so the picker only shows usable chat models.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'gemini-2.5-flash';\nconst FALLBACK_MODELS = ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.0-flash'];\nconst MODELS_PREFIX = 'models/';\n\nfunction mapGeminiModelId(id: string): string | null {\n const stripped = id.startsWith(MODELS_PREFIX) ? id.slice(MODELS_PREFIX.length) : id;\n return stripped.startsWith('gemini') ? stripped : null;\n}\n\nexport const GOOGLE_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'google',\n displayName: 'Google (Gemini)',\n envVar: 'GEMINI_API_KEY',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n mapModelId: mapGeminiModelId,\n});\n","/**\n * OpenAI provider descriptor + client.\n *\n * Exports a pure `LlmProviderDescriptor`; `../registry.ts` imports it\n * statically and registers it at module init. The client also handles\n * the reasoning-model quirk (o1/o3/o4 + gpt-5 family use\n * `max_completion_tokens` and `developer` role instead of `max_tokens`\n * and `system`).\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MODEL = 'gpt-4o-mini';\nconst DEFAULT_MAX_TOKENS = 4096;\nconst FALLBACK_MODELS = ['gpt-4o', 'gpt-4o-mini', 'o3-mini'];\n\ninterface OpenAIToolCall {\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\ninterface OpenAIMessage {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n}\n\ninterface OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAIClientConfig {\n apiKey: string;\n model: string;\n maxTokens: number;\n logUsage?: boolean;\n}\n\nexport function isOpenAIReasoningModel(model: string): boolean {\n return /^o\\d/.test(model) || /^gpt-5(\\b|[-.])/.test(model);\n}\n\nexport class OpenAIClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: OpenAIClientConfig) {}\n\n private isReasoningModel(): boolean {\n return isOpenAIReasoningModel(this.config.model);\n }\n\n private logTokens(usage: OpenAIUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.prompt_tokens ?? 0;\n const outputTokens = usage.completion_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const reasoning = this.isReasoningModel();\n const response = await fetchWithRetry(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n ...(reasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: reasoning ? 'developer' : 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n },\n }));\n\n const reasoning = this.isReasoningModel();\n const response = await fetchWithRetry(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n ...(reasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: reasoning ? 'developer' : 'system', content: systemPrompt },\n ...messages,\n ],\n tools: openaiTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n const toolCalls = message?.tool_calls ?? [];\n\n if (toolCalls.length > 0) {\n const calls: ToolCall[] = toolCalls.map((call) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(call.function?.arguments ?? '{}') as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: call.id ?? '', name: call.function?.name ?? '', arguments: args };\n });\n return { type: 'tool_use', calls, assistantMessage: message };\n }\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return results.map((result) => ({\n role: 'tool',\n tool_call_id: result.callId,\n content: result.content,\n }));\n }\n}\n\nasync function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/models',\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n },\n signal,\n );\n if (!response.ok) {\n return FALLBACK_MODELS;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const models = (data.data ?? [])\n .map((entry) => entry.id)\n .filter(\n (id) =>\n (id.startsWith('gpt-') ||\n id.startsWith('o1') ||\n id.startsWith('o3') ||\n id.startsWith('o4') ||\n id.startsWith('chatgpt-')) &&\n !id.includes('instruct') &&\n !id.includes('realtime') &&\n !id.includes('audio') &&\n !id.includes('tts') &&\n !id.includes('whisper'),\n )\n .sort();\n return models.length > 0 ? models : FALLBACK_MODELS;\n } catch {\n return FALLBACK_MODELS;\n }\n}\n\nasync function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/models',\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient_quota', 'insufficient'];\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Deep verification: actually invokes chat completions with\n * max_tokens=1. Distinguishes billing-exhausted accounts from valid ones,\n * including OpenAI's specific 429 + `insufficient_quota` body shape.\n *\n * Use this at startup, runtime preflight, and heartbeat. Use the cheap\n * `verifyKey` only for UI commands where billing isn't relevant.\n */\nasync function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n try {\n const reasoning = isOpenAIReasoningModel(model);\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n ...(reasoning ? { max_completion_tokens: 1 } : { max_tokens: 1 }),\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 429 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 400 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nexport const OPENAI_PROVIDER: LlmProviderDescriptor = {\n id: 'openai',\n displayName: 'OpenAI (GPT)',\n envVar: 'OPENAI_API_KEY',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient: (config) =>\n new OpenAIClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n logUsage: config.logUsage,\n }),\n isReasoningModel: isOpenAIReasoningModel,\n};\n","/**\n * xAI (Grok) provider descriptor.\n *\n * xAI exposes an OpenAI-compatible Chat Completions endpoint at\n * `https://api.x.ai/v1`, so this is a thin wrapper around\n * `createOpenAICompatibleProvider`.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'grok-3-mini';\nconst FALLBACK_MODELS = ['grok-4', 'grok-3', 'grok-3-mini'];\n\nexport const XAI_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'xai',\n displayName: 'xAI (Grok)',\n envVar: 'XAI_API_KEY',\n baseUrl: 'https://api.x.ai/v1',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n});\n","/**\n * Pluggable LLM provider registry.\n *\n * Each provider (Anthropic, OpenAI, future Grok/Gemini/...) lives as a\n * `LlmProviderDescriptor` in its own file under `./providers/`. The CLI\n * looks up env-var name, default model, model list, key verification,\n * and client construction through this registry, so adding a provider\n * is one descriptor file plus one registration call below.\n *\n * Builtins are imported statically and registered at module init. The\n * descriptor files reach back to this module only via `import type`, so\n * there is no runtime cycle - registry evaluation completes before any\n * descriptor's runtime body runs.\n */\n\nimport type { LlmKeyVerification } from '@elisym/sdk/llm-health';\nimport type { LlmClient } from '@elisym/sdk/skills';\nimport { ANTHROPIC_PROVIDER } from './providers/anthropic';\nimport { DEEPSEEK_PROVIDER } from './providers/deepseek';\nimport { GOOGLE_PROVIDER } from './providers/google';\nimport { OPENAI_PROVIDER } from './providers/openai';\nimport { XAI_PROVIDER } from './providers/xai';\n\nexport type { LlmKeyVerification } from '@elisym/sdk/llm-health';\n\n/**\n * Config passed to a descriptor's `createClient`. Mirrors the SDK's\n * `LlmClientConfig` minus `provider` (already implied by the descriptor)\n * plus an optional `logUsage` flag the client uses to print token\n * counts to stdout. CLI-internal type so SDK clients (none any more)\n * stay log-free.\n */\nexport interface CreateLlmClientConfig {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n /** Print `[LLM] <model> tokens: in=N out=M (total: in=… out=…)` after each call. */\n logUsage?: boolean;\n}\n\n/**\n * Token usage extracted from a provider's raw response. Reserved for\n * future telemetry hooks; concrete clients log their own usage today.\n */\nexport interface LlmUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\nexport interface LlmProviderDescriptor {\n /** Stable identifier used in elisym.yaml `llm.provider` and SKILL.md `provider:`. */\n id: string;\n /** Human-readable label for interactive prompts. */\n displayName: string;\n /** Operator-facing env var that supplies the API key when no per-agent secret is set. */\n envVar: string;\n /** Default model when neither agent nor skill picks one. */\n defaultModel: string;\n /** Hard-coded fallback list when `fetchModels` cannot reach the provider. */\n fallbackModels: string[];\n /** Pull the live model list from the provider. Returns `fallbackModels` on failure. */\n fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]>;\n /**\n * Lightweight authenticated probe before the agent publishes capabilities.\n * Hits a metadata endpoint (e.g. `/v1/models`) so it does not consume\n * billing credits. Used for UI commands and as a cheap liveness check.\n */\n verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification>;\n /**\n * Authoritative deep probe that consumes a single token from the\n * provider's billing account. Distinguishes invalid keys, billing/quota\n * exhaustion, and transient unavailability. Used at agent startup,\n * runtime preflight, and the LLM health heartbeat.\n *\n * Caller passes the model the skill will actually use - billing checks\n * are scoped to that model since some orgs gate access per model.\n */\n verifyKeyDeep(apiKey: string, model: string, signal?: AbortSignal): Promise<LlmKeyVerification>;\n /** Build a fresh `LlmClient` for the given config (apiKey + model + maxTokens + logUsage). */\n createClient(config: CreateLlmClientConfig): LlmClient;\n /** True when the model uses provider-specific reasoning quirks (e.g. OpenAI o1/o3/gpt-5 family). */\n isReasoningModel?(model: string): boolean;\n}\n\nconst REGISTRY = new Map<string, LlmProviderDescriptor>();\n\n/**\n * Register or replace a provider descriptor. Calling twice with the same\n * `id` overwrites the prior entry - useful for tests.\n */\nexport function registerLlmProvider(descriptor: LlmProviderDescriptor): void {\n REGISTRY.set(descriptor.id, descriptor);\n}\n\n/** Look up a provider by id. Returns undefined when not registered. */\nexport function getLlmProvider(id: string): LlmProviderDescriptor | undefined {\n return REGISTRY.get(id);\n}\n\n/** Snapshot of all registered descriptors. Order: registration order. */\nexport function listLlmProviders(): LlmProviderDescriptor[] {\n return Array.from(REGISTRY.values());\n}\n\n/** Snapshot of all registered ids. */\nexport function getRegisteredProviderIds(): string[] {\n return Array.from(REGISTRY.keys());\n}\n\n// Builtin registration. Order here is the registration order seen by\n// `listLlmProviders` and the order interactive prompts will offer.\nregisterLlmProvider(ANTHROPIC_PROVIDER);\nregisterLlmProvider(OPENAI_PROVIDER);\nregisterLlmProvider(XAI_PROVIDER);\nregisterLlmProvider(GOOGLE_PROVIDER);\nregisterLlmProvider(DEEPSEEK_PROVIDER);\n","/**\n * CLI-level LLM facade.\n *\n * The provider registry, descriptors, and concrete client classes\n * (Anthropic, OpenAI) live under `./providers/` + `./registry.ts`.\n * Concrete clients implement `logUsage` themselves (printing token\n * counts to stdout after each API response) - keeping log code in the\n * client lets it read the raw provider response without an extra\n * round-trip. SDK clients no longer exist; CLI is the only consumer.\n *\n * This module exposes:\n * - `createLlmClient(config)`: registry-driven factory\n * - `verifyLlmApiKey(provider, key)`: registry-driven probe\n * - `LlmConfig`, `LlmProvider`, `LlmKeyVerification` shapes\n * - registry surface (`getLlmProvider`, `listLlmProviders`,\n * `getRegisteredProviderIds`, `registerLlmProvider`)\n */\n\nimport type { LlmClient } from '@elisym/sdk/skills';\nimport { getLlmProvider, getRegisteredProviderIds, type LlmKeyVerification } from './registry';\n\nexport type { LlmKeyVerification, LlmProviderDescriptor, LlmUsage } from './registry';\nexport {\n getLlmProvider,\n getRegisteredProviderIds,\n listLlmProviders,\n registerLlmProvider,\n} from './registry';\n\nexport type LlmProvider = string;\n\nexport interface LlmConfig {\n provider: LlmProvider;\n apiKey: string;\n model: string;\n maxTokens: number;\n /** Print `[LLM] <model> tokens: in=N out=M ...` after each call. Default: false. */\n logUsage?: boolean;\n}\n\n/**\n * Build an `LlmClient` for the given config. Throws when the provider\n * id is not registered (typically a typo in elisym.yaml or SKILL.md\n * `provider:` override).\n */\nexport function createLlmClient(config: LlmConfig): LlmClient {\n const descriptor = getLlmProvider(config.provider);\n if (!descriptor) {\n const known = getRegisteredProviderIds().join(', ') || '<none>';\n throw new Error(`Unknown LLM provider \"${config.provider}\". Registered: ${known}.`);\n }\n if (!config.apiKey) {\n throw new Error(`${descriptor.envVar} is required for skill runtime`);\n }\n return descriptor.createClient({\n apiKey: config.apiKey,\n model: config.model,\n maxTokens: config.maxTokens,\n logUsage: config.logUsage,\n });\n}\n\n/**\n * Verify that an LLM API key is accepted by the provider before the agent\n * publishes capabilities. Delegates to the descriptor's `verifyKey`.\n *\n * Cheap probe (Anthropic/OpenAI `/v1/models`) - validates the key is\n * accepted but does NOT detect billing exhaustion. Use this for UI\n * commands like `profile` or `init` where biller status is irrelevant;\n * use `verifyLlmApiKeyDeep` for authoritative checks (startup, runtime\n * preflight, heartbeat).\n */\nexport async function verifyLlmApiKey(\n provider: LlmProvider,\n apiKey: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n return {\n ok: false,\n reason: 'unavailable',\n error: `Unknown LLM provider \"${provider}\"`,\n };\n }\n return descriptor.verifyKey(apiKey, signal);\n}\n\n/**\n * Authoritative probe that consumes a single billing token to verify the\n * key is both valid AND has credits available for the requested model.\n * Costs ~$0.00001 on Haiku 4.5; negligible at startup and 5-min\n * heartbeat cadences.\n */\nexport async function verifyLlmApiKeyDeep(\n provider: LlmProvider,\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n return {\n ok: false,\n reason: 'unavailable',\n error: `Unknown LLM provider \"${provider}\"`,\n };\n }\n return descriptor.verifyKeyDeep(apiKey, model, signal);\n}\n","/**\n * Init command - create a new agent.\n *\n * Usage:\n * elisym init [name] Interactive wizard; creates in ~/.elisym/<name>/.\n * elisym init [name] --config <path> Non-interactive; loads YAML template.\n * elisym init [name] --defaults Non-interactive; uses the same defaults the\n * wizard would have suggested (description =\n * \"An elisym AI agent\", default relays, no\n * payments, no LLM, no encryption). Combine with\n * --local / --passphrase to override pieces.\n * elisym init [name] --local Create in project <project>/.elisym/<name>/.\n * elisym init [name] --passphrase <p> Skip passphrase prompt (\"\" = no encryption).\n * elisym init [name] --yes Skip overwrite/shadow confirm prompts.\n */\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { validateAgentName, RELAYS } from '@elisym/sdk';\nimport {\n ElisymYamlSchema,\n createAgentDir,\n resolveInHome,\n resolveInProject,\n writeExampleSkillTemplate,\n writeSecrets,\n writeYamlInitial,\n type AgentSource,\n type ElisymYaml,\n} from '@elisym/sdk/agent-store';\nimport { isAddress } from '@solana/kit';\nimport { generateSecretKey, getPublicKey, nip19 } from 'nostr-tools';\nimport YAML from 'yaml';\nimport { getLlmProvider, listLlmProviders } from '../llm';\n\nexport interface InitOptions {\n config?: string;\n defaults?: boolean;\n local?: boolean;\n passphrase?: string;\n yes?: boolean;\n}\n\nfunction buildDefaultYaml(): ElisymYaml {\n return ElisymYamlSchema.parse({\n description: 'An elisym AI agent',\n relays: [...RELAYS],\n payments: [],\n security: {},\n });\n}\n\n/**\n * Delegate to the descriptor's `fetchModels`. Returns `[]` if the\n * provider id is not registered (defensive - in practice the caller\n * only passes ids it pulled from the same registry). Falls back to the\n * descriptor's `fallbackModels` when the live `fetchModels` call throws.\n */\nexport async function fetchModels(provider: string, apiKey: string): Promise<string[]> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n console.warn(` ! Unknown provider \"${provider}\". No models available.`);\n return [];\n }\n try {\n return await descriptor.fetchModels(apiKey);\n } catch (e: any) {\n console.warn(` ! Could not fetch models: ${e.message}. Using defaults.`);\n return descriptor.fallbackModels;\n }\n}\n\nfunction pickTarget(options: InitOptions): AgentSource {\n return options.local ? 'project' : 'home';\n}\n\nexport async function cmdInit(nameArg?: string, options: InitOptions = {}): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n const cwd = process.cwd();\n\n console.log('\\n elisym agent setup\\n');\n\n if (options.config && options.defaults) {\n throw new Error('--config and --defaults are mutually exclusive; pick one.');\n }\n\n // --defaults means \"no prompts\" - imply --yes for shadow/overwrite confirms.\n const skipConfirms = options.yes || options.defaults;\n\n // Step 1: YAML template (optional) - from --config file or --defaults skeleton.\n let template: ElisymYaml | undefined;\n if (options.config) {\n const configPath = resolve(cwd, options.config);\n const raw = readFileSync(configPath, 'utf-8');\n template = ElisymYamlSchema.parse(YAML.parse(raw) ?? {});\n console.log(` Loaded template from ${configPath}\\n`);\n } else if (options.defaults) {\n template = buildDefaultYaml();\n console.log(' Using default skeleton (no LLM, no payments). Edit later via `profile`.\\n');\n }\n\n // Step 2: Agent name (arg > prompt).\n const agentName = await resolveAgentName(nameArg, inquirer);\n\n // Step 3: Shadow / overwrite checks. With --yes, overwrite fails closed\n // (never silently clobber secrets) while shadow / sibling-location prompts\n // take their recommended default.\n const target = pickTarget(options);\n const sameLocation =\n target === 'home' ? resolveInHome(agentName) : resolveInProject(agentName, cwd);\n if (sameLocation) {\n if (skipConfirms) {\n throw new Error(\n `Agent \"${agentName}\" already exists at ${sameLocation}. Refusing to overwrite secrets under --yes/--defaults. Remove the directory first or choose a different name.`,\n );\n }\n const { overwrite } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'overwrite',\n message: `Agent \"${agentName}\" already exists at ${sameLocation}. Overwrite secrets?`,\n default: false,\n },\n ]);\n if (!overwrite) {\n console.log('Aborted.');\n return;\n }\n } else if (target === 'project' && resolveInHome(agentName)) {\n if (!skipConfirms) {\n const { shadow } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shadow',\n message: `A global agent \"${agentName}\" exists in ~/.elisym/${agentName}/. Create a project-local shadow?`,\n default: true,\n },\n ]);\n if (!shadow) {\n console.log('Aborted.');\n return;\n }\n }\n } else if (target === 'home' && resolveInProject(agentName, cwd)) {\n if (!skipConfirms) {\n const { proceed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'proceed',\n message: `A project-local agent \"${agentName}\" exists. Create a global agent with the same name?`,\n default: true,\n },\n ]);\n if (!proceed) {\n console.log('Aborted.');\n return;\n }\n }\n }\n\n // Step 4: Build YAML. If a template was loaded, reuse it; otherwise prompt\n // interactively. promptYaml also returns the API key it collected so we\n // don't re-prompt in Step 5.\n let yaml: ElisymYaml;\n let promptedApiKey: string | undefined;\n if (template) {\n yaml = template;\n } else {\n const result = await promptYaml(inquirer);\n yaml = result.yaml;\n promptedApiKey = result.apiKey;\n }\n\n // Step 5: LLM API key for the default provider (from env, then reuse\n // prompt-collected key, else prompt). Provider labels and env var\n // names come from the descriptor.\n let defaultProviderKey: string | undefined;\n const defaultProviderId = yaml.llm?.provider;\n if (yaml.llm && defaultProviderId) {\n const descriptor = getLlmProvider(defaultProviderId);\n const envKey = descriptor ? process.env[descriptor.envVar] : undefined;\n if (envKey && descriptor) {\n defaultProviderKey = envKey;\n console.log(` Using ${descriptor.envVar} from environment.`);\n } else if (promptedApiKey) {\n defaultProviderKey = promptedApiKey;\n } else {\n const label = descriptor?.displayName ?? defaultProviderId;\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${label} API key:`,\n mask: '*',\n },\n ]);\n defaultProviderKey = apiKey || undefined;\n }\n }\n\n // Step 5b: Optional API keys for OTHER registered providers - used by\n // skills that declare a `provider:` override in their SKILL.md. Skipped\n // when running from a YAML template (non-interactive); operators can\n // supply per-provider keys via env vars or by editing `.secrets.json`.\n const otherProviderKeys = new Map<string, string>();\n if (yaml.llm && !template && defaultProviderId) {\n const otherDescriptors = listLlmProviders().filter(\n (descriptor) => descriptor.id !== defaultProviderId,\n );\n for (const descriptor of otherDescriptors) {\n const otherEnvKey = process.env[descriptor.envVar];\n const { configureOther } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'configureOther',\n message: `Configure ${descriptor.displayName} API key too (for skills that override the default provider)?`,\n default: Boolean(otherEnvKey),\n },\n ]);\n if (!configureOther) {\n continue;\n }\n if (otherEnvKey) {\n otherProviderKeys.set(descriptor.id, otherEnvKey);\n console.log(` Using ${descriptor.envVar} from environment.`);\n } else {\n const { promptedOther } = await inquirer.prompt([\n {\n type: 'password',\n name: 'promptedOther',\n message: `${descriptor.displayName} API key:`,\n mask: '*',\n },\n ]);\n if (promptedOther) {\n otherProviderKeys.set(descriptor.id, promptedOther);\n }\n }\n }\n }\n\n // Step 6: Passphrase for encrypting secrets. Flag wins over env var wins\n // over interactive prompt. Empty string (\"\") is an explicit opt-out from\n // encryption, distinct from \"flag not provided\". --defaults implies no\n // encryption when neither flag nor env is set.\n let passphrase = '';\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n if (options.passphrase !== undefined) {\n passphrase = options.passphrase;\n } else if (envPassphrase !== undefined) {\n passphrase = envPassphrase;\n } else if (options.defaults) {\n passphrase = '';\n } else {\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'passphrase',\n message: 'Passphrase to encrypt secrets (leave empty to skip):',\n mask: '*',\n },\n ]);\n passphrase = answer.passphrase ?? '';\n if (passphrase) {\n const { confirmPassphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'confirmPassphrase',\n message: 'Confirm passphrase:',\n mask: '*',\n validate: (value: string) => value === passphrase || 'Passphrases do not match',\n },\n ]);\n void confirmPassphrase;\n }\n }\n\n // Step 7: Generate Nostr identity.\n const nostrSecretBytes = generateSecretKey();\n const nostrPubkey = getPublicKey(nostrSecretBytes);\n const nostrSecretHex = Buffer.from(nostrSecretBytes).toString('hex');\n\n // Step 8: Create agent directory + write files. Each provider's key\n // lands in `secrets.llm_api_keys[<provider-id>]`; the start-time\n // resolver reads them directly (or falls back to the matching env\n // var via the descriptor).\n const created = await createAgentDir({ target, name: agentName, cwd });\n const collectedKeys = new Map<string, string>(otherProviderKeys);\n if (yaml.llm && defaultProviderKey) {\n collectedKeys.set(yaml.llm.provider, defaultProviderKey);\n }\n const llmApiKeys = Object.fromEntries(collectedKeys);\n await writeYamlInitial(created.dir, yaml);\n await writeExampleSkillTemplate(created.dir);\n await writeSecrets(\n created.dir,\n {\n nostr_secret_key: nostrSecretHex,\n llm_api_keys: Object.keys(llmApiKeys).length > 0 ? llmApiKeys : undefined,\n },\n passphrase || undefined,\n );\n\n const npub = nip19.npubEncode(nostrPubkey);\n console.log(`\\n Agent \"${agentName}\" created (${target}).`);\n console.log(` Location: ${created.dir}`);\n console.log(` Nostr: ${npub}`);\n if (yaml.payments[0]?.address) {\n console.log(` Solana: ${yaml.payments[0].address}`);\n }\n if (passphrase) {\n console.log(' Secrets encrypted with your passphrase.');\n }\n console.log();\n}\n\nasync function resolveAgentName(\n nameArg: string | undefined,\n inquirer: { prompt: any },\n): Promise<string> {\n if (nameArg) {\n validateAgentName(nameArg);\n return nameArg;\n }\n const { inputName } = await inquirer.prompt([\n {\n type: 'input',\n name: 'inputName',\n message: 'Agent name:',\n validate: (value: string) => {\n try {\n validateAgentName(value);\n return true;\n } catch (e: any) {\n return e.message;\n }\n },\n },\n ]);\n validateAgentName(inputName);\n return inputName;\n}\n\nasync function promptYaml(inquirer: {\n prompt: any;\n}): Promise<{ yaml: ElisymYaml; apiKey?: string }> {\n const { description } = await inquirer.prompt([\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: 'An elisym AI agent',\n },\n ]);\n\n const { displayName } = await inquirer.prompt([\n {\n type: 'input',\n name: 'displayName',\n message: 'Display name (optional, for UI):',\n default: '',\n },\n ]);\n\n const { picture } = await inquirer.prompt([\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar file (relative to agent dir, e.g. ./avatar.png) or URL:',\n default: '',\n },\n ]);\n\n const { banner } = await inquirer.prompt([\n {\n type: 'input',\n name: 'banner',\n message: 'Banner file (relative to agent dir, e.g. ./header.png) or URL:',\n default: '',\n },\n ]);\n\n const { solanaAddress } = await inquirer.prompt([\n {\n type: 'input',\n name: 'solanaAddress',\n message: 'Solana address for receiving payments (leave empty to skip):',\n default: '',\n validate: (value: string) => {\n if (!value) {\n return true;\n }\n return isAddress(value) || 'Invalid Solana address';\n },\n },\n ]);\n\n if (solanaAddress) {\n console.log(\n ' The wallet receives every asset on Solana (SOL directly, USDC and other\\n' +\n ' SPL tokens via their ATA). Each skill declares its own price and token\\n' +\n ' in SKILL.md. Fund with SOL via `solana airdrop` or USDC via https://faucet.circle.com.',\n );\n }\n\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n {\n name: 'None (non-LLM agent - static-file / static-script / dynamic-script only)',\n value: 'none',\n },\n ...listLlmProviders().map((descriptor) => ({\n name: descriptor.displayName,\n value: descriptor.id,\n })),\n ],\n },\n ]);\n\n const baseYaml = {\n display_name: displayName || undefined,\n description,\n picture: picture || undefined,\n banner: banner || undefined,\n relays: [...RELAYS],\n payments: solanaAddress ? [{ chain: 'solana', network: 'devnet', address: solanaAddress }] : [],\n security: {},\n };\n\n if (llmProvider === 'none') {\n const yaml: ElisymYaml = ElisymYamlSchema.parse(baseYaml);\n return { yaml };\n }\n\n const descriptor = getLlmProvider(llmProvider);\n if (!descriptor) {\n throw new Error(`Internal: provider \"${llmProvider}\" not registered.`);\n }\n const envKey = process.env[descriptor.envVar];\n let apiKey: string | undefined = envKey;\n if (!apiKey) {\n const { promptedKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'promptedKey',\n message: `${descriptor.displayName} API key:`,\n mask: '*',\n },\n ]);\n apiKey = promptedKey || undefined;\n }\n\n console.log(' Fetching available models...');\n const models = await fetchModels(llmProvider, apiKey ?? '');\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n },\n ]);\n\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: 4096,\n },\n ]);\n\n const yaml: ElisymYaml = ElisymYamlSchema.parse({\n ...baseYaml,\n llm: { provider: llmProvider, model, max_tokens: maxTokens },\n });\n // envKey is returned only when the user explicitly typed it (not when\n // pulled from process.env) - the env-var path is handled in cmdInit Step 5.\n return { yaml, apiKey: envKey ? undefined : apiKey };\n}\n","import { ElisymIdentity } from '@elisym/sdk';\nimport { listAgents, loadAgent } from '@elisym/sdk/agent-store';\n/**\n * elisym CLI - agent runner for the elisym network.\n *\n * Commands:\n * elisym init [name] [--config <path>] [--defaults] [--local] Create a new agent\n * elisym start [name] Start agent in provider mode\n * elisym list List all agents\n * elisym profile [name] Edit agent profile\n * elisym wallet [name] Show wallet balance\n */\nprocess.removeAllListeners('warning');\nimport { Command } from 'commander';\nimport { nip19 } from 'nostr-tools';\nimport { cmdInit, type InitOptions } from './commands/init.js';\nimport { cmdProfile } from './commands/profile.js';\nimport { cmdStart } from './commands/start.js';\nimport { cmdWallet } from './commands/wallet.js';\nimport { PACKAGE_VERSION } from './version.js';\n\n/**\n * Wrap an action handler so any thrown Error surfaces as a single clean line\n * with exit 1 instead of an unhandled-rejection stack trace.\n */\nfunction safe<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T): Promise<void> => {\n try {\n await fn(...args);\n } catch (e) {\n console.error(`Error: ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n };\n}\n\nconst program = new Command()\n .name('elisym')\n .description('CLI agent runner for the elisym network')\n .version(PACKAGE_VERSION);\n\n// Init\nprogram\n .command('init [name]')\n .description('Create a new agent')\n .option('-c, --config <path>', 'Load fields from an elisym.yaml template (non-interactive)')\n .option(\n '--defaults',\n 'Skip every prompt and use the same defaults the wizard would have suggested (description, default relays, no payments, no LLM, no encryption). Mutually exclusive with --config.',\n )\n .option('--local', 'Create in project <project>/.elisym/<name>/ (default: ~/.elisym/<name>/)')\n .option(\n '--passphrase <value>',\n 'Passphrase to encrypt secrets at rest. Empty string (\"\") skips encryption. Also reads ELISYM_PASSPHRASE env var. When neither is provided, prompts interactively.',\n )\n .option(\n '--yes',\n 'Skip confirmation prompts (shadow/sibling-location). Fails closed on an existing agent at the same location - never overwrites secrets silently.',\n )\n .action(\n safe(async (name: string | undefined, options: InitOptions) => {\n await cmdInit(name, options);\n }),\n );\n\n// Profile\nprogram\n .command('profile [name]')\n .description('Edit agent profile, wallet, and LLM settings')\n .action(safe(cmdProfile));\n\n// Start\nprogram\n .command('start [name]')\n .description('Start agent in provider mode')\n .option(\n '-v, --verbose',\n 'Enable debug logging (relay lifecycle, publish acks, subscription EOSE). Also togglable via ELISYM_DEBUG=1 or LOG_LEVEL=debug.',\n )\n .action(\n safe(async (name: string | undefined, options: { verbose?: boolean }) => {\n await cmdStart(name, options);\n }),\n );\n\n// List\nprogram\n .command('list')\n .description('List all agents (project-local and home-global)')\n .action(\n safe(async () => {\n const cwd = process.cwd();\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.log('No agents found. Run `npx @elisym/cli init` to create one.');\n return;\n }\n console.log('\\nAgents:');\n for (const agent of agents) {\n try {\n const loaded = await loadAgent(agent.name, cwd);\n const identity = ElisymIdentity.fromHex(loaded.secrets.nostr_secret_key);\n const npub = nip19.npubEncode(identity.publicKey);\n const solAddr = loaded.yaml.payments[0]?.address\n ? ` | Solana: ${loaded.yaml.payments[0].address}`\n : '';\n const shadow = agent.shadowsGlobal ? ' [shadows global]' : '';\n console.log(` ${agent.name} (${agent.source})${shadow} | ${npub}${solAddr}`);\n } catch (e: any) {\n const hint = /encrypted secrets/i.test(e?.message ?? '') ? ' (encrypted)' : '';\n console.log(` ${agent.name} (${agent.source})${hint}`);\n }\n }\n console.log();\n }),\n );\n\n// Wallet\nprogram.command('wallet [name]').description('Show wallet balance').action(safe(cmdWallet));\n\nprogram.parse();\n","import {\n listAgents,\n loadAgent,\n writeSecrets,\n writeYaml,\n type ElisymYaml,\n type LlmEntry,\n type Secrets,\n} from '@elisym/sdk/agent-store';\n/**\n * Profile command - edit agent profile, wallet, and LLM settings.\n * Writes back to elisym.yaml (public) and .secrets.json (private).\n */\nimport { isAddress } from '@solana/kit';\nimport { getLlmProvider, listLlmProviders } from '../llm';\n\nexport async function cmdProfile(name: string | undefined): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n const cwd = process.cwd();\n\n if (!name) {\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.error('No agents found. Run `npx @elisym/cli init` first.');\n process.exit(1);\n }\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Select agent:',\n choices: agents.map((agent) => ({\n name: `${agent.name} (${agent.source})`,\n value: agent.name,\n })),\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const loaded = await loadAgent(name!, cwd, passphrase);\n\n console.log(`\\n Editing agent \"${name}\" (${loaded.source})\\n`);\n\n let done = false;\n while (!done) {\n const { section } = await inquirer.prompt([\n {\n type: 'list',\n name: 'section',\n message: 'What to edit?',\n choices: [\n {\n name: `Profile (description: ${truncate(loaded.yaml.description ?? '')})`,\n value: 'profile',\n },\n {\n name: `Wallet (${loaded.yaml.payments[0]?.address ?? 'not configured'})`,\n value: 'wallet',\n },\n {\n name: `LLM (${loaded.yaml.llm?.provider ?? 'not configured'} / ${loaded.yaml.llm?.model ?? '-'})`,\n value: 'llm',\n },\n { name: 'Done', value: 'done' },\n ],\n },\n ]);\n\n if (section === 'done') {\n done = true;\n continue;\n }\n\n if (section === 'profile') {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'displayName',\n message: 'Display name (for UI):',\n default: loaded.yaml.display_name ?? '',\n },\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: loaded.yaml.description ?? '',\n },\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar (relative path or URL, empty to clear):',\n default: loaded.yaml.picture ?? '',\n },\n {\n type: 'input',\n name: 'banner',\n message: 'Banner (relative path or URL, empty to clear):',\n default: loaded.yaml.banner ?? '',\n },\n ]);\n\n const nextYaml: ElisymYaml = {\n ...loaded.yaml,\n display_name: answers.displayName || undefined,\n description: answers.description ?? '',\n picture: answers.picture || undefined,\n banner: answers.banner || undefined,\n };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n console.log(' Profile updated.\\n');\n }\n\n if (section === 'wallet') {\n const current = loaded.yaml.payments[0];\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Solana address (empty to clear):',\n default: current?.address ?? '',\n validate: (value: string) => {\n if (!value) {\n return true;\n }\n return isAddress(value) || 'Invalid Solana address';\n },\n },\n ]);\n\n const nextYaml: ElisymYaml = {\n ...loaded.yaml,\n payments: answers.address\n ? [{ chain: 'solana', network: 'devnet', address: answers.address }]\n : [],\n };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n console.log(' Wallet updated.\\n');\n }\n\n if (section === 'llm') {\n const providerChoices = listLlmProviders().map((descriptor) => ({\n name: descriptor.displayName,\n value: descriptor.id,\n }));\n if (providerChoices.length === 0) {\n console.error(' ! No LLM providers registered.');\n continue;\n }\n const firstChoice = providerChoices[0];\n if (!firstChoice) {\n console.error(' ! No LLM providers registered.');\n continue;\n }\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'Default LLM provider (used by skills without a `provider:` override):',\n choices: providerChoices,\n default: loaded.yaml.llm?.provider ?? firstChoice.value,\n },\n ]);\n const defaultDescriptor = getLlmProvider(llmProvider);\n if (!defaultDescriptor) {\n throw new Error(`Internal: provider \"${llmProvider}\" not registered.`);\n }\n\n const defaultKeyStatus = describeKeyStatus(loaded.secrets, llmProvider);\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${defaultDescriptor.displayName} API key [${defaultKeyStatus}] (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n\n const probeKey = apiKey || pickPlainKey(loaded.secrets, llmProvider);\n\n console.log(' Fetching available models...');\n const { fetchModels } = await import('./init.js');\n const models = await fetchModels(llmProvider, probeKey);\n\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n default: loaded.yaml.llm?.model,\n },\n ]);\n\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: loaded.yaml.llm?.max_tokens ?? 4096,\n },\n ]);\n\n // Optional keys for OTHER registered providers (used by skills\n // that override the default provider in their SKILL.md).\n const otherDescriptors = listLlmProviders().filter(\n (descriptor) => descriptor.id !== llmProvider,\n );\n const otherKeys = new Map<string, string>();\n for (const descriptor of otherDescriptors) {\n const status = describeKeyStatus(loaded.secrets, descriptor.id);\n const { otherApiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'otherApiKey',\n message: `${descriptor.displayName} API key for skill overrides [${status}] (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n if (otherApiKey) {\n otherKeys.set(descriptor.id, otherApiKey);\n }\n }\n\n const nextLlm: LlmEntry = { provider: llmProvider, model, max_tokens: maxTokens };\n const nextYaml: ElisymYaml = { ...loaded.yaml, llm: nextLlm };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n\n if (apiKey || otherKeys.size > 0) {\n const nextLlmApiKeys: Record<string, string> = {\n ...(loaded.secrets.llm_api_keys ?? {}),\n };\n if (apiKey) {\n nextLlmApiKeys[llmProvider] = apiKey;\n }\n for (const [providerId, key] of otherKeys) {\n nextLlmApiKeys[providerId] = key;\n }\n const nextSecrets: Secrets = {\n ...loaded.secrets,\n llm_api_keys: nextLlmApiKeys,\n };\n await writeSecrets(loaded.dir, nextSecrets, passphrase);\n loaded.secrets = nextSecrets;\n }\n console.log(' LLM updated.\\n');\n }\n }\n\n console.log(` Agent \"${name}\" saved.\\n`);\n}\n\nfunction truncate(value: string, max = 40): string {\n if (value.length <= max) {\n return value;\n }\n return value.slice(0, max - 1) + '…';\n}\n\n/** Status hint shown next to the API-key prompt so the user knows what's stored. */\nfunction describeKeyStatus(secrets: Secrets, providerId: string): string {\n return secrets.llm_api_keys?.[providerId] ? 'set' : 'not set';\n}\n\n/** Pick the stored key for model probing. `loaded.secrets` is post-decrypt, so values are plaintext. */\nfunction pickPlainKey(secrets: Secrets, providerId: string): string {\n const value = secrets.llm_api_keys?.[providerId];\n return typeof value === 'string' ? value : '';\n}\n","/**\n * Opt-in relay diagnostics. Resolves each relay hostname via DNS and\n * opens a TCP probe to the relay port. Activated by `ELISYM_NET_DIAG=1`\n * so operators can separately diagnose \"WSS fails but everything else\n * looks fine\" scenarios common on WSL, Docker, or corporate firewalls.\n *\n * Never called on a hot path - one-shot at startup.\n */\nimport { lookup } from 'node:dns/promises';\nimport { Socket } from 'node:net';\nimport type { Logger } from 'pino';\n\nconst TCP_PROBE_TIMEOUT_MS = 3_000;\n\nexport interface RelayProbeResult {\n url: string;\n host: string;\n port: number;\n ips: string[];\n tcpOpenMs?: number;\n error?: string;\n}\n\nfunction parseRelayUrl(url: string): { host: string; port: number } | null {\n try {\n const parsed = new URL(url);\n const isSecure = parsed.protocol === 'wss:' || parsed.protocol === 'https:';\n const defaultPort = isSecure ? 443 : 80;\n const port = parsed.port.length > 0 ? parseInt(parsed.port, 10) : defaultPort;\n if (!Number.isFinite(port)) {\n return null;\n }\n return { host: parsed.hostname, port };\n } catch {\n return null;\n }\n}\n\nasync function tcpProbe(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<{ openMs: number } | { error: string }> {\n return new Promise((resolve) => {\n const started = Date.now();\n const socket = new Socket();\n let settled = false;\n\n const finish = (result: { openMs: number } | { error: string }): void => {\n if (settled) {\n return;\n }\n settled = true;\n socket.destroy();\n resolve(result);\n };\n\n const timer = setTimeout(() => finish({ error: 'timeout' }), timeoutMs);\n\n socket.once('connect', () => {\n clearTimeout(timer);\n finish({ openMs: Date.now() - started });\n });\n socket.once('error', (err) => {\n clearTimeout(timer);\n finish({ error: err.message });\n });\n\n socket.connect(port, host);\n });\n}\n\nexport async function probeRelays(\n relays: string[],\n logger: Logger,\n timeoutMs: number = TCP_PROBE_TIMEOUT_MS,\n): Promise<RelayProbeResult[]> {\n const results: RelayProbeResult[] = [];\n for (const url of relays) {\n const parsed = parseRelayUrl(url);\n if (!parsed) {\n logger.debug({ event: 'net_diag_parse_failed', url }, 'unparseable relay URL');\n results.push({ url, host: '', port: 0, ips: [], error: 'invalid URL' });\n continue;\n }\n const { host, port } = parsed;\n let ips: string[] = [];\n try {\n const resolved = await lookup(host, { all: true });\n ips = resolved.map((entry) => entry.address);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(\n { event: 'net_diag_dns_failed', url, host, error: message },\n 'DNS lookup failed',\n );\n results.push({ url, host, port, ips: [], error: `dns: ${message}` });\n continue;\n }\n\n const probe = await tcpProbe(host, port, timeoutMs);\n if ('openMs' in probe) {\n logger.debug(\n { event: 'net_diag_tcp_open', url, host, port, ips, tcpOpenMs: probe.openMs },\n 'TCP open',\n );\n results.push({ url, host, port, ips, tcpOpenMs: probe.openMs });\n } else {\n logger.debug(\n { event: 'net_diag_tcp_failed', url, host, port, ips, error: probe.error },\n 'TCP probe failed',\n );\n results.push({ url, host, port, ips, error: `tcp: ${probe.error}` });\n }\n }\n return results;\n}\n","/**\n * Shared CLI helpers - RPC URLs, SOL formatting, price validation.\n */\nimport { USDC_SOLANA_DEVNET, calculateProtocolFee } from '@elisym/sdk';\nimport { type Rpc, type SolanaRpcApi, address } from '@solana/kit';\n\n// --- Constants ---\n\nexport const RENT_EXEMPT_MINIMUM = 890_880; // lamports\nexport const MAX_CONCURRENT_JOBS = 10;\nexport const RECOVERY_MAX_RETRIES = 5;\nexport const RECOVERY_INTERVAL_SECS = 60;\nexport const WATCHDOG_PROBE_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\nexport const WATCHDOG_PROBE_TIMEOUT_MS = 10_000;\nexport const WATCHDOG_SELF_PING_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes\nexport const WATCHDOG_SELF_PING_TIMEOUT_MS = 15_000;\n/**\n * If a watchdog tick fires after a wall-clock gap larger than the smaller of\n * its two intervals multiplied by this factor, the gap is treated as host\n * suspension (macOS sleep, hibernation, container pause) rather than normal\n * scheduling jitter. Both `setInterval` callbacks freeze during OS sleep and\n * fire late on resume; the tick that detects the gap forces an immediate pool\n * reset instead of running the regular probe/self-ping (which would race\n * against still-half-dead WebSocket state).\n */\nexport const WATCHDOG_SLEEP_DETECT_MULTIPLIER = 2;\n\n// --- Solana RPC ---\n\nexport function getRpcUrl(_network: string): string {\n const envUrl = process.env.SOLANA_RPC_URL;\n if (envUrl) {\n return envUrl;\n }\n // Only devnet is supported until the elisym-config program ships on mainnet.\n return 'https://api.devnet.solana.com';\n}\n\n// --- SOL formatting (number only, no \" SOL\" suffix - use SDK's formatSol for display) ---\n\nexport function formatLamports(lamports: number): string {\n const whole = Math.floor(lamports / 1_000_000_000);\n const frac = lamports % 1_000_000_000;\n return `${whole}.${String(frac).padStart(9, '0')}`;\n}\n\n// --- SOL parsing ---\n\nexport function parseSolToLamports(s: string): number | null {\n const trimmed = s.trim();\n if (!trimmed) {\n return null;\n }\n\n const dotPos = trimmed.indexOf('.');\n if (dotPos === -1) {\n const whole = parseInt(trimmed, 10);\n if (isNaN(whole) || whole < 0) {\n return null;\n }\n return whole * 1_000_000_000;\n }\n\n const wholePart = dotPos === 0 ? 0 : parseInt(trimmed.slice(0, dotPos), 10);\n if (isNaN(wholePart)) {\n return null;\n }\n\n const fracStr = trimmed.slice(dotPos + 1);\n if (fracStr.length === 0 || fracStr.length > 9) {\n return null;\n }\n\n const padded = fracStr.padEnd(9, '0');\n const frac = parseInt(padded, 10);\n if (isNaN(frac)) {\n return null;\n }\n\n return wholePart * 1_000_000_000 + frac;\n}\n\n// --- USDC balance ---\n\n/**\n * Sum the agent's USDC token-account balances (raw subunits) on the connected\n * Solana RPC. Returns 0n on any error or when the asset has no mint configured;\n * callers display \"0 USDC\" rather than failing the whole banner.\n */\nexport async function fetchUsdcBalance(\n rpc: Rpc<SolanaRpcApi>,\n owner: ReturnType<typeof address>,\n): Promise<bigint> {\n const mint = USDC_SOLANA_DEVNET.mint;\n if (!mint) {\n return 0n;\n }\n try {\n const response = await rpc\n .getTokenAccountsByOwner(\n owner,\n { mint: address(mint) },\n { encoding: 'jsonParsed', commitment: 'confirmed' },\n )\n .send();\n let total = 0n;\n for (const entry of response.value) {\n const parsed = entry.account.data as\n | { parsed?: { info?: { tokenAmount?: { amount?: string } } } }\n | undefined;\n const raw = parsed?.parsed?.info?.tokenAmount?.amount;\n if (typeof raw === 'string') {\n total += BigInt(raw);\n }\n }\n return total;\n } catch {\n return 0n;\n }\n}\n\n// --- Price validation ---\n\nexport function validateJobPrice(\n lamports: number,\n accountFunded: boolean,\n feeBps: number,\n): string | null {\n if (lamports === 0) {\n return null;\n }\n const fee = calculateProtocolFee(lamports, feeBps);\n const providerNet = lamports - fee;\n if (!accountFunded && providerNet < RENT_EXEMPT_MINIMUM) {\n const pct = (feeBps / 100).toFixed(2);\n return (\n `Price too low. After ${pct}% fee, provider receives ${providerNet} lamports, ` +\n `which is below rent-exempt minimum (${RENT_EXEMPT_MINIMUM}). Increase price or fund wallet first.`\n );\n }\n return null;\n}\n","/**\n * Job recovery ledger - persistent JSON storage for crash recovery.\n */\nimport { readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nexport type LedgerStatus = 'paid' | 'executed' | 'delivered' | 'failed';\n\nexport interface LedgerEntry {\n job_id: string;\n status: LedgerStatus;\n input: string;\n input_type: string;\n tags: string[];\n customer_id: string;\n bid?: number;\n payment_request?: string;\n net_amount?: number;\n result?: string;\n raw_event_json?: string;\n created_at: number;\n retry_count: number;\n}\n\nconst VALID_TRANSITIONS: Record<LedgerStatus, LedgerStatus[]> = {\n paid: ['executed', 'failed'],\n executed: ['delivered', 'failed'],\n delivered: [],\n failed: [],\n};\n\nexport class JobLedger {\n private entries = new Map<string, LedgerEntry>();\n private path: string;\n\n /**\n * @param ledgerPath absolute path to the ledger file\n * (typically `<agentDir>/.jobs.json`). Caller is responsible for\n * resolving the agent directory via `@elisym/sdk/agent-store`.\n */\n constructor(ledgerPath: string) {\n this.path = ledgerPath;\n this.load();\n }\n\n private load(): void {\n try {\n const raw = readFileSync(this.path, 'utf-8');\n const data = JSON.parse(raw) as Record<string, LedgerEntry>;\n for (const [id, entry] of Object.entries(data)) {\n this.entries.set(id, entry);\n }\n } catch (e: any) {\n // W4: Log warning on malformed ledger and backup corrupt file\n if (e?.code !== 'ENOENT') {\n console.warn(` ! Ledger load warning: ${e?.message ?? 'unknown error'}`);\n try {\n renameSync(this.path, this.path + '.corrupt.' + Date.now());\n } catch {\n /* best effort backup */\n }\n }\n }\n }\n\n flush(): void {\n const dir = dirname(this.path);\n mkdirSync(dir, { recursive: true });\n const obj = Object.fromEntries(this.entries);\n const tmp = this.path + '.tmp';\n writeFileSync(tmp, JSON.stringify(obj, null, 2));\n renameSync(tmp, this.path);\n }\n\n recordPaid(entry: Omit<LedgerEntry, 'status' | 'retry_count'>): void {\n if (this.entries.has(entry.job_id)) {\n return;\n }\n this.entries.set(entry.job_id, { ...entry, status: 'paid', retry_count: 0 });\n this.flush();\n }\n\n updatePayment(jobId: string, netAmount?: number, paymentRequest?: string): void {\n const entry = this.entries.get(jobId);\n if (entry) {\n if (netAmount !== undefined) {\n entry.net_amount = netAmount;\n }\n if (paymentRequest !== undefined) {\n entry.payment_request = paymentRequest;\n }\n this.flush();\n }\n }\n\n /** Attempt a state transition. Returns the entry if valid, undefined otherwise. */\n private transition(jobId: string, to: LedgerStatus): LedgerEntry | undefined {\n const entry = this.entries.get(jobId);\n if (!entry) {\n return undefined;\n }\n if (!VALID_TRANSITIONS[entry.status].includes(to)) {\n return undefined;\n }\n entry.status = to;\n return entry;\n }\n\n markExecuted(jobId: string, result: string): void {\n const entry = this.transition(jobId, 'executed');\n if (entry) {\n entry.result = result;\n this.flush();\n }\n }\n\n markDelivered(jobId: string): void {\n const entry = this.transition(jobId, 'delivered');\n if (entry) {\n entry.result = undefined; // Free memory\n this.flush();\n }\n }\n\n markFailed(jobId: string): void {\n const entry = this.transition(jobId, 'failed');\n if (entry) {\n entry.result = undefined; // Free memory\n try {\n this.flush();\n } catch {\n /* disk full - in-memory state is still correct */\n }\n }\n }\n\n incrementRetry(jobId: string): void {\n const entry = this.entries.get(jobId);\n if (entry) {\n entry.retry_count++;\n this.flush();\n }\n }\n\n getStatus(jobId: string): LedgerStatus | undefined {\n return this.entries.get(jobId)?.status;\n }\n\n pendingJobs(): LedgerEntry[] {\n return [...this.entries.values()].filter((e) => e.status === 'paid' || e.status === 'executed');\n }\n\n /** Remove old delivered/failed entries (default: 7 days). */\n gc(maxAgeSecs = 7 * 24 * 60 * 60): void {\n this.pruneOldEntries(maxAgeSecs * 1000);\n }\n\n /**\n * Drop terminal entries (`delivered` / `failed`) whose `created_at`\n * predates `now - retentionMs`. Stuck non-terminal entries are never\n * pruned - recovery keeps retrying them until the retry budget runs\n * out, then they become terminal and are eligible on the next sweep.\n *\n * Returns the number of entries deleted, for observability.\n */\n pruneOldEntries(retentionMs: number): number {\n const cutoff = Math.floor(Date.now() / 1000) - Math.floor(retentionMs / 1000);\n let deleted = 0;\n for (const [id, entry] of this.entries) {\n if (\n (entry.status === 'delivered' || entry.status === 'failed') &&\n entry.created_at < cutoff\n ) {\n this.entries.delete(id);\n deleted += 1;\n }\n }\n if (deleted > 0) {\n this.flush();\n }\n return deleted;\n }\n}\n","/**\n * Start command - run agent in provider mode.\n * Loads all skills from agentDir/skills/, publishes per-capability cards,\n * processes jobs with per-capability pricing, caches uploaded media URLs.\n */\nimport { createHash } from 'node:crypto';\nimport { readFileSync } from 'node:fs';\nimport { basename, join, relative, resolve, sep } from 'node:path';\nimport {\n ElisymClient,\n ElisymIdentity,\n MediaService,\n USDC_SOLANA_DEVNET,\n formatAssetAmount,\n formatSol,\n RELAYS,\n DEFAULTS,\n DEFAULT_KIND_OFFSET,\n jobRequestKind,\n toDTag,\n type CapabilityCard,\n} from '@elisym/sdk';\nimport {\n agentPaths,\n listAgents,\n loadAgent,\n lookupCachedUrl,\n newCacheEntry,\n readMediaCache,\n writeMediaCache,\n type LoadedAgent,\n type MediaCache,\n} from '@elisym/sdk/agent-store';\nimport { LlmHealthMonitor, startLlmRecovery, type HeartbeatHandle } from '@elisym/sdk/llm-health';\nimport { address, createSolanaRpc } from '@solana/kit';\nimport { probeRelays } from '../diagnostics.js';\nimport {\n fetchUsdcBalance,\n getRpcUrl,\n MAX_CONCURRENT_JOBS,\n RECOVERY_MAX_RETRIES,\n RECOVERY_INTERVAL_SECS,\n} from '../helpers.js';\nimport { JobLedger } from '../ledger.js';\nimport {\n createLlmClient,\n getLlmProvider,\n listLlmProviders,\n verifyLlmApiKeyDeep,\n type LlmConfig,\n type LlmProvider,\n} from '../llm';\nimport { cacheKeyFor, resolveTripleForOverride } from '../llm/cache.js';\nimport { resolveProviderApiKey } from '../llm/keys.js';\nimport { resolveSkillLlm, type ResolvedSkillLlm } from '../llm/resolve.js';\nimport { createLogger } from '../logging.js';\nimport { AgentRuntime, type RuntimeConfig } from '../runtime.js';\nimport { SkillRegistry, type SkillContext, type SkillLlmOverride } from '../skill';\nimport type { LlmClient } from '../skill/index.js';\nimport { loadSkillsFromDir } from '../skill/loader.js';\nimport { NostrTransport } from '../transport/nostr.js';\nimport { startWatchdog } from '../watchdog.js';\n\nexport interface StartOptions {\n verbose?: boolean;\n}\n\nexport async function cmdStart(\n nameArg: string | undefined,\n options: StartOptions = {},\n): Promise<void> {\n const cwd = process.cwd();\n\n // -- Step 1: Resolve agent name --\n const agentName = await resolveStartAgentName(nameArg, cwd);\n if (!agentName) {\n return;\n }\n\n // -- Step 2: Load agent (with optional passphrase for encrypted keys) --\n const loaded = await loadAgentWithPrompt(agentName, cwd);\n\n // -- Step 2b: Set up structured logger early so publish / config\n // debug events fire before connectivity is established.\n const verbose =\n options.verbose === true ||\n process.env.ELISYM_DEBUG === '1' ||\n process.env.LOG_LEVEL === 'debug';\n const { logger, logWithIndent } = createLogger({\n verbose,\n tty: Boolean(process.stdout.isTTY),\n });\n\n // -- Step 3: Banner --\n console.log(`\\n Starting agent ${agentName} (${loaded.source})...\\n`);\n if (loaded.shadowsGlobal) {\n console.log(\n ` ! Using project-local ${agentName} (shadows global agent in ~/.elisym/${agentName}/)\\n`,\n );\n }\n if (verbose) {\n console.log(' [debug] Verbose logging enabled. Structured diagnostics -> stderr.');\n }\n\n // -- Step 4: Resolve Solana address and show balance --\n const solPayment = loaded.yaml.payments.find((entry) => entry.chain === 'solana');\n const solanaAddress = solPayment?.address;\n const walletNetwork = solPayment?.network ?? 'devnet';\n\n if (solanaAddress) {\n try {\n const rpcUrl = getRpcUrl(walletNetwork);\n const rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solanaAddress);\n const [{ value: balanceLamports }, usdcBalance] = await Promise.all([\n rpc.getBalance(walletAddress).send(),\n fetchUsdcBalance(rpc, walletAddress),\n ]);\n const balance = Number(balanceLamports);\n\n console.log(' Wallet');\n console.log(` Network ${walletNetwork}`);\n console.log(` Address ${solanaAddress}`);\n if (process.env.SOLANA_RPC_URL) {\n console.log(` RPC ${process.env.SOLANA_RPC_URL} (custom)`);\n }\n console.log(` SOL ${formatSol(balance)} (${balance} lamports)`);\n console.log(` USDC ${formatAssetAmount(USDC_SOLANA_DEVNET, usdcBalance)}`);\n\n if (balance === 0) {\n console.log(' ! Wallet is empty. Get devnet SOL: https://faucet.solana.com');\n }\n console.log();\n } catch (e: any) {\n console.warn(` ! Wallet error: ${e.message}\\n`);\n }\n }\n\n // -- Step 5: Load and register all skills --\n // Skills load before the LLM check so a fully-non-LLM agent can start\n // without an API key. The LLM block below runs only when at least one\n // skill has `mode === 'llm'`.\n //\n // `scriptEnv` propagates decrypted per-provider keys (e.g. ANTHROPIC_API_KEY)\n // into `dynamic-script` / `static-script` subprocesses, so script skills get\n // the same secret access LLM-mode skills already have. Existing process.env\n // values win when no per-agent secret is set, matching the priority used by\n // resolveProviderApiKey for LLM-mode skills.\n const scriptEnv: NodeJS.ProcessEnv = { ...process.env };\n const llmKeys = loaded.secrets.llm_api_keys ?? {};\n for (const descriptor of listLlmProviders()) {\n const secretValue = llmKeys[descriptor.id];\n if (typeof secretValue === 'string' && secretValue.length > 0) {\n scriptEnv[descriptor.envVar] = secretValue;\n }\n }\n const paths = agentPaths(loaded.dir);\n const skillsDir = paths.skills;\n const allSkills = loadSkillsFromDir(skillsDir, { scriptEnv });\n\n if (allSkills.length === 0) {\n console.error(` ! No skills found in ${skillsDir}\\n`);\n console.error(' Create a skill directory with a SKILL.md to get started.');\n console.error(` Example: ${skillsDir}/my-skill/SKILL.md\\n`);\n process.exit(1);\n }\n\n const registry = new SkillRegistry();\n for (const skill of allSkills) {\n registry.register(skill);\n const price =\n skill.priceSubunits > 0\n ? formatAssetAmount(skill.asset, BigInt(skill.priceSubunits))\n : 'free';\n console.log(` * Skill: ${skill.name} [${skill.capabilities.join(', ')}] - ${price}`);\n }\n console.log();\n\n // Validate that paid skills have a Solana address configured.\n const hasPaid = allSkills.some((s) => s.priceSubunits > 0);\n if (hasPaid && !solanaAddress) {\n console.error(\n ' ! Paid skills require a Solana address. Run `npx @elisym/cli profile` to configure.\\n',\n );\n process.exit(1);\n }\n\n // -- Step 6: LLM check (only when at least one skill needs it) --\n // Per-skill LLM resolution. Each `mode: 'llm'` skill resolves to a concrete\n // (provider, model, maxTokens) triple. Agent-level `llm` in elisym.yaml is\n // the fallback for skills that don't override; if every LLM skill overrides,\n // agent-level `llm` may be omitted entirely.\n //\n // Script-mode skills can also declare `provider` + `model` in SKILL.md to\n // register a health-monitor probe for the API key the script uses under\n // the hood. Those skills do NOT need an LlmClient (the script makes its\n // own HTTP calls), but they DO need: an API key resolved + verified at\n // startup, and a (provider, model) pair registered with the health\n // monitor so reactive markUnhealthy + lazy recovery works.\n const llmSkills = allSkills.filter((skill) => skill.mode === 'llm');\n const scriptDepSkills = allSkills.filter(\n (skill) => skill.mode !== 'llm' && skill.llmOverride?.provider && skill.llmOverride?.model,\n );\n // Pairs to register with the health monitor (any mode + declared provider+model).\n // Keyed by `provider::model`; deduplicated across skills so we don't probe\n // the same key twice when several skills share the same LLM dependency.\n const monitorPairs = new Map<string, { provider: LlmProvider; model: string }>();\n // Triples to build LlmClient instances for (mode=llm only).\n const triplesByKey = new Map<string, ResolvedSkillLlm>();\n const dependentSkillsByProvider = new Map<LlmProvider, string[]>();\n let agentDefaultCacheKey: string | undefined;\n const llmClientCache = new Map<string, LlmClient>();\n const healthMonitor = new LlmHealthMonitor();\n\n if (llmSkills.length > 0 || scriptDepSkills.length > 0) {\n const resolutionErrors: string[] = [];\n\n for (const skill of llmSkills) {\n const skillMdPath = join(skillsDir, skill.name, 'SKILL.md');\n const result = resolveSkillLlm(\n { skillName: skill.name, skillMdPath, llmOverride: skill.llmOverride },\n loaded.yaml.llm,\n );\n if ('error' in result) {\n resolutionErrors.push(result.error);\n continue;\n }\n const cacheKey = cacheKeyFor(result);\n triplesByKey.set(cacheKey, result);\n monitorPairs.set(`${result.provider}::${result.model}`, {\n provider: result.provider,\n model: result.model,\n });\n skill.resolvedTriple = {\n provider: result.provider,\n model: result.model,\n maxTokens: result.maxTokens,\n };\n const list = dependentSkillsByProvider.get(result.provider) ?? [];\n list.push(skill.name);\n dependentSkillsByProvider.set(result.provider, list);\n }\n\n // Script-mode skills: register their declared (provider, model) for\n // health monitoring. No LlmClient is built - the script does its own\n // HTTP. The all-or-nothing parse invariant guarantees both `provider`\n // and `model` are set when we reach this branch (validateLlmOverride).\n for (const skill of scriptDepSkills) {\n const provider = skill.llmOverride?.provider as LlmProvider;\n const model = skill.llmOverride?.model as string;\n monitorPairs.set(`${provider}::${model}`, { provider, model });\n const list = dependentSkillsByProvider.get(provider) ?? [];\n if (!list.includes(skill.name)) {\n list.push(skill.name);\n }\n dependentSkillsByProvider.set(provider, list);\n }\n\n if (resolutionErrors.length > 0) {\n for (const message of resolutionErrors) {\n console.error(` ! ${message}`);\n }\n console.error('');\n process.exit(1);\n }\n\n if (loaded.yaml.llm) {\n const agentDefaultTriple: ResolvedSkillLlm = {\n provider: loaded.yaml.llm.provider as LlmProvider,\n model: loaded.yaml.llm.model,\n maxTokens: loaded.yaml.llm.max_tokens,\n };\n const agentKey = cacheKeyFor(agentDefaultTriple);\n if (triplesByKey.has(agentKey)) {\n agentDefaultCacheKey = agentKey;\n }\n }\n\n // Resolve + verify each provider's API key once.\n const keyByProvider = new Map<LlmProvider, string>();\n const keyErrors: string[] = [];\n for (const [provider, dependents] of dependentSkillsByProvider) {\n const keyResult = resolveProviderApiKey({\n provider,\n secrets: loaded.secrets,\n dependentSkills: dependents,\n });\n if ('error' in keyResult) {\n keyErrors.push(keyResult.error);\n continue;\n }\n keyByProvider.set(provider, keyResult.apiKey);\n }\n if (keyErrors.length > 0) {\n for (const message of keyErrors) {\n console.error(` ! ${message}`);\n }\n console.error('');\n process.exit(1);\n }\n\n // Deep-verify each unique (provider, model) pair the agent will use.\n // Deep verification consumes one billing token per probe (~$0.00001\n // on Haiku) but distinguishes valid keys from billing-exhausted ones,\n // which `/v1/models` cannot. Iterates `monitorPairs` so script-mode\n // skills that declared `provider`+`model` are probed too.\n for (const [, pair] of monitorPairs) {\n const apiKey = keyByProvider.get(pair.provider);\n if (!apiKey) {\n continue;\n }\n const envVar =\n getLlmProvider(pair.provider)?.envVar ?? `${pair.provider.toUpperCase()}_API_KEY`;\n process.stdout.write(` Verifying ${pair.provider} ${pair.model}... `);\n const verification = await verifyLlmApiKeyDeep(pair.provider, apiKey, pair.model);\n const descriptor = getLlmProvider(pair.provider);\n const verifyFn = async (signal?: AbortSignal) =>\n descriptor\n ? descriptor.verifyKeyDeep(apiKey, pair.model, signal)\n : { ok: false as const, reason: 'unavailable' as const, error: 'no descriptor' };\n healthMonitor.register({\n provider: pair.provider,\n model: pair.model,\n verifyFn,\n });\n healthMonitor.seed(pair.provider, pair.model, verification);\n if (verification.ok) {\n console.log('ok');\n } else if (verification.reason === 'invalid') {\n console.log('INVALID');\n console.error(` ! ${pair.provider} rejected the API key (HTTP ${verification.status}).`);\n console.error(\n ` Update it via \\`npx @elisym/cli profile ${agentName}\\` or set ${envVar} to a valid key.\\n`,\n );\n process.exit(1);\n } else if (verification.reason === 'billing') {\n console.log('BILLING');\n const detail = verification.body ? ` ${verification.body.slice(0, 200)}` : '';\n console.error(\n ` ! ${pair.provider} reports a billing/quota issue for ${pair.model}.${detail}`,\n );\n console.error(\n ` Top up the account at the provider console, or set ${envVar} to a key on a funded org.\\n`,\n );\n process.exit(1);\n } else {\n console.log('unavailable');\n console.warn(\n ` ! Could not verify ${pair.provider} ${pair.model} (${verification.error}). Continuing - jobs will fail if the key is invalid.\\n`,\n );\n }\n }\n\n // Eager client construction. One LlmClient per unique triple.\n for (const [cacheKey, triple] of triplesByKey) {\n const apiKey = keyByProvider.get(triple.provider);\n if (!apiKey) {\n // Should never happen - keyByProvider is built from the same provider\n // set as the triples. Defensive guard for type narrowing.\n console.error(` ! Internal error: no API key for provider \"${triple.provider}\".\\n`);\n process.exit(1);\n }\n const config: LlmConfig = {\n provider: triple.provider,\n apiKey,\n model: triple.model,\n maxTokens: triple.maxTokens,\n logUsage: true,\n };\n llmClientCache.set(cacheKey, createLlmClient(config));\n }\n } else {\n console.log(' No LLM-dependent skills loaded; skipping LLM key check.\\n');\n }\n\n const agentDefaultClient =\n agentDefaultCacheKey !== undefined ? llmClientCache.get(agentDefaultCacheKey) : undefined;\n\n const getLlm = (override?: SkillLlmOverride): LlmClient | undefined => {\n const triple = resolveTripleForOverride(override, loaded.yaml.llm);\n if (!triple) {\n return undefined;\n }\n return llmClientCache.get(cacheKeyFor(triple));\n };\n\n const skillCtx: SkillContext = {\n llm: agentDefaultClient,\n getLlm,\n agentName,\n agentDescription: loaded.yaml.description ?? '',\n };\n\n // -- Step 8: Connect to relays --\n console.log(' Connecting to relays and publishing capabilities...');\n\n const identity = ElisymIdentity.fromHex(loaded.secrets.nostr_secret_key);\n const relays = loaded.yaml.relays.length > 0 ? loaded.yaml.relays : [...RELAYS];\n const client = new ElisymClient({ relays });\n\n // Opt-in DNS + TCP connectivity probe for WSL / Windows / corporate\n // firewall troubleshooting. Runs once before publish so the operator\n // sees the result in the startup banner.\n if (process.env.ELISYM_NET_DIAG === '1') {\n console.log(' [net-diag] Probing relay DNS + TCP connectivity...');\n const results = await probeRelays(relays, logger);\n for (const result of results) {\n const ipSummary = result.ips.length > 0 ? result.ips.join(',') : '-';\n if (result.tcpOpenMs !== undefined) {\n console.log(` [net-diag] ${result.url} -> ${ipSummary} TCP open in ${result.tcpOpenMs}ms`);\n } else {\n console.log(` [net-diag] ${result.url} -> ${ipSummary} FAILED: ${result.error ?? '?'}`);\n }\n }\n }\n\n // -- Step 9: Resolve media URLs via cache (no SKILL.md mutation) --\n const media = new MediaService();\n const mediaCache = await readMediaCache(loaded.dir);\n let mediaCacheDirty = false;\n\n const pictureUrl = await resolveMediaField(\n loaded.yaml.picture,\n loaded.dir,\n mediaCache,\n media,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n const bannerUrl = await resolveMediaField(\n loaded.yaml.banner,\n loaded.dir,\n mediaCache,\n media,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n\n for (const skill of allSkills) {\n if (skill.image || !skill.imageFile || !skill.dir) {\n continue;\n }\n const skillRoot = skill.dir;\n const folderName = basename(skillRoot);\n const cacheKey = `./skills/${folderName}/${skill.imageFile}`;\n const absPath = join(skillRoot, skill.imageFile);\n const url = await uploadOrReuse(\n cacheKey,\n absPath,\n mediaCache,\n media,\n identity,\n () => (mediaCacheDirty = true),\n );\n if (url) {\n skill.image = url;\n }\n }\n\n if (mediaCacheDirty) {\n await writeMediaCache(loaded.dir, mediaCache);\n }\n\n // -- Step 10: Publish kind:0 profile --\n let profilePublished = false;\n try {\n await client.discovery.publishProfile(\n identity,\n loaded.yaml.display_name ?? agentName,\n loaded.yaml.description ?? '',\n pictureUrl,\n bannerUrl,\n );\n profilePublished = true;\n logger.debug({ event: 'publish_ack', kind: 0 }, 'profile published');\n } catch (e: any) {\n console.warn(` ! Failed to publish profile: ${e.message}`);\n logger.warn({ event: 'publish_failed', kind: 0, error: e.message }, 'profile publish failed');\n }\n\n // -- Step 11: Publish per-skill capability cards (kind:31990) --\n const kinds = [jobRequestKind(DEFAULT_KIND_OFFSET)];\n\n function buildCard(skill: (typeof allSkills)[0]): CapabilityCard {\n const isStatic = skill.mode === 'static-file' || skill.mode === 'static-script';\n return {\n name: skill.name,\n description: skill.description,\n capabilities: skill.capabilities,\n image: skill.image,\n ...(isStatic ? { static: true } : {}),\n payment: solanaAddress\n ? {\n chain: 'solana',\n network: walletNetwork,\n address: solanaAddress,\n job_price: skill.priceSubunits,\n token: skill.asset.token,\n ...(skill.asset.mint ? { mint: skill.asset.mint } : {}),\n decimals: skill.asset.decimals,\n symbol: skill.asset.symbol,\n }\n : undefined,\n };\n }\n\n let cardsPublished = 0;\n for (const skill of allSkills) {\n try {\n await client.discovery.publishCapability(identity, buildCard(skill), kinds);\n cardsPublished += 1;\n logger.debug(\n { event: 'publish_ack', kind: 31990, skill: skill.name },\n 'capability card published',\n );\n } catch (e: any) {\n console.warn(` ! Failed to publish \"${skill.name}\": ${e.message}`);\n logger.warn(\n { event: 'publish_failed', kind: 31990, skill: skill.name, error: e.message },\n 'capability publish failed',\n );\n }\n }\n\n // -- Step 12: Clean up stale capabilities from relay --\n try {\n const existingEvents = await client.pool.querySync({\n kinds: [31990],\n authors: [identity.publicKey],\n '#t': ['elisym'],\n });\n // Compare by d-tag, not card.name. toDTag() is lossy (e.g. \"WHOIS Lookup\"\n // and \"whois-lookup\" collapse to the same d-tag), so name-based comparison\n // can flag a card whose d-tag actually matches an active skill - the\n // resulting deletion event then replaces the freshly-published card on the\n // relay (kind:31990 is replaceable by author+kind+d-tag).\n const skillDTags = new Set(allSkills.map((s) => toDTag(s.name)));\n for (const ev of existingEvents) {\n const dTag = ev.tags.find((t: string[]) => t[0] === 'd')?.[1];\n if (!dTag || skillDTags.has(dTag)) {\n continue;\n }\n try {\n const card = JSON.parse(ev.content);\n if (card.name) {\n await client.discovery.deleteCapability(identity, card.name);\n console.log(` Removed stale capability: ${card.name}`);\n }\n } catch {\n // malformed event, skip\n }\n }\n } catch {\n // non-fatal: stale cards will expire naturally\n }\n\n console.log(' Connected.\\n');\n if (verbose) {\n console.log(\n ` [debug] Published: profile=${profilePublished ? 'ok' : 'FAILED'} + ${cardsPublished}/${allSkills.length} capability cards (kind:31990)`,\n );\n console.log(` [debug] Relays: ${relays.length} configured (${relays.join(', ')})`);\n }\n\n // -- Step 13: Prepare ping responder (watchdog owns the subscription) --\n const onPing = (senderPubkey: string, nonce: string): void => {\n client.ping.sendPong(identity, senderPubkey, nonce).catch(() => {});\n };\n\n // -- Step 14: Build transport + ledger + runtime --\n const transport = new NostrTransport(client, identity, [DEFAULT_KIND_OFFSET]);\n const ledger = new JobLedger(paths.jobs);\n\n const runtimeConfig: RuntimeConfig = {\n paymentTimeoutSecs: DEFAULTS.PAYMENT_EXPIRY_SECS,\n maxConcurrentJobs: MAX_CONCURRENT_JOBS,\n recoveryMaxRetries: RECOVERY_MAX_RETRIES,\n recoveryIntervalSecs: RECOVERY_INTERVAL_SECS,\n network: walletNetwork,\n solanaAddress,\n };\n\n // Custom SOLANA_RPC_URL values (Helius, Alchemy, QuickNode) routinely\n // embed API keys in the query string. Strip query + auth before logging\n // so `--verbose` never publishes a third-party RPC credential.\n const rpcUrlForLog = stripRpcSecrets(process.env.SOLANA_RPC_URL ?? getRpcUrl(walletNetwork));\n logger.debug(\n {\n event: 'config_resolved',\n agent: agentName,\n source: loaded.source,\n network: walletNetwork,\n relays,\n solanaAddress,\n rpcUrl: rpcUrlForLog,\n },\n 'config resolved',\n );\n\n // Tee: banner-style indent line on stdout (existing UX) + structured\n // stderr pino entry with shared redact paths (defence against future\n // slips where a diagnostic string might embed user input).\n const diagLog = (msg: string): void => {\n logWithIndent(msg);\n logger.info({ event: 'runtime_diag' }, msg);\n };\n\n const watchdog = startWatchdog({\n client,\n identity,\n transport,\n onPing,\n log: diagLog,\n logger,\n });\n\n let llmHeartbeat: HeartbeatHandle | undefined;\n if (monitorPairs.size > 0) {\n llmHeartbeat = startLlmRecovery({\n monitor: healthMonitor,\n log: diagLog,\n });\n diagLog('LLM health monitor armed (lazy recovery, 5min interval).');\n }\n\n const runtime = new AgentRuntime(\n transport,\n registry,\n skillCtx,\n runtimeConfig,\n ledger,\n {\n onJobReceived: (job) => {\n const cap = job.tags.find((t) => t !== 'elisym') ?? 'unknown';\n // Never log job.input here - capability tag is the only descriptor needed.\n process.stdout.write(` [job] ${job.jobId.slice(0, 16)} | cap=${cap}\\n`);\n logger.info({ event: 'job_received', jobId: job.jobId, capability: cap });\n },\n onJobCompleted: (jobId) => {\n process.stdout.write(` [job] ${jobId.slice(0, 16)} | delivered\\n`);\n logger.info({ event: 'job_delivered', jobId });\n },\n onJobError: (jobId, error) => {\n process.stderr.write(` [job] ${jobId.slice(0, 16)} | error: ${error}\\n`);\n logger.error({ event: 'job_error', jobId, error });\n },\n onLog: diagLog,\n onStop: () => {\n watchdog.stop();\n llmHeartbeat?.stop();\n },\n },\n healthMonitor,\n );\n\n // -- Step 15: Run --\n console.log(' * Running. Press Ctrl+C to stop.\\n');\n await runtime.run();\n}\n\n/**\n * Return a log-safe representation of an RPC URL. Strips any userinfo\n * and query string so credentials embedded by third-party RPC\n * providers (Helius/Alchemy/QuickNode style `?api-key=...`) never land\n * in verbose stderr output.\n */\nexport function stripRpcSecrets(raw: string): string {\n try {\n const parsed = new URL(raw);\n parsed.username = '';\n parsed.password = '';\n const marker = parsed.search.length > 0 ? '?***' : '';\n parsed.search = '';\n return `${parsed.toString()}${marker}`;\n } catch {\n return '[unparseable RPC URL]';\n }\n}\n\n/** Resolve a YAML media field (picture/banner) - URL returned as-is, local path uploaded via cache. */\nasync function resolveMediaField(\n value: string | undefined,\n agentDir: string,\n cache: MediaCache,\n media: MediaService,\n identity: ElisymIdentity,\n onCacheUpdate: (updated: boolean) => void,\n): Promise<string | undefined> {\n if (!value) {\n return undefined;\n }\n if (isRemoteUrl(value)) {\n return value;\n }\n const absPath = resolveInsideAgentDir(value, agentDir);\n if (!absPath) {\n console.warn(` ! Skipping media field \"${value}\": path must stay inside the agent directory.`);\n return undefined;\n }\n return uploadOrReuse(value, absPath, cache, media, identity, () => onCacheUpdate(true));\n}\n\n/**\n * Resolve a YAML-supplied path against `agentDir` and reject anything that\n * escapes the agent directory (`..` segments, absolute paths outside it).\n * Returns null on rejection so callers can warn and skip the field.\n */\nfunction resolveInsideAgentDir(value: string, agentDir: string): string | null {\n const agentRoot = resolve(agentDir);\n const candidate = resolve(agentRoot, value);\n const rel = relative(agentRoot, candidate);\n if (rel === '' || rel.startsWith('..') || rel.includes(`..${sep}`)) {\n return null;\n }\n return candidate;\n}\n\n/** Look up `cacheKey` in cache; if hit returns URL, else uploads and updates cache. */\nasync function uploadOrReuse(\n cacheKey: string,\n absPath: string,\n cache: MediaCache,\n media: MediaService,\n identity: ElisymIdentity,\n onCacheUpdate: () => void,\n): Promise<string | undefined> {\n try {\n const cached = await lookupCachedUrl(cache, cacheKey, absPath);\n if (cached) {\n return cached;\n }\n console.log(` Uploading ${basename(absPath)}...`);\n const data = readFileSync(absPath);\n const sha256 = createHash('sha256').update(data).digest('hex');\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(absPath));\n cache[cacheKey] = newCacheEntry(url, sha256);\n onCacheUpdate();\n console.log(` Uploaded: ${url}`);\n return url;\n } catch (e: any) {\n console.warn(` ! Failed to upload ${basename(absPath)}: ${e.message}`);\n return undefined;\n }\n}\n\nfunction isRemoteUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value);\n}\n\nconst MAX_PASSPHRASE_ATTEMPTS = 3;\n\n/**\n * Resolve the agent to start. Returns undefined when the user picked\n * \"+ Create new agent\" and the init wizard ran - the caller should exit.\n */\nasync function resolveStartAgentName(\n nameArg: string | undefined,\n cwd: string,\n): Promise<string | undefined> {\n if (nameArg) {\n return nameArg;\n }\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.log('No agents configured. Run `npx @elisym/cli init` first.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const choices = [\n ...agents.map((agent) => ({\n name: `${agent.name} (${agent.source}${agent.shadowsGlobal ? ' - shadows global' : ''})`,\n value: agent.name,\n })),\n { name: '+ Create new agent', value: '__new__' },\n ];\n const { selected } = await inquirer.prompt([\n { type: 'list', name: 'selected', message: 'Select agent to start', choices },\n ]);\n if (selected === '__new__') {\n const { cmdInit } = await import('./init.js');\n await cmdInit();\n return undefined;\n }\n return selected;\n}\n\nasync function loadAgentWithPrompt(name: string, cwd: string): Promise<LoadedAgent> {\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n try {\n return await loadAgent(name, cwd, envPassphrase);\n } catch (e: any) {\n const isEncrypted = /encrypted secrets/i.test(e?.message ?? '');\n const isWrongPassphrase = /Decryption failed/i.test(e?.message ?? '');\n if (!isEncrypted && !isWrongPassphrase) {\n throw e;\n }\n if (!process.stdin.isTTY) {\n throw e;\n }\n }\n\n const { default: inquirer } = await import('inquirer');\n for (let attempt = 1; attempt <= MAX_PASSPHRASE_ATTEMPTS; attempt += 1) {\n const { passphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'passphrase',\n message: 'Passphrase to decrypt secrets:',\n mask: '*',\n },\n ]);\n try {\n return await loadAgent(name, cwd, passphrase);\n } catch (e: any) {\n if (!/Decryption failed/i.test(e?.message ?? '')) {\n throw e;\n }\n const remaining = MAX_PASSPHRASE_ATTEMPTS - attempt;\n if (remaining === 0) {\n console.error(' ! Wrong passphrase. Aborting.');\n process.exit(1);\n }\n console.error(` ! Wrong passphrase. ${remaining} attempt(s) left.`);\n }\n }\n throw new Error('Unreachable');\n}\n","/**\n * Resolve the effective LLM config for a single skill.\n *\n * Combines the skill-level `llmOverride` with the agent-level default. The\n * (provider, model) pair is all-or-nothing at the override level (enforced\n * at parse time in the SDK skill loader); `maxTokens` chains independently.\n */\n\nimport type { LlmEntry } from '@elisym/sdk/agent-store';\nimport type { Skill, SkillLlmOverride } from '@elisym/sdk/skills';\nimport type { LlmProvider } from './index';\n\nexport const DEFAULT_MAX_TOKENS = 4096;\n\nexport interface ResolvedSkillLlm {\n provider: LlmProvider;\n model: string;\n maxTokens: number;\n}\n\nexport interface ResolveSkillLlmInput {\n skillName: string;\n /** Filesystem path to the SKILL.md so error messages point at the exact file. */\n skillMdPath: string;\n llmOverride?: SkillLlmOverride;\n}\n\nexport type ResolveSkillLlmResult = ResolvedSkillLlm | { error: string };\n\n/**\n * Resolve a skill to a concrete (provider, model, maxTokens). Returns an\n * `error` shape when the skill is `mode: 'llm'` but neither side declared\n * provider/model.\n */\nexport function resolveSkillLlm(\n input: ResolveSkillLlmInput,\n agentDefault: LlmEntry | undefined,\n): ResolveSkillLlmResult {\n const override = input.llmOverride;\n const overridePairSet = override?.provider !== undefined && override.model !== undefined;\n\n let provider: LlmProvider | undefined;\n let model: string | undefined;\n if (overridePairSet) {\n provider = override.provider;\n model = override.model;\n } else if (agentDefault) {\n provider = agentDefault.provider;\n model = agentDefault.model;\n }\n\n if (!provider || !model) {\n return {\n error:\n `Skill \"${input.skillName}\" at ${input.skillMdPath}: LLM model is required - ` +\n `declare \"provider\" + \"model\" in the SKILL.md frontmatter or set agent-level llm ` +\n `via 'npx @elisym/cli profile <agent>'.`,\n };\n }\n\n const maxTokens = override?.maxTokens ?? agentDefault?.max_tokens ?? DEFAULT_MAX_TOKENS;\n\n return { provider, model, maxTokens };\n}\n\n/** Lift the override fields from a `Skill` into the input shape used here. */\nexport function skillResolveInput(skill: Skill, skillMdPath: string): ResolveSkillLlmInput {\n return {\n skillName: skill.name,\n skillMdPath,\n llmOverride: skill.llmOverride,\n };\n}\n","/**\n * Per-skill LLM client caching.\n *\n * Different LLM skills may share or differ on (provider, model, maxTokens).\n * We deduplicate clients by a stable JSON-encoded triple so verifying API\n * keys and instantiating clients happens once per unique config.\n */\n\nimport type { LlmEntry } from '@elisym/sdk/agent-store';\nimport type { SkillLlmOverride } from '@elisym/sdk/skills';\nimport { DEFAULT_MAX_TOKENS, type ResolvedSkillLlm } from './resolve';\nimport type { LlmProvider } from './index';\n\n/**\n * Stable cache key for an LLM client config. JSON-encoded so any provider /\n * model string is safely escaped (avoids ad-hoc separator collisions).\n */\nexport function cacheKeyFor(triple: ResolvedSkillLlm): string {\n return JSON.stringify({\n provider: triple.provider,\n model: triple.model,\n maxTokens: triple.maxTokens,\n });\n}\n\n/**\n * Resolve an `llmOverride` to a concrete (provider, model, maxTokens) using\n * the agent-level default for any field the override leaves unset. Returns\n * `undefined` when no agent-level default exists and the override is partial\n * (no provider/model) - the caller treats that as \"no client available\".\n */\nexport function resolveTripleForOverride(\n override: SkillLlmOverride | undefined,\n agentDefault: LlmEntry | undefined,\n): ResolvedSkillLlm | undefined {\n const overridePairSet = override?.provider !== undefined && override.model !== undefined;\n let provider: LlmProvider | undefined;\n let model: string | undefined;\n if (overridePairSet) {\n provider = override.provider;\n model = override.model;\n } else if (agentDefault) {\n provider = agentDefault.provider;\n model = agentDefault.model;\n }\n if (!provider || !model) {\n return undefined;\n }\n const maxTokens = override?.maxTokens ?? agentDefault?.max_tokens ?? DEFAULT_MAX_TOKENS;\n return { provider, model, maxTokens };\n}\n","/**\n * Resolve the API key for a given provider, walking the priority chain:\n *\n * 1. `secrets.llm_api_keys[<provider>]` (per-provider entry, preferred).\n * 2. `process.env.<descriptor.envVar>` (operator convenience).\n */\n\nimport type { Secrets } from '@elisym/sdk/agent-store';\nimport { getLlmProvider } from './registry';\nimport type { LlmProvider } from './index';\n\nexport interface ResolvedProviderKey {\n apiKey: string;\n origin: 'secrets-per-provider' | 'env';\n}\n\nexport type ResolveProviderKeyResult = ResolvedProviderKey | { error: string };\n\nexport interface ResolveProviderKeyInput {\n provider: LlmProvider;\n secrets: Secrets;\n /** Names of skills that resolved to this provider. Surfaced in error messages. */\n dependentSkills: string[];\n}\n\nexport function resolveProviderApiKey(input: ResolveProviderKeyInput): ResolveProviderKeyResult {\n const { provider, secrets, dependentSkills } = input;\n\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n const skillList = dependentSkills.length > 0 ? dependentSkills.join(', ') : '<none>';\n return {\n error: `Provider \"${provider}\" is not registered (required by skill(s): ${skillList}).`,\n };\n }\n\n const perProviderValue = secrets.llm_api_keys?.[provider];\n if (typeof perProviderValue === 'string' && perProviderValue.length > 0) {\n return { apiKey: perProviderValue, origin: 'secrets-per-provider' };\n }\n\n const envValue = process.env[descriptor.envVar];\n if (envValue) {\n return { apiKey: envValue, origin: 'env' };\n }\n\n const skillList = dependentSkills.length > 0 ? dependentSkills.join(', ') : '<none>';\n return {\n error:\n `Provider \"${provider}\" needs an API key (required by skill(s): ${skillList}). ` +\n `Set secrets.llm_api_keys.${provider} via 'npx @elisym/cli profile <agent>' or export ${descriptor.envVar}.`,\n };\n}\n","/**\n * Structured logger for the CLI. Stdout stays reserved for the\n * human-readable banner (rendered via `logWithIndent`). Diagnostic\n * output - incoming events, relay lifecycle, publish acks, watchdog\n * decisions - goes to stderr as JSON by default, or pretty-printed\n * when the process is attached to a TTY and pino-pretty is available.\n *\n * Redaction uses the SDK's DEFAULT_REDACT_PATHS so secret keys and\n * user input cannot leak through structured logs even in verbose mode.\n */\nimport { DEFAULT_REDACT_PATHS, makeCensor } from '@elisym/sdk';\nimport pino, { type Logger } from 'pino';\n\nexport interface CreateLoggerOptions {\n /** When true, set level to 'debug' and emit the debug firehose. */\n verbose?: boolean;\n /** When true, pretty-print to stderr; otherwise raw JSON to stderr. */\n tty?: boolean;\n /** Override the log level directly (takes precedence over verbose). */\n level?: string;\n /** Escape hatch for tests: redirect structured output to an explicit stream. */\n destination?: pino.DestinationStream;\n}\n\nexport interface CliLogger {\n logger: Logger;\n /** Pretty 2-space-indented write to stdout, used by the startup banner. */\n logWithIndent(line: string): void;\n /** Banner-only write to stdout. Semantically identical to logWithIndent. */\n bannerLog(line: string): void;\n}\n\nfunction resolveLevel(options: CreateLoggerOptions): string {\n if (options.level) {\n return options.level;\n }\n if (options.verbose) {\n return 'debug';\n }\n const envLevel = process.env.LOG_LEVEL;\n if (envLevel) {\n return envLevel;\n }\n return 'info';\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): CliLogger {\n const level = resolveLevel(options);\n const baseOptions: pino.LoggerOptions = {\n name: 'elisym-cli',\n level,\n redact: {\n paths: DEFAULT_REDACT_PATHS,\n censor: makeCensor(),\n },\n };\n\n let logger: Logger;\n if (options.destination) {\n logger = pino(baseOptions, options.destination);\n } else if (options.tty === true) {\n logger = pino({\n ...baseOptions,\n transport: {\n target: 'pino-pretty',\n options: { destination: 2, colorize: true, translateTime: 'HH:MM:ss' },\n },\n });\n } else {\n // Raw JSON to stderr (fd 2) so stdout stays clean for the banner.\n logger = pino(baseOptions, pino.destination(2));\n }\n\n function logWithIndent(line: string): void {\n process.stdout.write(` ${line}\\n`);\n }\n\n return {\n logger,\n logWithIndent,\n bannerLog: logWithIndent,\n };\n}\n","/**\n * AgentRuntime - main job processing loop with concurrency, payment, and recovery.\n * Supports per-capability pricing: each capability can have a different price.\n */\nimport {\n NATIVE_SOL,\n SolanaPaymentStrategy,\n calculateProtocolFee,\n createSlidingWindowLimiter,\n formatAssetAmount,\n getProtocolConfig,\n getProtocolProgramId,\n LIMITS,\n} from '@elisym/sdk';\nimport type { Asset, ProtocolConfigInput, SlidingWindowLimiter } from '@elisym/sdk';\nimport {\n createFreeLlmLimiterSet,\n FREE_LLM_GLOBAL_KEY,\n freeLlmCustomerKey,\n ScriptBillingExhaustedError,\n type FreeLlmLimiterSet,\n type LlmHealthMonitor,\n} from '@elisym/sdk/llm-health';\nimport { createSolanaRpc } from '@solana/kit';\nimport pLimit from 'p-limit';\nimport { getRpcUrl } from './helpers.js';\nimport { JobLedger } from './ledger.js';\nimport type { SkillRegistry, SkillContext } from './skill';\nimport type { NostrTransport, IncomingJob } from './transport/nostr.js';\n\nconst payment = new SolanaPaymentStrategy();\nconst LEDGER_GC_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\nconst LEDGER_RETENTION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days, mirrors plugin\nconst TOTAL_JOB_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n// How long the Nostr-feedback signature path waits for a `payment-completed`\n// before giving up. Solana confirmation + wallet signing is single-digit\n// seconds in the happy path, so 60s is generous; past that the customer is\n// almost certainly not coming back and the slot should be released.\nconst SIG_PATH_TIMEOUT_MS = 60 * 1000;\n\nexport interface RuntimeConfig {\n paymentTimeoutSecs: number;\n maxConcurrentJobs: number;\n recoveryMaxRetries: number;\n recoveryIntervalSecs: number;\n network: string;\n solanaAddress?: string;\n maxQueueSize?: number;\n}\n\nexport interface RuntimeCallbacks {\n onJobReceived?: (job: IncomingJob) => void;\n onJobCompleted?: (jobId: string, result: string) => void;\n onJobError?: (jobId: string, error: string) => void;\n onPaymentReceived?: (jobId: string, netAmount: number) => void;\n onLog?: (message: string) => void;\n /**\n * Invoked at the start of `stop()`, before the abort signal fires and before\n * the transport is torn down, so callers can tear down external resources\n * (watchdogs, ping subscriptions) that live outside the runtime.\n *\n * Contract:\n * - Runs exactly once per runtime - `stop()` is idempotent; repeated calls\n * do not re-invoke this callback.\n * - Thrown errors are caught and logged via `onLog`; shutdown continues.\n * - At invocation time the transport and abort controller are still live;\n * callers can safely use transport-backed services for final operations.\n */\n onStop?: () => void;\n}\n\n/** Resolve the price for a job by matching its tags against registered skills. */\nfunction resolveJobPrice(tags: string[], skills: SkillRegistry): number {\n const skill = skills.route(tags);\n return skill?.priceSubunits ?? 0;\n}\n\n/** Resolve the payment asset the matched skill is denominated in. Defaults to SOL. */\nfunction resolveJobAsset(tags: string[], skills: SkillRegistry): Asset {\n const skill = skills.route(tags);\n return skill?.asset ?? NATIVE_SOL;\n}\n\n/**\n * Markers that indicate an LLM provider's HTTP response body is about\n * billing / quota exhaustion rather than something benign. Mirrors the\n * marker sets in `cli/src/llm/providers/{anthropic,openai,openai-compatible}.ts`\n * (kept as a permissive superset so any provider's billing language is\n * detected when classifying mid-job errors). Refactoring to a single\n * shared module is out of scope here - just keep this list in sync.\n */\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient', 'insufficient_quota'];\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Resolve the (provider, model) pair the matched skill depends on for\n * health-monitor gating, or `null` if the skill is not LLM-dependent.\n *\n * For `mode: 'llm'` the pair comes from `resolvedTriple` (computed at\n * startup with agent default + override). For script modes the pair\n * comes from `llmOverride.provider`+`.model` declared in SKILL.md, which\n * is the operator's signal that the script reaches an LLM API under\n * the hood. Either source produces the same (provider, model) string\n * pair the health monitor was registered with in `start.ts`.\n */\nfunction resolveHealthPair(\n skill: import('./skill').Skill | null,\n): { provider: string; model: string } | null {\n if (!skill) {\n return null;\n }\n if (skill.mode === 'llm' && skill.resolvedTriple) {\n return {\n provider: skill.resolvedTriple.provider,\n model: skill.resolvedTriple.model,\n };\n }\n if (skill.mode !== 'llm' && skill.llmOverride?.provider && skill.llmOverride?.model) {\n return {\n provider: skill.llmOverride.provider,\n model: skill.llmOverride.model,\n };\n }\n return null;\n}\n\nconst RATE_LIMIT_WINDOW_MS = 10 * 60 * 1000; // 10 minutes\nconst MAX_JOBS_PER_CUSTOMER = 20;\nconst GLOBAL_MAX_JOBS_PER_WINDOW = 200;\nconst MAX_TRACKED_CUSTOMERS = 1000;\nconst GLOBAL_LIMITER_KEY = '__global__';\n\nexport class AgentRuntime {\n private limit: ReturnType<typeof pLimit>;\n private inFlight = new Set<string>();\n private pending = 0;\n private maxQueueSize: number;\n private abortController = new AbortController();\n private jobAbortControllers = new Set<AbortController>();\n private recoveryInterval: ReturnType<typeof setInterval> | null = null;\n private gcInterval: ReturnType<typeof setInterval> | null = null;\n private stopped = false;\n /** Per-customer sliding-window rate limiter (keyed on customer pubkey). */\n private customerLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: MAX_JOBS_PER_CUSTOMER,\n maxKeys: MAX_TRACKED_CUSTOMERS,\n });\n /** Global sliding-window rate limiter (Sybil protection). */\n private globalLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: GLOBAL_MAX_JOBS_PER_WINDOW,\n maxKeys: 1,\n });\n /**\n * Two-tier limiter applied only to free LLM skills (mode='llm', price=0).\n * Existing per-customer + global limiters above remain in effect for all\n * jobs; this set adds tighter caps to prevent unpaid spam from draining\n * the operator's API key.\n */\n private freeLlmLimiters: FreeLlmLimiterSet = createFreeLlmLimiterSet();\n\n constructor(\n private transport: NostrTransport,\n private skills: SkillRegistry,\n private skillCtx: SkillContext,\n private config: RuntimeConfig,\n private ledger: JobLedger,\n private callbacks: RuntimeCallbacks = {},\n private healthMonitor?: LlmHealthMonitor,\n ) {\n this.limit = pLimit(config.maxConcurrentJobs);\n this.maxQueueSize = config.maxQueueSize ?? config.maxConcurrentJobs * 10;\n }\n\n /**\n * Inspect an error thrown by `skill.execute()` and, when it carries a\n * billing/invalid signal from the LLM provider, flip the matching\n * (provider, model) pair to unhealthy via the health monitor. The next\n * job hitting the same pair is then refused at the preflight gate\n * before payment, so customers don't keep paying for jobs that will\n * fail. Recovery happens through the lazy recovery loop.\n *\n * Two error shapes are recognized:\n *\n * - `ScriptBillingExhaustedError` - thrown by SDK script skills when\n * the spawned process exits with `SCRIPT_EXIT_BILLING_EXHAUSTED`.\n * Pair comes from `skill.llmOverride` (operator-declared).\n *\n * - LLM provider HTTP error from `mode: 'llm'` - bare `Error` whose\n * message starts with \"<Provider> API error: <status> <body>\" (the\n * format every CLI provider currently uses). We classify on status:\n * 402 / 401 / 403 -> mark unhealthy. Body markers (`credit\n * balance`, `billing`, `insufficient`) catch the 400-on-billing case\n * Anthropic returns and the 429+`insufficient_quota` case OpenAI\n * and the openai-compatible providers (xAI/Google/DeepSeek) return.\n * Pair comes from `skill.resolvedTriple`.\n *\n * Anything else is a transient/skill error and does NOT touch health\n * state - the recovery loop should not be poisoned by skill bugs.\n */\n private markHealthFromExecuteError(\n skill: import('./skill').Skill,\n err: unknown,\n log: (msg: string) => void,\n jobId: string,\n ): void {\n if (!this.healthMonitor) {\n return;\n }\n const tag = `[${jobId.slice(0, 8)}]`;\n\n if (err instanceof ScriptBillingExhaustedError) {\n const provider = skill.llmOverride?.provider;\n const model = skill.llmOverride?.model;\n if (!provider || !model) {\n // Script signaled billing exhaustion but the operator didn't\n // declare which (provider, model) the script depends on - we\n // can't mark anything unhealthy. Surface a hint in the operator\n // log so they know to add provider/model to SKILL.md.\n log(\n `${tag} Script returned exit ${err.exitCode} (billing-exhausted) but skill \"${skill.name}\" did not declare provider/model in SKILL.md - cannot gate future jobs.`,\n );\n return;\n }\n log(\n `${tag} Script signaled billing-exhausted (exit ${err.exitCode}). Marking ${provider}/${model} unhealthy; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, 'billing', err.message);\n return;\n }\n\n if (skill.mode === 'llm' && skill.resolvedTriple) {\n const message = err instanceof Error ? err.message : String(err);\n const match = /API error:\\s*(\\d{3})\\b\\s*(.*)/i.exec(message);\n if (!match) {\n return;\n }\n const status = Number(match[1]);\n const body = (match[2] ?? '').slice(0, 200);\n const isBillingStatus = status === 402;\n const isAuthStatus = status === 401 || status === 403;\n const isBilling400 = status === 400 && bodyLooksLikeBilling(body);\n const isBilling429 = status === 429 && bodyLooksLikeBilling(body);\n if (!isBillingStatus && !isAuthStatus && !isBilling400 && !isBilling429) {\n return;\n }\n const reason: 'billing' | 'invalid' = isAuthStatus ? 'invalid' : 'billing';\n const provider = skill.resolvedTriple.provider;\n const model = skill.resolvedTriple.model;\n log(\n `${tag} LLM provider returned HTTP ${status} (${reason}). Marking ${provider}/${model} unhealthy; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, reason, body);\n }\n }\n\n /** Fetch on-chain protocol config (fee, treasury). Always fetches fresh to avoid stale treasury. */\n private async fetchProtocolConfig(): Promise<ProtocolConfigInput> {\n // Only devnet is supported until the elisym-config program ships on mainnet;\n // agent configs pinned to other networks must be re-initialized explicitly.\n if (this.config.network !== 'devnet') {\n throw new Error(\n `Network \"${this.config.network}\" is not supported. Only \"devnet\" is available ` +\n `until the on-chain protocol program is deployed on mainnet.`,\n );\n }\n const programId = getProtocolProgramId('devnet');\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const config = await getProtocolConfig(rpc, programId, { forceRefresh: true });\n return { feeBps: config.feeBps, treasury: config.treasury };\n }\n\n async run(): Promise<void> {\n const log = this.callbacks.onLog ?? console.log;\n\n // Prune terminal ledger entries past the 30-day retention window.\n this.ledger.pruneOldEntries(LEDGER_RETENTION_MS);\n\n // Recover pending jobs from previous sessions\n await this.recoverPendingJobs();\n\n // Start periodic recovery\n this.recoveryInterval = setInterval(\n () => this.recoverPendingJobs().catch((e) => log(`Recovery error: ${e}`)),\n this.config.recoveryIntervalSecs * 1000,\n );\n\n // Periodic ledger GC, rate limit cleanup, and subscription health check\n this.gcInterval = setInterval(() => {\n try {\n this.ledger.pruneOldEntries(LEDGER_RETENTION_MS);\n } catch (e: any) {\n log(`GC error: ${e.message}`);\n }\n this.cleanupRateLimits();\n if (!this.transport.isHealthy()) {\n log('Warning: no events received in 30+ minutes. Check relay connectivity.');\n }\n }, LEDGER_GC_INTERVAL_MS);\n\n // Start listening for jobs\n this.transport.start((job) => {\n if (this.abortController.signal.aborted) {\n return;\n }\n if (this.inFlight.has(job.jobId)) {\n return;\n }\n if (this.ledger.getStatus(job.jobId)) {\n return;\n }\n\n // Drop jobs when queue is full to prevent unbounded memory growth\n if (this.pending >= this.maxQueueSize) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server overloaded, try again later' })\n .catch(() => {});\n return;\n }\n\n // Per-customer check first so a rate-limited customer does not\n // bump the global counter - otherwise a single abusive customer\n // could starve every other caller up to the global cap.\n if (!this.customerLimiter.peek(job.customerId).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n\n // Global rate limiting (Sybil protection).\n if (!this.globalLimiter.peek(GLOBAL_LIMITER_KEY).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server busy, try again later' })\n .catch(() => {});\n return;\n }\n\n // Free-LLM extra protection: only applies when the matched skill\n // is mode='llm' and price=0. Routes through skills.route once;\n // result is reused below in `executeJob`. We `peek` first across\n // all tiers and only `check` when every tier passes, so a denial\n // in tier N never consumes a slot in tiers < N.\n const matched = this.skills.route(job.tags);\n const isFreeLlm = matched?.mode === 'llm' && matched.priceSubunits === 0;\n let perCustomerLimiter: SlidingWindowLimiter | undefined;\n let perSkillKey: string | undefined;\n if (isFreeLlm && matched) {\n if (!this.freeLlmLimiters.globalLimiter.peek(FREE_LLM_GLOBAL_KEY).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n perCustomerLimiter = this.freeLlmLimiters.getPerCustomerLimiter(\n matched.name,\n matched.rateLimit,\n );\n perSkillKey = freeLlmCustomerKey(job.customerId, matched.name);\n if (!perCustomerLimiter.peek(perSkillKey).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n }\n\n // All checks passed - record the hit against every active limiter.\n this.customerLimiter.check(job.customerId);\n this.globalLimiter.check(GLOBAL_LIMITER_KEY);\n if (isFreeLlm && perCustomerLimiter && perSkillKey) {\n this.freeLlmLimiters.globalLimiter.check(FREE_LLM_GLOBAL_KEY);\n perCustomerLimiter.check(perSkillKey);\n }\n\n this.callbacks.onJobReceived?.(job);\n this.inFlight.add(job.jobId);\n this.pending++;\n\n this.limit(() => this.processJob(job))\n .catch((e: any) => {\n this.callbacks.onJobError?.(job.jobId, e.message);\n })\n .finally(() => {\n this.inFlight.delete(job.jobId);\n this.pending--;\n });\n });\n\n log('Agent runtime started. Listening for jobs...');\n\n // Wait for shutdown signal. SIGINT and SIGTERM share an idempotent\n // handler so we don't log \"Shutting down...\" twice when both arrive\n // (shells sometimes deliver SIGINT+SIGTERM to the whole process group).\n await new Promise<void>((resolve) => {\n this.abortController.signal.addEventListener('abort', () => resolve(), { once: true });\n\n let shuttingDown = false;\n const onSignal = (): void => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n log('Shutting down...');\n this.stop();\n setTimeout(() => process.exit(0), 3000).unref();\n };\n process.on('SIGINT', onSignal);\n process.on('SIGTERM', onSignal);\n });\n }\n\n /** Drop expired hits from every sliding-window limiter. */\n private cleanupRateLimits(): void {\n this.customerLimiter.prune();\n this.globalLimiter.prune();\n this.freeLlmLimiters.globalLimiter.prune();\n this.freeLlmLimiters.prunePerCustomer();\n }\n\n stop(): void {\n if (this.stopped) {\n return;\n }\n this.stopped = true;\n try {\n this.callbacks.onStop?.();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n (this.callbacks.onLog ?? console.log)(`onStop error: ${msg}`);\n }\n this.abortController.abort();\n for (const controller of this.jobAbortControllers) {\n controller.abort();\n }\n if (this.recoveryInterval) {\n clearInterval(this.recoveryInterval);\n this.recoveryInterval = null;\n }\n if (this.gcInterval) {\n clearInterval(this.gcInterval);\n this.gcInterval = null;\n }\n this.transport.stop();\n }\n\n /** Wrapper with total job timeout and error handling. */\n private async processJob(job: IncomingJob): Promise<void> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const jobAbort = new AbortController();\n this.jobAbortControllers.add(jobAbort);\n try {\n await Promise.race([\n this.executeJob(job, jobAbort.signal),\n new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n jobAbort.abort();\n reject(new Error('Job processing timeout'));\n }, TOTAL_JOB_TIMEOUT_MS);\n }),\n ]);\n } catch (e: any) {\n const log = this.callbacks.onLog ?? console.log;\n log(`[${job.jobId.slice(0, 8)}] Error: ${e.message}`);\n\n // Don't mark executed jobs as failed - recovery will re-deliver\n const currentStatus = this.ledger.getStatus(job.jobId);\n if (currentStatus !== 'executed') {\n this.ledger.markFailed(job.jobId);\n }\n this.callbacks.onJobError?.(job.jobId, e.message);\n\n // W8: Sanitize error messages before sending to customer\n const safeMessage = e.message?.includes('API')\n ? 'Internal processing error'\n : (e.message ?? 'Unknown error');\n await this.transport\n .sendFeedback(job, { type: 'error', message: safeMessage })\n .catch(() => {});\n } finally {\n clearTimeout(timeoutId);\n this.jobAbortControllers.delete(jobAbort);\n }\n }\n\n /** Core job processing logic - payment, skill execution, result delivery. */\n private async executeJob(job: IncomingJob, signal?: AbortSignal): Promise<void> {\n const log = this.callbacks.onLog ?? console.log;\n\n // W2: Validate input length before processing\n if (job.input.length > LIMITS.MAX_INPUT_LENGTH) {\n throw new Error(`Input too long: ${job.input.length} chars (max ${LIMITS.MAX_INPUT_LENGTH})`);\n }\n\n // ── Preflight: gate LLM-dependent jobs against the health monitor\n // before sending payment-required. If the operator's API key has gone\n // invalid/billing-exhausted since startup, refuse the job before the\n // customer pays and before we record anything in the ledger.\n //\n // Two paths feed the gate:\n // - mode === 'llm' uses `resolvedTriple` (provider + model + maxTokens)\n // resolved at startup from agent default + skill override.\n // - script modes use `llmOverride.provider`+`.model` declared in\n // SKILL.md to signal \"this script depends on this API key\"; the\n // runtime registers the same (provider, model) pair with the\n // health monitor in start.ts, so assertReady works identically.\n //\n // Customer-facing message stays generic to avoid leaking billing\n // status; operator log carries the real reason via the throw.\n const matched = this.skills.route(job.tags);\n const healthPair = resolveHealthPair(matched);\n if (this.healthMonitor && healthPair) {\n try {\n await this.healthMonitor.assertReady(healthPair.provider, healthPair.model);\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n log(`[${job.jobId.slice(0, 8)}] LLM health gate refused job: ${detail}`);\n await this.transport\n .sendFeedback(job, {\n type: 'error',\n message: 'Service temporarily unavailable, try again later',\n })\n .catch(() => {});\n return;\n }\n }\n\n // ── Step 1: Resolve per-capability price and collect payment ──\n const jobPrice = resolveJobPrice(job.tags, this.skills);\n const jobAsset = resolveJobAsset(job.tags, this.skills);\n let netAmount: number | undefined;\n let paymentRequest: string | undefined;\n\n // W1: Record in ledger BEFORE payment to prevent crash window data loss\n this.ledger.recordPaid({\n job_id: job.jobId,\n input: job.input,\n input_type: job.inputType,\n tags: job.tags,\n customer_id: job.customerId,\n bid: job.bid,\n net_amount: undefined,\n raw_event_json: JSON.stringify(job.rawEvent),\n created_at: Math.floor(Date.now() / 1000),\n });\n\n if (jobPrice > 0) {\n const result = await this.collectPayment(job, jobPrice, jobAsset, signal);\n netAmount = result.netAmount;\n paymentRequest = result.paymentRequest;\n // Update ledger with payment info\n this.ledger.updatePayment(job.jobId, netAmount, paymentRequest);\n log(\n `[${job.jobId.slice(0, 8)}] Payment confirmed: ${formatAssetAmount(\n jobAsset,\n BigInt(netAmount),\n )}`,\n );\n this.callbacks.onPaymentReceived?.(job.jobId, netAmount);\n }\n\n // ── Step 2: Send Processing feedback ──\n await this.transport.sendFeedback(job, { type: 'processing' }).catch(() => {});\n\n // ── Step 3: Route to skill ──\n const skill = this.skills.route(job.tags);\n if (!skill) {\n throw new Error('No skill matched for tags: ' + job.tags.join(', '));\n }\n\n log(`[${job.jobId.slice(0, 8)}] Executing skill: ${skill.name}`);\n\n // ── Step 4: Execute skill ──\n // Wrapped so a billing/invalid signal surfaced *during* execution\n // (script exit 42 or LLM 402/401) flips the matching health pair to\n // unhealthy. The next job hitting the same pair will be refused at\n // the preflight gate before payment, instead of sailing through and\n // failing again. Recovery happens via the lazy recovery loop, which\n // re-probes only while the pair is unhealthy.\n let output;\n try {\n output = await skill.execute(\n {\n data: job.input,\n inputType: job.inputType,\n tags: job.tags,\n jobId: job.jobId,\n },\n { ...this.skillCtx, signal },\n );\n } catch (err) {\n this.markHealthFromExecuteError(skill, err, log, job.jobId);\n throw err;\n }\n\n // ── Step 5: Cache result in ledger ──\n // NOTE: At-least-once delivery. A crash between execute() return and markExecuted()\n // flush leaves the job as 'paid' - recovery will re-execute. Skills must be idempotent\n // or tolerant of re-execution.\n this.ledger.markExecuted(job.jobId, output.data);\n log(`[${job.jobId.slice(0, 8)}] Skill completed, delivering result`);\n\n // ── Step 6: Deliver result ──\n const eventId = await this.transport.deliverResult(job, output.data, netAmount);\n this.ledger.markDelivered(job.jobId);\n\n log(`[${job.jobId.slice(0, 8)}] Delivered: ${eventId.slice(0, 16)}...`);\n this.callbacks.onJobCompleted?.(job.jobId, output.data);\n }\n\n /**\n * Collect payment for a job. Creates payment request, sends PaymentRequired feedback,\n * polls for on-chain confirmation. Aborts if signal fires.\n */\n private async collectPayment(\n job: IncomingJob,\n jobPrice: number,\n jobAsset: Asset,\n signal?: AbortSignal,\n ): Promise<{ netAmount: number; paymentRequest: string }> {\n const log = this.callbacks.onLog ?? console.log;\n\n if (!this.config.solanaAddress) {\n throw new Error('Solana address not configured');\n }\n\n const protocolConfig = await this.fetchProtocolConfig();\n\n // Create payment request with protocol fee\n const request = payment.createPaymentRequest(\n this.config.solanaAddress,\n jobPrice,\n protocolConfig,\n { expirySecs: this.config.paymentTimeoutSecs, asset: jobAsset },\n );\n const requestJson = JSON.stringify(request);\n\n const fee = calculateProtocolFee(jobPrice, protocolConfig.feeBps);\n const netAmount = jobPrice - fee;\n\n log(\n `[${job.jobId.slice(0, 8)}] Payment required: ${formatAssetAmount(jobAsset, BigInt(jobPrice))} ` +\n `(fee: ${formatAssetAmount(jobAsset, BigInt(fee))})`,\n );\n\n // Store payment request reference early for crash recovery\n this.ledger.updatePayment(job.jobId, undefined, requestJson);\n\n // Send PaymentRequired feedback to customer\n await this.transport.sendFeedback(job, {\n type: 'payment-required',\n amount: jobPrice,\n paymentRequest: requestJson,\n chain: 'solana',\n });\n\n // Verify payment on-chain. Two paths run in parallel, both self-bounded:\n // (a) Signature path - subscribe to the customer's payment-completed\n // Nostr feedback, take the tx signature it carries, and verify it\n // directly via `getTransaction(sig, 'confirmed')`. Fast (~1-3s) and\n // cheap on RPC quota. Self-times out after SIG_PATH_TIMEOUT_MS so an\n // abandoned customer does not hold a `p-limit` slot indefinitely.\n // (b) Reference path - SDK's getSignaturesForAddress(reference) loop.\n // Slower and more brittle on the public devnet RPC, but works as a\n // fallback when Nostr feedback is dropped. Self-times out via SDK\n // retry budget (~30s).\n // First `verified: true` wins; if both fail we resolve immediately with\n // the last failure. The outer `deadlineMs` backstop only triggers if both\n // paths somehow hang past their own timeouts.\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const verifyAbort = new AbortController();\n const onOuterAbort = () => verifyAbort.abort();\n if (signal) {\n if (signal.aborted) {\n verifyAbort.abort();\n } else {\n signal.addEventListener('abort', onOuterAbort, { once: true });\n }\n }\n const deadlineMs = this.config.paymentTimeoutSecs * 1000;\n const sigPathTimeoutMs = Math.min(deadlineMs, SIG_PATH_TIMEOUT_MS);\n\n let result: { verified: boolean };\n try {\n result = await new Promise<{ verified: boolean }>((resolve, reject) => {\n let settled = false;\n let pending = 2;\n let lastResult: { verified: boolean } = { verified: false };\n\n const win = (verified: { verified: boolean }) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(deadline);\n resolve(verified);\n };\n\n const lose = (verified: { verified: boolean }, reason: string) => {\n if (settled) {\n return;\n }\n lastResult = verified;\n pending -= 1;\n log(`[${job.jobId.slice(0, 8)}] verify ${reason}`);\n if (pending === 0) {\n settled = true;\n clearTimeout(deadline);\n resolve(lastResult);\n }\n };\n\n // Path (a) - signature path\n this.transport\n .waitForPaymentSignature(job.jobId, job.customerId, verifyAbort.signal, sigPathTimeoutMs)\n .then(async (sig) => {\n if (settled) {\n return;\n }\n if (!sig) {\n lose({ verified: false }, 'sig path: no payment-completed feedback');\n return;\n }\n log(`[${job.jobId.slice(0, 8)}] verify sig path: got ${sig.slice(0, 8)}...`);\n try {\n const verified = await payment.verifyPayment(rpc, request, protocolConfig, {\n txSignature: sig,\n });\n if (verified.verified) {\n win(verified);\n } else {\n const reason = (verified as { error?: string }).error ?? 'unknown';\n lose(verified, `sig path: not verified (${reason})`);\n }\n } catch (err) {\n lose(\n { verified: false },\n `sig path error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n })\n .catch((err) =>\n lose(\n { verified: false },\n `sig path error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n\n // Path (b) - reference path\n payment\n .verifyPayment(rpc, request, protocolConfig)\n .then((verified) => {\n if (verified.verified) {\n win(verified);\n } else {\n const reason = (verified as { error?: string }).error ?? 'unknown';\n lose(verified, `ref path: not verified (${reason})`);\n }\n })\n .catch((err) =>\n lose(\n { verified: false },\n `ref path error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n\n // Hard deadline backstop - guarantees we never hang past paymentTimeoutSecs\n const deadline = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n log(`[${job.jobId.slice(0, 8)}] verify deadline (${deadlineMs}ms) hit`);\n resolve(lastResult);\n }, deadlineMs);\n\n // Outer abort propagation\n if (signal?.aborted) {\n settled = true;\n clearTimeout(deadline);\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n return;\n }\n signal?.addEventListener(\n 'abort',\n () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(deadline);\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n },\n { once: true },\n );\n });\n } finally {\n verifyAbort.abort();\n if (signal) {\n signal.removeEventListener('abort', onOuterAbort);\n }\n }\n\n if (result.verified) {\n return { netAmount, paymentRequest: requestJson };\n }\n\n // Timeout - customer may have paid on-chain but verification failed\n log(\n `[${job.jobId.slice(0, 8)}] WARNING: Payment verification timed out. ` +\n `Customer may have paid on-chain. Check address ${this.config.solanaAddress} manually.`,\n );\n await this.transport\n .sendFeedback(job, { type: 'error', message: 'payment timeout' })\n .catch(() => {});\n throw new Error('Payment timeout');\n }\n\n private async recoverPendingJobs(): Promise<void> {\n const pending = this.ledger.pendingJobs().filter((e) => !this.inFlight.has(e.job_id));\n if (pending.length === 0) {\n return;\n }\n\n const log = this.callbacks.onLog ?? console.log;\n log(`Recovering ${pending.length} pending jobs...`);\n\n for (const entry of pending) {\n if (entry.retry_count >= this.config.recoveryMaxRetries) {\n this.ledger.markFailed(entry.job_id);\n // Notify customer of permanent failure\n if (entry.raw_event_json) {\n try {\n const rawEvent = JSON.parse(entry.raw_event_json);\n await this.transport\n .sendFeedback(\n {\n jobId: entry.job_id,\n input: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n customerId: entry.customer_id,\n encrypted: false,\n rawEvent,\n },\n { type: 'error', message: 'Job permanently failed after maximum retries' },\n )\n .catch(() => {});\n } catch {\n /* best effort */\n }\n }\n continue;\n }\n\n if (!entry.raw_event_json) {\n continue;\n }\n\n // Respect queue limit for recovery jobs too\n if (this.pending >= this.maxQueueSize) {\n break;\n }\n\n // Route through p-limit to respect maxConcurrentJobs\n this.inFlight.add(entry.job_id);\n this.pending++;\n this.limit(async () => {\n try {\n await this.recoverSingleJob(entry, log);\n } catch (e: any) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: failed: ${e.message}`);\n } finally {\n this.inFlight.delete(entry.job_id);\n this.pending--;\n }\n });\n }\n }\n\n private async recoverSingleJob(\n entry: ReturnType<JobLedger['pendingJobs']>[number],\n log: (msg: string) => void,\n ): Promise<void> {\n const recoveryAbort = new AbortController();\n this.jobAbortControllers.add(recoveryAbort);\n const timeout = setTimeout(() => recoveryAbort.abort(), TOTAL_JOB_TIMEOUT_MS);\n\n try {\n this.ledger.incrementRetry(entry.job_id);\n const rawEvent = JSON.parse(entry.raw_event_json!);\n const fakeJob: IncomingJob = {\n jobId: entry.job_id,\n input: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n customerId: entry.customer_id,\n encrypted: false,\n rawEvent,\n };\n\n if (entry.status === 'executed' && entry.result !== undefined) {\n // Re-deliver only\n await this.transport.deliverResult(fakeJob, entry.result, entry.net_amount);\n this.ledger.markDelivered(entry.job_id);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: re-delivered`);\n } else if (entry.status === 'paid') {\n const skill = this.skills.route(entry.tags);\n if (!skill) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: no skill for tags, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n\n // Re-verify payment if reference was stored but confirmation lost to crash\n if (skill.priceSubunits > 0 && !entry.net_amount) {\n if (entry.payment_request) {\n const verified = await this.reVerifyPayment(\n entry,\n skill.priceSubunits,\n log,\n recoveryAbort.signal,\n );\n if (!verified) {\n this.ledger.markFailed(entry.job_id);\n return;\n }\n } else {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment not confirmed, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n }\n\n const output = await skill.execute(\n {\n data: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n jobId: entry.job_id,\n },\n { ...this.skillCtx, signal: recoveryAbort.signal },\n );\n\n this.ledger.markExecuted(entry.job_id, output.data);\n await this.transport.deliverResult(fakeJob, output.data, entry.net_amount);\n this.ledger.markDelivered(entry.job_id);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: re-executed and delivered`);\n }\n } finally {\n clearTimeout(timeout);\n this.jobAbortControllers.delete(recoveryAbort);\n }\n }\n\n /**\n * Re-verify an on-chain payment during crash recovery.\n *\n * Limitation: Solana transaction data expires after ~2-3 days (recent blockhash window).\n * If the agent was down longer, a confirmed payment may not be found on-chain and the\n * job will be marked failed. For mainnet: use monitoring, avoid extended downtime, or\n * configure an archive RPC via SOLANA_RPC_URL.\n */\n private async reVerifyPayment(\n entry: ReturnType<JobLedger['pendingJobs']>[number],\n priceSubunits: number,\n log: (msg: string) => void,\n signal?: AbortSignal,\n ): Promise<boolean> {\n try {\n const request = JSON.parse(entry.payment_request!);\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const protocolConfig = await this.fetchProtocolConfig();\n\n let result: { verified: boolean };\n if (signal) {\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n };\n if (signal.aborted) {\n abortHandler();\n return;\n }\n signal.addEventListener('abort', abortHandler, { once: true });\n });\n try {\n result = await Promise.race([\n payment.verifyPayment(rpc, request, protocolConfig),\n abortPromise,\n ]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(rpc, request, protocolConfig);\n }\n\n if (result.verified) {\n const fee = calculateProtocolFee(priceSubunits, protocolConfig.feeBps);\n const netAmount = priceSubunits - fee;\n this.ledger.updatePayment(entry.job_id, netAmount, entry.payment_request);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment re-verified (${netAmount} subunits)`);\n return true;\n }\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment not found on-chain, marking failed`);\n return false;\n } catch (e: any) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment re-verification error: ${e.message}`);\n return false;\n }\n }\n}\n","/**\n * Skill interface and registry.\n */\n\nimport { toDTag, type Asset } from '@elisym/sdk';\nimport type { SkillRateLimit } from '@elisym/sdk/llm-health';\nimport type { SkillLlmOverride, SkillMode } from '@elisym/sdk/skills';\n\nexport type { SkillLlmOverride, SkillMode, SkillRateLimit };\n\n/**\n * Resolved (provider, model, maxTokens) triple for an LLM-mode skill.\n * Computed once at startup in `start.ts` after `resolveSkillLlm`, then\n * attached to the skill instance so the runtime preflight can read it\n * without re-running resolution from `loaded.yaml`.\n */\nexport interface ResolvedSkillTriple {\n provider: string;\n model: string;\n maxTokens: number;\n}\n\nexport interface SkillInput {\n data: string;\n inputType: string;\n tags: string[];\n jobId: string;\n}\n\nexport interface SkillOutput {\n data: string;\n outputMime?: string;\n}\n\nexport interface SkillContext {\n /** Agent-default LLM client. Undefined when every LLM skill overrides. */\n llm?: LlmClient;\n /**\n * Resolve the LLM client for a skill. The runtime caches clients by\n * resolved (provider, model, maxTokens) triple. Pass the skill's\n * `llmOverride` (or undefined for the agent default).\n */\n getLlm?: (override?: SkillLlmOverride) => LlmClient | undefined;\n agentName: string;\n agentDescription: string;\n signal?: AbortSignal;\n}\n\nexport interface LlmClient {\n complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string>;\n completeWithTools(\n systemPrompt: string,\n messages: any[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult>;\n /** Format tool results into provider-specific messages (Anthropic vs OpenAI). */\n formatToolResultMessages(results: ToolResult[]): any[];\n}\n\nexport interface ToolDef {\n name: string;\n description: string;\n parameters: Array<{ name: string; description: string; required: boolean }>;\n}\n\nexport type CompletionResult =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; calls: ToolCall[]; assistantMessage: any };\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, any>;\n}\n\n/** Provider-agnostic tool result passed from ScriptSkill to LlmClient. */\nexport interface ToolResult {\n callId: string;\n content: string;\n}\n\n/**\n * A skill that can be executed by the agent runtime.\n *\n * Skills should be idempotent or tolerant of re-execution: if the agent crashes\n * after execute() returns but before the result is persisted, recovery will\n * re-execute the skill with the same input (at-least-once delivery).\n */\nexport interface Skill {\n name: string;\n description: string;\n capabilities: string[];\n /**\n * Price in subunits of `asset` (0 = free). For SOL: lamports (1e-9 SOL).\n * For USDC: 1e-6 USDC. Converted from SKILL.md's human-readable `price`.\n *\n * Number (not bigint) for ergonomics - realistic agent prices fit well\n * below `Number.MAX_SAFE_INTEGER` subunits.\n */\n priceSubunits: number;\n /** Asset the price is denominated in (NATIVE_SOL or USDC_SOLANA_DEVNET, etc.). */\n asset: Asset;\n /** Execution mode (`'llm'` for the historical LLM-orchestrated path). */\n mode: SkillMode;\n /**\n * Per-skill LLM override / dependency.\n *\n * For `mode: 'llm'`: overrides the agent default (provider/model/maxTokens)\n * for runtime LLM execution. The runtime constructs the LLM client from this.\n *\n * For script modes: declares which LLM API key the script depends on so\n * the runtime can health-monitor it (startup probe + reactive markUnhealthy\n * on `SCRIPT_EXIT_BILLING_EXHAUSTED` + lazy recovery). Only `provider` and\n * `model` are meaningful here; `maxTokens` is rejected at parse time.\n */\n llmOverride?: SkillLlmOverride;\n /** Hero image URL. */\n image?: string;\n /** Local file path for hero image (uploaded on first start). */\n imageFile?: string;\n /** On-disk skill directory (e.g. `<agent>/skills/whois-lookup`). */\n dir?: string;\n /**\n * Resolved (provider, model, maxTokens) for `mode: 'llm'` skills. Set\n * once at startup. Undefined for script modes - they use `llmOverride`\n * directly when declared. Read by the runtime to gate against the\n * `LlmHealthMonitor` before sending `payment-required`.\n */\n resolvedTriple?: ResolvedSkillTriple;\n /**\n * Optional per-skill rate limit declared in SKILL.md frontmatter\n * (snake_case `rate_limit` -> camelCase). Applies to any mode but the\n * runtime treats free LLM skills as the primary use case.\n */\n rateLimit?: SkillRateLimit;\n execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput>;\n}\n\nexport class SkillRegistry {\n private skills: Skill[] = [];\n private defaultIndex: number | null = null;\n\n register(skill: Skill): void {\n if (this.defaultIndex === null) {\n this.defaultIndex = this.skills.length;\n }\n this.skills.push(skill);\n }\n\n route(tags: string[]): Skill | null {\n // Match by skill name in canonical d-tag form. Outgoing capability cards\n // publish `['d', toDTag(card.name)]`, so incoming job tags arrive\n // d-tag-shaped (lowercase, ASCII letters + digits + hyphens). Comparing\n // raw `skill.name` only works when the name is already kebab-case;\n // normalize through `toDTag` so human-readable names route too.\n for (const tag of tags) {\n const byName = this.skills.find((skill) => toDTag(skill.name) === tag);\n if (byName) {\n return byName;\n }\n }\n // Then declared capability tags (secondary matching).\n for (const tag of tags) {\n const byCap = this.skills.find((skill) => skill.capabilities.includes(tag));\n if (byCap) {\n return byCap;\n }\n }\n // Default fallback only for genuinely untargeted jobs (no specific tag\n // beyond the 'elisym' protocol marker). A job that *does* carry a\n // specific capability tag must not silently degrade to a free default -\n // that was a payment-bypass vector.\n const hasSpecificTag = tags.some((tag) => tag && tag !== 'elisym');\n if (hasSpecificTag) {\n return null;\n }\n return this.defaultIndex !== null ? this.skills[this.defaultIndex]! : null;\n }\n\n allCapabilities(): string[] {\n return this.skills.flatMap((s) => s.capabilities);\n }\n\n isEmpty(): boolean {\n return this.skills.length === 0;\n }\n\n all(): Skill[] {\n return this.skills;\n }\n}\n","/**\n * CLI wrappers around the non-LLM SDK skill classes. They mirror the\n * pattern in `script-skill.ts` so the CLI's `Skill` interface\n * (`priceSubunits: number`, `mode`, `dir`) stays uniform across all\n * execution modes while delegating actual work to the shared SDK runners.\n */\nimport type { Asset } from '@elisym/sdk';\nimport {\n DynamicScriptSkill as SdkDynamicScriptSkill,\n StaticFileSkill as SdkStaticFileSkill,\n StaticScriptSkill as SdkStaticScriptSkill,\n type SkillLlmOverride,\n type SkillMode,\n} from '@elisym/sdk/skills';\nimport type { Skill, SkillContext, SkillInput, SkillOutput } from './index.js';\n\ninterface BaseParams {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n image?: string;\n imageFile?: string;\n /** On-disk skill directory. */\n dir: string;\n /**\n * For script modes: declared LLM dependency (provider+model). When set,\n * the runtime registers the pair with the health monitor and gates jobs\n * against it.\n */\n llmOverride?: SkillLlmOverride;\n}\n\nexport interface CliStaticFileSkillParams extends BaseParams {\n outputFilePath: string;\n}\n\nexport class StaticFileSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'static-file';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkStaticFileSkill;\n\n constructor(params: CliStaticFileSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkStaticFileSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n outputFilePath: params.outputFilePath,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n\nexport interface CliScriptSkillParams extends BaseParams {\n scriptPath: string;\n scriptArgs: string[];\n scriptTimeoutMs?: number;\n /** Full env for the script. CLI builds this from `process.env` + decrypted secrets. */\n scriptEnv?: NodeJS.ProcessEnv;\n}\n\nexport class StaticScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'static-script';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkStaticScriptSkill;\n\n constructor(params: CliScriptSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkStaticScriptSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n scriptPath: params.scriptPath,\n scriptArgs: params.scriptArgs,\n scriptTimeoutMs: params.scriptTimeoutMs,\n scriptEnv: params.scriptEnv,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n\nexport class DynamicScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'dynamic-script';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkDynamicScriptSkill;\n\n constructor(params: CliScriptSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkDynamicScriptSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n scriptPath: params.scriptPath,\n scriptArgs: params.scriptArgs,\n scriptTimeoutMs: params.scriptTimeoutMs,\n scriptEnv: params.scriptEnv,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n","/**\n * CLI ScriptSkill - thin wrapper over `@elisym/sdk/skills` ScriptSkill.\n *\n * Preserves the CLI's historical positional constructor and Skill\n * interface shape (priceSubunits as number, mutable image/imageFile\n * fields) while delegating all execution logic to the shared SDK\n * runner - so tool-use, spawn, max_tool_rounds, and timeout behaviour\n * stay identical to the plugin / SDK path.\n */\nimport { NATIVE_SOL, type Asset } from '@elisym/sdk';\nimport {\n ScriptSkill as SdkScriptSkill,\n type SkillLlmOverride,\n type SkillMode,\n type SkillToolDef,\n} from '@elisym/sdk/skills';\nimport type { Skill, SkillContext, SkillInput, SkillOutput } from './index.js';\n\n/**\n * CLI ScriptSkill constructor with a back-compat positional signature.\n *\n * The `asset` parameter is accepted in two positions:\n * - 5th (new code: `new ScriptSkill(name, desc, caps, price, asset, image, imageFile, dir,\n * prompt, tools, rounds)`) - preferred for USDC/multi-asset.\n * - As part of a trailing `{ asset }` init; else falls through to NATIVE_SOL\n * when the 5th positional slot is `undefined` / is actually an `image` string.\n *\n * This preserves older `new ScriptSkill(name, desc, caps, price, image, ...)` call sites\n * (internal tests) so we do not have to touch them to land USDC support.\n */\nexport class ScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'llm';\n readonly llmOverride?: SkillLlmOverride;\n image?: string;\n imageFile?: string;\n dir: string;\n private inner: SdkScriptSkill;\n\n constructor(\n name: string,\n description: string,\n capabilities: string[],\n priceSubunits: number,\n assetOrImage: Asset | string | undefined,\n imageOrImageFile: string | undefined,\n imageFileOrDir: string | undefined,\n dirOrPrompt: string,\n promptOrTools: string | SkillToolDef[],\n toolsOrRounds: SkillToolDef[] | number,\n rounds?: number,\n llmOverride?: SkillLlmOverride,\n ) {\n // Detect the new-style (asset passed as 5th arg) vs legacy-style (asset\n // omitted, image at 5th arg). An Asset has the shape { chain, token, decimals, symbol }.\n let asset: Asset;\n let image: string | undefined;\n let imageFile: string | undefined;\n let skillDir: string;\n let systemPrompt: string;\n let tools: SkillToolDef[];\n let maxToolRounds: number;\n\n if (assetOrImage !== undefined && typeof assetOrImage === 'object' && 'token' in assetOrImage) {\n // new-style: assetOrImage is Asset\n asset = assetOrImage;\n image = imageOrImageFile;\n imageFile = imageFileOrDir;\n skillDir = dirOrPrompt;\n systemPrompt = promptOrTools as string;\n tools = toolsOrRounds as SkillToolDef[];\n maxToolRounds = rounds as number;\n } else {\n // legacy-style: 5th arg is `image` (string or undefined), asset=NATIVE_SOL.\n asset = NATIVE_SOL;\n image = assetOrImage as string | undefined;\n imageFile = imageOrImageFile;\n skillDir = imageFileOrDir as string;\n systemPrompt = dirOrPrompt;\n tools = promptOrTools as SkillToolDef[];\n maxToolRounds = toolsOrRounds as number;\n }\n\n this.name = name;\n this.description = description;\n this.capabilities = capabilities;\n this.priceSubunits = priceSubunits;\n this.asset = asset;\n this.llmOverride = llmOverride;\n this.image = image;\n this.imageFile = imageFile;\n this.dir = skillDir;\n this.inner = new SdkScriptSkill({\n name,\n description,\n capabilities,\n priceSubunits: BigInt(Math.round(priceSubunits)),\n asset,\n skillDir,\n systemPrompt,\n tools,\n maxToolRounds,\n llmOverride,\n image,\n imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n","/**\n * CLI skill loader. Delegates SKILL.md parsing + validation to\n * `@elisym/sdk/skills` (one source of truth across plugin + CLI) and\n * constructs CLI's wrapper instances. CLI keeps its own Skill interface\n * (`priceSubunits: number` + `asset` + `mode`) so existing runtime.ts\n * call sites stay byte-for-byte compatible while supporting USDC and\n * non-LLM execution modes.\n */\nimport { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n DEFAULT_SCRIPT_TIMEOUT_MS,\n parseSkillMd,\n resolveInsidePath,\n validateSkillFrontmatter,\n type ParsedSkill,\n} from '@elisym/sdk/skills';\nimport { DynamicScriptSkill, StaticFileSkill, StaticScriptSkill } from './non-llm-skills.js';\nimport { ScriptSkill } from './script-skill.js';\nimport type { Skill } from './index.js';\n\nfunction buildCliSkill(\n parsed: ParsedSkill,\n entryPath: string,\n scriptEnv: NodeJS.ProcessEnv | undefined,\n): Skill {\n let skill: Skill;\n switch (parsed.mode) {\n case 'llm':\n skill = new ScriptSkill(\n parsed.name,\n parsed.description,\n parsed.capabilities,\n Number(parsed.priceSubunits),\n parsed.asset,\n parsed.image,\n parsed.imageFile,\n entryPath,\n parsed.systemPrompt,\n parsed.tools,\n parsed.maxToolRounds,\n parsed.llmOverride,\n );\n break;\n case 'static-file': {\n if (parsed.outputFile === undefined) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": internal error - outputFile missing for mode 'static-file'`,\n );\n }\n const outputFilePath = resolveInsidePath(entryPath, parsed.outputFile);\n if (!outputFilePath) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": \"output_file\" must stay inside the skill directory`,\n );\n }\n skill = new StaticFileSkill({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: Number(parsed.priceSubunits),\n asset: parsed.asset,\n outputFilePath,\n image: parsed.image,\n imageFile: parsed.imageFile,\n dir: entryPath,\n llmOverride: parsed.llmOverride,\n });\n break;\n }\n case 'static-script':\n case 'dynamic-script': {\n if (parsed.script === undefined) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": internal error - script missing for mode '${parsed.mode}'`,\n );\n }\n const scriptPath = resolveInsidePath(entryPath, parsed.script);\n if (!scriptPath) {\n throw new Error(`SKILL.md \"${parsed.name}\": \"script\" must stay inside the skill directory`);\n }\n const Ctor = parsed.mode === 'static-script' ? StaticScriptSkill : DynamicScriptSkill;\n skill = new Ctor({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: Number(parsed.priceSubunits),\n asset: parsed.asset,\n scriptPath,\n scriptArgs: parsed.scriptArgs,\n scriptTimeoutMs: parsed.scriptTimeoutMs ?? DEFAULT_SCRIPT_TIMEOUT_MS,\n scriptEnv,\n image: parsed.image,\n imageFile: parsed.imageFile,\n dir: entryPath,\n llmOverride: parsed.llmOverride,\n });\n break;\n }\n }\n if (parsed.rateLimit) {\n skill.rateLimit = parsed.rateLimit;\n }\n return skill;\n}\n\nexport interface LoadSkillsOptions {\n /**\n * Env propagated into script-mode skills (`static-script`, `dynamic-script`).\n * Typically `{ ...process.env, <PROVIDER_KEY>: <decrypted-secret>, ... }`\n * built from the agent's encrypted secrets, so scripts get the same\n * provider keys that LLM-mode skills already enjoy.\n */\n scriptEnv?: NodeJS.ProcessEnv;\n}\n\nexport function loadSkillsFromDir(skillsDir: string, options: LoadSkillsOptions = {}): Skill[] {\n const skills: Skill[] = [];\n\n let entries: string[];\n try {\n entries = readdirSync(skillsDir);\n } catch {\n return skills;\n }\n\n for (const entry of entries) {\n const entryPath = join(skillsDir, entry);\n try {\n if (!statSync(entryPath).isDirectory()) {\n continue;\n }\n } catch {\n continue;\n }\n\n const skillMdPath = join(entryPath, 'SKILL.md');\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const { frontmatter, systemPrompt } = parseSkillMd(content);\n const parsed = validateSkillFrontmatter(frontmatter, systemPrompt, {\n allowFreeSkills: true,\n });\n skills.push(buildCliSkill(parsed, entryPath, options.scriptEnv));\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.warn(` ! Skipping skill \"${entry}\": ${message}`);\n }\n }\n\n return skills;\n}\n","/**\n * NostrTransport - listens for targeted jobs on Nostr relays, delivers results.\n * Handles NIP-44 decryption, dedup, and retried delivery.\n */\nimport { BoundedSet, KIND_JOB_FEEDBACK, jobRequestKind } from '@elisym/sdk';\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport { verifyEvent, type Event, type Filter } from 'nostr-tools';\n\nexport interface IncomingJob {\n jobId: string;\n input: string;\n inputType: string;\n tags: string[];\n customerId: string;\n bid?: number;\n encrypted: boolean;\n rawEvent: Event;\n}\n\nexport type JobFeedbackStatus =\n | { type: 'payment-required'; amount: number; paymentRequest: string; chain: string }\n | { type: 'processing' }\n | { type: 'error'; message: string };\n\nfunction isEncrypted(event: Event): boolean {\n return event.tags.some((t) => t[0] === 'encrypted' && t[1] === 'nip44');\n}\n\nconst HEALTH_CHECK_IDLE_MS = 30 * 60 * 1000; // 30 minutes\n\nexport class NostrTransport {\n private sub: SubCloser | null = null;\n private seenIds = new BoundedSet<string>(10_000);\n private lastEventAt = Date.now();\n private onJob: ((job: IncomingJob) => void) | null = null;\n\n constructor(\n private client: ElisymClient,\n private identity: ElisymIdentity,\n private kindOffsets: number[],\n ) {}\n\n /** Start listening for targeted job requests. Decrypts NIP-44 content. */\n start(onJob: (job: IncomingJob) => void): void {\n this.onJob = onJob;\n // Reset idle clock: a fresh subscription hasn't been idle, even if we're\n // restarting after a pool reset where the last event is long in the past.\n this.lastEventAt = Date.now();\n const kinds = this.kindOffsets.map(jobRequestKind);\n\n this.sub = this.client.marketplace.subscribeToJobRequests(\n this.identity,\n kinds,\n (event: Event) => {\n this.lastEventAt = Date.now();\n\n // Dedup via BoundedSet\n if (this.seenIds.has(event.id)) {\n return;\n }\n this.seenIds.add(event.id);\n\n // Must have elisym tag\n const hasElisym = event.tags.some((t) => t[0] === 't' && t[1] === 'elisym');\n if (!hasElisym) {\n return;\n }\n\n // Extract tags\n const tags = event.tags.filter((t) => t[0] === 't').map((t) => t[1]!);\n const bidTag = event.tags.find((t) => t[0] === 'bid');\n const encrypted = isEncrypted(event);\n\n // SDK already decrypts NIP-44 content in subscribeToJobRequests\n const iTag = event.tags.find((t) => t[0] === 'i');\n let inputType = 'text';\n if (iTag?.[2]) {\n inputType = iTag[2];\n }\n const input = encrypted ? event.content : (iTag?.[1] ?? event.content);\n\n onJob({\n jobId: event.id,\n input,\n inputType,\n tags,\n customerId: event.pubkey,\n bid: bidTag?.[1] ? parseInt(bidTag[1], 10) : undefined,\n encrypted,\n rawEvent: event,\n });\n },\n );\n }\n\n /**\n * Wait for the customer's `payment-completed` feedback for a specific job\n * and return the on-chain Solana tx signature it carries.\n *\n * The customer publishes this event right after `confirmTransaction(... 'confirmed')`\n * succeeds (see packages/app/app/hooks/useBuyCapability.ts), so receiving it\n * lets the provider verify the payment with a single targeted\n * `getTransaction(sig, commitment: 'confirmed')` call instead of the\n * heavyweight `getSignaturesForAddress(reference)` index lookup. This is\n * dramatically more reliable on the public devnet RPC, which throttles and\n * lags the address index.\n *\n * Resolves with `null` if `signal` aborts or `timeoutMs` elapses before a\n * valid signature arrives. The timeout exists so a customer that disappears\n * after job submission does not hold a `p-limit` slot for the full payment\n * expiry window - without it this path waits forever on the relay.\n */\n waitForPaymentSignature(\n jobId: string,\n customerPubkey: string,\n signal: AbortSignal,\n timeoutMs?: number,\n ): Promise<string | null> {\n return new Promise((resolve) => {\n let settled = false;\n const filter: Filter = {\n kinds: [KIND_JOB_FEEDBACK],\n '#e': [jobId],\n authors: [customerPubkey],\n '#t': ['elisym'],\n since: Math.floor(Date.now() / 1000) - 5,\n };\n\n const finish = (sig: string | null) => {\n if (settled) {\n return;\n }\n settled = true;\n if (timer) {\n clearTimeout(timer);\n }\n signal.removeEventListener('abort', onAbort);\n sub.close();\n resolve(sig);\n };\n\n const sub = this.client.pool.subscribe(filter, (event: Event) => {\n if (settled) {\n return;\n }\n if (!verifyEvent(event)) {\n return;\n }\n const status = event.tags.find((t) => t[0] === 'status')?.[1];\n if (status !== 'payment-completed') {\n return;\n }\n const txTag = event.tags.find((t) => t[0] === 'tx');\n const sig = txTag?.[1];\n const chain = txTag?.[2];\n if (typeof sig !== 'string' || sig.length === 0) {\n return;\n }\n // Chain tag is optional for backwards compatibility, but if present it\n // must be 'solana' - we cannot verify a signature on another chain.\n if (chain !== undefined && chain !== 'solana') {\n return;\n }\n finish(sig);\n });\n\n const onAbort = () => finish(null);\n const timer =\n timeoutMs !== undefined && timeoutMs > 0 ? setTimeout(() => finish(null), timeoutMs) : null;\n\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n /** Send job feedback to customer. */\n async sendFeedback(job: IncomingJob, status: JobFeedbackStatus): Promise<void> {\n if (status.type === 'payment-required') {\n await this.client.marketplace.submitPaymentRequiredFeedback(\n this.identity,\n job.rawEvent,\n status.amount,\n status.paymentRequest,\n );\n } else if (status.type === 'processing') {\n await this.client.marketplace.submitProcessingFeedback(this.identity, job.rawEvent);\n } else if (status.type === 'error') {\n await this.client.marketplace.submitErrorFeedback(\n this.identity,\n job.rawEvent,\n status.message,\n );\n }\n }\n\n /** Deliver result to customer. Retries with exponential backoff via SDK. */\n async deliverResult(\n job: IncomingJob,\n content: string,\n amount?: number,\n retries = 3,\n ): Promise<string> {\n return this.client.marketplace.submitJobResultWithRetry(\n this.identity,\n job.rawEvent,\n content,\n amount,\n retries,\n );\n }\n\n /** Returns true if an event was received within the given idle window. */\n isHealthy(maxIdleMs = HEALTH_CHECK_IDLE_MS): boolean {\n return Date.now() - this.lastEventAt < maxIdleMs;\n }\n\n stop(): void {\n this.sub?.close();\n this.sub = null;\n }\n\n /**\n * Re-create the job subscription using the previously registered callback.\n * Call after `NostrPool.reset()` has torn down the underlying subscriptions.\n * `seenIds` is preserved across restarts (dedup survives reconnect);\n * `lastEventAt` is reset by `start()` so `isHealthy()` does not report\n * stale idleness immediately after a successful recovery.\n */\n restart(): void {\n this.stop();\n if (this.onJob) {\n this.start(this.onJob);\n }\n }\n}\n","/**\n * Watchdog - periodically verifies relay connectivity and subscription liveness,\n * rebuilds the Nostr pool and re-subscribes on failure.\n *\n * Works around a nostr-tools bug where a single WS error sets `skipReconnection=true`\n * and silently kills long-lived subscriptions for the rest of the process\n * (see `NostrPool.reset` in @elisym/sdk).\n *\n * Three independent triggers force a pool reset:\n * - `probe`: cheap `querySync` round-trip against relays.\n * - `self-ping`: full subscribeToPings -> sendPong round-trip via the agent's\n * own identity, catches the case where probe passes (fresh query works) but\n * the live subscription is already dead.\n * - `sleep-detect`: if the wall-clock gap between two consecutive ticks exceeds\n * `min(probeInterval, selfPingInterval) * SLEEP_DETECT_MULTIPLIER`, the host\n * was almost certainly suspended (macOS sleep, hibernation, container pause).\n * On suspend the WebSocket connections die from the relay side, but the next\n * probe may still pass via a freshly opened query - meanwhile the long-lived\n * ping subscription stays dead. Forcing a reset on the first post-suspend\n * tick avoids that window.\n */\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport type { Logger } from 'pino';\nimport {\n WATCHDOG_PROBE_INTERVAL_MS,\n WATCHDOG_PROBE_TIMEOUT_MS,\n WATCHDOG_SELF_PING_INTERVAL_MS,\n WATCHDOG_SELF_PING_TIMEOUT_MS,\n WATCHDOG_SLEEP_DETECT_MULTIPLIER,\n} from './helpers.js';\nimport type { NostrTransport } from './transport/nostr.js';\n\nexport interface WatchdogDeps {\n client: ElisymClient;\n identity: ElisymIdentity;\n transport: NostrTransport;\n onPing: (senderPubkey: string, nonce: string) => void;\n log: (message: string) => void;\n /** Optional structured logger for pool-reset and probe events. */\n logger?: Logger;\n probeIntervalMs?: number;\n probeTimeoutMs?: number;\n selfPingIntervalMs?: number;\n selfPingTimeoutMs?: number;\n /**\n * Optional `Date.now`-style provider. Tests inject a controlled clock to\n * simulate macOS sleep without firing intermediate `setInterval` callbacks\n * (see watchdog.test.ts). Production should leave this unset.\n */\n now?: () => number;\n}\n\nexport interface Watchdog {\n stop(): void;\n}\n\nexport function startWatchdog(deps: WatchdogDeps): Watchdog {\n const {\n client,\n identity,\n transport,\n onPing,\n log,\n logger,\n probeIntervalMs = WATCHDOG_PROBE_INTERVAL_MS,\n probeTimeoutMs = WATCHDOG_PROBE_TIMEOUT_MS,\n selfPingIntervalMs = WATCHDOG_SELF_PING_INTERVAL_MS,\n selfPingTimeoutMs = WATCHDOG_SELF_PING_TIMEOUT_MS,\n now = Date.now,\n } = deps;\n\n let pingSub: SubCloser = client.ping.subscribeToPings(identity, onPing);\n let stopped = false;\n // Separate flags: a slow probe must not suppress the self-ping that follows,\n // since they exercise different layers (short query vs. live subscription).\n let probeBusy = false;\n let selfPingBusy = false;\n let lastTickAt = now();\n\n const sleepDetectThresholdMs =\n Math.min(probeIntervalMs, selfPingIntervalMs) * WATCHDOG_SLEEP_DETECT_MULTIPLIER;\n\n // Must stay synchronous. Each timer callback checks `stopped` AFTER awaiting\n // probe/ping and BEFORE calling this function. As long as this function is\n // synchronous, it runs atomically - stop() cannot interleave between tearing\n // down old subscriptions and creating new ones. Any `await` inside would open\n // a window where stop() sets `stopped=true`, then after the await we resurrect\n // subscriptions and leak them for the rest of the process lifetime.\n const resetPoolAndResubscribe = (): void => {\n transport.stop();\n // pool.reset() also closes pingSub as part of its activeSubscriptions\n // teardown, so an explicit pingSub.close() here would be redundant.\n client.pool.reset();\n pingSub = client.ping.subscribeToPings(identity, onPing);\n transport.restart();\n };\n\n /**\n * Returns `true` if a wall-clock gap larger than the configured threshold\n * was observed since the last tick - in which case it has already forced a\n * pool reset and the caller should skip its normal health check. Each tick\n * (probe and self-ping) updates the shared `lastTickAt`, so consecutive\n * normal ticks see a gap close to one interval.\n */\n const detectAndHandleSleep = (): boolean => {\n const tickedAt = now();\n const delta = tickedAt - lastTickAt;\n lastTickAt = tickedAt;\n if (delta <= sleepDetectThresholdMs) {\n return false;\n }\n log(\n `[watchdog] tick gap ${delta}ms exceeds ${sleepDetectThresholdMs}ms threshold, ` +\n `forcing pool reset (host suspend / sleep detected)`,\n );\n logger?.info({ event: 'pool_reset', reason: 'sleep_detected', gapMs: delta }, 'pool reset');\n resetPoolAndResubscribe();\n return true;\n };\n\n const probeTimer = setInterval(async () => {\n if (stopped) {\n return;\n }\n if (detectAndHandleSleep()) {\n return;\n }\n if (probeBusy) {\n return;\n }\n probeBusy = true;\n try {\n const ok = await client.pool.probe(probeTimeoutMs);\n if (stopped || ok) {\n return;\n }\n log('[watchdog] relay probe failed, resetting pool and re-subscribing');\n logger?.info({ event: 'pool_reset', reason: 'probe_failed' }, 'pool reset');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] probe/reset error: ${errorMessage}`);\n logger?.warn({ event: 'probe_error', error: errorMessage }, 'watchdog probe/reset error');\n } finally {\n probeBusy = false;\n }\n }, probeIntervalMs);\n\n // CRITICAL: PingService caches \"online\" results for PING_CACHE_TTL_MS (30s in SDK).\n // `selfPingIntervalMs` MUST stay greater than that cache TTL, otherwise pingAgent\n // will keep returning cached `online: true` and the watchdog will never detect a\n // dead subscription. If PING_CACHE_TTL_MS grows in the SDK, bump this interval in\n // lockstep (see helpers.ts: WATCHDOG_SELF_PING_INTERVAL_MS).\n const selfPingTimer = setInterval(async () => {\n if (stopped) {\n return;\n }\n if (detectAndHandleSleep()) {\n return;\n }\n if (selfPingBusy) {\n return;\n }\n selfPingBusy = true;\n try {\n const result = await client.ping.pingAgent(identity.publicKey, selfPingTimeoutMs);\n if (stopped || result.online) {\n return;\n }\n log('[watchdog] self-ping failed, resetting pool and re-subscribing');\n logger?.info({ event: 'pool_reset', reason: 'self_ping_failed' }, 'pool reset');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] self-ping/reset error: ${errorMessage}`);\n logger?.warn(\n { event: 'self_ping_error', error: errorMessage },\n 'watchdog self-ping/reset error',\n );\n } finally {\n selfPingBusy = false;\n }\n }, selfPingIntervalMs);\n\n return {\n stop(): void {\n if (stopped) {\n return;\n }\n stopped = true;\n clearInterval(probeTimer);\n clearInterval(selfPingTimer);\n pingSub.close();\n },\n };\n}\n","/**\n * Wallet command - show SOL and USDC balance.\n */\nimport { USDC_SOLANA_DEVNET, formatAssetAmount, formatSol } from '@elisym/sdk';\nimport { loadAgent, listAgents } from '@elisym/sdk/agent-store';\nimport { address, createSolanaRpc } from '@solana/kit';\nimport { fetchUsdcBalance, getRpcUrl } from '../helpers.js';\n\nexport async function cmdWallet(name: string | undefined): Promise<void> {\n const cwd = process.cwd();\n\n if (!name) {\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.error('No agents found.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Select agent:',\n choices: agents.map((agent) => ({\n name: `${agent.name} (${agent.source})`,\n value: agent.name,\n })),\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const loaded = await loadAgent(name!, cwd, passphrase);\n\n const solPayment = loaded.yaml.payments.find((entry) => entry.chain === 'solana');\n if (!solPayment?.address) {\n console.error('Solana address not configured for this agent.');\n process.exit(1);\n }\n\n const rpcUrl = getRpcUrl(solPayment.network);\n const rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solPayment.address);\n const { value: balance } = await rpc.getBalance(walletAddress).send();\n const usdcBalance = await fetchUsdcBalance(rpc, walletAddress);\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Network: ${solPayment.network}`);\n console.log(` Address: ${solPayment.address}`);\n console.log(` SOL balance: ${formatSol(Number(balance))} (${balance} lamports)`);\n console.log(` USDC balance: ${formatAssetAmount(USDC_SOLANA_DEVNET, usdcBalance)}\\n`);\n}\n","/**\n * single source of truth for the package version. `index.ts` surfaces this string\n * via `commander`'s `--version`, so we read it from `package.json` at module load\n * instead of hardcoding a literal that can drift apart from the published version.\n *\n * Mirrors the same approach used in `@elisym/mcp` (`packages/mcp/src/utils.ts`).\n */\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction readPackageVersion(): string {\n try {\n // dist/index.js -> ../package.json (npm always ships package.json at the package root)\n const here = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf-8')) as {\n version: string;\n };\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nexport const PACKAGE_VERSION: string = readPackageVersion();\n"]}
1
+ {"version":3,"sources":["../src/llm/providers/http.ts","../src/llm/providers/anthropic.ts","../src/llm/providers/openai-compatible.ts","../src/llm/providers/deepseek.ts","../src/llm/providers/google.ts","../src/llm/providers/openai.ts","../src/llm/providers/xai.ts","../src/llm/registry.ts","../src/llm/index.ts","../src/commands/init.ts","../src/index.ts","../src/commands/profile.ts","../src/diagnostics.ts","../src/helpers.ts","../src/ledger.ts","../src/commands/start.ts","../src/llm/resolve.ts","../src/llm/cache.ts","../src/llm/keys.ts","../src/logging.ts","../src/runtime.ts","../src/skill/index.ts","../src/skill/non-llm-skills.ts","../src/skill/script-skill.ts","../src/skill/loader.ts","../src/transport/nostr.ts","../src/watchdog.ts","../src/commands/wallet.ts","../src/version.ts"],"names":["resolve","bodyLooksLikeBilling","fetchModels","verifyKey","verifyKeyDeep","DEFAULT_MAX_TOKENS","DEFAULT_MODEL","FALLBACK_MODELS","BILLING_BODY_MARKERS","descriptor","yaml","isAddress","writeSecrets","readFileSync","skillList","calculateProtocolFee","SdkStaticFileSkill","SdkStaticScriptSkill","SdkDynamicScriptSkill","NATIVE_SOL","SdkScriptSkill","createSolanaRpc","address","formatAssetAmount","USDC_SOLANA_DEVNET","join","RELAYS","jobRequestKind","toDTag","listAgents","cmdInit","loadAgent","isEncrypted","formatSol","dirname","ElisymIdentity","nip19"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared HTTP helpers for provider clients: timeout-aware fetch and a\n * retry wrapper that handles 429/5xx with exponential backoff and\n * `Retry-After`. Provider descriptors compose these so each new\n * provider does not re-derive timeout/abort plumbing.\n */\n\nconst LLM_TIMEOUT_MS = 120_000;\nconst MAX_RETRIES = 2;\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\n\nfunction createAbortError(): Error {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n return err;\n}\n\nfunction sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n };\n const onAbort = (): void => {\n cleanup();\n reject(createAbortError());\n };\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nexport async function fetchWithTimeout(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), LLM_TIMEOUT_MS);\n const onAbort = (): void => controller.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n }\n}\n\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n let response: Response;\n try {\n response = await fetchWithTimeout(url, init, signal);\n } catch (error) {\n const name = error instanceof Error ? error.name : '';\n if (attempt >= MAX_RETRIES || name === 'AbortError') {\n throw error;\n }\n await sleepWithSignal(Math.min(1000 * 2 ** attempt, 8000), signal);\n continue;\n }\n if (response.ok || attempt >= MAX_RETRIES || !RETRYABLE_STATUSES.has(response.status)) {\n return response;\n }\n const retryAfter = response.headers.get('retry-after');\n const delay = retryAfter\n ? Math.min(parseInt(retryAfter, 10) * 1000 || 1000 * 2 ** attempt, 30_000)\n : Math.min(1000 * 2 ** attempt, 8000);\n await response.body?.cancel().catch(() => undefined);\n await sleepWithSignal(delay, signal);\n }\n}\n","/**\n * Anthropic provider descriptor + client.\n *\n * Exports a pure `LlmProviderDescriptor`; `../registry.ts` imports it\n * statically and registers it at module init. Imports from the registry\n * are type-only to keep the dependency edge one-way.\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MODEL = 'claude-haiku-4-5-20251001';\nconst DEFAULT_MAX_TOKENS = 4096;\nconst FALLBACK_MODELS = ['claude-sonnet-4-6', 'claude-haiku-4-5-20251001', 'claude-opus-4-6'];\n\ninterface AnthropicContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n}\n\ninterface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n}\n\ninterface AnthropicResponse {\n content?: AnthropicContentBlock[];\n usage?: AnthropicUsage;\n}\n\ninterface AnthropicClientConfig {\n apiKey: string;\n model: string;\n maxTokens: number;\n logUsage?: boolean;\n}\n\nexport class AnthropicClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: AnthropicClientConfig) {}\n\n private logTokens(usage: AnthropicUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.input_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const response = await fetchWithRetry(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: systemPrompt,\n messages: [{ role: 'user', content: userInput }],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as AnthropicResponse;\n this.logTokens(data.usage);\n const textBlock = data.content?.find((block) => block.type === 'text');\n return textBlock?.text ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const anthropicTools = tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n }));\n\n const response = await fetchWithRetry(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: systemPrompt,\n messages,\n tools: anthropicTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as AnthropicResponse;\n this.logTokens(data.usage);\n const content = data.content ?? [];\n\n const toolUses = content.filter((block) => block.type === 'tool_use');\n if (toolUses.length > 0) {\n const calls: ToolCall[] = toolUses.map((block) => ({\n id: block.id ?? '',\n name: block.name ?? '',\n arguments: block.input ?? {},\n }));\n return {\n type: 'tool_use',\n calls,\n assistantMessage: { role: 'assistant', content },\n };\n }\n const textBlock = content.find((block) => block.type === 'text');\n return { type: 'text', text: textBlock?.text ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return [\n {\n role: 'user',\n content: results.map((result) => ({\n type: 'tool_result',\n tool_use_id: result.callId,\n content: result.content,\n })),\n },\n ];\n }\n}\n\nasync function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/models?limit=1000',\n {\n method: 'GET',\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n },\n signal,\n );\n if (!response.ok) {\n return FALLBACK_MODELS;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const models = (data.data ?? []).map((entry) => entry.id).sort();\n return models.length > 0 ? models : FALLBACK_MODELS;\n } catch {\n return FALLBACK_MODELS;\n }\n}\n\nasync function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/models?limit=1',\n {\n method: 'GET',\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient'];\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Deep verification: actually invokes the messages endpoint with\n * max_tokens=1. Costs a fraction of a cent per probe but distinguishes\n * billing-exhausted accounts from valid ones - `/v1/models` returns 200\n * even when the org has $0 balance.\n *\n * Use this at startup, runtime preflight, and heartbeat. Use the cheap\n * `verifyKey` only for UI commands where billing isn't relevant.\n */\nasync function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: 1,\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 400 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nexport const ANTHROPIC_PROVIDER: LlmProviderDescriptor = {\n id: 'anthropic',\n displayName: 'Anthropic (Claude)',\n envVar: 'ANTHROPIC_API_KEY',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient: (config) =>\n new AnthropicClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n logUsage: config.logUsage,\n }),\n};\n","/**\n * Shared OpenAI-compatible client + descriptor factory.\n *\n * Powers providers that speak the OpenAI Chat Completions wire format\n * (xAI, Google's Gemini compat endpoint, DeepSeek). The native OpenAI\n * descriptor lives in `./openai.ts` and stays separate because it\n * carries OpenAI-specific reasoning-model quirks (`max_completion_tokens`,\n * `developer` role) the others don't need.\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { CreateLlmClientConfig, LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MAX_TOKENS = 4096;\nconst DEFAULT_BILLING_MARKERS = ['credit balance', 'billing', 'insufficient_quota', 'insufficient'];\n\ninterface OpenAIToolCall {\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\ninterface OpenAIMessage {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n}\n\ninterface OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAICompatibleClientConfig {\n apiKey: string;\n baseUrl: string;\n model: string;\n maxTokens: number;\n /** Provider name used in error messages (e.g. \"xAI\", \"Google\", \"DeepSeek\"). */\n providerLabel: string;\n logUsage?: boolean;\n}\n\nexport class OpenAICompatibleClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: OpenAICompatibleClientConfig) {}\n\n private logTokens(usage: OpenAIUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.prompt_tokens ?? 0;\n const outputTokens = usage.completion_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const response = await fetchWithRetry(\n `${this.config.baseUrl}/chat/completions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(\n `${this.config.providerLabel} API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n },\n }));\n\n const response = await fetchWithRetry(\n `${this.config.baseUrl}/chat/completions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n messages: [{ role: 'system', content: systemPrompt }, ...messages],\n tools: openaiTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(\n `${this.config.providerLabel} API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n const toolCalls = message?.tool_calls ?? [];\n\n if (toolCalls.length > 0) {\n const calls: ToolCall[] = toolCalls.map((call) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(call.function?.arguments ?? '{}') as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: call.id ?? '', name: call.function?.name ?? '', arguments: args };\n });\n return { type: 'tool_use', calls, assistantMessage: message };\n }\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return results.map((result) => ({\n role: 'tool',\n tool_call_id: result.callId,\n content: result.content,\n }));\n }\n}\n\nexport interface OpenAICompatibleProviderConfig {\n id: string;\n displayName: string;\n envVar: string;\n /** Base URL up to but not including `/chat/completions` or `/models`, no trailing slash. */\n baseUrl: string;\n defaultModel: string;\n fallbackModels: string[];\n /**\n * Optional transform applied to each `data[].id` returned by `/models`.\n * Returning `null` drops the entry. Use to strip prefixes (Gemini's\n * compat endpoint returns `models/<id>`) or filter non-chat models.\n */\n mapModelId?: (id: string) => string | null;\n /** Extra billing-detection markers concatenated with the shared defaults. */\n extraBillingMarkers?: string[];\n}\n\nexport function createOpenAICompatibleProvider(\n config: OpenAICompatibleProviderConfig,\n): LlmProviderDescriptor {\n const billingMarkers = [...DEFAULT_BILLING_MARKERS, ...(config.extraBillingMarkers ?? [])];\n\n function bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return billingMarkers.some((marker) => lower.includes(marker));\n }\n\n async function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/models`,\n { method: 'GET', headers: { Authorization: `Bearer ${apiKey}` } },\n signal,\n );\n if (!response.ok) {\n return config.fallbackModels;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const transformed: string[] = [];\n for (const entry of data.data ?? []) {\n const mapped = config.mapModelId ? config.mapModelId(entry.id) : entry.id;\n if (mapped) {\n transformed.push(mapped);\n }\n }\n transformed.sort();\n return transformed.length > 0 ? transformed : config.fallbackModels;\n } catch {\n return config.fallbackModels;\n }\n }\n\n async function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/models`,\n { method: 'GET', headers: { Authorization: `Bearer ${apiKey}` } },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n }\n\n async function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n ): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/chat/completions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n max_tokens: 1,\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if ((response.status === 400 || response.status === 429) && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n }\n\n function createClient(clientConfig: CreateLlmClientConfig): LlmClient {\n return new OpenAICompatibleClient({\n apiKey: clientConfig.apiKey,\n baseUrl: config.baseUrl,\n model: clientConfig.model ?? config.defaultModel,\n maxTokens: clientConfig.maxTokens ?? DEFAULT_MAX_TOKENS,\n providerLabel: config.displayName,\n logUsage: clientConfig.logUsage,\n });\n }\n\n return {\n id: config.id,\n displayName: config.displayName,\n envVar: config.envVar,\n defaultModel: config.defaultModel,\n fallbackModels: config.fallbackModels,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient,\n };\n}\n","/**\n * DeepSeek provider descriptor.\n *\n * DeepSeek's API is OpenAI-compatible at `https://api.deepseek.com/v1`,\n * so this is a thin wrapper around `createOpenAICompatibleProvider`.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'deepseek-chat';\nconst FALLBACK_MODELS = ['deepseek-chat', 'deepseek-reasoner'];\n\nexport const DEEPSEEK_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'deepseek',\n displayName: 'DeepSeek',\n envVar: 'DEEPSEEK_API_KEY',\n baseUrl: 'https://api.deepseek.com/v1',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n});\n","/**\n * Google (Gemini) provider descriptor.\n *\n * Uses Google's OpenAI-compatible endpoint at\n * `https://generativelanguage.googleapis.com/v1beta/openai`. The\n * `/models` route returns ids prefixed with `models/`; the model id\n * mapper strips that prefix and drops non-Gemini entries (embeddings,\n * legacy PaLM, etc.) so the picker only shows usable chat models.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'gemini-2.5-flash';\nconst FALLBACK_MODELS = ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.0-flash'];\nconst MODELS_PREFIX = 'models/';\n\nfunction mapGeminiModelId(id: string): string | null {\n const stripped = id.startsWith(MODELS_PREFIX) ? id.slice(MODELS_PREFIX.length) : id;\n return stripped.startsWith('gemini') ? stripped : null;\n}\n\nexport const GOOGLE_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'google',\n displayName: 'Google (Gemini)',\n envVar: 'GEMINI_API_KEY',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n mapModelId: mapGeminiModelId,\n});\n","/**\n * OpenAI provider descriptor + client.\n *\n * Exports a pure `LlmProviderDescriptor`; `../registry.ts` imports it\n * statically and registers it at module init. The client also handles\n * the reasoning-model quirk (o1/o3/o4 + gpt-5 family use\n * `max_completion_tokens` and `developer` role instead of `max_tokens`\n * and `system`).\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MODEL = 'gpt-4o-mini';\nconst DEFAULT_MAX_TOKENS = 4096;\nconst FALLBACK_MODELS = ['gpt-4o', 'gpt-4o-mini', 'o3-mini'];\n\ninterface OpenAIToolCall {\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\ninterface OpenAIMessage {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n}\n\ninterface OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAIClientConfig {\n apiKey: string;\n model: string;\n maxTokens: number;\n logUsage?: boolean;\n}\n\nexport function isOpenAIReasoningModel(model: string): boolean {\n return /^o\\d/.test(model) || /^gpt-5(\\b|[-.])/.test(model);\n}\n\nexport class OpenAIClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: OpenAIClientConfig) {}\n\n private isReasoningModel(): boolean {\n return isOpenAIReasoningModel(this.config.model);\n }\n\n private logTokens(usage: OpenAIUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.prompt_tokens ?? 0;\n const outputTokens = usage.completion_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const reasoning = this.isReasoningModel();\n const response = await fetchWithRetry(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n ...(reasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: reasoning ? 'developer' : 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n },\n }));\n\n const reasoning = this.isReasoningModel();\n const response = await fetchWithRetry(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n ...(reasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: reasoning ? 'developer' : 'system', content: systemPrompt },\n ...messages,\n ],\n tools: openaiTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n const toolCalls = message?.tool_calls ?? [];\n\n if (toolCalls.length > 0) {\n const calls: ToolCall[] = toolCalls.map((call) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(call.function?.arguments ?? '{}') as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: call.id ?? '', name: call.function?.name ?? '', arguments: args };\n });\n return { type: 'tool_use', calls, assistantMessage: message };\n }\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return results.map((result) => ({\n role: 'tool',\n tool_call_id: result.callId,\n content: result.content,\n }));\n }\n}\n\nasync function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/models',\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n },\n signal,\n );\n if (!response.ok) {\n return FALLBACK_MODELS;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const models = (data.data ?? [])\n .map((entry) => entry.id)\n .filter(\n (id) =>\n (id.startsWith('gpt-') ||\n id.startsWith('o1') ||\n id.startsWith('o3') ||\n id.startsWith('o4') ||\n id.startsWith('chatgpt-')) &&\n !id.includes('instruct') &&\n !id.includes('realtime') &&\n !id.includes('audio') &&\n !id.includes('tts') &&\n !id.includes('whisper'),\n )\n .sort();\n return models.length > 0 ? models : FALLBACK_MODELS;\n } catch {\n return FALLBACK_MODELS;\n }\n}\n\nasync function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/models',\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient_quota', 'insufficient'];\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Deep verification: actually invokes chat completions with\n * max_tokens=1. Distinguishes billing-exhausted accounts from valid ones,\n * including OpenAI's specific 429 + `insufficient_quota` body shape.\n *\n * Use this at startup, runtime preflight, and heartbeat. Use the cheap\n * `verifyKey` only for UI commands where billing isn't relevant.\n */\nasync function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n try {\n const reasoning = isOpenAIReasoningModel(model);\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n ...(reasoning ? { max_completion_tokens: 1 } : { max_tokens: 1 }),\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 429 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 400 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nexport const OPENAI_PROVIDER: LlmProviderDescriptor = {\n id: 'openai',\n displayName: 'OpenAI (GPT)',\n envVar: 'OPENAI_API_KEY',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient: (config) =>\n new OpenAIClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n logUsage: config.logUsage,\n }),\n isReasoningModel: isOpenAIReasoningModel,\n};\n","/**\n * xAI (Grok) provider descriptor.\n *\n * xAI exposes an OpenAI-compatible Chat Completions endpoint at\n * `https://api.x.ai/v1`, so this is a thin wrapper around\n * `createOpenAICompatibleProvider`.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'grok-3-mini';\nconst FALLBACK_MODELS = ['grok-4', 'grok-3', 'grok-3-mini'];\n\nexport const XAI_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'xai',\n displayName: 'xAI (Grok)',\n envVar: 'XAI_API_KEY',\n baseUrl: 'https://api.x.ai/v1',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n});\n","/**\n * Pluggable LLM provider registry.\n *\n * Each provider (Anthropic, OpenAI, future Grok/Gemini/...) lives as a\n * `LlmProviderDescriptor` in its own file under `./providers/`. The CLI\n * looks up env-var name, default model, model list, key verification,\n * and client construction through this registry, so adding a provider\n * is one descriptor file plus one registration call below.\n *\n * Builtins are imported statically and registered at module init. The\n * descriptor files reach back to this module only via `import type`, so\n * there is no runtime cycle - registry evaluation completes before any\n * descriptor's runtime body runs.\n */\n\nimport type { LlmKeyVerification } from '@elisym/sdk/llm-health';\nimport type { LlmClient } from '@elisym/sdk/skills';\nimport { ANTHROPIC_PROVIDER } from './providers/anthropic';\nimport { DEEPSEEK_PROVIDER } from './providers/deepseek';\nimport { GOOGLE_PROVIDER } from './providers/google';\nimport { OPENAI_PROVIDER } from './providers/openai';\nimport { XAI_PROVIDER } from './providers/xai';\n\nexport type { LlmKeyVerification } from '@elisym/sdk/llm-health';\n\n/**\n * Config passed to a descriptor's `createClient`. Mirrors the SDK's\n * `LlmClientConfig` minus `provider` (already implied by the descriptor)\n * plus an optional `logUsage` flag the client uses to print token\n * counts to stdout. CLI-internal type so SDK clients (none any more)\n * stay log-free.\n */\nexport interface CreateLlmClientConfig {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n /** Print `[LLM] <model> tokens: in=N out=M (total: in=… out=…)` after each call. */\n logUsage?: boolean;\n}\n\n/**\n * Token usage extracted from a provider's raw response. Reserved for\n * future telemetry hooks; concrete clients log their own usage today.\n */\nexport interface LlmUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\nexport interface LlmProviderDescriptor {\n /** Stable identifier used in elisym.yaml `llm.provider` and SKILL.md `provider:`. */\n id: string;\n /** Human-readable label for interactive prompts. */\n displayName: string;\n /** Operator-facing env var that supplies the API key when no per-agent secret is set. */\n envVar: string;\n /** Default model when neither agent nor skill picks one. */\n defaultModel: string;\n /** Hard-coded fallback list when `fetchModels` cannot reach the provider. */\n fallbackModels: string[];\n /** Pull the live model list from the provider. Returns `fallbackModels` on failure. */\n fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]>;\n /**\n * Lightweight authenticated probe before the agent publishes capabilities.\n * Hits a metadata endpoint (e.g. `/v1/models`) so it does not consume\n * billing credits. Used for UI commands and as a cheap liveness check.\n */\n verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification>;\n /**\n * Authoritative deep probe that consumes a single token from the\n * provider's billing account. Distinguishes invalid keys, billing/quota\n * exhaustion, and transient unavailability. Used at agent startup,\n * runtime preflight, and the LLM health heartbeat.\n *\n * Caller passes the model the skill will actually use - billing checks\n * are scoped to that model since some orgs gate access per model.\n */\n verifyKeyDeep(apiKey: string, model: string, signal?: AbortSignal): Promise<LlmKeyVerification>;\n /** Build a fresh `LlmClient` for the given config (apiKey + model + maxTokens + logUsage). */\n createClient(config: CreateLlmClientConfig): LlmClient;\n /** True when the model uses provider-specific reasoning quirks (e.g. OpenAI o1/o3/gpt-5 family). */\n isReasoningModel?(model: string): boolean;\n}\n\nconst REGISTRY = new Map<string, LlmProviderDescriptor>();\n\n/**\n * Register or replace a provider descriptor. Calling twice with the same\n * `id` overwrites the prior entry - useful for tests.\n */\nexport function registerLlmProvider(descriptor: LlmProviderDescriptor): void {\n REGISTRY.set(descriptor.id, descriptor);\n}\n\n/** Look up a provider by id. Returns undefined when not registered. */\nexport function getLlmProvider(id: string): LlmProviderDescriptor | undefined {\n return REGISTRY.get(id);\n}\n\n/** Snapshot of all registered descriptors. Order: registration order. */\nexport function listLlmProviders(): LlmProviderDescriptor[] {\n return Array.from(REGISTRY.values());\n}\n\n/** Snapshot of all registered ids. */\nexport function getRegisteredProviderIds(): string[] {\n return Array.from(REGISTRY.keys());\n}\n\n// Builtin registration. Order here is the registration order seen by\n// `listLlmProviders` and the order interactive prompts will offer.\nregisterLlmProvider(ANTHROPIC_PROVIDER);\nregisterLlmProvider(OPENAI_PROVIDER);\nregisterLlmProvider(XAI_PROVIDER);\nregisterLlmProvider(GOOGLE_PROVIDER);\nregisterLlmProvider(DEEPSEEK_PROVIDER);\n","/**\n * CLI-level LLM facade.\n *\n * The provider registry, descriptors, and concrete client classes\n * (Anthropic, OpenAI) live under `./providers/` + `./registry.ts`.\n * Concrete clients implement `logUsage` themselves (printing token\n * counts to stdout after each API response) - keeping log code in the\n * client lets it read the raw provider response without an extra\n * round-trip. SDK clients no longer exist; CLI is the only consumer.\n *\n * This module exposes:\n * - `createLlmClient(config)`: registry-driven factory\n * - `verifyLlmApiKey(provider, key)`: registry-driven probe\n * - `LlmConfig`, `LlmProvider`, `LlmKeyVerification` shapes\n * - registry surface (`getLlmProvider`, `listLlmProviders`,\n * `getRegisteredProviderIds`, `registerLlmProvider`)\n */\n\nimport type { LlmClient } from '@elisym/sdk/skills';\nimport { getLlmProvider, getRegisteredProviderIds, type LlmKeyVerification } from './registry';\n\nexport type { LlmKeyVerification, LlmProviderDescriptor, LlmUsage } from './registry';\nexport {\n getLlmProvider,\n getRegisteredProviderIds,\n listLlmProviders,\n registerLlmProvider,\n} from './registry';\n\nexport type LlmProvider = string;\n\nexport interface LlmConfig {\n provider: LlmProvider;\n apiKey: string;\n model: string;\n maxTokens: number;\n /** Print `[LLM] <model> tokens: in=N out=M ...` after each call. Default: false. */\n logUsage?: boolean;\n}\n\n/**\n * Build an `LlmClient` for the given config. Throws when the provider\n * id is not registered (typically a typo in elisym.yaml or SKILL.md\n * `provider:` override).\n */\nexport function createLlmClient(config: LlmConfig): LlmClient {\n const descriptor = getLlmProvider(config.provider);\n if (!descriptor) {\n const known = getRegisteredProviderIds().join(', ') || '<none>';\n throw new Error(`Unknown LLM provider \"${config.provider}\". Registered: ${known}.`);\n }\n if (!config.apiKey) {\n throw new Error(`${descriptor.envVar} is required for skill runtime`);\n }\n return descriptor.createClient({\n apiKey: config.apiKey,\n model: config.model,\n maxTokens: config.maxTokens,\n logUsage: config.logUsage,\n });\n}\n\n/**\n * Verify that an LLM API key is accepted by the provider before the agent\n * publishes capabilities. Delegates to the descriptor's `verifyKey`.\n *\n * Cheap probe (Anthropic/OpenAI `/v1/models`) - validates the key is\n * accepted but does NOT detect billing exhaustion. Use this for UI\n * commands like `profile` or `init` where biller status is irrelevant;\n * use `verifyLlmApiKeyDeep` for authoritative checks (startup, runtime\n * preflight, heartbeat).\n */\nexport async function verifyLlmApiKey(\n provider: LlmProvider,\n apiKey: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n return {\n ok: false,\n reason: 'unavailable',\n error: `Unknown LLM provider \"${provider}\"`,\n };\n }\n return descriptor.verifyKey(apiKey, signal);\n}\n\n/**\n * Authoritative probe that consumes a single billing token to verify the\n * key is both valid AND has credits available for the requested model.\n * Costs ~$0.00001 on Haiku 4.5; negligible at startup and 5-min\n * heartbeat cadences.\n */\nexport async function verifyLlmApiKeyDeep(\n provider: LlmProvider,\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n return {\n ok: false,\n reason: 'unavailable',\n error: `Unknown LLM provider \"${provider}\"`,\n };\n }\n return descriptor.verifyKeyDeep(apiKey, model, signal);\n}\n","/**\n * Init command - create a new agent.\n *\n * Usage:\n * elisym init [name] Interactive wizard; creates in ~/.elisym/<name>/.\n * elisym init [name] --config <path> Non-interactive; loads YAML template.\n * elisym init [name] --defaults Non-interactive; uses the same defaults the\n * wizard would have suggested (description =\n * \"An elisym AI agent\", default relays, no\n * payments, no LLM, no encryption). Combine with\n * --local / --passphrase to override pieces.\n * elisym init [name] --local Create in project <project>/.elisym/<name>/.\n * elisym init [name] --passphrase <p> Skip passphrase prompt (\"\" = no encryption).\n * elisym init [name] --yes Skip overwrite/shadow confirm prompts.\n */\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { validateAgentName, RELAYS } from '@elisym/sdk';\nimport {\n ElisymYamlSchema,\n createAgentDir,\n resolveInHome,\n resolveInProject,\n writeExampleSkillTemplate,\n writeSecrets,\n writeYamlInitial,\n type AgentSource,\n type ElisymYaml,\n} from '@elisym/sdk/agent-store';\nimport { isAddress } from '@solana/kit';\nimport { generateSecretKey, getPublicKey, nip19 } from 'nostr-tools';\nimport YAML from 'yaml';\nimport { getLlmProvider, listLlmProviders } from '../llm';\n\nexport interface InitOptions {\n config?: string;\n defaults?: boolean;\n local?: boolean;\n passphrase?: string;\n yes?: boolean;\n}\n\nfunction buildDefaultYaml(): ElisymYaml {\n return ElisymYamlSchema.parse({\n description: 'An elisym AI agent',\n relays: [...RELAYS],\n payments: [],\n security: {},\n });\n}\n\n/**\n * Delegate to the descriptor's `fetchModels`. Returns `[]` if the\n * provider id is not registered (defensive - in practice the caller\n * only passes ids it pulled from the same registry). Falls back to the\n * descriptor's `fallbackModels` when the live `fetchModels` call throws.\n */\nexport async function fetchModels(provider: string, apiKey: string): Promise<string[]> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n console.warn(` ! Unknown provider \"${provider}\". No models available.`);\n return [];\n }\n try {\n return await descriptor.fetchModels(apiKey);\n } catch (e: any) {\n console.warn(` ! Could not fetch models: ${e.message}. Using defaults.`);\n return descriptor.fallbackModels;\n }\n}\n\nfunction pickTarget(options: InitOptions): AgentSource {\n return options.local ? 'project' : 'home';\n}\n\nexport async function cmdInit(nameArg?: string, options: InitOptions = {}): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n const cwd = process.cwd();\n\n console.log('\\n elisym agent setup\\n');\n\n if (options.config && options.defaults) {\n throw new Error('--config and --defaults are mutually exclusive; pick one.');\n }\n\n // --defaults means \"no prompts\" - imply --yes for shadow/overwrite confirms.\n const skipConfirms = options.yes || options.defaults;\n\n // Step 1: YAML template (optional) - from --config file or --defaults skeleton.\n let template: ElisymYaml | undefined;\n if (options.config) {\n const configPath = resolve(cwd, options.config);\n const raw = readFileSync(configPath, 'utf-8');\n template = ElisymYamlSchema.parse(YAML.parse(raw) ?? {});\n console.log(` Loaded template from ${configPath}\\n`);\n } else if (options.defaults) {\n template = buildDefaultYaml();\n console.log(' Using default skeleton (no LLM, no payments). Edit later via `profile`.\\n');\n }\n\n // Step 2: Agent name (arg > prompt).\n const agentName = await resolveAgentName(nameArg, inquirer);\n\n // Step 3: Shadow / overwrite checks. With --yes, overwrite fails closed\n // (never silently clobber secrets) while shadow / sibling-location prompts\n // take their recommended default.\n const target = pickTarget(options);\n const sameLocation =\n target === 'home' ? resolveInHome(agentName) : resolveInProject(agentName, cwd);\n if (sameLocation) {\n if (skipConfirms) {\n throw new Error(\n `Agent \"${agentName}\" already exists at ${sameLocation}. Refusing to overwrite secrets under --yes/--defaults. Remove the directory first or choose a different name.`,\n );\n }\n const { overwrite } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'overwrite',\n message: `Agent \"${agentName}\" already exists at ${sameLocation}. Overwrite secrets?`,\n default: false,\n },\n ]);\n if (!overwrite) {\n console.log('Aborted.');\n return;\n }\n } else if (target === 'project' && resolveInHome(agentName)) {\n if (!skipConfirms) {\n const { shadow } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shadow',\n message: `A global agent \"${agentName}\" exists in ~/.elisym/${agentName}/. Create a project-local shadow?`,\n default: true,\n },\n ]);\n if (!shadow) {\n console.log('Aborted.');\n return;\n }\n }\n } else if (target === 'home' && resolveInProject(agentName, cwd)) {\n if (!skipConfirms) {\n const { proceed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'proceed',\n message: `A project-local agent \"${agentName}\" exists. Create a global agent with the same name?`,\n default: true,\n },\n ]);\n if (!proceed) {\n console.log('Aborted.');\n return;\n }\n }\n }\n\n // Step 4: Build YAML. If a template was loaded, reuse it; otherwise prompt\n // interactively. promptYaml also returns the API key it collected so we\n // don't re-prompt in Step 5.\n let yaml: ElisymYaml;\n let promptedApiKey: string | undefined;\n if (template) {\n yaml = template;\n } else {\n const result = await promptYaml(inquirer);\n yaml = result.yaml;\n promptedApiKey = result.apiKey;\n }\n\n // Step 5: LLM API key for the default provider (from env, then reuse\n // prompt-collected key, else prompt). Provider labels and env var\n // names come from the descriptor.\n let defaultProviderKey: string | undefined;\n const defaultProviderId = yaml.llm?.provider;\n if (yaml.llm && defaultProviderId) {\n const descriptor = getLlmProvider(defaultProviderId);\n const envKey = descriptor ? process.env[descriptor.envVar] : undefined;\n if (envKey && descriptor) {\n defaultProviderKey = envKey;\n console.log(` Using ${descriptor.envVar} from environment.`);\n } else if (promptedApiKey) {\n defaultProviderKey = promptedApiKey;\n } else {\n const label = descriptor?.displayName ?? defaultProviderId;\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${label} API key:`,\n mask: '*',\n },\n ]);\n defaultProviderKey = apiKey || undefined;\n }\n }\n\n // Step 5b: Optional API keys for OTHER registered providers - used by\n // skills that declare a `provider:` override in their SKILL.md. Skipped\n // when running from a YAML template (non-interactive); operators can\n // supply per-provider keys via env vars or by editing `.secrets.json`.\n const otherProviderKeys = new Map<string, string>();\n if (yaml.llm && !template && defaultProviderId) {\n const otherDescriptors = listLlmProviders().filter(\n (descriptor) => descriptor.id !== defaultProviderId,\n );\n for (const descriptor of otherDescriptors) {\n const otherEnvKey = process.env[descriptor.envVar];\n const { configureOther } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'configureOther',\n message: `Configure ${descriptor.displayName} API key too (for skills that override the default provider)?`,\n default: Boolean(otherEnvKey),\n },\n ]);\n if (!configureOther) {\n continue;\n }\n if (otherEnvKey) {\n otherProviderKeys.set(descriptor.id, otherEnvKey);\n console.log(` Using ${descriptor.envVar} from environment.`);\n } else {\n const { promptedOther } = await inquirer.prompt([\n {\n type: 'password',\n name: 'promptedOther',\n message: `${descriptor.displayName} API key:`,\n mask: '*',\n },\n ]);\n if (promptedOther) {\n otherProviderKeys.set(descriptor.id, promptedOther);\n }\n }\n }\n }\n\n // Step 6: Passphrase for encrypting secrets. Flag wins over env var wins\n // over interactive prompt. Empty string (\"\") is an explicit opt-out from\n // encryption, distinct from \"flag not provided\". --defaults implies no\n // encryption when neither flag nor env is set.\n let passphrase = '';\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n if (options.passphrase !== undefined) {\n passphrase = options.passphrase;\n } else if (envPassphrase !== undefined) {\n passphrase = envPassphrase;\n } else if (options.defaults) {\n passphrase = '';\n } else {\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'passphrase',\n message: 'Passphrase to encrypt secrets (leave empty to skip):',\n mask: '*',\n },\n ]);\n passphrase = answer.passphrase ?? '';\n if (passphrase) {\n const { confirmPassphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'confirmPassphrase',\n message: 'Confirm passphrase:',\n mask: '*',\n validate: (value: string) => value === passphrase || 'Passphrases do not match',\n },\n ]);\n void confirmPassphrase;\n }\n }\n\n // Step 7: Generate Nostr identity.\n const nostrSecretBytes = generateSecretKey();\n const nostrPubkey = getPublicKey(nostrSecretBytes);\n const nostrSecretHex = Buffer.from(nostrSecretBytes).toString('hex');\n\n // Step 8: Create agent directory + write files. Each provider's key\n // lands in `secrets.llm_api_keys[<provider-id>]`; the start-time\n // resolver reads them directly (or falls back to the matching env\n // var via the descriptor).\n const created = await createAgentDir({ target, name: agentName, cwd });\n const collectedKeys = new Map<string, string>(otherProviderKeys);\n if (yaml.llm && defaultProviderKey) {\n collectedKeys.set(yaml.llm.provider, defaultProviderKey);\n }\n const llmApiKeys = Object.fromEntries(collectedKeys);\n await writeYamlInitial(created.dir, yaml);\n await writeExampleSkillTemplate(created.dir);\n await writeSecrets(\n created.dir,\n {\n nostr_secret_key: nostrSecretHex,\n llm_api_keys: Object.keys(llmApiKeys).length > 0 ? llmApiKeys : undefined,\n },\n passphrase || undefined,\n );\n\n const npub = nip19.npubEncode(nostrPubkey);\n console.log(`\\n Agent \"${agentName}\" created (${target}).`);\n console.log(` Location: ${created.dir}`);\n console.log(` Nostr: ${npub}`);\n if (yaml.payments[0]?.address) {\n console.log(` Solana: ${yaml.payments[0].address}`);\n }\n if (passphrase) {\n console.log(' Secrets encrypted with your passphrase.');\n }\n console.log();\n}\n\nasync function resolveAgentName(\n nameArg: string | undefined,\n inquirer: { prompt: any },\n): Promise<string> {\n if (nameArg) {\n validateAgentName(nameArg);\n return nameArg;\n }\n const { inputName } = await inquirer.prompt([\n {\n type: 'input',\n name: 'inputName',\n message: 'Agent name:',\n validate: (value: string) => {\n try {\n validateAgentName(value);\n return true;\n } catch (e: any) {\n return e.message;\n }\n },\n },\n ]);\n validateAgentName(inputName);\n return inputName;\n}\n\nasync function promptYaml(inquirer: {\n prompt: any;\n}): Promise<{ yaml: ElisymYaml; apiKey?: string }> {\n const { description } = await inquirer.prompt([\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: 'An elisym AI agent',\n },\n ]);\n\n const { displayName } = await inquirer.prompt([\n {\n type: 'input',\n name: 'displayName',\n message: 'Display name (optional, for UI):',\n default: '',\n },\n ]);\n\n const { picture } = await inquirer.prompt([\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar file (relative to agent dir, e.g. ./avatar.png) or URL:',\n default: '',\n },\n ]);\n\n const { banner } = await inquirer.prompt([\n {\n type: 'input',\n name: 'banner',\n message: 'Banner file (relative to agent dir, e.g. ./header.png) or URL:',\n default: '',\n },\n ]);\n\n const { solanaAddress } = await inquirer.prompt([\n {\n type: 'input',\n name: 'solanaAddress',\n message: 'Solana address for receiving payments (leave empty to skip):',\n default: '',\n validate: (value: string) => {\n if (!value) {\n return true;\n }\n return isAddress(value) || 'Invalid Solana address';\n },\n },\n ]);\n\n if (solanaAddress) {\n console.log(\n ' The wallet receives every asset on Solana (SOL directly, USDC and other\\n' +\n ' SPL tokens via their ATA). Each skill declares its own price and token\\n' +\n ' in SKILL.md. Fund with SOL via `solana airdrop` or USDC via https://faucet.circle.com.',\n );\n }\n\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n {\n name: 'None (non-LLM agent - static-file / static-script / dynamic-script only)',\n value: 'none',\n },\n ...listLlmProviders().map((descriptor) => ({\n name: descriptor.displayName,\n value: descriptor.id,\n })),\n ],\n },\n ]);\n\n const baseYaml = {\n display_name: displayName || undefined,\n description,\n picture: picture || undefined,\n banner: banner || undefined,\n relays: [...RELAYS],\n payments: solanaAddress ? [{ chain: 'solana', network: 'devnet', address: solanaAddress }] : [],\n security: {},\n };\n\n if (llmProvider === 'none') {\n const yaml: ElisymYaml = ElisymYamlSchema.parse(baseYaml);\n return { yaml };\n }\n\n const descriptor = getLlmProvider(llmProvider);\n if (!descriptor) {\n throw new Error(`Internal: provider \"${llmProvider}\" not registered.`);\n }\n const envKey = process.env[descriptor.envVar];\n let apiKey: string | undefined = envKey;\n if (!apiKey) {\n const { promptedKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'promptedKey',\n message: `${descriptor.displayName} API key:`,\n mask: '*',\n },\n ]);\n apiKey = promptedKey || undefined;\n }\n\n console.log(' Fetching available models...');\n const models = await fetchModels(llmProvider, apiKey ?? '');\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n },\n ]);\n\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: 4096,\n },\n ]);\n\n const yaml: ElisymYaml = ElisymYamlSchema.parse({\n ...baseYaml,\n llm: { provider: llmProvider, model, max_tokens: maxTokens },\n });\n // envKey is returned only when the user explicitly typed it (not when\n // pulled from process.env) - the env-var path is handled in cmdInit Step 5.\n return { yaml, apiKey: envKey ? undefined : apiKey };\n}\n","import { ElisymIdentity } from '@elisym/sdk';\nimport { listAgents, loadAgent } from '@elisym/sdk/agent-store';\n/**\n * elisym CLI - agent runner for the elisym network.\n *\n * Commands:\n * elisym init [name] [--config <path>] [--defaults] [--local] Create a new agent\n * elisym start [name] Start agent in provider mode\n * elisym list List all agents\n * elisym profile [name] Edit agent profile\n * elisym wallet [name] Show wallet balance\n */\nprocess.removeAllListeners('warning');\nimport { Command } from 'commander';\nimport { nip19 } from 'nostr-tools';\nimport { cmdInit, type InitOptions } from './commands/init.js';\nimport { cmdProfile } from './commands/profile.js';\nimport { cmdStart } from './commands/start.js';\nimport { cmdWallet } from './commands/wallet.js';\nimport { PACKAGE_VERSION } from './version.js';\n\n/**\n * Wrap an action handler so any thrown Error surfaces as a single clean line\n * with exit 1 instead of an unhandled-rejection stack trace.\n */\nfunction safe<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T): Promise<void> => {\n try {\n await fn(...args);\n } catch (e) {\n console.error(`Error: ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n };\n}\n\nconst program = new Command()\n .name('elisym')\n .description('CLI agent runner for the elisym network')\n .version(PACKAGE_VERSION);\n\n// Init\nprogram\n .command('init [name]')\n .description('Create a new agent')\n .option('-c, --config <path>', 'Load fields from an elisym.yaml template (non-interactive)')\n .option(\n '--defaults',\n 'Skip every prompt and use the same defaults the wizard would have suggested (description, default relays, no payments, no LLM, no encryption). Mutually exclusive with --config.',\n )\n .option('--local', 'Create in project <project>/.elisym/<name>/ (default: ~/.elisym/<name>/)')\n .option(\n '--passphrase <value>',\n 'Passphrase to encrypt secrets at rest. Empty string (\"\") skips encryption. Also reads ELISYM_PASSPHRASE env var. When neither is provided, prompts interactively.',\n )\n .option(\n '--yes',\n 'Skip confirmation prompts (shadow/sibling-location). Fails closed on an existing agent at the same location - never overwrites secrets silently.',\n )\n .action(\n safe(async (name: string | undefined, options: InitOptions) => {\n await cmdInit(name, options);\n }),\n );\n\n// Profile\nprogram\n .command('profile [name]')\n .description('Edit agent profile, wallet, and LLM settings')\n .action(safe(cmdProfile));\n\n// Start\nprogram\n .command('start [name]')\n .description('Start agent in provider mode')\n .option(\n '-v, --verbose',\n 'Enable debug logging (relay lifecycle, publish acks, subscription EOSE). Also togglable via ELISYM_DEBUG=1 or LOG_LEVEL=debug.',\n )\n .action(\n safe(async (name: string | undefined, options: { verbose?: boolean }) => {\n await cmdStart(name, options);\n }),\n );\n\n// List\nprogram\n .command('list')\n .description('List all agents (project-local and home-global)')\n .action(\n safe(async () => {\n const cwd = process.cwd();\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.log('No agents found. Run `npx @elisym/cli init` to create one.');\n return;\n }\n console.log('\\nAgents:');\n for (const agent of agents) {\n try {\n const loaded = await loadAgent(agent.name, cwd);\n const identity = ElisymIdentity.fromHex(loaded.secrets.nostr_secret_key);\n const npub = nip19.npubEncode(identity.publicKey);\n const solAddr = loaded.yaml.payments[0]?.address\n ? ` | Solana: ${loaded.yaml.payments[0].address}`\n : '';\n const shadow = agent.shadowsGlobal ? ' [shadows global]' : '';\n console.log(` ${agent.name} (${agent.source})${shadow} | ${npub}${solAddr}`);\n } catch (e: any) {\n const hint = /encrypted secrets/i.test(e?.message ?? '') ? ' (encrypted)' : '';\n console.log(` ${agent.name} (${agent.source})${hint}`);\n }\n }\n console.log();\n }),\n );\n\n// Wallet\nprogram.command('wallet [name]').description('Show wallet balance').action(safe(cmdWallet));\n\nprogram.parse();\n","import {\n listAgents,\n loadAgent,\n writeSecrets,\n writeYaml,\n type ElisymYaml,\n type LlmEntry,\n type Secrets,\n} from '@elisym/sdk/agent-store';\n/**\n * Profile command - edit agent profile, wallet, and LLM settings.\n * Writes back to elisym.yaml (public) and .secrets.json (private).\n */\nimport { isAddress } from '@solana/kit';\nimport { getLlmProvider, listLlmProviders } from '../llm';\n\nexport async function cmdProfile(name: string | undefined): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n const cwd = process.cwd();\n\n if (!name) {\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.error('No agents found. Run `npx @elisym/cli init` first.');\n process.exit(1);\n }\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Select agent:',\n choices: agents.map((agent) => ({\n name: `${agent.name} (${agent.source})`,\n value: agent.name,\n })),\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const loaded = await loadAgent(name!, cwd, passphrase);\n\n console.log(`\\n Editing agent \"${name}\" (${loaded.source})\\n`);\n\n let done = false;\n while (!done) {\n const { section } = await inquirer.prompt([\n {\n type: 'list',\n name: 'section',\n message: 'What to edit?',\n choices: [\n {\n name: `Profile (description: ${truncate(loaded.yaml.description ?? '')})`,\n value: 'profile',\n },\n {\n name: `Wallet (${loaded.yaml.payments[0]?.address ?? 'not configured'})`,\n value: 'wallet',\n },\n {\n name: `LLM (${loaded.yaml.llm?.provider ?? 'not configured'} / ${loaded.yaml.llm?.model ?? '-'})`,\n value: 'llm',\n },\n { name: 'Done', value: 'done' },\n ],\n },\n ]);\n\n if (section === 'done') {\n done = true;\n continue;\n }\n\n if (section === 'profile') {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'displayName',\n message: 'Display name (for UI):',\n default: loaded.yaml.display_name ?? '',\n },\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: loaded.yaml.description ?? '',\n },\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar (relative path or URL, empty to clear):',\n default: loaded.yaml.picture ?? '',\n },\n {\n type: 'input',\n name: 'banner',\n message: 'Banner (relative path or URL, empty to clear):',\n default: loaded.yaml.banner ?? '',\n },\n ]);\n\n const nextYaml: ElisymYaml = {\n ...loaded.yaml,\n display_name: answers.displayName || undefined,\n description: answers.description ?? '',\n picture: answers.picture || undefined,\n banner: answers.banner || undefined,\n };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n console.log(' Profile updated.\\n');\n }\n\n if (section === 'wallet') {\n const current = loaded.yaml.payments[0];\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Solana address (empty to clear):',\n default: current?.address ?? '',\n validate: (value: string) => {\n if (!value) {\n return true;\n }\n return isAddress(value) || 'Invalid Solana address';\n },\n },\n ]);\n\n const nextYaml: ElisymYaml = {\n ...loaded.yaml,\n payments: answers.address\n ? [{ chain: 'solana', network: 'devnet', address: answers.address }]\n : [],\n };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n console.log(' Wallet updated.\\n');\n }\n\n if (section === 'llm') {\n const providerChoices = listLlmProviders().map((descriptor) => ({\n name: descriptor.displayName,\n value: descriptor.id,\n }));\n if (providerChoices.length === 0) {\n console.error(' ! No LLM providers registered.');\n continue;\n }\n const firstChoice = providerChoices[0];\n if (!firstChoice) {\n console.error(' ! No LLM providers registered.');\n continue;\n }\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'Default LLM provider (used by skills without a `provider:` override):',\n choices: providerChoices,\n default: loaded.yaml.llm?.provider ?? firstChoice.value,\n },\n ]);\n const defaultDescriptor = getLlmProvider(llmProvider);\n if (!defaultDescriptor) {\n throw new Error(`Internal: provider \"${llmProvider}\" not registered.`);\n }\n\n const defaultKeyStatus = describeKeyStatus(loaded.secrets, llmProvider);\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${defaultDescriptor.displayName} API key [${defaultKeyStatus}] (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n\n const probeKey = apiKey || pickPlainKey(loaded.secrets, llmProvider);\n\n console.log(' Fetching available models...');\n const { fetchModels } = await import('./init.js');\n const models = await fetchModels(llmProvider, probeKey);\n\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n default: loaded.yaml.llm?.model,\n },\n ]);\n\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: loaded.yaml.llm?.max_tokens ?? 4096,\n },\n ]);\n\n // Optional keys for OTHER registered providers (used by skills\n // that override the default provider in their SKILL.md).\n const otherDescriptors = listLlmProviders().filter(\n (descriptor) => descriptor.id !== llmProvider,\n );\n const otherKeys = new Map<string, string>();\n for (const descriptor of otherDescriptors) {\n const status = describeKeyStatus(loaded.secrets, descriptor.id);\n const { otherApiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'otherApiKey',\n message: `${descriptor.displayName} API key for skill overrides [${status}] (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n if (otherApiKey) {\n otherKeys.set(descriptor.id, otherApiKey);\n }\n }\n\n const nextLlm: LlmEntry = { provider: llmProvider, model, max_tokens: maxTokens };\n const nextYaml: ElisymYaml = { ...loaded.yaml, llm: nextLlm };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n\n if (apiKey || otherKeys.size > 0) {\n const nextLlmApiKeys: Record<string, string> = {\n ...(loaded.secrets.llm_api_keys ?? {}),\n };\n if (apiKey) {\n nextLlmApiKeys[llmProvider] = apiKey;\n }\n for (const [providerId, key] of otherKeys) {\n nextLlmApiKeys[providerId] = key;\n }\n const nextSecrets: Secrets = {\n ...loaded.secrets,\n llm_api_keys: nextLlmApiKeys,\n };\n await writeSecrets(loaded.dir, nextSecrets, passphrase);\n loaded.secrets = nextSecrets;\n }\n console.log(' LLM updated.\\n');\n }\n }\n\n console.log(` Agent \"${name}\" saved.\\n`);\n}\n\nfunction truncate(value: string, max = 40): string {\n if (value.length <= max) {\n return value;\n }\n return value.slice(0, max - 1) + '…';\n}\n\n/** Status hint shown next to the API-key prompt so the user knows what's stored. */\nfunction describeKeyStatus(secrets: Secrets, providerId: string): string {\n return secrets.llm_api_keys?.[providerId] ? 'set' : 'not set';\n}\n\n/** Pick the stored key for model probing. `loaded.secrets` is post-decrypt, so values are plaintext. */\nfunction pickPlainKey(secrets: Secrets, providerId: string): string {\n const value = secrets.llm_api_keys?.[providerId];\n return typeof value === 'string' ? value : '';\n}\n","/**\n * Opt-in relay diagnostics. Resolves each relay hostname via DNS and\n * opens a TCP probe to the relay port. Activated by `ELISYM_NET_DIAG=1`\n * so operators can separately diagnose \"WSS fails but everything else\n * looks fine\" scenarios common on WSL, Docker, or corporate firewalls.\n *\n * Never called on a hot path - one-shot at startup.\n */\nimport { lookup } from 'node:dns/promises';\nimport { Socket } from 'node:net';\nimport type { Logger } from 'pino';\n\nconst TCP_PROBE_TIMEOUT_MS = 3_000;\n\nexport interface RelayProbeResult {\n url: string;\n host: string;\n port: number;\n ips: string[];\n tcpOpenMs?: number;\n error?: string;\n}\n\nfunction parseRelayUrl(url: string): { host: string; port: number } | null {\n try {\n const parsed = new URL(url);\n const isSecure = parsed.protocol === 'wss:' || parsed.protocol === 'https:';\n const defaultPort = isSecure ? 443 : 80;\n const port = parsed.port.length > 0 ? parseInt(parsed.port, 10) : defaultPort;\n if (!Number.isFinite(port)) {\n return null;\n }\n return { host: parsed.hostname, port };\n } catch {\n return null;\n }\n}\n\nasync function tcpProbe(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<{ openMs: number } | { error: string }> {\n return new Promise((resolve) => {\n const started = Date.now();\n const socket = new Socket();\n let settled = false;\n\n const finish = (result: { openMs: number } | { error: string }): void => {\n if (settled) {\n return;\n }\n settled = true;\n socket.destroy();\n resolve(result);\n };\n\n const timer = setTimeout(() => finish({ error: 'timeout' }), timeoutMs);\n\n socket.once('connect', () => {\n clearTimeout(timer);\n finish({ openMs: Date.now() - started });\n });\n socket.once('error', (err) => {\n clearTimeout(timer);\n finish({ error: err.message });\n });\n\n socket.connect(port, host);\n });\n}\n\nexport async function probeRelays(\n relays: string[],\n logger: Logger,\n timeoutMs: number = TCP_PROBE_TIMEOUT_MS,\n): Promise<RelayProbeResult[]> {\n const results: RelayProbeResult[] = [];\n for (const url of relays) {\n const parsed = parseRelayUrl(url);\n if (!parsed) {\n logger.debug({ event: 'net_diag_parse_failed', url }, 'unparseable relay URL');\n results.push({ url, host: '', port: 0, ips: [], error: 'invalid URL' });\n continue;\n }\n const { host, port } = parsed;\n let ips: string[] = [];\n try {\n const resolved = await lookup(host, { all: true });\n ips = resolved.map((entry) => entry.address);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(\n { event: 'net_diag_dns_failed', url, host, error: message },\n 'DNS lookup failed',\n );\n results.push({ url, host, port, ips: [], error: `dns: ${message}` });\n continue;\n }\n\n const probe = await tcpProbe(host, port, timeoutMs);\n if ('openMs' in probe) {\n logger.debug(\n { event: 'net_diag_tcp_open', url, host, port, ips, tcpOpenMs: probe.openMs },\n 'TCP open',\n );\n results.push({ url, host, port, ips, tcpOpenMs: probe.openMs });\n } else {\n logger.debug(\n { event: 'net_diag_tcp_failed', url, host, port, ips, error: probe.error },\n 'TCP probe failed',\n );\n results.push({ url, host, port, ips, error: `tcp: ${probe.error}` });\n }\n }\n return results;\n}\n","/**\n * Shared CLI helpers - RPC URLs, SOL formatting, price validation.\n */\nimport { USDC_SOLANA_DEVNET, calculateProtocolFee } from '@elisym/sdk';\nimport { type Rpc, type SolanaRpcApi, address } from '@solana/kit';\n\n// --- Constants ---\n\nexport const RENT_EXEMPT_MINIMUM = 890_880; // lamports\nexport const MAX_CONCURRENT_JOBS = 10;\nexport const RECOVERY_MAX_RETRIES = 5;\nexport const RECOVERY_INTERVAL_SECS = 60;\nexport const WATCHDOG_PROBE_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\nexport const WATCHDOG_PROBE_TIMEOUT_MS = 10_000;\nexport const WATCHDOG_SELF_PING_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes\nexport const WATCHDOG_SELF_PING_TIMEOUT_MS = 15_000;\n/**\n * If a watchdog tick fires after a wall-clock gap larger than the smaller of\n * its two intervals multiplied by this factor, the gap is treated as host\n * suspension (macOS sleep, hibernation, container pause) rather than normal\n * scheduling jitter. Both `setInterval` callbacks freeze during OS sleep and\n * fire late on resume; the tick that detects the gap forces an immediate pool\n * reset instead of running the regular probe/self-ping (which would race\n * against still-half-dead WebSocket state).\n */\nexport const WATCHDOG_SLEEP_DETECT_MULTIPLIER = 2;\n\n// --- Solana RPC ---\n\nexport function getRpcUrl(_network: string): string {\n const envUrl = process.env.SOLANA_RPC_URL;\n if (envUrl) {\n return envUrl;\n }\n // Only devnet is supported until the elisym-config program ships on mainnet.\n return 'https://api.devnet.solana.com';\n}\n\n// --- SOL formatting (number only, no \" SOL\" suffix - use SDK's formatSol for display) ---\n\nexport function formatLamports(lamports: number): string {\n const whole = Math.floor(lamports / 1_000_000_000);\n const frac = lamports % 1_000_000_000;\n return `${whole}.${String(frac).padStart(9, '0')}`;\n}\n\n// --- SOL parsing ---\n\nexport function parseSolToLamports(s: string): number | null {\n const trimmed = s.trim();\n if (!trimmed) {\n return null;\n }\n\n const dotPos = trimmed.indexOf('.');\n if (dotPos === -1) {\n const whole = parseInt(trimmed, 10);\n if (isNaN(whole) || whole < 0) {\n return null;\n }\n return whole * 1_000_000_000;\n }\n\n const wholePart = dotPos === 0 ? 0 : parseInt(trimmed.slice(0, dotPos), 10);\n if (isNaN(wholePart)) {\n return null;\n }\n\n const fracStr = trimmed.slice(dotPos + 1);\n if (fracStr.length === 0 || fracStr.length > 9) {\n return null;\n }\n\n const padded = fracStr.padEnd(9, '0');\n const frac = parseInt(padded, 10);\n if (isNaN(frac)) {\n return null;\n }\n\n return wholePart * 1_000_000_000 + frac;\n}\n\n// --- USDC balance ---\n\n/**\n * Sum the agent's USDC token-account balances (raw subunits) on the connected\n * Solana RPC. Returns 0n on any error or when the asset has no mint configured;\n * callers display \"0 USDC\" rather than failing the whole banner.\n */\nexport async function fetchUsdcBalance(\n rpc: Rpc<SolanaRpcApi>,\n owner: ReturnType<typeof address>,\n): Promise<bigint> {\n const mint = USDC_SOLANA_DEVNET.mint;\n if (!mint) {\n return 0n;\n }\n try {\n const response = await rpc\n .getTokenAccountsByOwner(\n owner,\n { mint: address(mint) },\n { encoding: 'jsonParsed', commitment: 'confirmed' },\n )\n .send();\n let total = 0n;\n for (const entry of response.value) {\n const parsed = entry.account.data as\n | { parsed?: { info?: { tokenAmount?: { amount?: string } } } }\n | undefined;\n const raw = parsed?.parsed?.info?.tokenAmount?.amount;\n if (typeof raw === 'string') {\n total += BigInt(raw);\n }\n }\n return total;\n } catch {\n return 0n;\n }\n}\n\n// --- Price validation ---\n\nexport function validateJobPrice(\n lamports: number,\n accountFunded: boolean,\n feeBps: number,\n): string | null {\n if (lamports === 0) {\n return null;\n }\n const fee = calculateProtocolFee(lamports, feeBps);\n const providerNet = lamports - fee;\n if (!accountFunded && providerNet < RENT_EXEMPT_MINIMUM) {\n const pct = (feeBps / 100).toFixed(2);\n return (\n `Price too low. After ${pct}% fee, provider receives ${providerNet} lamports, ` +\n `which is below rent-exempt minimum (${RENT_EXEMPT_MINIMUM}). Increase price or fund wallet first.`\n );\n }\n return null;\n}\n","/**\n * Job recovery ledger - persistent JSON storage for crash recovery.\n */\nimport { readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nexport type LedgerStatus = 'paid' | 'executed' | 'delivered' | 'failed';\n\nexport interface LedgerEntry {\n job_id: string;\n status: LedgerStatus;\n input: string;\n input_type: string;\n tags: string[];\n customer_id: string;\n bid?: number;\n payment_request?: string;\n net_amount?: number;\n result?: string;\n raw_event_json?: string;\n created_at: number;\n retry_count: number;\n}\n\nconst VALID_TRANSITIONS: Record<LedgerStatus, LedgerStatus[]> = {\n paid: ['executed', 'failed'],\n executed: ['delivered', 'failed'],\n delivered: [],\n failed: [],\n};\n\nexport class JobLedger {\n private entries = new Map<string, LedgerEntry>();\n private path: string;\n\n /**\n * @param ledgerPath absolute path to the ledger file\n * (typically `<agentDir>/.jobs.json`). Caller is responsible for\n * resolving the agent directory via `@elisym/sdk/agent-store`.\n */\n constructor(ledgerPath: string) {\n this.path = ledgerPath;\n this.load();\n }\n\n private load(): void {\n try {\n const raw = readFileSync(this.path, 'utf-8');\n const data = JSON.parse(raw) as Record<string, LedgerEntry>;\n for (const [id, entry] of Object.entries(data)) {\n this.entries.set(id, entry);\n }\n } catch (e: any) {\n // W4: Log warning on malformed ledger and backup corrupt file\n if (e?.code !== 'ENOENT') {\n console.warn(` ! Ledger load warning: ${e?.message ?? 'unknown error'}`);\n try {\n renameSync(this.path, this.path + '.corrupt.' + Date.now());\n } catch {\n /* best effort backup */\n }\n }\n }\n }\n\n flush(): void {\n const dir = dirname(this.path);\n mkdirSync(dir, { recursive: true });\n const obj = Object.fromEntries(this.entries);\n const tmp = this.path + '.tmp';\n writeFileSync(tmp, JSON.stringify(obj, null, 2));\n renameSync(tmp, this.path);\n }\n\n recordPaid(entry: Omit<LedgerEntry, 'status' | 'retry_count'>): void {\n if (this.entries.has(entry.job_id)) {\n return;\n }\n this.entries.set(entry.job_id, { ...entry, status: 'paid', retry_count: 0 });\n this.flush();\n }\n\n updatePayment(jobId: string, netAmount?: number, paymentRequest?: string): void {\n const entry = this.entries.get(jobId);\n if (entry) {\n if (netAmount !== undefined) {\n entry.net_amount = netAmount;\n }\n if (paymentRequest !== undefined) {\n entry.payment_request = paymentRequest;\n }\n this.flush();\n }\n }\n\n /** Attempt a state transition. Returns the entry if valid, undefined otherwise. */\n private transition(jobId: string, to: LedgerStatus): LedgerEntry | undefined {\n const entry = this.entries.get(jobId);\n if (!entry) {\n return undefined;\n }\n if (!VALID_TRANSITIONS[entry.status].includes(to)) {\n return undefined;\n }\n entry.status = to;\n return entry;\n }\n\n markExecuted(jobId: string, result: string): void {\n const entry = this.transition(jobId, 'executed');\n if (entry) {\n entry.result = result;\n this.flush();\n }\n }\n\n markDelivered(jobId: string): void {\n const entry = this.transition(jobId, 'delivered');\n if (entry) {\n entry.result = undefined; // Free memory\n this.flush();\n }\n }\n\n markFailed(jobId: string): void {\n const entry = this.transition(jobId, 'failed');\n if (entry) {\n entry.result = undefined; // Free memory\n try {\n this.flush();\n } catch {\n /* disk full - in-memory state is still correct */\n }\n }\n }\n\n incrementRetry(jobId: string): void {\n const entry = this.entries.get(jobId);\n if (entry) {\n entry.retry_count++;\n this.flush();\n }\n }\n\n getStatus(jobId: string): LedgerStatus | undefined {\n return this.entries.get(jobId)?.status;\n }\n\n pendingJobs(): LedgerEntry[] {\n return [...this.entries.values()].filter((e) => e.status === 'paid' || e.status === 'executed');\n }\n\n /** Remove old delivered/failed entries (default: 7 days). */\n gc(maxAgeSecs = 7 * 24 * 60 * 60): void {\n this.pruneOldEntries(maxAgeSecs * 1000);\n }\n\n /**\n * Drop terminal entries (`delivered` / `failed`) whose `created_at`\n * predates `now - retentionMs`. Stuck non-terminal entries are never\n * pruned - recovery keeps retrying them until the retry budget runs\n * out, then they become terminal and are eligible on the next sweep.\n *\n * Returns the number of entries deleted, for observability.\n */\n pruneOldEntries(retentionMs: number): number {\n const cutoff = Math.floor(Date.now() / 1000) - Math.floor(retentionMs / 1000);\n let deleted = 0;\n for (const [id, entry] of this.entries) {\n if (\n (entry.status === 'delivered' || entry.status === 'failed') &&\n entry.created_at < cutoff\n ) {\n this.entries.delete(id);\n deleted += 1;\n }\n }\n if (deleted > 0) {\n this.flush();\n }\n return deleted;\n }\n}\n","/**\n * Start command - run agent in provider mode.\n * Loads all skills from agentDir/skills/, publishes per-capability cards,\n * processes jobs with per-capability pricing, caches uploaded media URLs.\n */\nimport { createHash } from 'node:crypto';\nimport { readFileSync } from 'node:fs';\nimport { basename, join, relative, resolve, sep } from 'node:path';\nimport {\n ElisymClient,\n ElisymIdentity,\n MediaService,\n USDC_SOLANA_DEVNET,\n formatAssetAmount,\n formatSol,\n RELAYS,\n DEFAULTS,\n DEFAULT_KIND_OFFSET,\n jobRequestKind,\n toDTag,\n type CapabilityCard,\n} from '@elisym/sdk';\nimport {\n agentPaths,\n listAgents,\n loadAgent,\n lookupCachedUrl,\n newCacheEntry,\n readMediaCache,\n writeMediaCache,\n type LoadedAgent,\n type MediaCache,\n} from '@elisym/sdk/agent-store';\nimport { LlmHealthMonitor, startLlmRecovery, type HeartbeatHandle } from '@elisym/sdk/llm-health';\nimport { address, createSolanaRpc } from '@solana/kit';\nimport { probeRelays } from '../diagnostics.js';\nimport {\n fetchUsdcBalance,\n getRpcUrl,\n MAX_CONCURRENT_JOBS,\n RECOVERY_MAX_RETRIES,\n RECOVERY_INTERVAL_SECS,\n} from '../helpers.js';\nimport { JobLedger } from '../ledger.js';\nimport {\n createLlmClient,\n getLlmProvider,\n listLlmProviders,\n verifyLlmApiKeyDeep,\n type LlmConfig,\n type LlmProvider,\n} from '../llm';\nimport { cacheKeyFor, resolveTripleForOverride } from '../llm/cache.js';\nimport { resolveProviderApiKey } from '../llm/keys.js';\nimport { resolveSkillLlm, type ResolvedSkillLlm } from '../llm/resolve.js';\nimport { createLogger } from '../logging.js';\nimport { AgentRuntime, type RuntimeConfig } from '../runtime.js';\nimport { SkillRegistry, type SkillContext, type SkillLlmOverride } from '../skill';\nimport type { LlmClient } from '../skill/index.js';\nimport { loadSkillsFromDir } from '../skill/loader.js';\nimport { NostrTransport } from '../transport/nostr.js';\nimport { startWatchdog } from '../watchdog.js';\n\nexport interface StartOptions {\n verbose?: boolean;\n}\n\nexport async function cmdStart(\n nameArg: string | undefined,\n options: StartOptions = {},\n): Promise<void> {\n const cwd = process.cwd();\n\n // -- Step 1: Resolve agent name --\n const agentName = await resolveStartAgentName(nameArg, cwd);\n if (!agentName) {\n return;\n }\n\n // -- Step 2: Load agent (with optional passphrase for encrypted keys) --\n const loaded = await loadAgentWithPrompt(agentName, cwd);\n\n // -- Step 2b: Set up structured logger early so publish / config\n // debug events fire before connectivity is established.\n const verbose =\n options.verbose === true ||\n process.env.ELISYM_DEBUG === '1' ||\n process.env.LOG_LEVEL === 'debug';\n const { logger, logWithIndent } = createLogger({\n verbose,\n tty: Boolean(process.stdout.isTTY),\n });\n\n // -- Step 3: Banner --\n console.log(`\\n Starting agent ${agentName} (${loaded.source})...\\n`);\n if (loaded.shadowsGlobal) {\n console.log(\n ` ! Using project-local ${agentName} (shadows global agent in ~/.elisym/${agentName}/)\\n`,\n );\n }\n if (verbose) {\n console.log(' [debug] Verbose logging enabled. Structured diagnostics -> stderr.');\n }\n\n // -- Step 4: Resolve Solana address and show balance --\n const solPayment = loaded.yaml.payments.find((entry) => entry.chain === 'solana');\n const solanaAddress = solPayment?.address;\n const walletNetwork = solPayment?.network ?? 'devnet';\n\n if (solanaAddress) {\n try {\n const rpcUrl = getRpcUrl(walletNetwork);\n const rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solanaAddress);\n const [{ value: balanceLamports }, usdcBalance] = await Promise.all([\n rpc.getBalance(walletAddress).send(),\n fetchUsdcBalance(rpc, walletAddress),\n ]);\n const balance = Number(balanceLamports);\n\n console.log(' Wallet');\n console.log(` Network ${walletNetwork}`);\n console.log(` Address ${solanaAddress}`);\n if (process.env.SOLANA_RPC_URL) {\n console.log(` RPC ${process.env.SOLANA_RPC_URL} (custom)`);\n }\n console.log(` SOL ${formatSol(balance)} (${balance} lamports)`);\n console.log(` USDC ${formatAssetAmount(USDC_SOLANA_DEVNET, usdcBalance)}`);\n\n if (balance === 0) {\n console.log(' ! Wallet is empty. Get devnet SOL: https://faucet.solana.com');\n }\n console.log();\n } catch (e: any) {\n console.warn(` ! Wallet error: ${e.message}\\n`);\n }\n }\n\n // -- Step 5: Load and register all skills --\n // Skills load before the LLM check so a fully-non-LLM agent can start\n // without an API key. The LLM block below runs only when at least one\n // skill has `mode === 'llm'`.\n //\n // `scriptEnv` propagates decrypted per-provider keys (e.g. ANTHROPIC_API_KEY)\n // into `dynamic-script` / `static-script` subprocesses, so script skills get\n // the same secret access LLM-mode skills already have. Existing process.env\n // values win when no per-agent secret is set, matching the priority used by\n // resolveProviderApiKey for LLM-mode skills.\n const scriptEnv: NodeJS.ProcessEnv = { ...process.env };\n const llmKeys = loaded.secrets.llm_api_keys ?? {};\n for (const descriptor of listLlmProviders()) {\n const secretValue = llmKeys[descriptor.id];\n if (typeof secretValue === 'string' && secretValue.length > 0) {\n scriptEnv[descriptor.envVar] = secretValue;\n }\n }\n const paths = agentPaths(loaded.dir);\n const skillsDir = paths.skills;\n const allSkills = loadSkillsFromDir(skillsDir, { scriptEnv });\n\n if (allSkills.length === 0) {\n console.error(` ! No skills found in ${skillsDir}\\n`);\n console.error(' Create a skill directory with a SKILL.md to get started.');\n console.error(` Example: ${skillsDir}/my-skill/SKILL.md\\n`);\n process.exit(1);\n }\n\n const registry = new SkillRegistry();\n for (const skill of allSkills) {\n registry.register(skill);\n const price =\n skill.priceSubunits > 0\n ? formatAssetAmount(skill.asset, BigInt(skill.priceSubunits))\n : 'free';\n console.log(` * Skill: ${skill.name} [${skill.capabilities.join(', ')}] - ${price}`);\n }\n console.log();\n\n // Validate that paid skills have a Solana address configured.\n const hasPaid = allSkills.some((s) => s.priceSubunits > 0);\n if (hasPaid && !solanaAddress) {\n console.error(\n ' ! Paid skills require a Solana address. Run `npx @elisym/cli profile` to configure.\\n',\n );\n process.exit(1);\n }\n\n // -- Step 6: LLM check (only when at least one skill needs it) --\n // Per-skill LLM resolution. Each `mode: 'llm'` skill resolves to a concrete\n // (provider, model, maxTokens) triple. Agent-level `llm` in elisym.yaml is\n // the fallback for skills that don't override; if every LLM skill overrides,\n // agent-level `llm` may be omitted entirely.\n //\n // Script-mode skills can also declare `provider` + `model` in SKILL.md to\n // register a health-monitor probe for the API key the script uses under\n // the hood. Those skills do NOT need an LlmClient (the script makes its\n // own HTTP calls), but they DO need: an API key resolved + verified at\n // startup, and a (provider, model) pair registered with the health\n // monitor so reactive markUnhealthy + lazy recovery works.\n const llmSkills = allSkills.filter((skill) => skill.mode === 'llm');\n const scriptDepSkills = allSkills.filter(\n (skill) => skill.mode !== 'llm' && skill.llmOverride?.provider && skill.llmOverride?.model,\n );\n // Pairs to register with the health monitor (any mode + declared provider+model).\n // Keyed by `provider::model`; deduplicated across skills so we don't probe\n // the same key twice when several skills share the same LLM dependency.\n const monitorPairs = new Map<string, { provider: LlmProvider; model: string }>();\n // Triples to build LlmClient instances for (mode=llm only).\n const triplesByKey = new Map<string, ResolvedSkillLlm>();\n const dependentSkillsByProvider = new Map<LlmProvider, string[]>();\n let agentDefaultCacheKey: string | undefined;\n const llmClientCache = new Map<string, LlmClient>();\n const healthMonitor = new LlmHealthMonitor();\n\n if (llmSkills.length > 0 || scriptDepSkills.length > 0) {\n const resolutionErrors: string[] = [];\n\n for (const skill of llmSkills) {\n const skillMdPath = join(skillsDir, skill.name, 'SKILL.md');\n const result = resolveSkillLlm(\n { skillName: skill.name, skillMdPath, llmOverride: skill.llmOverride },\n loaded.yaml.llm,\n );\n if ('error' in result) {\n resolutionErrors.push(result.error);\n continue;\n }\n const cacheKey = cacheKeyFor(result);\n triplesByKey.set(cacheKey, result);\n monitorPairs.set(`${result.provider}::${result.model}`, {\n provider: result.provider,\n model: result.model,\n });\n skill.resolvedTriple = {\n provider: result.provider,\n model: result.model,\n maxTokens: result.maxTokens,\n };\n const list = dependentSkillsByProvider.get(result.provider) ?? [];\n list.push(skill.name);\n dependentSkillsByProvider.set(result.provider, list);\n }\n\n // Script-mode skills: register their declared (provider, model) for\n // health monitoring. No LlmClient is built - the script does its own\n // HTTP. The all-or-nothing parse invariant guarantees both `provider`\n // and `model` are set when we reach this branch (validateLlmOverride).\n for (const skill of scriptDepSkills) {\n const provider = skill.llmOverride?.provider as LlmProvider;\n const model = skill.llmOverride?.model as string;\n monitorPairs.set(`${provider}::${model}`, { provider, model });\n const list = dependentSkillsByProvider.get(provider) ?? [];\n if (!list.includes(skill.name)) {\n list.push(skill.name);\n }\n dependentSkillsByProvider.set(provider, list);\n }\n\n if (resolutionErrors.length > 0) {\n for (const message of resolutionErrors) {\n console.error(` ! ${message}`);\n }\n console.error('');\n process.exit(1);\n }\n\n if (loaded.yaml.llm) {\n const agentDefaultTriple: ResolvedSkillLlm = {\n provider: loaded.yaml.llm.provider as LlmProvider,\n model: loaded.yaml.llm.model,\n maxTokens: loaded.yaml.llm.max_tokens,\n };\n const agentKey = cacheKeyFor(agentDefaultTriple);\n if (triplesByKey.has(agentKey)) {\n agentDefaultCacheKey = agentKey;\n }\n }\n\n // Resolve + verify each provider's API key once.\n const keyByProvider = new Map<LlmProvider, string>();\n const keyErrors: string[] = [];\n for (const [provider, dependents] of dependentSkillsByProvider) {\n const keyResult = resolveProviderApiKey({\n provider,\n secrets: loaded.secrets,\n dependentSkills: dependents,\n });\n if ('error' in keyResult) {\n keyErrors.push(keyResult.error);\n continue;\n }\n keyByProvider.set(provider, keyResult.apiKey);\n }\n if (keyErrors.length > 0) {\n for (const message of keyErrors) {\n console.error(` ! ${message}`);\n }\n console.error('');\n process.exit(1);\n }\n\n // Deep-verify each unique (provider, model) pair the agent will use.\n // Deep verification consumes one billing token per probe (~$0.00001\n // on Haiku) but distinguishes valid keys from billing-exhausted ones,\n // which `/v1/models` cannot. Iterates `monitorPairs` so script-mode\n // skills that declared `provider`+`model` are probed too.\n for (const [, pair] of monitorPairs) {\n const apiKey = keyByProvider.get(pair.provider);\n if (!apiKey) {\n continue;\n }\n const envVar =\n getLlmProvider(pair.provider)?.envVar ?? `${pair.provider.toUpperCase()}_API_KEY`;\n process.stdout.write(` Verifying ${pair.provider} ${pair.model}... `);\n const verification = await verifyLlmApiKeyDeep(pair.provider, apiKey, pair.model);\n const descriptor = getLlmProvider(pair.provider);\n const verifyFn = async (signal?: AbortSignal) =>\n descriptor\n ? descriptor.verifyKeyDeep(apiKey, pair.model, signal)\n : { ok: false as const, reason: 'unavailable' as const, error: 'no descriptor' };\n healthMonitor.register({\n provider: pair.provider,\n model: pair.model,\n verifyFn,\n });\n healthMonitor.seed(pair.provider, pair.model, verification);\n if (verification.ok) {\n console.log('ok');\n } else if (verification.reason === 'invalid') {\n console.log('INVALID');\n console.error(` ! ${pair.provider} rejected the API key (HTTP ${verification.status}).`);\n console.error(\n ` Update it via \\`npx @elisym/cli profile ${agentName}\\` or set ${envVar} to a valid key.\\n`,\n );\n process.exit(1);\n } else if (verification.reason === 'billing') {\n console.log('BILLING');\n const detail = verification.body ? ` ${verification.body.slice(0, 200)}` : '';\n console.error(\n ` ! ${pair.provider} reports a billing/quota issue for ${pair.model}.${detail}`,\n );\n console.error(\n ` Top up the account at the provider console, or set ${envVar} to a key on a funded org.\\n`,\n );\n process.exit(1);\n } else {\n console.log('unavailable');\n console.warn(\n ` ! Could not verify ${pair.provider} ${pair.model} (${verification.error}). Continuing - jobs will fail if the key is invalid.\\n`,\n );\n }\n }\n\n // Eager client construction. One LlmClient per unique triple.\n for (const [cacheKey, triple] of triplesByKey) {\n const apiKey = keyByProvider.get(triple.provider);\n if (!apiKey) {\n // Should never happen - keyByProvider is built from the same provider\n // set as the triples. Defensive guard for type narrowing.\n console.error(` ! Internal error: no API key for provider \"${triple.provider}\".\\n`);\n process.exit(1);\n }\n const config: LlmConfig = {\n provider: triple.provider,\n apiKey,\n model: triple.model,\n maxTokens: triple.maxTokens,\n logUsage: true,\n };\n llmClientCache.set(cacheKey, createLlmClient(config));\n }\n } else {\n console.log(' No LLM-dependent skills loaded; skipping LLM key check.\\n');\n }\n\n const agentDefaultClient =\n agentDefaultCacheKey !== undefined ? llmClientCache.get(agentDefaultCacheKey) : undefined;\n\n const getLlm = (override?: SkillLlmOverride): LlmClient | undefined => {\n const triple = resolveTripleForOverride(override, loaded.yaml.llm);\n if (!triple) {\n return undefined;\n }\n return llmClientCache.get(cacheKeyFor(triple));\n };\n\n const skillCtx: SkillContext = {\n llm: agentDefaultClient,\n getLlm,\n agentName,\n agentDescription: loaded.yaml.description ?? '',\n };\n\n // -- Step 8: Connect to relays --\n console.log(' Connecting to relays and publishing capabilities...');\n\n const identity = ElisymIdentity.fromHex(loaded.secrets.nostr_secret_key);\n const relays = loaded.yaml.relays.length > 0 ? loaded.yaml.relays : [...RELAYS];\n const client = new ElisymClient({ relays });\n\n // Opt-in DNS + TCP connectivity probe for WSL / Windows / corporate\n // firewall troubleshooting. Runs once before publish so the operator\n // sees the result in the startup banner.\n if (process.env.ELISYM_NET_DIAG === '1') {\n console.log(' [net-diag] Probing relay DNS + TCP connectivity...');\n const results = await probeRelays(relays, logger);\n for (const result of results) {\n const ipSummary = result.ips.length > 0 ? result.ips.join(',') : '-';\n if (result.tcpOpenMs !== undefined) {\n console.log(` [net-diag] ${result.url} -> ${ipSummary} TCP open in ${result.tcpOpenMs}ms`);\n } else {\n console.log(` [net-diag] ${result.url} -> ${ipSummary} FAILED: ${result.error ?? '?'}`);\n }\n }\n }\n\n // -- Step 9: Resolve media URLs via cache (no SKILL.md mutation) --\n const media = new MediaService();\n const mediaCache = await readMediaCache(loaded.dir);\n let mediaCacheDirty = false;\n\n const pictureUrl = await resolveMediaField(\n loaded.yaml.picture,\n loaded.dir,\n mediaCache,\n media,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n const bannerUrl = await resolveMediaField(\n loaded.yaml.banner,\n loaded.dir,\n mediaCache,\n media,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n\n for (const skill of allSkills) {\n if (skill.image || !skill.imageFile || !skill.dir) {\n continue;\n }\n const skillRoot = skill.dir;\n const folderName = basename(skillRoot);\n const cacheKey = `./skills/${folderName}/${skill.imageFile}`;\n const absPath = join(skillRoot, skill.imageFile);\n const url = await uploadOrReuse(\n cacheKey,\n absPath,\n mediaCache,\n media,\n identity,\n () => (mediaCacheDirty = true),\n );\n if (url) {\n skill.image = url;\n }\n }\n\n if (mediaCacheDirty) {\n await writeMediaCache(loaded.dir, mediaCache);\n }\n\n // -- Step 10: Publish kind:0 profile --\n let profilePublished = false;\n try {\n await client.discovery.publishProfile(\n identity,\n loaded.yaml.display_name ?? agentName,\n loaded.yaml.description ?? '',\n pictureUrl,\n bannerUrl,\n );\n profilePublished = true;\n logger.debug({ event: 'publish_ack', kind: 0 }, 'profile published');\n } catch (e: any) {\n console.warn(` ! Failed to publish profile: ${e.message}`);\n logger.warn({ event: 'publish_failed', kind: 0, error: e.message }, 'profile publish failed');\n }\n\n // -- Step 11: Publish per-skill capability cards (kind:31990) --\n const kinds = [jobRequestKind(DEFAULT_KIND_OFFSET)];\n\n function buildCard(skill: (typeof allSkills)[0]): CapabilityCard {\n const isStatic = skill.mode === 'static-file' || skill.mode === 'static-script';\n return {\n name: skill.name,\n description: skill.description,\n capabilities: skill.capabilities,\n image: skill.image,\n ...(isStatic ? { static: true } : {}),\n payment: solanaAddress\n ? {\n chain: 'solana',\n network: walletNetwork,\n address: solanaAddress,\n job_price: skill.priceSubunits,\n token: skill.asset.token,\n ...(skill.asset.mint ? { mint: skill.asset.mint } : {}),\n decimals: skill.asset.decimals,\n symbol: skill.asset.symbol,\n }\n : undefined,\n };\n }\n\n let cardsPublished = 0;\n for (const skill of allSkills) {\n try {\n await client.discovery.publishCapability(identity, buildCard(skill), kinds);\n cardsPublished += 1;\n logger.debug(\n { event: 'publish_ack', kind: 31990, skill: skill.name },\n 'capability card published',\n );\n } catch (e: any) {\n console.warn(` ! Failed to publish \"${skill.name}\": ${e.message}`);\n logger.warn(\n { event: 'publish_failed', kind: 31990, skill: skill.name, error: e.message },\n 'capability publish failed',\n );\n }\n }\n\n // -- Step 12: Clean up stale capabilities from relay --\n try {\n const existingEvents = await client.pool.querySync({\n kinds: [31990],\n authors: [identity.publicKey],\n '#t': ['elisym'],\n });\n // Compare by d-tag, not card.name. toDTag() is lossy (e.g. \"WHOIS Lookup\"\n // and \"whois-lookup\" collapse to the same d-tag), so name-based comparison\n // can flag a card whose d-tag actually matches an active skill - the\n // resulting deletion event then replaces the freshly-published card on the\n // relay (kind:31990 is replaceable by author+kind+d-tag).\n const skillDTags = new Set(allSkills.map((s) => toDTag(s.name)));\n for (const ev of existingEvents) {\n const dTag = ev.tags.find((t: string[]) => t[0] === 'd')?.[1];\n if (!dTag || skillDTags.has(dTag)) {\n continue;\n }\n try {\n const card = JSON.parse(ev.content);\n if (card.name) {\n await client.discovery.deleteCapability(identity, card.name);\n console.log(` Removed stale capability: ${card.name}`);\n }\n } catch {\n // malformed event, skip\n }\n }\n } catch {\n // non-fatal: stale cards will expire naturally\n }\n\n console.log(' Connected.\\n');\n if (verbose) {\n console.log(\n ` [debug] Published: profile=${profilePublished ? 'ok' : 'FAILED'} + ${cardsPublished}/${allSkills.length} capability cards (kind:31990)`,\n );\n console.log(` [debug] Relays: ${relays.length} configured (${relays.join(', ')})`);\n }\n\n // -- Step 13: Prepare ping responder (watchdog owns the subscription) --\n const onPing = (senderPubkey: string, nonce: string): void => {\n client.ping.sendPong(identity, senderPubkey, nonce).catch(() => {});\n };\n\n // -- Step 14: Build transport + ledger + runtime --\n const transport = new NostrTransport(client, identity, [DEFAULT_KIND_OFFSET]);\n const ledger = new JobLedger(paths.jobs);\n\n const runtimeConfig: RuntimeConfig = {\n paymentTimeoutSecs: DEFAULTS.PAYMENT_EXPIRY_SECS,\n maxConcurrentJobs: MAX_CONCURRENT_JOBS,\n recoveryMaxRetries: RECOVERY_MAX_RETRIES,\n recoveryIntervalSecs: RECOVERY_INTERVAL_SECS,\n network: walletNetwork,\n solanaAddress,\n };\n\n // Custom SOLANA_RPC_URL values (Helius, Alchemy, QuickNode) routinely\n // embed API keys in the query string. Strip query + auth before logging\n // so `--verbose` never publishes a third-party RPC credential.\n const rpcUrlForLog = stripRpcSecrets(process.env.SOLANA_RPC_URL ?? getRpcUrl(walletNetwork));\n logger.debug(\n {\n event: 'config_resolved',\n agent: agentName,\n source: loaded.source,\n network: walletNetwork,\n relays,\n solanaAddress,\n rpcUrl: rpcUrlForLog,\n },\n 'config resolved',\n );\n\n // Tee: banner-style indent line on stdout (existing UX) + structured\n // stderr pino entry with shared redact paths (defence against future\n // slips where a diagnostic string might embed user input).\n const diagLog = (msg: string): void => {\n logWithIndent(msg);\n logger.info({ event: 'runtime_diag' }, msg);\n };\n\n const watchdog = startWatchdog({\n client,\n identity,\n transport,\n onPing,\n log: diagLog,\n logger,\n });\n\n let llmHeartbeat: HeartbeatHandle | undefined;\n if (monitorPairs.size > 0) {\n llmHeartbeat = startLlmRecovery({\n monitor: healthMonitor,\n log: diagLog,\n });\n diagLog('LLM health monitor armed (lazy recovery, 5min interval).');\n }\n\n const runtime = new AgentRuntime(\n transport,\n registry,\n skillCtx,\n runtimeConfig,\n ledger,\n {\n onJobReceived: (job) => {\n const cap = job.tags.find((t) => t !== 'elisym') ?? 'unknown';\n // Never log job.input here - capability tag is the only descriptor needed.\n process.stdout.write(` [job] ${job.jobId.slice(0, 16)} | cap=${cap}\\n`);\n logger.info({ event: 'job_received', jobId: job.jobId, capability: cap });\n },\n onJobCompleted: (jobId) => {\n process.stdout.write(` [job] ${jobId.slice(0, 16)} | delivered\\n`);\n logger.info({ event: 'job_delivered', jobId });\n },\n onJobError: (jobId, error) => {\n process.stderr.write(` [job] ${jobId.slice(0, 16)} | error: ${error}\\n`);\n logger.error({ event: 'job_error', jobId, error });\n },\n onLog: diagLog,\n onStop: () => {\n watchdog.stop();\n llmHeartbeat?.stop();\n },\n },\n healthMonitor,\n );\n\n // -- Step 15: Run --\n console.log(' * Running. Press Ctrl+C to stop.\\n');\n await runtime.run();\n}\n\n/**\n * Return a log-safe representation of an RPC URL. Strips any userinfo\n * and query string so credentials embedded by third-party RPC\n * providers (Helius/Alchemy/QuickNode style `?api-key=...`) never land\n * in verbose stderr output.\n */\nexport function stripRpcSecrets(raw: string): string {\n try {\n const parsed = new URL(raw);\n parsed.username = '';\n parsed.password = '';\n const marker = parsed.search.length > 0 ? '?***' : '';\n parsed.search = '';\n return `${parsed.toString()}${marker}`;\n } catch {\n return '[unparseable RPC URL]';\n }\n}\n\n/** Resolve a YAML media field (picture/banner) - URL returned as-is, local path uploaded via cache. */\nasync function resolveMediaField(\n value: string | undefined,\n agentDir: string,\n cache: MediaCache,\n media: MediaService,\n identity: ElisymIdentity,\n onCacheUpdate: (updated: boolean) => void,\n): Promise<string | undefined> {\n if (!value) {\n return undefined;\n }\n if (isRemoteUrl(value)) {\n return value;\n }\n const absPath = resolveInsideAgentDir(value, agentDir);\n if (!absPath) {\n console.warn(` ! Skipping media field \"${value}\": path must stay inside the agent directory.`);\n return undefined;\n }\n return uploadOrReuse(value, absPath, cache, media, identity, () => onCacheUpdate(true));\n}\n\n/**\n * Resolve a YAML-supplied path against `agentDir` and reject anything that\n * escapes the agent directory (`..` segments, absolute paths outside it).\n * Returns null on rejection so callers can warn and skip the field.\n */\nfunction resolveInsideAgentDir(value: string, agentDir: string): string | null {\n const agentRoot = resolve(agentDir);\n const candidate = resolve(agentRoot, value);\n const rel = relative(agentRoot, candidate);\n if (rel === '' || rel.startsWith('..') || rel.includes(`..${sep}`)) {\n return null;\n }\n return candidate;\n}\n\n/** Look up `cacheKey` in cache; if hit returns URL, else uploads and updates cache. */\nasync function uploadOrReuse(\n cacheKey: string,\n absPath: string,\n cache: MediaCache,\n media: MediaService,\n identity: ElisymIdentity,\n onCacheUpdate: () => void,\n): Promise<string | undefined> {\n try {\n const cached = await lookupCachedUrl(cache, cacheKey, absPath);\n if (cached) {\n return cached;\n }\n console.log(` Uploading ${basename(absPath)}...`);\n const data = readFileSync(absPath);\n const sha256 = createHash('sha256').update(data).digest('hex');\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(absPath));\n cache[cacheKey] = newCacheEntry(url, sha256);\n onCacheUpdate();\n console.log(` Uploaded: ${url}`);\n return url;\n } catch (e: any) {\n console.warn(` ! Failed to upload ${basename(absPath)}: ${e.message}`);\n return undefined;\n }\n}\n\nfunction isRemoteUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value);\n}\n\nconst MAX_PASSPHRASE_ATTEMPTS = 3;\n\n/**\n * Resolve the agent to start. Returns undefined when the user picked\n * \"+ Create new agent\" and the init wizard ran - the caller should exit.\n */\nasync function resolveStartAgentName(\n nameArg: string | undefined,\n cwd: string,\n): Promise<string | undefined> {\n if (nameArg) {\n return nameArg;\n }\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.log('No agents configured. Run `npx @elisym/cli init` first.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const choices = [\n ...agents.map((agent) => ({\n name: `${agent.name} (${agent.source}${agent.shadowsGlobal ? ' - shadows global' : ''})`,\n value: agent.name,\n })),\n { name: '+ Create new agent', value: '__new__' },\n ];\n const { selected } = await inquirer.prompt([\n { type: 'list', name: 'selected', message: 'Select agent to start', choices },\n ]);\n if (selected === '__new__') {\n const { cmdInit } = await import('./init.js');\n await cmdInit();\n return undefined;\n }\n return selected;\n}\n\nasync function loadAgentWithPrompt(name: string, cwd: string): Promise<LoadedAgent> {\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n try {\n return await loadAgent(name, cwd, envPassphrase);\n } catch (e: any) {\n const isEncrypted = /encrypted secrets/i.test(e?.message ?? '');\n const isWrongPassphrase = /Decryption failed/i.test(e?.message ?? '');\n if (!isEncrypted && !isWrongPassphrase) {\n throw e;\n }\n if (!process.stdin.isTTY) {\n throw e;\n }\n }\n\n const { default: inquirer } = await import('inquirer');\n for (let attempt = 1; attempt <= MAX_PASSPHRASE_ATTEMPTS; attempt += 1) {\n const { passphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'passphrase',\n message: 'Passphrase to decrypt secrets:',\n mask: '*',\n },\n ]);\n try {\n return await loadAgent(name, cwd, passphrase);\n } catch (e: any) {\n if (!/Decryption failed/i.test(e?.message ?? '')) {\n throw e;\n }\n const remaining = MAX_PASSPHRASE_ATTEMPTS - attempt;\n if (remaining === 0) {\n console.error(' ! Wrong passphrase. Aborting.');\n process.exit(1);\n }\n console.error(` ! Wrong passphrase. ${remaining} attempt(s) left.`);\n }\n }\n throw new Error('Unreachable');\n}\n","/**\n * Resolve the effective LLM config for a single skill.\n *\n * Combines the skill-level `llmOverride` with the agent-level default. The\n * (provider, model) pair is all-or-nothing at the override level (enforced\n * at parse time in the SDK skill loader); `maxTokens` chains independently.\n */\n\nimport type { LlmEntry } from '@elisym/sdk/agent-store';\nimport type { Skill, SkillLlmOverride } from '@elisym/sdk/skills';\nimport type { LlmProvider } from './index';\n\nexport const DEFAULT_MAX_TOKENS = 4096;\n\nexport interface ResolvedSkillLlm {\n provider: LlmProvider;\n model: string;\n maxTokens: number;\n}\n\nexport interface ResolveSkillLlmInput {\n skillName: string;\n /** Filesystem path to the SKILL.md so error messages point at the exact file. */\n skillMdPath: string;\n llmOverride?: SkillLlmOverride;\n}\n\nexport type ResolveSkillLlmResult = ResolvedSkillLlm | { error: string };\n\n/**\n * Resolve a skill to a concrete (provider, model, maxTokens). Returns an\n * `error` shape when the skill is `mode: 'llm'` but neither side declared\n * provider/model.\n */\nexport function resolveSkillLlm(\n input: ResolveSkillLlmInput,\n agentDefault: LlmEntry | undefined,\n): ResolveSkillLlmResult {\n const override = input.llmOverride;\n const overridePairSet = override?.provider !== undefined && override.model !== undefined;\n\n let provider: LlmProvider | undefined;\n let model: string | undefined;\n if (overridePairSet) {\n provider = override.provider;\n model = override.model;\n } else if (agentDefault) {\n provider = agentDefault.provider;\n model = agentDefault.model;\n }\n\n if (!provider || !model) {\n return {\n error:\n `Skill \"${input.skillName}\" at ${input.skillMdPath}: LLM model is required - ` +\n `declare \"provider\" + \"model\" in the SKILL.md frontmatter or set agent-level llm ` +\n `via 'npx @elisym/cli profile <agent>'.`,\n };\n }\n\n const maxTokens = override?.maxTokens ?? agentDefault?.max_tokens ?? DEFAULT_MAX_TOKENS;\n\n return { provider, model, maxTokens };\n}\n\n/** Lift the override fields from a `Skill` into the input shape used here. */\nexport function skillResolveInput(skill: Skill, skillMdPath: string): ResolveSkillLlmInput {\n return {\n skillName: skill.name,\n skillMdPath,\n llmOverride: skill.llmOverride,\n };\n}\n","/**\n * Per-skill LLM client caching.\n *\n * Different LLM skills may share or differ on (provider, model, maxTokens).\n * We deduplicate clients by a stable JSON-encoded triple so verifying API\n * keys and instantiating clients happens once per unique config.\n */\n\nimport type { LlmEntry } from '@elisym/sdk/agent-store';\nimport type { SkillLlmOverride } from '@elisym/sdk/skills';\nimport { DEFAULT_MAX_TOKENS, type ResolvedSkillLlm } from './resolve';\nimport type { LlmProvider } from './index';\n\n/**\n * Stable cache key for an LLM client config. JSON-encoded so any provider /\n * model string is safely escaped (avoids ad-hoc separator collisions).\n */\nexport function cacheKeyFor(triple: ResolvedSkillLlm): string {\n return JSON.stringify({\n provider: triple.provider,\n model: triple.model,\n maxTokens: triple.maxTokens,\n });\n}\n\n/**\n * Resolve an `llmOverride` to a concrete (provider, model, maxTokens) using\n * the agent-level default for any field the override leaves unset. Returns\n * `undefined` when no agent-level default exists and the override is partial\n * (no provider/model) - the caller treats that as \"no client available\".\n */\nexport function resolveTripleForOverride(\n override: SkillLlmOverride | undefined,\n agentDefault: LlmEntry | undefined,\n): ResolvedSkillLlm | undefined {\n const overridePairSet = override?.provider !== undefined && override.model !== undefined;\n let provider: LlmProvider | undefined;\n let model: string | undefined;\n if (overridePairSet) {\n provider = override.provider;\n model = override.model;\n } else if (agentDefault) {\n provider = agentDefault.provider;\n model = agentDefault.model;\n }\n if (!provider || !model) {\n return undefined;\n }\n const maxTokens = override?.maxTokens ?? agentDefault?.max_tokens ?? DEFAULT_MAX_TOKENS;\n return { provider, model, maxTokens };\n}\n","/**\n * Resolve the API key for a given provider, walking the priority chain:\n *\n * 1. `secrets.llm_api_keys[<provider>]` (per-provider entry, preferred).\n * 2. `process.env.<descriptor.envVar>` (operator convenience).\n */\n\nimport type { Secrets } from '@elisym/sdk/agent-store';\nimport { getLlmProvider } from './registry';\nimport type { LlmProvider } from './index';\n\nexport interface ResolvedProviderKey {\n apiKey: string;\n origin: 'secrets-per-provider' | 'env';\n}\n\nexport type ResolveProviderKeyResult = ResolvedProviderKey | { error: string };\n\nexport interface ResolveProviderKeyInput {\n provider: LlmProvider;\n secrets: Secrets;\n /** Names of skills that resolved to this provider. Surfaced in error messages. */\n dependentSkills: string[];\n}\n\nexport function resolveProviderApiKey(input: ResolveProviderKeyInput): ResolveProviderKeyResult {\n const { provider, secrets, dependentSkills } = input;\n\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n const skillList = dependentSkills.length > 0 ? dependentSkills.join(', ') : '<none>';\n return {\n error: `Provider \"${provider}\" is not registered (required by skill(s): ${skillList}).`,\n };\n }\n\n const perProviderValue = secrets.llm_api_keys?.[provider];\n if (typeof perProviderValue === 'string' && perProviderValue.length > 0) {\n return { apiKey: perProviderValue, origin: 'secrets-per-provider' };\n }\n\n const envValue = process.env[descriptor.envVar];\n if (envValue) {\n return { apiKey: envValue, origin: 'env' };\n }\n\n const skillList = dependentSkills.length > 0 ? dependentSkills.join(', ') : '<none>';\n return {\n error:\n `Provider \"${provider}\" needs an API key (required by skill(s): ${skillList}). ` +\n `Set secrets.llm_api_keys.${provider} via 'npx @elisym/cli profile <agent>' or export ${descriptor.envVar}.`,\n };\n}\n","/**\n * Structured logger for the CLI. Stdout stays reserved for the\n * human-readable banner (rendered via `logWithIndent`). Diagnostic\n * output - incoming events, relay lifecycle, publish acks, watchdog\n * decisions - goes to stderr as JSON by default, or pretty-printed\n * when the process is attached to a TTY and pino-pretty is available.\n *\n * Redaction uses the SDK's DEFAULT_REDACT_PATHS so secret keys and\n * user input cannot leak through structured logs even in verbose mode.\n */\nimport { DEFAULT_REDACT_PATHS, makeCensor } from '@elisym/sdk';\nimport pino, { type Logger } from 'pino';\n\nexport interface CreateLoggerOptions {\n /** When true, set level to 'debug' and emit the debug firehose. */\n verbose?: boolean;\n /** When true, pretty-print to stderr; otherwise raw JSON to stderr. */\n tty?: boolean;\n /** Override the log level directly (takes precedence over verbose). */\n level?: string;\n /** Escape hatch for tests: redirect structured output to an explicit stream. */\n destination?: pino.DestinationStream;\n}\n\nexport interface CliLogger {\n logger: Logger;\n /** Pretty 2-space-indented write to stdout, used by the startup banner. */\n logWithIndent(line: string): void;\n /** Banner-only write to stdout. Semantically identical to logWithIndent. */\n bannerLog(line: string): void;\n}\n\nfunction resolveLevel(options: CreateLoggerOptions): string {\n if (options.level) {\n return options.level;\n }\n if (options.verbose) {\n return 'debug';\n }\n const envLevel = process.env.LOG_LEVEL;\n if (envLevel) {\n return envLevel;\n }\n return 'info';\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): CliLogger {\n const level = resolveLevel(options);\n const baseOptions: pino.LoggerOptions = {\n name: 'elisym-cli',\n level,\n redact: {\n paths: DEFAULT_REDACT_PATHS,\n censor: makeCensor(),\n },\n };\n\n let logger: Logger;\n if (options.destination) {\n logger = pino(baseOptions, options.destination);\n } else if (options.tty === true) {\n logger = pino({\n ...baseOptions,\n transport: {\n target: 'pino-pretty',\n options: { destination: 2, colorize: true, translateTime: 'HH:MM:ss' },\n },\n });\n } else {\n // Raw JSON to stderr (fd 2) so stdout stays clean for the banner.\n logger = pino(baseOptions, pino.destination(2));\n }\n\n function logWithIndent(line: string): void {\n process.stdout.write(` ${line}\\n`);\n }\n\n return {\n logger,\n logWithIndent,\n bannerLog: logWithIndent,\n };\n}\n","/**\n * AgentRuntime - main job processing loop with concurrency, payment, and recovery.\n * Supports per-capability pricing: each capability can have a different price.\n */\nimport {\n NATIVE_SOL,\n SolanaPaymentStrategy,\n calculateProtocolFee,\n createSlidingWindowLimiter,\n formatAssetAmount,\n getProtocolConfig,\n getProtocolProgramId,\n LIMITS,\n} from '@elisym/sdk';\nimport type { Asset, ProtocolConfigInput, SlidingWindowLimiter } from '@elisym/sdk';\nimport {\n createFreeLlmLimiterSet,\n FREE_LLM_GLOBAL_KEY,\n freeLlmCustomerKey,\n LlmHealthError,\n ScriptBillingExhaustedError,\n type FreeLlmLimiterSet,\n type LlmHealthMonitor,\n} from '@elisym/sdk/llm-health';\nimport { createSolanaRpc } from '@solana/kit';\nimport pLimit from 'p-limit';\nimport { getRpcUrl } from './helpers.js';\nimport { JobLedger } from './ledger.js';\nimport type { SkillRegistry, SkillContext } from './skill';\nimport type { NostrTransport, IncomingJob } from './transport/nostr.js';\n\nconst payment = new SolanaPaymentStrategy();\nconst LEDGER_GC_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\nconst LEDGER_RETENTION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days, mirrors plugin\nconst TOTAL_JOB_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n/**\n * Hard cutoff for `paid` jobs that the recovery loop is waiting to\n * re-execute against an unhealthy LLM pair. After this age the customer\n * is given up on, the entry is marked `failed`, and a final error\n * feedback is fired. Without this, an operator who walks away from a\n * billing-exhausted agent leaves the ledger and recovery loop spinning\n * on a job nobody will ever deliver.\n */\nconst MAX_PAID_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\n// How long the Nostr-feedback signature path waits for a `payment-completed`\n// before giving up. Solana confirmation + wallet signing is single-digit\n// seconds in the happy path, so 60s is generous; past that the customer is\n// almost certainly not coming back and the slot should be released.\nconst SIG_PATH_TIMEOUT_MS = 60 * 1000;\n\nexport interface RuntimeConfig {\n paymentTimeoutSecs: number;\n maxConcurrentJobs: number;\n recoveryMaxRetries: number;\n recoveryIntervalSecs: number;\n network: string;\n solanaAddress?: string;\n maxQueueSize?: number;\n}\n\nexport interface RuntimeCallbacks {\n onJobReceived?: (job: IncomingJob) => void;\n onJobCompleted?: (jobId: string, result: string) => void;\n onJobError?: (jobId: string, error: string) => void;\n onPaymentReceived?: (jobId: string, netAmount: number) => void;\n onLog?: (message: string) => void;\n /**\n * Invoked at the start of `stop()`, before the abort signal fires and before\n * the transport is torn down, so callers can tear down external resources\n * (watchdogs, ping subscriptions) that live outside the runtime.\n *\n * Contract:\n * - Runs exactly once per runtime - `stop()` is idempotent; repeated calls\n * do not re-invoke this callback.\n * - Thrown errors are caught and logged via `onLog`; shutdown continues.\n * - At invocation time the transport and abort controller are still live;\n * callers can safely use transport-backed services for final operations.\n */\n onStop?: () => void;\n}\n\n/** Resolve the price for a job by matching its tags against registered skills. */\nfunction resolveJobPrice(tags: string[], skills: SkillRegistry): number {\n const skill = skills.route(tags);\n return skill?.priceSubunits ?? 0;\n}\n\n/** Resolve the payment asset the matched skill is denominated in. Defaults to SOL. */\nfunction resolveJobAsset(tags: string[], skills: SkillRegistry): Asset {\n const skill = skills.route(tags);\n return skill?.asset ?? NATIVE_SOL;\n}\n\n/**\n * Markers that indicate an LLM provider's HTTP response body is about\n * billing / quota exhaustion rather than something benign. Mirrors the\n * marker sets in `cli/src/llm/providers/{anthropic,openai,openai-compatible}.ts`\n * (kept as a permissive superset so any provider's billing language is\n * detected when classifying mid-job errors). Refactoring to a single\n * shared module is out of scope here - just keep this list in sync.\n */\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient', 'insufficient_quota'];\n\n/**\n * Customer-facing message for both the preflight gate (cached\n * billing/invalid signal) and the post-execute path (skill.execute\n * surfaced billing/invalid mid-job). Kept identical between the two so\n * the customer sees a stable string regardless of which side of the\n * health-monitor flip their request landed on. Consumed by the SDK\n * subscription as the `onError` argument.\n */\nconst AGENT_UNAVAILABLE_MESSAGE = 'Agent temporarily unavailable';\n\n/**\n * Re-thrown by the post-execute catch when the underlying skill failure\n * was a billing / invalid signal that just flipped the health pair to\n * unhealthy. Lets `processJob`'s sanitizer surface a stable\n * customer-facing message instead of the generic \"Internal processing\n * error\" mask that otherwise hides every \"API error: ...\" string.\n */\nclass AgentUnavailableError extends Error {\n constructor() {\n super(AGENT_UNAVAILABLE_MESSAGE);\n this.name = 'AgentUnavailableError';\n }\n}\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Resolve the (provider, model) pair the matched skill depends on for\n * health-monitor gating, or `null` if the skill is not LLM-dependent.\n *\n * For `mode: 'llm'` the pair comes from `resolvedTriple` (computed at\n * startup with agent default + override). For script modes the pair\n * comes from `llmOverride.provider`+`.model` declared in SKILL.md, which\n * is the operator's signal that the script reaches an LLM API under\n * the hood. Either source produces the same (provider, model) string\n * pair the health monitor was registered with in `start.ts`.\n */\nfunction resolveHealthPair(\n skill: import('./skill').Skill | null,\n): { provider: string; model: string } | null {\n if (!skill) {\n return null;\n }\n if (skill.mode === 'llm' && skill.resolvedTriple) {\n return {\n provider: skill.resolvedTriple.provider,\n model: skill.resolvedTriple.model,\n };\n }\n if (skill.mode !== 'llm' && skill.llmOverride?.provider && skill.llmOverride?.model) {\n return {\n provider: skill.llmOverride.provider,\n model: skill.llmOverride.model,\n };\n }\n return null;\n}\n\nconst RATE_LIMIT_WINDOW_MS = 10 * 60 * 1000; // 10 minutes\nconst MAX_JOBS_PER_CUSTOMER = 20;\nconst GLOBAL_MAX_JOBS_PER_WINDOW = 200;\nconst MAX_TRACKED_CUSTOMERS = 1000;\nconst GLOBAL_LIMITER_KEY = '__global__';\n\nexport class AgentRuntime {\n private limit: ReturnType<typeof pLimit>;\n private inFlight = new Set<string>();\n private pending = 0;\n private maxQueueSize: number;\n private abortController = new AbortController();\n private jobAbortControllers = new Set<AbortController>();\n private recoveryInterval: ReturnType<typeof setInterval> | null = null;\n private gcInterval: ReturnType<typeof setInterval> | null = null;\n private stopped = false;\n /** Per-customer sliding-window rate limiter (keyed on customer pubkey). */\n private customerLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: MAX_JOBS_PER_CUSTOMER,\n maxKeys: MAX_TRACKED_CUSTOMERS,\n });\n /** Global sliding-window rate limiter (Sybil protection). */\n private globalLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: GLOBAL_MAX_JOBS_PER_WINDOW,\n maxKeys: 1,\n });\n /**\n * Two-tier limiter applied only to free LLM skills (mode='llm', price=0).\n * Existing per-customer + global limiters above remain in effect for all\n * jobs; this set adds tighter caps to prevent unpaid spam from draining\n * the operator's API key.\n */\n private freeLlmLimiters: FreeLlmLimiterSet = createFreeLlmLimiterSet();\n\n constructor(\n private transport: NostrTransport,\n private skills: SkillRegistry,\n private skillCtx: SkillContext,\n private config: RuntimeConfig,\n private ledger: JobLedger,\n private callbacks: RuntimeCallbacks = {},\n private healthMonitor?: LlmHealthMonitor,\n ) {\n this.limit = pLimit(config.maxConcurrentJobs);\n this.maxQueueSize = config.maxQueueSize ?? config.maxConcurrentJobs * 10;\n }\n\n /**\n * Inspect an error thrown by `skill.execute()` and, when it carries a\n * billing/invalid signal from the LLM provider, flip the matching\n * (provider, model) pair to unhealthy via the health monitor. The next\n * job hitting the same pair is then refused at the preflight gate\n * before payment, so customers don't keep paying for jobs that will\n * fail. Recovery happens through the lazy recovery loop.\n *\n * Two error shapes are recognized:\n *\n * - `ScriptBillingExhaustedError` - thrown by SDK script skills when\n * the spawned process exits with `SCRIPT_EXIT_BILLING_EXHAUSTED`.\n * Pair comes from `skill.llmOverride` (operator-declared).\n *\n * - LLM provider HTTP error from `mode: 'llm'` - bare `Error` whose\n * message starts with \"<Provider> API error: <status> <body>\" (the\n * format every CLI provider currently uses). We classify on status:\n * 402 / 401 / 403 -> mark unhealthy. Body markers (`credit\n * balance`, `billing`, `insufficient`) catch the 400-on-billing case\n * Anthropic returns and the 429+`insufficient_quota` case OpenAI\n * and the openai-compatible providers (xAI/Google/DeepSeek) return.\n * Pair comes from `skill.resolvedTriple`.\n *\n * Anything else is a transient/skill error and does NOT touch health\n * state - the recovery loop should not be poisoned by skill bugs.\n */\n private markHealthFromExecuteError(\n skill: import('./skill').Skill,\n err: unknown,\n log: (msg: string) => void,\n jobId: string,\n ): boolean {\n if (!this.healthMonitor) {\n return false;\n }\n const tag = `[${jobId.slice(0, 8)}]`;\n\n if (err instanceof ScriptBillingExhaustedError) {\n const provider = skill.llmOverride?.provider;\n const model = skill.llmOverride?.model;\n if (!provider || !model) {\n // Script signaled billing exhaustion but the operator didn't\n // declare which (provider, model) the script depends on - we\n // can't mark anything unhealthy. Surface a hint in the operator\n // log so they know to add provider/model to SKILL.md.\n log(\n `${tag} Script returned exit ${err.exitCode} (billing-exhausted) but skill \"${skill.name}\" did not declare provider/model in SKILL.md - cannot gate future jobs.`,\n );\n return false;\n }\n log(\n `${tag} Script signaled billing-exhausted (exit ${err.exitCode}). Marking ${provider}/${model} unhealthy; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, 'billing', err.message);\n return true;\n }\n\n if (skill.mode === 'llm' && skill.resolvedTriple) {\n const message = err instanceof Error ? err.message : String(err);\n const match = /API error:\\s*(\\d{3})\\b\\s*(.*)/i.exec(message);\n if (!match) {\n return false;\n }\n const status = Number(match[1]);\n const body = (match[2] ?? '').slice(0, 200);\n const isBillingStatus = status === 402;\n const isAuthStatus = status === 401 || status === 403;\n const isBilling400 = status === 400 && bodyLooksLikeBilling(body);\n const isBilling429 = status === 429 && bodyLooksLikeBilling(body);\n if (!isBillingStatus && !isAuthStatus && !isBilling400 && !isBilling429) {\n return false;\n }\n const reason: 'billing' | 'invalid' = isAuthStatus ? 'invalid' : 'billing';\n const provider = skill.resolvedTriple.provider;\n const model = skill.resolvedTriple.model;\n log(\n `${tag} LLM provider returned HTTP ${status} (${reason}). Marking ${provider}/${model} unhealthy; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, reason, body);\n return true;\n }\n\n return false;\n }\n\n /** Fetch on-chain protocol config (fee, treasury). Always fetches fresh to avoid stale treasury. */\n private async fetchProtocolConfig(): Promise<ProtocolConfigInput> {\n // Only devnet is supported until the elisym-config program ships on mainnet;\n // agent configs pinned to other networks must be re-initialized explicitly.\n if (this.config.network !== 'devnet') {\n throw new Error(\n `Network \"${this.config.network}\" is not supported. Only \"devnet\" is available ` +\n `until the on-chain protocol program is deployed on mainnet.`,\n );\n }\n const programId = getProtocolProgramId('devnet');\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const config = await getProtocolConfig(rpc, programId, { forceRefresh: true });\n return { feeBps: config.feeBps, treasury: config.treasury };\n }\n\n async run(): Promise<void> {\n const log = this.callbacks.onLog ?? console.log;\n\n // Prune terminal ledger entries past the 30-day retention window.\n this.ledger.pruneOldEntries(LEDGER_RETENTION_MS);\n\n // Recover pending jobs from previous sessions\n await this.recoverPendingJobs();\n\n // Start periodic recovery\n this.recoveryInterval = setInterval(\n () => this.recoverPendingJobs().catch((e) => log(`Recovery error: ${e}`)),\n this.config.recoveryIntervalSecs * 1000,\n );\n\n // Periodic ledger GC, rate limit cleanup, and subscription health check\n this.gcInterval = setInterval(() => {\n try {\n this.ledger.pruneOldEntries(LEDGER_RETENTION_MS);\n } catch (e: any) {\n log(`GC error: ${e.message}`);\n }\n this.cleanupRateLimits();\n if (!this.transport.isHealthy()) {\n log('Warning: no events received in 30+ minutes. Check relay connectivity.');\n }\n }, LEDGER_GC_INTERVAL_MS);\n\n // Start listening for jobs\n this.transport.start((job) => {\n if (this.abortController.signal.aborted) {\n return;\n }\n if (this.inFlight.has(job.jobId)) {\n return;\n }\n if (this.ledger.getStatus(job.jobId)) {\n return;\n }\n\n // Drop jobs when queue is full to prevent unbounded memory growth\n if (this.pending >= this.maxQueueSize) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server overloaded, try again later' })\n .catch(() => {});\n return;\n }\n\n // Per-customer check first so a rate-limited customer does not\n // bump the global counter - otherwise a single abusive customer\n // could starve every other caller up to the global cap.\n if (!this.customerLimiter.peek(job.customerId).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n\n // Global rate limiting (Sybil protection).\n if (!this.globalLimiter.peek(GLOBAL_LIMITER_KEY).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server busy, try again later' })\n .catch(() => {});\n return;\n }\n\n // Free-LLM extra protection: only applies when the matched skill\n // is mode='llm' and price=0. Routes through skills.route once;\n // result is reused below in `executeJob`. We `peek` first across\n // all tiers and only `check` when every tier passes, so a denial\n // in tier N never consumes a slot in tiers < N.\n const matched = this.skills.route(job.tags);\n const isFreeLlm = matched?.mode === 'llm' && matched.priceSubunits === 0;\n let perCustomerLimiter: SlidingWindowLimiter | undefined;\n let perSkillKey: string | undefined;\n if (isFreeLlm && matched) {\n if (!this.freeLlmLimiters.globalLimiter.peek(FREE_LLM_GLOBAL_KEY).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n perCustomerLimiter = this.freeLlmLimiters.getPerCustomerLimiter(\n matched.name,\n matched.rateLimit,\n );\n perSkillKey = freeLlmCustomerKey(job.customerId, matched.name);\n if (!perCustomerLimiter.peek(perSkillKey).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n }\n\n // All checks passed - record the hit against every active limiter.\n this.customerLimiter.check(job.customerId);\n this.globalLimiter.check(GLOBAL_LIMITER_KEY);\n if (isFreeLlm && perCustomerLimiter && perSkillKey) {\n this.freeLlmLimiters.globalLimiter.check(FREE_LLM_GLOBAL_KEY);\n perCustomerLimiter.check(perSkillKey);\n }\n\n this.callbacks.onJobReceived?.(job);\n this.inFlight.add(job.jobId);\n this.pending++;\n\n this.limit(() => this.processJob(job))\n .catch((e: any) => {\n this.callbacks.onJobError?.(job.jobId, e.message);\n })\n .finally(() => {\n this.inFlight.delete(job.jobId);\n this.pending--;\n });\n });\n\n log('Agent runtime started. Listening for jobs...');\n\n // Wait for shutdown signal. SIGINT and SIGTERM share an idempotent\n // handler so we don't log \"Shutting down...\" twice when both arrive\n // (shells sometimes deliver SIGINT+SIGTERM to the whole process group).\n await new Promise<void>((resolve) => {\n this.abortController.signal.addEventListener('abort', () => resolve(), { once: true });\n\n let shuttingDown = false;\n const onSignal = (): void => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n log('Shutting down...');\n this.stop();\n setTimeout(() => process.exit(0), 3000).unref();\n };\n process.on('SIGINT', onSignal);\n process.on('SIGTERM', onSignal);\n });\n }\n\n /** Drop expired hits from every sliding-window limiter. */\n private cleanupRateLimits(): void {\n this.customerLimiter.prune();\n this.globalLimiter.prune();\n this.freeLlmLimiters.globalLimiter.prune();\n this.freeLlmLimiters.prunePerCustomer();\n }\n\n stop(): void {\n if (this.stopped) {\n return;\n }\n this.stopped = true;\n try {\n this.callbacks.onStop?.();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n (this.callbacks.onLog ?? console.log)(`onStop error: ${msg}`);\n }\n this.abortController.abort();\n for (const controller of this.jobAbortControllers) {\n controller.abort();\n }\n if (this.recoveryInterval) {\n clearInterval(this.recoveryInterval);\n this.recoveryInterval = null;\n }\n if (this.gcInterval) {\n clearInterval(this.gcInterval);\n this.gcInterval = null;\n }\n this.transport.stop();\n }\n\n /** Wrapper with total job timeout and error handling. */\n private async processJob(job: IncomingJob): Promise<void> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const jobAbort = new AbortController();\n this.jobAbortControllers.add(jobAbort);\n try {\n await Promise.race([\n this.executeJob(job, jobAbort.signal),\n new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n jobAbort.abort();\n reject(new Error('Job processing timeout'));\n }, TOTAL_JOB_TIMEOUT_MS);\n }),\n ]);\n } catch (e: any) {\n const log = this.callbacks.onLog ?? console.log;\n log(`[${job.jobId.slice(0, 8)}] Error: ${e.message}`);\n\n // Status transitions on failure:\n // - `executed`: never markFailed - delivery recovery will retry.\n // - `paid` + `AgentUnavailableError`: keep as `paid` so the recovery\n // loop re-executes once the LLM pair flips back to healthy. The\n // customer paid, so abandoning the job to `failed` would lose\n // their funds with no path back. The recovery loop's gate-aware\n // check (assertReady) and 24h hard cutoff bound the wait.\n // - everything else: markFailed as before.\n const currentStatus = this.ledger.getStatus(job.jobId);\n const keepPaidForRecovery = e instanceof AgentUnavailableError && currentStatus === 'paid';\n if (currentStatus !== 'executed' && !keepPaidForRecovery) {\n this.ledger.markFailed(job.jobId);\n }\n if (keepPaidForRecovery) {\n log(\n `[${job.jobId.slice(0, 8)}] Keeping status=paid; recovery will re-execute when LLM pair recovers (24h cutoff).`,\n );\n }\n this.callbacks.onJobError?.(job.jobId, e.message);\n\n // W8: Sanitize error messages before sending to customer.\n // `AgentUnavailableError` is the runtime's own marker for a\n // billing/invalid health flip and carries the canonical\n // customer-facing string - pass it through verbatim. Anything\n // mentioning \"API\" otherwise is a leaky provider error and gets\n // masked.\n let safeMessage: string;\n if (e instanceof AgentUnavailableError) {\n safeMessage = e.message;\n } else if (e.message?.includes('API')) {\n safeMessage = 'Internal processing error';\n } else {\n safeMessage = e.message ?? 'Unknown error';\n }\n await this.transport\n .sendFeedback(job, { type: 'error', message: safeMessage })\n .catch(() => {});\n } finally {\n clearTimeout(timeoutId);\n this.jobAbortControllers.delete(jobAbort);\n }\n }\n\n /** Core job processing logic - payment, skill execution, result delivery. */\n private async executeJob(job: IncomingJob, signal?: AbortSignal): Promise<void> {\n const log = this.callbacks.onLog ?? console.log;\n\n // W2: Validate input length before processing\n if (job.input.length > LIMITS.MAX_INPUT_LENGTH) {\n throw new Error(`Input too long: ${job.input.length} chars (max ${LIMITS.MAX_INPUT_LENGTH})`);\n }\n\n // ── Preflight: gate LLM-dependent jobs against the health monitor\n // before sending payment-required. If the operator's API key has gone\n // invalid/billing-exhausted since startup, refuse the job before the\n // customer pays and before we record anything in the ledger.\n //\n // Two paths feed the gate:\n // - mode === 'llm' uses `resolvedTriple` (provider + model + maxTokens)\n // resolved at startup from agent default + skill override.\n // - script modes use `llmOverride.provider`+`.model` declared in\n // SKILL.md to signal \"this script depends on this API key\"; the\n // runtime registers the same (provider, model) pair with the\n // health monitor in start.ts, so assertReady works identically.\n //\n // Customer-facing message stays generic to avoid leaking billing\n // status; operator log carries the real reason via the throw.\n const matched = this.skills.route(job.tags);\n const healthPair = resolveHealthPair(matched);\n if (this.healthMonitor && healthPair) {\n try {\n await this.healthMonitor.assertReady(healthPair.provider, healthPair.model);\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n log(`[${job.jobId.slice(0, 8)}] LLM health gate refused job: ${detail}`);\n await this.transport\n .sendFeedback(job, {\n type: 'error',\n message: AGENT_UNAVAILABLE_MESSAGE,\n })\n .catch(() => {});\n return;\n }\n }\n\n // ── Step 1: Resolve per-capability price and collect payment ──\n const jobPrice = resolveJobPrice(job.tags, this.skills);\n const jobAsset = resolveJobAsset(job.tags, this.skills);\n let netAmount: number | undefined;\n let paymentRequest: string | undefined;\n\n // W1: Record in ledger BEFORE payment to prevent crash window data loss\n this.ledger.recordPaid({\n job_id: job.jobId,\n input: job.input,\n input_type: job.inputType,\n tags: job.tags,\n customer_id: job.customerId,\n bid: job.bid,\n net_amount: undefined,\n raw_event_json: JSON.stringify(job.rawEvent),\n created_at: Math.floor(Date.now() / 1000),\n });\n\n if (jobPrice > 0) {\n const result = await this.collectPayment(job, jobPrice, jobAsset, signal);\n netAmount = result.netAmount;\n paymentRequest = result.paymentRequest;\n // Update ledger with payment info\n this.ledger.updatePayment(job.jobId, netAmount, paymentRequest);\n log(\n `[${job.jobId.slice(0, 8)}] Payment confirmed: ${formatAssetAmount(\n jobAsset,\n BigInt(netAmount),\n )}`,\n );\n this.callbacks.onPaymentReceived?.(job.jobId, netAmount);\n }\n\n // ── Step 2: Send Processing feedback ──\n await this.transport.sendFeedback(job, { type: 'processing' }).catch(() => {});\n\n // ── Step 3: Route to skill ──\n const skill = this.skills.route(job.tags);\n if (!skill) {\n throw new Error('No skill matched for tags: ' + job.tags.join(', '));\n }\n\n log(`[${job.jobId.slice(0, 8)}] Executing skill: ${skill.name}`);\n\n // ── Step 4: Execute skill ──\n // Wrapped so a billing/invalid signal surfaced *during* execution\n // (script exit 42 or LLM 402/401) flips the matching health pair to\n // unhealthy. The next job hitting the same pair will be refused at\n // the preflight gate before payment, instead of sailing through and\n // failing again. Recovery happens via the lazy recovery loop, which\n // re-probes only while the pair is unhealthy.\n let output;\n try {\n output = await skill.execute(\n {\n data: job.input,\n inputType: job.inputType,\n tags: job.tags,\n jobId: job.jobId,\n },\n { ...this.skillCtx, signal },\n );\n } catch (err) {\n const flippedToUnhealthy = this.markHealthFromExecuteError(skill, err, log, job.jobId);\n // When the skill failure was the trigger that flipped the health\n // pair to unhealthy, surface a stable \"agent unavailable\" message\n // to the customer rather than the sanitized \"Internal processing\n // error\" string the leaky-API masker would otherwise produce.\n // Recovery happens through the lazy recovery loop.\n if (flippedToUnhealthy) {\n throw new AgentUnavailableError();\n }\n throw err;\n }\n\n // ── Step 5: Cache result in ledger ──\n // NOTE: At-least-once delivery. A crash between execute() return and markExecuted()\n // flush leaves the job as 'paid' - recovery will re-execute. Skills must be idempotent\n // or tolerant of re-execution.\n this.ledger.markExecuted(job.jobId, output.data);\n log(`[${job.jobId.slice(0, 8)}] Skill completed, delivering result`);\n\n // ── Step 6: Deliver result ──\n const eventId = await this.transport.deliverResult(job, output.data, netAmount);\n this.ledger.markDelivered(job.jobId);\n\n log(`[${job.jobId.slice(0, 8)}] Delivered: ${eventId.slice(0, 16)}...`);\n this.callbacks.onJobCompleted?.(job.jobId, output.data);\n }\n\n /**\n * Collect payment for a job. Creates payment request, sends PaymentRequired feedback,\n * polls for on-chain confirmation. Aborts if signal fires.\n */\n private async collectPayment(\n job: IncomingJob,\n jobPrice: number,\n jobAsset: Asset,\n signal?: AbortSignal,\n ): Promise<{ netAmount: number; paymentRequest: string }> {\n const log = this.callbacks.onLog ?? console.log;\n\n if (!this.config.solanaAddress) {\n throw new Error('Solana address not configured');\n }\n\n const protocolConfig = await this.fetchProtocolConfig();\n\n // Create payment request with protocol fee\n const request = payment.createPaymentRequest(\n this.config.solanaAddress,\n jobPrice,\n protocolConfig,\n { expirySecs: this.config.paymentTimeoutSecs, asset: jobAsset },\n );\n const requestJson = JSON.stringify(request);\n\n const fee = calculateProtocolFee(jobPrice, protocolConfig.feeBps);\n const netAmount = jobPrice - fee;\n\n log(\n `[${job.jobId.slice(0, 8)}] Payment required: ${formatAssetAmount(jobAsset, BigInt(jobPrice))} ` +\n `(fee: ${formatAssetAmount(jobAsset, BigInt(fee))})`,\n );\n\n // Store payment request reference early for crash recovery\n this.ledger.updatePayment(job.jobId, undefined, requestJson);\n\n // Send PaymentRequired feedback to customer\n await this.transport.sendFeedback(job, {\n type: 'payment-required',\n amount: jobPrice,\n paymentRequest: requestJson,\n chain: 'solana',\n });\n\n // Verify payment on-chain. Two paths run in parallel, both self-bounded:\n // (a) Signature path - subscribe to the customer's payment-completed\n // Nostr feedback, take the tx signature it carries, and verify it\n // directly via `getTransaction(sig, 'confirmed')`. Fast (~1-3s) and\n // cheap on RPC quota. Self-times out after SIG_PATH_TIMEOUT_MS so an\n // abandoned customer does not hold a `p-limit` slot indefinitely.\n // (b) Reference path - SDK's getSignaturesForAddress(reference) loop.\n // Slower and more brittle on the public devnet RPC, but works as a\n // fallback when Nostr feedback is dropped. Self-times out via SDK\n // retry budget (~30s).\n // First `verified: true` wins; if both fail we resolve immediately with\n // the last failure. The outer `deadlineMs` backstop only triggers if both\n // paths somehow hang past their own timeouts.\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const verifyAbort = new AbortController();\n const onOuterAbort = () => verifyAbort.abort();\n if (signal) {\n if (signal.aborted) {\n verifyAbort.abort();\n } else {\n signal.addEventListener('abort', onOuterAbort, { once: true });\n }\n }\n const deadlineMs = this.config.paymentTimeoutSecs * 1000;\n const sigPathTimeoutMs = Math.min(deadlineMs, SIG_PATH_TIMEOUT_MS);\n\n let result: { verified: boolean };\n try {\n result = await new Promise<{ verified: boolean }>((resolve, reject) => {\n let settled = false;\n let pending = 2;\n let lastResult: { verified: boolean } = { verified: false };\n\n const win = (verified: { verified: boolean }) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(deadline);\n resolve(verified);\n };\n\n const lose = (verified: { verified: boolean }, reason: string) => {\n if (settled) {\n return;\n }\n lastResult = verified;\n pending -= 1;\n log(`[${job.jobId.slice(0, 8)}] verify ${reason}`);\n if (pending === 0) {\n settled = true;\n clearTimeout(deadline);\n resolve(lastResult);\n }\n };\n\n // Path (a) - signature path\n this.transport\n .waitForPaymentSignature(job.jobId, job.customerId, verifyAbort.signal, sigPathTimeoutMs)\n .then(async (sig) => {\n if (settled) {\n return;\n }\n if (!sig) {\n lose({ verified: false }, 'sig path: no payment-completed feedback');\n return;\n }\n log(`[${job.jobId.slice(0, 8)}] verify sig path: got ${sig.slice(0, 8)}...`);\n try {\n const verified = await payment.verifyPayment(rpc, request, protocolConfig, {\n txSignature: sig,\n });\n if (verified.verified) {\n win(verified);\n } else {\n const reason = (verified as { error?: string }).error ?? 'unknown';\n lose(verified, `sig path: not verified (${reason})`);\n }\n } catch (err) {\n lose(\n { verified: false },\n `sig path error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n })\n .catch((err) =>\n lose(\n { verified: false },\n `sig path error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n\n // Path (b) - reference path\n payment\n .verifyPayment(rpc, request, protocolConfig)\n .then((verified) => {\n if (verified.verified) {\n win(verified);\n } else {\n const reason = (verified as { error?: string }).error ?? 'unknown';\n lose(verified, `ref path: not verified (${reason})`);\n }\n })\n .catch((err) =>\n lose(\n { verified: false },\n `ref path error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n\n // Hard deadline backstop - guarantees we never hang past paymentTimeoutSecs\n const deadline = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n log(`[${job.jobId.slice(0, 8)}] verify deadline (${deadlineMs}ms) hit`);\n resolve(lastResult);\n }, deadlineMs);\n\n // Outer abort propagation\n if (signal?.aborted) {\n settled = true;\n clearTimeout(deadline);\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n return;\n }\n signal?.addEventListener(\n 'abort',\n () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(deadline);\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n },\n { once: true },\n );\n });\n } finally {\n verifyAbort.abort();\n if (signal) {\n signal.removeEventListener('abort', onOuterAbort);\n }\n }\n\n if (result.verified) {\n return { netAmount, paymentRequest: requestJson };\n }\n\n // Timeout - customer may have paid on-chain but verification failed\n log(\n `[${job.jobId.slice(0, 8)}] WARNING: Payment verification timed out. ` +\n `Customer may have paid on-chain. Check address ${this.config.solanaAddress} manually.`,\n );\n await this.transport\n .sendFeedback(job, { type: 'error', message: 'payment timeout' })\n .catch(() => {});\n throw new Error('Payment timeout');\n }\n\n private async recoverPendingJobs(): Promise<void> {\n const pending = this.ledger.pendingJobs().filter((e) => !this.inFlight.has(e.job_id));\n if (pending.length === 0) {\n return;\n }\n\n const log = this.callbacks.onLog ?? console.log;\n log(`Recovering ${pending.length} pending jobs...`);\n\n // If any pending `paid` job is parked on an unhealthy LLM pair,\n // fire a probe so the recovery loop's gate (assertReady in\n // recoverSingleJob) sees fresh state on the next tick. The lazy\n // health-recovery loop probes every 5 minutes by itself; we add\n // this trigger so paid jobs don't sit idle for that long once the\n // operator fixes their API key. Fire-and-forget: we don't want to\n // block the per-tick recovery iteration on a network probe.\n if (this.healthMonitor) {\n const snap = this.healthMonitor.snapshot();\n const unhealthyKeys = new Set(\n snap\n .filter(\n (entry) =>\n entry.status === 'invalid' ||\n entry.status === 'billing' ||\n entry.status === 'unavailable',\n )\n .map((entry) => `${entry.provider}::${entry.model}`),\n );\n if (unhealthyKeys.size > 0) {\n const hasPaidOnUnhealthy = pending.some((entry) => {\n if (entry.status !== 'paid') {\n return false;\n }\n const skill = this.skills.route(entry.tags);\n const pair = resolveHealthPair(skill);\n return pair !== null && unhealthyKeys.has(`${pair.provider}::${pair.model}`);\n });\n if (hasPaidOnUnhealthy) {\n void this.healthMonitor.refreshUnhealthy().catch(() => {\n /* probe surfaces its own errors via the snapshot */\n });\n }\n }\n }\n\n for (const entry of pending) {\n const ageMs = (Math.floor(Date.now() / 1000) - entry.created_at) * 1000;\n const expired = ageMs > MAX_PAID_AGE_MS;\n const exhaustedRetries = entry.retry_count >= this.config.recoveryMaxRetries;\n if (expired || exhaustedRetries) {\n this.ledger.markFailed(entry.job_id);\n const reason = expired\n ? 'Job permanently failed: agent did not recover within 24 hours'\n : 'Job permanently failed after maximum retries';\n if (entry.raw_event_json) {\n try {\n const rawEvent = JSON.parse(entry.raw_event_json);\n await this.transport\n .sendFeedback(\n {\n jobId: entry.job_id,\n input: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n customerId: entry.customer_id,\n encrypted: false,\n rawEvent,\n },\n { type: 'error', message: reason },\n )\n .catch(() => {});\n } catch {\n /* best effort */\n }\n }\n continue;\n }\n\n if (!entry.raw_event_json) {\n continue;\n }\n\n // Respect queue limit for recovery jobs too\n if (this.pending >= this.maxQueueSize) {\n break;\n }\n\n // Route through p-limit to respect maxConcurrentJobs\n this.inFlight.add(entry.job_id);\n this.pending++;\n this.limit(async () => {\n try {\n await this.recoverSingleJob(entry, log);\n } catch (e: any) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: failed: ${e.message}`);\n } finally {\n this.inFlight.delete(entry.job_id);\n this.pending--;\n }\n });\n }\n }\n\n private async recoverSingleJob(\n entry: ReturnType<JobLedger['pendingJobs']>[number],\n log: (msg: string) => void,\n ): Promise<void> {\n const recoveryAbort = new AbortController();\n this.jobAbortControllers.add(recoveryAbort);\n const timeout = setTimeout(() => recoveryAbort.abort(), TOTAL_JOB_TIMEOUT_MS);\n\n try {\n const rawEvent = JSON.parse(entry.raw_event_json!);\n const fakeJob: IncomingJob = {\n jobId: entry.job_id,\n input: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n customerId: entry.customer_id,\n encrypted: false,\n rawEvent,\n };\n\n if (entry.status === 'executed' && entry.result !== undefined) {\n // Re-deliver only - no LLM call, no gate check.\n this.ledger.incrementRetry(entry.job_id);\n await this.transport.deliverResult(fakeJob, entry.result, entry.net_amount);\n this.ledger.markDelivered(entry.job_id);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: re-delivered`);\n } else if (entry.status === 'paid') {\n const skill = this.skills.route(entry.tags);\n if (!skill) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: no skill for tags, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n\n // Gate the retry against the LLM health monitor: if the pair is\n // still unhealthy, skip THIS tick without burning a retry. The\n // outer loop will re-schedule us; a successful probe (lazy\n // recovery loop or explicit refreshUnhealthy) flips the pair\n // back to healthy and the next tick proceeds. Without this\n // check, every recovery tick during a billing outage would\n // re-spawn the script, fail with exit 42, and consume one of\n // the bounded retry slots even though the underlying problem\n // (operator's API key) hasn't been touched yet.\n const healthPair = resolveHealthPair(skill);\n if (this.healthMonitor && healthPair) {\n try {\n await this.healthMonitor.assertReady(healthPair.provider, healthPair.model);\n } catch (err) {\n if (err instanceof LlmHealthError) {\n log(\n `[${entry.job_id.slice(0, 8)}] Recovery: pair ${healthPair.provider}/${healthPair.model} still unhealthy (${err.reason}); waiting for recovery probe.`,\n );\n return;\n }\n throw err;\n }\n }\n\n this.ledger.incrementRetry(entry.job_id);\n\n // Re-verify payment if reference was stored but confirmation lost to crash\n if (skill.priceSubunits > 0 && !entry.net_amount) {\n if (entry.payment_request) {\n const verified = await this.reVerifyPayment(\n entry,\n skill.priceSubunits,\n log,\n recoveryAbort.signal,\n );\n if (!verified) {\n this.ledger.markFailed(entry.job_id);\n return;\n }\n } else {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment not confirmed, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n }\n\n const output = await skill.execute(\n {\n data: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n jobId: entry.job_id,\n },\n { ...this.skillCtx, signal: recoveryAbort.signal },\n );\n\n this.ledger.markExecuted(entry.job_id, output.data);\n await this.transport.deliverResult(fakeJob, output.data, entry.net_amount);\n this.ledger.markDelivered(entry.job_id);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: re-executed and delivered`);\n }\n } finally {\n clearTimeout(timeout);\n this.jobAbortControllers.delete(recoveryAbort);\n }\n }\n\n /**\n * Re-verify an on-chain payment during crash recovery.\n *\n * Limitation: Solana transaction data expires after ~2-3 days (recent blockhash window).\n * If the agent was down longer, a confirmed payment may not be found on-chain and the\n * job will be marked failed. For mainnet: use monitoring, avoid extended downtime, or\n * configure an archive RPC via SOLANA_RPC_URL.\n */\n private async reVerifyPayment(\n entry: ReturnType<JobLedger['pendingJobs']>[number],\n priceSubunits: number,\n log: (msg: string) => void,\n signal?: AbortSignal,\n ): Promise<boolean> {\n try {\n const request = JSON.parse(entry.payment_request!);\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const protocolConfig = await this.fetchProtocolConfig();\n\n let result: { verified: boolean };\n if (signal) {\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n };\n if (signal.aborted) {\n abortHandler();\n return;\n }\n signal.addEventListener('abort', abortHandler, { once: true });\n });\n try {\n result = await Promise.race([\n payment.verifyPayment(rpc, request, protocolConfig),\n abortPromise,\n ]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(rpc, request, protocolConfig);\n }\n\n if (result.verified) {\n const fee = calculateProtocolFee(priceSubunits, protocolConfig.feeBps);\n const netAmount = priceSubunits - fee;\n this.ledger.updatePayment(entry.job_id, netAmount, entry.payment_request);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment re-verified (${netAmount} subunits)`);\n return true;\n }\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment not found on-chain, marking failed`);\n return false;\n } catch (e: any) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment re-verification error: ${e.message}`);\n return false;\n }\n }\n}\n","/**\n * Skill interface and registry.\n */\n\nimport { toDTag, type Asset } from '@elisym/sdk';\nimport type { SkillRateLimit } from '@elisym/sdk/llm-health';\nimport type { SkillLlmOverride, SkillMode } from '@elisym/sdk/skills';\n\nexport type { SkillLlmOverride, SkillMode, SkillRateLimit };\n\n/**\n * Resolved (provider, model, maxTokens) triple for an LLM-mode skill.\n * Computed once at startup in `start.ts` after `resolveSkillLlm`, then\n * attached to the skill instance so the runtime preflight can read it\n * without re-running resolution from `loaded.yaml`.\n */\nexport interface ResolvedSkillTriple {\n provider: string;\n model: string;\n maxTokens: number;\n}\n\nexport interface SkillInput {\n data: string;\n inputType: string;\n tags: string[];\n jobId: string;\n}\n\nexport interface SkillOutput {\n data: string;\n outputMime?: string;\n}\n\nexport interface SkillContext {\n /** Agent-default LLM client. Undefined when every LLM skill overrides. */\n llm?: LlmClient;\n /**\n * Resolve the LLM client for a skill. The runtime caches clients by\n * resolved (provider, model, maxTokens) triple. Pass the skill's\n * `llmOverride` (or undefined for the agent default).\n */\n getLlm?: (override?: SkillLlmOverride) => LlmClient | undefined;\n agentName: string;\n agentDescription: string;\n signal?: AbortSignal;\n}\n\nexport interface LlmClient {\n complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string>;\n completeWithTools(\n systemPrompt: string,\n messages: any[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult>;\n /** Format tool results into provider-specific messages (Anthropic vs OpenAI). */\n formatToolResultMessages(results: ToolResult[]): any[];\n}\n\nexport interface ToolDef {\n name: string;\n description: string;\n parameters: Array<{ name: string; description: string; required: boolean }>;\n}\n\nexport type CompletionResult =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; calls: ToolCall[]; assistantMessage: any };\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, any>;\n}\n\n/** Provider-agnostic tool result passed from ScriptSkill to LlmClient. */\nexport interface ToolResult {\n callId: string;\n content: string;\n}\n\n/**\n * A skill that can be executed by the agent runtime.\n *\n * Skills should be idempotent or tolerant of re-execution: if the agent crashes\n * after execute() returns but before the result is persisted, recovery will\n * re-execute the skill with the same input (at-least-once delivery).\n */\nexport interface Skill {\n name: string;\n description: string;\n capabilities: string[];\n /**\n * Price in subunits of `asset` (0 = free). For SOL: lamports (1e-9 SOL).\n * For USDC: 1e-6 USDC. Converted from SKILL.md's human-readable `price`.\n *\n * Number (not bigint) for ergonomics - realistic agent prices fit well\n * below `Number.MAX_SAFE_INTEGER` subunits.\n */\n priceSubunits: number;\n /** Asset the price is denominated in (NATIVE_SOL or USDC_SOLANA_DEVNET, etc.). */\n asset: Asset;\n /** Execution mode (`'llm'` for the historical LLM-orchestrated path). */\n mode: SkillMode;\n /**\n * Per-skill LLM override / dependency.\n *\n * For `mode: 'llm'`: overrides the agent default (provider/model/maxTokens)\n * for runtime LLM execution. The runtime constructs the LLM client from this.\n *\n * For script modes: declares which LLM API key the script depends on so\n * the runtime can health-monitor it (startup probe + reactive markUnhealthy\n * on `SCRIPT_EXIT_BILLING_EXHAUSTED` + lazy recovery). Only `provider` and\n * `model` are meaningful here; `maxTokens` is rejected at parse time.\n */\n llmOverride?: SkillLlmOverride;\n /** Hero image URL. */\n image?: string;\n /** Local file path for hero image (uploaded on first start). */\n imageFile?: string;\n /** On-disk skill directory (e.g. `<agent>/skills/whois-lookup`). */\n dir?: string;\n /**\n * Resolved (provider, model, maxTokens) for `mode: 'llm'` skills. Set\n * once at startup. Undefined for script modes - they use `llmOverride`\n * directly when declared. Read by the runtime to gate against the\n * `LlmHealthMonitor` before sending `payment-required`.\n */\n resolvedTriple?: ResolvedSkillTriple;\n /**\n * Optional per-skill rate limit declared in SKILL.md frontmatter\n * (snake_case `rate_limit` -> camelCase). Applies to any mode but the\n * runtime treats free LLM skills as the primary use case.\n */\n rateLimit?: SkillRateLimit;\n execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput>;\n}\n\nexport class SkillRegistry {\n private skills: Skill[] = [];\n private defaultIndex: number | null = null;\n\n register(skill: Skill): void {\n if (this.defaultIndex === null) {\n this.defaultIndex = this.skills.length;\n }\n this.skills.push(skill);\n }\n\n route(tags: string[]): Skill | null {\n // Match by skill name in canonical d-tag form. Outgoing capability cards\n // publish `['d', toDTag(card.name)]`, so incoming job tags arrive\n // d-tag-shaped (lowercase, ASCII letters + digits + hyphens). Comparing\n // raw `skill.name` only works when the name is already kebab-case;\n // normalize through `toDTag` so human-readable names route too.\n for (const tag of tags) {\n const byName = this.skills.find((skill) => toDTag(skill.name) === tag);\n if (byName) {\n return byName;\n }\n }\n // Then declared capability tags (secondary matching).\n for (const tag of tags) {\n const byCap = this.skills.find((skill) => skill.capabilities.includes(tag));\n if (byCap) {\n return byCap;\n }\n }\n // Default fallback only for genuinely untargeted jobs (no specific tag\n // beyond the 'elisym' protocol marker). A job that *does* carry a\n // specific capability tag must not silently degrade to a free default -\n // that was a payment-bypass vector.\n const hasSpecificTag = tags.some((tag) => tag && tag !== 'elisym');\n if (hasSpecificTag) {\n return null;\n }\n return this.defaultIndex !== null ? this.skills[this.defaultIndex]! : null;\n }\n\n allCapabilities(): string[] {\n return this.skills.flatMap((s) => s.capabilities);\n }\n\n isEmpty(): boolean {\n return this.skills.length === 0;\n }\n\n all(): Skill[] {\n return this.skills;\n }\n}\n","/**\n * CLI wrappers around the non-LLM SDK skill classes. They mirror the\n * pattern in `script-skill.ts` so the CLI's `Skill` interface\n * (`priceSubunits: number`, `mode`, `dir`) stays uniform across all\n * execution modes while delegating actual work to the shared SDK runners.\n */\nimport type { Asset } from '@elisym/sdk';\nimport {\n DynamicScriptSkill as SdkDynamicScriptSkill,\n StaticFileSkill as SdkStaticFileSkill,\n StaticScriptSkill as SdkStaticScriptSkill,\n type SkillLlmOverride,\n type SkillMode,\n} from '@elisym/sdk/skills';\nimport type { Skill, SkillContext, SkillInput, SkillOutput } from './index.js';\n\ninterface BaseParams {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n image?: string;\n imageFile?: string;\n /** On-disk skill directory. */\n dir: string;\n /**\n * For script modes: declared LLM dependency (provider+model). When set,\n * the runtime registers the pair with the health monitor and gates jobs\n * against it.\n */\n llmOverride?: SkillLlmOverride;\n}\n\nexport interface CliStaticFileSkillParams extends BaseParams {\n outputFilePath: string;\n}\n\nexport class StaticFileSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'static-file';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkStaticFileSkill;\n\n constructor(params: CliStaticFileSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkStaticFileSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n outputFilePath: params.outputFilePath,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n\nexport interface CliScriptSkillParams extends BaseParams {\n scriptPath: string;\n scriptArgs: string[];\n scriptTimeoutMs?: number;\n /** Full env for the script. CLI builds this from `process.env` + decrypted secrets. */\n scriptEnv?: NodeJS.ProcessEnv;\n}\n\nexport class StaticScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'static-script';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkStaticScriptSkill;\n\n constructor(params: CliScriptSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkStaticScriptSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n scriptPath: params.scriptPath,\n scriptArgs: params.scriptArgs,\n scriptTimeoutMs: params.scriptTimeoutMs,\n scriptEnv: params.scriptEnv,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n\nexport class DynamicScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'dynamic-script';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkDynamicScriptSkill;\n\n constructor(params: CliScriptSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkDynamicScriptSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n scriptPath: params.scriptPath,\n scriptArgs: params.scriptArgs,\n scriptTimeoutMs: params.scriptTimeoutMs,\n scriptEnv: params.scriptEnv,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n","/**\n * CLI ScriptSkill - thin wrapper over `@elisym/sdk/skills` ScriptSkill.\n *\n * Preserves the CLI's historical positional constructor and Skill\n * interface shape (priceSubunits as number, mutable image/imageFile\n * fields) while delegating all execution logic to the shared SDK\n * runner - so tool-use, spawn, max_tool_rounds, and timeout behaviour\n * stay identical to the plugin / SDK path.\n */\nimport { NATIVE_SOL, type Asset } from '@elisym/sdk';\nimport {\n ScriptSkill as SdkScriptSkill,\n type SkillLlmOverride,\n type SkillMode,\n type SkillToolDef,\n} from '@elisym/sdk/skills';\nimport type { Skill, SkillContext, SkillInput, SkillOutput } from './index.js';\n\n/**\n * CLI ScriptSkill constructor with a back-compat positional signature.\n *\n * The `asset` parameter is accepted in two positions:\n * - 5th (new code: `new ScriptSkill(name, desc, caps, price, asset, image, imageFile, dir,\n * prompt, tools, rounds)`) - preferred for USDC/multi-asset.\n * - As part of a trailing `{ asset }` init; else falls through to NATIVE_SOL\n * when the 5th positional slot is `undefined` / is actually an `image` string.\n *\n * This preserves older `new ScriptSkill(name, desc, caps, price, image, ...)` call sites\n * (internal tests) so we do not have to touch them to land USDC support.\n */\nexport class ScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'llm';\n readonly llmOverride?: SkillLlmOverride;\n image?: string;\n imageFile?: string;\n dir: string;\n private inner: SdkScriptSkill;\n\n constructor(\n name: string,\n description: string,\n capabilities: string[],\n priceSubunits: number,\n assetOrImage: Asset | string | undefined,\n imageOrImageFile: string | undefined,\n imageFileOrDir: string | undefined,\n dirOrPrompt: string,\n promptOrTools: string | SkillToolDef[],\n toolsOrRounds: SkillToolDef[] | number,\n rounds?: number,\n llmOverride?: SkillLlmOverride,\n ) {\n // Detect the new-style (asset passed as 5th arg) vs legacy-style (asset\n // omitted, image at 5th arg). An Asset has the shape { chain, token, decimals, symbol }.\n let asset: Asset;\n let image: string | undefined;\n let imageFile: string | undefined;\n let skillDir: string;\n let systemPrompt: string;\n let tools: SkillToolDef[];\n let maxToolRounds: number;\n\n if (assetOrImage !== undefined && typeof assetOrImage === 'object' && 'token' in assetOrImage) {\n // new-style: assetOrImage is Asset\n asset = assetOrImage;\n image = imageOrImageFile;\n imageFile = imageFileOrDir;\n skillDir = dirOrPrompt;\n systemPrompt = promptOrTools as string;\n tools = toolsOrRounds as SkillToolDef[];\n maxToolRounds = rounds as number;\n } else {\n // legacy-style: 5th arg is `image` (string or undefined), asset=NATIVE_SOL.\n asset = NATIVE_SOL;\n image = assetOrImage as string | undefined;\n imageFile = imageOrImageFile;\n skillDir = imageFileOrDir as string;\n systemPrompt = dirOrPrompt;\n tools = promptOrTools as SkillToolDef[];\n maxToolRounds = toolsOrRounds as number;\n }\n\n this.name = name;\n this.description = description;\n this.capabilities = capabilities;\n this.priceSubunits = priceSubunits;\n this.asset = asset;\n this.llmOverride = llmOverride;\n this.image = image;\n this.imageFile = imageFile;\n this.dir = skillDir;\n this.inner = new SdkScriptSkill({\n name,\n description,\n capabilities,\n priceSubunits: BigInt(Math.round(priceSubunits)),\n asset,\n skillDir,\n systemPrompt,\n tools,\n maxToolRounds,\n llmOverride,\n image,\n imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n","/**\n * CLI skill loader. Delegates SKILL.md parsing + validation to\n * `@elisym/sdk/skills` (one source of truth across plugin + CLI) and\n * constructs CLI's wrapper instances. CLI keeps its own Skill interface\n * (`priceSubunits: number` + `asset` + `mode`) so existing runtime.ts\n * call sites stay byte-for-byte compatible while supporting USDC and\n * non-LLM execution modes.\n */\nimport { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n DEFAULT_SCRIPT_TIMEOUT_MS,\n parseSkillMd,\n resolveInsidePath,\n validateSkillFrontmatter,\n type ParsedSkill,\n} from '@elisym/sdk/skills';\nimport { DynamicScriptSkill, StaticFileSkill, StaticScriptSkill } from './non-llm-skills.js';\nimport { ScriptSkill } from './script-skill.js';\nimport type { Skill } from './index.js';\n\nfunction buildCliSkill(\n parsed: ParsedSkill,\n entryPath: string,\n scriptEnv: NodeJS.ProcessEnv | undefined,\n): Skill {\n let skill: Skill;\n switch (parsed.mode) {\n case 'llm':\n skill = new ScriptSkill(\n parsed.name,\n parsed.description,\n parsed.capabilities,\n Number(parsed.priceSubunits),\n parsed.asset,\n parsed.image,\n parsed.imageFile,\n entryPath,\n parsed.systemPrompt,\n parsed.tools,\n parsed.maxToolRounds,\n parsed.llmOverride,\n );\n break;\n case 'static-file': {\n if (parsed.outputFile === undefined) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": internal error - outputFile missing for mode 'static-file'`,\n );\n }\n const outputFilePath = resolveInsidePath(entryPath, parsed.outputFile);\n if (!outputFilePath) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": \"output_file\" must stay inside the skill directory`,\n );\n }\n skill = new StaticFileSkill({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: Number(parsed.priceSubunits),\n asset: parsed.asset,\n outputFilePath,\n image: parsed.image,\n imageFile: parsed.imageFile,\n dir: entryPath,\n llmOverride: parsed.llmOverride,\n });\n break;\n }\n case 'static-script':\n case 'dynamic-script': {\n if (parsed.script === undefined) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": internal error - script missing for mode '${parsed.mode}'`,\n );\n }\n const scriptPath = resolveInsidePath(entryPath, parsed.script);\n if (!scriptPath) {\n throw new Error(`SKILL.md \"${parsed.name}\": \"script\" must stay inside the skill directory`);\n }\n const Ctor = parsed.mode === 'static-script' ? StaticScriptSkill : DynamicScriptSkill;\n skill = new Ctor({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: Number(parsed.priceSubunits),\n asset: parsed.asset,\n scriptPath,\n scriptArgs: parsed.scriptArgs,\n scriptTimeoutMs: parsed.scriptTimeoutMs ?? DEFAULT_SCRIPT_TIMEOUT_MS,\n scriptEnv,\n image: parsed.image,\n imageFile: parsed.imageFile,\n dir: entryPath,\n llmOverride: parsed.llmOverride,\n });\n break;\n }\n }\n if (parsed.rateLimit) {\n skill.rateLimit = parsed.rateLimit;\n }\n return skill;\n}\n\nexport interface LoadSkillsOptions {\n /**\n * Env propagated into script-mode skills (`static-script`, `dynamic-script`).\n * Typically `{ ...process.env, <PROVIDER_KEY>: <decrypted-secret>, ... }`\n * built from the agent's encrypted secrets, so scripts get the same\n * provider keys that LLM-mode skills already enjoy.\n */\n scriptEnv?: NodeJS.ProcessEnv;\n}\n\nexport function loadSkillsFromDir(skillsDir: string, options: LoadSkillsOptions = {}): Skill[] {\n const skills: Skill[] = [];\n\n let entries: string[];\n try {\n entries = readdirSync(skillsDir);\n } catch {\n return skills;\n }\n\n for (const entry of entries) {\n const entryPath = join(skillsDir, entry);\n try {\n if (!statSync(entryPath).isDirectory()) {\n continue;\n }\n } catch {\n continue;\n }\n\n const skillMdPath = join(entryPath, 'SKILL.md');\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const { frontmatter, systemPrompt } = parseSkillMd(content);\n const parsed = validateSkillFrontmatter(frontmatter, systemPrompt, {\n allowFreeSkills: true,\n });\n skills.push(buildCliSkill(parsed, entryPath, options.scriptEnv));\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.warn(` ! Skipping skill \"${entry}\": ${message}`);\n }\n }\n\n return skills;\n}\n","/**\n * NostrTransport - listens for targeted jobs on Nostr relays, delivers results.\n * Handles NIP-44 decryption, dedup, and retried delivery.\n */\nimport { BoundedSet, KIND_JOB_FEEDBACK, jobRequestKind } from '@elisym/sdk';\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport { verifyEvent, type Event, type Filter } from 'nostr-tools';\n\nexport interface IncomingJob {\n jobId: string;\n input: string;\n inputType: string;\n tags: string[];\n customerId: string;\n bid?: number;\n encrypted: boolean;\n rawEvent: Event;\n}\n\nexport type JobFeedbackStatus =\n | { type: 'payment-required'; amount: number; paymentRequest: string; chain: string }\n | { type: 'processing' }\n | { type: 'error'; message: string };\n\nfunction isEncrypted(event: Event): boolean {\n return event.tags.some((t) => t[0] === 'encrypted' && t[1] === 'nip44');\n}\n\nconst HEALTH_CHECK_IDLE_MS = 30 * 60 * 1000; // 30 minutes\n\nexport class NostrTransport {\n private sub: SubCloser | null = null;\n private seenIds = new BoundedSet<string>(10_000);\n private lastEventAt = Date.now();\n private onJob: ((job: IncomingJob) => void) | null = null;\n\n constructor(\n private client: ElisymClient,\n private identity: ElisymIdentity,\n private kindOffsets: number[],\n ) {}\n\n /** Start listening for targeted job requests. Decrypts NIP-44 content. */\n start(onJob: (job: IncomingJob) => void): void {\n this.onJob = onJob;\n // Reset idle clock: a fresh subscription hasn't been idle, even if we're\n // restarting after a pool reset where the last event is long in the past.\n this.lastEventAt = Date.now();\n const kinds = this.kindOffsets.map(jobRequestKind);\n\n this.sub = this.client.marketplace.subscribeToJobRequests(\n this.identity,\n kinds,\n (event: Event) => {\n this.lastEventAt = Date.now();\n\n // Dedup via BoundedSet\n if (this.seenIds.has(event.id)) {\n return;\n }\n this.seenIds.add(event.id);\n\n // Must have elisym tag\n const hasElisym = event.tags.some((t) => t[0] === 't' && t[1] === 'elisym');\n if (!hasElisym) {\n return;\n }\n\n // Extract tags\n const tags = event.tags.filter((t) => t[0] === 't').map((t) => t[1]!);\n const bidTag = event.tags.find((t) => t[0] === 'bid');\n const encrypted = isEncrypted(event);\n\n // SDK already decrypts NIP-44 content in subscribeToJobRequests\n const iTag = event.tags.find((t) => t[0] === 'i');\n let inputType = 'text';\n if (iTag?.[2]) {\n inputType = iTag[2];\n }\n const input = encrypted ? event.content : (iTag?.[1] ?? event.content);\n\n onJob({\n jobId: event.id,\n input,\n inputType,\n tags,\n customerId: event.pubkey,\n bid: bidTag?.[1] ? parseInt(bidTag[1], 10) : undefined,\n encrypted,\n rawEvent: event,\n });\n },\n );\n }\n\n /**\n * Wait for the customer's `payment-completed` feedback for a specific job\n * and return the on-chain Solana tx signature it carries.\n *\n * The customer publishes this event right after `confirmTransaction(... 'confirmed')`\n * succeeds (see packages/app/app/hooks/useBuyCapability.ts), so receiving it\n * lets the provider verify the payment with a single targeted\n * `getTransaction(sig, commitment: 'confirmed')` call instead of the\n * heavyweight `getSignaturesForAddress(reference)` index lookup. This is\n * dramatically more reliable on the public devnet RPC, which throttles and\n * lags the address index.\n *\n * Resolves with `null` if `signal` aborts or `timeoutMs` elapses before a\n * valid signature arrives. The timeout exists so a customer that disappears\n * after job submission does not hold a `p-limit` slot for the full payment\n * expiry window - without it this path waits forever on the relay.\n */\n waitForPaymentSignature(\n jobId: string,\n customerPubkey: string,\n signal: AbortSignal,\n timeoutMs?: number,\n ): Promise<string | null> {\n return new Promise((resolve) => {\n let settled = false;\n const filter: Filter = {\n kinds: [KIND_JOB_FEEDBACK],\n '#e': [jobId],\n authors: [customerPubkey],\n '#t': ['elisym'],\n since: Math.floor(Date.now() / 1000) - 5,\n };\n\n const finish = (sig: string | null) => {\n if (settled) {\n return;\n }\n settled = true;\n if (timer) {\n clearTimeout(timer);\n }\n signal.removeEventListener('abort', onAbort);\n sub.close();\n resolve(sig);\n };\n\n const sub = this.client.pool.subscribe(filter, (event: Event) => {\n if (settled) {\n return;\n }\n if (!verifyEvent(event)) {\n return;\n }\n const status = event.tags.find((t) => t[0] === 'status')?.[1];\n if (status !== 'payment-completed') {\n return;\n }\n const txTag = event.tags.find((t) => t[0] === 'tx');\n const sig = txTag?.[1];\n const chain = txTag?.[2];\n if (typeof sig !== 'string' || sig.length === 0) {\n return;\n }\n // Chain tag is optional for backwards compatibility, but if present it\n // must be 'solana' - we cannot verify a signature on another chain.\n if (chain !== undefined && chain !== 'solana') {\n return;\n }\n finish(sig);\n });\n\n const onAbort = () => finish(null);\n const timer =\n timeoutMs !== undefined && timeoutMs > 0 ? setTimeout(() => finish(null), timeoutMs) : null;\n\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n /** Send job feedback to customer. */\n async sendFeedback(job: IncomingJob, status: JobFeedbackStatus): Promise<void> {\n if (status.type === 'payment-required') {\n await this.client.marketplace.submitPaymentRequiredFeedback(\n this.identity,\n job.rawEvent,\n status.amount,\n status.paymentRequest,\n );\n } else if (status.type === 'processing') {\n await this.client.marketplace.submitProcessingFeedback(this.identity, job.rawEvent);\n } else if (status.type === 'error') {\n await this.client.marketplace.submitErrorFeedback(\n this.identity,\n job.rawEvent,\n status.message,\n );\n }\n }\n\n /** Deliver result to customer. Retries with exponential backoff via SDK. */\n async deliverResult(\n job: IncomingJob,\n content: string,\n amount?: number,\n retries = 3,\n ): Promise<string> {\n return this.client.marketplace.submitJobResultWithRetry(\n this.identity,\n job.rawEvent,\n content,\n amount,\n retries,\n );\n }\n\n /** Returns true if an event was received within the given idle window. */\n isHealthy(maxIdleMs = HEALTH_CHECK_IDLE_MS): boolean {\n return Date.now() - this.lastEventAt < maxIdleMs;\n }\n\n stop(): void {\n this.sub?.close();\n this.sub = null;\n }\n\n /**\n * Re-create the job subscription using the previously registered callback.\n * Call after `NostrPool.reset()` has torn down the underlying subscriptions.\n * `seenIds` is preserved across restarts (dedup survives reconnect);\n * `lastEventAt` is reset by `start()` so `isHealthy()` does not report\n * stale idleness immediately after a successful recovery.\n */\n restart(): void {\n this.stop();\n if (this.onJob) {\n this.start(this.onJob);\n }\n }\n}\n","/**\n * Watchdog - periodically verifies relay connectivity and subscription liveness,\n * rebuilds the Nostr pool and re-subscribes on failure.\n *\n * Works around a nostr-tools bug where a single WS error sets `skipReconnection=true`\n * and silently kills long-lived subscriptions for the rest of the process\n * (see `NostrPool.reset` in @elisym/sdk).\n *\n * Three independent triggers force a pool reset:\n * - `probe`: cheap `querySync` round-trip against relays.\n * - `self-ping`: full subscribeToPings -> sendPong round-trip via the agent's\n * own identity, catches the case where probe passes (fresh query works) but\n * the live subscription is already dead.\n * - `sleep-detect`: if the wall-clock gap between two consecutive ticks exceeds\n * `min(probeInterval, selfPingInterval) * SLEEP_DETECT_MULTIPLIER`, the host\n * was almost certainly suspended (macOS sleep, hibernation, container pause).\n * On suspend the WebSocket connections die from the relay side, but the next\n * probe may still pass via a freshly opened query - meanwhile the long-lived\n * ping subscription stays dead. Forcing a reset on the first post-suspend\n * tick avoids that window.\n */\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport type { Logger } from 'pino';\nimport {\n WATCHDOG_PROBE_INTERVAL_MS,\n WATCHDOG_PROBE_TIMEOUT_MS,\n WATCHDOG_SELF_PING_INTERVAL_MS,\n WATCHDOG_SELF_PING_TIMEOUT_MS,\n WATCHDOG_SLEEP_DETECT_MULTIPLIER,\n} from './helpers.js';\nimport type { NostrTransport } from './transport/nostr.js';\n\nexport interface WatchdogDeps {\n client: ElisymClient;\n identity: ElisymIdentity;\n transport: NostrTransport;\n onPing: (senderPubkey: string, nonce: string) => void;\n log: (message: string) => void;\n /** Optional structured logger for pool-reset and probe events. */\n logger?: Logger;\n probeIntervalMs?: number;\n probeTimeoutMs?: number;\n selfPingIntervalMs?: number;\n selfPingTimeoutMs?: number;\n /**\n * Optional `Date.now`-style provider. Tests inject a controlled clock to\n * simulate macOS sleep without firing intermediate `setInterval` callbacks\n * (see watchdog.test.ts). Production should leave this unset.\n */\n now?: () => number;\n}\n\nexport interface Watchdog {\n stop(): void;\n}\n\nexport function startWatchdog(deps: WatchdogDeps): Watchdog {\n const {\n client,\n identity,\n transport,\n onPing,\n log,\n logger,\n probeIntervalMs = WATCHDOG_PROBE_INTERVAL_MS,\n probeTimeoutMs = WATCHDOG_PROBE_TIMEOUT_MS,\n selfPingIntervalMs = WATCHDOG_SELF_PING_INTERVAL_MS,\n selfPingTimeoutMs = WATCHDOG_SELF_PING_TIMEOUT_MS,\n now = Date.now,\n } = deps;\n\n let pingSub: SubCloser = client.ping.subscribeToPings(identity, onPing);\n let stopped = false;\n // Separate flags: a slow probe must not suppress the self-ping that follows,\n // since they exercise different layers (short query vs. live subscription).\n let probeBusy = false;\n let selfPingBusy = false;\n let lastTickAt = now();\n\n const sleepDetectThresholdMs =\n Math.min(probeIntervalMs, selfPingIntervalMs) * WATCHDOG_SLEEP_DETECT_MULTIPLIER;\n\n // Must stay synchronous. Each timer callback checks `stopped` AFTER awaiting\n // probe/ping and BEFORE calling this function. As long as this function is\n // synchronous, it runs atomically - stop() cannot interleave between tearing\n // down old subscriptions and creating new ones. Any `await` inside would open\n // a window where stop() sets `stopped=true`, then after the await we resurrect\n // subscriptions and leak them for the rest of the process lifetime.\n const resetPoolAndResubscribe = (): void => {\n transport.stop();\n // pool.reset() also closes pingSub as part of its activeSubscriptions\n // teardown, so an explicit pingSub.close() here would be redundant.\n client.pool.reset();\n pingSub = client.ping.subscribeToPings(identity, onPing);\n transport.restart();\n };\n\n /**\n * Returns `true` if a wall-clock gap larger than the configured threshold\n * was observed since the last tick - in which case it has already forced a\n * pool reset and the caller should skip its normal health check. Each tick\n * (probe and self-ping) updates the shared `lastTickAt`, so consecutive\n * normal ticks see a gap close to one interval.\n */\n const detectAndHandleSleep = (): boolean => {\n const tickedAt = now();\n const delta = tickedAt - lastTickAt;\n lastTickAt = tickedAt;\n if (delta <= sleepDetectThresholdMs) {\n return false;\n }\n log(\n `[watchdog] tick gap ${delta}ms exceeds ${sleepDetectThresholdMs}ms threshold, ` +\n `forcing pool reset (host suspend / sleep detected)`,\n );\n logger?.info({ event: 'pool_reset', reason: 'sleep_detected', gapMs: delta }, 'pool reset');\n resetPoolAndResubscribe();\n return true;\n };\n\n const probeTimer = setInterval(async () => {\n if (stopped) {\n return;\n }\n if (detectAndHandleSleep()) {\n return;\n }\n if (probeBusy) {\n return;\n }\n probeBusy = true;\n try {\n const ok = await client.pool.probe(probeTimeoutMs);\n if (stopped || ok) {\n return;\n }\n log('[watchdog] relay probe failed, resetting pool and re-subscribing');\n logger?.info({ event: 'pool_reset', reason: 'probe_failed' }, 'pool reset');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] probe/reset error: ${errorMessage}`);\n logger?.warn({ event: 'probe_error', error: errorMessage }, 'watchdog probe/reset error');\n } finally {\n probeBusy = false;\n }\n }, probeIntervalMs);\n\n // CRITICAL: PingService caches \"online\" results for PING_CACHE_TTL_MS (30s in SDK).\n // `selfPingIntervalMs` MUST stay greater than that cache TTL, otherwise pingAgent\n // will keep returning cached `online: true` and the watchdog will never detect a\n // dead subscription. If PING_CACHE_TTL_MS grows in the SDK, bump this interval in\n // lockstep (see helpers.ts: WATCHDOG_SELF_PING_INTERVAL_MS).\n const selfPingTimer = setInterval(async () => {\n if (stopped) {\n return;\n }\n if (detectAndHandleSleep()) {\n return;\n }\n if (selfPingBusy) {\n return;\n }\n selfPingBusy = true;\n try {\n const result = await client.ping.pingAgent(identity.publicKey, selfPingTimeoutMs);\n if (stopped || result.online) {\n return;\n }\n log('[watchdog] self-ping failed, resetting pool and re-subscribing');\n logger?.info({ event: 'pool_reset', reason: 'self_ping_failed' }, 'pool reset');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] self-ping/reset error: ${errorMessage}`);\n logger?.warn(\n { event: 'self_ping_error', error: errorMessage },\n 'watchdog self-ping/reset error',\n );\n } finally {\n selfPingBusy = false;\n }\n }, selfPingIntervalMs);\n\n return {\n stop(): void {\n if (stopped) {\n return;\n }\n stopped = true;\n clearInterval(probeTimer);\n clearInterval(selfPingTimer);\n pingSub.close();\n },\n };\n}\n","/**\n * Wallet command - show SOL and USDC balance.\n */\nimport { USDC_SOLANA_DEVNET, formatAssetAmount, formatSol } from '@elisym/sdk';\nimport { loadAgent, listAgents } from '@elisym/sdk/agent-store';\nimport { address, createSolanaRpc } from '@solana/kit';\nimport { fetchUsdcBalance, getRpcUrl } from '../helpers.js';\n\nexport async function cmdWallet(name: string | undefined): Promise<void> {\n const cwd = process.cwd();\n\n if (!name) {\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.error('No agents found.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Select agent:',\n choices: agents.map((agent) => ({\n name: `${agent.name} (${agent.source})`,\n value: agent.name,\n })),\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const loaded = await loadAgent(name!, cwd, passphrase);\n\n const solPayment = loaded.yaml.payments.find((entry) => entry.chain === 'solana');\n if (!solPayment?.address) {\n console.error('Solana address not configured for this agent.');\n process.exit(1);\n }\n\n const rpcUrl = getRpcUrl(solPayment.network);\n const rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solPayment.address);\n const { value: balance } = await rpc.getBalance(walletAddress).send();\n const usdcBalance = await fetchUsdcBalance(rpc, walletAddress);\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Network: ${solPayment.network}`);\n console.log(` Address: ${solPayment.address}`);\n console.log(` SOL balance: ${formatSol(Number(balance))} (${balance} lamports)`);\n console.log(` USDC balance: ${formatAssetAmount(USDC_SOLANA_DEVNET, usdcBalance)}\\n`);\n}\n","/**\n * single source of truth for the package version. `index.ts` surfaces this string\n * via `commander`'s `--version`, so we read it from `package.json` at module load\n * instead of hardcoding a literal that can drift apart from the published version.\n *\n * Mirrors the same approach used in `@elisym/mcp` (`packages/mcp/src/utils.ts`).\n */\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction readPackageVersion(): string {\n try {\n // dist/index.js -> ../package.json (npm always ships package.json at the package root)\n const here = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf-8')) as {\n version: string;\n };\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nexport const PACKAGE_VERSION: string = readPackageVersion();\n"]}