abtars 0.3.4-alpha.0 → 0.3.4-alpha.2
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/bundle/{_registry.generated-7DRCE4V6.js → _registry.generated-RC6PEH6Z.js} +16 -15
- package/bundle/{_registry.generated-7DRCE4V6.js.map → _registry.generated-RC6PEH6Z.js.map} +1 -1
- package/bundle/abtars-browser.js +6 -5
- package/bundle/abtars-browser.js.map +1 -1
- package/bundle/abtars-cli.js +73 -46
- package/bundle/abtars-cli.js.map +3 -3
- package/bundle/abtars-restart.js +7 -7
- package/bundle/abtars-rss.js +2 -1
- package/bundle/abtars-rss.js.map +2 -2
- package/bundle/abtars-task.js +6 -5
- package/bundle/abtars-task.js.map +1 -1
- package/bundle/abtars-todo.js +2 -1
- package/bundle/abtars-todo.js.map +1 -1
- package/bundle/abtars.js +307 -212
- package/bundle/abtars.js.map +4 -4
- package/bundle/{acp-raw-client-AZJCEB6S.js → acp-raw-client-E6FM45NC.js} +4 -3
- package/bundle/{acp-raw-client-AZJCEB6S.js.map → acp-raw-client-E6FM45NC.js.map} +1 -1
- package/bundle/{action-gate-QYJL57IX.js → action-gate-G2V47NHW.js} +4 -3
- package/bundle/{action-gate-QYJL57IX.js.map → action-gate-G2V47NHW.js.map} +1 -1
- package/bundle/{agent-api-adapter-PYMNQXHE.js → agent-api-adapter-PTJYZKQK.js} +5 -4
- package/bundle/{agent-api-adapter-PYMNQXHE.js.map → agent-api-adapter-PTJYZKQK.js.map} +1 -1
- package/bundle/{agent-api-rate-limit-4GEZ4YN5.js → agent-api-rate-limit-WCFXJMGY.js} +6 -5
- package/bundle/{agent-registry-563P4EUJ.js → agent-registry-GU7ABOK5.js} +9 -8
- package/bundle/bootstrap-POWWTU6I.js +63 -0
- package/bundle/bootstrap-POWWTU6I.js.map +7 -0
- package/bundle/{bridge-lock-transport-LXCF2IVN.js → bridge-lock-transport-4ZH7QTJP.js} +6 -5
- package/bundle/{browser-2VZOGOGX.js → browser-EJNS35NT.js} +8 -7
- package/bundle/{budget-PPA7WY3D.js → budget-45QOBDWA.js} +5 -4
- package/bundle/{budget-PPA7WY3D.js.map → budget-45QOBDWA.js.map} +1 -1
- package/bundle/{capability-WXEA2WFK.js → capability-JFWX3IQF.js} +7 -6
- package/bundle/{chunk-CB6S3ZRF.js → chunk-2FAZIA37.js} +3 -3
- package/bundle/{chunk-VJATH7AN.js → chunk-2KC5G3EA.js} +9 -8
- package/bundle/chunk-2KC5G3EA.js.map +7 -0
- package/bundle/{chunk-OY2HAK33.js → chunk-36ZEYDKZ.js} +1 -1
- package/bundle/chunk-36ZEYDKZ.js.map +7 -0
- package/bundle/{chunk-2FZJDMAF.js → chunk-3CACHBDI.js} +10 -10
- package/bundle/{chunk-O4GKI3Q3.js → chunk-4S554KLW.js} +4 -4
- package/bundle/{chunk-3QW2K53E.js → chunk-5GCLBUBS.js} +11 -19
- package/bundle/chunk-5GCLBUBS.js.map +7 -0
- package/bundle/{chunk-RJX45XIC.js → chunk-5HDSQFT6.js} +9 -4
- package/bundle/chunk-5HDSQFT6.js.map +7 -0
- package/bundle/{chunk-EDZGF6BC.js → chunk-5NY2YULC.js} +11 -4
- package/bundle/chunk-5NY2YULC.js.map +7 -0
- package/bundle/{chunk-LE23VPN3.js → chunk-63A7ZRIH.js} +4 -4
- package/bundle/{chunk-LE23VPN3.js.map → chunk-63A7ZRIH.js.map} +1 -1
- package/bundle/{chunk-SSCGWDIC.js → chunk-65VCEC32.js} +2 -2
- package/bundle/{chunk-V2QIAXWZ.js → chunk-7BSQ5UQO.js} +3 -3
- package/bundle/{chunk-E7MV7WFT.js → chunk-7Z3HBPRY.js} +6 -6
- package/bundle/{chunk-TY26WMQY.js → chunk-AFREM7FX.js} +2 -2
- package/bundle/{chunk-GCFIK6OB.js → chunk-AO32N2VB.js} +92 -20
- package/bundle/chunk-AO32N2VB.js.map +7 -0
- package/bundle/{chunk-N5VROZ7A.js → chunk-B6ZN6COK.js} +5 -5
- package/bundle/{chunk-M6Q3IQ4H.js → chunk-BFDBGESM.js} +259 -122
- package/bundle/chunk-BFDBGESM.js.map +7 -0
- package/bundle/{chunk-YEOZN5IE.js → chunk-DYBW4XXL.js} +2 -2
- package/bundle/{chunk-56D3Y44D.js → chunk-EFJVUJBE.js} +10 -10
- package/bundle/{chunk-S6HEHCCG.js → chunk-EQSG2CRM.js} +83 -46
- package/bundle/chunk-EQSG2CRM.js.map +7 -0
- package/bundle/{chunk-FIAVVKGN.js → chunk-EUZDKV3C.js} +3 -3
- package/bundle/{chunk-2LKQV2ND.js → chunk-FRKW6LWB.js} +3 -3
- package/bundle/{chunk-H2K23MOF.js → chunk-GALQBVKO.js} +21 -5
- package/bundle/chunk-GALQBVKO.js.map +7 -0
- package/bundle/{chunk-DNDYD5SL.js → chunk-GP4XUKI5.js} +3 -3
- package/bundle/{chunk-SXNY6HC4.js → chunk-GPZNXY2U.js} +6 -6
- package/bundle/chunk-GPZNXY2U.js.map +7 -0
- package/bundle/{chunk-W726UGI6.js → chunk-GRVWZO4C.js} +3 -3
- package/bundle/{chunk-IXKQ4JMX.js → chunk-GVM5YU5I.js} +33 -17
- package/bundle/chunk-GVM5YU5I.js.map +7 -0
- package/bundle/{chunk-OOKNHOCB.js → chunk-GWILHZPT.js} +2 -2
- package/bundle/{chunk-3LQOJVTB.js → chunk-HFOCNYEO.js} +1842 -1220
- package/bundle/{chunk-3LQOJVTB.js.map → chunk-HFOCNYEO.js.map} +4 -4
- package/bundle/{chunk-NP72ZB7P.js → chunk-HMKVL7AX.js} +53 -47
- package/bundle/chunk-HMKVL7AX.js.map +7 -0
- package/bundle/{chunk-BNBC4T45.js → chunk-HT2BPTZY.js} +3 -3
- package/bundle/{chunk-BU7LTI2W.js → chunk-HZDLFLRP.js} +6 -7
- package/bundle/chunk-HZDLFLRP.js.map +7 -0
- package/bundle/{chunk-FVUL44T4.js → chunk-IJT4KWXT.js} +2 -2
- package/bundle/{chunk-IK4R3RBZ.js → chunk-JNIHEDKF.js} +3 -3
- package/bundle/{chunk-J5NOL4DB.js → chunk-JQDJPUHM.js} +16 -6
- package/bundle/chunk-JQDJPUHM.js.map +7 -0
- package/bundle/{chunk-SESM4GBM.js → chunk-KTYGKPYM.js} +52 -25
- package/bundle/chunk-KTYGKPYM.js.map +7 -0
- package/bundle/chunk-LME23AA2.js +37 -0
- package/bundle/chunk-LME23AA2.js.map +7 -0
- package/bundle/{chunk-4PIVWXUJ.js → chunk-LUNA6PM5.js} +2 -2
- package/bundle/{chunk-37EX63K4.js → chunk-LUW62WGO.js} +6998 -3621
- package/bundle/chunk-LUW62WGO.js.map +7 -0
- package/bundle/{chunk-MV5KOWOR.js → chunk-NDCRWEEJ.js} +7 -7
- package/bundle/{chunk-7WHXTCVD.js → chunk-NRUSRJXR.js} +8 -3
- package/bundle/chunk-NRUSRJXR.js.map +7 -0
- package/bundle/{chunk-C3EYYJN3.js → chunk-O7KQG6ME.js} +17 -5
- package/bundle/chunk-O7KQG6ME.js.map +7 -0
- package/bundle/{chunk-ZOCEBV62.js → chunk-OKAQICWY.js} +3 -3
- package/bundle/{chunk-TCI6FZTP.js → chunk-OLAURO5G.js} +9 -9
- package/bundle/{chunk-YME7NRGP.js → chunk-OXTSWQCX.js} +2 -2
- package/bundle/{chunk-HDOFJVFS.js → chunk-PEDX56EL.js} +3 -3
- package/bundle/{chunk-7RAGSHSH.js → chunk-PROPYS3P.js} +12 -10
- package/bundle/chunk-PROPYS3P.js.map +7 -0
- package/bundle/{chunk-ASYX43OU.js → chunk-Q32H6VPU.js} +26 -26
- package/bundle/{chunk-P5O6QZDC.js → chunk-QROWBWLL.js} +10 -6
- package/bundle/chunk-QROWBWLL.js.map +7 -0
- package/bundle/{chunk-S7ZIGIR5.js → chunk-R76K6L6H.js} +27 -27
- package/bundle/{chunk-S7ZIGIR5.js.map → chunk-R76K6L6H.js.map} +1 -1
- package/bundle/{chunk-MQJG7OJX.js → chunk-RIHQ37U5.js} +38 -36
- package/bundle/chunk-RIHQ37U5.js.map +7 -0
- package/bundle/{chunk-IQKADER4.js → chunk-RWRRGE4U.js} +2 -2
- package/bundle/{chunk-72T2Q7IG.js → chunk-S5GD5EJ5.js} +271 -282
- package/bundle/chunk-S5GD5EJ5.js.map +7 -0
- package/bundle/{chunk-ULO2PX3T.js → chunk-TEFZ4JA4.js} +3 -3
- package/bundle/{chunk-2RGR3LSV.js → chunk-TMUYFERL.js} +2 -2
- package/bundle/{chunk-KBPVJGD7.js → chunk-URQPDCK5.js} +3 -3
- package/bundle/chunk-UUIHL65U.js +77 -0
- package/bundle/chunk-UUIHL65U.js.map +7 -0
- package/bundle/{chunk-FJF42RZY.js → chunk-VUIX5AGB.js} +3 -3
- package/bundle/{chunk-5V4VHKEA.js → chunk-WBTJ2E62.js} +5 -4
- package/bundle/chunk-WBTJ2E62.js.map +7 -0
- package/bundle/{chunk-ZY6DH2S4.js → chunk-WTIGZO3N.js} +80 -70
- package/bundle/chunk-WTIGZO3N.js.map +7 -0
- package/bundle/{chunk-4HNCOQSK.js → chunk-WYHGNI56.js} +7 -7
- package/bundle/{chunk-24V4A6RP.js → chunk-XX6BGTPO.js} +4 -4
- package/bundle/{chunk-T7TAWGBX.js → chunk-Y76VUJSF.js} +2 -2
- package/bundle/{chunk-TVSPVZTX.js → chunk-YDY6QVWJ.js} +3 -3
- package/bundle/{chunk-V6CV3QPH.js → chunk-YRSMGJFP.js} +2 -2
- package/bundle/{chunk-WP7FZHMI.js → chunk-YSKCQH6E.js} +2 -2
- package/bundle/{chunk-NGZVJ52F.js → chunk-ZKJOFASV.js} +7 -7
- package/bundle/{chunk-WGWM4IZM.js → chunk-ZT5ZBGWS.js} +4 -4
- package/bundle/{chunk-WGWM4IZM.js.map → chunk-ZT5ZBGWS.js.map} +1 -1
- package/bundle/{chunk-43DKPXTP.js → chunk-ZV4IWKDJ.js} +4 -4
- package/bundle/{commands-XXFU2ZF7.js → commands-EWA4HNCM.js} +20 -20
- package/bundle/{config-EWDZ234X.js → config-M3P5IOAI.js} +8 -7
- package/bundle/{config-show-6J33O4TE.js → config-show-3DHPP26D.js} +5 -5
- package/bundle/{context-OCS7HLJP.js → context-5P7IYYU2.js} +5 -2
- package/bundle/{context-OCS7HLJP.js.map → context-5P7IYYU2.js.map} +1 -1
- package/bundle/{daemon-LTDAXNA2.js → daemon-TB23FFWY.js} +7 -7
- package/bundle/{delegation-tools-YDTWQMZD.js → delegation-tools-P2SCNL23.js} +14 -11
- package/bundle/{registry-client-VN2MM2HI.js → deploy-YYUCGGP3.js} +10 -6
- package/bundle/{deploy-lib-import-RGZJ3CGC.js → deploy-lib-import-T3UP4G6G.js} +5 -3
- package/bundle/{deps-PHSLIA77.js → deps-WVK553KF.js} +21 -19
- package/bundle/deps-WVK553KF.js.map +7 -0
- package/bundle/{direct-api-transport-OAKYQBJR.js → direct-api-transport-WQ6HA5OX.js} +30 -28
- package/bundle/direct-api-transport-WQ6HA5OX.js.map +7 -0
- package/bundle/{discord-adapter-WUNYPTDE.js → discord-adapter-4TTETYDI.js} +26 -26
- package/bundle/{dist-7HEHHQI2.js → dist-KMK7TZGN.js} +376 -348
- package/bundle/dist-KMK7TZGN.js.map +7 -0
- package/bundle/{dns-wakeup-F55ALHXJ.js → dns-wakeup-IDOJIXBX.js} +4 -3
- package/bundle/{dns-wakeup-F55ALHXJ.js.map → dns-wakeup-IDOJIXBX.js.map} +1 -1
- package/bundle/{doctor-probes-3SLIUGKS.js → doctor-probes-VDWFJKUB.js} +4 -3
- package/bundle/{env-schema-MSDP2YBO.js → env-schema-4JXQUOH4.js} +5 -4
- package/bundle/{gossip-CS3G3447.js → gossip-3C3BSNPN.js} +7 -6
- package/bundle/{guardrails-24XK2COI.js → guardrails-DL7ZSWVN.js} +6 -5
- package/bundle/{health-check-FRUNRVNQ.js → health-check-YKWFD2LZ.js} +5 -6
- package/bundle/{health-check-FRUNRVNQ.js.map → health-check-YKWFD2LZ.js.map} +2 -2
- package/bundle/{heartbeat-system-G4IFQXT6.js → heartbeat-system-TDDIOVTC.js} +7 -6
- package/bundle/{heartbeat-tier3-3ZO3EVXP.js → heartbeat-tier3-55T2HUNE.js} +45 -44
- package/bundle/heartbeat-tier3-55T2HUNE.js.map +7 -0
- package/bundle/{hook-system-X6INNJGV.js → hook-system-M3POLUIB.js} +5 -4
- package/bundle/{hotskills-6FQYTJIO.js → hotskills-FWX4QI7V.js} +7 -6
- package/bundle/{install-ZAHTZ5M5.js → install-4MXBYIUG.js} +23 -20
- package/bundle/install-4MXBYIUG.js.map +7 -0
- package/bundle/{install-manifest-QX7KVDCA.js → install-manifest-5PPWMD2W.js} +4 -3
- package/bundle/{install-manifest-QX7KVDCA.js.map → install-manifest-5PPWMD2W.js.map} +1 -1
- package/bundle/{irc-adapter-IEJQKKJF.js → irc-adapter-PTTZD32W.js} +5 -4
- package/bundle/{irc-adapter-IEJQKKJF.js.map → irc-adapter-PTTZD32W.js.map} +1 -1
- package/bundle/{irc-config-TTWNYFLH.js → irc-config-CP7ZMUOX.js} +6 -5
- package/bundle/{irc-config-TTWNYFLH.js.map → irc-config-CP7ZMUOX.js.map} +1 -1
- package/bundle/{kanban-board-J6RO3ZU7.js → kanban-board-M326B2XJ.js} +7 -5
- package/bundle/{kanban-channel-5EIXBFSA.js → kanban-channel-IJ52OMNA.js} +8 -6
- package/bundle/{lazy-require-V6EFUATC.js → lazy-require-KCRVT4SI.js} +11 -6
- package/bundle/{logger-Y3VILPRH.js → logger-OWCSNYCA.js} +4 -3
- package/bundle/{logs-YS3GDURO.js → logs-FXS4SCEM.js} +5 -5
- package/bundle/{main-chat-YLZDNQPO.js → main-chat-ZNUZCTNS.js} +6 -5
- package/bundle/{master-user-Z4M7KCJE.js → master-user-HSKM4ZFN.js} +7 -6
- package/bundle/{media-utils-P6RZ2K3U.js → media-utils-3ZYOD7SK.js} +44 -43
- package/bundle/{media-utils-P6RZ2K3U.js.map → media-utils-3ZYOD7SK.js.map} +2 -2
- package/bundle/{message-pipeline-MHEBDJLH.js → message-pipeline-KSONH4MT.js} +20 -20
- package/bundle/meta.json +9327 -8582
- package/bundle/{migrate-layout-RJJQLVGR.js → migrate-layout-IJIEJY3A.js} +8 -4
- package/bundle/migrate-layout-IJIEJY3A.js.map +7 -0
- package/bundle/{nerve-VZNMFDGY.js → nerve-IGSXBKZZ.js} +5 -4
- package/bundle/{notification-VV2OR6NW.js → notification-BFSIEECG.js} +8 -7
- package/bundle/{openrouter-credits-LXC7P4G6.js → openrouter-credits-NTVZDRYM.js} +5 -4
- package/bundle/{openrouter-credits-LXC7P4G6.js.map → openrouter-credits-NTVZDRYM.js.map} +1 -1
- package/bundle/{orc-KC4USP55.js → orc-EIGVTHAV.js} +4 -4
- package/bundle/{orc-tools-CHRSXSAS.js → orc-tools-A3G7WCSJ.js} +5 -4
- package/bundle/{paths-EDK6KWHG.js → paths-3ZVW3NFL.js} +6 -2
- package/bundle/{paths-RZF6WDMG.js → paths-X4LRYUI6.js} +3 -2
- package/bundle/{peer-auth-SRONOLNG.js → peer-auth-QC4EF2PM.js} +9 -8
- package/bundle/{peer-client-VOF77T6C.js → peer-client-RGEU5HOK.js} +9 -8
- package/bundle/{peer-client-VOF77T6C.js.map → peer-client-RGEU5HOK.js.map} +1 -1
- package/bundle/{peer-config-FRWLEYQ5.js → peer-config-TN55LFDC.js} +6 -5
- package/bundle/{peer-jwt-XY3XRIA2.js → peer-jwt-NCCPXJRX.js} +6 -5
- package/bundle/{peer-transport-UBBXTDRP.js → peer-transport-I6JPLFZ2.js} +8 -7
- package/bundle/{phase-transport-4NQHZX75.js → phase-transport-2BRWACDF.js} +18 -16
- package/bundle/public/css/dashboard.css +542 -0
- package/bundle/public/index.html +180 -0
- package/bundle/public/js/app.js +437 -0
- package/bundle/public/memory-universe.js +384 -0
- package/bundle/{reconcile-2EUXJ6W5.js → reconcile-CTFCLQRN.js} +5 -4
- package/bundle/{reconciler-FFQGV4DO.js → reconciler-FHESO6OC.js} +14 -11
- package/bundle/{reconciler-FFQGV4DO.js.map → reconciler-FHESO6OC.js.map} +1 -1
- package/bundle/{restore-NFDE2RG6.js → restore-IFHPI7I7.js} +13 -9
- package/bundle/{restore-NFDE2RG6.js.map → restore-IFHPI7I7.js.map} +3 -3
- package/bundle/{rollback-MVZ53XS4.js → rollback-ANRI3T5Z.js} +5 -5
- package/bundle/{chunk-SKY6656M.js → sandbox-runtime-QROWHDCS.js} +11 -28
- package/bundle/{chunk-SKY6656M.js.map → sandbox-runtime-QROWHDCS.js.map} +1 -1
- package/bundle/{self-healer-utils-KD6LV63S.js → self-healer-utils-IFAYOQO2.js} +5 -4
- package/bundle/{self-healer-utils-KD6LV63S.js.map → self-healer-utils-IFAYOQO2.js.map} +1 -1
- package/bundle/{sha-tracker-2DB4R2TW.js → sha-tracker-ZWBP6CIJ.js} +5 -4
- package/bundle/{skill-session-BPDVA6ZG.js → skill-session-AXBDQSLQ.js} +5 -4
- package/bundle/{skill-session-BPDVA6ZG.js.map → skill-session-AXBDQSLQ.js.map} +1 -1
- package/bundle/{skill-stats-TPD2NROA.js → skill-stats-JORH5DGM.js} +6 -5
- package/bundle/{skill-watcher-D7QYYYON.js → skill-watcher-E4MGLKLS.js} +6 -5
- package/bundle/{sleep-GH6DLBJJ.js → sleep-SRCSXY6T.js} +10 -9
- package/bundle/{soul-bundle-GXLMDBCC.js → soul-bundle-VWAVHCZ6.js} +10 -9
- package/bundle/{spin-4DBYHS3E.js → spin-IMW2MZOH.js} +13 -10
- package/bundle/{spin-notifications-IKYJPER5.js → spin-notifications-SE2HVZI7.js} +7 -5
- package/bundle/{spin-notifications-IKYJPER5.js.map → spin-notifications-SE2HVZI7.js.map} +1 -1
- package/bundle/{spin-types-PLJH3SIK.js → spin-types-BLPYAETA.js} +5 -4
- package/bundle/{src-SUFZ27S5.js → src-6BTCMOD3.js} +4 -4
- package/bundle/{sse-parser-anthropic-U7ILHOY5.js → sse-parser-anthropic-A6R4Z2TB.js} +5 -4
- package/bundle/{sse-parser-anthropic-U7ILHOY5.js.map → sse-parser-anthropic-A6R4Z2TB.js.map} +1 -1
- package/bundle/{sse-parser-responses-OI73R3AH.js → sse-parser-responses-HSZY3QGJ.js} +5 -4
- package/bundle/{sse-parser-responses-OI73R3AH.js.map → sse-parser-responses-HSZY3QGJ.js.map} +1 -1
- package/bundle/{ssrf-guard-6GP4QYVA.js → ssrf-guard-O6SHIK6Q.js} +5 -4
- package/bundle/{ssrf-guard-6GP4QYVA.js.map → ssrf-guard-O6SHIK6Q.js.map} +1 -1
- package/bundle/{start-JT2BPMSW.js → start-7QZIWO3S.js} +5 -5
- package/bundle/start-7QZIWO3S.js.map +7 -0
- package/bundle/{stt-KD3AABKG.js → stt-LGVPXMVR.js} +6 -5
- package/bundle/{subagent-runtime-LVECAUPV.js → subagent-runtime-3UJB4HUB.js} +6 -5
- package/bundle/system-status-ATGKRRQI.js +349 -0
- package/bundle/system-status-ATGKRRQI.js.map +7 -0
- package/bundle/{task-store-2XRDM3AW.js → task-store-W5BFIAIH.js} +6 -5
- package/bundle/{telegram-adapter-UJ3RYYV6.js → telegram-adapter-7G773NII.js} +35 -35
- package/bundle/{tool-registry-YU6WBXPA.js → tool-registry-J6TE3I2T.js} +25 -23
- package/bundle/{tool-sandbox-RNNPDR5M.js → tool-sandbox-4UC6GAKA.js} +6 -5
- package/bundle/{transport-config-OK3MZPJK.js → transport-config-KBF5W2DP.js} +9 -8
- package/bundle/{update-ENNPRW7Y.js → update-424ZZQQ6.js} +6 -6
- package/bundle/{update-check-SJB6GV3A.js → update-check-7UWKBJOP.js} +3 -2
- package/bundle/{update-check-SJB6GV3A.js.map → update-check-7UWKBJOP.js.map} +1 -1
- package/bundle/{usage-tracker-HRSGC7QC.js → usage-tracker-NXD364VX.js} +2 -2
- package/bundle/{user-registry-6PUJJ5J2.js → user-registry-35BW4XKM.js} +6 -5
- package/bundle/{wrapper-WLHLG4MI.js → wrapper-W66YICNZ.js} +3 -3
- package/bundle/{ws-peer-client-WHW3RJTD.js → ws-peer-client-AIXCXF7V.js} +15 -14
- package/bundle/{ws-peer-client-WHW3RJTD.js.map → ws-peer-client-AIXCXF7V.js.map} +2 -2
- package/package.json +4 -8
- package/scripts/emergency-deploy.sh +11 -8
- package/scripts/emergency-update.sh +156 -23
- package/templates/config/.env +1 -1
- package/templates/config/models.json +13 -0
- package/bundle/chunk-37EX63K4.js.map +0 -7
- package/bundle/chunk-3QW2K53E.js.map +0 -7
- package/bundle/chunk-5V4VHKEA.js.map +0 -7
- package/bundle/chunk-72T2Q7IG.js.map +0 -7
- package/bundle/chunk-7RAGSHSH.js.map +0 -7
- package/bundle/chunk-7WHXTCVD.js.map +0 -7
- package/bundle/chunk-BU7LTI2W.js.map +0 -7
- package/bundle/chunk-C3EYYJN3.js.map +0 -7
- package/bundle/chunk-CAOIIVFP.js +0 -110
- package/bundle/chunk-CAOIIVFP.js.map +0 -7
- package/bundle/chunk-EDZGF6BC.js.map +0 -7
- package/bundle/chunk-GCFIK6OB.js.map +0 -7
- package/bundle/chunk-H2K23MOF.js.map +0 -7
- package/bundle/chunk-HAZHNBBY.js +0 -156
- package/bundle/chunk-HAZHNBBY.js.map +0 -7
- package/bundle/chunk-IXKQ4JMX.js.map +0 -7
- package/bundle/chunk-J5NOL4DB.js.map +0 -7
- package/bundle/chunk-JAJ3DUQ2.js +0 -30
- package/bundle/chunk-JAJ3DUQ2.js.map +0 -7
- package/bundle/chunk-KMFR5AVY.js +0 -45
- package/bundle/chunk-KMFR5AVY.js.map +0 -7
- package/bundle/chunk-M6Q3IQ4H.js.map +0 -7
- package/bundle/chunk-MQJG7OJX.js.map +0 -7
- package/bundle/chunk-NP72ZB7P.js.map +0 -7
- package/bundle/chunk-OY2HAK33.js.map +0 -7
- package/bundle/chunk-P5O6QZDC.js.map +0 -7
- package/bundle/chunk-RJX45XIC.js.map +0 -7
- package/bundle/chunk-S6HEHCCG.js.map +0 -7
- package/bundle/chunk-SESM4GBM.js.map +0 -7
- package/bundle/chunk-SXNY6HC4.js.map +0 -7
- package/bundle/chunk-VJATH7AN.js.map +0 -7
- package/bundle/chunk-ZY6DH2S4.js.map +0 -7
- package/bundle/deps-PHSLIA77.js.map +0 -7
- package/bundle/direct-api-transport-OAKYQBJR.js.map +0 -7
- package/bundle/dist-7HEHHQI2.js.map +0 -7
- package/bundle/heartbeat-tier3-3ZO3EVXP.js.map +0 -7
- package/bundle/install-ZAHTZ5M5.js.map +0 -7
- package/bundle/migrate-layout-RJJQLVGR.js.map +0 -7
- package/bundle/phase-config-V4XETN5F.js +0 -18
- package/bundle/sandbox-runtime-WHACQLLN.js +0 -22
- package/bundle/start-JT2BPMSW.js.map +0 -7
- package/bundle/system-status-XXJWTVJN.js +0 -243
- package/bundle/system-status-XXJWTVJN.js.map +0 -7
- package/bundle/user-registry-6PUJJ5J2.js.map +0 -7
- package/bundle/wrapper-WLHLG4MI.js.map +0 -7
- /package/bundle/{agent-api-rate-limit-4GEZ4YN5.js.map → agent-api-rate-limit-WCFXJMGY.js.map} +0 -0
- /package/bundle/{agent-registry-563P4EUJ.js.map → agent-registry-GU7ABOK5.js.map} +0 -0
- /package/bundle/{bridge-lock-transport-LXCF2IVN.js.map → bridge-lock-transport-4ZH7QTJP.js.map} +0 -0
- /package/bundle/{browser-2VZOGOGX.js.map → browser-EJNS35NT.js.map} +0 -0
- /package/bundle/{capability-WXEA2WFK.js.map → capability-JFWX3IQF.js.map} +0 -0
- /package/bundle/{chunk-CB6S3ZRF.js.map → chunk-2FAZIA37.js.map} +0 -0
- /package/bundle/{chunk-2FZJDMAF.js.map → chunk-3CACHBDI.js.map} +0 -0
- /package/bundle/{chunk-O4GKI3Q3.js.map → chunk-4S554KLW.js.map} +0 -0
- /package/bundle/{chunk-SSCGWDIC.js.map → chunk-65VCEC32.js.map} +0 -0
- /package/bundle/{chunk-V2QIAXWZ.js.map → chunk-7BSQ5UQO.js.map} +0 -0
- /package/bundle/{chunk-E7MV7WFT.js.map → chunk-7Z3HBPRY.js.map} +0 -0
- /package/bundle/{chunk-TY26WMQY.js.map → chunk-AFREM7FX.js.map} +0 -0
- /package/bundle/{chunk-N5VROZ7A.js.map → chunk-B6ZN6COK.js.map} +0 -0
- /package/bundle/{chunk-YEOZN5IE.js.map → chunk-DYBW4XXL.js.map} +0 -0
- /package/bundle/{chunk-56D3Y44D.js.map → chunk-EFJVUJBE.js.map} +0 -0
- /package/bundle/{chunk-FIAVVKGN.js.map → chunk-EUZDKV3C.js.map} +0 -0
- /package/bundle/{chunk-2LKQV2ND.js.map → chunk-FRKW6LWB.js.map} +0 -0
- /package/bundle/{chunk-DNDYD5SL.js.map → chunk-GP4XUKI5.js.map} +0 -0
- /package/bundle/{chunk-W726UGI6.js.map → chunk-GRVWZO4C.js.map} +0 -0
- /package/bundle/{chunk-OOKNHOCB.js.map → chunk-GWILHZPT.js.map} +0 -0
- /package/bundle/{chunk-BNBC4T45.js.map → chunk-HT2BPTZY.js.map} +0 -0
- /package/bundle/{chunk-FVUL44T4.js.map → chunk-IJT4KWXT.js.map} +0 -0
- /package/bundle/{chunk-IK4R3RBZ.js.map → chunk-JNIHEDKF.js.map} +0 -0
- /package/bundle/{chunk-4PIVWXUJ.js.map → chunk-LUNA6PM5.js.map} +0 -0
- /package/bundle/{chunk-MV5KOWOR.js.map → chunk-NDCRWEEJ.js.map} +0 -0
- /package/bundle/{chunk-ZOCEBV62.js.map → chunk-OKAQICWY.js.map} +0 -0
- /package/bundle/{chunk-TCI6FZTP.js.map → chunk-OLAURO5G.js.map} +0 -0
- /package/bundle/{chunk-YME7NRGP.js.map → chunk-OXTSWQCX.js.map} +0 -0
- /package/bundle/{chunk-HDOFJVFS.js.map → chunk-PEDX56EL.js.map} +0 -0
- /package/bundle/{chunk-ASYX43OU.js.map → chunk-Q32H6VPU.js.map} +0 -0
- /package/bundle/{chunk-IQKADER4.js.map → chunk-RWRRGE4U.js.map} +0 -0
- /package/bundle/{chunk-ULO2PX3T.js.map → chunk-TEFZ4JA4.js.map} +0 -0
- /package/bundle/{chunk-2RGR3LSV.js.map → chunk-TMUYFERL.js.map} +0 -0
- /package/bundle/{chunk-KBPVJGD7.js.map → chunk-URQPDCK5.js.map} +0 -0
- /package/bundle/{chunk-FJF42RZY.js.map → chunk-VUIX5AGB.js.map} +0 -0
- /package/bundle/{chunk-4HNCOQSK.js.map → chunk-WYHGNI56.js.map} +0 -0
- /package/bundle/{chunk-24V4A6RP.js.map → chunk-XX6BGTPO.js.map} +0 -0
- /package/bundle/{chunk-T7TAWGBX.js.map → chunk-Y76VUJSF.js.map} +0 -0
- /package/bundle/{chunk-TVSPVZTX.js.map → chunk-YDY6QVWJ.js.map} +0 -0
- /package/bundle/{chunk-V6CV3QPH.js.map → chunk-YRSMGJFP.js.map} +0 -0
- /package/bundle/{chunk-WP7FZHMI.js.map → chunk-YSKCQH6E.js.map} +0 -0
- /package/bundle/{chunk-NGZVJ52F.js.map → chunk-ZKJOFASV.js.map} +0 -0
- /package/bundle/{chunk-43DKPXTP.js.map → chunk-ZV4IWKDJ.js.map} +0 -0
- /package/bundle/{commands-XXFU2ZF7.js.map → commands-EWA4HNCM.js.map} +0 -0
- /package/bundle/{config-EWDZ234X.js.map → config-M3P5IOAI.js.map} +0 -0
- /package/bundle/{config-show-6J33O4TE.js.map → config-show-3DHPP26D.js.map} +0 -0
- /package/bundle/{daemon-LTDAXNA2.js.map → daemon-TB23FFWY.js.map} +0 -0
- /package/bundle/{delegation-tools-YDTWQMZD.js.map → delegation-tools-P2SCNL23.js.map} +0 -0
- /package/bundle/{deploy-lib-import-RGZJ3CGC.js.map → deploy-YYUCGGP3.js.map} +0 -0
- /package/bundle/{doctor-probes-3SLIUGKS.js.map → deploy-lib-import-T3UP4G6G.js.map} +0 -0
- /package/bundle/{discord-adapter-WUNYPTDE.js.map → discord-adapter-4TTETYDI.js.map} +0 -0
- /package/bundle/{env-schema-MSDP2YBO.js.map → doctor-probes-VDWFJKUB.js.map} +0 -0
- /package/bundle/{gossip-CS3G3447.js.map → env-schema-4JXQUOH4.js.map} +0 -0
- /package/bundle/{guardrails-24XK2COI.js.map → gossip-3C3BSNPN.js.map} +0 -0
- /package/bundle/{heartbeat-system-G4IFQXT6.js.map → guardrails-DL7ZSWVN.js.map} +0 -0
- /package/bundle/{hook-system-X6INNJGV.js.map → heartbeat-system-TDDIOVTC.js.map} +0 -0
- /package/bundle/{hotskills-6FQYTJIO.js.map → hook-system-M3POLUIB.js.map} +0 -0
- /package/bundle/{kanban-board-J6RO3ZU7.js.map → hotskills-FWX4QI7V.js.map} +0 -0
- /package/bundle/{kanban-channel-5EIXBFSA.js.map → kanban-board-M326B2XJ.js.map} +0 -0
- /package/bundle/{lazy-require-V6EFUATC.js.map → kanban-channel-IJ52OMNA.js.map} +0 -0
- /package/bundle/{logger-Y3VILPRH.js.map → lazy-require-KCRVT4SI.js.map} +0 -0
- /package/bundle/{main-chat-YLZDNQPO.js.map → logger-OWCSNYCA.js.map} +0 -0
- /package/bundle/{logs-YS3GDURO.js.map → logs-FXS4SCEM.js.map} +0 -0
- /package/bundle/{master-user-Z4M7KCJE.js.map → main-chat-ZNUZCTNS.js.map} +0 -0
- /package/bundle/{message-pipeline-MHEBDJLH.js.map → master-user-HSKM4ZFN.js.map} +0 -0
- /package/bundle/{nerve-VZNMFDGY.js.map → message-pipeline-KSONH4MT.js.map} +0 -0
- /package/bundle/{notification-VV2OR6NW.js.map → nerve-IGSXBKZZ.js.map} +0 -0
- /package/bundle/{orc-tools-CHRSXSAS.js.map → notification-BFSIEECG.js.map} +0 -0
- /package/bundle/{orc-KC4USP55.js.map → orc-EIGVTHAV.js.map} +0 -0
- /package/bundle/{paths-EDK6KWHG.js.map → orc-tools-A3G7WCSJ.js.map} +0 -0
- /package/bundle/{paths-RZF6WDMG.js.map → paths-3ZVW3NFL.js.map} +0 -0
- /package/bundle/{peer-auth-SRONOLNG.js.map → paths-X4LRYUI6.js.map} +0 -0
- /package/bundle/{peer-config-FRWLEYQ5.js.map → peer-auth-QC4EF2PM.js.map} +0 -0
- /package/bundle/{peer-jwt-XY3XRIA2.js.map → peer-config-TN55LFDC.js.map} +0 -0
- /package/bundle/{peer-transport-UBBXTDRP.js.map → peer-jwt-NCCPXJRX.js.map} +0 -0
- /package/bundle/{phase-config-V4XETN5F.js.map → peer-transport-I6JPLFZ2.js.map} +0 -0
- /package/bundle/{phase-transport-4NQHZX75.js.map → phase-transport-2BRWACDF.js.map} +0 -0
- /package/bundle/{reconcile-2EUXJ6W5.js.map → reconcile-CTFCLQRN.js.map} +0 -0
- /package/bundle/{registry-client-VN2MM2HI.js.map → rollback-ANRI3T5Z.js.map} +0 -0
- /package/bundle/{rollback-MVZ53XS4.js.map → sha-tracker-ZWBP6CIJ.js.map} +0 -0
- /package/bundle/{sandbox-runtime-WHACQLLN.js.map → skill-stats-JORH5DGM.js.map} +0 -0
- /package/bundle/{sha-tracker-2DB4R2TW.js.map → skill-watcher-E4MGLKLS.js.map} +0 -0
- /package/bundle/{skill-stats-TPD2NROA.js.map → sleep-SRCSXY6T.js.map} +0 -0
- /package/bundle/{skill-watcher-D7QYYYON.js.map → soul-bundle-VWAVHCZ6.js.map} +0 -0
- /package/bundle/{sleep-GH6DLBJJ.js.map → spin-IMW2MZOH.js.map} +0 -0
- /package/bundle/{soul-bundle-GXLMDBCC.js.map → spin-types-BLPYAETA.js.map} +0 -0
- /package/bundle/{spin-4DBYHS3E.js.map → src-6BTCMOD3.js.map} +0 -0
- /package/bundle/{spin-types-PLJH3SIK.js.map → stt-LGVPXMVR.js.map} +0 -0
- /package/bundle/{src-SUFZ27S5.js.map → subagent-runtime-3UJB4HUB.js.map} +0 -0
- /package/bundle/{stt-KD3AABKG.js.map → task-store-W5BFIAIH.js.map} +0 -0
- /package/bundle/{telegram-adapter-UJ3RYYV6.js.map → telegram-adapter-7G773NII.js.map} +0 -0
- /package/bundle/{subagent-runtime-LVECAUPV.js.map → tool-registry-J6TE3I2T.js.map} +0 -0
- /package/bundle/{task-store-2XRDM3AW.js.map → tool-sandbox-4UC6GAKA.js.map} +0 -0
- /package/bundle/{tool-registry-YU6WBXPA.js.map → transport-config-KBF5W2DP.js.map} +0 -0
- /package/bundle/{tool-sandbox-RNNPDR5M.js.map → update-424ZZQQ6.js.map} +0 -0
- /package/bundle/{transport-config-OK3MZPJK.js.map → usage-tracker-NXD364VX.js.map} +0 -0
- /package/bundle/{update-ENNPRW7Y.js.map → user-registry-35BW4XKM.js.map} +0 -0
- /package/bundle/{usage-tracker-HRSGC7QC.js.map → wrapper-W66YICNZ.js.map} +0 -0
|
@@ -5,20 +5,20 @@ import {
|
|
|
5
5
|
BrowserManager,
|
|
6
6
|
BrowserTool,
|
|
7
7
|
DomainAllowlist
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-2KC5G3EA.js";
|
|
9
9
|
import {
|
|
10
10
|
getEnv,
|
|
11
11
|
init_env_schema
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-65VCEC32.js";
|
|
13
13
|
import {
|
|
14
14
|
init_logger,
|
|
15
15
|
logError,
|
|
16
16
|
logInfo
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-GWILHZPT.js";
|
|
18
18
|
import {
|
|
19
19
|
abtarsHome,
|
|
20
20
|
init_paths
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-GALQBVKO.js";
|
|
22
22
|
import {
|
|
23
23
|
__export
|
|
24
24
|
} from "./chunk-7K2YZTLD.js";
|
|
@@ -66,7 +66,7 @@ function register(api) {
|
|
|
66
66
|
buf = buf.slice(nl + 1);
|
|
67
67
|
try {
|
|
68
68
|
const { taskId, prompt, timeoutMs } = JSON.parse(line);
|
|
69
|
-
import("./spin-
|
|
69
|
+
import("./spin-IMW2MZOH.js").then(({ spin: s }) => {
|
|
70
70
|
const { cardId } = s.dispatch({ type: "B", goal: prompt, source: "agent", timeoutMs });
|
|
71
71
|
conn.write(JSON.stringify({ ok: true, taskId, cardId, status: "spawned" }) + "\n");
|
|
72
72
|
}).catch((err) => {
|
|
@@ -98,4 +98,4 @@ export {
|
|
|
98
98
|
register,
|
|
99
99
|
browser_exports
|
|
100
100
|
};
|
|
101
|
-
//# sourceMappingURL=chunk-
|
|
101
|
+
//# sourceMappingURL=chunk-7Z3HBPRY.js.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_user_registry,
|
|
5
5
|
loadUsers
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ZV4IWKDJ.js";
|
|
7
7
|
import {
|
|
8
8
|
__esm
|
|
9
9
|
} from "./chunk-7K2YZTLD.js";
|
|
@@ -24,4 +24,4 @@ export {
|
|
|
24
24
|
getMasterUserId,
|
|
25
25
|
init_master_user
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-AFREM7FX.js.map
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
|
|
3
|
+
import {
|
|
4
|
+
getMasterUserId,
|
|
5
|
+
init_master_user
|
|
6
|
+
} from "./chunk-AFREM7FX.js";
|
|
7
|
+
import {
|
|
8
|
+
init_user_registry,
|
|
9
|
+
loadUsers
|
|
10
|
+
} from "./chunk-ZV4IWKDJ.js";
|
|
3
11
|
import {
|
|
4
12
|
init_spin_types,
|
|
5
13
|
parseSessionType,
|
|
@@ -7,7 +15,7 @@ import {
|
|
|
7
15
|
sessionType,
|
|
8
16
|
typeAgent,
|
|
9
17
|
typeLabel
|
|
10
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-Y76VUJSF.js";
|
|
11
19
|
import {
|
|
12
20
|
init_kanban_board,
|
|
13
21
|
isUnblocked,
|
|
@@ -18,23 +26,24 @@ import {
|
|
|
18
26
|
kanbanList,
|
|
19
27
|
kanbanRetryOrFail,
|
|
20
28
|
kanbanRunning
|
|
21
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-EQSG2CRM.js";
|
|
22
30
|
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import {
|
|
27
|
-
init_user_registry,
|
|
28
|
-
loadUsers
|
|
29
|
-
} from "./chunk-43DKPXTP.js";
|
|
31
|
+
init_log_and_swallow,
|
|
32
|
+
logAndSwallow
|
|
33
|
+
} from "./chunk-YSKCQH6E.js";
|
|
30
34
|
import {
|
|
31
35
|
init_logger,
|
|
32
36
|
logInfo,
|
|
33
37
|
logWarn
|
|
34
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-GWILHZPT.js";
|
|
39
|
+
import {
|
|
40
|
+
init_paths,
|
|
41
|
+
paths_exports
|
|
42
|
+
} from "./chunk-GALQBVKO.js";
|
|
35
43
|
import {
|
|
36
44
|
__esm,
|
|
37
45
|
__export,
|
|
46
|
+
__require,
|
|
38
47
|
__toCommonJS
|
|
39
48
|
} from "./chunk-7K2YZTLD.js";
|
|
40
49
|
|
|
@@ -368,7 +377,7 @@ __export(spin_exports, {
|
|
|
368
377
|
});
|
|
369
378
|
async function fireCallback(peerName, taskId, status, result, error, artifacts, tokensUsed) {
|
|
370
379
|
try {
|
|
371
|
-
const { getPeerTransport } = await import("./peer-transport-
|
|
380
|
+
const { getPeerTransport } = await import("./peer-transport-I6JPLFZ2.js");
|
|
372
381
|
const transport = getPeerTransport();
|
|
373
382
|
const payload = { action: "callback", task_id: taskId, status, result_summary: result, error, tokens_used: tokensUsed ?? 0 };
|
|
374
383
|
if (artifacts?.length) payload.artifacts = artifacts;
|
|
@@ -382,6 +391,7 @@ var TAG, USER_SESSION_IDLE_MS, GUEST_SESSION_IDLE_MS, MAX_TOTAL_SESSIONS, SESSIO
|
|
|
382
391
|
var init_spin = __esm({
|
|
383
392
|
"src/components/spin.ts"() {
|
|
384
393
|
init_logger();
|
|
394
|
+
init_log_and_swallow();
|
|
385
395
|
init_kanban_board();
|
|
386
396
|
init_user_registry();
|
|
387
397
|
init_master_user();
|
|
@@ -411,6 +421,7 @@ var init_spin = __esm({
|
|
|
411
421
|
memory = null;
|
|
412
422
|
orcSession = null;
|
|
413
423
|
_lastHealerDoneAt = 0;
|
|
424
|
+
_housekeepCounter = 0;
|
|
414
425
|
setRuntime(runtime) {
|
|
415
426
|
this.runtime = runtime;
|
|
416
427
|
}
|
|
@@ -826,6 +837,11 @@ var init_spin = __esm({
|
|
|
826
837
|
this.drainQueued();
|
|
827
838
|
this.checkStaleWorkers();
|
|
828
839
|
await this.pollRemoteCards();
|
|
840
|
+
this._housekeepCounter++;
|
|
841
|
+
if (this._housekeepCounter % 72 === 0) {
|
|
842
|
+
this.pruneSkillTrash();
|
|
843
|
+
this.rotateAuditLog();
|
|
844
|
+
}
|
|
829
845
|
}
|
|
830
846
|
checkStaleWorkers() {
|
|
831
847
|
const STALE_MS = parseInt(process.env["WORKER_STALE_MS"] || "300000", 10);
|
|
@@ -842,10 +858,66 @@ var init_spin = __esm({
|
|
|
842
858
|
}
|
|
843
859
|
}
|
|
844
860
|
}
|
|
861
|
+
/** #613: Prune .trash/ entries older than 7 days (~hourly). */
|
|
862
|
+
pruneSkillTrash() {
|
|
863
|
+
const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
864
|
+
const { existsSync, readdirSync, rmSync, statSync: statSync2 } = __require("node:fs");
|
|
865
|
+
const { join: join2 } = __require("node:path");
|
|
866
|
+
const { abtarsHome } = (init_paths(), __toCommonJS(paths_exports));
|
|
867
|
+
const trashPath = join2(abtarsHome(), "skills", ".trash");
|
|
868
|
+
if (!existsSync(trashPath)) return;
|
|
869
|
+
const now = Date.now();
|
|
870
|
+
for (const entry of readdirSync(trashPath)) {
|
|
871
|
+
try {
|
|
872
|
+
const full = join2(trashPath, entry);
|
|
873
|
+
const stat = statSync2(full);
|
|
874
|
+
if (now - stat.mtimeMs > SEVEN_DAYS_MS) {
|
|
875
|
+
rmSync(full, { recursive: true });
|
|
876
|
+
logInfo("skill-trash-prune", `Pruned: ${entry}`);
|
|
877
|
+
}
|
|
878
|
+
} catch (err) {
|
|
879
|
+
logAndSwallow(TAG, "prune entry", err);
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
/** #681: Rotate audit.jsonl when > 10MB, prune files older than 30 days (~hourly). */
|
|
884
|
+
rotateAuditLog() {
|
|
885
|
+
const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1e3;
|
|
886
|
+
const { existsSync, statSync: statSync2, renameSync, readdirSync, unlinkSync } = __require("node:fs");
|
|
887
|
+
const { join: join2 } = __require("node:path");
|
|
888
|
+
const { abtarsHome } = (init_paths(), __toCommonJS(paths_exports));
|
|
889
|
+
const logsDir = join2(abtarsHome(), "logs");
|
|
890
|
+
const auditPath = join2(logsDir, "audit.jsonl");
|
|
891
|
+
if (!existsSync(auditPath)) return;
|
|
892
|
+
try {
|
|
893
|
+
const stat = statSync2(auditPath);
|
|
894
|
+
if (stat.size > 10 * 1024 * 1024) {
|
|
895
|
+
const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
896
|
+
renameSync(auditPath, join2(logsDir, `audit-${date}.jsonl`));
|
|
897
|
+
logInfo("audit-rotation", `Rotated audit.jsonl (${(stat.size / 1024 / 1024).toFixed(1)}MB)`);
|
|
898
|
+
}
|
|
899
|
+
} catch (err) {
|
|
900
|
+
logAndSwallow(TAG, "audit rotate", err);
|
|
901
|
+
}
|
|
902
|
+
const now = Date.now();
|
|
903
|
+
try {
|
|
904
|
+
for (const f of readdirSync(logsDir)) {
|
|
905
|
+
if (!f.startsWith("audit-") || !f.endsWith(".jsonl")) continue;
|
|
906
|
+
const full = join2(logsDir, f);
|
|
907
|
+
const stat = statSync2(full);
|
|
908
|
+
if (now - stat.mtimeMs > THIRTY_DAYS_MS) {
|
|
909
|
+
unlinkSync(full);
|
|
910
|
+
logInfo("audit-rotation", `Pruned: ${f}`);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
} catch (err) {
|
|
914
|
+
logAndSwallow(TAG, "audit prune", err);
|
|
915
|
+
}
|
|
916
|
+
}
|
|
845
917
|
async pollRemoteCards() {
|
|
846
918
|
const remoteCards = kanbanList("running", "status").filter((c) => c.type === "remote");
|
|
847
919
|
if (remoteCards.length === 0) return;
|
|
848
|
-
const { getPeerTransport } = await import("./peer-transport-
|
|
920
|
+
const { getPeerTransport } = await import("./peer-transport-I6JPLFZ2.js");
|
|
849
921
|
const transport = getPeerTransport();
|
|
850
922
|
const REMOTE_MAX_AGE_MS = 15 * 60 * 1e3;
|
|
851
923
|
for (const card of remoteCards) {
|
|
@@ -897,7 +969,7 @@ var init_spin = __esm({
|
|
|
897
969
|
}
|
|
898
970
|
}, 6e4);
|
|
899
971
|
try {
|
|
900
|
-
const { buildSoulBundle } = await import("./soul-bundle-
|
|
972
|
+
const { buildSoulBundle } = await import("./soul-bundle-VWAVHCZ6.js");
|
|
901
973
|
const bundle = buildSoulBundle(request.type);
|
|
902
974
|
let fullPrompt = bundle ? `${bundle}
|
|
903
975
|
|
|
@@ -905,7 +977,7 @@ var init_spin = __esm({
|
|
|
905
977
|
|
|
906
978
|
${request.goal}` : request.goal;
|
|
907
979
|
if (request.type === "W" || request.type === "T") {
|
|
908
|
-
const { channelUnread } = await import("./kanban-channel-
|
|
980
|
+
const { channelUnread } = await import("./kanban-channel-IJ52OMNA.js");
|
|
909
981
|
const workerName = `Worker-${String(cardId).padStart(2, "0")}`;
|
|
910
982
|
const parentCard = request.parentCardId ?? cardId;
|
|
911
983
|
const msgs = channelUnread(parentCard, workerName);
|
|
@@ -931,8 +1003,8 @@ ${fullPrompt}`;
|
|
|
931
1003
|
}
|
|
932
1004
|
}
|
|
933
1005
|
async executeOrc(request, cardId, timeoutMs) {
|
|
934
|
-
const { updateBridgeLockField } = await import("./bridge-lock-transport-
|
|
935
|
-
const { setActiveOrcCard } = await import("./orc-tools-
|
|
1006
|
+
const { updateBridgeLockField } = await import("./bridge-lock-transport-4ZH7QTJP.js");
|
|
1007
|
+
const { setActiveOrcCard } = await import("./orc-tools-A3G7WCSJ.js");
|
|
936
1008
|
updateBridgeLockField("orc_active", cardId);
|
|
937
1009
|
setActiveOrcCard(cardId);
|
|
938
1010
|
const orc = await this.getOrCreateOrc();
|
|
@@ -950,7 +1022,7 @@ ${fullPrompt}`;
|
|
|
950
1022
|
logWarn(TAG, `\u23F1\uFE0F O card:${cardId} timed out`);
|
|
951
1023
|
}, timeoutMs);
|
|
952
1024
|
try {
|
|
953
|
-
const { buildSoulBundle } = await import("./soul-bundle-
|
|
1025
|
+
const { buildSoulBundle } = await import("./soul-bundle-VWAVHCZ6.js");
|
|
954
1026
|
const bundle = buildSoulBundle("O");
|
|
955
1027
|
const { localDateTime } = await import("./local-time-HT7A7OGW.js");
|
|
956
1028
|
const context = `[CONTEXT \u2014 do not respond to this section]
|
|
@@ -964,10 +1036,10 @@ ${fullPrompt}`;
|
|
|
964
1036
|
---
|
|
965
1037
|
|
|
966
1038
|
${request.goal}` : request.goal);
|
|
967
|
-
const { drainOrcNotifications } = await import("./spin-notifications-
|
|
1039
|
+
const { drainOrcNotifications } = await import("./spin-notifications-SE2HVZI7.js");
|
|
968
1040
|
const notifications = drainOrcNotifications(cardId);
|
|
969
1041
|
if (notifications.length) fullPrompt = notifications.join("\n") + "\n\n" + fullPrompt;
|
|
970
|
-
const { channelUnread } = await import("./kanban-channel-
|
|
1042
|
+
const { channelUnread } = await import("./kanban-channel-IJ52OMNA.js");
|
|
971
1043
|
const orcMsgs = channelUnread(cardId, "Orc");
|
|
972
1044
|
if (orcMsgs.length > 0) {
|
|
973
1045
|
const lines = orcMsgs.map((m) => `[${m.from_agent}\u2192${m.to_agent}]${m.directive ? " \u26A1" : ""} ${m.message}`);
|
|
@@ -1005,4 +1077,4 @@ export {
|
|
|
1005
1077
|
spin_exports,
|
|
1006
1078
|
init_spin
|
|
1007
1079
|
};
|
|
1008
|
-
//# sourceMappingURL=chunk-
|
|
1080
|
+
//# sourceMappingURL=chunk-AO32N2VB.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/spin-sessions.ts", "../src/components/artifact-store.ts", "../src/components/transport/artifact-tools.ts", "../src/components/spin.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * spin-sessions.ts \u2014 Session CRUD on a flat Map<id, ManagedSession> (#953).\n * No PlatformState, no bucketing. Filter/find on the one map.\n */\n\nimport type { ManagedSession, SessionType } from \"./spin-types.js\";\nimport { sessionType, sessionCreatedAt, typeLabel } from \"./spin-types.js\";\n\nconst MAX_LOG = 5;\n\nexport function pushLog(session: ManagedSession, event: string): void {\n session.log.push(`${new Date().toISOString().slice(11, 19)} ${event}`);\n if (session.log.length > MAX_LOG) session.log.shift();\n}\n\nexport function allocateSession(\n sessions: Map<string, ManagedSession>, nextIndex: number,\n type: SessionType, userId: string, platform: string, chatId: number,\n opts?: { active?: boolean; motherId?: string },\n): { session: ManagedSession; nextIndex: number } {\n const idx = nextIndex + 1;\n const ts = Math.floor(Date.now() / 1000);\n const session: ManagedSession = {\n id: `${ts}_${type}_${String(idx).padStart(2, \"0\")}`,\n userId, platform, chatId,\n delivery: \"simple\",\n active: opts?.active ?? false,\n status: \"ready\",\n idleTimeoutMs: 7200000,\n lastActiveAt: Date.now(),\n motherId: opts?.motherId,\n messageCount: 0, tokenCount: 0, toolCallCount: 0,\n log: [],\n shortIndex: idx,\n // Pipeline state defaults (#1040)\n busy: false, queue: [], fullMode: false, pendingStart: false,\n seen: false, compacting: false, ctxWarned: false, compactFailures: 0,\n primingTerms: [], completions: [],\n };\n sessions.set(session.id, session);\n pushLog(session, \"created\");\n return { session, nextIndex: idx };\n}\n\nexport function getActiveSession(sessions: Map<string, ManagedSession>, userId: string, platform: string): ManagedSession | undefined {\n for (const s of sessions.values()) {\n if (s.userId === userId && s.platform === platform && s.active && s.status !== \"ended\") return s;\n }\n return undefined;\n}\n\nexport function createSession(\n sessions: Map<string, ManagedSession>, nextIndex: number,\n userId: string, platform: string, type: SessionType, chatId: number, maxSessions: number,\n): { session: ManagedSession; nextIndex: number } | string {\n const alive = [...sessions.values()].filter(s => s.status !== \"ended\");\n if (alive.length >= maxSessions) return `Max sessions reached (${maxSessions}). End or kill a session first.`;\n\n // Deactivate current active\n const cur = getActiveSession(sessions, userId, platform);\n if (cur) cur.active = false;\n\n const result = allocateSession(sessions, nextIndex, type, userId, platform, chatId, { active: true });\n return result;\n}\n\nexport function createSubSession(\n sessions: Map<string, ManagedSession>, nextIndex: number,\n userId: string, platform: string, type: SessionType, chatId: number, maxSessions: number,\n): { session: ManagedSession; nextIndex: number } | string {\n const alive = [...sessions.values()].filter(s => s.status !== \"ended\");\n if (alive.length >= maxSessions) return `Max sessions reached \u2014 auto-spawn skipped.`;\n\n const active = getActiveSession(sessions, userId, platform);\n return allocateSession(sessions, nextIndex, type, userId, platform, chatId, { active: false, motherId: active?.id });\n}\n\nexport function isHollow(session: ManagedSession): boolean { return !!session.peer; }\n\nexport function createHollowSession(\n sessions: Map<string, ManagedSession>, nextIndex: number,\n userId: string, platform: string, type: SessionType, chatId: number,\n peer: string, remoteSessionId: string, maxSessions: number,\n): { session: ManagedSession; nextIndex: number } | string {\n const alive = [...sessions.values()].filter(s => s.status !== \"ended\");\n if (alive.length >= maxSessions) return `Max sessions reached \u2014 cannot create hollow session.`;\n\n const result = allocateSession(sessions, nextIndex, type, userId, platform, chatId, { active: false });\n result.session.peer = peer;\n result.session.remoteSessionId = remoteSessionId;\n pushLog(result.session, `hollow (${peer})`);\n return result;\n}\n\nexport function switchSession(sessions: Map<string, ManagedSession>, userId: string, platform: string, index: number): ManagedSession | string {\n const target = [...sessions.values()].find(s => s.shortIndex === index && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${index} not found or not switchable.`;\n const cur = getActiveSession(sessions, userId, platform);\n if (cur) cur.active = false;\n target.active = true;\n return target;\n}\n\nexport function endSession(sessions: Map<string, ManagedSession>, nextIndex: number, userId: string, platform: string, index?: number): { ended: ManagedSession; nextIndex: number } | string {\n const targetIdx = index ?? getActiveSession(sessions, userId, platform)?.shortIndex;\n if (!targetIdx) return `No active session found.`;\n const target = [...sessions.values()].find(s => s.shortIndex === targetIdx && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${targetIdx} not found.`;\n\n const aliveMains = [...sessions.values()].filter(s => sessionType(s) === \"A\" && s.status !== \"ended\" && s.userId === userId);\n\n target.status = \"ended\";\n target.active = false;\n pushLog(target, \"ended\");\n\n // If ended the last Main, create a replacement\n if (sessionType(target) === \"A\" && aliveMains.length <= 1) {\n const result = allocateSession(sessions, nextIndex, \"A\", userId, platform, target.chatId, { active: true });\n return { ended: target, nextIndex: result.nextIndex };\n }\n\n // If ended the active session, activate first available Main\n if (index === undefined || target.active) {\n const main = [...sessions.values()].find(s => sessionType(s) === \"A\" && s.status !== \"ended\" && s.userId === userId);\n if (main) main.active = true;\n }\n\n return { ended: target, nextIndex };\n}\n\nexport function killSession(sessions: Map<string, ManagedSession>, nextIndex: number, userId: string, platform: string, index: number): { killed: ManagedSession; nextIndex: number } | string {\n const target = [...sessions.values()].find(s => s.shortIndex === index && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${index} not found.`;\n\n target.status = \"ended\";\n target.active = false;\n pushLog(target, \"killed\");\n\n // If killed a Main and it was the last, create replacement\n const aliveMains = [...sessions.values()].filter(s => sessionType(s) === \"A\" && s.status !== \"ended\" && s.userId === userId);\n if (sessionType(target) === \"A\" && aliveMains.length === 0) {\n const result = allocateSession(sessions, nextIndex, \"A\", userId, platform, target.chatId, { active: true });\n return { killed: target, nextIndex: result.nextIndex };\n }\n\n // If killed the active, activate a Main\n if (!getActiveSession(sessions, userId, platform)) {\n const main = [...sessions.values()].find(s => sessionType(s) === \"A\" && s.status !== \"ended\" && s.userId === userId);\n if (main) main.active = true;\n }\n\n return { killed: target, nextIndex };\n}\n\nexport function pauseSession(sessions: Map<string, ManagedSession>, userId: string, platform: string, index?: number): ManagedSession | string {\n const targetIdx = index ?? getActiveSession(sessions, userId, platform)?.shortIndex;\n if (!targetIdx) return `No active session found.`;\n const target = [...sessions.values()].find(s => s.shortIndex === targetIdx && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${targetIdx} not found.`;\n if (target.status === \"paused\") return `Session #${targetIdx} is already paused.`;\n target.status = \"paused\";\n pushLog(target, \"paused\");\n return target;\n}\n\nexport function resumeSession(sessions: Map<string, ManagedSession>, userId: string, platform: string, index?: number): ManagedSession | string {\n const targetIdx = index ?? getActiveSession(sessions, userId, platform)?.shortIndex;\n if (!targetIdx) return `No active session found.`;\n const target = [...sessions.values()].find(s => s.shortIndex === targetIdx && s.status !== \"ended\" && s.userId === userId);\n if (!target) return `Session #${targetIdx} not found.`;\n if (target.status !== \"paused\") return `Session #${targetIdx} is not paused.`;\n target.status = \"ready\";\n pushLog(target, \"resumed\");\n return target;\n}\n\nexport function listSessions(sessions: Map<string, ManagedSession>, userId: string, platform: string): ManagedSession[] {\n return [...sessions.values()].filter(s => s.userId === userId && s.platform === platform && s.status !== \"ended\");\n}\n\nexport function listAllSessions(sessions: Map<string, ManagedSession>): ManagedSession[] {\n return [...sessions.values()].filter(s => s.status !== \"ended\");\n}\n\nexport function getSessionById(sessions: Map<string, ManagedSession>, sessionId: string): ManagedSession | undefined {\n return sessions.get(sessionId);\n}\n\nexport function formatList(sessions: Map<string, ManagedSession>, userId: string, platform: string, showAll = false): string {\n const list = showAll ? listAllSessions(sessions) : listSessions(sessions, userId, platform);\n if (list.length === 0) return \"No active sessions.\";\n return list.map(s => {\n const marker = s.active && s.userId === userId ? \" *\" : \"\";\n const owner = showAll && s.userId !== userId ? ` (${s.userId})` : \"\";\n const bg = !s.active && sessionType(s) !== \"A\" ? \" (bg)\" : \"\";\n const paused = s.status === \"paused\" ? \" \u23F8\" : \"\";\n const remote = s.peer ? ` (remote: ${s.peer})` : \"\";\n const model = s.model ? ` ${s.model}` : \"\";\n const nm = s.name ? ` \"${s.name}\"` : \"\";\n const time = new Date(sessionCreatedAt(s)).toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\" });\n const idle = s.busy ? \"busy\" : `idle ${Math.round((Date.now() - s.lastActiveAt) / 60000)}m`;\n const metrics = s.messageCount ? ` | ${s.messageCount} msgs` : \"\";\n return `#${s.shortIndex} ${typeLabel(sessionType(s))}${owner}${nm}${remote}${bg}${model} \u2014 ${time}${paused}${marker} | ${idle}${metrics}`;\n }).join(\"\\n\");\n}\n", "/**\n * artifact-store.ts \u2014 S3-compatible artifact store with lazy SDK loading (#929).\n */\n\nimport { createReadStream, createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execSync } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { Readable } from \"node:stream\";\n\nconst LIB_DIR = join(process.env[\"ABTARS_HOME\"] ?? join(homedir(), \".abtars\"), \"lib\");\nconst localRequire = createRequire(join(LIB_DIR, \"node_modules\", \"_placeholder.js\"));\n\nlet _s3: any;\nlet _presigner: any;\n\nfunction loadSdk(): void {\n if (_s3) return;\n try {\n _s3 = localRequire(\"@aws-sdk/client-s3\");\n _presigner = localRequire(\"@aws-sdk/s3-request-presigner\");\n } catch {\n execSync(`npm install --prefix \"${LIB_DIR}\" @aws-sdk/client-s3 @aws-sdk/s3-request-presigner`, { stdio: \"pipe\" });\n _s3 = localRequire(\"@aws-sdk/client-s3\");\n _presigner = localRequire(\"@aws-sdk/s3-request-presigner\");\n }\n}\n\nfunction getClient(): any {\n const endpoint = process.env[\"ARTIFACT_S3_ENDPOINT\"];\n if (!endpoint) throw new Error(\"Artifact store not configured\");\n loadSdk();\n return new _s3.S3Client({\n endpoint,\n region: process.env[\"ARTIFACT_S3_REGION\"] || \"auto\",\n credentials: { accessKeyId: process.env[\"ARTIFACT_S3_KEY\"] ?? \"\", secretAccessKey: process.env[\"ARTIFACT_S3_SECRET\"] ?? \"\" },\n });\n}\n\nfunction bucket(): string {\n return process.env[\"ARTIFACT_S3_BUCKET\"] || \"abtars-artifacts\";\n}\n\nexport async function upload(localPath: string, remotePath: string): Promise<string> {\n const client = getClient();\n const stream = createReadStream(localPath);\n await client.send(new _s3.PutObjectCommand({ Bucket: bucket(), Key: remotePath, Body: stream }));\n return `${process.env[\"ARTIFACT_S3_ENDPOINT\"]}/${bucket()}/${remotePath}`;\n}\n\nexport async function download(remotePath: string, localPath: string): Promise<void> {\n const client = getClient();\n const resp = await client.send(new _s3.GetObjectCommand({ Bucket: bucket(), Key: remotePath }));\n await pipeline(resp.Body as Readable, createWriteStream(localPath));\n}\n\nexport async function presign(remotePath: string, expiresIn = 3600): Promise<string> {\n const client = getClient();\n const cmd = new _s3.GetObjectCommand({ Bucket: bucket(), Key: remotePath });\n return _presigner.getSignedUrl(client, cmd, { expiresIn });\n}\n\nexport async function exists(remotePath: string): Promise<boolean> {\n const client = getClient();\n try {\n await client.send(new _s3.HeadObjectCommand({ Bucket: bucket(), Key: remotePath }));\n return true;\n } catch { return false; }\n}\n\nexport async function remove(remotePath: string): Promise<void> {\n const client = getClient();\n await client.send(new _s3.DeleteObjectCommand({ Bucket: bucket(), Key: remotePath }));\n}\n", "/**\n * artifact-tools.ts \u2014 Agent tools for S3 artifact store (#929) + inline transfer (#928).\n */\n\nimport type { ToolDefinition } from \"./tool-registry.js\";\nimport { upload, download } from \"../artifact-store.js\";\nimport { readFileSync, statSync } from \"node:fs\";\nimport { basename } from \"node:path\";\n\n// \u2500\u2500 Inline artifact queue (#928) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface InlineArtifact { name: string; content: string }\n\nconst pendingArtifacts = new Map<number, InlineArtifact[]>();\n\nconst MAX_FILE_BYTES = 1_000_000; // 1MB raw\n\nexport function drainArtifacts(cardId: number): InlineArtifact[] | undefined {\n const arts = pendingArtifacts.get(cardId);\n if (arts) pendingArtifacts.delete(cardId);\n return arts;\n}\n\nexport const artifactAttachTool: ToolDefinition = {\n name: \"artifact_attach\",\n description: \"Attach a local file to the task result. The file is base64-encoded and sent back to the delegating peer on task completion. Max 1MB per file.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Absolute path to the file to attach\" },\n card_id: { type: \"number\", description: \"Current card ID (from environment)\" },\n },\n required: [\"path\", \"card_id\"],\n },\n async execute(args): Promise<string> {\n const filePath = args[\"path\"];\n const cardId = parseInt(args[\"card_id\"] ?? \"0\", 10);\n if (!filePath) return JSON.stringify({ error: \"path is required\" });\n if (!cardId) return JSON.stringify({ error: \"card_id is required\" });\n\n try {\n const stat = statSync(filePath);\n if (stat.size > MAX_FILE_BYTES) {\n return JSON.stringify({ error: `File too large: ${stat.size} bytes (max ${MAX_FILE_BYTES})` });\n }\n const content = readFileSync(filePath).toString(\"base64\");\n const name = basename(filePath);\n const list = pendingArtifacts.get(cardId) ?? [];\n list.push({ name, content });\n pendingArtifacts.set(cardId, list);\n return JSON.stringify({ ok: true, name, size: stat.size, queued: list.length });\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n};\n\nexport const artifactPushTool: ToolDefinition = {\n name: \"artifact_push\",\n description: \"Upload a local file to the shared artifact store (S3). Returns the artifact URL.\",\n parameters: {\n type: \"object\",\n properties: {\n local_path: { type: \"string\", description: \"Absolute path to local file\" },\n remote_path: { type: \"string\", description: \"Remote key/path in the artifact store\" },\n },\n required: [\"local_path\", \"remote_path\"],\n },\n async execute(args): Promise<string> {\n try {\n const url = await upload(args[\"local_path\"] ?? \"\", args[\"remote_path\"] ?? \"\");\n return JSON.stringify({ ok: true, url });\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n};\n\nexport const artifactPullTool: ToolDefinition = {\n name: \"artifact_pull\",\n description: \"Download a file from the shared artifact store (S3) to a local path.\",\n parameters: {\n type: \"object\",\n properties: {\n remote_path: { type: \"string\", description: \"Remote key/path in the artifact store\" },\n local_path: { type: \"string\", description: \"Absolute local path to save the file\" },\n },\n required: [\"remote_path\", \"local_path\"],\n },\n async execute(args): Promise<string> {\n try {\n await download(args[\"remote_path\"] ?? \"\", args[\"local_path\"] ?? \"\");\n return JSON.stringify({ ok: true, path: args[\"local_path\"] });\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n};\n", "/**\n * spin.ts \u2014 Unified session router (#943, #953).\n * Single flat Map<sessionId, ManagedSession>. No bucketing. No PlatformState.\n */\n\nimport { logInfo, logWarn } from \"./logger.js\";\nimport { logAndSwallow } from \"./log-and-swallow.js\";\nimport { kanbanEnqueue, kanbanRunning, kanbanComplete, kanbanFail, kanbanRetryOrFail, kanbanList, kanbanGetCard, isUnblocked } from \"./tasks/kanban-board.js\";\nimport type { SubagentRuntime, AgentSession } from \"./subagent-runtime.js\";\nimport type { IKiroTransport } from \"./transport/kiro-transport.js\";\nimport { loadUsers } from \"./user-registry.js\";\nimport { getMasterUserId } from \"./master-user.js\";\nimport type { ManagedSession, SpinRequest, SessionType } from \"./spin-types.js\";\nimport { typeAgent, sessionType } from \"./spin-types.js\";\nimport * as Sessions from \"./spin-sessions.js\";\nimport { pushLog, isHollow } from \"./spin-sessions.js\";\n\nexport type { ManagedSession, SpinRequest, SessionType } from \"./spin-types.js\";\nexport { sessionType, sessionCreatedAt, typeLabel, typeAgent, parseSessionType } from \"./spin-types.js\";\nexport { isHollow };\n\nconst TAG = \"spin\";\nconst USER_SESSION_IDLE_MS = parseInt(process.env[\"USER_SESSION_IDLE_MS\"] ?? \"7200000\", 10);\nconst GUEST_SESSION_IDLE_MS = parseInt(process.env[\"GUEST_SESSION_IDLE_MS\"] ?? \"1800000\", 10);\nconst MAX_TOTAL_SESSIONS = parseInt(process.env[\"MAX_TOTAL_SESSIONS\"] ?? \"12\", 10);\nconst SESSION_CREATE_TIMEOUT_MS = 30_000;\nconst DEFAULT_TIMEOUT_MS = 30 * 60_000;\n\nconst MAX_CONCURRENT: Partial<Record<SessionType, number>> = {\n T: 1, O: 1, B: 1, D: 1, H: 1, W: 3,\n};\n\nexport class Spin {\n private sessions = new Map<string, ManagedSession>();\n private nextIndex = 0;\n private running = new Map<SessionType, Set<number>>();\n private runtime: SubagentRuntime | null = null;\n private memory: { recordMessage(opts: { role: string; content: string; timestamp: number; userId: string; sessionId: string }): void } | null = null;\n private orcSession: AgentSession | null = null;\n private _lastHealerDoneAt = 0;\n private _housekeepCounter = 0;\n\n setRuntime(runtime: SubagentRuntime): void { this.runtime = runtime; }\n setMemory(memory: Spin[\"memory\"]): void { this.memory = memory; }\n\n // \u2500\u2500 Session CRUD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getActiveSession(userId: string, platform: string): ManagedSession {\n let s = Sessions.getActiveSession(this.sessions, userId, platform);\n if (!s) {\n // Auto-create initial Main session\n const r = Sessions.allocateSession(this.sessions, this.nextIndex, \"A\", userId, platform, 0, { active: true });\n this.nextIndex = r.nextIndex;\n s = r.session;\n }\n return s;\n }\n\n getActiveSessionId(userId: string, platform: string): string {\n return this.getActiveSession(userId, platform).id;\n }\n\n createSession(userId: string, platform: string, type: SessionType): ManagedSession | string {\n // Ensure a Main session exists before creating additional ones\n this.getActiveSession(userId, platform);\n const r = Sessions.createSession(this.sessions, this.nextIndex, userId, platform, type, 0, MAX_TOTAL_SESSIONS);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.session;\n }\n\n createSubSession(userId: string, platform: string, type: SessionType): ManagedSession | string {\n const r = Sessions.createSubSession(this.sessions, this.nextIndex, userId, platform, type, 0, MAX_TOTAL_SESSIONS);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.session;\n }\n\n createHollowSession(userId: string, platform: string, type: SessionType, peer: string, remoteSessionId: string): ManagedSession | string {\n const r = Sessions.createHollowSession(this.sessions, this.nextIndex, userId, platform, type, 0, peer, remoteSessionId, MAX_TOTAL_SESSIONS);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.session;\n }\n\n switchSession(userId: string, platform: string, index: number): ManagedSession | string {\n return Sessions.switchSession(this.sessions, userId, platform, index);\n }\n\n endSession(userId: string, platform: string, index?: number): ManagedSession | string {\n const r = Sessions.endSession(this.sessions, this.nextIndex, userId, platform, index);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.ended;\n }\n\n killSession(userId: string, platform: string, index: number): ManagedSession | string {\n const r = Sessions.killSession(this.sessions, this.nextIndex, userId, platform, index);\n if (typeof r === \"string\") return r;\n this.nextIndex = r.nextIndex;\n return r.killed;\n }\n\n pauseSession(userId: string, platform: string, index?: number): ManagedSession | string {\n return Sessions.pauseSession(this.sessions, userId, platform, index);\n }\n\n resumeSession(userId: string, platform: string, index?: number): ManagedSession | string {\n return Sessions.resumeSession(this.sessions, userId, platform, index);\n }\n\n listSessions(userId: string, platform: string): { sessions: ManagedSession[]; activeIndex: number } {\n const list = Sessions.listSessions(this.sessions, userId, platform);\n const active = list.find(s => s.active);\n return { sessions: list, activeIndex: active?.shortIndex ?? 0 };\n }\n\n listAllSessions(): ManagedSession[] {\n return Sessions.listAllSessions(this.sessions);\n }\n\n getSessionById(sessionId: string): ManagedSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n formatList(userId: string, platform: string, showAll = false): string {\n return Sessions.formatList(this.sessions, userId, platform, showAll);\n }\n\n clearAll(): void { this.sessions.clear(); this.nextIndex = 0; }\n\n // \u2500\u2500 Interactive session lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _greetingSent = false;\n private _greetingAdapter: { injectMessage: (msg: any) => void } | null = null;\n\n registerMasterSession(opts: { userId: string; chatId: number; platform: string; transport: IKiroTransport }): void {\n const session = this.getActiveSession(opts.userId, opts.platform);\n session.transport = opts.transport;\n session.delivery = \"streaming\";\n session.idleTimeoutMs = Infinity;\n session.chatId = opts.chatId;\n session.status = \"ready\";\n session.lastActiveAt = Date.now();\n const t = opts.transport as any;\n session.pid = t?._rawClient?.pid ?? t?.agent?.pid ?? undefined;\n pushLog(session, \"master transport attached\");\n logInfo(TAG, `Master session registered: ${opts.userId} (${opts.platform}:${opts.chatId}${session.pid ? ` pid=${session.pid}` : \"\"})`);\n\n // #980: Fire greeting once adapter is set (deferred via setGreetingAdapter)\n this._masterOpts = { userId: opts.userId, chatId: opts.chatId, platform: opts.platform };\n this.tryFireGreeting();\n }\n\n /** Set the adapter for boot greeting. Called after platforms are up. */\n setGreetingAdapter(adapter: { injectMessage: (msg: any) => void }): void {\n this._greetingAdapter = adapter;\n this.tryFireGreeting();\n }\n\n private _masterOpts: { userId: string; chatId: number; platform: string } | null = null;\n\n private tryFireGreeting(): void {\n if (this._greetingSent || !this._greetingAdapter || !this._masterOpts) return;\n this._greetingSent = true;\n const { userId, chatId, platform } = this._masterOpts;\n const session = this.getActiveSession(userId, platform);\n this.greetSession(session, chatId, userId);\n }\n\n /** Inject a greeting into an interactive session (A/C only). */\n greetSession(session: ManagedSession, chatId: number, userId: string, adapter?: { injectMessage: (msg: any) => void }): void {\n const type = sessionType(session);\n if (type !== \"A\" && type !== \"C\") return;\n if (session.messageCount > 0) return;\n const a = adapter ?? this._greetingAdapter;\n if (!a) return;\n\n let attempt = 0;\n const inject = (): void => {\n attempt++;\n a.injectMessage({\n platform: session.platform,\n channelId: String(chatId),\n userId,\n senderId: String(chatId),\n senderName: userId,\n text: \"[SESSION START] You just came online. Greet the user.\",\n timestamp: Date.now(),\n isGroup: false,\n isVoice: false,\n });\n setTimeout(() => {\n if (session.messageCount > 0) return;\n if (session.busy) return;\n if (attempt >= 3) { logWarn(TAG, \"Greeting failed after 3 attempts\"); return; }\n logWarn(TAG, `Greeting attempt ${attempt}/3 \u2014 no response, retrying`);\n inject();\n }, 60_000);\n };\n\n if (session.transport?.isReady) {\n inject();\n } else if (session.transport) {\n session.transport.onReady = () => inject();\n }\n }\n\n async resolveSession(userId: string, platform: string, chatId: number): Promise<ManagedSession> {\n const session = this.getActiveSession(userId, platform);\n\n if (session.transport) {\n session.lastActiveAt = Date.now();\n return session;\n }\n if (session.status === \"ended\") throw new Error(\"Session ended \u2014 use /session new\");\n\n const total = this.listAllSessions().filter(s => s.transport).length;\n if (total >= MAX_TOTAL_SESSIONS) throw new Error(\"System busy, try again in a few minutes.\");\n\n session.status = \"creating\";\n session.chatId = chatId;\n const registry = loadUsers();\n const user = registry.byUserId.get(userId);\n const role = user?.role ?? \"guest\";\n session.idleTimeoutMs = role === \"master\" ? Infinity : role === \"guest\" ? GUEST_SESSION_IDLE_MS : USER_SESSION_IDLE_MS;\n session.delivery = role === \"master\" ? \"streaming\" : \"simple\";\n\n pushLog(session, `creating transport (${role})`);\n logInfo(TAG, `Creating transport for ${userId} (${role})`);\n\n try {\n const agentSession = await Promise.race([\n this.runtime!.session(\"professor\", userId),\n new Promise<never>((_, rej) => setTimeout(() => rej(new Error(\"Session creation timed out\")), SESSION_CREATE_TIMEOUT_MS)),\n ]);\n session.transport = agentSession.transport!;\n session.status = \"ready\";\n session.lastActiveAt = Date.now();\n const t = session.transport as any;\n session.pid = t?._rawClient?.pid ?? t?.agent?.pid ?? undefined;\n pushLog(session, \"transport ready\");\n logInfo(TAG, `Session ready: ${userId} id=${session.id}${session.pid ? ` pid=${session.pid}` : \"\"}`);\n return session;\n } catch (err) {\n session.status = \"ended\";\n pushLog(session, `error: ${err instanceof Error ? err.message : String(err)}`);\n logWarn(TAG, `Session creation failed for ${userId}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n }\n\n destroySession(userId: string, sessionId?: string): void {\n for (const s of this.sessions.values()) {\n if (s.userId !== userId) continue;\n if (sessionId && s.id !== sessionId) continue;\n if (s.idleTimeoutMs === Infinity) continue;\n if (s.transport) { try { s.transport.destroy(); } catch {} s.transport = undefined; }\n s.status = \"ended\";\n s.active = false;\n pushLog(s, \"destroyed\");\n logInfo(TAG, `Session destroyed: ${userId} id=${s.id}`);\n }\n }\n\n destroyAll(): void {\n for (const s of this.sessions.values()) {\n if (s.transport) { try { s.transport.destroy(); } catch {} }\n }\n if (this.orcSession) { try { this.orcSession.destroy(); } catch {} this.orcSession = null; }\n this.sessions.clear();\n this.nextIndex = 0;\n logInfo(TAG, \"All sessions destroyed (shutdown)\");\n }\n\n // \u2500\u2500 inject() \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async inject(userId: string, prompt: string, opts?: { deliver?: boolean }): Promise<string | null> {\n const registry = loadUsers();\n const user = registry.byUserId.get(userId);\n if (!user) { logWarn(TAG, `inject: unknown user ${userId}`); return null; }\n const chatId = user.platforms.telegram ?? user.platforms.discord;\n if (!chatId) { logWarn(TAG, `inject: no chatId for ${userId}`); return null; }\n const platform = user.platforms.telegram ? \"telegram\" : \"discord\";\n const numericChatId = typeof chatId === \"number\" ? chatId : parseInt(String(chatId), 10);\n\n try {\n const session = await this.resolveSession(userId, platform, numericChatId);\n if (!session.transport) { logWarn(TAG, `inject: no transport for ${userId}`); return null; }\n const response = await session.transport.sendPrompt(`${userId}:inject`, prompt, undefined, userId);\n session.messageCount++;\n pushLog(session, `inject (deliver=${opts?.deliver ?? true})`);\n logInfo(TAG, `inject delivered to ${userId} (${response.length} chars, deliver=${opts?.deliver ?? true})`);\n return (opts?.deliver ?? true) ? response : null;\n } catch (err) {\n logWarn(TAG, `inject failed for ${userId}: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n }\n\n async injectGreeting(userId: string, prompt: string): Promise<string | null> {\n if (!this._greetingAdapter) { logWarn(TAG, \"injectGreeting: no adapter\"); return null; }\n const registry = loadUsers();\n const user = registry.byUserId.get(userId);\n if (!user) { logWarn(TAG, `inject: unknown user ${userId}`); return null; }\n const chatId = user.platforms.telegram ?? user.platforms.discord;\n if (!chatId) { logWarn(TAG, `inject: no chatId for ${userId}`); return null; }\n const platform = user.platforms.telegram ? \"telegram\" : \"discord\";\n this._greetingAdapter.injectMessage({\n platform,\n channelId: String(chatId),\n userId,\n senderId: String(chatId),\n senderName: userId,\n text: prompt,\n timestamp: Date.now(),\n isGroup: false,\n isVoice: false,\n });\n logInfo(TAG, `injectGreeting: routed to pipeline for ${userId}`);\n return \"routed\";\n }\n\n // \u2500\u2500 Orc \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getOrcSession(): AgentSession | null { return this.orcSession?.isReady ? this.orcSession : null; }\n\n async sendUserToOrc(message: string): Promise<string | null> {\n const orc = this.getOrcSession();\n if (!orc) return null;\n const response = await orc.sendPrompt(\"orc:user\", `[USER] ${message}`);\n return response;\n }\n\n private async getOrCreateOrc(): Promise<AgentSession> {\n if (this.orcSession?.isReady) return this.orcSession;\n logInfo(TAG, \"Spawning persistent Orc session\");\n this.orcSession = await this.runtime!.session(\"browsie\");\n return this.orcSession;\n }\n\n // \u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** #1010: O-type reuses existing session (one Orc). All others create new. */\n private getOrCreateVisibleSession(userId: string, type: SessionType): ManagedSession | undefined {\n if (type === \"O\") {\n for (const s of this.sessions.values()) {\n if (s.id.includes(\"_O_\") && s.status !== \"ended\") return s;\n }\n }\n const sub = this.createSubSession(userId, \"telegram\", type);\n return typeof sub === \"string\" ? undefined : sub;\n }\n\n dispatch(request: SpinRequest): { cardId: number; sessionId?: string } {\n const cardTitle = request.title ?? request.goal.slice(0, 80);\n const cardId = request.cardId ?? kanbanEnqueue(cardTitle, request.source, undefined, {\n priority: request.priority ?? \"MEDIUM\", type: request.type,\n parent_id: request.parentCardId, deliveryMode: request.deliveryMode,\n notes: request.callbackPeer ? JSON.stringify({ callback_peer: request.callbackPeer }) : undefined,\n chatId: request.chatId, sourcePeer: request.sourcePeer,\n });\n\n if (!this.canDispatch(request.type, cardId)) {\n logInfo(TAG, `${request.type} card:${cardId} queued (concurrency gate)`);\n return { cardId };\n }\n\n this.markRunning(request.type, cardId);\n kanbanRunning(cardId);\n\n const masterUserId = getMasterUserId();\n const session = this.getOrCreateVisibleSession(masterUserId, request.type);\n if (session) { session.name = request.title?.slice(0, 20); pushLog(session, `dispatch card:${cardId}`); }\n\n const timeout = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.execute(request, cardId, timeout)\n .then(result => {\n const { drainArtifacts } = require(\"./transport/artifact-tools.js\") as typeof import(\"./transport/artifact-tools.js\");\n const artifacts = drainArtifacts(cardId);\n kanbanComplete(cardId, null, result.slice(0, 500));\n if (request.callbackPeer) {\n const card = kanbanGetCard(cardId);\n fireCallback(request.callbackPeer, cardId, \"done\", result.slice(0, 500), undefined, artifacts, card?.tokens_used ?? 0);\n }\n })\n .catch(err => {\n const msg = (err instanceof Error ? err.message : String(err)).slice(0, 1000);\n logWarn(TAG, `${request.type} card:${cardId} failed: ${msg}`);\n kanbanRetryOrFail(cardId, msg);\n if (request.callbackPeer) fireCallback(request.callbackPeer, cardId, \"failed\", undefined, msg);\n })\n .finally(() => {\n this.markDone(request.type, cardId);\n if (session) { session.status = \"ended\"; session.active = false; pushLog(session, \"completed\"); }\n this.drainQueued();\n });\n\n return { cardId, sessionId: session?.id };\n }\n\n async dispatchAwait(request: SpinRequest): Promise<{ cardId: number; result: string }> {\n // #987: enforce concurrency + cooldown gates (same as dispatch)\n if (!this.canDispatch(request.type, 0)) {\n throw new Error(`${request.type} session busy or in cooldown \u2014 skipping`);\n }\n\n const cardTitle = request.title ?? request.goal.slice(0, 80);\n const cardId = request.cardId ?? kanbanEnqueue(cardTitle, request.source, undefined, {\n priority: request.priority ?? \"MEDIUM\", type: request.type,\n parent_id: request.parentCardId, deliveryMode: request.deliveryMode,\n chatId: request.chatId,\n });\n\n this.markRunning(request.type, cardId);\n kanbanRunning(cardId);\n\n const masterUserId = getMasterUserId();\n const session = this.getOrCreateVisibleSession(masterUserId, request.type);\n if (session) { session.name = request.title?.slice(0, 20); pushLog(session, `dispatchAwait card:${cardId}`); }\n\n const timeout = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n try {\n const result = await this.execute(request, cardId, timeout);\n return { cardId, result };\n } finally {\n this.markDone(request.type, cardId);\n // O-type: session stays alive until Orc idle timeout (visible in /session)\n if (session && request.type !== \"O\") { session.status = \"ended\"; session.active = false; pushLog(session, \"completed\"); }\n this.drainQueued();\n }\n }\n\n spawnChild(parentCardId: number, request: Omit<SpinRequest, \"type\"> & { type?: SessionType }): number {\n if (request.type === \"O\") throw new Error(\"Cannot nest orchestrators\");\n return this.dispatch({ ...request, type: \"W\", parentCardId }).cardId;\n }\n\n // \u2500\u2500 Internal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private drainQueued(): void {\n const queued = kanbanList(\"queued\");\n const now = new Date().toISOString();\n for (const card of queued) {\n // #897: respect retry backoff\n if ((card as any).next_retry_at && (card as any).next_retry_at > now) continue;\n // #677: respect DAG dependencies\n if (!isUnblocked(card)) continue;\n const type = (card.type as SessionType) ?? \"T\";\n if (this.canDispatch(type, card.id)) {\n this.dispatch({ type, goal: card.title, source: (card.source as SpinRequest[\"source\"]) ?? \"task\", cardId: card.id });\n }\n }\n }\n\n /** Periodic housekeeping \u2014 registered as HB task (#980). */\n async tick(): Promise<void> {\n this.drainQueued();\n this.checkStaleWorkers();\n await this.pollRemoteCards();\n this._housekeepCounter++;\n if (this._housekeepCounter % 72 === 0) {\n this.pruneSkillTrash();\n this.rotateAuditLog();\n }\n }\n\n private checkStaleWorkers(): void {\n const STALE_MS = parseInt(process.env[\"WORKER_STALE_MS\"] || \"300000\", 10);\n const now = Date.now();\n for (const [, cardIds] of this.running) {\n for (const cardId of cardIds) {\n const card = kanbanGetCard(cardId);\n if (!card || card.status !== \"running\") continue;\n const lastActivity = new Date(card.updated_at + \"Z\").getTime();\n if (now - lastActivity > STALE_MS) {\n logWarn(TAG, `Stale card ${cardId} (${Math.round((now - lastActivity) / 1000)}s no activity) \u2014 failing`);\n kanbanFail(cardId, \"stale \u2014 no activity\");\n }\n }\n }\n }\n\n /** #613: Prune .trash/ entries older than 7 days (~hourly). */\n private pruneSkillTrash(): void {\n const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n const { existsSync, readdirSync, rmSync, statSync } = require(\"node:fs\") as typeof import(\"node:fs\");\n const { join } = require(\"node:path\") as typeof import(\"node:path\");\n const { abtarsHome } = require(\"../paths.js\") as typeof import(\"../paths.js\");\n const trashPath = join(abtarsHome(), \"skills\", \".trash\");\n if (!existsSync(trashPath)) return;\n const now = Date.now();\n for (const entry of readdirSync(trashPath)) {\n try {\n const full = join(trashPath, entry);\n const stat = statSync(full);\n if (now - stat.mtimeMs > SEVEN_DAYS_MS) {\n rmSync(full, { recursive: true });\n logInfo(\"skill-trash-prune\", `Pruned: ${entry}`);\n }\n } catch (err) { logAndSwallow(TAG, \"prune entry\", err); }\n }\n }\n\n /** #681: Rotate audit.jsonl when > 10MB, prune files older than 30 days (~hourly). */\n private rotateAuditLog(): void {\n const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1000;\n const { existsSync, statSync, renameSync, readdirSync, unlinkSync } = require(\"node:fs\") as typeof import(\"node:fs\");\n const { join } = require(\"node:path\") as typeof import(\"node:path\");\n const { abtarsHome } = require(\"../paths.js\") as typeof import(\"../paths.js\");\n const logsDir = join(abtarsHome(), \"logs\");\n const auditPath = join(logsDir, \"audit.jsonl\");\n if (!existsSync(auditPath)) return;\n try {\n const stat = statSync(auditPath);\n if (stat.size > 10 * 1024 * 1024) {\n const date = new Date().toISOString().slice(0, 10);\n renameSync(auditPath, join(logsDir, `audit-${date}.jsonl`));\n logInfo(\"audit-rotation\", `Rotated audit.jsonl (${(stat.size / 1024 / 1024).toFixed(1)}MB)`);\n }\n } catch (err) { logAndSwallow(TAG, \"audit rotate\", err); }\n const now = Date.now();\n try {\n for (const f of readdirSync(logsDir)) {\n if (!f.startsWith(\"audit-\") || !f.endsWith(\".jsonl\")) continue;\n const full = join(logsDir, f);\n const stat = statSync(full);\n if (now - stat.mtimeMs > THIRTY_DAYS_MS) {\n unlinkSync(full);\n logInfo(\"audit-rotation\", `Pruned: ${f}`);\n }\n }\n } catch (err) { logAndSwallow(TAG, \"audit prune\", err); }\n }\n\n private async pollRemoteCards(): Promise<void> {\n const remoteCards = kanbanList(\"running\", \"status\").filter(c => c.type === \"remote\");\n if (remoteCards.length === 0) return;\n const { getPeerTransport } = await import(\"./peer-transport/index.js\");\n const transport = getPeerTransport();\n const REMOTE_MAX_AGE_MS = 15 * 60 * 1000;\n for (const card of remoteCards) {\n try {\n const meta = JSON.parse(card.notes ?? \"{}\") as { peer?: string; remote_task_id?: number };\n if (!meta.peer || !meta.remote_task_id) continue;\n const cardAge = Date.now() - new Date(card.created_at + \"Z\").getTime();\n if (cardAge > REMOTE_MAX_AGE_MS) {\n kanbanFail(card.id, `remote task timeout (${Math.round(cardAge / 60000)}min)`);\n continue;\n }\n const result = await transport.checkTask(meta.peer, meta.remote_task_id);\n if (result.status === \"done\") kanbanComplete(card.id, null, result.result?.slice(0, 500) ?? \"completed\");\n else if (result.status === \"failed\") kanbanFail(card.id, result.error ?? \"remote task failed\");\n } catch {}\n }\n }\n\n private canDispatch(type: SessionType, _cardId: number): boolean {\n const max = MAX_CONCURRENT[type] ?? 5;\n if ((this.running.get(type)?.size ?? 0) >= max) return false;\n // #987: 2-min cooldown after H session ends\n if (type === \"H\" && Date.now() - this._lastHealerDoneAt < 120_000) return false;\n return true;\n }\n\n private markRunning(type: SessionType, cardId: number): void {\n if (!this.running.has(type)) this.running.set(type, new Set());\n this.running.get(type)!.add(cardId);\n }\n\n private markDone(type: SessionType, cardId: number): void {\n this.running.get(type)?.delete(cardId);\n if (type === \"H\") this._lastHealerDoneAt = Date.now();\n }\n\n private async execute(request: SpinRequest, cardId: number, timeoutMs: number): Promise<string> {\n if (!this.runtime) throw new Error(\"Spin: runtime not set\");\n if (request.type === \"O\") return this.executeOrc(request, cardId, timeoutMs);\n\n const agentName = request.agent ?? typeAgent(request.type);\n logInfo(TAG, `\u25B6 ${request.type} card:${cardId} agent=${agentName}`);\n\n const staleMs = parseInt(process.env[\"WORKER_STALE_MS\"] ?? \"300000\", 10);\n let lastActivityAt = Date.now();\n\n const timer = setTimeout(() => {\n logWarn(TAG, `\u23F1\uFE0F ${request.type} card:${cardId} timed out`);\n this.runtime?.interruptSpawn(`spin-${cardId}`);\n }, timeoutMs);\n\n const staleCheck = setInterval(() => {\n if (Date.now() - lastActivityAt > staleMs) {\n clearInterval(staleCheck);\n logWarn(TAG, `\u23F1\uFE0F ${request.type} card:${cardId} stale (no activity ${staleMs / 1000}s)`);\n this.runtime?.interruptSpawn(`spin-${cardId}`);\n }\n }, 60_000);\n\n try {\n const { buildSoulBundle } = await import(\"./soul-bundle.js\");\n const bundle = buildSoulBundle(request.type);\n let fullPrompt = bundle ? `${bundle}\\n\\n---\\n\\n${request.goal}` : request.goal;\n\n // #891: auto-inject channel messages for W/O sessions\n if (request.type === \"W\" || request.type === \"T\") {\n const { channelUnread } = await import(\"./tasks/kanban-channel.js\");\n const workerName = `Worker-${String(cardId).padStart(2, \"0\")}`;\n const parentCard = request.parentCardId ?? cardId;\n const msgs = channelUnread(parentCard, workerName);\n if (msgs.length > 0) {\n const lines = msgs.map(m => `[${m.from_agent}\u2192${m.to_agent}]${m.directive ? \" \u26A1\" : \"\"} ${m.message}`);\n fullPrompt = `[CHANNEL \u2014 ${msgs.length} message(s) for ${workerName}]\\n${lines.join(\"\\n\")}\\n[/CHANNEL]\\n\\n${fullPrompt}`;\n }\n }\n\n const result = (await this.runtime.complete(agentName, fullPrompt, { timeoutMs, session: \"fresh\" })) || \"(no output)\";\n if (this.memory) {\n const sid = `${request.type}_card${cardId}`;\n this.memory.recordMessage({ role: \"user\", content: request.goal, timestamp: Date.now(), userId: \"system\", sessionId: sid });\n this.memory.recordMessage({ role: \"assistant\", content: result, timestamp: Date.now(), userId: \"system\", sessionId: sid });\n }\n return result;\n } finally { clearTimeout(timer); clearInterval(staleCheck); }\n }\n\n private async executeOrc(request: SpinRequest, cardId: number, timeoutMs: number): Promise<string> {\n const { updateBridgeLockField } = await import(\"./transport/bridge-lock-transport.js\");\n const { setActiveOrcCard } = await import(\"./transport/orc-tools.js\");\n updateBridgeLockField(\"orc_active\", cardId);\n setActiveOrcCard(cardId);\n const orc = await this.getOrCreateOrc();\n logInfo(TAG, `\u25B6 O card:${cardId} (persistent Orc)`);\n\n // #993: Attach Orc transport to visible session \u2014 user can sneak in\n let orcSessionKey = \"orc:project\"; // fallback\n for (const [, s] of this.sessions) {\n if (s.id.includes(\"_O_\") && s.status !== \"ended\") {\n s.transport = orc.transport as any;\n s.status = \"ready\";\n orcSessionKey = s.id; // use proper ManagedSession ID as ACP session key\n break;\n }\n }\n const timer = setTimeout(() => { logWarn(TAG, `\u23F1\uFE0F O card:${cardId} timed out`); }, timeoutMs);\n try {\n const { buildSoulBundle } = await import(\"./soul-bundle.js\");\n const bundle = buildSoulBundle(\"O\");\n\n // #1005: CONTEXT wrapper (same pattern as Main)\n const { localDateTime } = await import(\"../utils/local-time.js\");\n const context = `[CONTEXT \u2014 do not respond to this section]\\n[PROJECT] card #${cardId}\\n[CURRENT TIME] ${localDateTime()}\\n[/CONTEXT]\\n\\n`;\n\n let fullPrompt = context + (bundle ? `${bundle}\\n\\n---\\n\\n${request.goal}` : request.goal);\n const { drainOrcNotifications } = await import(\"./spin-notifications.js\");\n const notifications = drainOrcNotifications(cardId);\n if (notifications.length) fullPrompt = notifications.join(\"\\n\") + \"\\n\\n\" + fullPrompt;\n\n // #891: Orc sees ALL channel messages on its card\n const { channelUnread } = await import(\"./tasks/kanban-channel.js\");\n const orcMsgs = channelUnread(cardId, \"Orc\");\n if (orcMsgs.length > 0) {\n const lines = orcMsgs.map(m => `[${m.from_agent}\u2192${m.to_agent}]${m.directive ? \" \u26A1\" : \"\"} ${m.message}`);\n fullPrompt = `[CHANNEL \u2014 ${orcMsgs.length} message(s)]\\n${lines.join(\"\\n\")}\\n[/CHANNEL]\\n\\n${fullPrompt}`;\n }\n\n const result = (await orc.sendPrompt(orcSessionKey, fullPrompt)) || \"(no output)\";\n if (this.memory) {\n this.memory.recordMessage({ role: \"user\", content: request.goal, timestamp: Date.now(), userId: \"system\", sessionId: orcSessionKey });\n this.memory.recordMessage({ role: \"assistant\", content: result, timestamp: Date.now(), userId: \"system\", sessionId: orcSessionKey });\n }\n return result;\n } finally { clearTimeout(timer); updateBridgeLockField(\"orc_active\", null); setActiveOrcCard(null); }\n }\n}\n\n/** #675: Fire result callback to the delegating peer. Fire-and-forget. */\nasync function fireCallback(peerName: string, taskId: number, status: \"done\" | \"failed\", result?: string, error?: string, artifacts?: Array<{ name: string; content: string }>, tokensUsed?: number): Promise<void> {\n try {\n const { getPeerTransport } = await import(\"./peer-transport/index.js\");\n const transport = getPeerTransport();\n const payload: Record<string, unknown> = { action: \"callback\", task_id: taskId, status, result_summary: result, error, tokens_used: tokensUsed ?? 0 };\n if (artifacts?.length) payload.artifacts = artifacts;\n await transport.send(peerName, { type: \"task\", payload });\n logInfo(TAG, `Callback fired to ${peerName} for card:${taskId} (${status})`);\n } catch (err) {\n logWarn(TAG, `Callback to ${peerName} failed (card:${taskId}): ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nexport const spin = new Spin();\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUO,SAAS,QAAQ,SAAyB,OAAqB;AACpE,UAAQ,IAAI,KAAK,IAAG,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE;AACrE,MAAI,QAAQ,IAAI,SAAS,QAAS,SAAQ,IAAI,MAAM;AACtD;AAEO,SAAS,gBACd,UAAuC,WACvC,MAAmB,QAAgB,UAAkB,QACrD,MACgD;AAChD,QAAM,MAAM,YAAY;AACxB,QAAM,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACvC,QAAM,UAA0B;AAAA,IAC9B,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IACjD;AAAA,IAAQ;AAAA,IAAU;AAAA,IAClB,UAAU;AAAA,IACV,QAAQ,MAAM,UAAU;AAAA,IACxB,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,cAAc,KAAK,IAAI;AAAA,IACvB,UAAU,MAAM;AAAA,IAChB,cAAc;AAAA,IAAG,YAAY;AAAA,IAAG,eAAe;AAAA,IAC/C,KAAK,CAAC;AAAA,IACN,YAAY;AAAA;AAAA,IAEZ,MAAM;AAAA,IAAO,OAAO,CAAC;AAAA,IAAG,UAAU;AAAA,IAAO,cAAc;AAAA,IACvD,MAAM;AAAA,IAAO,YAAY;AAAA,IAAO,WAAW;AAAA,IAAO,iBAAiB;AAAA,IACnE,cAAc,CAAC;AAAA,IAAG,aAAa,CAAC;AAAA,EAClC;AACA,WAAS,IAAI,QAAQ,IAAI,OAAO;AAChC,UAAQ,SAAS,SAAS;AAC1B,SAAO,EAAE,SAAS,WAAW,IAAI;AACnC;AAEO,SAAS,iBAAiB,UAAuC,QAAgB,UAA8C;AACpI,aAAW,KAAK,SAAS,OAAO,GAAG;AACjC,QAAI,EAAE,WAAW,UAAU,EAAE,aAAa,YAAY,EAAE,UAAU,EAAE,WAAW,QAAS,QAAO;AAAA,EACjG;AACA,SAAO;AACT;AAEO,SAAS,cACd,UAAuC,WACvC,QAAgB,UAAkB,MAAmB,QAAgB,aACZ;AACzD,QAAM,QAAQ,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,OAAO;AACrE,MAAI,MAAM,UAAU,YAAa,QAAO,yBAAyB,WAAW;AAG5E,QAAM,MAAM,iBAAiB,UAAU,QAAQ,QAAQ;AACvD,MAAI,IAAK,KAAI,SAAS;AAEtB,QAAM,SAAS,gBAAgB,UAAU,WAAW,MAAM,QAAQ,UAAU,QAAQ,EAAE,QAAQ,KAAK,CAAC;AACpG,SAAO;AACT;AAEO,SAAS,iBACd,UAAuC,WACvC,QAAgB,UAAkB,MAAmB,QAAgB,aACZ;AACzD,QAAM,QAAQ,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,OAAO;AACrE,MAAI,MAAM,UAAU,YAAa,QAAO;AAExC,QAAM,SAAS,iBAAiB,UAAU,QAAQ,QAAQ;AAC1D,SAAO,gBAAgB,UAAU,WAAW,MAAM,QAAQ,UAAU,QAAQ,EAAE,QAAQ,OAAO,UAAU,QAAQ,GAAG,CAAC;AACrH;AAEO,SAAS,SAAS,SAAkC;AAAE,SAAO,CAAC,CAAC,QAAQ;AAAM;AAE7E,SAAS,oBACd,UAAuC,WACvC,QAAgB,UAAkB,MAAmB,QACrD,MAAc,iBAAyB,aACkB;AACzD,QAAM,QAAQ,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,OAAO;AACrE,MAAI,MAAM,UAAU,YAAa,QAAO;AAExC,QAAM,SAAS,gBAAgB,UAAU,WAAW,MAAM,QAAQ,UAAU,QAAQ,EAAE,QAAQ,MAAM,CAAC;AACrG,SAAO,QAAQ,OAAO;AACtB,SAAO,QAAQ,kBAAkB;AACjC,UAAQ,OAAO,SAAS,WAAW,IAAI,GAAG;AAC1C,SAAO;AACT;AAEO,SAAS,cAAc,UAAuC,QAAgB,UAAkB,OAAwC;AAC7I,QAAM,SAAS,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,OAAK,EAAE,eAAe,SAAS,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM;AACrH,MAAI,CAAC,OAAQ,QAAO,YAAY,KAAK;AACrC,QAAM,MAAM,iBAAiB,UAAU,QAAQ,QAAQ;AACvD,MAAI,IAAK,KAAI,SAAS;AACtB,SAAO,SAAS;AAChB,SAAO;AACT;AAEO,SAAS,WAAW,UAAuC,WAAmB,QAAgB,UAAkB,OAAuE;AAC5L,QAAM,YAAY,SAAS,iBAAiB,UAAU,QAAQ,QAAQ,GAAG;AACzE,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,SAAS,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,OAAK,EAAE,eAAe,aAAa,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM;AACzH,MAAI,CAAC,OAAQ,QAAO,YAAY,SAAS;AAEzC,QAAM,aAAa,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,OAAK,YAAY,CAAC,MAAM,OAAO,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM;AAE3H,SAAO,SAAS;AAChB,SAAO,SAAS;AAChB,UAAQ,QAAQ,OAAO;AAGvB,MAAI,YAAY,MAAM,MAAM,OAAO,WAAW,UAAU,GAAG;AACzD,UAAM,SAAS,gBAAgB,UAAU,WAAW,KAAK,QAAQ,UAAU,OAAO,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAC1G,WAAO,EAAE,OAAO,QAAQ,WAAW,OAAO,UAAU;AAAA,EACtD;AAGA,MAAI,UAAU,UAAa,OAAO,QAAQ;AACxC,UAAM,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,OAAK,YAAY,CAAC,MAAM,OAAO,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM;AACnH,QAAI,KAAM,MAAK,SAAS;AAAA,EAC1B;AAEA,SAAO,EAAE,OAAO,QAAQ,UAAU;AACpC;AAEO,SAAS,YAAY,UAAuC,WAAmB,QAAgB,UAAkB,OAAuE;AAC7L,QAAM,SAAS,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,OAAK,EAAE,eAAe,SAAS,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM;AACrH,MAAI,CAAC,OAAQ,QAAO,YAAY,KAAK;AAErC,SAAO,SAAS;AAChB,SAAO,SAAS;AAChB,UAAQ,QAAQ,QAAQ;AAGxB,QAAM,aAAa,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,OAAK,YAAY,CAAC,MAAM,OAAO,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM;AAC3H,MAAI,YAAY,MAAM,MAAM,OAAO,WAAW,WAAW,GAAG;AAC1D,UAAM,SAAS,gBAAgB,UAAU,WAAW,KAAK,QAAQ,UAAU,OAAO,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAC1G,WAAO,EAAE,QAAQ,QAAQ,WAAW,OAAO,UAAU;AAAA,EACvD;AAGA,MAAI,CAAC,iBAAiB,UAAU,QAAQ,QAAQ,GAAG;AACjD,UAAM,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,OAAK,YAAY,CAAC,MAAM,OAAO,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM;AACnH,QAAI,KAAM,MAAK,SAAS;AAAA,EAC1B;AAEA,SAAO,EAAE,QAAQ,QAAQ,UAAU;AACrC;AAEO,SAAS,aAAa,UAAuC,QAAgB,UAAkB,OAAyC;AAC7I,QAAM,YAAY,SAAS,iBAAiB,UAAU,QAAQ,QAAQ,GAAG;AACzE,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,SAAS,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,OAAK,EAAE,eAAe,aAAa,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM;AACzH,MAAI,CAAC,OAAQ,QAAO,YAAY,SAAS;AACzC,MAAI,OAAO,WAAW,SAAU,QAAO,YAAY,SAAS;AAC5D,SAAO,SAAS;AAChB,UAAQ,QAAQ,QAAQ;AACxB,SAAO;AACT;AAEO,SAAS,cAAc,UAAuC,QAAgB,UAAkB,OAAyC;AAC9I,QAAM,YAAY,SAAS,iBAAiB,UAAU,QAAQ,QAAQ,GAAG;AACzE,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,SAAS,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,OAAK,EAAE,eAAe,aAAa,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM;AACzH,MAAI,CAAC,OAAQ,QAAO,YAAY,SAAS;AACzC,MAAI,OAAO,WAAW,SAAU,QAAO,YAAY,SAAS;AAC5D,SAAO,SAAS;AAChB,UAAQ,QAAQ,SAAS;AACzB,SAAO;AACT;AAEO,SAAS,aAAa,UAAuC,QAAgB,UAAoC;AACtH,SAAO,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,UAAU,EAAE,aAAa,YAAY,EAAE,WAAW,OAAO;AAClH;AAEO,SAAS,gBAAgB,UAAyD;AACvF,SAAO,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,OAAO;AAChE;AAMO,SAAS,WAAW,UAAuC,QAAgB,UAAkB,UAAU,OAAe;AAC3H,QAAM,OAAO,UAAU,gBAAgB,QAAQ,IAAI,aAAa,UAAU,QAAQ,QAAQ;AAC1F,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,SAAO,KAAK,IAAI,OAAK;AACnB,UAAM,SAAS,EAAE,UAAU,EAAE,WAAW,SAAS,OAAO;AACxD,UAAM,QAAQ,WAAW,EAAE,WAAW,SAAS,KAAK,EAAE,MAAM,MAAM;AAClE,UAAM,KAAK,CAAC,EAAE,UAAU,YAAY,CAAC,MAAM,MAAM,UAAU;AAC3D,UAAM,SAAS,EAAE,WAAW,WAAW,YAAO;AAC9C,UAAM,SAAS,EAAE,OAAO,aAAa,EAAE,IAAI,MAAM;AACjD,UAAM,QAAQ,EAAE,QAAQ,IAAI,EAAE,KAAK,KAAK;AACxC,UAAM,KAAK,EAAE,OAAO,KAAK,EAAE,IAAI,MAAM;AACrC,UAAM,OAAO,IAAI,KAAK,iBAAiB,CAAC,CAAC,EAAE,mBAAmB,SAAS,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC;AAC7G,UAAM,OAAO,EAAE,OAAO,SAAS,QAAQ,KAAK,OAAO,KAAK,IAAI,IAAI,EAAE,gBAAgB,GAAK,CAAC;AACxF,UAAM,UAAU,EAAE,eAAe,MAAM,EAAE,YAAY,UAAU;AAC/D,WAAO,IAAI,EAAE,UAAU,IAAI,UAAU,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,KAAK,WAAM,IAAI,GAAG,MAAM,GAAG,MAAM,MAAM,IAAI,GAAG,OAAO;AAAA,EACzI,CAAC,EAAE,KAAK,IAAI;AACd;AA5MA,IAQM;AARN;AAAA;AAAA;AAMA;AAEA,IAAM,UAAU;AAAA;AAAA;;;ACJhB,SAAS,kBAAkB,yBAAyB;AACpD,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,YAAY;AACrB,SAAS,eAAe;AASxB,SAAS,UAAgB;AACvB,MAAI,IAAK;AACT,MAAI;AACF,UAAM,aAAa,oBAAoB;AACvC,iBAAa,aAAa,+BAA+B;AAAA,EAC3D,QAAQ;AACN,aAAS,yBAAyB,OAAO,sDAAsD,EAAE,OAAO,OAAO,CAAC;AAChH,UAAM,aAAa,oBAAoB;AACvC,iBAAa,aAAa,+BAA+B;AAAA,EAC3D;AACF;AAEA,SAAS,YAAiB;AACxB,QAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,+BAA+B;AAC9D,UAAQ;AACR,SAAO,IAAI,IAAI,SAAS;AAAA,IACtB;AAAA,IACA,QAAQ,QAAQ,IAAI,oBAAoB,KAAK;AAAA,IAC7C,aAAa,EAAE,aAAa,QAAQ,IAAI,iBAAiB,KAAK,IAAI,iBAAiB,QAAQ,IAAI,oBAAoB,KAAK,GAAG;AAAA,EAC7H,CAAC;AACH;AAEA,SAAS,SAAiB;AACxB,SAAO,QAAQ,IAAI,oBAAoB,KAAK;AAC9C;AAEA,eAAsB,OAAO,WAAmB,YAAqC;AACnF,QAAM,SAAS,UAAU;AACzB,QAAM,SAAS,iBAAiB,SAAS;AACzC,QAAM,OAAO,KAAK,IAAI,IAAI,iBAAiB,EAAE,QAAQ,OAAO,GAAG,KAAK,YAAY,MAAM,OAAO,CAAC,CAAC;AAC/F,SAAO,GAAG,QAAQ,IAAI,sBAAsB,CAAC,IAAI,OAAO,CAAC,IAAI,UAAU;AACzE;AAEA,eAAsB,SAAS,YAAoB,WAAkC;AACnF,QAAM,SAAS,UAAU;AACzB,QAAM,OAAO,MAAM,OAAO,KAAK,IAAI,IAAI,iBAAiB,EAAE,QAAQ,OAAO,GAAG,KAAK,WAAW,CAAC,CAAC;AAC9F,QAAM,SAAS,KAAK,MAAkB,kBAAkB,SAAS,CAAC;AACpE;AAxDA,IAYM,SACA,cAEF,KACA;AAhBJ;AAAA;AAAA;AAYA,IAAM,UAAU,KAAK,QAAQ,IAAI,aAAa,KAAK,KAAK,QAAQ,GAAG,SAAS,GAAG,KAAK;AACpF,IAAM,eAAe,cAAc,KAAK,SAAS,gBAAgB,iBAAiB,CAAC;AAAA;AAAA;;;ACbnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc,gBAAgB;AACvC,SAAS,gBAAgB;AAUlB,SAAS,eAAe,QAA8C;AAC3E,QAAM,OAAO,iBAAiB,IAAI,MAAM;AACxC,MAAI,KAAM,kBAAiB,OAAO,MAAM;AACxC,SAAO;AACT;AArBA,IAaM,kBAEA,gBAQO,oBAkCA,kBAqBA;AA9Eb;AAAA;AAAA;AAKA;AAQA,IAAM,mBAAmB,oBAAI,IAA8B;AAE3D,IAAM,iBAAiB;AAQhB,IAAM,qBAAqC;AAAA,MAChD,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM,EAAE,MAAM,UAAU,aAAa,sCAAsC;AAAA,UAC3E,SAAS,EAAE,MAAM,UAAU,aAAa,qCAAqC;AAAA,QAC/E;AAAA,QACA,UAAU,CAAC,QAAQ,SAAS;AAAA,MAC9B;AAAA,MACA,MAAM,QAAQ,MAAuB;AACnC,cAAM,WAAW,KAAK,MAAM;AAC5B,cAAM,SAAS,SAAS,KAAK,SAAS,KAAK,KAAK,EAAE;AAClD,YAAI,CAAC,SAAU,QAAO,KAAK,UAAU,EAAE,OAAO,mBAAmB,CAAC;AAClE,YAAI,CAAC,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,sBAAsB,CAAC;AAEnE,YAAI;AACF,gBAAM,OAAO,SAAS,QAAQ;AAC9B,cAAI,KAAK,OAAO,gBAAgB;AAC9B,mBAAO,KAAK,UAAU,EAAE,OAAO,mBAAmB,KAAK,IAAI,eAAe,cAAc,IAAI,CAAC;AAAA,UAC/F;AACA,gBAAM,UAAU,aAAa,QAAQ,EAAE,SAAS,QAAQ;AACxD,gBAAM,OAAO,SAAS,QAAQ;AAC9B,gBAAM,OAAO,iBAAiB,IAAI,MAAM,KAAK,CAAC;AAC9C,eAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC3B,2BAAiB,IAAI,QAAQ,IAAI;AACjC,iBAAO,KAAK,UAAU,EAAE,IAAI,MAAM,MAAM,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAO,CAAC;AAAA,QAChF,SAAS,KAAK;AACZ,iBAAO,KAAK,UAAU,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAEO,IAAM,mBAAmC;AAAA,MAC9C,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,UACzE,aAAa,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,QACtF;AAAA,QACA,UAAU,CAAC,cAAc,aAAa;AAAA,MACxC;AAAA,MACA,MAAM,QAAQ,MAAuB;AACnC,YAAI;AACF,gBAAM,MAAM,MAAM,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,aAAa,KAAK,EAAE;AAC5E,iBAAO,KAAK,UAAU,EAAE,IAAI,MAAM,IAAI,CAAC;AAAA,QACzC,SAAS,KAAK;AACZ,iBAAO,KAAK,UAAU,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAEO,IAAM,mBAAmC;AAAA,MAC9C,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,UACpF,YAAY,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,QACpF;AAAA,QACA,UAAU,CAAC,eAAe,YAAY;AAAA,MACxC;AAAA,MACA,MAAM,QAAQ,MAAuB;AACnC,YAAI;AACF,gBAAM,SAAS,KAAK,aAAa,KAAK,IAAI,KAAK,YAAY,KAAK,EAAE;AAClE,iBAAO,KAAK,UAAU,EAAE,IAAI,MAAM,MAAM,KAAK,YAAY,EAAE,CAAC;AAAA,QAC9D,SAAS,KAAK;AACZ,iBAAO,KAAK,UAAU,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACjGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoqBA,eAAe,aAAa,UAAkB,QAAgB,QAA2B,QAAiB,OAAgB,WAAsD,YAAoC;AAClN,MAAI;AACF,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,8BAA2B;AACrE,UAAM,YAAY,iBAAiB;AACnC,UAAM,UAAmC,EAAE,QAAQ,YAAY,SAAS,QAAQ,QAAQ,gBAAgB,QAAQ,OAAO,aAAa,cAAc,EAAE;AACpJ,QAAI,WAAW,OAAQ,SAAQ,YAAY;AAC3C,UAAM,UAAU,KAAK,UAAU,EAAE,MAAM,QAAQ,QAAQ,CAAC;AACxD,YAAQ,KAAK,qBAAqB,QAAQ,aAAa,MAAM,KAAK,MAAM,GAAG;AAAA,EAC7E,SAAS,KAAK;AACZ,YAAQ,KAAK,eAAe,QAAQ,iBAAiB,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,EACrH;AACF;AA/qBA,IAqBM,KACA,sBACA,uBACA,oBACA,2BACA,oBAEA,gBAIO,MAipBA;AAjrBb;AAAA;AAKA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAGA;AAGA,IAAM,MAAM;AACZ,IAAM,uBAAuB,SAAS,QAAQ,IAAI,sBAAsB,KAAK,WAAW,EAAE;AAC1F,IAAM,wBAAwB,SAAS,QAAQ,IAAI,uBAAuB,KAAK,WAAW,EAAE;AAC5F,IAAM,qBAAqB,SAAS,QAAQ,IAAI,oBAAoB,KAAK,MAAM,EAAE;AACjF,IAAM,4BAA4B;AAClC,IAAM,qBAAqB,KAAK;AAEhC,IAAM,iBAAuD;AAAA,MAC3D,GAAG;AAAA,MAAG,GAAG;AAAA,MAAG,GAAG;AAAA,MAAG,GAAG;AAAA,MAAG,GAAG;AAAA,MAAG,GAAG;AAAA,IACnC;AAEO,IAAM,OAAN,MAAW;AAAA,MACR,WAAW,oBAAI,IAA4B;AAAA,MAC3C,YAAY;AAAA,MACZ,UAAU,oBAAI,IAA8B;AAAA,MAC5C,UAAkC;AAAA,MAClC,SAAwI;AAAA,MACxI,aAAkC;AAAA,MAClC,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,MAE5B,WAAW,SAAgC;AAAE,aAAK,UAAU;AAAA,MAAS;AAAA,MACrE,UAAU,QAA8B;AAAE,aAAK,SAAS;AAAA,MAAQ;AAAA;AAAA,MAIhE,iBAAiB,QAAgB,UAAkC;AACjE,YAAI,IAAa,iBAAiB,KAAK,UAAU,QAAQ,QAAQ;AACjE,YAAI,CAAC,GAAG;AAEN,gBAAM,IAAa,gBAAgB,KAAK,UAAU,KAAK,WAAW,KAAK,QAAQ,UAAU,GAAG,EAAE,QAAQ,KAAK,CAAC;AAC5G,eAAK,YAAY,EAAE;AACnB,cAAI,EAAE;AAAA,QACR;AACA,eAAO;AAAA,MACT;AAAA,MAEA,mBAAmB,QAAgB,UAA0B;AAC3D,eAAO,KAAK,iBAAiB,QAAQ,QAAQ,EAAE;AAAA,MACjD;AAAA,MAEA,cAAc,QAAgB,UAAkB,MAA4C;AAE1F,aAAK,iBAAiB,QAAQ,QAAQ;AACtC,cAAM,IAAa,cAAc,KAAK,UAAU,KAAK,WAAW,QAAQ,UAAU,MAAM,GAAG,kBAAkB;AAC7G,YAAI,OAAO,MAAM,SAAU,QAAO;AAClC,aAAK,YAAY,EAAE;AACnB,eAAO,EAAE;AAAA,MACX;AAAA,MAEA,iBAAiB,QAAgB,UAAkB,MAA4C;AAC7F,cAAM,IAAa,iBAAiB,KAAK,UAAU,KAAK,WAAW,QAAQ,UAAU,MAAM,GAAG,kBAAkB;AAChH,YAAI,OAAO,MAAM,SAAU,QAAO;AAClC,aAAK,YAAY,EAAE;AACnB,eAAO,EAAE;AAAA,MACX;AAAA,MAEA,oBAAoB,QAAgB,UAAkB,MAAmB,MAAc,iBAAkD;AACvI,cAAM,IAAa,oBAAoB,KAAK,UAAU,KAAK,WAAW,QAAQ,UAAU,MAAM,GAAG,MAAM,iBAAiB,kBAAkB;AAC1I,YAAI,OAAO,MAAM,SAAU,QAAO;AAClC,aAAK,YAAY,EAAE;AACnB,eAAO,EAAE;AAAA,MACX;AAAA,MAEA,cAAc,QAAgB,UAAkB,OAAwC;AACtF,eAAgB,cAAc,KAAK,UAAU,QAAQ,UAAU,KAAK;AAAA,MACtE;AAAA,MAEA,WAAW,QAAgB,UAAkB,OAAyC;AACpF,cAAM,IAAa,WAAW,KAAK,UAAU,KAAK,WAAW,QAAQ,UAAU,KAAK;AACpF,YAAI,OAAO,MAAM,SAAU,QAAO;AAClC,aAAK,YAAY,EAAE;AACnB,eAAO,EAAE;AAAA,MACX;AAAA,MAEA,YAAY,QAAgB,UAAkB,OAAwC;AACpF,cAAM,IAAa,YAAY,KAAK,UAAU,KAAK,WAAW,QAAQ,UAAU,KAAK;AACrF,YAAI,OAAO,MAAM,SAAU,QAAO;AAClC,aAAK,YAAY,EAAE;AACnB,eAAO,EAAE;AAAA,MACX;AAAA,MAEA,aAAa,QAAgB,UAAkB,OAAyC;AACtF,eAAgB,aAAa,KAAK,UAAU,QAAQ,UAAU,KAAK;AAAA,MACrE;AAAA,MAEA,cAAc,QAAgB,UAAkB,OAAyC;AACvF,eAAgB,cAAc,KAAK,UAAU,QAAQ,UAAU,KAAK;AAAA,MACtE;AAAA,MAEA,aAAa,QAAgB,UAAuE;AAClG,cAAM,OAAgB,aAAa,KAAK,UAAU,QAAQ,QAAQ;AAClE,cAAM,SAAS,KAAK,KAAK,OAAK,EAAE,MAAM;AACtC,eAAO,EAAE,UAAU,MAAM,aAAa,QAAQ,cAAc,EAAE;AAAA,MAChE;AAAA,MAEA,kBAAoC;AAClC,eAAgB,gBAAgB,KAAK,QAAQ;AAAA,MAC/C;AAAA,MAEA,eAAe,WAA+C;AAC5D,eAAO,KAAK,SAAS,IAAI,SAAS;AAAA,MACpC;AAAA,MAEA,WAAW,QAAgB,UAAkB,UAAU,OAAe;AACpE,eAAgB,WAAW,KAAK,UAAU,QAAQ,UAAU,OAAO;AAAA,MACrE;AAAA,MAEA,WAAiB;AAAE,aAAK,SAAS,MAAM;AAAG,aAAK,YAAY;AAAA,MAAG;AAAA;AAAA,MAItD,gBAAgB;AAAA,MAChB,mBAAiE;AAAA,MAEzE,sBAAsB,MAA6F;AACjH,cAAM,UAAU,KAAK,iBAAiB,KAAK,QAAQ,KAAK,QAAQ;AAChE,gBAAQ,YAAY,KAAK;AACzB,gBAAQ,WAAW;AACnB,gBAAQ,gBAAgB;AACxB,gBAAQ,SAAS,KAAK;AACtB,gBAAQ,SAAS;AACjB,gBAAQ,eAAe,KAAK,IAAI;AAChC,cAAM,IAAI,KAAK;AACf,gBAAQ,MAAM,GAAG,YAAY,OAAO,GAAG,OAAO,OAAO;AACrD,gBAAQ,SAAS,2BAA2B;AAC5C,gBAAQ,KAAK,8BAA8B,KAAK,MAAM,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,GAAG,QAAQ,MAAM,QAAQ,QAAQ,GAAG,KAAK,EAAE,GAAG;AAGrI,aAAK,cAAc,EAAE,QAAQ,KAAK,QAAQ,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS;AACvF,aAAK,gBAAgB;AAAA,MACvB;AAAA;AAAA,MAGA,mBAAmB,SAAsD;AACvE,aAAK,mBAAmB;AACxB,aAAK,gBAAgB;AAAA,MACvB;AAAA,MAEQ,cAA2E;AAAA,MAE3E,kBAAwB;AAC9B,YAAI,KAAK,iBAAiB,CAAC,KAAK,oBAAoB,CAAC,KAAK,YAAa;AACvE,aAAK,gBAAgB;AACrB,cAAM,EAAE,QAAQ,QAAQ,SAAS,IAAI,KAAK;AAC1C,cAAM,UAAU,KAAK,iBAAiB,QAAQ,QAAQ;AACtD,aAAK,aAAa,SAAS,QAAQ,MAAM;AAAA,MAC3C;AAAA;AAAA,MAGA,aAAa,SAAyB,QAAgB,QAAgB,SAAuD;AAC3H,cAAM,OAAO,YAAY,OAAO;AAChC,YAAI,SAAS,OAAO,SAAS,IAAK;AAClC,YAAI,QAAQ,eAAe,EAAG;AAC9B,cAAM,IAAI,WAAW,KAAK;AAC1B,YAAI,CAAC,EAAG;AAER,YAAI,UAAU;AACd,cAAM,SAAS,MAAY;AACzB;AACA,YAAE,cAAc;AAAA,YACd,UAAU,QAAQ;AAAA,YAClB,WAAW,OAAO,MAAM;AAAA,YACxB;AAAA,YACA,UAAU,OAAO,MAAM;AAAA,YACvB,YAAY;AAAA,YACZ,MAAM;AAAA,YACN,WAAW,KAAK,IAAI;AAAA,YACpB,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AACD,qBAAW,MAAM;AACf,gBAAI,QAAQ,eAAe,EAAG;AAC9B,gBAAI,QAAQ,KAAM;AAClB,gBAAI,WAAW,GAAG;AAAE,sBAAQ,KAAK,kCAAkC;AAAG;AAAA,YAAQ;AAC9E,oBAAQ,KAAK,oBAAoB,OAAO,iCAA4B;AACpE,mBAAO;AAAA,UACT,GAAG,GAAM;AAAA,QACX;AAEA,YAAI,QAAQ,WAAW,SAAS;AAC9B,iBAAO;AAAA,QACT,WAAW,QAAQ,WAAW;AAC5B,kBAAQ,UAAU,UAAU,MAAM,OAAO;AAAA,QAC3C;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,QAAgB,UAAkB,QAAyC;AAC9F,cAAM,UAAU,KAAK,iBAAiB,QAAQ,QAAQ;AAEtD,YAAI,QAAQ,WAAW;AACrB,kBAAQ,eAAe,KAAK,IAAI;AAChC,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,WAAW,QAAS,OAAM,IAAI,MAAM,uCAAkC;AAElF,cAAM,QAAQ,KAAK,gBAAgB,EAAE,OAAO,OAAK,EAAE,SAAS,EAAE;AAC9D,YAAI,SAAS,mBAAoB,OAAM,IAAI,MAAM,0CAA0C;AAE3F,gBAAQ,SAAS;AACjB,gBAAQ,SAAS;AACjB,cAAM,WAAW,UAAU;AAC3B,cAAM,OAAO,SAAS,SAAS,IAAI,MAAM;AACzC,cAAM,OAAO,MAAM,QAAQ;AAC3B,gBAAQ,gBAAgB,SAAS,WAAW,WAAW,SAAS,UAAU,wBAAwB;AAClG,gBAAQ,WAAW,SAAS,WAAW,cAAc;AAErD,gBAAQ,SAAS,uBAAuB,IAAI,GAAG;AAC/C,gBAAQ,KAAK,0BAA0B,MAAM,KAAK,IAAI,GAAG;AAEzD,YAAI;AACF,gBAAM,eAAe,MAAM,QAAQ,KAAK;AAAA,YACtC,KAAK,QAAS,QAAQ,aAAa,MAAM;AAAA,YACzC,IAAI,QAAe,CAAC,GAAG,QAAQ,WAAW,MAAM,IAAI,IAAI,MAAM,4BAA4B,CAAC,GAAG,yBAAyB,CAAC;AAAA,UAC1H,CAAC;AACD,kBAAQ,YAAY,aAAa;AACjC,kBAAQ,SAAS;AACjB,kBAAQ,eAAe,KAAK,IAAI;AAChC,gBAAM,IAAI,QAAQ;AAClB,kBAAQ,MAAM,GAAG,YAAY,OAAO,GAAG,OAAO,OAAO;AACrD,kBAAQ,SAAS,iBAAiB;AAClC,kBAAQ,KAAK,kBAAkB,MAAM,OAAO,QAAQ,EAAE,GAAG,QAAQ,MAAM,QAAQ,QAAQ,GAAG,KAAK,EAAE,EAAE;AACnG,iBAAO;AAAA,QACT,SAAS,KAAK;AACZ,kBAAQ,SAAS;AACjB,kBAAQ,SAAS,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC7E,kBAAQ,KAAK,+BAA+B,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACzG,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,eAAe,QAAgB,WAA0B;AACvD,mBAAW,KAAK,KAAK,SAAS,OAAO,GAAG;AACtC,cAAI,EAAE,WAAW,OAAQ;AACzB,cAAI,aAAa,EAAE,OAAO,UAAW;AACrC,cAAI,EAAE,kBAAkB,SAAU;AAClC,cAAI,EAAE,WAAW;AAAE,gBAAI;AAAE,gBAAE,UAAU,QAAQ;AAAA,YAAG,QAAQ;AAAA,YAAC;AAAE,cAAE,YAAY;AAAA,UAAW;AACpF,YAAE,SAAS;AACX,YAAE,SAAS;AACX,kBAAQ,GAAG,WAAW;AACtB,kBAAQ,KAAK,sBAAsB,MAAM,OAAO,EAAE,EAAE,EAAE;AAAA,QACxD;AAAA,MACF;AAAA,MAEA,aAAmB;AACjB,mBAAW,KAAK,KAAK,SAAS,OAAO,GAAG;AACtC,cAAI,EAAE,WAAW;AAAE,gBAAI;AAAE,gBAAE,UAAU,QAAQ;AAAA,YAAG,QAAQ;AAAA,YAAC;AAAA,UAAE;AAAA,QAC7D;AACA,YAAI,KAAK,YAAY;AAAE,cAAI;AAAE,iBAAK,WAAW,QAAQ;AAAA,UAAG,QAAQ;AAAA,UAAC;AAAE,eAAK,aAAa;AAAA,QAAM;AAC3F,aAAK,SAAS,MAAM;AACpB,aAAK,YAAY;AACjB,gBAAQ,KAAK,mCAAmC;AAAA,MAClD;AAAA;AAAA,MAIA,MAAM,OAAO,QAAgB,QAAgB,MAAsD;AACjG,cAAM,WAAW,UAAU;AAC3B,cAAM,OAAO,SAAS,SAAS,IAAI,MAAM;AACzC,YAAI,CAAC,MAAM;AAAE,kBAAQ,KAAK,wBAAwB,MAAM,EAAE;AAAG,iBAAO;AAAA,QAAM;AAC1E,cAAM,SAAS,KAAK,UAAU,YAAY,KAAK,UAAU;AACzD,YAAI,CAAC,QAAQ;AAAE,kBAAQ,KAAK,yBAAyB,MAAM,EAAE;AAAG,iBAAO;AAAA,QAAM;AAC7E,cAAM,WAAW,KAAK,UAAU,WAAW,aAAa;AACxD,cAAM,gBAAgB,OAAO,WAAW,WAAW,SAAS,SAAS,OAAO,MAAM,GAAG,EAAE;AAEvF,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,eAAe,QAAQ,UAAU,aAAa;AACzE,cAAI,CAAC,QAAQ,WAAW;AAAE,oBAAQ,KAAK,4BAA4B,MAAM,EAAE;AAAG,mBAAO;AAAA,UAAM;AAC3F,gBAAM,WAAW,MAAM,QAAQ,UAAU,WAAW,GAAG,MAAM,WAAW,QAAQ,QAAW,MAAM;AACjG,kBAAQ;AACR,kBAAQ,SAAS,mBAAmB,MAAM,WAAW,IAAI,GAAG;AAC5D,kBAAQ,KAAK,uBAAuB,MAAM,KAAK,SAAS,MAAM,mBAAmB,MAAM,WAAW,IAAI,GAAG;AACzG,iBAAQ,MAAM,WAAW,OAAQ,WAAW;AAAA,QAC9C,SAAS,KAAK;AACZ,kBAAQ,KAAK,qBAAqB,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC/F,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,QAAgB,QAAwC;AAC3E,YAAI,CAAC,KAAK,kBAAkB;AAAE,kBAAQ,KAAK,4BAA4B;AAAG,iBAAO;AAAA,QAAM;AACvF,cAAM,WAAW,UAAU;AAC3B,cAAM,OAAO,SAAS,SAAS,IAAI,MAAM;AACzC,YAAI,CAAC,MAAM;AAAE,kBAAQ,KAAK,wBAAwB,MAAM,EAAE;AAAG,iBAAO;AAAA,QAAM;AAC1E,cAAM,SAAS,KAAK,UAAU,YAAY,KAAK,UAAU;AACzD,YAAI,CAAC,QAAQ;AAAE,kBAAQ,KAAK,yBAAyB,MAAM,EAAE;AAAG,iBAAO;AAAA,QAAM;AAC7E,cAAM,WAAW,KAAK,UAAU,WAAW,aAAa;AACxD,aAAK,iBAAiB,cAAc;AAAA,UAClC;AAAA,UACA,WAAW,OAAO,MAAM;AAAA,UACxB;AAAA,UACA,UAAU,OAAO,MAAM;AAAA,UACvB,YAAY;AAAA,UACZ,MAAM;AAAA,UACN,WAAW,KAAK,IAAI;AAAA,UACpB,SAAS;AAAA,UACT,SAAS;AAAA,QACX,CAAC;AACD,gBAAQ,KAAK,0CAA0C,MAAM,EAAE;AAC/D,eAAO;AAAA,MACT;AAAA;AAAA,MAIA,gBAAqC;AAAE,eAAO,KAAK,YAAY,UAAU,KAAK,aAAa;AAAA,MAAM;AAAA,MAEjG,MAAM,cAAc,SAAyC;AAC3D,cAAM,MAAM,KAAK,cAAc;AAC/B,YAAI,CAAC,IAAK,QAAO;AACjB,cAAM,WAAW,MAAM,IAAI,WAAW,YAAY,UAAU,OAAO,EAAE;AACrE,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,iBAAwC;AACpD,YAAI,KAAK,YAAY,QAAS,QAAO,KAAK;AAC1C,gBAAQ,KAAK,iCAAiC;AAC9C,aAAK,aAAa,MAAM,KAAK,QAAS,QAAQ,SAAS;AACvD,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA,MAKQ,0BAA0B,QAAgB,MAA+C;AAC/F,YAAI,SAAS,KAAK;AAChB,qBAAW,KAAK,KAAK,SAAS,OAAO,GAAG;AACtC,gBAAI,EAAE,GAAG,SAAS,KAAK,KAAK,EAAE,WAAW,QAAS,QAAO;AAAA,UAC3D;AAAA,QACF;AACA,cAAM,MAAM,KAAK,iBAAiB,QAAQ,YAAY,IAAI;AAC1D,eAAO,OAAO,QAAQ,WAAW,SAAY;AAAA,MAC/C;AAAA,MAEA,SAAS,SAA8D;AACrE,cAAM,YAAY,QAAQ,SAAS,QAAQ,KAAK,MAAM,GAAG,EAAE;AAC3D,cAAM,SAAS,QAAQ,UAAU,cAAc,WAAW,QAAQ,QAAQ,QAAW;AAAA,UACnF,UAAU,QAAQ,YAAY;AAAA,UAAU,MAAM,QAAQ;AAAA,UACtD,WAAW,QAAQ;AAAA,UAAc,cAAc,QAAQ;AAAA,UACvD,OAAO,QAAQ,eAAe,KAAK,UAAU,EAAE,eAAe,QAAQ,aAAa,CAAC,IAAI;AAAA,UACxF,QAAQ,QAAQ;AAAA,UAAQ,YAAY,QAAQ;AAAA,QAC9C,CAAC;AAED,YAAI,CAAC,KAAK,YAAY,QAAQ,MAAM,MAAM,GAAG;AAC3C,kBAAQ,KAAK,GAAG,QAAQ,IAAI,SAAS,MAAM,4BAA4B;AACvE,iBAAO,EAAE,OAAO;AAAA,QAClB;AAEA,aAAK,YAAY,QAAQ,MAAM,MAAM;AACrC,sBAAc,MAAM;AAEpB,cAAM,eAAe,gBAAgB;AACrC,cAAM,UAAU,KAAK,0BAA0B,cAAc,QAAQ,IAAI;AACzE,YAAI,SAAS;AAAE,kBAAQ,OAAO,QAAQ,OAAO,MAAM,GAAG,EAAE;AAAG,kBAAQ,SAAS,iBAAiB,MAAM,EAAE;AAAA,QAAG;AAExG,cAAM,UAAU,QAAQ,aAAa;AACrC,aAAK,QAAQ,SAAS,QAAQ,OAAO,EAClC,KAAK,YAAU;AACd,gBAAM,EAAE,gBAAAA,gBAAe,IAAI;AAC3B,gBAAM,YAAYA,gBAAe,MAAM;AACvC,yBAAe,QAAQ,MAAM,OAAO,MAAM,GAAG,GAAG,CAAC;AACjD,cAAI,QAAQ,cAAc;AACxB,kBAAM,OAAO,cAAc,MAAM;AACjC,yBAAa,QAAQ,cAAc,QAAQ,QAAQ,OAAO,MAAM,GAAG,GAAG,GAAG,QAAW,WAAW,MAAM,eAAe,CAAC;AAAA,UACvH;AAAA,QACF,CAAC,EACA,MAAM,SAAO;AACZ,gBAAM,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,MAAM,GAAG,GAAI;AAC5E,kBAAQ,KAAK,GAAG,QAAQ,IAAI,SAAS,MAAM,YAAY,GAAG,EAAE;AAC5D,4BAAkB,QAAQ,GAAG;AAC7B,cAAI,QAAQ,aAAc,cAAa,QAAQ,cAAc,QAAQ,UAAU,QAAW,GAAG;AAAA,QAC/F,CAAC,EACA,QAAQ,MAAM;AACb,eAAK,SAAS,QAAQ,MAAM,MAAM;AAClC,cAAI,SAAS;AAAE,oBAAQ,SAAS;AAAS,oBAAQ,SAAS;AAAO,oBAAQ,SAAS,WAAW;AAAA,UAAG;AAChG,eAAK,YAAY;AAAA,QACnB,CAAC;AAEH,eAAO,EAAE,QAAQ,WAAW,SAAS,GAAG;AAAA,MAC1C;AAAA,MAEA,MAAM,cAAc,SAAmE;AAErF,YAAI,CAAC,KAAK,YAAY,QAAQ,MAAM,CAAC,GAAG;AACtC,gBAAM,IAAI,MAAM,GAAG,QAAQ,IAAI,8CAAyC;AAAA,QAC1E;AAEA,cAAM,YAAY,QAAQ,SAAS,QAAQ,KAAK,MAAM,GAAG,EAAE;AAC3D,cAAM,SAAS,QAAQ,UAAU,cAAc,WAAW,QAAQ,QAAQ,QAAW;AAAA,UACnF,UAAU,QAAQ,YAAY;AAAA,UAAU,MAAM,QAAQ;AAAA,UACtD,WAAW,QAAQ;AAAA,UAAc,cAAc,QAAQ;AAAA,UACvD,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAED,aAAK,YAAY,QAAQ,MAAM,MAAM;AACrC,sBAAc,MAAM;AAEpB,cAAM,eAAe,gBAAgB;AACrC,cAAM,UAAU,KAAK,0BAA0B,cAAc,QAAQ,IAAI;AACzE,YAAI,SAAS;AAAE,kBAAQ,OAAO,QAAQ,OAAO,MAAM,GAAG,EAAE;AAAG,kBAAQ,SAAS,sBAAsB,MAAM,EAAE;AAAA,QAAG;AAE7G,cAAM,UAAU,QAAQ,aAAa;AACrC,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK,QAAQ,SAAS,QAAQ,OAAO;AAC1D,iBAAO,EAAE,QAAQ,OAAO;AAAA,QAC1B,UAAE;AACA,eAAK,SAAS,QAAQ,MAAM,MAAM;AAElC,cAAI,WAAW,QAAQ,SAAS,KAAK;AAAE,oBAAQ,SAAS;AAAS,oBAAQ,SAAS;AAAO,oBAAQ,SAAS,WAAW;AAAA,UAAG;AACxH,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AAAA,MAEA,WAAW,cAAsB,SAAqE;AACpG,YAAI,QAAQ,SAAS,IAAK,OAAM,IAAI,MAAM,2BAA2B;AACrE,eAAO,KAAK,SAAS,EAAE,GAAG,SAAS,MAAM,KAAK,aAAa,CAAC,EAAE;AAAA,MAChE;AAAA;AAAA,MAIQ,cAAoB;AAC1B,cAAM,SAAS,WAAW,QAAQ;AAClC,cAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,mBAAW,QAAQ,QAAQ;AAEzB,cAAK,KAAa,iBAAkB,KAAa,gBAAgB,IAAK;AAEtE,cAAI,CAAC,YAAY,IAAI,EAAG;AACxB,gBAAM,OAAQ,KAAK,QAAwB;AAC3C,cAAI,KAAK,YAAY,MAAM,KAAK,EAAE,GAAG;AACnC,iBAAK,SAAS,EAAE,MAAM,MAAM,KAAK,OAAO,QAAS,KAAK,UAAoC,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAAA,UACrH;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,MAAM,OAAsB;AAC1B,aAAK,YAAY;AACjB,aAAK,kBAAkB;AACvB,cAAM,KAAK,gBAAgB;AAC3B,aAAK;AACL,YAAI,KAAK,oBAAoB,OAAO,GAAG;AACrC,eAAK,gBAAgB;AACrB,eAAK,eAAe;AAAA,QACtB;AAAA,MACF;AAAA,MAEQ,oBAA0B;AAChC,cAAM,WAAW,SAAS,QAAQ,IAAI,iBAAiB,KAAK,UAAU,EAAE;AACxE,cAAM,MAAM,KAAK,IAAI;AACrB,mBAAW,CAAC,EAAE,OAAO,KAAK,KAAK,SAAS;AACtC,qBAAW,UAAU,SAAS;AAC5B,kBAAM,OAAO,cAAc,MAAM;AACjC,gBAAI,CAAC,QAAQ,KAAK,WAAW,UAAW;AACxC,kBAAM,gBAAe,oBAAI,KAAK,KAAK,aAAa,GAAG,GAAE,QAAQ;AAC7D,gBAAI,MAAM,eAAe,UAAU;AACjC,sBAAQ,KAAK,cAAc,MAAM,KAAK,KAAK,OAAO,MAAM,gBAAgB,GAAI,CAAC,+BAA0B;AACvG,yBAAW,QAAQ,0BAAqB;AAAA,YAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGQ,kBAAwB;AAC9B,cAAM,gBAAgB,IAAI,KAAK,KAAK,KAAK;AACzC,cAAM,EAAE,YAAY,aAAa,QAAQ,UAAAC,UAAS,IAAI,UAAQ,SAAS;AACvE,cAAM,EAAE,MAAAC,MAAK,IAAI,UAAQ,WAAW;AACpC,cAAM,EAAE,WAAW,IAAI;AACvB,cAAM,YAAYA,MAAK,WAAW,GAAG,UAAU,QAAQ;AACvD,YAAI,CAAC,WAAW,SAAS,EAAG;AAC5B,cAAM,MAAM,KAAK,IAAI;AACrB,mBAAW,SAAS,YAAY,SAAS,GAAG;AAC1C,cAAI;AACF,kBAAM,OAAOA,MAAK,WAAW,KAAK;AAClC,kBAAM,OAAOD,UAAS,IAAI;AAC1B,gBAAI,MAAM,KAAK,UAAU,eAAe;AACtC,qBAAO,MAAM,EAAE,WAAW,KAAK,CAAC;AAChC,sBAAQ,qBAAqB,WAAW,KAAK,EAAE;AAAA,YACjD;AAAA,UACF,SAAS,KAAK;AAAE,0BAAc,KAAK,eAAe,GAAG;AAAA,UAAG;AAAA,QAC1D;AAAA,MACF;AAAA;AAAA,MAGQ,iBAAuB;AAC7B,cAAM,iBAAiB,KAAK,KAAK,KAAK,KAAK;AAC3C,cAAM,EAAE,YAAY,UAAAA,WAAU,YAAY,aAAa,WAAW,IAAI,UAAQ,SAAS;AACvF,cAAM,EAAE,MAAAC,MAAK,IAAI,UAAQ,WAAW;AACpC,cAAM,EAAE,WAAW,IAAI;AACvB,cAAM,UAAUA,MAAK,WAAW,GAAG,MAAM;AACzC,cAAM,YAAYA,MAAK,SAAS,aAAa;AAC7C,YAAI,CAAC,WAAW,SAAS,EAAG;AAC5B,YAAI;AACF,gBAAM,OAAOD,UAAS,SAAS;AAC/B,cAAI,KAAK,OAAO,KAAK,OAAO,MAAM;AAChC,kBAAM,QAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACjD,uBAAW,WAAWC,MAAK,SAAS,SAAS,IAAI,QAAQ,CAAC;AAC1D,oBAAQ,kBAAkB,yBAAyB,KAAK,OAAO,OAAO,MAAM,QAAQ,CAAC,CAAC,KAAK;AAAA,UAC7F;AAAA,QACF,SAAS,KAAK;AAAE,wBAAc,KAAK,gBAAgB,GAAG;AAAA,QAAG;AACzD,cAAM,MAAM,KAAK,IAAI;AACrB,YAAI;AACF,qBAAW,KAAK,YAAY,OAAO,GAAG;AACpC,gBAAI,CAAC,EAAE,WAAW,QAAQ,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAG;AACtD,kBAAM,OAAOA,MAAK,SAAS,CAAC;AAC5B,kBAAM,OAAOD,UAAS,IAAI;AAC1B,gBAAI,MAAM,KAAK,UAAU,gBAAgB;AACvC,yBAAW,IAAI;AACf,sBAAQ,kBAAkB,WAAW,CAAC,EAAE;AAAA,YAC1C;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AAAE,wBAAc,KAAK,eAAe,GAAG;AAAA,QAAG;AAAA,MAC1D;AAAA,MAEA,MAAc,kBAAiC;AAC7C,cAAM,cAAc,WAAW,WAAW,QAAQ,EAAE,OAAO,OAAK,EAAE,SAAS,QAAQ;AACnF,YAAI,YAAY,WAAW,EAAG;AAC9B,cAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,8BAA2B;AACrE,cAAM,YAAY,iBAAiB;AACnC,cAAM,oBAAoB,KAAK,KAAK;AACpC,mBAAW,QAAQ,aAAa;AAC9B,cAAI;AACF,kBAAM,OAAO,KAAK,MAAM,KAAK,SAAS,IAAI;AAC1C,gBAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,eAAgB;AACxC,kBAAM,UAAU,KAAK,IAAI,KAAI,oBAAI,KAAK,KAAK,aAAa,GAAG,GAAE,QAAQ;AACrE,gBAAI,UAAU,mBAAmB;AAC/B,yBAAW,KAAK,IAAI,wBAAwB,KAAK,MAAM,UAAU,GAAK,CAAC,MAAM;AAC7E;AAAA,YACF;AACA,kBAAM,SAAS,MAAM,UAAU,UAAU,KAAK,MAAM,KAAK,cAAc;AACvE,gBAAI,OAAO,WAAW,OAAQ,gBAAe,KAAK,IAAI,MAAM,OAAO,QAAQ,MAAM,GAAG,GAAG,KAAK,WAAW;AAAA,qBAC9F,OAAO,WAAW,SAAU,YAAW,KAAK,IAAI,OAAO,SAAS,oBAAoB;AAAA,UAC/F,QAAQ;AAAA,UAAC;AAAA,QACX;AAAA,MACF;AAAA,MAEQ,YAAY,MAAmB,SAA0B;AAC/D,cAAM,MAAM,eAAe,IAAI,KAAK;AACpC,aAAK,KAAK,QAAQ,IAAI,IAAI,GAAG,QAAQ,MAAM,IAAK,QAAO;AAEvD,YAAI,SAAS,OAAO,KAAK,IAAI,IAAI,KAAK,oBAAoB,KAAS,QAAO;AAC1E,eAAO;AAAA,MACT;AAAA,MAEQ,YAAY,MAAmB,QAAsB;AAC3D,YAAI,CAAC,KAAK,QAAQ,IAAI,IAAI,EAAG,MAAK,QAAQ,IAAI,MAAM,oBAAI,IAAI,CAAC;AAC7D,aAAK,QAAQ,IAAI,IAAI,EAAG,IAAI,MAAM;AAAA,MACpC;AAAA,MAEQ,SAAS,MAAmB,QAAsB;AACxD,aAAK,QAAQ,IAAI,IAAI,GAAG,OAAO,MAAM;AACrC,YAAI,SAAS,IAAK,MAAK,oBAAoB,KAAK,IAAI;AAAA,MACtD;AAAA,MAEA,MAAc,QAAQ,SAAsB,QAAgB,WAAoC;AAC9F,YAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,uBAAuB;AAC1D,YAAI,QAAQ,SAAS,IAAK,QAAO,KAAK,WAAW,SAAS,QAAQ,SAAS;AAE3E,cAAM,YAAY,QAAQ,SAAS,UAAU,QAAQ,IAAI;AACzD,gBAAQ,KAAK,UAAK,QAAQ,IAAI,SAAS,MAAM,UAAU,SAAS,EAAE;AAElE,cAAM,UAAU,SAAS,QAAQ,IAAI,iBAAiB,KAAK,UAAU,EAAE;AACvE,YAAI,iBAAiB,KAAK,IAAI;AAE9B,cAAM,QAAQ,WAAW,MAAM;AAC7B,kBAAQ,KAAK,gBAAM,QAAQ,IAAI,SAAS,MAAM,YAAY;AAC1D,eAAK,SAAS,eAAe,QAAQ,MAAM,EAAE;AAAA,QAC/C,GAAG,SAAS;AAEZ,cAAM,aAAa,YAAY,MAAM;AACnC,cAAI,KAAK,IAAI,IAAI,iBAAiB,SAAS;AACzC,0BAAc,UAAU;AACxB,oBAAQ,KAAK,gBAAM,QAAQ,IAAI,SAAS,MAAM,uBAAuB,UAAU,GAAI,IAAI;AACvF,iBAAK,SAAS,eAAe,QAAQ,MAAM,EAAE;AAAA,UAC/C;AAAA,QACF,GAAG,GAAM;AAET,YAAI;AACF,gBAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,2BAAkB;AAC3D,gBAAM,SAAS,gBAAgB,QAAQ,IAAI;AAC3C,cAAI,aAAa,SAAS,GAAG,MAAM;AAAA;AAAA;AAAA;AAAA,EAAc,QAAQ,IAAI,KAAK,QAAQ;AAG1E,cAAI,QAAQ,SAAS,OAAO,QAAQ,SAAS,KAAK;AAChD,kBAAM,EAAE,cAAc,IAAI,MAAM,OAAO,8BAA2B;AAClE,kBAAM,aAAa,UAAU,OAAO,MAAM,EAAE,SAAS,GAAG,GAAG,CAAC;AAC5D,kBAAM,aAAa,QAAQ,gBAAgB;AAC3C,kBAAM,OAAO,cAAc,YAAY,UAAU;AACjD,gBAAI,KAAK,SAAS,GAAG;AACnB,oBAAM,QAAQ,KAAK,IAAI,OAAK,IAAI,EAAE,UAAU,SAAI,EAAE,QAAQ,IAAI,EAAE,YAAY,YAAO,EAAE,IAAI,EAAE,OAAO,EAAE;AACpG,2BAAa,mBAAc,KAAK,MAAM,mBAAmB,UAAU;AAAA,EAAM,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAAmB,UAAU;AAAA,YACxH;AAAA,UACF;AAEA,gBAAM,SAAU,MAAM,KAAK,QAAQ,SAAS,WAAW,YAAY,EAAE,WAAW,SAAS,QAAQ,CAAC,KAAM;AACxG,cAAI,KAAK,QAAQ;AACf,kBAAM,MAAM,GAAG,QAAQ,IAAI,QAAQ,MAAM;AACzC,iBAAK,OAAO,cAAc,EAAE,MAAM,QAAQ,SAAS,QAAQ,MAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,UAAU,WAAW,IAAI,CAAC;AAC1H,iBAAK,OAAO,cAAc,EAAE,MAAM,aAAa,SAAS,QAAQ,WAAW,KAAK,IAAI,GAAG,QAAQ,UAAU,WAAW,IAAI,CAAC;AAAA,UAC3H;AACA,iBAAO;AAAA,QACT,UAAE;AAAU,uBAAa,KAAK;AAAG,wBAAc,UAAU;AAAA,QAAG;AAAA,MAC9D;AAAA,MAEA,MAAc,WAAW,SAAsB,QAAgB,WAAoC;AACjG,cAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,qCAAsC;AACrF,cAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAA0B;AACpE,8BAAsB,cAAc,MAAM;AAC1C,yBAAiB,MAAM;AACvB,cAAM,MAAM,MAAM,KAAK,eAAe;AACtC,gBAAQ,KAAK,iBAAY,MAAM,mBAAmB;AAGlD,YAAI,gBAAgB;AACpB,mBAAW,CAAC,EAAE,CAAC,KAAK,KAAK,UAAU;AACjC,cAAI,EAAE,GAAG,SAAS,KAAK,KAAK,EAAE,WAAW,SAAS;AAChD,cAAE,YAAY,IAAI;AAClB,cAAE,SAAS;AACX,4BAAgB,EAAE;AAClB;AAAA,UACF;AAAA,QACF;AACA,cAAM,QAAQ,WAAW,MAAM;AAAE,kBAAQ,KAAK,uBAAa,MAAM,YAAY;AAAA,QAAG,GAAG,SAAS;AAC5F,YAAI;AACF,gBAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,2BAAkB;AAC3D,gBAAM,SAAS,gBAAgB,GAAG;AAGlC,gBAAM,EAAE,cAAc,IAAI,MAAM,OAAO,0BAAwB;AAC/D,gBAAM,UAAU;AAAA,kBAA+D,MAAM;AAAA,iBAAoB,cAAc,CAAC;AAAA;AAAA;AAAA;AAExH,cAAI,aAAa,WAAW,SAAS,GAAG,MAAM;AAAA;AAAA;AAAA;AAAA,EAAc,QAAQ,IAAI,KAAK,QAAQ;AACrF,gBAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,kCAAyB;AACxE,gBAAM,gBAAgB,sBAAsB,MAAM;AAClD,cAAI,cAAc,OAAQ,cAAa,cAAc,KAAK,IAAI,IAAI,SAAS;AAG3E,gBAAM,EAAE,cAAc,IAAI,MAAM,OAAO,8BAA2B;AAClE,gBAAM,UAAU,cAAc,QAAQ,KAAK;AAC3C,cAAI,QAAQ,SAAS,GAAG;AACtB,kBAAM,QAAQ,QAAQ,IAAI,OAAK,IAAI,EAAE,UAAU,SAAI,EAAE,QAAQ,IAAI,EAAE,YAAY,YAAO,EAAE,IAAI,EAAE,OAAO,EAAE;AACvG,yBAAa,mBAAc,QAAQ,MAAM;AAAA,EAAiB,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAAmB,UAAU;AAAA,UACzG;AAEA,gBAAM,SAAU,MAAM,IAAI,WAAW,eAAe,UAAU,KAAM;AACpE,cAAI,KAAK,QAAQ;AACf,iBAAK,OAAO,cAAc,EAAE,MAAM,QAAQ,SAAS,QAAQ,MAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,UAAU,WAAW,cAAc,CAAC;AACpI,iBAAK,OAAO,cAAc,EAAE,MAAM,aAAa,SAAS,QAAQ,WAAW,KAAK,IAAI,GAAG,QAAQ,UAAU,WAAW,cAAc,CAAC;AAAA,UACrI;AACA,iBAAO;AAAA,QACT,UAAE;AAAU,uBAAa,KAAK;AAAG,gCAAsB,cAAc,IAAI;AAAG,2BAAiB,IAAI;AAAA,QAAG;AAAA,MACtG;AAAA,IACF;AAgBO,IAAM,OAAO,IAAI,KAAK;AAAA;AAAA;",
|
|
6
|
+
"names": ["drainArtifacts", "statSync", "join"]
|
|
7
|
+
}
|
|
@@ -3,19 +3,19 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_spin,
|
|
5
5
|
spin
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-AO32N2VB.js";
|
|
7
7
|
import {
|
|
8
8
|
addCompletion
|
|
9
9
|
} from "./chunk-MV6CJFWR.js";
|
|
10
10
|
import {
|
|
11
11
|
getEnv,
|
|
12
12
|
init_env_schema
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-65VCEC32.js";
|
|
14
14
|
import {
|
|
15
15
|
init_logger,
|
|
16
16
|
logInfo,
|
|
17
17
|
logWarn
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-GWILHZPT.js";
|
|
19
19
|
|
|
20
20
|
// src/components/transport/delegation-tools.ts
|
|
21
21
|
init_spin();
|
|
@@ -56,7 +56,7 @@ var spawnSessionTool = {
|
|
|
56
56
|
if (running.length >= MAX_BACKGROUND) {
|
|
57
57
|
return JSON.stringify({ error: `Max ${MAX_BACKGROUND} concurrent background sessions. Wait for one to finish or terminate it.` });
|
|
58
58
|
}
|
|
59
|
-
const masterUid = (await import("./master-user-
|
|
59
|
+
const masterUid = (await import("./master-user-HSKM4ZFN.js")).getMasterUserId();
|
|
60
60
|
const session = spin.createSubSession(masterUid, "telegram", typeInfo.sessionType);
|
|
61
61
|
if (typeof session === "string") return JSON.stringify({ error: session });
|
|
62
62
|
const goal = args.goal ?? "No goal specified";
|
|
@@ -216,4 +216,4 @@ export {
|
|
|
216
216
|
consumePendingInstruction,
|
|
217
217
|
getDelegationTools
|
|
218
218
|
};
|
|
219
|
-
//# sourceMappingURL=chunk-
|
|
219
|
+
//# sourceMappingURL=chunk-B6ZN6COK.js.map
|