@keystrokehq/platform 0.1.5 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{awk2-LA3USKJP-AIZOQ0nh.cjs → awk2-LA3USKJP-BX_f5xEm.cjs} +40 -40
- package/dist/{awk2-LA3USKJP-AIZOQ0nh.cjs.map → awk2-LA3USKJP-BX_f5xEm.cjs.map} +1 -1
- package/dist/{awk2-LA3USKJP-CPcab6tL.mjs → awk2-LA3USKJP-Og7WTTTV.mjs} +2 -2
- package/dist/{awk2-LA3USKJP-CPcab6tL.mjs.map → awk2-LA3USKJP-Og7WTTTV.mjs.map} +1 -1
- package/dist/{base64-C2AIWVNC-BU7vFrSz.mjs → base64-C2AIWVNC-CWnEsAFR.mjs} +2 -2
- package/dist/{base64-C2AIWVNC-BU7vFrSz.mjs.map → base64-C2AIWVNC-CWnEsAFR.mjs.map} +1 -1
- package/dist/{base64-C2AIWVNC-fWp5IaIt.cjs → base64-C2AIWVNC-xY0o1izr.cjs} +2 -2
- package/dist/{base64-C2AIWVNC-fWp5IaIt.cjs.map → base64-C2AIWVNC-xY0o1izr.cjs.map} +1 -1
- package/dist/{bash-YZ33HQZQ-B7vkAJM1.mjs → bash-YZ33HQZQ-CwBcNtq8.mjs} +2 -2
- package/dist/{bash-YZ33HQZQ-B7vkAJM1.mjs.map → bash-YZ33HQZQ-CwBcNtq8.mjs.map} +1 -1
- package/dist/{bash-YZ33HQZQ-BfFH_xKv.cjs → bash-YZ33HQZQ-DEgQkmLN.cjs} +5 -5
- package/dist/{bash-YZ33HQZQ-BfFH_xKv.cjs.map → bash-YZ33HQZQ-DEgQkmLN.cjs.map} +1 -1
- package/dist/{cat-TSFMZVYS-Lk2fLg0m.cjs → cat-TSFMZVYS-CE8iJIL3.cjs} +3 -3
- package/dist/{cat-TSFMZVYS-Lk2fLg0m.cjs.map → cat-TSFMZVYS-CE8iJIL3.cjs.map} +1 -1
- package/dist/{cat-TSFMZVYS-BoRCwL0X.mjs → cat-TSFMZVYS-DIffGanR.mjs} +3 -3
- package/dist/{cat-TSFMZVYS-BoRCwL0X.mjs.map → cat-TSFMZVYS-DIffGanR.mjs.map} +1 -1
- package/dist/{chunk-5H5SCKJM-Bf_pfjgz.cjs → chunk-5H5SCKJM-BqPkrOgR.cjs} +32 -32
- package/dist/{chunk-5H5SCKJM-Bf_pfjgz.cjs.map → chunk-5H5SCKJM-BqPkrOgR.cjs.map} +1 -1
- package/dist/{chunk-5H5SCKJM-CCkl-6iR.mjs → chunk-5H5SCKJM-CoKwUfnC.mjs} +2 -2
- package/dist/{chunk-5H5SCKJM-CCkl-6iR.mjs.map → chunk-5H5SCKJM-CoKwUfnC.mjs.map} +1 -1
- package/dist/{chunk-AQ6FYS2X-CaSbvwYS.mjs → chunk-AQ6FYS2X-CdU2NSVs.mjs} +2 -2
- package/dist/{chunk-AQ6FYS2X-CaSbvwYS.mjs.map → chunk-AQ6FYS2X-CdU2NSVs.mjs.map} +1 -1
- package/dist/{chunk-AQ6FYS2X-C_kf5YCJ.cjs → chunk-AQ6FYS2X-CgExDvHQ.cjs} +3 -3
- package/dist/{chunk-AQ6FYS2X-C_kf5YCJ.cjs.map → chunk-AQ6FYS2X-CgExDvHQ.cjs.map} +1 -1
- package/dist/{chunk-CHFEPBH4-Bk9Prhxt.mjs → chunk-CHFEPBH4-B8Yle41q.mjs} +2 -2
- package/dist/{chunk-CHFEPBH4-Bk9Prhxt.mjs.map → chunk-CHFEPBH4-B8Yle41q.mjs.map} +1 -1
- package/dist/{chunk-CHFEPBH4-Cdk9vq_c.cjs → chunk-CHFEPBH4-DkZruhqP.cjs} +3 -3
- package/dist/{chunk-CHFEPBH4-Cdk9vq_c.cjs.map → chunk-CHFEPBH4-DkZruhqP.cjs.map} +1 -1
- package/dist/{chunk-EBAPSGAO-BPVz-6BX.mjs → chunk-EBAPSGAO-Ba-I7RAs.mjs} +2 -2
- package/dist/{chunk-EBAPSGAO-BPVz-6BX.mjs.map → chunk-EBAPSGAO-Ba-I7RAs.mjs.map} +1 -1
- package/dist/{chunk-EBAPSGAO-9HAVo6nm.cjs → chunk-EBAPSGAO-CVyFc0vH.cjs} +3 -3
- package/dist/{chunk-EBAPSGAO-9HAVo6nm.cjs.map → chunk-EBAPSGAO-CVyFc0vH.cjs.map} +1 -1
- package/dist/{chunk-LEKBROJD-Bk_pJfFK.mjs → chunk-LEKBROJD-BCPXdvWw.mjs} +2 -2
- package/dist/{chunk-LEKBROJD-Bk_pJfFK.mjs.map → chunk-LEKBROJD-BCPXdvWw.mjs.map} +1 -1
- package/dist/{chunk-LEKBROJD-4MTnJXG3.cjs → chunk-LEKBROJD-DEy7k23L.cjs} +17 -17
- package/dist/{chunk-LEKBROJD-4MTnJXG3.cjs.map → chunk-LEKBROJD-DEy7k23L.cjs.map} +1 -1
- package/dist/{chunk-VPADYNBD-CS9VA1aJ.cjs → chunk-VPADYNBD-BtNErXh7.cjs} +3 -3
- package/dist/{chunk-VPADYNBD-CS9VA1aJ.cjs.map → chunk-VPADYNBD-BtNErXh7.cjs.map} +1 -1
- package/dist/{chunk-VPADYNBD-Bc5abqkF.mjs → chunk-VPADYNBD-D6W8m472.mjs} +2 -2
- package/dist/{chunk-VPADYNBD-Bc5abqkF.mjs.map → chunk-VPADYNBD-D6W8m472.mjs.map} +1 -1
- package/dist/{chunk-YCLFEX4T-Cz2QbPh0.mjs → chunk-YCLFEX4T-C5Zm6f-y.mjs} +2 -2
- package/dist/{chunk-YCLFEX4T-Cz2QbPh0.mjs.map → chunk-YCLFEX4T-C5Zm6f-y.mjs.map} +1 -1
- package/dist/{chunk-YCLFEX4T-D65vwGHr.cjs → chunk-YCLFEX4T-CVuOhI4h.cjs} +3 -3
- package/dist/{chunk-YCLFEX4T-D65vwGHr.cjs.map → chunk-YCLFEX4T-CVuOhI4h.cjs.map} +1 -1
- package/dist/{column-XT6UFXNQ-BsXqWbAP.mjs → column-XT6UFXNQ-CKR9qK7y.mjs} +2 -2
- package/dist/{column-XT6UFXNQ-BsXqWbAP.mjs.map → column-XT6UFXNQ-CKR9qK7y.mjs.map} +1 -1
- package/dist/{column-XT6UFXNQ-CwtLFuCh.cjs → column-XT6UFXNQ-CeiWNAzO.cjs} +4 -4
- package/dist/{column-XT6UFXNQ-CwtLFuCh.cjs.map → column-XT6UFXNQ-CeiWNAzO.cjs.map} +1 -1
- package/dist/{comm-VV2LDX2J-YL8m_4d1.cjs → comm-VV2LDX2J-5awXD4SJ.cjs} +3 -3
- package/dist/{comm-VV2LDX2J-YL8m_4d1.cjs.map → comm-VV2LDX2J-5awXD4SJ.cjs.map} +1 -1
- package/dist/{comm-VV2LDX2J-BZdS-Fqy.mjs → comm-VV2LDX2J-By6PvRFk.mjs} +2 -2
- package/dist/{comm-VV2LDX2J-BZdS-Fqy.mjs.map → comm-VV2LDX2J-By6PvRFk.mjs.map} +1 -1
- package/dist/{config-DF8H5mS5.d.mts → config-pCKnlcL-.d.mts} +2 -2
- package/dist/config.cjs +1 -1
- package/dist/config.d.mts +1 -1
- package/dist/config.mjs +1 -1
- package/dist/{cp-BISAAS7A-Dx6QG-P9.cjs → cp-BISAAS7A-Cs_viays.cjs} +3 -3
- package/dist/{cp-BISAAS7A-Dx6QG-P9.cjs.map → cp-BISAAS7A-Cs_viays.cjs.map} +1 -1
- package/dist/{cp-BISAAS7A-C0MVoZpt.mjs → cp-BISAAS7A-McE5zv9m.mjs} +2 -2
- package/dist/{cp-BISAAS7A-C0MVoZpt.mjs.map → cp-BISAAS7A-McE5zv9m.mjs.map} +1 -1
- package/dist/{cut-OKARJCCV-C1CAocst.cjs → cut-OKARJCCV-CNiRA71s.cjs} +4 -4
- package/dist/{cut-OKARJCCV-C1CAocst.cjs.map → cut-OKARJCCV-CNiRA71s.cjs.map} +1 -1
- package/dist/{cut-OKARJCCV-BKWEQwCZ.mjs → cut-OKARJCCV-VyVT0kyn.mjs} +3 -3
- package/dist/{cut-OKARJCCV-BKWEQwCZ.mjs.map → cut-OKARJCCV-VyVT0kyn.mjs.map} +1 -1
- package/dist/{diff-MWJFIG7X-YTniIfbL.mjs → diff-MWJFIG7X-B6ciCjQa.mjs} +2 -2
- package/dist/{diff-MWJFIG7X-YTniIfbL.mjs.map → diff-MWJFIG7X-B6ciCjQa.mjs.map} +1 -1
- package/dist/{diff-MWJFIG7X-D5nTdPdk.cjs → diff-MWJFIG7X-DJfHAQq4.cjs} +4 -4
- package/dist/{diff-MWJFIG7X-D5nTdPdk.cjs.map → diff-MWJFIG7X-DJfHAQq4.cjs.map} +1 -1
- package/dist/{dist-C3ioU2dM.cjs → dist-DCerSc01.cjs} +146 -24117
- package/dist/dist-DCerSc01.cjs.map +1 -0
- package/dist/{dist-CQMZgfp_.mjs → dist-Drb4M1g2.mjs} +11 -23852
- package/dist/dist-Drb4M1g2.mjs.map +1 -0
- package/dist/{du-572XNP42-CmxmrMJd.mjs → du-572XNP42-B5rNwUSo.mjs} +2 -2
- package/dist/{du-572XNP42-CmxmrMJd.mjs.map → du-572XNP42-B5rNwUSo.mjs.map} +1 -1
- package/dist/{du-572XNP42-B2vhVgxe.cjs → du-572XNP42-Iv7bX_J6.cjs} +2 -2
- package/dist/{du-572XNP42-B2vhVgxe.cjs.map → du-572XNP42-Iv7bX_J6.cjs.map} +1 -1
- package/dist/{env-36M5BO7M-Dj2YwzST.cjs → env-36M5BO7M-BcJWF_p3.cjs} +3 -3
- package/dist/{env-36M5BO7M-Dj2YwzST.cjs.map → env-36M5BO7M-BcJWF_p3.cjs.map} +1 -1
- package/dist/{env-36M5BO7M-DupdD4fz.mjs → env-36M5BO7M-Blzb5FzN.mjs} +2 -2
- package/dist/{env-36M5BO7M-DupdD4fz.mjs.map → env-36M5BO7M-Blzb5FzN.mjs.map} +1 -1
- package/dist/{expand-JSPG6VOP-BtD3fO-u.mjs → expand-JSPG6VOP-C_wueGj3.mjs} +2 -2
- package/dist/{expand-JSPG6VOP-BtD3fO-u.mjs.map → expand-JSPG6VOP-C_wueGj3.mjs.map} +1 -1
- package/dist/{expand-JSPG6VOP-C4VQzWfg.cjs → expand-JSPG6VOP-DMhqbYB4.cjs} +3 -3
- package/dist/{expand-JSPG6VOP-C4VQzWfg.cjs.map → expand-JSPG6VOP-DMhqbYB4.cjs.map} +1 -1
- package/dist/{expr-5JAACS4X-DX-k1Bjo.cjs → expr-5JAACS4X-CDzmynhc.cjs} +5 -5
- package/dist/{expr-5JAACS4X-DX-k1Bjo.cjs.map → expr-5JAACS4X-CDzmynhc.cjs.map} +1 -1
- package/dist/{expr-5JAACS4X-C75E9ncn.mjs → expr-5JAACS4X-GAOVSam5.mjs} +2 -2
- package/dist/{expr-5JAACS4X-C75E9ncn.mjs.map → expr-5JAACS4X-GAOVSam5.mjs.map} +1 -1
- package/dist/{find-INTH3OLC-2rIv2Sgt.cjs → find-INTH3OLC-CkFpi26_.cjs} +7 -7
- package/dist/{find-INTH3OLC-2rIv2Sgt.cjs.map → find-INTH3OLC-CkFpi26_.cjs.map} +1 -1
- package/dist/{find-INTH3OLC-B2oqqlwt.mjs → find-INTH3OLC-DAn3o_TH.mjs} +3 -3
- package/dist/{find-INTH3OLC-B2oqqlwt.mjs.map → find-INTH3OLC-DAn3o_TH.mjs.map} +1 -1
- package/dist/{fold-4TQNYMSW-DFQEjMsZ.cjs → fold-4TQNYMSW-CgU0z0Lb.cjs} +3 -3
- package/dist/{fold-4TQNYMSW-DFQEjMsZ.cjs.map → fold-4TQNYMSW-CgU0z0Lb.cjs.map} +1 -1
- package/dist/{fold-4TQNYMSW-DzA5SsAN.mjs → fold-4TQNYMSW-D3z6H_wP.mjs} +2 -2
- package/dist/{fold-4TQNYMSW-DzA5SsAN.mjs.map → fold-4TQNYMSW-D3z6H_wP.mjs.map} +1 -1
- package/dist/{grep-V3LQVMRQ-D--OXkar.cjs → grep-V3LQVMRQ-BKZqP55P.cjs} +5 -5
- package/dist/{grep-V3LQVMRQ-D--OXkar.cjs.map → grep-V3LQVMRQ-BKZqP55P.cjs.map} +1 -1
- package/dist/{grep-V3LQVMRQ-CUJiTsKp.mjs → grep-V3LQVMRQ-DsCks6zK.mjs} +4 -4
- package/dist/{grep-V3LQVMRQ-CUJiTsKp.mjs.map → grep-V3LQVMRQ-DsCks6zK.mjs.map} +1 -1
- package/dist/{gzip-O5ASJAFY-D8i6m9_W.mjs → gzip-O5ASJAFY-BhSGt17k.mjs} +2 -2
- package/dist/{gzip-O5ASJAFY-D8i6m9_W.mjs.map → gzip-O5ASJAFY-BhSGt17k.mjs.map} +1 -1
- package/dist/{gzip-O5ASJAFY-B3o0_eql.cjs → gzip-O5ASJAFY-CDdmGJoy.cjs} +2 -2
- package/dist/{gzip-O5ASJAFY-B3o0_eql.cjs.map → gzip-O5ASJAFY-CDdmGJoy.cjs.map} +1 -1
- package/dist/{head-442HYESI-Bztg6Xka.cjs → head-442HYESI-SA3F5DC4.cjs} +2 -2
- package/dist/{head-442HYESI-Bztg6Xka.cjs.map → head-442HYESI-SA3F5DC4.cjs.map} +1 -1
- package/dist/{head-442HYESI-BDYHKho-.mjs → head-442HYESI-lJuvsyI-.mjs} +2 -2
- package/dist/{head-442HYESI-BDYHKho-.mjs.map → head-442HYESI-lJuvsyI-.mjs.map} +1 -1
- package/dist/{help-HZ6M2CKN-CFA5POOW.cjs → help-HZ6M2CKN-DF6aW5QI.cjs} +3 -3
- package/dist/{help-HZ6M2CKN-CFA5POOW.cjs.map → help-HZ6M2CKN-DF6aW5QI.cjs.map} +1 -1
- package/dist/{help-HZ6M2CKN-C95bcvt_.mjs → help-HZ6M2CKN-Ds-v_img.mjs} +2 -2
- package/dist/{help-HZ6M2CKN-C95bcvt_.mjs.map → help-HZ6M2CKN-Ds-v_img.mjs.map} +1 -1
- package/dist/{html-to-markdown-JW4MSQZO-8YYzjAx0.mjs → html-to-markdown-JW4MSQZO-BKk0AOob.mjs} +3 -2
- package/dist/{html-to-markdown-JW4MSQZO-8YYzjAx0.mjs.map → html-to-markdown-JW4MSQZO-BKk0AOob.mjs.map} +1 -1
- package/dist/{html-to-markdown-JW4MSQZO-B3xkcb1w.cjs → html-to-markdown-JW4MSQZO-BckwnA2L.cjs} +4 -3
- package/dist/{html-to-markdown-JW4MSQZO-B3xkcb1w.cjs.map → html-to-markdown-JW4MSQZO-BckwnA2L.cjs.map} +1 -1
- package/dist/{join-TBRGI3LQ-CzBO0uid.cjs → join-TBRGI3LQ-C9BulcHm.cjs} +4 -4
- package/dist/{join-TBRGI3LQ-CzBO0uid.cjs.map → join-TBRGI3LQ-C9BulcHm.cjs.map} +1 -1
- package/dist/{join-TBRGI3LQ-Cb96ZaTF.mjs → join-TBRGI3LQ-CgQarzOH.mjs} +2 -2
- package/dist/{join-TBRGI3LQ-Cb96ZaTF.mjs.map → join-TBRGI3LQ-CgQarzOH.mjs.map} +1 -1
- package/dist/{jq-4XLYLOS5-QEF-9JGc.mjs → jq-4XLYLOS5-BYyExpBl.mjs} +4 -4
- package/dist/{jq-4XLYLOS5-QEF-9JGc.mjs.map → jq-4XLYLOS5-BYyExpBl.mjs.map} +1 -1
- package/dist/{jq-4XLYLOS5-Dmw7PtvC.cjs → jq-4XLYLOS5-D39tJb2U.cjs} +13 -13
- package/dist/{jq-4XLYLOS5-Dmw7PtvC.cjs.map → jq-4XLYLOS5-D39tJb2U.cjs.map} +1 -1
- package/dist/{js-exec-N5KEZBH7-BLGWy2LA.cjs → js-exec-N5KEZBH7-BJOFfHf8.cjs} +14 -14
- package/dist/{js-exec-N5KEZBH7-BLGWy2LA.cjs.map → js-exec-N5KEZBH7-BJOFfHf8.cjs.map} +1 -1
- package/dist/{js-exec-N5KEZBH7-DWi8fMhN.mjs → js-exec-N5KEZBH7-DxplSQRT.mjs} +4 -4
- package/dist/{js-exec-N5KEZBH7-DWi8fMhN.mjs.map → js-exec-N5KEZBH7-DxplSQRT.mjs.map} +1 -1
- package/dist/{lib-C8lgRYXp.mjs → lib-3ViR76Gd.mjs} +2 -2
- package/dist/{lib-C8lgRYXp.mjs.map → lib-3ViR76Gd.mjs.map} +1 -1
- package/dist/{lib-ux1xJJmr.cjs → lib-JWxj2-D3.cjs} +2 -2
- package/dist/{lib-ux1xJJmr.cjs.map → lib-JWxj2-D3.cjs.map} +1 -1
- package/dist/{ln-4LGSXXGD-BtA5nI4o.mjs → ln-4LGSXXGD-C78UmFEd.mjs} +2 -2
- package/dist/{ln-4LGSXXGD-BtA5nI4o.mjs.map → ln-4LGSXXGD-C78UmFEd.mjs.map} +1 -1
- package/dist/{ln-4LGSXXGD-CkQRVPru.cjs → ln-4LGSXXGD-CqxQarhQ.cjs} +3 -3
- package/dist/{ln-4LGSXXGD-CkQRVPru.cjs.map → ln-4LGSXXGD-CqxQarhQ.cjs.map} +1 -1
- package/dist/{ls-ZJGQER7M-H5DDO7bw.cjs → ls-ZJGQER7M-BY4afQpT.cjs} +2 -2
- package/dist/{ls-ZJGQER7M-H5DDO7bw.cjs.map → ls-ZJGQER7M-BY4afQpT.cjs.map} +1 -1
- package/dist/{ls-ZJGQER7M-Bm9zc4KC.mjs → ls-ZJGQER7M-DcW0UZMa.mjs} +2 -2
- package/dist/{ls-ZJGQER7M-Bm9zc4KC.mjs.map → ls-ZJGQER7M-DcW0UZMa.mjs.map} +1 -1
- package/dist/{lzma-CjqgTQ5J.cjs → lzma-BLOYSj5Z.cjs} +8 -8
- package/dist/{lzma-CjqgTQ5J.cjs.map → lzma-BLOYSj5Z.cjs.map} +1 -1
- package/dist/{lzma-BpK0w-SI.mjs → lzma-DtV0zx4R.mjs} +5 -5
- package/dist/{lzma-BpK0w-SI.mjs.map → lzma-DtV0zx4R.mjs.map} +1 -1
- package/dist/{md5sum-SPU24VSG-Dqy3agsE.mjs → md5sum-SPU24VSG-BSpePryl.mjs} +3 -3
- package/dist/{md5sum-SPU24VSG-Dqy3agsE.mjs.map → md5sum-SPU24VSG-BSpePryl.mjs.map} +1 -1
- package/dist/{md5sum-SPU24VSG-B6JGibcS.cjs → md5sum-SPU24VSG-Bm744Cs-.cjs} +3 -3
- package/dist/{md5sum-SPU24VSG-B6JGibcS.cjs.map → md5sum-SPU24VSG-Bm744Cs-.cjs.map} +1 -1
- package/dist/{mkdir-MEPGZOB6-CMrYu1Ht.mjs → mkdir-MEPGZOB6-B7hdGbmg.mjs} +2 -2
- package/dist/{mkdir-MEPGZOB6-CMrYu1Ht.mjs.map → mkdir-MEPGZOB6-B7hdGbmg.mjs.map} +1 -1
- package/dist/{mkdir-MEPGZOB6-BFwkd4Z7.cjs → mkdir-MEPGZOB6-D4EkMCni.cjs} +4 -4
- package/dist/{mkdir-MEPGZOB6-BFwkd4Z7.cjs.map → mkdir-MEPGZOB6-D4EkMCni.cjs.map} +1 -1
- package/dist/{mv-W5BIQ646-hheW03eh.cjs → mv-W5BIQ646-Bt5XMX7z.cjs} +3 -3
- package/dist/{mv-W5BIQ646-hheW03eh.cjs.map → mv-W5BIQ646-Bt5XMX7z.cjs.map} +1 -1
- package/dist/{mv-W5BIQ646-CWgyAnYE.mjs → mv-W5BIQ646-CSGqJxBv.mjs} +2 -2
- package/dist/{mv-W5BIQ646-CWgyAnYE.mjs.map → mv-W5BIQ646-CSGqJxBv.mjs.map} +1 -1
- package/dist/{nl-WSDW7I4O-DcVnQp-1.cjs → nl-WSDW7I4O-DRGfkJbS.cjs} +3 -3
- package/dist/{nl-WSDW7I4O-DcVnQp-1.cjs.map → nl-WSDW7I4O-DRGfkJbS.cjs.map} +1 -1
- package/dist/{nl-WSDW7I4O-hZyrJS6m.mjs → nl-WSDW7I4O-D_yBlUmI.mjs} +2 -2
- package/dist/{nl-WSDW7I4O-hZyrJS6m.mjs.map → nl-WSDW7I4O-D_yBlUmI.mjs.map} +1 -1
- package/dist/{od-WOKFDJTP-CIGKYa74.cjs → od-WOKFDJTP-Cg03Ruvo.cjs} +3 -3
- package/dist/{od-WOKFDJTP-CIGKYa74.cjs.map → od-WOKFDJTP-Cg03Ruvo.cjs.map} +1 -1
- package/dist/{od-WOKFDJTP-60QMVWxL.mjs → od-WOKFDJTP-uP7Llgn-.mjs} +2 -2
- package/dist/{od-WOKFDJTP-60QMVWxL.mjs.map → od-WOKFDJTP-uP7Llgn-.mjs.map} +1 -1
- package/dist/{paste-7JC6S4DX-CC0xWPbo.cjs → paste-7JC6S4DX-CqoX7bst.cjs} +3 -3
- package/dist/{paste-7JC6S4DX-CC0xWPbo.cjs.map → paste-7JC6S4DX-CqoX7bst.cjs.map} +1 -1
- package/dist/{paste-7JC6S4DX-QB7MigtV.mjs → paste-7JC6S4DX-D6z5xV4U.mjs} +2 -2
- package/dist/{paste-7JC6S4DX-QB7MigtV.mjs.map → paste-7JC6S4DX-D6z5xV4U.mjs.map} +1 -1
- package/dist/{printf-TWGXF445-bSICkDD6.cjs → printf-TWGXF445-BlK0hMdH.cjs} +6 -5
- package/dist/{printf-TWGXF445-BuI_jQx5.mjs.map → printf-TWGXF445-BlK0hMdH.cjs.map} +1 -1
- package/dist/{printf-TWGXF445-BuI_jQx5.mjs → printf-TWGXF445-Zy7nN7h0.mjs} +3 -2
- package/dist/{printf-TWGXF445-bSICkDD6.cjs.map → printf-TWGXF445-Zy7nN7h0.mjs.map} +1 -1
- package/dist/{python3-POMOR4OA-CQv_ljO3.mjs → python3-POMOR4OA-BouZk0El.mjs} +4 -4
- package/dist/{python3-POMOR4OA-CQv_ljO3.mjs.map → python3-POMOR4OA-BouZk0El.mjs.map} +1 -1
- package/dist/{python3-POMOR4OA-D8YyzdQy.cjs → python3-POMOR4OA-DKcZfsrx.cjs} +23 -23
- package/dist/{python3-POMOR4OA-D8YyzdQy.cjs.map → python3-POMOR4OA-DKcZfsrx.cjs.map} +1 -1
- package/dist/{rev-5EHFX4EJ-BCHr71Dm.mjs → rev-5EHFX4EJ-B3FQZayg.mjs} +2 -2
- package/dist/{rev-5EHFX4EJ-BCHr71Dm.mjs.map → rev-5EHFX4EJ-B3FQZayg.mjs.map} +1 -1
- package/dist/{rev-5EHFX4EJ-BS2n_x9V.cjs → rev-5EHFX4EJ-cFYVlRMT.cjs} +4 -4
- package/dist/{rev-5EHFX4EJ-BS2n_x9V.cjs.map → rev-5EHFX4EJ-cFYVlRMT.cjs.map} +1 -1
- package/dist/{rg-S4FXYXWB-C8PEpvTX.mjs → rg-S4FXYXWB-CKl0cbhA.mjs} +3 -3
- package/dist/{rg-S4FXYXWB-C8PEpvTX.mjs.map → rg-S4FXYXWB-CKl0cbhA.mjs.map} +1 -1
- package/dist/{rg-S4FXYXWB-Bol68AvR.cjs → rg-S4FXYXWB-Ht7rOUCy.cjs} +10 -10
- package/dist/{rg-S4FXYXWB-Bol68AvR.cjs.map → rg-S4FXYXWB-Ht7rOUCy.cjs.map} +1 -1
- package/dist/{rm-SSGETQVQ-BPv10nPA.cjs → rm-SSGETQVQ-DHWdd6XE.cjs} +4 -4
- package/dist/{rm-SSGETQVQ-BPv10nPA.cjs.map → rm-SSGETQVQ-DHWdd6XE.cjs.map} +1 -1
- package/dist/{rm-SSGETQVQ-C1OgRoSu.mjs → rm-SSGETQVQ-fhHj5N9k.mjs} +2 -2
- package/dist/{rm-SSGETQVQ-C1OgRoSu.mjs.map → rm-SSGETQVQ-fhHj5N9k.mjs.map} +1 -1
- package/dist/{rmdir-OC4ZLPYA-DngaXCWg.cjs → rmdir-OC4ZLPYA-D1NuXPa1.cjs} +3 -3
- package/dist/{rmdir-OC4ZLPYA-DngaXCWg.cjs.map → rmdir-OC4ZLPYA-D1NuXPa1.cjs.map} +1 -1
- package/dist/{rmdir-OC4ZLPYA-BFuqEQ5J.mjs → rmdir-OC4ZLPYA-DVoEJTP5.mjs} +2 -2
- package/dist/{rmdir-OC4ZLPYA-BFuqEQ5J.mjs.map → rmdir-OC4ZLPYA-DVoEJTP5.mjs.map} +1 -1
- package/dist/run.cjs +1 -1
- package/dist/run.mjs +1 -1
- package/dist/{sed-S5UIK574-C8OThvO-.mjs → sed-S5UIK574-2BJSJJLu.mjs} +2 -2
- package/dist/{sed-S5UIK574-C8OThvO-.mjs.map → sed-S5UIK574-2BJSJJLu.mjs.map} +1 -1
- package/dist/{sed-S5UIK574-CF78rdnK.cjs → sed-S5UIK574-ttFzHdIm.cjs} +27 -27
- package/dist/{sed-S5UIK574-CF78rdnK.cjs.map → sed-S5UIK574-ttFzHdIm.cjs.map} +1 -1
- package/dist/{sha1sum-2PTOAFR6-C48qu6hM.cjs → sha1sum-2PTOAFR6-BZQuSfLJ.cjs} +3 -3
- package/dist/{sha1sum-2PTOAFR6-C48qu6hM.cjs.map → sha1sum-2PTOAFR6-BZQuSfLJ.cjs.map} +1 -1
- package/dist/{sha1sum-2PTOAFR6-BgSg3k-0.mjs → sha1sum-2PTOAFR6-DkiDbM7V.mjs} +3 -3
- package/dist/{sha1sum-2PTOAFR6-BgSg3k-0.mjs.map → sha1sum-2PTOAFR6-DkiDbM7V.mjs.map} +1 -1
- package/dist/{sha256sum-NS7D3IXX-BML40mGR.mjs → sha256sum-NS7D3IXX-CZSi6sUb.mjs} +3 -3
- package/dist/{sha256sum-NS7D3IXX-BML40mGR.mjs.map → sha256sum-NS7D3IXX-CZSi6sUb.mjs.map} +1 -1
- package/dist/{sha256sum-NS7D3IXX-DTZ34xii.cjs → sha256sum-NS7D3IXX-CeRL0-VH.cjs} +3 -3
- package/dist/{sha256sum-NS7D3IXX-DTZ34xii.cjs.map → sha256sum-NS7D3IXX-CeRL0-VH.cjs.map} +1 -1
- package/dist/{sleep-X22JJINO-Dy9v8Z4n.cjs → sleep-X22JJINO-BpueuSM3.cjs} +5 -5
- package/dist/{sleep-X22JJINO-Dy9v8Z4n.cjs.map → sleep-X22JJINO-BpueuSM3.cjs.map} +1 -1
- package/dist/{sleep-X22JJINO-BzDRKdtv.mjs → sleep-X22JJINO-Dq8TwvQ6.mjs} +2 -2
- package/dist/{sleep-X22JJINO-BzDRKdtv.mjs.map → sleep-X22JJINO-Dq8TwvQ6.mjs.map} +1 -1
- package/dist/{sort-SW2YEO5B-ClyGJwMQ.mjs → sort-SW2YEO5B-C_BUqduL.mjs} +3 -3
- package/dist/{sort-SW2YEO5B-ClyGJwMQ.mjs.map → sort-SW2YEO5B-C_BUqduL.mjs.map} +1 -1
- package/dist/{sort-SW2YEO5B-DwbO0wml.cjs → sort-SW2YEO5B-DSdbpA5g.cjs} +4 -4
- package/dist/{sort-SW2YEO5B-DwbO0wml.cjs.map → sort-SW2YEO5B-DSdbpA5g.cjs.map} +1 -1
- package/dist/{split-4KKZZXXE-D3kKToq-.cjs → split-4KKZZXXE-Cfy-caAx.cjs} +3 -3
- package/dist/{split-4KKZZXXE-D3kKToq-.cjs.map → split-4KKZZXXE-Cfy-caAx.cjs.map} +1 -1
- package/dist/{split-4KKZZXXE-oyZFQtYU.mjs → split-4KKZZXXE-DgpfZxEv.mjs} +2 -2
- package/dist/{split-4KKZZXXE-oyZFQtYU.mjs.map → split-4KKZZXXE-DgpfZxEv.mjs.map} +1 -1
- package/dist/{sqlite3-CGOEFJAO-BedLxgf_.mjs → sqlite3-CGOEFJAO-B1k5gRse.mjs} +5 -4
- package/dist/sqlite3-CGOEFJAO-B1k5gRse.mjs.map +1 -0
- package/dist/{sqlite3-CGOEFJAO-DUW1XIou.cjs → sqlite3-CGOEFJAO-B_AeZJOw.cjs} +26 -25
- package/dist/sqlite3-CGOEFJAO-B_AeZJOw.cjs.map +1 -0
- package/dist/start-CSKzlyiU.cjs +26845 -0
- package/dist/start-CSKzlyiU.cjs.map +1 -0
- package/dist/start-xmxO-nhn.mjs +26711 -0
- package/dist/start-xmxO-nhn.mjs.map +1 -0
- package/dist/start.cjs +1 -1
- package/dist/start.d.cts +1 -1
- package/dist/start.d.mts +2 -2
- package/dist/start.mjs +1 -1
- package/dist/{strings-6WDHLGMX-DXaUbNpx.mjs → strings-6WDHLGMX-O26XgPLP.mjs} +2 -2
- package/dist/{strings-6WDHLGMX-DXaUbNpx.mjs.map → strings-6WDHLGMX-O26XgPLP.mjs.map} +1 -1
- package/dist/{strings-6WDHLGMX-5ObhNSGS.cjs → strings-6WDHLGMX-WrYHjmYR.cjs} +2 -2
- package/dist/{strings-6WDHLGMX-5ObhNSGS.cjs.map → strings-6WDHLGMX-WrYHjmYR.cjs.map} +1 -1
- package/dist/{tac-2STMMJYW-Ov0tcgNn.mjs → tac-2STMMJYW-B3nwHTgj.mjs} +2 -2
- package/dist/{tac-2STMMJYW-Ov0tcgNn.mjs.map → tac-2STMMJYW-B3nwHTgj.mjs.map} +1 -1
- package/dist/{tac-2STMMJYW-CLSjS7F2.cjs → tac-2STMMJYW-bH0PmIFC.cjs} +2 -2
- package/dist/{tac-2STMMJYW-CLSjS7F2.cjs.map → tac-2STMMJYW-bH0PmIFC.cjs.map} +1 -1
- package/dist/{tail-R4PCA2C4-C018_ZAk.cjs → tail-R4PCA2C4-CBJsd2wD.cjs} +2 -2
- package/dist/{tail-R4PCA2C4-C018_ZAk.cjs.map → tail-R4PCA2C4-CBJsd2wD.cjs.map} +1 -1
- package/dist/{tail-R4PCA2C4-KgqykSFz.mjs → tail-R4PCA2C4-t0agG73W.mjs} +2 -2
- package/dist/{tail-R4PCA2C4-KgqykSFz.mjs.map → tail-R4PCA2C4-t0agG73W.mjs.map} +1 -1
- package/dist/{tar-STHHZTZ6-CCPYnq7u.mjs → tar-STHHZTZ6-nTNd_mUA.mjs} +5 -4
- package/dist/{tar-STHHZTZ6-BcBkmdCH.cjs.map → tar-STHHZTZ6-nTNd_mUA.mjs.map} +1 -1
- package/dist/{tar-STHHZTZ6-BcBkmdCH.cjs → tar-STHHZTZ6-ol7sffwQ.cjs} +7 -6
- package/dist/{tar-STHHZTZ6-CCPYnq7u.mjs.map → tar-STHHZTZ6-ol7sffwQ.cjs.map} +1 -1
- package/dist/{tee-YUZ2FKCJ-Cce_gOKf.cjs → tee-YUZ2FKCJ-BItvCSLS.cjs} +2 -2
- package/dist/{tee-YUZ2FKCJ-Cce_gOKf.cjs.map → tee-YUZ2FKCJ-BItvCSLS.cjs.map} +1 -1
- package/dist/{tee-YUZ2FKCJ-D7LOkjQo.mjs → tee-YUZ2FKCJ-CRnAkzyY.mjs} +2 -2
- package/dist/{tee-YUZ2FKCJ-D7LOkjQo.mjs.map → tee-YUZ2FKCJ-CRnAkzyY.mjs.map} +1 -1
- package/dist/{time-D4LNBSWX-D9C8_lG9.cjs → time-D4LNBSWX-CRb0M_G6.cjs} +8 -8
- package/dist/{time-D4LNBSWX-D9C8_lG9.cjs.map → time-D4LNBSWX-CRb0M_G6.cjs.map} +1 -1
- package/dist/{time-D4LNBSWX-CvYHvswI.mjs → time-D4LNBSWX-DQ_s98Uj.mjs} +2 -2
- package/dist/{time-D4LNBSWX-CvYHvswI.mjs.map → time-D4LNBSWX-DQ_s98Uj.mjs.map} +1 -1
- package/dist/{timeout-YDCRSLPQ-CacPbawx.mjs → timeout-YDCRSLPQ-BffepZAF.mjs} +2 -2
- package/dist/{timeout-YDCRSLPQ-CacPbawx.mjs.map → timeout-YDCRSLPQ-BffepZAF.mjs.map} +1 -1
- package/dist/{timeout-YDCRSLPQ-Ccs9ipQM.cjs → timeout-YDCRSLPQ-D74y5y7z.cjs} +5 -5
- package/dist/{timeout-YDCRSLPQ-Ccs9ipQM.cjs.map → timeout-YDCRSLPQ-D74y5y7z.cjs.map} +1 -1
- package/dist/{touch-UA33VN3N-D2ndvYPZ.mjs → touch-UA33VN3N-78TDr_Cd.mjs} +2 -2
- package/dist/{touch-UA33VN3N-D2ndvYPZ.mjs.map → touch-UA33VN3N-78TDr_Cd.mjs.map} +1 -1
- package/dist/{touch-UA33VN3N-Dxlmlbm_.cjs → touch-UA33VN3N-CP3QIjbf.cjs} +3 -3
- package/dist/{touch-UA33VN3N-Dxlmlbm_.cjs.map → touch-UA33VN3N-CP3QIjbf.cjs.map} +1 -1
- package/dist/{tr-36LHWFRQ-Bzq2x5-h.cjs → tr-36LHWFRQ-BRvI2dHQ.cjs} +4 -4
- package/dist/{tr-36LHWFRQ-Bzq2x5-h.cjs.map → tr-36LHWFRQ-BRvI2dHQ.cjs.map} +1 -1
- package/dist/{tr-36LHWFRQ-CWCuChgL.mjs → tr-36LHWFRQ-SA2CA_S1.mjs} +2 -2
- package/dist/{tr-36LHWFRQ-CWCuChgL.mjs.map → tr-36LHWFRQ-SA2CA_S1.mjs.map} +1 -1
- package/dist/{tree-YLD52CNT-BQipj5RY.cjs → tree-YLD52CNT-C3_lLUpl.cjs} +2 -2
- package/dist/{tree-YLD52CNT-BQipj5RY.cjs.map → tree-YLD52CNT-C3_lLUpl.cjs.map} +1 -1
- package/dist/{tree-YLD52CNT-CDfF4vcr.mjs → tree-YLD52CNT-KZAShLek.mjs} +2 -2
- package/dist/{tree-YLD52CNT-CDfF4vcr.mjs.map → tree-YLD52CNT-KZAShLek.mjs.map} +1 -1
- package/dist/{unexpand-CADSA4VO-C4qGbx-B.cjs → unexpand-CADSA4VO-DJB8iOb2.cjs} +3 -3
- package/dist/{unexpand-CADSA4VO-C4qGbx-B.cjs.map → unexpand-CADSA4VO-DJB8iOb2.cjs.map} +1 -1
- package/dist/{unexpand-CADSA4VO-COvRSVlE.mjs → unexpand-CADSA4VO-QJhpquBs.mjs} +2 -2
- package/dist/{unexpand-CADSA4VO-COvRSVlE.mjs.map → unexpand-CADSA4VO-QJhpquBs.mjs.map} +1 -1
- package/dist/{uniq-XSIZR6PB-bJo9kdHr.cjs → uniq-XSIZR6PB--zd07u5J.cjs} +4 -4
- package/dist/{uniq-XSIZR6PB-bJo9kdHr.cjs.map → uniq-XSIZR6PB--zd07u5J.cjs.map} +1 -1
- package/dist/{uniq-XSIZR6PB-C8bN8gfm.mjs → uniq-XSIZR6PB-D8Uw2jAH.mjs} +3 -3
- package/dist/{uniq-XSIZR6PB-C8bN8gfm.mjs.map → uniq-XSIZR6PB-D8Uw2jAH.mjs.map} +1 -1
- package/dist/{wc-LF7NU4LA-D4xFJZxz.mjs → wc-LF7NU4LA-B-YAlUqD.mjs} +3 -3
- package/dist/{wc-LF7NU4LA-D4xFJZxz.mjs.map → wc-LF7NU4LA-B-YAlUqD.mjs.map} +1 -1
- package/dist/{wc-LF7NU4LA-NAR5lgIG.cjs → wc-LF7NU4LA-BEMBfNm9.cjs} +4 -4
- package/dist/{wc-LF7NU4LA-NAR5lgIG.cjs.map → wc-LF7NU4LA-BEMBfNm9.cjs.map} +1 -1
- package/dist/{xan-Y6WF3IRG-D16SQobd.mjs → xan-Y6WF3IRG-ByEdCuAi.mjs} +6 -6
- package/dist/{xan-Y6WF3IRG-D16SQobd.mjs.map → xan-Y6WF3IRG-ByEdCuAi.mjs.map} +1 -1
- package/dist/{xan-Y6WF3IRG-RigAd0GA.cjs → xan-Y6WF3IRG-DCru93RE.cjs} +11 -11
- package/dist/{xan-Y6WF3IRG-RigAd0GA.cjs.map → xan-Y6WF3IRG-DCru93RE.cjs.map} +1 -1
- package/dist/{xan-view-HDVKHFC2-pRqYeBi3.cjs → xan-view-HDVKHFC2-BPuiufGQ.cjs} +3 -3
- package/dist/{xan-view-HDVKHFC2-pRqYeBi3.cjs.map → xan-view-HDVKHFC2-BPuiufGQ.cjs.map} +1 -1
- package/dist/{xan-view-HDVKHFC2-CJ527xHS.mjs → xan-view-HDVKHFC2-HTtRuSIN.mjs} +3 -3
- package/dist/{xan-view-HDVKHFC2-CJ527xHS.mjs.map → xan-view-HDVKHFC2-HTtRuSIN.mjs.map} +1 -1
- package/dist/{xargs-MGZPH7AX-C0bVMPGM.cjs → xargs-MGZPH7AX-SGQW1zLf.cjs} +4 -4
- package/dist/{xargs-MGZPH7AX-C0bVMPGM.cjs.map → xargs-MGZPH7AX-SGQW1zLf.cjs.map} +1 -1
- package/dist/{xargs-MGZPH7AX-DWIn3Zwh.mjs → xargs-MGZPH7AX-w2W-Yyzf.mjs} +2 -2
- package/dist/{xargs-MGZPH7AX-DWIn3Zwh.mjs.map → xargs-MGZPH7AX-w2W-Yyzf.mjs.map} +1 -1
- package/dist/{yq-4QJW3EQG-CSTlai1q.cjs → yq-4QJW3EQG-Cx9pL4eC.cjs} +10 -10
- package/dist/{yq-4QJW3EQG-CSTlai1q.cjs.map → yq-4QJW3EQG-Cx9pL4eC.cjs.map} +1 -1
- package/dist/{yq-4QJW3EQG-CPcwcHbw.mjs → yq-4QJW3EQG-eornzh5f.mjs} +3 -3
- package/dist/{yq-4QJW3EQG-CPcwcHbw.mjs.map → yq-4QJW3EQG-eornzh5f.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/dist-C3ioU2dM.cjs.map +0 -1
- package/dist/dist-CQMZgfp_.mjs.map +0 -1
- package/dist/sqlite3-CGOEFJAO-BedLxgf_.mjs.map +0 -1
- package/dist/sqlite3-CGOEFJAO-DUW1XIou.cjs.map +0 -1
- package/dist/start-9_8ZcdaU.mjs +0 -2836
- package/dist/start-9_8ZcdaU.mjs.map +0 -1
- package/dist/start-CBrH4KOb.cjs +0 -2842
- package/dist/start-CBrH4KOb.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"start-9_8ZcdaU.mjs","names":["handler","handler","handler","handler","handler","handler","encryptCredentialPayload","OrganizationSlugTakenError","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","DEFAULT_PRESIGN_TTL_SECONDS","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","handler","listOrganizations","checkOrganizationSlugAvailability","getOrganization","updateOrganization","getOrganizationSidebarBranding","updateOrganizationSidebarBranding","presignOrganizationSidebarLogo","listOrganizationInvitations","acceptOrganizationInvitation","declineOrganizationInvitation","getUserAvatar","presignUserAvatar","updateUserAvatar","getUserPreferences","updateUserPreferences","listApps","checkAppSlugAvailability","createApp","getAppBySlug","listOrganizationMembers","inviteOrganizationMembers","updateOrganizationMember","removeOrganizationMember","listApiKeys","createApiKey","revokeApiKey","listAgents","getAgent","listWorkflows","getWorkflow","listSkills","getSkill","listRecents","listHistory","submitTeamRequest","getHistoryRun","cancelWorkflowRun","cancelAgentSession","listCredentials","createCredentials","getCredential","updateCredential","listProjects","checkProjectSlugAvailabilityRoute","listProjectMetrics","createProject","getProject","updateProject","deleteProject","getProjectSettings","updateProjectSettings","listProjectMembers","inviteProjectMembers","updateProjectMember","removeProjectMember","leaveProject","listProjectFiles","getProjectFileContent","listProjectDeployments","downloadActiveProjectArtifact","createProjectArtifact","completeProjectArtifact","presignProjectArtifactSource","uploadProjectArtifactSourceManifest","createApp","createHttpApp","createApp"],"sources":["../../../packages/manifest/dist/index.mjs","../../../packages/projects/dist/index.mjs","../src/auth/mount.ts","../../../packages/access-control/dist/index.mjs","../src/auth/access-context.ts","../../../packages/http/dist/require-session-BLPGA50N.mjs","../src/auth/authorize.ts","../src/auth/authorize-payload.ts","../src/auth/require-organization-param.ts","../../../packages/http/dist/with-public-project-runtime-B7hmgjbi.mjs","../src/routes/account/users/me/avatar/GET.ts","../src/lib/user-avatar-content-type.ts","../src/routes/account/users/me/avatar/presign/POST.ts","../src/lib/stored-image.ts","../src/routes/account/users/me/avatar/PATCH.ts","../src/routes/account/users/me/preferences/GET.ts","../src/routes/account/users/me/preferences/PATCH.ts","../src/routes/account/organizations/GET.ts","../src/services/create-organization.ts","../src/routes/account/organizations/slug-errors.ts","../src/routes/account/organizations/POST.ts","../src/routes/account/organizations/slug-available/GET.ts","../src/routes/account/organizations/[organizationId]/GET.ts","../src/routes/account/organizations/[organizationId]/PATCH.ts","../src/routes/account/organizations/[organizationId]/branding/GET.ts","../src/routes/account/organizations/[organizationId]/branding/PATCH.ts","../src/routes/account/organizations/[organizationId]/branding/logo/presign/POST.ts","../src/auth/project-access.ts","../src/routes/account/history/enrich.ts","../src/routes/account/history/GET.ts","../src/routes/account/history/[runId]/GET.ts","../src/routes/account/resources/common.ts","../src/routes/account/resources/agents.ts","../src/routes/account/agents/GET.ts","../src/routes/account/lib/touch-resource-activity.ts","../src/routes/account/agents/[agentId]/GET.ts","../src/routes/account/history/cancel-run.ts","../src/routes/account/agents/sessions/[sessionId]/cancel/POST.ts","../src/routes/account/resources/workflows.ts","../src/routes/account/workflows/GET.ts","../src/routes/account/workflows/[workflowId]/GET.ts","../src/routes/account/workflows/runs/[runId]/cancel/POST.ts","../src/routes/account/resources/skills.ts","../src/routes/account/skills/GET.ts","../src/routes/account/skills/[skillId]/GET.ts","../src/routes/account/resources/recents.ts","../src/routes/account/recents/GET.ts","../src/routes/account/projects/GET.ts","../src/routes/account/projects/metrics/merge-project-list-metrics.ts","../src/routes/account/projects/metrics/GET.ts","../src/routes/account/projects/POST.ts","../src/routes/account/projects/slug-available/GET.ts","../src/routes/account/projects/[projectId]/GET.ts","../src/routes/account/projects/[projectId]/PATCH.ts","../src/routes/account/projects/[projectId]/DELETE.ts","../src/routes/account/projects/[projectId]/deployments/GET.ts","../src/routes/account/projects/[projectId]/artifacts/POST.ts","../src/routes/account/projects/[projectId]/artifacts/active/download/GET.ts","../src/routes/account/projects/[projectId]/artifacts/[artifactId]/complete/POST.ts","../src/routes/account/projects/[projectId]/artifacts/[artifactId]/source/presign/POST.ts","../src/routes/account/projects/[projectId]/artifacts/[artifactId]/source/manifest/POST.ts","../src/routes/account/projects/[projectId]/files/GET.ts","../src/routes/account/projects/[projectId]/artifacts/[artifactId]/files/content/GET.ts","../src/routes/account/projects/[projectId]/reachability/GET.ts","../src/routes/account/projects/[projectId]/members/GET.ts","../src/routes/account/projects/[projectId]/members/POST.ts","../src/routes/account/projects/[projectId]/members/[userId]/PATCH.ts","../src/routes/account/projects/[projectId]/members/[userId]/DELETE.ts","../src/routes/account/projects/[projectId]/members/me/DELETE.ts","../src/routes/account/projects/[projectId]/settings/GET.ts","../src/routes/account/projects/[projectId]/settings/PATCH.ts","../src/routes/account/credentials/enrich.ts","../src/routes/account/credentials/GET.ts","../src/routes/account/credentials/POST.ts","../src/routes/account/credentials/[credentialId]/GET.ts","../src/routes/account/credentials/[credentialId]/PATCH.ts","../src/routes/account/credentials/[credentialId]/DELETE.ts","../src/routes/account/members/GET.ts","../src/email/organization-invite-email.ts","../src/routes/account/members/invitations/POST.ts","../src/routes/account/members/[userId]/PATCH.ts","../src/routes/account/members/[userId]/DELETE.ts","../src/routes/account/invitations/GET.ts","../src/routes/account/invitations/[invitationId]/accept/POST.ts","../src/routes/account/invitations/[invitationId]/decline/POST.ts","../src/routes/account/apps/map-catalog.ts","../src/routes/account/apps/GET.ts","../src/routes/account/apps/POST.ts","../src/routes/account/apps/slug-available/GET.ts","../src/routes/account/apps/[slug]/GET.ts","../src/routes/account/api-keys/GET.ts","../src/routes/account/api-keys/POST.ts","../src/routes/account/api-keys/[apiKeyId]/DELETE.ts","../src/lib/team-request-slack.ts","../src/routes/account/team-requests/POST.ts","../src/routes/account/mount.ts","../src/middleware/require-worker-token.ts","../src/routes/internal/web-search-proxy.ts","../src/routes/internal/with-project-scope.ts","../src/routes/internal/mount.ts","../src/app.ts","../src/start.ts"],"sourcesContent":["import { a as discoverModuleFileEntries, c as walkTypeScriptFiles, l as entryIdFromFile, o as moduleFileKeyFromPath, s as discoverEntries, t as validateUniqueModuleKeys } from \"./discovery-CWjr_liZ.mjs\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolveAppRoot, runWithAppRoot } from \"@keystrokehq/sandbox\";\nimport { dirname, join, relative, sep } from \"node:path\";\nimport { PromptResponseSchema, ROUTE_MANIFEST_REL_PATH, normalizeCredentialList, parseStoredRouteManifest } from \"@keystrokehq/shared\";\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { z } from \"zod\";\n//#region src/guards/agent.ts\nfunction isManifestAgent(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst agent = value;\n\treturn typeof agent.slug === \"string\" && agent.slug.trim().length > 0 && typeof agent.buildRuntime === \"function\" && typeof agent.model === \"string\" && typeof agent.systemPrompt === \"string\";\n}\nfunction validateManifestAgent(value, filePath) {\n\tif (!isManifestAgent(value)) throw new Error(`${filePath} must default-export defineAgent(...)`);\n\treturn value;\n}\n//#endregion\n//#region src/routes.ts\nfunction normalizeWebhookEndpoint(endpoint) {\n\treturn endpoint.replace(/^\\/+|\\/+$/g, \"\").replace(/^triggers\\/?/, \"\");\n}\nfunction agentRouteFromKey(key) {\n\treturn `/agents/${key}`;\n}\nfunction workflowRouteFromKey(key) {\n\treturn `/workflows/${key}`;\n}\nfunction pollRouteFromKey(attachmentKey) {\n\treturn `/triggers/${attachmentKey}/poll`;\n}\nfunction pollGroupRouteFromId(pollId) {\n\treturn `/triggers/polls/${pollId}/run`;\n}\nfunction webhookRouteFromEndpoint(endpoint) {\n\tconst normalized = normalizeWebhookEndpoint(endpoint);\n\tif (!normalized) throw new Error(\"Webhook endpoint must not be empty\");\n\treturn `/triggers/${normalized}`;\n}\n//#endregion\n//#region src/agents/discover.ts\nasync function discoverAgentEntries(agentsDir, options) {\n\tconst files = await discoverModuleFileEntries(agentsDir, {\n\t\tnestedEntry: \"agent\",\n\t\tduplicateLabel: \"agent module file\"\n\t});\n\tconst entries = [];\n\tfor (const { filePath, moduleFile } of files) {\n\t\tconst agent = await importAgentDefinition(filePath, options);\n\t\tentries.push({\n\t\t\tkey: agent.slug,\n\t\t\troute: agentRouteFromKey(agent.slug),\n\t\t\tfilePath,\n\t\t\tmoduleFile\n\t\t});\n\t}\n\treturn entries;\n}\nasync function importAgentDefinition(filePath, options) {\n\tconst appRoot = resolveAppRoot(filePath);\n\tconst href = pathToFileURL(filePath).href;\n\treturn runWithAppRoot(appRoot, async () => {\n\t\treturn validateManifestAgent((await (options?.reload ? import(`${href}?keystroke=${Date.now()}`) : import(href))).default, filePath);\n\t});\n}\n//#endregion\n//#region src/guards/action.ts\nconst ACTION = Symbol.for(\"keystroke.action\");\nfunction isManifestAction(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn ACTION in value && value[ACTION] === true;\n}\nfunction getManifestActionCredentialRequirements(action) {\n\treturn Array.isArray(action.credentials) ? action.credentials : void 0;\n}\n//#endregion\n//#region src/agents/count-agent-credentials.ts\nfunction countAgentCredentials(agent) {\n\tconst keys = /* @__PURE__ */ new Set();\n\tfor (const tool of agent.tools ?? []) {\n\t\tconst record = tool;\n\t\tconst requirements = isManifestAction(tool) ? getManifestActionCredentialRequirements(tool) : \"credentials\" in record && Array.isArray(record.credentials) ? record.credentials : void 0;\n\t\tif (!requirements?.length) continue;\n\t\tfor (const requirement of normalizeCredentialList(requirements)) keys.add(requirement.key);\n\t}\n\treturn keys.size;\n}\n//#endregion\n//#region src/skills/discover-manifest-entries.ts\nconst SKIP_DIRS = new Set([\".git\", \"node_modules\"]);\nfunction toPosix$1(path) {\n\treturn path.split(sep).join(\"/\");\n}\nfunction parseSkillFrontmatter(raw) {\n\tconst match = raw.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n\tif (!match) return {};\n\tconst out = {};\n\tfor (const line of match[1]?.split(\"\\n\") ?? []) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\")) continue;\n\t\tconst colon = trimmed.indexOf(\":\");\n\t\tif (colon < 0) continue;\n\t\tconst key = trimmed.slice(0, colon).trim();\n\t\tlet value = trimmed.slice(colon + 1).trim();\n\t\tif (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\") || value.startsWith(\"'\") && value.endsWith(\"'\")) value = value.slice(1, -1);\n\t\tif (key === \"name\") out.name = value;\n\t\telse if (key === \"description\") out.description = value;\n\t}\n\treturn out;\n}\nfunction walkSkillFiles(root, dir, out) {\n\tfor (const name of readdirSync(dir).sort()) {\n\t\tconst absolute = join(dir, name);\n\t\tconst stats = statSync(absolute);\n\t\tif (stats.isDirectory()) {\n\t\t\tif (SKIP_DIRS.has(name)) continue;\n\t\t\twalkSkillFiles(root, absolute, out);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!stats.isFile() || name !== \"SKILL.md\") continue;\n\t\tconst moduleFile = toPosix$1(relative(root, absolute));\n\t\tconst slug = toPosix$1(relative(join(root, \"src\", \"skills\"), absolute)).replace(/\\/?SKILL\\.md$/, \"\");\n\t\tif (!slug) continue;\n\t\tconst frontmatter = parseSkillFrontmatter(readFileSync(absolute, \"utf8\"));\n\t\tout.push({\n\t\t\tslug,\n\t\t\tname: frontmatter.name,\n\t\t\tdescription: frontmatter.description,\n\t\t\tmoduleFile\n\t\t});\n\t}\n}\n/** Discover skill metadata from src/skills SKILL.md files for the route manifest. */\nfunction discoverSkillManifestEntries(projectRoot) {\n\tconst skillsDir = join(projectRoot, \"src\", \"skills\");\n\tif (!statSync(skillsDir, { throwIfNoEntry: false })?.isDirectory()) return [];\n\tconst entries = [];\n\twalkSkillFiles(projectRoot, skillsDir, entries);\n\treturn entries;\n}\n//#endregion\n//#region src/openapi/schema-to-json.ts\nfunction schemaToJson(schema) {\n\treturn z.toJSONSchema(schema, { target: \"openapi-3.0\" });\n}\n//#endregion\n//#region src/openapi/serialize-manifest.ts\nfunction collectIntegrationKeys(integrations) {\n\treturn integrations.map((integration) => integration.key);\n}\nfunction serializeRouteManifest(manifest) {\n\tconst entries = [];\n\tfor (const entry of manifest) switch (entry.kind) {\n\t\tcase \"health\":\n\t\t\tentries.push(entry);\n\t\t\tbreak;\n\t\tcase \"agent\":\n\t\t\tentries.push({\n\t\t\t\tkind: entry.kind,\n\t\t\t\tslug: entry.slug,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\tname: entry.name,\n\t\t\t\tdescription: entry.description,\n\t\t\t\tmodel: entry.model,\n\t\t\t\tsystemPrompt: entry.systemPrompt,\n\t\t\t\ttoolCount: entry.toolCount,\n\t\t\t\tcredentialCount: entry.credentialCount\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"workflow\":\n\t\t\tentries.push({\n\t\t\t\tkind: entry.kind,\n\t\t\t\tslug: entry.slug,\n\t\t\t\tname: entry.name,\n\t\t\t\tdescription: entry.description,\n\t\t\t\tsubscribable: entry.subscribable,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\trequestSchema: schemaToJson(entry.request)\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"trigger-webhook\":\n\t\t\tentries.push({\n\t\t\t\tkind: entry.kind,\n\t\t\t\tendpoint: entry.endpoint,\n\t\t\t\tattachmentIds: entry.attachmentIds,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\tattachmentSchemas: Object.fromEntries(Object.entries(entry.attachmentSchemas).map(([attachmentKey, schemas]) => [attachmentKey, {\n\t\t\t\t\trequestSchema: schemaToJson(schemas.request),\n\t\t\t\t\t...schemas.filter ? { filterSchema: schemaToJson(schemas.filter) } : {}\n\t\t\t\t}]))\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"trigger-poll\":\n\t\t\tentries.push({\n\t\t\t\tkind: entry.kind,\n\t\t\t\tattachmentId: entry.attachmentId,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\tschedule: entry.schedule\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"trigger-poll-group\":\n\t\t\tentries.push({\n\t\t\t\tkind: entry.kind,\n\t\t\t\tpollId: entry.pollId,\n\t\t\t\tattachmentIds: entry.attachmentIds,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\tschedule: entry.schedule\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"cron-schedule\":\n\t\t\tentries.push(entry);\n\t\t\tbreak;\n\t\tdefault: break;\n\t}\n\treturn entries;\n}\nfunction toStoredRouteManifest(manifest, options) {\n\treturn {\n\t\tversion: 2,\n\t\tentries: serializeRouteManifest(manifest),\n\t\tskills: options?.skills ?? [],\n\t\tintegrations: options?.integrations\n\t};\n}\nfunction buildStoredRouteManifestFromContext(ctx) {\n\tconst integrations = ctx.options?.integrations ?? ctx.options?.plugins?.map((plugin) => ({\n\t\tkey: plugin.name,\n\t\tmount: plugin.register\n\t})) ?? [];\n\treturn toStoredRouteManifest(ctx.manifest, {\n\t\tintegrations: collectIntegrationKeys(integrations),\n\t\tskills: ctx.skills ?? (ctx.projectRoot ? discoverSkillManifestEntries(ctx.projectRoot) : void 0) ?? []\n\t});\n}\nfunction findWorkflowManifestEntry(manifest, workflowSlug) {\n\treturn manifest.entries.find((entry) => entry.kind === \"workflow\" && entry.slug === workflowSlug);\n}\nfunction findWebhookManifestEntryByEndpoint(manifest, endpoint) {\n\treturn manifest.entries.find((entry) => entry.kind === \"trigger-webhook\" && entry.endpoint === endpoint);\n}\n/** @deprecated Use {@link findWebhookManifestEntryByEndpoint}. */\nfunction findWebhookManifestEntryByPath(manifest, route) {\n\treturn findWebhookManifestEntryByEndpoint(manifest, route.replace(/^\\/triggers\\//, \"\").replace(/^\\/+|\\/+$/g, \"\"));\n}\n//#endregion\n//#region src/persist.ts\nfunction persistStoredRouteManifest(projectRoot, manifest) {\n\tconst path = join(projectRoot, ROUTE_MANIFEST_REL_PATH);\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(manifest, null, 2)}\\n`);\n}\n//#endregion\n//#region src/guards/workflow.ts\nconst WORKFLOW = Symbol.for(\"keystroke.workflow\");\nfunction isManifestWorkflow(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (!(WORKFLOW in value) || value[WORKFLOW] !== true) return false;\n\tconst workflow = value;\n\treturn typeof workflow.slug === \"string\" && workflow.slug.trim().length > 0 && workflow.input instanceof Object && \"safeParse\" in workflow.input && workflow.output instanceof Object && \"safeParse\" in workflow.output;\n}\nfunction validateManifestWorkflow(value, filePath) {\n\tif (!isManifestWorkflow(value)) throw new Error(`${filePath} must default-export defineWorkflow(...)`);\n\treturn value;\n}\n//#endregion\n//#region src/guards/trigger.ts\nconst TRIGGER_ATTACHMENT = Symbol.for(\"keystroke.triggerAttachment\");\nconst zodSchema = z.custom((value) => value instanceof z.ZodType, \"must be a Zod schema\");\nconst cronScheduleSchema = z.string().trim().min(1, \"cron schedule must be a non-empty string\");\nconst workflowSchema = z.custom((value) => isManifestWorkflow(value), \"must be defineWorkflow(...)\");\nconst agentSchema = z.custom((value) => typeof value === \"object\" && value !== null && typeof value.slug === \"string\" && value.slug.trim().length > 0 && typeof value.prompt === \"function\", \"must be defineAgent(...)\");\nconst promptSchema = z.union([z.string(), z.function()]);\nconst baseSourceShape = {\n\tkey: z.string().trim().min(1),\n\tattach: z.function()\n};\nconst webhookSourceSchema = z.object({\n\tkind: z.literal(\"webhook\"),\n\t...baseSourceShape,\n\tendpoint: z.string().min(1),\n\trequest: zodSchema,\n\tfilter: zodSchema.optional(),\n\tpasses: z.function()\n});\nconst cronSourceSchema = z.object({\n\tkind: z.literal(\"cron\"),\n\t...baseSourceShape,\n\tschedule: cronScheduleSchema\n});\nconst pollSourceSchema = z.object({\n\tkind: z.literal(\"poll\"),\n\t...baseSourceShape,\n\tid: z.string().optional(),\n\tschedule: cronScheduleSchema,\n\trun: z.function(),\n\tfilters: z.array(z.function()),\n\tpasses: z.function()\n});\nconst triggerSourceSchema = z.discriminatedUnion(\"kind\", [\n\twebhookSourceSchema,\n\tcronSourceSchema,\n\tpollSourceSchema\n]);\nconst workflowAttachmentSchema = z.object({\n\tkey: z.string().trim().min(1),\n\tsource: triggerSourceSchema,\n\ttarget: z.literal(\"workflow\"),\n\tworkflow: workflowSchema,\n\ttransform: z.function().optional()\n});\nconst agentAttachmentSchema = z.object({\n\tkey: z.string().trim().min(1),\n\tsource: triggerSourceSchema,\n\ttarget: z.literal(\"agent\"),\n\tagent: agentSchema,\n\tprompt: promptSchema\n});\nconst triggerAttachmentCoreSchema = z.discriminatedUnion(\"target\", [workflowAttachmentSchema, agentAttachmentSchema]);\nfunction isManifestTriggerAttachment(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (!(TRIGGER_ATTACHMENT in value) || value[TRIGGER_ATTACHMENT] !== true) return false;\n\treturn triggerAttachmentCoreSchema.safeParse(value).success;\n}\nfunction validateManifestTriggerAttachment(value, filePath) {\n\tif (!isManifestTriggerAttachment(value)) throw new Error(`${filePath} must default-export a trigger attachment from .attach({ workflow }) or .attach({ agent, prompt })`);\n\treturn value;\n}\n//#endregion\n//#region src/triggers/discover.ts\nfunction shouldDiscoverTriggerFile(triggersDir, filePath) {\n\treturn !relative(triggersDir, filePath).split(sep).includes(\"sources\");\n}\nasync function discoverTriggerAttachments(triggersDir, options) {\n\tconst files = await discoverModuleFileEntries(triggersDir, {\n\t\tnestedEntry: \"trigger\",\n\t\tduplicateLabel: \"trigger module file\",\n\t\tshouldDiscoverFile: (filePath) => shouldDiscoverTriggerFile(triggersDir, filePath)\n\t});\n\tconst attachments = [];\n\tfor (const { filePath, moduleFile } of files) {\n\t\tconst attachment = await importTriggerAttachment(filePath, options);\n\t\tattachments.push({\n\t\t\tkey: attachment.key,\n\t\t\tfilePath,\n\t\t\tmoduleFile,\n\t\t\tattachment\n\t\t});\n\t}\n\treturn attachments;\n}\nfunction validateImportedTriggerAttachment(def, filePath) {\n\treturn validateManifestTriggerAttachment(def, filePath);\n}\nasync function importTriggerAttachment(filePath, options) {\n\tconst href = pathToFileURL(filePath).href;\n\treturn validateImportedTriggerAttachment((await (options?.reload ? import(`${href}?keystroke=${Date.now()}`) : import(href))).default, filePath);\n}\n//#endregion\n//#region src/triggers/poll/groups.ts\nfunction pollGroupId(discovered) {\n\tconst source = discovered.attachment.source;\n\tif (source.kind !== \"poll\") throw new Error(`Attachment \"${discovered.key}\" is not a poll trigger`);\n\treturn source.id ?? source.key;\n}\nfunction buildPollGroups(attachments) {\n\tconst byId = /* @__PURE__ */ new Map();\n\tfor (const discovered of attachments) {\n\t\tif (discovered.attachment.source.kind !== \"poll\") continue;\n\t\tconst id = pollGroupId(discovered);\n\t\tconst group = byId.get(id) ?? [];\n\t\tgroup.push(discovered);\n\t\tbyId.set(id, group);\n\t}\n\treturn [...byId.entries()].map(([id, groupAttachments]) => ({\n\t\tid,\n\t\tattachments: groupAttachments\n\t}));\n}\nfunction validatePollGroups(groups) {\n\tfor (const group of groups) {\n\t\tif (group.attachments.length <= 1) continue;\n\t\tif (new Set(group.attachments.map((discovered) => {\n\t\t\tconst source = discovered.attachment.source;\n\t\t\tif (source.kind !== \"poll\") throw new Error(`Poll group \"${group.id}\" has non-poll attachment ${discovered.key}`);\n\t\t\treturn source.schedule;\n\t\t})).size > 1) {\n\t\t\tconst keys = group.attachments.map((discovered) => discovered.key).join(\", \");\n\t\t\tthrow new Error(`Poll group \"${group.id}\" has attachments with different schedules (${keys})`);\n\t\t}\n\t}\n}\nfunction matchesPollRunTarget(attachmentKey, workflowKey, target) {\n\tif (!target?.workflows?.length && !target?.attachments?.length) return true;\n\tif (target.attachments?.length && !target.attachments.includes(attachmentKey)) return false;\n\tif (target.workflows?.length && !target.workflows.includes(workflowKey)) return false;\n\treturn true;\n}\n//#endregion\n//#region src/triggers/webhook/build-webhook-bindings.ts\nfunction buildWebhookBindingsByRoute(attachments, handlerOptionsFor) {\n\tconst webhookBindingsByRoute = /* @__PURE__ */ new Map();\n\tfor (const discovered of attachments) {\n\t\tconst source = discovered.attachment.source;\n\t\tif (source.kind !== \"webhook\") continue;\n\t\tconst route = webhookRouteFromEndpoint(source.endpoint);\n\t\tconst bindings = webhookBindingsByRoute.get(route) ?? [];\n\t\tbindings.push({\n\t\t\tdiscovered,\n\t\t\toptions: handlerOptionsFor(discovered.key)\n\t\t});\n\t\twebhookBindingsByRoute.set(route, bindings);\n\t}\n\treturn webhookBindingsByRoute;\n}\n//#endregion\n//#region src/triggers/webhook/webhook-schemas.ts\nfunction webhookSchemaEntriesFromBindings(bindings) {\n\treturn bindings.flatMap((binding) => {\n\t\tconst source = binding.discovered.attachment.source;\n\t\tif (source.kind !== \"webhook\") return [];\n\t\treturn [{\n\t\t\tattachmentKey: binding.discovered.key,\n\t\t\trequest: source.request,\n\t\t\t...source.filter ? { filter: source.filter } : {}\n\t\t}];\n\t});\n}\nfunction webhookAttachmentSchemasFromBindings(bindings) {\n\treturn webhookSchemaEntriesFromBindings(bindings).map((entry) => ({\n\t\tattachmentKey: entry.attachmentKey,\n\t\trequestSchema: schemaToJson(entry.request),\n\t\t...entry.filter ? { filterSchema: schemaToJson(entry.filter) } : {}\n\t}));\n}\nfunction webhookMatchSchemaForBindings(bindings) {\n\tconst schemas = bindings.flatMap((binding) => {\n\t\tconst source = binding.discovered.attachment.source;\n\t\treturn source.kind === \"webhook\" ? [source.request] : [];\n\t});\n\tif (schemas.length === 0) throw new Error(\"Webhook bindings require at least one webhook source\");\n\tif (schemas.length === 1) return schemas[0];\n\treturn z.union(schemas);\n}\nfunction webhookManifestAttachmentSchemasFromBindings(bindings) {\n\treturn Object.fromEntries(webhookSchemaEntriesFromBindings(bindings).map((entry) => [entry.attachmentKey, {\n\t\trequest: entry.request,\n\t\t...entry.filter ? { filter: entry.filter } : {}\n\t}]));\n}\n//#endregion\n//#region src/workflows/discover.ts\nasync function discoverWorkflowEntries(workflowsDir, options) {\n\tconst files = await discoverModuleFileEntries(workflowsDir, {\n\t\tnestedEntry: \"workflow\",\n\t\tduplicateLabel: \"workflow module file\"\n\t});\n\tconst entries = [];\n\tfor (const { filePath, moduleFile } of files) {\n\t\tconst definition = await importWorkflowDefinition(filePath, options);\n\t\tentries.push({\n\t\t\tkey: definition.slug,\n\t\t\troute: workflowRouteFromKey(definition.slug),\n\t\t\tfilePath,\n\t\t\tmoduleFile\n\t\t});\n\t}\n\treturn entries;\n}\nfunction validateImportedWorkflowDefinition(def, filePath) {\n\treturn validateManifestWorkflow(def, filePath);\n}\nasync function importWorkflowDefinition(filePath, options) {\n\tconst href = pathToFileURL(filePath).href;\n\treturn validateImportedWorkflowDefinition((await (options?.reload ? import(`${href}?keystroke=${Date.now()}`) : import(href))).default, filePath);\n}\nasync function discoverWorkflows(workflowsDir, options) {\n\tconst entries = await discoverWorkflowEntries(workflowsDir, options);\n\tconst workflows = [];\n\tfor (const entry of entries) {\n\t\tconst definition = await importWorkflowDefinition(entry.filePath, options);\n\t\tworkflows.push({\n\t\t\tkey: definition.slug,\n\t\t\troute: workflowRouteFromKey(definition.slug),\n\t\t\tfilePath: entry.filePath,\n\t\t\tdefinition\n\t\t});\n\t}\n\treturn workflows;\n}\n//#endregion\n//#region src/build-stored-manifest.ts\nfunction resolveDistModuleDirs(projectRoot) {\n\tconst distBase = join(projectRoot, \"dist\");\n\tif (!existsSync(distBase)) throw new Error(`Build output missing at ${distBase}. Run keystroke build before emitting the route manifest.`);\n\treturn {\n\t\tagentsDir: join(distBase, \"agents\"),\n\t\tworkflowsDir: join(distBase, \"workflows\"),\n\t\ttriggersDir: join(distBase, \"triggers\")\n\t};\n}\nfunction toPosix(path) {\n\treturn path.split(sep).join(\"/\");\n}\n/**\n* Resolve manifest moduleFile values to project-root-relative source paths.\n*\n* Discovery runs over compiled `dist/` modules, so the raw moduleFile is a\n* dist-relative `.mjs` path. Dist entries are named by their source entry id\n* (`team/escalation.mjs` ← `src/agents/team/escalation/agent.ts`), so walking\n* the matching source dir by the same id rules recovers the source path. Falls\n* back to the dist-relative value when no source file matches (e.g. building\n* a dist-only artifact with no `src/`).\n*/\nvar SourceModuleFileResolver = class {\n\tprojectRoot;\n\tmapsByKind = /* @__PURE__ */ new Map();\n\tconstructor(projectRoot) {\n\t\tthis.projectRoot = projectRoot;\n\t}\n\tasync sourceMapFor(kindDir, nestedEntry) {\n\t\tconst existing = this.mapsByKind.get(kindDir);\n\t\tif (existing) return existing;\n\t\tconst map = /* @__PURE__ */ new Map();\n\t\tconst sourceDir = join(this.projectRoot, \"src\", kindDir);\n\t\tfor (const filePath of await walkTypeScriptFiles(sourceDir)) {\n\t\t\tconst id = entryIdFromFile(sourceDir, filePath, { nestedEntry });\n\t\t\tif (id) map.set(id, toPosix(relative(this.projectRoot, filePath)));\n\t\t}\n\t\tthis.mapsByKind.set(kindDir, map);\n\t\treturn map;\n\t}\n\tasync resolve(kindDir, nestedEntry, distDir, distFilePath) {\n\t\tconst fallback = toPosix(relative(distDir, distFilePath));\n\t\tconst id = entryIdFromFile(distDir, distFilePath, { nestedEntry });\n\t\tif (!id) return fallback;\n\t\treturn (await this.sourceMapFor(kindDir, nestedEntry)).get(id) ?? fallback;\n\t}\n};\n/** Build a stored route manifest from compiled dist/ modules without starting a server. */\nasync function buildStoredRouteManifestForProject(projectRoot, options) {\n\tconst previousRoot = process.env.KEYSTROKE_ROOT;\n\tprocess.env.KEYSTROKE_ROOT = projectRoot;\n\tconst reload = options?.reloadModules ? { reload: true } : void 0;\n\ttry {\n\t\tconst dirs = resolveDistModuleDirs(projectRoot);\n\t\tconst sourcePaths = new SourceModuleFileResolver(projectRoot);\n\t\tconst manifest = [{ kind: \"health\" }];\n\t\tconst agentEntries = await discoverAgentEntries(dirs.agentsDir, reload);\n\t\tfor (const entry of agentEntries) {\n\t\t\tconst agent = await importAgentDefinition(entry.filePath, reload);\n\t\t\tconst moduleFile = await sourcePaths.resolve(\"agents\", \"agent\", dirs.agentsDir, entry.filePath);\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"agent\",\n\t\t\t\tslug: agent.slug,\n\t\t\t\tmoduleFile,\n\t\t\t\tname: agent.name,\n\t\t\t\tdescription: agent.description,\n\t\t\t\tmodel: agent.model,\n\t\t\t\tsystemPrompt: agent.systemPrompt,\n\t\t\t\ttoolCount: agent.tools?.length ?? 0,\n\t\t\t\tcredentialCount: countAgentCredentials(agent)\n\t\t\t});\n\t\t}\n\t\tconst workflows = await discoverWorkflows(dirs.workflowsDir, reload);\n\t\tfor (const workflow of workflows) {\n\t\t\tconst moduleFile = await sourcePaths.resolve(\"workflows\", \"workflow\", dirs.workflowsDir, workflow.filePath);\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"workflow\",\n\t\t\t\tslug: workflow.definition.slug,\n\t\t\t\tname: workflow.definition.name,\n\t\t\t\tdescription: workflow.definition.description,\n\t\t\t\tsubscribable: workflow.definition.subscription?.mode === \"subscribable\",\n\t\t\t\tmoduleFile,\n\t\t\t\trequest: workflow.definition.input\n\t\t\t});\n\t\t}\n\t\tconst attachments = await discoverTriggerAttachments(dirs.triggersDir, reload);\n\t\tconst discoveredByKey = new Map(attachments.map((attachment) => [attachment.key, attachment]));\n\t\tconst pollGroups = buildPollGroups(attachments);\n\t\tfor (const discovered of discoveredByKey.values()) {\n\t\t\tconst source = discovered.attachment.source;\n\t\t\tconst moduleFile = await sourcePaths.resolve(\"triggers\", \"trigger\", dirs.triggersDir, discovered.filePath);\n\t\t\tif (source.kind === \"cron\") {\n\t\t\t\tmanifest.push({\n\t\t\t\t\tkind: \"cron-schedule\",\n\t\t\t\t\tattachmentId: discovered.key,\n\t\t\t\t\tmoduleFile,\n\t\t\t\t\tschedule: source.schedule\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (source.kind === \"poll\") {\n\t\t\t\tmanifest.push({\n\t\t\t\t\tkind: \"trigger-poll\",\n\t\t\t\t\tattachmentId: discovered.key,\n\t\t\t\t\tmoduleFile,\n\t\t\t\t\tschedule: source.schedule,\n\t\t\t\t\tresponse: PromptResponseSchema\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (source.kind === \"webhook\") {\n\t\t\t\tconst route = webhookRouteFromEndpoint(source.endpoint);\n\t\t\t\tconst bindings = buildWebhookBindingsByRoute(discoveredByKey.values(), () => ({\n\t\t\t\t\texecution: { attachmentKey: discovered.key },\n\t\t\t\t\tattachmentKey: discovered.key\n\t\t\t\t})).get(route) ?? [{\n\t\t\t\t\tdiscovered,\n\t\t\t\t\toptions: { attachmentKey: discovered.key }\n\t\t\t\t}];\n\t\t\t\tmanifest.push({\n\t\t\t\t\tkind: \"trigger-webhook\",\n\t\t\t\t\tendpoint: source.endpoint,\n\t\t\t\t\tattachmentIds: bindings.map(({ discovered: row }) => row.key),\n\t\t\t\t\tmoduleFile,\n\t\t\t\t\trequest: webhookMatchSchemaForBindings(bindings),\n\t\t\t\t\tattachmentSchemas: webhookManifestAttachmentSchemasFromBindings(bindings),\n\t\t\t\t\tresponse: PromptResponseSchema\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tfor (const group of pollGroups) {\n\t\t\tif (group.attachments.length <= 1) continue;\n\t\t\tconst first = group.attachments[0];\n\t\t\tconst source = first.attachment.source;\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"trigger-poll-group\",\n\t\t\t\tpollId: group.id,\n\t\t\t\tattachmentIds: group.attachments.map((attachment) => attachment.key),\n\t\t\t\tmoduleFile: await sourcePaths.resolve(\"triggers\", \"trigger\", dirs.triggersDir, first.filePath),\n\t\t\t\tschedule: source.kind === \"poll\" ? source.schedule : \"\",\n\t\t\t\tresponse: PromptResponseSchema\n\t\t\t});\n\t\t}\n\t\treturn buildStoredRouteManifestFromContext({\n\t\t\tmanifest,\n\t\t\toptions: {},\n\t\t\tprojectRoot,\n\t\t\tskills: discoverSkillManifestEntries(projectRoot)\n\t\t});\n\t} finally {\n\t\tif (previousRoot === void 0) delete process.env.KEYSTROKE_ROOT;\n\t\telse process.env.KEYSTROKE_ROOT = previousRoot;\n\t}\n}\n/** Write `dist/.keystroke/route-manifest.json` for the project. */\nasync function emitStoredRouteManifestForProject(projectRoot) {\n\tpersistStoredRouteManifest(projectRoot, await buildStoredRouteManifestForProject(projectRoot));\n}\n//#endregion\n//#region src/openapi/manifest.ts\nfunction schedulesFromManifest(manifest) {\n\tconst schedules = [];\n\tfor (const entry of manifest) {\n\t\tif (entry.kind === \"cron-schedule\") {\n\t\t\tschedules.push({\n\t\t\t\tattachmentId: entry.attachmentId,\n\t\t\t\ttype: \"cron\",\n\t\t\t\tschedule: entry.schedule\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.kind === \"trigger-poll\") schedules.push({\n\t\t\tattachmentId: entry.attachmentId,\n\t\t\ttype: \"poll\",\n\t\t\tschedule: entry.schedule\n\t\t});\n\t}\n\treturn schedules;\n}\n//#endregion\n//#region src/load-route-manifest.ts\nfunction routeManifestPathForProjectRoot(projectRoot) {\n\treturn join(projectRoot, ROUTE_MANIFEST_REL_PATH);\n}\nfunction readRouteManifest(projectRoot) {\n\tconst path = routeManifestPathForProjectRoot(projectRoot);\n\tif (!existsSync(path)) throw new Error(`${ROUTE_MANIFEST_REL_PATH} not found — start the project server once to emit the manifest`);\n\tconst raw = readFileSync(path, \"utf8\");\n\treturn parseStoredRouteManifest(JSON.parse(raw));\n}\n//#endregion\nexport { agentRouteFromKey, buildPollGroups, buildStoredRouteManifestForProject, buildStoredRouteManifestFromContext, buildWebhookBindingsByRoute, countAgentCredentials, discoverAgentEntries, discoverEntries, discoverModuleFileEntries, discoverSkillManifestEntries, discoverTriggerAttachments, discoverWorkflowEntries, discoverWorkflows, emitStoredRouteManifestForProject, entryIdFromFile, findWebhookManifestEntryByEndpoint, findWebhookManifestEntryByPath, findWorkflowManifestEntry, importAgentDefinition, importTriggerAttachment, importWorkflowDefinition, matchesPollRunTarget, moduleFileKeyFromPath, persistStoredRouteManifest, pollGroupId, pollGroupRouteFromId, pollRouteFromKey, readRouteManifest, routeManifestPathForProjectRoot, schedulesFromManifest, schemaToJson, serializeRouteManifest, toStoredRouteManifest, validateImportedTriggerAttachment, validateImportedWorkflowDefinition, validatePollGroups, validateUniqueModuleKeys, walkTypeScriptFiles, webhookAttachmentSchemasFromBindings, webhookManifestAttachmentSchemasFromBindings, webhookMatchSchemaForBindings, webhookRouteFromEndpoint, workflowRouteFromKey };\n\n//# sourceMappingURL=index.mjs.map","import { buildStoredRouteManifestForProject, webhookRouteFromEndpoint } from \"@keystrokehq/manifest\";\nimport { completeProjectArtifact, ensureWebhookApiKeys, insertProjectArtifact, promoteProjectArtifact, resolveOrgDatabaseUrl, selectActiveProjectArtifactForProject, selectOrganizationById, selectProjectArtifactById, selectProjectById, selectProjectsByOrganizationId, updateOrganizationActive, updateOrganizationFailed, updateProjectActive, updateProjectArtifactManifest } from \"@keystrokehq/platform-database\";\nimport { runWithProjectDatabase, runWithProjectScope, selectEphemeralTriggerAttachments } from \"@keystrokehq/database\";\nimport { extractWebhookRoutesFromManifest, syncRegistryFromStoredManifest } from \"@keystrokehq/runtime\";\nimport { parseStoredRouteManifest } from \"@keystrokehq/shared\";\nimport { RouteManifestNotFoundError, extractRouteManifestFromArtifact } from \"@keystrokehq/storage\";\nimport { createJobQueue, defaultSchedulerPlugin } from \"@keystrokehq/scheduler\";\n//#region src/ensure-local-deploy.ts\nasync function upsertArtifactManifest(input) {\n\tconst existing = await selectActiveProjectArtifactForProject(input.projectId);\n\tif (existing) {\n\t\tawait updateProjectArtifactManifest({\n\t\t\tartifactId: existing.id,\n\t\t\tmanifestJson: input.manifest\n\t\t});\n\t\treturn;\n\t}\n\tconst artifactId = crypto.randomUUID();\n\tawait insertProjectArtifact({\n\t\tid: artifactId,\n\t\tprojectId: input.projectId,\n\t\tstorageKey: input.storageKey\n\t});\n\tawait completeProjectArtifact({\n\t\tartifactId,\n\t\tprojectId: input.projectId,\n\t\tmanifestJson: input.manifest\n\t});\n\tawait promoteProjectArtifact({\n\t\tartifactId,\n\t\tprojectId: input.projectId\n\t});\n}\n/** Stage a pre-built manifest as the project's active deploy (standalone/tests). */\nasync function ensureArtifactManifest(input) {\n\tawait upsertArtifactManifest({\n\t\tprojectId: input.projectId,\n\t\tmanifest: input.manifest,\n\t\tstorageKey: input.storageKey ?? `local:${input.projectId}`\n\t});\n}\n/** Stage the built dist manifest as the default project's active deploy (standalone sqlite). */\nasync function ensureLocalDeploy(input) {\n\tconst manifest = await buildStoredRouteManifestForProject(input.projectRoot, { reloadModules: true });\n\tawait upsertArtifactManifest({\n\t\tprojectId: input.projectId,\n\t\tmanifest,\n\t\tstorageKey: `local:${input.projectRoot}`\n\t});\n}\n//#endregion\n//#region src/management/start-project.ts\nasync function startProject(input) {\n\ttry {\n\t\tconst result = await input.runtime.start({\n\t\t\torganizationId: input.database.organizationId,\n\t\t\tdatabase: input.database,\n\t\t\tprojects: [{\n\t\t\t\tprojectId: input.projectId,\n\t\t\t\tname: input.name,\n\t\t\t\tartifactId: input.artifactId,\n\t\t\t\tartifactStorageKey: input.artifactStorageKey\n\t\t\t}]\n\t\t});\n\t\tawait input.onSuccess(result);\n\t} catch (error) {\n\t\tawait input.onFailure(error instanceof Error ? error : new Error(String(error)));\n\t}\n}\n//#endregion\n//#region src/promote-project-deploy.ts\nasync function resolveDeployManifest(input) {\n\tif (input.artifactManifest != null) return parseStoredRouteManifest(input.artifactManifest);\n\treturn parseStoredRouteManifest(extractRouteManifestFromArtifact(input.artifactBytes));\n}\n/** Cut over activeArtifactId, then sync org project registry from the artifact manifest. */\nasync function promoteProjectDeploy(input) {\n\tconst project = await selectProjectById(input.projectId);\n\tif (!project) throw new Error(`Project ${input.projectId} not found`);\n\tconst artifact = await selectProjectArtifactById(input.artifactId);\n\tif (!artifact || artifact.projectId !== input.projectId) throw new Error(`Artifact ${input.artifactId} not found for project ${input.projectId}`);\n\tconst organization = await selectOrganizationById(project.organizationId);\n\tif (!organization) throw new Error(`Organization not found for project ${input.projectId}`);\n\tif (!input.artifactBytes && artifact.manifestJson == null) throw new RouteManifestNotFoundError(\"Artifact has no stored route manifest; rebuild and redeploy\");\n\tconst manifest = await resolveDeployManifest({\n\t\tartifactId: input.artifactId,\n\t\tartifactManifest: artifact.manifestJson,\n\t\tartifactBytes: input.artifactBytes ?? Buffer.alloc(0)\n\t});\n\tif (artifact.manifestJson == null) await updateProjectArtifactManifest({\n\t\tartifactId: input.artifactId,\n\t\tmanifestJson: manifest\n\t});\n\tif (project.pendingArtifactId === input.artifactId) await promoteProjectArtifact({\n\t\tprojectId: input.projectId,\n\t\tartifactId: input.artifactId\n\t});\n\telse if (project.activeArtifactId !== input.artifactId) throw new Error(`Artifact ${input.artifactId} is not the pending deploy for project ${input.projectId}`);\n\tconst ephemeralRoutes = [];\n\tawait runWithProjectDatabase({\n\t\turl: resolveOrgDatabaseUrl(organization),\n\t\tsearchPath: organization.dbSchema\n\t}, async () => runWithProjectScope(project.id, async () => {\n\t\tawait syncRegistryFromStoredManifest(manifest);\n\t\tconst byRoute = /* @__PURE__ */ new Map();\n\t\tfor (const row of await selectEphemeralTriggerAttachments()) {\n\t\t\tif (row.source.kind !== \"webhook\") continue;\n\t\t\tconst route = webhookRouteFromEndpoint(row.source.endpoint);\n\t\t\tbyRoute.set(route, [...byRoute.get(route) ?? [], row.slug]);\n\t\t}\n\t\tfor (const [route, attachmentKeys] of byRoute) ephemeralRoutes.push({\n\t\t\troute,\n\t\t\tattachmentKeys\n\t\t});\n\t}));\n\tconst webhookRoutes = [...extractWebhookRoutesFromManifest(manifest), ...ephemeralRoutes];\n\tif (webhookRoutes.length > 0) await ensureWebhookApiKeys(project.id, webhookRoutes, project.id);\n}\n//#endregion\n//#region src/org-runtime-follow-up.ts\n/** True when a project still needs an org worker rebuild after a runtime job finishes. */\nfunction projectNeedsRuntimeFollowUp(project) {\n\tif (project.status === \"starting\" && project.pendingArtifactId) return true;\n\tif (project.pendingArtifactId && project.activeArtifactId !== project.pendingArtifactId) return true;\n\treturn false;\n}\nlet runtimeQueue;\nlet runtimeQueueInit;\nlet runtimeSchedulerPlugin;\nfunction configureProjectRuntimeScheduler(plugin) {\n\truntimeSchedulerPlugin = plugin;\n\truntimeQueue = void 0;\n\truntimeQueueInit = void 0;\n}\nasync function getOrgRuntimeQueue() {\n\tif (runtimeQueue) return runtimeQueue;\n\tif (!runtimeQueueInit) runtimeQueueInit = (async () => {\n\t\tconst queue = await createJobQueue({\n\t\t\tscope: \"platform\",\n\t\t\tplugin: runtimeSchedulerPlugin ?? defaultSchedulerPlugin()\n\t\t});\n\t\truntimeQueue = queue;\n\t\treturn queue;\n\t})();\n\treturn runtimeQueueInit;\n}\nfunction toOrgRuntimeJob(payload) {\n\tconst job = payload.payload;\n\tif (!job?.organizationId) throw new Error(\"Invalid org runtime job payload\");\n\treturn {\n\t\torganizationId: job.organizationId,\n\t\ttriggerProjectId: job.triggerProjectId,\n\t\ttriggerArtifactId: job.triggerArtifactId\n\t};\n}\nasync function resolveOrgProjects(job) {\n\tconst projects = await selectProjectsByOrganizationId(job.organizationId);\n\tconst deploys = [];\n\tfor (const project of projects) {\n\t\tconst artifactId = project.id === job.triggerProjectId && job.triggerArtifactId ? job.triggerArtifactId : project.pendingArtifactId ?? project.activeArtifactId;\n\t\tif (!artifactId) continue;\n\t\tconst artifact = await selectProjectArtifactById(artifactId);\n\t\tif (!artifact || artifact.projectId !== project.id || artifact.status !== \"ready\") {\n\t\t\tif (project.id === job.triggerProjectId) throw new Error(`Project ${project.id} pending artifact is not ready`);\n\t\t\tcontinue;\n\t\t}\n\t\tdeploys.push({\n\t\t\tprojectId: project.id,\n\t\t\tname: project.name,\n\t\t\tartifactId,\n\t\t\tartifactStorageKey: artifact.storageKey\n\t\t});\n\t}\n\tif (deploys.length === 0) throw new Error(`Organization ${job.organizationId} has no deployable projects`);\n\treturn deploys;\n}\nasync function orgNeedsRuntimeFollowUp(organizationId) {\n\treturn (await selectProjectsByOrganizationId(organizationId)).some(projectNeedsRuntimeFollowUp);\n}\nasync function enqueueOrgRuntime(job) {\n\treturn (await getOrgRuntimeQueue()).enqueue({\n\t\tkind: \"runtime\",\n\t\ttargetId: job.organizationId,\n\t\trunId: crypto.randomUUID(),\n\t\ttrigger: \"api\",\n\t\tpayload: job,\n\t\tmaxAttempts: 5,\n\t\tdedupeKey: job.organizationId\n\t});\n}\nasync function enqueueProjectRuntime(job) {\n\tconst project = await selectProjectById(job.projectId);\n\tif (!project) throw new Error(`Project ${job.projectId} not found`);\n\treturn enqueueOrgRuntime({\n\t\torganizationId: project.organizationId,\n\t\ttriggerProjectId: job.projectId,\n\t\ttriggerArtifactId: job.artifactId\n\t});\n}\nasync function destroyOrgRuntime(runtime, input, runtimeId) {\n\tif (!runtime.destroy) return;\n\ttry {\n\t\tawait runtime.destroy({\n\t\t\truntimeId,\n\t\t\thosting: input.hosting\n\t\t});\n\t} catch (destroyError) {\n\t\tconsole.error(`[org.runtime] failed to destroy runtime ${runtimeId}`, destroyError);\n\t}\n}\nasync function handleOrgRuntimeJob(runtime, resolveStartInput, payload) {\n\tif (payload.kind !== \"runtime\") return;\n\tconst job = toOrgRuntimeJob(payload);\n\ttry {\n\t\tconst organization = await selectOrganizationById(job.organizationId);\n\t\tif (!organization) throw new Error(`Organization ${job.organizationId} not found`);\n\t\tconst projects = await resolveOrgProjects(job);\n\t\tconst input = await resolveStartInput(job);\n\t\tconst mergedInput = {\n\t\t\t...input,\n\t\t\torganizationId: job.organizationId,\n\t\t\tprojects,\n\t\t\tpreviousRuntimeId: input.previousRuntimeId ?? organization.runtimeId\n\t\t};\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = await runtime.start(mergedInput);\n\t\t\tfor (const project of projects) {\n\t\t\t\tawait promoteProjectDeploy({\n\t\t\t\t\tprojectId: project.projectId,\n\t\t\t\t\tartifactId: project.artifactId,\n\t\t\t\t\tbaseUrl: result.baseUrl\n\t\t\t\t});\n\t\t\t\tawait updateProjectActive(project.projectId, {\n\t\t\t\t\tbaseUrl: result.baseUrl,\n\t\t\t\t\truntimeId: result.runtimeId\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait updateOrganizationActive(job.organizationId, {\n\t\t\t\tbaseUrl: result.baseUrl,\n\t\t\t\truntimeId: result.runtimeId\n\t\t\t});\n\t\t\tif (mergedInput.previousRuntimeId) await destroyOrgRuntime(runtime, mergedInput, mergedInput.previousRuntimeId);\n\t\t\tif (await orgNeedsRuntimeFollowUp(job.organizationId)) await enqueueOrgRuntime({ organizationId: job.organizationId });\n\t\t} catch (error) {\n\t\t\tif (result) await destroyOrgRuntime(runtime, mergedInput, result.runtimeId);\n\t\t\tthrow error;\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(`[org.runtime] ${job.organizationId} failed`, error);\n\t\tif (payload.exhaustedRetries) await updateOrganizationFailed(job.organizationId, \"Org runtime failed after retries\");\n\t\tthrow error;\n\t}\n}\nasync function startProjectRuntimeWorker(runtime, options = {}) {\n\tconst queue = await getOrgRuntimeQueue();\n\tconst resolveStartInput = options.resolveStartInput ?? (async (job) => {\n\t\tthrow new Error(`Org runtime for ${job.organizationId} requires resolveStartInput with database credentials`);\n\t});\n\tawait queue.startWorker(async (payload) => {\n\t\tawait handleOrgRuntimeJob(runtime, resolveStartInput, payload);\n\t});\n}\n/** @deprecated Runtime queues are created via the configured scheduler plugin. */\nasync function ensureProjectRuntimeQueues() {\n\tawait getOrgRuntimeQueue();\n}\n/** @internal Reset cached runtime queue between tests. */\nfunction resetProjectRuntimeQueueForTests() {\n\truntimeQueue = void 0;\n\truntimeQueueInit = void 0;\n\truntimeSchedulerPlugin = void 0;\n}\n//#endregion\n//#region src/resolve-runtime-artifact.ts\n/** Decide whether a pg-boss job should start runtime, skip as stale, or fail. */\nfunction resolveRuntimeArtifact(project, jobArtifactId) {\n\tif (jobArtifactId && project.pendingArtifactId && jobArtifactId !== project.pendingArtifactId) return { action: \"skip\" };\n\tif (jobArtifactId && !project.pendingArtifactId && project.activeArtifactId && jobArtifactId !== project.activeArtifactId) return { action: \"skip\" };\n\tconst artifactId = jobArtifactId ?? project.pendingArtifactId ?? project.activeArtifactId ?? null;\n\tif (!artifactId) return {\n\t\taction: \"error\",\n\t\tmessage: `Project ${project.id} has no pending artifact`\n\t};\n\tif (!project.pendingArtifactId && project.activeArtifactId === artifactId && project.status === \"active\" && project.baseUrl && project.runtimeId) return { action: \"skip\" };\n\treturn {\n\t\taction: \"run\",\n\t\tartifactId\n\t};\n}\n//#endregion\nexport { configureProjectRuntimeScheduler, enqueueOrgRuntime, enqueueProjectRuntime, ensureArtifactManifest, ensureLocalDeploy, ensureProjectRuntimeQueues, promoteProjectDeploy, resetProjectRuntimeQueueForTests, resolveRuntimeArtifact, startProject, startProjectRuntimeWorker };\n\n//# sourceMappingURL=index.mjs.map","import { AUTH_API_PATH, handleAuthRequest, type Auth } from \"@keystrokehq/auth\";\nimport type { Env, Hono } from \"hono\";\n\nexport function mountAuth<E extends Env>(app: Hono<E>, auth: Auth): void {\n app.on([\"POST\", \"GET\"], AUTH_API_PATH, (c) => handleAuthRequest(auth, c.req.raw));\n}\n","//#region src/api-keys/grants.ts\nconst apiKeysActions = {\n\tread: \"apiKeys:read\",\n\tcreate: \"apiKeys:create\"\n};\nconst apiKeysGrants = Object.values(apiKeysActions);\nconst apiKeysRoleGrants = {\n\towner: [apiKeysActions.read, apiKeysActions.create],\n\tadmin: [apiKeysActions.read, apiKeysActions.create],\n\tbuilder: [apiKeysActions.create]\n};\n//#endregion\n//#region src/organization/grants.ts\nconst organizationActions = {\n\tupdate: \"organization:update\",\n\tdelete: \"organization:delete\"\n};\nconst organizationGrants = Object.values(organizationActions);\nconst organizationRoleGrants = {\n\towner: [organizationActions.update, organizationActions.delete],\n\tadmin: [organizationActions.update],\n\tbuilder: []\n};\n//#endregion\n//#region src/users/grants.ts\nconst userActions = {\n\tmanage: \"users:manage\",\n\tinvite: \"users:invite\"\n};\nconst userGrants = Object.values(userActions);\nconst userRoleGrants = {\n\towner: [userActions.manage, userActions.invite],\n\tadmin: [userActions.manage, userActions.invite],\n\tbuilder: [userActions.invite]\n};\n/** Role ceiling: which roles each inviter may grant. Owner is never invitable (shared schema). */\nconst invitableRolesByRole = {\n\towner: [\"admin\", \"builder\"],\n\tadmin: [\"admin\", \"builder\"],\n\tbuilder: [\"builder\"]\n};\nfunction canInviteRole(inviter, invited) {\n\treturn invitableRolesByRole[inviter].includes(invited);\n}\n//#endregion\n//#region src/policy.ts\nfunction mergeRoleGrants(role) {\n\treturn [\n\t\t...organizationRoleGrants[role],\n\t\t...userRoleGrants[role],\n\t\t...apiKeysRoleGrants[role]\n\t];\n}\nconst orgRolePermissions = {\n\towner: mergeRoleGrants(\"owner\"),\n\tadmin: mergeRoleGrants(\"admin\"),\n\tbuilder: mergeRoleGrants(\"builder\")\n};\n//#endregion\n//#region src/projects/grants.ts\nconst projectActions = {\n\tread: \"project:read\",\n\tdeploy: \"project:deploy\",\n\tupdate: \"project:update\",\n\tdelete: \"project:delete\",\n\tmanageMembers: \"project:manage-members\",\n\tinvite: \"project:invite\"\n};\nconst projectGrants = Object.values(projectActions);\nconst projectRoleGrants = {\n\tadmin: Object.values(projectActions),\n\tbuilder: [projectActions.read, projectActions.deploy]\n};\n//#endregion\n//#region src/check-permission.ts\nconst orgAdminRoles = new Set([\"owner\", \"admin\"]);\nconst projectActionSet = new Set(projectGrants);\nfunction isProjectAction(action) {\n\treturn projectActionSet.has(action);\n}\nfunction checkPermission(action, ctx) {\n\tif (isProjectAction(action)) {\n\t\tif (orgAdminRoles.has(ctx.orgRole)) return true;\n\t\treturn ctx.projectRole != null && projectRoleGrants[ctx.projectRole].includes(action);\n\t}\n\treturn orgRolePermissions[ctx.orgRole].includes(action);\n}\n//#endregion\n//#region src/projects/visibility.ts\nfunction projectListScope(ctx) {\n\treturn checkPermission(projectActions.read, ctx) ? { kind: \"all\" } : { kind: \"member-only\" };\n}\nfunction canReadProject(ctx, hasMembership) {\n\treturn checkPermission(projectActions.read, ctx) || hasMembership;\n}\n//#endregion\n//#region src/agents/visibility.ts\nconst agentListScope = projectListScope;\nconst canAccessAgent = canReadProject;\n//#endregion\n//#region src/api-keys/can-revoke-api-key.ts\nfunction canRevokeApiKey(ctx, input) {\n\treturn input.userId === input.createdByUserId || checkPermission(userActions.manage, ctx);\n}\n//#endregion\n//#region src/api-keys/visibility.ts\nfunction apiKeyListScope(ctx) {\n\treturn checkPermission(apiKeysActions.read, ctx) ? { kind: \"all\" } : { kind: \"creator-only\" };\n}\nfunction canReadApiKey(ctx, input) {\n\treturn checkPermission(apiKeysActions.read, ctx) || input.userId === input.createdByUserId;\n}\n//#endregion\n//#region src/actions.ts\nconst actions = [\n\t...organizationGrants,\n\t...userGrants,\n\t...apiKeysGrants,\n\t...projectGrants\n];\n//#endregion\n//#region src/labels.ts\nconst ORG_ROLE_LABELS = {\n\towner: \"Owner\",\n\tadmin: \"Admin\",\n\tbuilder: \"Builder\"\n};\nconst PROJECT_ROLE_LABELS = {\n\tadmin: \"Project admin\",\n\tbuilder: \"Builder\"\n};\n//#endregion\n//#region src/history/visibility.ts\nconst historyListScope = projectListScope;\nconst canAccessHistoryRun = canReadProject;\n//#endregion\n//#region src/projects/can-invite-to-project.ts\nfunction canInviteToProject(ctx, settings, invitedRole) {\n\tif (!(checkPermission(projectActions.invite, ctx) || settings.invitePermission === \"all\" && ctx.projectRole === \"builder\")) return false;\n\tif (checkPermission(projectActions.manageMembers, ctx)) return true;\n\treturn invitedRole === \"builder\";\n}\n//#endregion\n//#region src/recents/visibility.ts\nconst recentsListScope = projectListScope;\nconst canAccessRecentResource = canReadProject;\n//#endregion\n//#region src/skills/visibility.ts\nconst skillListScope = projectListScope;\nconst canAccessSkill = canReadProject;\n//#endregion\n//#region src/workflows/visibility.ts\nconst workflowListScope = projectListScope;\nconst canAccessWorkflow = canReadProject;\n//#endregion\nexport { ORG_ROLE_LABELS, PROJECT_ROLE_LABELS, actions, agentListScope, apiKeyListScope, apiKeysActions, apiKeysGrants, apiKeysRoleGrants, canAccessAgent, canAccessHistoryRun, canAccessRecentResource, canAccessSkill, canAccessWorkflow, canInviteRole, canInviteToProject, canReadApiKey, canReadProject, canRevokeApiKey, checkPermission, historyListScope, invitableRolesByRole, orgRolePermissions, organizationActions, organizationGrants, organizationRoleGrants, projectActions, projectGrants, projectListScope, projectRoleGrants, recentsListScope, skillListScope, userActions, userGrants, userRoleGrants, workflowListScope };\n\n//# sourceMappingURL=index.mjs.map","import type { AccessContext } from \"@keystrokehq/access-control\";\nimport type { ProjectInvitePermission } from \"@keystrokehq/shared\";\nimport type { Context } from \"hono\";\n\nimport type { ProjectMemberContext } from \"@keystrokehq/http/auth\";\n\nexport function accessContext(c: Context): AccessContext {\n const organization = c.get(\"organization\");\n const projectMember = c.get(\"projectMember\") as ProjectMemberContext | undefined;\n\n return {\n orgRole: organization.role,\n projectRole: projectMember?.role,\n };\n}\n\nexport function getProjectInvitePermission(c: Context): ProjectInvitePermission {\n const project = c.get(\"project\") as { invitePermission: ProjectInvitePermission };\n return project.invitePermission;\n}\n","import { ACTIVE_ORG_HEADER, ErrorResponseSchema, mapProject } from \"@keystrokehq/shared\";\nimport { createDefaultAuthJwtVerifier, extractWebhookApiKeyFromRequest, resolveRequestAuth } from \"@keystrokehq/auth\";\nimport { loadOrgPlatformApiKeyUser, runWithWorkspaceContext, selectOrganizationById, selectProjectForOrganization, selectUserOrganizationMembership, selectUserProjectMembership, verifyOrgPlatformApiKeySecret } from \"@keystrokehq/platform-database\";\nimport { checkPermission, projectActions } from \"@keystrokehq/access-control\";\n//#region src/auth/resolve-org-id.ts\nfunction resolveActiveOrganizationId(c) {\n\tconst header = c.req.header(ACTIVE_ORG_HEADER)?.trim();\n\tif (header) return header;\n\treturn c.get(\"apiKeyAuth\")?.organizationId;\n}\n//#endregion\n//#region src/auth/require-organization.ts\nasync function resolveOrganizationContext(c) {\n\tconst organizationId = resolveActiveOrganizationId(c);\n\tif (!organizationId) return {\n\t\tok: false,\n\t\tresponse: c.json(ErrorResponseSchema.parse({\n\t\t\terror: \"Select an organization to continue\",\n\t\t\tcode: \"needs_org_selection\"\n\t\t}), 409)\n\t};\n\tconst apiKeyAuth = c.get(\"apiKeyAuth\");\n\tif (apiKeyAuth && apiKeyAuth.organizationId !== organizationId) return {\n\t\tok: false,\n\t\tresponse: c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403)\n\t};\n\tconst membership = await selectUserOrganizationMembership(c.get(\"user\").id, organizationId);\n\tif (!membership) return {\n\t\tok: false,\n\t\tresponse: c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403)\n\t};\n\treturn {\n\t\tok: true,\n\t\torganization: {\n\t\t\torganizationId: membership.organization.id,\n\t\t\torganizationName: membership.organization.name,\n\t\t\trole: membership.role\n\t\t}\n\t};\n}\nfunction requireOrganization() {\n\treturn async (c, next) => {\n\t\tconst resolved = await resolveOrganizationContext(c);\n\t\tif (!resolved.ok) return resolved.response;\n\t\tc.set(\"organization\", resolved.organization);\n\t\tawait next();\n\t};\n}\n//#endregion\n//#region src/auth/require-project.ts\nfunction requireProject() {\n\treturn async (c, next) => {\n\t\tconst organization = c.get(\"organization\");\n\t\tconst projectId = c.req.param(\"projectId\")?.trim();\n\t\tif (!projectId) return c.json(ErrorResponseSchema.parse({ error: \"Project id is required\" }), 400);\n\t\tconst [project, organizationRow] = await Promise.all([selectProjectForOrganization(organization.organizationId, projectId), selectOrganizationById(organization.organizationId)]);\n\t\tif (!project) return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n\t\tif (!organizationRow) return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n\t\tc.set(\"project\", project);\n\t\tawait runWithWorkspaceContext({\n\t\t\torganizationId: organization.organizationId,\n\t\t\trole: organization.role,\n\t\t\tprojectId: project.id,\n\t\t\tdbSchema: organizationRow.dbSchema\n\t\t}, () => next());\n\t};\n}\nfunction routeProject(project) {\n\treturn mapProject(project);\n}\n//#endregion\n//#region src/auth/responses.ts\nfunction forbidden(c) {\n\treturn c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403);\n}\nfunction notFound(c, message = \"Not found\") {\n\treturn c.json(ErrorResponseSchema.parse({ error: message }), 404);\n}\n//#endregion\n//#region src/auth/require-project-membership.ts\nfunction requireProjectMembership() {\n\treturn async (c, next) => {\n\t\tconst { role: orgRole } = c.get(\"organization\");\n\t\tconst project = c.get(\"project\");\n\t\tif (checkPermission(projectActions.read, { orgRole })) {\n\t\t\tawait next();\n\t\t\treturn;\n\t\t}\n\t\tconst membership = await selectUserProjectMembership(c.get(\"user\").id, project.id);\n\t\tif (!membership) return notFound(c, \"Project not found\");\n\t\tc.set(\"projectMember\", { role: membership.role });\n\t\tawait next();\n\t};\n}\n//#endregion\n//#region src/auth/require-session.ts\nfunction sessionFromApiKeyUser(user, token) {\n\treturn {\n\t\tuser: {\n\t\t\tid: user.id,\n\t\t\temail: user.email,\n\t\t\tname: user.name,\n\t\t\timage: user.image ?? null,\n\t\t\temailVerified: user.emailVerified,\n\t\t\tcreatedAt: user.createdAt,\n\t\t\tupdatedAt: user.updatedAt\n\t\t},\n\t\tsession: {\n\t\t\tid: user.id,\n\t\t\tuserId: user.id,\n\t\t\ttoken,\n\t\t\texpiresAt: new Date(Date.now() + 900 * 1e3),\n\t\t\tcreatedAt: /* @__PURE__ */ new Date(),\n\t\t\tupdatedAt: /* @__PURE__ */ new Date()\n\t\t}\n\t};\n}\nfunction requireSession(jwtVerifier) {\n\tconst verifier = jwtVerifier ?? createDefaultAuthJwtVerifier();\n\treturn async (c, next) => {\n\t\tconst result = await resolveRequestAuth(verifier, c.req.raw.headers);\n\t\tif (result) {\n\t\t\tc.set(\"user\", result.user);\n\t\t\tc.set(\"session\", result.session);\n\t\t\tawait next();\n\t\t\treturn;\n\t\t}\n\t\tconst apiKeySecret = extractWebhookApiKeyFromRequest(c.req.raw);\n\t\tif (apiKeySecret) {\n\t\t\tconst verified = await verifyOrgPlatformApiKeySecret(apiKeySecret);\n\t\t\tif (verified) {\n\t\t\t\tconst user = await loadOrgPlatformApiKeyUser(verified.userId);\n\t\t\t\tif (user) {\n\t\t\t\t\tconst session = sessionFromApiKeyUser(user, apiKeySecret);\n\t\t\t\t\tc.set(\"user\", session.user);\n\t\t\t\t\tc.set(\"session\", session.session);\n\t\t\t\t\tc.set(\"apiKeyAuth\", {\n\t\t\t\t\t\tapiKeyId: verified.apiKeyId,\n\t\t\t\t\t\torganizationId: verified.organizationId\n\t\t\t\t\t});\n\t\t\t\t\tawait next();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn c.json({ error: \"Unauthorized\" }, 401);\n\t};\n}\n//#endregion\nexport { requireProject as a, resolveOrganizationContext as c, notFound as i, resolveActiveOrganizationId as l, requireProjectMembership as n, routeProject as o, forbidden as r, requireOrganization as s, requireSession as t };\n\n//# sourceMappingURL=require-session-BLPGA50N.mjs.map","import { checkPermission, type Action } from \"@keystrokehq/access-control\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport { accessContext } from \"./access-context\";\nimport { forbidden } from \"@keystrokehq/http/auth\";\nimport type { OrganizationVariables } from \"@keystrokehq/http/auth\";\n\nexport function authorize(action: Action): MiddlewareHandler<{ Variables: OrganizationVariables }> {\n return async (c, next) => {\n if (!checkPermission(action, accessContext(c))) {\n return forbidden(c);\n }\n\n await next();\n };\n}\n","import { type AccessContext } from \"@keystrokehq/access-control\";\nimport type { Context } from \"hono\";\nimport type { MiddlewareHandler } from \"hono\";\nimport type { ZodType } from \"zod\";\n\nimport { accessContext } from \"./access-context\";\nimport { forbidden } from \"@keystrokehq/http/auth\";\nimport type { OrganizationVariables } from \"@keystrokehq/http/auth\";\n\nexport function authorizePayload<T>(\n schema: ZodType<T>,\n allow: (input: { c: Context; ctx: AccessContext; body: T }) => boolean,\n): MiddlewareHandler<{ Variables: OrganizationVariables }> {\n return async (c, next) => {\n const parsed = schema.safeParse(await c.req.json().catch(() => null));\n\n if (parsed.success && !allow({ c, ctx: accessContext(c), body: parsed.data })) {\n return forbidden(c);\n }\n\n await next();\n };\n}\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { selectUserOrganizationMembership } from \"@keystrokehq/platform-database\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { OrganizationVariables } from \"@keystrokehq/http/auth\";\n\nexport function requireOrganizationParam(): MiddlewareHandler<{\n Variables: OrganizationVariables;\n}> {\n return async (c, next) => {\n const organizationId = c.req.param(\"organizationId\")?.trim();\n\n if (!organizationId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization id is required\" }), 400);\n }\n\n const user = c.get(\"user\");\n const membership = await selectUserOrganizationMembership(user.id, organizationId);\n\n if (!membership) {\n return c.json(ErrorResponseSchema.parse({ error: \"Forbidden\" }), 403);\n }\n\n c.set(\"organization\", {\n organizationId: membership.organization.id,\n organizationName: membership.organization.name,\n role: membership.role,\n });\n\n await next();\n };\n}\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { resolveOrgDatabaseUrl, runWithOrganizationScope, selectActiveArtifactManifestForProject, selectOrganizationById, selectProjectById } from \"@keystrokehq/platform-database\";\nimport { inferDialect, runWithProjectDatabase, runWithProjectScope, runWithTenantScope } from \"@keystrokehq/database\";\nimport { createScheduler, defaultSchedulerPlugin } from \"@keystrokehq/scheduler\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n//#region src/middleware/resolve-public-project.ts\nfunction resolvePublicProject() {\n\treturn async (c, next) => {\n\t\tconst projectId = c.req.param(\"projectId\")?.trim();\n\t\tif (!projectId) return c.json(ErrorResponseSchema.parse({ error: \"Project id is required\" }), 400);\n\t\tconst project = await selectProjectById(projectId);\n\t\tif (!project) return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n\t\tc.set(\"project\", project);\n\t\tawait next();\n\t};\n}\n//#endregion\n//#region src/lib/project-scheduler.ts\nconst schedulerByKey = /* @__PURE__ */ new Map();\nlet configuredSchedulerPlugin;\n/** Platform-wide scheduler plugin for enqueue paths (HTTP middleware, Slack gateway). */\nfunction configureProjectSchedulerPlugin(plugin) {\n\tconfiguredSchedulerPlugin = plugin;\n\tschedulerByKey.clear();\n}\nasync function getProjectScheduler(organization, projectId, plugin) {\n\tconst url = resolveOrgDatabaseUrl(organization);\n\tconst resolvedPlugin = plugin ?? configuredSchedulerPlugin ?? defaultSchedulerPlugin();\n\tconst key = `${url}::${organization.id}::${resolvedPlugin.name}`;\n\tlet pending = schedulerByKey.get(key);\n\tif (!pending) {\n\t\tpending = createScheduler({\n\t\t\turl,\n\t\t\tscope: \"organization\",\n\t\t\torganizationId: organization.id,\n\t\t\tplugin: resolvedPlugin\n\t\t});\n\t\tschedulerByKey.set(key, pending);\n\t}\n\treturn pending;\n}\n//#endregion\n//#region src/middleware/with-organization-database.ts\n/** Bind platform credential partition for org-scoped integration routes. */\nfunction withOrganizationDatabase() {\n\treturn async (c, next) => {\n\t\tconst { organizationId } = c.get(\"organization\");\n\t\tif (!await selectOrganizationById(organizationId)) return c.json({ error: \"Organization not found\" }, 404);\n\t\tawait runWithOrganizationScope(organizationId, () => runWithTenantScope(organizationId, () => next()));\n\t};\n}\n//#endregion\n//#region src/lib/request-background-tasks.ts\nconst requestBackgroundTasks = new AsyncLocalStorage();\nfunction runWithRequestBackgroundTasks(fn) {\n\treturn requestBackgroundTasks.run([], fn);\n}\nfunction deferRequestBackgroundTask(task) {\n\tconst tasks = requestBackgroundTasks.getStore();\n\tif (!tasks) return;\n\ttasks.push(task);\n}\nasync function flushRequestBackgroundTasks() {\n\tconst tasks = requestBackgroundTasks.getStore() ?? [];\n\tawait Promise.allSettled(tasks);\n}\n//#endregion\n//#region src/lib/resolve-org-project-database.ts\n/** Org DB connection options for `@keystrokehq/database` project scope (pg schema vs sqlite file). */\nfunction resolveOrgProjectDatabaseOptions(organization) {\n\tconst url = resolveOrgDatabaseUrl(organization);\n\tif (inferDialect(url) === \"postgres\") return {\n\t\turl,\n\t\tsearchPath: organization.dbSchema\n\t};\n\treturn { url };\n}\n//#endregion\n//#region src/middleware/with-organization-project-database.ts\n/** Bind the org's shared Postgres schema (all projects in the org use this DB). */\nfunction withOrganizationProjectDatabase() {\n\treturn async (c, next) => {\n\t\tconst { organizationId } = c.get(\"organization\");\n\t\tconst organization = await selectOrganizationById(organizationId);\n\t\tif (!organization) return c.json({ error: \"Organization not found\" }, 404);\n\t\tconst dbOptions = resolveOrgProjectDatabaseOptions(organization);\n\t\tawait runWithOrganizationScope(organizationId, () => runWithProjectDatabase(dbOptions, () => runWithTenantScope(organizationId, () => runWithRequestBackgroundTasks(async () => {\n\t\t\tawait next();\n\t\t\tawait flushRequestBackgroundTasks();\n\t\t}))));\n\t};\n}\n//#endregion\n//#region src/middleware/with-project-runtime.ts\nfunction withProjectRuntime() {\n\treturn async (c, next) => {\n\t\tconst project = c.get(\"project\");\n\t\tconst organization = await selectOrganizationById(project.organizationId);\n\t\tif (!organization) return c.json({ error: \"Organization not found\" }, 404);\n\t\tconst dbOptions = resolveOrgProjectDatabaseOptions(organization);\n\t\treturn runWithOrganizationScope(project.organizationId, () => runWithProjectDatabase(dbOptions, async () => runWithProjectScope(project.id, async () => runWithTenantScope(project.organizationId, async () => {\n\t\t\tconst manifestRaw = await selectActiveArtifactManifestForProject(project.id);\n\t\t\tif (!manifestRaw || typeof manifestRaw !== \"object\") return c.json({ error: \"Project runtime manifest is not available\" }, 503);\n\t\t\tconst scheduler = await getProjectScheduler(organization, project.id);\n\t\t\tc.set(\"jobQueue\", scheduler);\n\t\t\tc.set(\"scheduler\", scheduler);\n\t\t\tc.set(\"manifest\", manifestRaw);\n\t\t\tawait next();\n\t\t}))));\n\t};\n}\n//#endregion\n//#region src/middleware/with-public-project-runtime.ts\nfunction withPublicProjectRuntime() {\n\treturn async (c, next) => {\n\t\tconst project = c.get(\"project\");\n\t\tif (project.status !== \"active\") return c.json({ error: \"Project is not active\" }, 503);\n\t\tconst organization = await selectOrganizationById(project.organizationId);\n\t\tif (!organization) return c.json({ error: \"Organization not found\" }, 404);\n\t\tconst dbOptions = resolveOrgProjectDatabaseOptions(organization);\n\t\tawait runWithOrganizationScope(project.organizationId, () => runWithProjectDatabase(dbOptions, async () => runWithProjectScope(project.id, async () => runWithTenantScope(project.organizationId, async () => {\n\t\t\tconst manifestRaw = await selectActiveArtifactManifestForProject(project.id);\n\t\t\tif (!manifestRaw || typeof manifestRaw !== \"object\") return c.json({ error: \"Project runtime manifest is not available\" }, 503);\n\t\t\tconst scheduler = await getProjectScheduler(organization, project.id);\n\t\t\tc.set(\"jobQueue\", scheduler);\n\t\t\tc.set(\"scheduler\", scheduler);\n\t\t\tc.set(\"manifest\", manifestRaw);\n\t\t\tawait next();\n\t\t}))));\n\t};\n}\n//#endregion\nexport { flushRequestBackgroundTasks as a, configureProjectSchedulerPlugin as c, deferRequestBackgroundTask as i, getProjectScheduler as l, withProjectRuntime as n, runWithRequestBackgroundTasks as o, withOrganizationProjectDatabase as r, withOrganizationDatabase as s, withPublicProjectRuntime as t, resolvePublicProject as u };\n\n//# sourceMappingURL=with-public-project-runtime-B7hmgjbi.mjs.map","import { UserAvatarSchema, ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { selectUserById } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const dbUser = await selectUserById(user.id);\n if (!dbUser) {\n return c.json(ErrorResponseSchema.parse({ error: \"User not found\" }), 404);\n }\n\n return c.json(UserAvatarSchema.parse({ url: dbUser.image ?? null }));\n};\n","const ALLOWED_AVATAR_CONTENT_TYPES = {\n \"image/jpeg\": \"jpg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/webp\": \"webp\",\n \"image/gif\": \"gif\",\n} as const;\n\nexport type AllowedAvatarContentType = keyof typeof ALLOWED_AVATAR_CONTENT_TYPES;\n\nexport function avatarExtensionForContentType(contentType: string): string | null {\n const normalized = contentType.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n return ALLOWED_AVATAR_CONTENT_TYPES[normalized as AllowedAvatarContentType] ?? null;\n}\n\nexport function isAllowedAvatarContentType(contentType: string): boolean {\n return avatarExtensionForContentType(contentType) !== null;\n}\n","import {\n ErrorResponseSchema,\n PresignUserAvatarRequestSchema,\n PresignUserAvatarResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { createAssetsStorageClient, userAvatarStorageKey } from \"@keystrokehq/storage\";\n\nimport { avatarExtensionForContentType } from \"../../../../../../lib/user-avatar-content-type\";\nimport type { AccountRouteHandler } from \"../../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const parsed = PresignUserAvatarRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid avatar upload request\" }), 400);\n }\n\n const extension = avatarExtensionForContentType(parsed.data.contentType);\n if (!extension) {\n return c.json(ErrorResponseSchema.parse({ error: \"Unsupported image type\" }), 400);\n }\n\n const user = c.get(\"user\");\n const storageKey = userAvatarStorageKey(user.id, extension);\n const storage = createAssetsStorageClient();\n const uploadUrl = await storage.presignPut({\n key: storageKey,\n contentType: parsed.data.contentType,\n });\n\n return c.json(\n PresignUserAvatarResponseSchema.parse({\n uploadUrl,\n storageKey,\n }),\n );\n};\n","import type { StorageClient } from \"@keystrokehq/storage\";\n\nexport async function finalizeStoredImageUpload(input: {\n storage: StorageClient;\n storageKey: string;\n isValidStorageKey: (key: string) => boolean;\n buildPublicUrl: (key: string) => string;\n}): Promise<{ ok: true; publicUrl: string } | { ok: false; error: string }> {\n if (!input.isValidStorageKey(input.storageKey)) {\n return { ok: false, error: \"Invalid storage key\" };\n }\n\n const head = await input.storage.headObject(input.storageKey);\n if (!head || head.contentLength <= 0) {\n return { ok: false, error: \"Upload not found\" };\n }\n\n return { ok: true, publicUrl: input.buildPublicUrl(input.storageKey) };\n}\n\nexport async function deleteStoredImageIfOwned(input: {\n storage: StorageClient;\n url: string | null | undefined;\n isOwnedPublicUrl: (url: string) => boolean;\n keyFromPublicUrl: (url: string) => string | null;\n}): Promise<void> {\n if (!input.url || !input.isOwnedPublicUrl(input.url)) {\n return;\n }\n\n const key = input.keyFromPublicUrl(input.url);\n if (!key) {\n return;\n }\n\n await input.storage.deleteObject(key).catch(() => undefined);\n}\n","import { ErrorResponseSchema, UserAvatarPatchSchema, UserAvatarSchema } from \"@keystrokehq/shared\";\nimport { selectUserById, updateUserById } from \"@keystrokehq/platform-database\";\nimport {\n createAssetsStorageClient,\n isKeystrokeAssetsAvatarPublicUrl,\n isUserAvatarStorageKey,\n keystrokeAssetsAvatarKeyFromPublicUrl,\n publicKeystrokeAssetsObjectUrl,\n} from \"@keystrokehq/storage\";\n\nimport {\n deleteStoredImageIfOwned,\n finalizeStoredImageUpload,\n} from \"../../../../../lib/stored-image\";\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const parsed = UserAvatarPatchSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid avatar update\" }), 400);\n }\n\n const user = c.get(\"user\");\n const dbUser = await selectUserById(user.id);\n if (!dbUser) {\n return c.json(ErrorResponseSchema.parse({ error: \"User not found\" }), 404);\n }\n\n const storage = createAssetsStorageClient();\n const { storageKey } = parsed.data;\n\n if (storageKey === null) {\n await deleteStoredImageIfOwned({\n storage,\n url: dbUser.image,\n isOwnedPublicUrl: isKeystrokeAssetsAvatarPublicUrl,\n keyFromPublicUrl: keystrokeAssetsAvatarKeyFromPublicUrl,\n });\n await updateUserById(user.id, { image: null, updatedAt: new Date() });\n return c.json(UserAvatarSchema.parse({ url: null }));\n }\n\n const finalized = await finalizeStoredImageUpload({\n storage,\n storageKey,\n isValidStorageKey: (key) => isUserAvatarStorageKey(key, user.id),\n buildPublicUrl: publicKeystrokeAssetsObjectUrl,\n });\n\n if (!finalized.ok) {\n return c.json(ErrorResponseSchema.parse({ error: finalized.error }), 400);\n }\n\n if (dbUser.image && dbUser.image !== finalized.publicUrl) {\n await deleteStoredImageIfOwned({\n storage,\n url: dbUser.image,\n isOwnedPublicUrl: isKeystrokeAssetsAvatarPublicUrl,\n keyFromPublicUrl: keystrokeAssetsAvatarKeyFromPublicUrl,\n });\n }\n\n await updateUserById(user.id, { image: finalized.publicUrl, updatedAt: new Date() });\n return c.json(UserAvatarSchema.parse({ url: finalized.publicUrl }));\n};\n","import {\n ErrorResponseSchema,\n normalizeUserPreferences,\n UserPreferencesSchema,\n} from \"@keystrokehq/shared\";\nimport { selectUserById } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const dbUser = await selectUserById(user.id);\n if (!dbUser) {\n return c.json(ErrorResponseSchema.parse({ error: \"User not found\" }), 404);\n }\n\n return c.json(UserPreferencesSchema.parse(normalizeUserPreferences(dbUser.preferences)));\n};\n","import {\n ErrorResponseSchema,\n mergeUserPreferences,\n normalizeUserPreferences,\n UserPreferencesPatchSchema,\n UserPreferencesSchema,\n} from \"@keystrokehq/shared\";\nimport { selectUserById, updateUserById } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const parsed = UserPreferencesPatchSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid preferences update\" }), 400);\n }\n\n const user = c.get(\"user\");\n const dbUser = await selectUserById(user.id);\n if (!dbUser) {\n return c.json(ErrorResponseSchema.parse({ error: \"User not found\" }), 404);\n }\n\n const current = normalizeUserPreferences(dbUser.preferences);\n const next = mergeUserPreferences(current, parsed.data);\n\n await updateUserById(user.id, {\n preferences: next,\n updatedAt: new Date(),\n });\n\n return c.json(UserPreferencesSchema.parse(next));\n};\n","import { ListOrganizationsResponseSchema, mapUserOrganization } from \"@keystrokehq/shared\";\nimport { selectUserOrganizations } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const memberships = await selectUserOrganizations(user.id);\n\n return c.json(ListOrganizationsResponseSchema.parse(memberships.map(mapUserOrganization)));\n};\n","import { seedOAuthAppsFromEnvForOrganization } from \"@keystrokehq/runtime\";\nimport type { HostingPlugin } from \"@keystrokehq/hosting\";\nimport type { OrganizationStorageResult, StoragePlugin } from \"@keystrokehq/storage\";\nimport {\n createOrganizationForUser,\n encryptCredentialPayload,\n isOrganizationStorageBucketInUse,\n OrganizationSlugTakenError,\n resolveNewOrganizationIdentity,\n type UserOrganizationMembership,\n} from \"@keystrokehq/platform-database\";\n\nexport type CreateOrganizationDependencies = {\n hosting: HostingPlugin;\n storage: StoragePlugin;\n};\n\nexport async function createOrganizationWithHosting(\n deps: CreateOrganizationDependencies,\n userId: string,\n name: string,\n preferredSlug?: string,\n): Promise<UserOrganizationMembership> {\n const { hosting, storage } = deps;\n const identity = await resolveNewOrganizationIdentity(name, preferredSlug);\n let hostedAppName: string | undefined;\n let provisionedStorage: OrganizationStorageResult | undefined;\n let organizationPersisted = false;\n\n try {\n if (hosting.provisionOrganization) {\n const hosted = await hosting.provisionOrganization({\n organizationId: identity.organizationId,\n name: name.trim(),\n });\n hostedAppName = hosted.appName;\n }\n\n provisionedStorage = await storage.provisionOrganization({\n organizationId: identity.organizationId,\n name: name.trim(),\n });\n\n const membership = await createOrganizationForUser(userId, name, preferredSlug, {\n organizationId: identity.organizationId,\n slug: identity.slug,\n hostingAppName: hostedAppName ?? null,\n storage: {\n bucket: provisionedStorage.bucket,\n endpoint: provisionedStorage.endpoint,\n accessKeyIdCiphertext: encryptCredentialPayload(provisionedStorage.accessKeyId),\n secretAccessKeyCiphertext: encryptCredentialPayload(provisionedStorage.secretAccessKey),\n region: provisionedStorage.region ?? null,\n forcePathStyle: provisionedStorage.forcePathStyle ?? null,\n },\n });\n organizationPersisted = true;\n await seedOAuthAppsFromEnvForOrganization(identity.organizationId);\n return membership;\n } catch (error) {\n if (provisionedStorage && !organizationPersisted) {\n const bucketInUse = await isOrganizationStorageBucketInUse(provisionedStorage.bucket);\n if (!bucketInUse) {\n await storage.deprovisionOrganization(provisionedStorage).catch(() => undefined);\n }\n }\n if (hostedAppName && hosting.deprovisionOrganization) {\n await hosting.deprovisionOrganization({ appName: hostedAppName }).catch(() => undefined);\n }\n\n throw error;\n }\n}\n\nexport { OrganizationSlugTakenError };\n","import { OrganizationSlugTakenError } from \"@keystrokehq/platform-database\";\nimport type { OrganizationSlugErrorCode } from \"@keystrokehq/shared\";\nimport { organizationSlugErrorCodeFromMessage } from \"@keystrokehq/shared\";\nimport { ZodError } from \"zod\";\n\nexport function organizationSlugErrorBody(error: OrganizationSlugTakenError | ZodError): {\n error: string;\n code: OrganizationSlugErrorCode;\n} {\n if (error instanceof OrganizationSlugTakenError) {\n return { error: error.message, code: \"slug_taken\" };\n }\n\n const message = error.issues[0]?.message ?? \"Invalid organization slug\";\n return {\n error: message,\n code: organizationSlugErrorCodeFromMessage(message),\n };\n}\n","import {\n CreateOrganizationRequestSchema,\n CreateOrganizationResponseSchema,\n ErrorResponseSchema,\n mapUserOrganization,\n} from \"@keystrokehq/shared\";\nimport type { CreateOrganizationDependencies } from \"../../../services/create-organization\";\nimport { ZodError } from \"zod\";\n\nimport type { AccountRouteHandler } from \"../../types\";\nimport {\n createOrganizationWithHosting,\n OrganizationSlugTakenError,\n} from \"../../../services/create-organization\";\nimport { organizationSlugErrorBody } from \"./slug-errors\";\n\nexport function createOrganizationHandler(\n deps: CreateOrganizationDependencies,\n): AccountRouteHandler {\n return async (c) => {\n const user = c.get(\"user\");\n const body = await c.req.json().catch(() => null);\n const parsed = CreateOrganizationRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid organization request\" }), 400);\n }\n\n try {\n const membership = await createOrganizationWithHosting(\n deps,\n user.id,\n parsed.data.name,\n parsed.data.slug,\n );\n\n return c.json(CreateOrganizationResponseSchema.parse(mapUserOrganization(membership)), 201);\n } catch (error) {\n if (error instanceof OrganizationSlugTakenError) {\n return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 409);\n }\n\n if (error instanceof ZodError) {\n return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 400);\n }\n\n throw error;\n }\n };\n}\n","import {\n ErrorResponseSchema,\n SlugAvailabilityQuerySchema,\n SlugAvailabilityResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { checkOrganizationSlugAvailability } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const parsed = SlugAvailabilityQuerySchema.safeParse({\n slug: c.req.query(\"slug\"),\n excludeOrganizationId: c.req.query(\"excludeOrganizationId\"),\n });\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid slug query\" }), 400);\n }\n\n const availability = await checkOrganizationSlugAvailability(\n parsed.data.slug,\n parsed.data.excludeOrganizationId,\n );\n\n return c.json(SlugAvailabilityResponseSchema.parse(availability));\n};\n","import { ActiveOrganizationResponseSchema, mapUserOrganization } from \"@keystrokehq/shared\";\nimport { selectUserOrganizationMembership } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const user = c.get(\"user\");\n const membership = await selectUserOrganizationMembership(user.id, organizationId);\n\n if (!membership) {\n throw new Error(`Organization membership missing after param guard: ${organizationId}`);\n }\n\n return c.json(ActiveOrganizationResponseSchema.parse(mapUserOrganization(membership)));\n};\n","import {\n ActiveOrganizationResponseSchema,\n ErrorResponseSchema,\n mapUserOrganization,\n UpdateOrganizationRequestSchema,\n validationErrorResponse,\n} from \"@keystrokehq/shared\";\nimport {\n OrganizationSlugTakenError,\n updateOrganizationName,\n updateOrganizationSlug,\n type OrganizationRow,\n} from \"@keystrokehq/platform-database\";\nimport { ZodError } from \"zod\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { organizationSlugErrorBody } from \"../slug-errors\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateOrganizationRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n const errorBody = parsed.error.issues.some((issue) => issue.path[0] === \"slug\")\n ? organizationSlugErrorBody(parsed.error)\n : validationErrorResponse(parsed.error, \"Invalid organization update\");\n\n return c.json(ErrorResponseSchema.parse(errorBody), 400);\n }\n\n try {\n let updated: OrganizationRow | undefined;\n\n if (parsed.data.name !== undefined) {\n updated = await updateOrganizationName(organization.organizationId, parsed.data.name);\n }\n\n if (parsed.data.slug !== undefined) {\n updated = await updateOrganizationSlug(organization.organizationId, parsed.data.slug);\n }\n\n if (!updated) {\n throw new Error(`Organization update produced no result: ${organization.organizationId}`);\n }\n\n return c.json(\n ActiveOrganizationResponseSchema.parse(\n mapUserOrganization({\n organization: updated,\n role: organization.role,\n }),\n ),\n );\n } catch (error) {\n if (error instanceof OrganizationSlugTakenError) {\n return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 409);\n }\n\n if (error instanceof ZodError) {\n return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 400);\n }\n\n throw error;\n }\n};\n","import { ErrorResponseSchema, OrganizationSidebarBrandingSchema } from \"@keystrokehq/shared\";\nimport {\n organizationRowToSidebarBranding,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n return c.json(\n OrganizationSidebarBrandingSchema.parse(organizationRowToSidebarBranding(organization)),\n );\n};\n","import {\n ErrorResponseSchema,\n OrganizationSidebarBrandingPatchSchema,\n OrganizationSidebarBrandingSchema,\n type OrganizationLogoVariant,\n} from \"@keystrokehq/shared\";\nimport {\n organizationRowToSidebarBranding,\n selectOrganizationById,\n updateOrganizationSidebarBranding,\n type UpdateOrganizationSidebarBrandingInput,\n} from \"@keystrokehq/platform-database\";\nimport {\n createAssetsStorageClient,\n isKeystrokeAssetsOrgLogoPublicUrl,\n isOrgLogoStorageKey,\n keystrokeAssetsOrgLogoKeyFromPublicUrl,\n publicKeystrokeAssetsObjectUrl,\n} from \"@keystrokehq/storage\";\n\nimport {\n deleteStoredImageIfOwned,\n finalizeStoredImageUpload,\n} from \"../../../../../lib/stored-image\";\nimport type { OrganizationRouteHandler } from \"../../../../types\";\n\nconst LOGO_VARIANTS = [\n {\n variant: \"light\" as const,\n storageKeyField: \"logoLightStorageKey\" as const,\n urlField: \"logoLightUrl\" as const,\n },\n {\n variant: \"dark\" as const,\n storageKeyField: \"logoDarkStorageKey\" as const,\n urlField: \"logoDarkUrl\" as const,\n },\n];\n\nasync function finalizeOrgLogoVariant(input: {\n organizationId: string;\n variant: OrganizationLogoVariant;\n storageKey: string | null;\n currentUrl: string | null;\n}): Promise<{ ok: true; publicUrl: string | null } | { ok: false; error: string }> {\n const storage = createAssetsStorageClient();\n\n if (input.storageKey === null) {\n await deleteStoredImageIfOwned({\n storage,\n url: input.currentUrl,\n isOwnedPublicUrl: isKeystrokeAssetsOrgLogoPublicUrl,\n keyFromPublicUrl: keystrokeAssetsOrgLogoKeyFromPublicUrl,\n });\n return { ok: true, publicUrl: null };\n }\n\n const finalized = await finalizeStoredImageUpload({\n storage,\n storageKey: input.storageKey,\n isValidStorageKey: (key) => isOrgLogoStorageKey(key, input.organizationId, input.variant),\n buildPublicUrl: publicKeystrokeAssetsObjectUrl,\n });\n\n if (!finalized.ok) {\n return finalized;\n }\n\n if (input.currentUrl && input.currentUrl !== finalized.publicUrl) {\n await deleteStoredImageIfOwned({\n storage,\n url: input.currentUrl,\n isOwnedPublicUrl: isKeystrokeAssetsOrgLogoPublicUrl,\n keyFromPublicUrl: keystrokeAssetsOrgLogoKeyFromPublicUrl,\n });\n }\n\n return { ok: true, publicUrl: finalized.publicUrl };\n}\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const parsed = OrganizationSidebarBrandingPatchSchema.safeParse(\n await c.req.json().catch(() => null),\n );\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid branding update\" }), 400);\n }\n\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n const dbUpdate: UpdateOrganizationSidebarBrandingInput = {\n customLogoEnabled: parsed.data.customLogoEnabled,\n customLogoExplicitlyDisabled: parsed.data.customLogoExplicitlyDisabled,\n logoHeightPx: parsed.data.logoHeightPx,\n };\n\n for (const { variant, storageKeyField, urlField } of LOGO_VARIANTS) {\n const storageKey = parsed.data[storageKeyField];\n if (storageKey === undefined) {\n continue;\n }\n\n const result = await finalizeOrgLogoVariant({\n organizationId,\n variant,\n storageKey,\n currentUrl: organization[urlField],\n });\n if (!result.ok) {\n return c.json(ErrorResponseSchema.parse({ error: result.error }), 400);\n }\n dbUpdate[urlField] = result.publicUrl;\n }\n\n const updated = await updateOrganizationSidebarBranding(organizationId, dbUpdate);\n return c.json(OrganizationSidebarBrandingSchema.parse(organizationRowToSidebarBranding(updated)));\n};\n","import {\n ErrorResponseSchema,\n PresignOrgLogoRequestSchema,\n PresignOrgLogoResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { createAssetsStorageClient, orgLogoStorageKey } from \"@keystrokehq/storage\";\n\nimport { avatarExtensionForContentType } from \"../../../../../../../lib/user-avatar-content-type\";\nimport type { OrganizationRouteHandler } from \"../../../../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const parsed = PresignOrgLogoRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid logo upload request\" }), 400);\n }\n\n const extension = avatarExtensionForContentType(parsed.data.contentType);\n if (!extension) {\n return c.json(ErrorResponseSchema.parse({ error: \"Unsupported image type\" }), 400);\n }\n\n const { organizationId } = c.get(\"organization\");\n const storageKey = orgLogoStorageKey(organizationId, parsed.data.variant, extension);\n const storage = createAssetsStorageClient();\n const uploadUrl = await storage.presignPut({\n key: storageKey,\n contentType: parsed.data.contentType,\n });\n\n return c.json(\n PresignOrgLogoResponseSchema.parse({\n uploadUrl,\n storageKey,\n }),\n );\n};\n","import type { AccessContext, ProjectListScope } from \"@keystrokehq/access-control\";\nimport { projectListScope } from \"@keystrokehq/access-control\";\nimport { selectProjectIdsForUser } from \"@keystrokehq/platform-database\";\nimport type { Context } from \"hono\";\n\nimport { accessContext } from \"./access-context\";\nimport type { OrganizationVariables } from \"@keystrokehq/http/auth\";\n\nexport type ListProjectIdsFilter = { projectIds?: string[] };\n\ntype OrganizationContext = Context<{ Variables: OrganizationVariables }>;\n\nexport function adminViewRequested(c: OrganizationContext): boolean {\n return c.req.query(\"admin\") === \"true\";\n}\n\n/** Capability from policy, narrowed by the caller's view preference. */\nexport function listScope(c: OrganizationContext, capability: ProjectListScope): ProjectListScope {\n return adminViewRequested(c) ? capability : { kind: \"member-only\" };\n}\n\nexport async function grantedProjectIds(\n c: OrganizationContext,\n scope: ProjectListScope,\n): Promise<string[] | undefined> {\n if (scope.kind === \"all\") {\n return undefined;\n }\n\n const { organizationId } = c.get(\"organization\");\n return selectProjectIdsForUser(organizationId, c.get(\"user\").id);\n}\n\nexport async function resolveListProjectIds(\n c: OrganizationContext,\n scope: ProjectListScope,\n requested?: string,\n): Promise<ListProjectIdsFilter | \"empty\"> {\n const granted = await grantedProjectIds(c, scope);\n const projectId = requested?.trim() || undefined;\n\n if (projectId) {\n if (granted !== undefined && !granted.includes(projectId)) {\n return \"empty\";\n }\n return { projectIds: [projectId] };\n }\n\n if (granted === undefined) {\n return {};\n }\n\n if (granted.length === 0) {\n return \"empty\";\n }\n\n return { projectIds: granted };\n}\n\nexport async function canAccessProjectId(\n c: OrganizationContext,\n projectId: string,\n check: (ctx: Pick<AccessContext, \"orgRole\">, hasMembership: boolean) => boolean,\n): Promise<boolean> {\n const ctx = accessContext(c);\n const granted = await grantedProjectIds(c, projectListScope(ctx));\n const hasMembership = granted === undefined ? false : granted.includes(projectId);\n return check(ctx, hasMembership);\n}\n","import type { HistoryRun, HistoryRunActor, HistoryRunDetail } from \"@keystrokehq/shared\";\nimport type { HistoryRunCore } from \"@keystrokehq/database\";\nimport { selectUserById } from \"@keystrokehq/platform-database\";\n\nexport async function resolveHistoryRunActor(\n ranByUserId: string | null,\n): Promise<HistoryRunActor | null> {\n if (!ranByUserId) {\n return null;\n }\n\n const user = await selectUserById(ranByUserId);\n if (!user) {\n return null;\n }\n\n return {\n userId: user.id,\n name: user.name,\n avatarUrl: user.image ?? null,\n };\n}\n\nexport async function enrichHistoryRun(\n run: HistoryRunCore,\n projectNameById: Map<string, string>,\n): Promise<HistoryRun> {\n const { ranByUserId, ...rest } = run;\n return {\n ...rest,\n projectName: projectNameById.get(run.projectId) ?? \"Project\",\n ranAs: await resolveHistoryRunActor(ranByUserId),\n };\n}\n\nexport async function enrichHistoryRuns(\n runs: HistoryRunCore[],\n projectNameById: Map<string, string>,\n): Promise<HistoryRun[]> {\n const actorByUserId = new Map<string, HistoryRunActor | null>();\n\n return Promise.all(\n runs.map(async (run) => {\n const { ranByUserId, ...rest } = run;\n let ranAs: HistoryRunActor | null = null;\n if (ranByUserId) {\n if (!actorByUserId.has(ranByUserId)) {\n actorByUserId.set(ranByUserId, await resolveHistoryRunActor(ranByUserId));\n }\n ranAs = actorByUserId.get(ranByUserId) ?? null;\n }\n\n return {\n ...rest,\n projectName: projectNameById.get(run.projectId) ?? \"Project\",\n ranAs,\n };\n }),\n );\n}\n\nexport async function attachRanAsToDetail<T extends HistoryRunDetail>(\n detail: T,\n ranByUserId: string | null,\n): Promise<T> {\n const ranAs = await resolveHistoryRunActor(ranByUserId);\n return {\n ...detail,\n ranAs,\n };\n}\n","import { historyListScope } from \"@keystrokehq/access-control\";\nimport { HistoryRunListQuerySchema, HistoryRunListResponseSchema } from \"@keystrokehq/shared\";\nimport { listHistoryRuns } from \"@keystrokehq/database\";\nimport { selectProjectsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { grantedProjectIds, listScope, resolveListProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { enrichHistoryRuns } from \"./enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const ctx = accessContext(c);\n const query = HistoryRunListQuerySchema.parse({\n project: c.req.query(\"project\")?.trim() || undefined,\n status: c.req.query(\"status\")?.trim() || undefined,\n kind: c.req.query(\"kind\")?.trim() || undefined,\n });\n\n const scope = listScope(c, historyListScope(ctx));\n const filter = await resolveListProjectIds(c, scope, query.project);\n if (filter === \"empty\") {\n return c.json(HistoryRunListResponseSchema.parse([]));\n }\n\n const runs = await listHistoryRuns({\n ...filter,\n ...(query.status ? { status: query.status } : {}),\n ...(query.kind ? { kind: query.kind } : {}),\n });\n\n const grantedProjectIdsList = await grantedProjectIds(c, scope);\n const projects = await selectProjectsByOrganizationId(organization.organizationId, {\n grantedProjectIds: grantedProjectIdsList,\n });\n const projectNameById = new Map(projects.map((project) => [project.id, project.name]));\n\n const historyRuns = await enrichHistoryRuns(runs, projectNameById);\n\n return c.json(HistoryRunListResponseSchema.parse(historyRuns));\n};\n","import { canAccessHistoryRun } from \"@keystrokehq/access-control\";\nimport { HistoryRunDetailResponseSchema } from \"@keystrokehq/shared\";\nimport {\n buildHistoryAgentSessionDetail,\n buildHistoryWorkflowRunDetail,\n findHistoryRunCore,\n runWithProjectScope,\n selectActiveAgentById,\n selectAgentSessionById,\n selectWorkflowRunById,\n} from \"@keystrokehq/database\";\n\nimport { canAccessProjectId } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { attachRanAsToDetail } from \"../enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const runId = c.req.param(\"runId\") ?? \"\";\n if (!runId) {\n return c.json(null, 404);\n }\n\n const core = await findHistoryRunCore(runId);\n if (!core || !(await canAccessProjectId(c, core.projectId, canAccessHistoryRun))) {\n return c.json(null, 404);\n }\n\n const detail = await runWithProjectScope(core.projectId, async () => {\n if (core.kind === \"workflow\") {\n const row = await selectWorkflowRunById(runId);\n if (!row) {\n return null;\n }\n\n return buildHistoryWorkflowRunDetail(row.workflowSlug, runId);\n }\n\n const session = await selectAgentSessionById(runId);\n if (!session) {\n return null;\n }\n\n const agent = await selectActiveAgentById(session.agentId);\n if (!agent) {\n return null;\n }\n\n return buildHistoryAgentSessionDetail(agent.slug, runId);\n });\n\n if (!detail) {\n return c.json(null, 404);\n }\n\n return c.json(\n HistoryRunDetailResponseSchema.parse(await attachRanAsToDetail(detail, core.ranByUserId)),\n );\n};\n","import { PLATFORM_RESOURCE_UNSUPPORTED_TEXT } from \"@keystrokehq/shared\";\n\n/** Derive a human display name from a resource slug when no explicit name is stored. */\nexport function titleCaseKey(slug: string): string {\n const normalized = slug\n .split(/[/_-]+/)\n .filter(Boolean)\n .join(\" \");\n\n if (!normalized) {\n return PLATFORM_RESOURCE_UNSUPPORTED_TEXT;\n }\n\n return normalized.replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n","import { AgentSummarySchema, type AgentSummary } from \"@keystrokehq/shared\";\nimport type { AgentRow } from \"@keystrokehq/database\";\n\nimport { titleCaseKey } from \"./common\";\n\nfunction formatModel(model: AgentRow[\"model\"]): string | undefined {\n if (!model) {\n return undefined;\n }\n\n return model;\n}\n\nexport function toAgentSummary(row: AgentRow, options?: { lastRunAt?: Date | null }): AgentSummary {\n return AgentSummarySchema.parse({\n id: row.id,\n slug: row.slug,\n name: row.name?.trim() || titleCaseKey(row.slug),\n description: row.description ?? undefined,\n projectId: row.projectId,\n updatedAt: row.updatedAt.toISOString(),\n sourcePath: row.moduleFile,\n model: formatModel(row.model),\n toolCount: row.toolCount ?? undefined,\n credentialCount: row.credentialCount ?? undefined,\n lastRunAt: options?.lastRunAt?.toISOString(),\n });\n}\n","import { agentListScope } from \"@keystrokehq/access-control\";\nimport { AgentSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { listActiveAgents, selectAgentLastRunAtByIds } from \"@keystrokehq/database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { listScope, resolveListProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { toAgentSummary } from \"../resources/agents\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const filter = await resolveListProjectIds(\n c,\n listScope(c, agentListScope(accessContext(c))),\n c.req.query(\"projectId\"),\n );\n if (filter === \"empty\") {\n return c.json(AgentSummaryListResponseSchema.parse([]));\n }\n\n const rows = await listActiveAgents(filter);\n const lastRunAtById = await selectAgentLastRunAtByIds(rows.map((row) => row.id));\n\n return c.json(\n AgentSummaryListResponseSchema.parse(\n rows.map((row) => toAgentSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null })),\n ),\n );\n};\n","import { touchResourceActivity, type ResourceActivityKind } from \"@keystrokehq/database\";\n\nimport { deferRequestBackgroundTask } from \"@keystrokehq/http/middleware\";\n\nexport function touchResourceActivityBestEffort(options: {\n userId: string;\n projectId: string;\n resourceKind: ResourceActivityKind;\n resourceId: string;\n}): void {\n deferRequestBackgroundTask(\n touchResourceActivity(options).catch(() => {\n // Recents tracking must not block resource reads.\n }),\n );\n}\n","import { canAccessAgent } from \"@keystrokehq/access-control\";\nimport { AgentSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveAgentById, selectAgentLastRunAtByIds } from \"@keystrokehq/database\";\n\nimport { canAccessProjectId } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { touchResourceActivityBestEffort } from \"../../lib/touch-resource-activity\";\nimport { toAgentSummary } from \"../../resources/agents\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const agentId = c.req.param(\"agentId\") ?? \"\";\n const row = agentId ? await selectActiveAgentById(agentId) : undefined;\n\n if (!row || !(await canAccessProjectId(c, row.projectId, canAccessAgent))) {\n return c.json(AgentSummaryDetailResponseSchema.parse(null));\n }\n\n touchResourceActivityBestEffort({\n userId: c.get(\"user\").id,\n projectId: row.projectId,\n resourceKind: \"agent\",\n resourceId: row.id,\n });\n\n const lastRunAtById = await selectAgentLastRunAtByIds([row.id]);\n\n return c.json(\n AgentSummaryDetailResponseSchema.parse(\n toAgentSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null }),\n ),\n );\n};\n","import { canAccessHistoryRun, historyListScope } from \"@keystrokehq/access-control\";\nimport { HistoryRunCancelResponseSchema } from \"@keystrokehq/shared\";\nimport {\n findHistoryRunCore,\n runWithProjectScope,\n type HistoryRunCore,\n} from \"@keystrokehq/database\";\nimport {\n selectOrganizationById,\n selectProjectsByOrganizationId,\n} from \"@keystrokehq/platform-database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { canAccessProjectId, grantedProjectIds } from \"../../../auth/project-access\";\nimport { getProjectScheduler } from \"@keystrokehq/http\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { enrichHistoryRun } from \"./enrich\";\n\ntype CancelKind = \"workflow\" | \"agent\";\ntype OrganizationRouteContext = Parameters<OrganizationRouteHandler>[0];\n\n/** Shared body for the workflow-run and agent-session cancel endpoints. */\nexport async function cancelHistoryRun(\n c: OrganizationRouteContext,\n kind: CancelKind,\n cancel: (id: string) => Promise<HistoryRunCore | null>,\n): Promise<Response> {\n const organizationContext = c.get(\"organization\");\n const id = c.req.param(kind === \"workflow\" ? \"runId\" : \"sessionId\") ?? \"\";\n if (!id) {\n return c.json(null, 404);\n }\n\n const core = await findHistoryRunCore(id);\n if (!core || core.kind !== kind) {\n return c.json(null, 404);\n }\n\n if (!(await canAccessProjectId(c, core.projectId, canAccessHistoryRun))) {\n return c.json(null, 404);\n }\n\n const run = await runWithProjectScope(core.projectId, () => cancel(id));\n if (!run) {\n return c.json(null, 404);\n }\n\n const organization = await selectOrganizationById(organizationContext.organizationId);\n if (!organization) {\n return c.json(null, 404);\n }\n\n const scheduler = await getProjectScheduler(organization, core.projectId);\n await scheduler.publishCancel(id);\n\n const grantedProjectIdsList = await grantedProjectIds(c, historyListScope(accessContext(c)));\n const projects = await selectProjectsByOrganizationId(organizationContext.organizationId, {\n grantedProjectIds: grantedProjectIdsList,\n });\n const projectNameById = new Map(projects.map((project) => [project.id, project.name]));\n\n const historyRun = await enrichHistoryRun(run, projectNameById);\n return c.json(HistoryRunCancelResponseSchema.parse(historyRun));\n}\n","import { cancelAgentSession } from \"@keystrokehq/database\";\n\nimport { cancelHistoryRun } from \"../../../../history/cancel-run\";\nimport type { OrganizationRouteHandler } from \"../../../../../types\";\n\nexport const handler: OrganizationRouteHandler = (c) =>\n cancelHistoryRun(c, \"agent\", cancelAgentSession);\n","import { WorkflowSummarySchema, type WorkflowSummary } from \"@keystrokehq/shared\";\nimport type { WorkflowRow } from \"@keystrokehq/database\";\n\nimport { titleCaseKey } from \"./common\";\n\nexport function toWorkflowSummary(\n row: WorkflowRow,\n options?: { lastRunAt?: Date | null },\n): WorkflowSummary {\n return WorkflowSummarySchema.parse({\n id: row.id,\n slug: row.slug,\n name: row.name?.trim() || titleCaseKey(row.slug),\n description: row.description ?? undefined,\n projectId: row.projectId,\n updatedAt: row.updatedAt.toISOString(),\n sourcePath: row.moduleFile,\n lastRunAt: options?.lastRunAt?.toISOString(),\n });\n}\n","import { workflowListScope } from \"@keystrokehq/access-control\";\nimport { WorkflowSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { listActiveWorkflows, selectWorkflowLastRunAtByIds } from \"@keystrokehq/database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { listScope, resolveListProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { toWorkflowSummary } from \"../resources/workflows\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const filter = await resolveListProjectIds(\n c,\n listScope(c, workflowListScope(accessContext(c))),\n c.req.query(\"projectId\"),\n );\n if (filter === \"empty\") {\n return c.json(WorkflowSummaryListResponseSchema.parse([]));\n }\n\n const rows = await listActiveWorkflows(filter);\n const lastRunAtById = await selectWorkflowLastRunAtByIds(rows.map((row) => row.id));\n\n return c.json(\n WorkflowSummaryListResponseSchema.parse(\n rows.map((row) => toWorkflowSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null })),\n ),\n );\n};\n","import { canAccessWorkflow } from \"@keystrokehq/access-control\";\nimport { WorkflowSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveWorkflowById, selectWorkflowLastRunAtByIds } from \"@keystrokehq/database\";\n\nimport { canAccessProjectId } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { touchResourceActivityBestEffort } from \"../../lib/touch-resource-activity\";\nimport { toWorkflowSummary } from \"../../resources/workflows\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const workflowId = c.req.param(\"workflowId\") ?? \"\";\n const row = workflowId ? await selectActiveWorkflowById(workflowId) : undefined;\n\n if (!row || !(await canAccessProjectId(c, row.projectId, canAccessWorkflow))) {\n return c.json(WorkflowSummaryDetailResponseSchema.parse(null));\n }\n\n touchResourceActivityBestEffort({\n userId: c.get(\"user\").id,\n projectId: row.projectId,\n resourceKind: \"workflow\",\n resourceId: row.id,\n });\n\n const lastRunAtById = await selectWorkflowLastRunAtByIds([row.id]);\n\n return c.json(\n WorkflowSummaryDetailResponseSchema.parse(\n toWorkflowSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null }),\n ),\n );\n};\n","import { cancelWorkflowRun } from \"@keystrokehq/database\";\n\nimport { cancelHistoryRun } from \"../../../../history/cancel-run\";\nimport type { OrganizationRouteHandler } from \"../../../../../types\";\n\nexport const handler: OrganizationRouteHandler = (c) =>\n cancelHistoryRun(c, \"workflow\", cancelWorkflowRun);\n","import { SkillSummarySchema, type SkillSummary } from \"@keystrokehq/shared\";\nimport type { SkillRow } from \"@keystrokehq/database\";\n\nimport { titleCaseKey } from \"./common\";\n\nexport function toSkillSummary(row: SkillRow): SkillSummary {\n return SkillSummarySchema.parse({\n id: row.id,\n slug: row.slug,\n name: row.name?.trim() || titleCaseKey(row.slug),\n description: row.description ?? undefined,\n projectId: row.projectId,\n updatedAt: row.updatedAt.toISOString(),\n sourcePath: row.moduleFile,\n });\n}\n","import { skillListScope } from \"@keystrokehq/access-control\";\nimport { SkillSummaryListResponseSchema } from \"@keystrokehq/shared\";\nimport { listActiveSkills } from \"@keystrokehq/database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { listScope, resolveListProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { toSkillSummary } from \"../resources/skills\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const filter = await resolveListProjectIds(\n c,\n listScope(c, skillListScope(accessContext(c))),\n c.req.query(\"projectId\"),\n );\n if (filter === \"empty\") {\n return c.json(SkillSummaryListResponseSchema.parse([]));\n }\n\n const rows = await listActiveSkills(filter);\n\n return c.json(SkillSummaryListResponseSchema.parse(rows.map(toSkillSummary)));\n};\n","import { canAccessSkill } from \"@keystrokehq/access-control\";\nimport { SkillSummaryDetailResponseSchema } from \"@keystrokehq/shared\";\nimport { selectActiveSkillById } from \"@keystrokehq/database\";\n\nimport { canAccessProjectId } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { touchResourceActivityBestEffort } from \"../../lib/touch-resource-activity\";\nimport { toSkillSummary } from \"../../resources/skills\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const skillId = c.req.param(\"skillId\") ?? \"\";\n const row = skillId ? await selectActiveSkillById(skillId) : undefined;\n\n if (!row || !(await canAccessProjectId(c, row.projectId, canAccessSkill))) {\n return c.json(SkillSummaryDetailResponseSchema.parse(null));\n }\n\n touchResourceActivityBestEffort({\n userId: c.get(\"user\").id,\n projectId: row.projectId,\n resourceKind: \"skill\",\n resourceId: row.id,\n });\n\n return c.json(SkillSummaryDetailResponseSchema.parse(toSkillSummary(row)));\n};\n","import {\n RecentResourceSchema,\n type RecentResource,\n type RecentResourceKind,\n} from \"@keystrokehq/shared\";\nimport type { ResourceActivityRow } from \"@keystrokehq/database\";\n\nimport { titleCaseKey } from \"./common\";\n\ntype HydratedResource = {\n name: string;\n projectId: string;\n sourcePath: string;\n lastModifiedAt: Date;\n};\n\nexport function toRecentResource(\n activity: ResourceActivityRow,\n resource: HydratedResource,\n projectName: string,\n): RecentResource {\n return RecentResourceSchema.parse({\n id: activity.id,\n resourceKind: activity.resourceKind,\n resourceId: activity.resourceId,\n name: resource.name,\n projectId: resource.projectId,\n projectName,\n sourcePath: resource.sourcePath,\n source: \"owned\",\n lastOpenedAt: activity.lastOpenedAt.toISOString(),\n lastModifiedAt: resource.lastModifiedAt.toISOString(),\n });\n}\n\nexport function hydrateRecentResource(\n activity: ResourceActivityRow,\n lookup: Partial<Record<RecentResourceKind, Map<string, HydratedResource>>>,\n projectNameById: Map<string, string>,\n): RecentResource | null {\n const resourceKind = activity.resourceKind as RecentResourceKind;\n const resource = lookup[resourceKind]?.get(activity.resourceId);\n if (!resource) {\n return null;\n }\n\n const projectName = projectNameById.get(resource.projectId) ?? resource.projectId;\n return toRecentResource(activity, resource, projectName);\n}\n\nexport function hydratedResourceFromAgentRow(row: {\n slug: string;\n name?: string | null;\n projectId: string;\n moduleFile: string;\n updatedAt: Date;\n}): HydratedResource {\n return {\n name: row.name?.trim() || titleCaseKey(row.slug),\n projectId: row.projectId,\n sourcePath: row.moduleFile,\n lastModifiedAt: row.updatedAt,\n };\n}\n\nexport function latestRecentInteractionAt(recent: RecentResource): number {\n return Math.max(\n new Date(recent.lastOpenedAt).getTime(),\n new Date(recent.lastModifiedAt).getTime(),\n );\n}\n","import { RecentResourceListResponseSchema } from \"@keystrokehq/shared\";\nimport {\n listRecentResourceActivity,\n selectActiveAgentsByIds,\n selectActiveSkillsByIds,\n selectActiveWorkflowsByIds,\n} from \"@keystrokehq/database\";\nimport { selectProjectsByOrganizationId } from \"@keystrokehq/platform-database\";\n\nimport { grantedProjectIds } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport {\n hydratedResourceFromAgentRow,\n hydrateRecentResource,\n latestRecentInteractionAt,\n} from \"../resources/recents\";\n\nconst RECENTS_LIMIT = 50;\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const userId = c.get(\"user\").id;\n const organization = c.get(\"organization\");\n // Recents are always user-specific and scoped to the viewer's project memberships;\n // the admin visibility flag never widens them to the whole org.\n const grantedProjectIdsList = await grantedProjectIds(c, { kind: \"member-only\" });\n const activities = await listRecentResourceActivity(userId, RECENTS_LIMIT);\n const visibleActivities =\n grantedProjectIdsList === undefined\n ? activities\n : activities.filter((activity) => grantedProjectIdsList.includes(activity.projectId));\n\n const agentIds = visibleActivities\n .filter((activity) => activity.resourceKind === \"agent\")\n .map((activity) => activity.resourceId);\n const workflowIds = visibleActivities\n .filter((activity) => activity.resourceKind === \"workflow\")\n .map((activity) => activity.resourceId);\n const skillIds = visibleActivities\n .filter((activity) => activity.resourceKind === \"skill\")\n .map((activity) => activity.resourceId);\n\n const [agents, workflows, skills, projects] = await Promise.all([\n selectActiveAgentsByIds(agentIds),\n selectActiveWorkflowsByIds(workflowIds),\n selectActiveSkillsByIds(skillIds),\n selectProjectsByOrganizationId(organization.organizationId, {\n grantedProjectIds: grantedProjectIdsList,\n }),\n ]);\n\n const projectNameById = new Map(projects.map((project) => [project.id, project.name]));\n const lookup = {\n agent: new Map(agents.map((row) => [row.id, hydratedResourceFromAgentRow(row)] as const)),\n workflow: new Map(workflows.map((row) => [row.id, hydratedResourceFromAgentRow(row)] as const)),\n skill: new Map(skills.map((row) => [row.id, hydratedResourceFromAgentRow(row)] as const)),\n };\n\n const recents = visibleActivities\n .map((activity) => hydrateRecentResource(activity, lookup, projectNameById))\n .filter((recent) => recent !== null)\n .sort((left, right) => latestRecentInteractionAt(right) - latestRecentInteractionAt(left));\n\n return c.json(RecentResourceListResponseSchema.parse(recents));\n};\n","import { projectListScope } from \"@keystrokehq/access-control\";\nimport { selectProjectsByOrganizationId } from \"@keystrokehq/platform-database\";\nimport { ListProjectsResponseSchema, mapProject } from \"@keystrokehq/shared\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport { grantedProjectIds, listScope } from \"../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const grantedProjectIdsList = await grantedProjectIds(\n c,\n listScope(c, projectListScope(accessContext(c))),\n );\n\n const projects = await selectProjectsByOrganizationId(organization.organizationId, {\n grantedProjectIds: grantedProjectIdsList,\n });\n\n return c.json(ListProjectsResponseSchema.parse(projects.map(mapProject)));\n};\n","import type { ProjectListMetrics } from \"@keystrokehq/shared\";\nimport type { ProjectResourceCounts } from \"@keystrokehq/database\";\n\nexport function mergeProjectListMetrics(input: {\n resourceCounts: Record<string, ProjectResourceCounts>;\n lastDeploymentAtByProject: Record<string, Date>;\n}): Record<string, ProjectListMetrics> {\n const projectIds = new Set([\n ...Object.keys(input.resourceCounts),\n ...Object.keys(input.lastDeploymentAtByProject),\n ]);\n\n const metrics: Record<string, ProjectListMetrics> = {};\n\n for (const projectId of projectIds) {\n const counts = input.resourceCounts[projectId];\n const lastDeploymentAt = input.lastDeploymentAtByProject[projectId];\n\n metrics[projectId] = {\n agentCount: counts?.agentCount ?? 0,\n workflowCount: counts?.workflowCount ?? 0,\n skillCount: counts?.skillCount ?? 0,\n credentialCount: counts?.credentialCount ?? 0,\n lastDeploymentAt: lastDeploymentAt ? lastDeploymentAt.toISOString() : null,\n };\n }\n\n return metrics;\n}\n","import { projectListScope } from \"@keystrokehq/access-control\";\nimport { selectProjectResourceCounts } from \"@keystrokehq/database\";\nimport { selectLastDeploymentAtByProject } from \"@keystrokehq/platform-database\";\nimport { ListProjectMetricsResponseSchema } from \"@keystrokehq/shared\";\n\nimport { accessContext } from \"../../../../auth/access-context\";\nimport { grantedProjectIds, listScope } from \"../../../../auth/project-access\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { mergeProjectListMetrics } from \"./merge-project-list-metrics\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const grantedProjectIdsList = await grantedProjectIds(\n c,\n listScope(c, projectListScope(accessContext(c))),\n );\n\n const [resourceCounts, lastDeploymentAtByProject] = await Promise.all([\n selectProjectResourceCounts(\n grantedProjectIdsList !== undefined ? { projectIds: grantedProjectIdsList } : undefined,\n ),\n selectLastDeploymentAtByProject(organization.organizationId),\n ]);\n\n let metrics = mergeProjectListMetrics({ resourceCounts, lastDeploymentAtByProject });\n if (grantedProjectIdsList !== undefined) {\n const allowed = new Set(grantedProjectIdsList);\n metrics = Object.fromEntries(\n Object.entries(metrics).filter(([projectId]) => allowed.has(projectId)),\n );\n }\n\n return c.json(ListProjectMetricsResponseSchema.parse(metrics));\n};\n","import {\n CreateProjectRequestSchema,\n CreateProjectResponseSchema,\n ErrorResponseSchema,\n mapProject,\n} from \"@keystrokehq/shared\";\nimport { createProjectForOrganization } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const user = c.get(\"user\");\n const body = await c.req.json().catch(() => null);\n const parsed = CreateProjectRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project name is required\" }), 400);\n }\n\n const project = await createProjectForOrganization(\n organization.organizationId,\n parsed.data.name,\n parsed.data.description,\n user.id,\n );\n\n return c.json(CreateProjectResponseSchema.parse(mapProject(project)), 201);\n};\n","import {\n ErrorResponseSchema,\n ProjectSlugAvailabilityQuerySchema,\n ProjectSlugAvailabilityResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { checkProjectSlugAvailability } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const parsed = ProjectSlugAvailabilityQuerySchema.safeParse({\n slug: c.req.query(\"slug\"),\n excludeProjectId: c.req.query(\"excludeProjectId\"),\n });\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid slug query\" }), 400);\n }\n\n const availability = await checkProjectSlugAvailability(\n organization.organizationId,\n parsed.data.slug,\n parsed.data.excludeProjectId,\n );\n\n return c.json(ProjectSlugAvailabilityResponseSchema.parse(availability));\n};\n","import { ProjectResponseSchema } from \"@keystrokehq/shared\";\n\nimport { routeProject } from \"@keystrokehq/http/auth\";\nimport type { ProjectRouteHandler } from \"../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n return c.json(ProjectResponseSchema.parse(routeProject(c.get(\"project\"))));\n};\n","import {\n ErrorResponseSchema,\n mapProject,\n PROJECT_SLUG_TAKEN_MESSAGE,\n ProjectResponseSchema,\n UpdateProjectRequestSchema,\n} from \"@keystrokehq/shared\";\nimport {\n ProjectSlugTakenError,\n updateProjectForOrganization,\n} from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const project = c.get(\"project\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateProjectRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid project update request\" }), 400);\n }\n\n let updated;\n try {\n updated = await updateProjectForOrganization(\n organization.organizationId,\n project.id,\n parsed.data,\n );\n } catch (error) {\n if (error instanceof ProjectSlugTakenError) {\n return c.json(ErrorResponseSchema.parse({ error: PROJECT_SLUG_TAKEN_MESSAGE }), 409);\n }\n throw error;\n }\n\n if (!updated) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n }\n\n return c.json(ProjectResponseSchema.parse(mapProject(updated)));\n};\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { deleteProjectForOrganization } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const project = c.get(\"project\");\n\n const deleted = await deleteProjectForOrganization(organization.organizationId, project.id);\n\n if (!deleted) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n }\n\n return c.body(null, 204);\n};\n","import { ListProjectDeploymentsResponseSchema, mapProjectDeployment } from \"@keystrokehq/shared\";\nimport { selectProjectDeployments } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const rows = await selectProjectDeployments(project.id);\n\n return c.json(ListProjectDeploymentsResponseSchema.parse(rows.map(mapProjectDeployment)));\n};\n","import { CreateProjectArtifactResponseSchema, mapProjectArtifact } from \"@keystrokehq/shared\";\nimport {\n createOrgStorageClient,\n insertProjectArtifact,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport { projectArtifactKey } from \"@keystrokehq/storage\";\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nconst DEFAULT_PRESIGN_TTL_SECONDS = 900;\nconst ARTIFACT_CONTENT_TYPE = \"application/gzip\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const artifactId = crypto.randomUUID();\n const storageKey = projectArtifactKey(project.id, artifactId);\n const storage = createOrgStorageClient(organization);\n\n const artifact = await insertProjectArtifact({\n id: artifactId,\n projectId: project.id,\n storageKey,\n createdByUserId: c.get(\"user\").id,\n });\n\n const uploadUrl = await storage.presignPut({\n key: storageKey,\n contentType: ARTIFACT_CONTENT_TYPE,\n expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS,\n });\n\n return c.json(\n CreateProjectArtifactResponseSchema.parse({\n artifact: mapProjectArtifact(artifact),\n uploadUrl,\n expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS,\n }),\n 201,\n );\n};\n","import { DownloadActiveProjectArtifactResponseSchema } from \"@keystrokehq/shared\";\nimport {\n createOrgStorageClient,\n selectActiveProjectArtifactForProject,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport type { ProjectRouteHandler } from \"../../../../../../types\";\n\nconst DEFAULT_PRESIGN_TTL_SECONDS = 900;\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n const artifact = await selectActiveProjectArtifactForProject(project.id);\n if (!artifact) {\n return c.json({ error: \"No active artifact for project\" }, 404);\n }\n\n const storage = createOrgStorageClient(organization);\n const downloadUrl = await storage.presignGet({\n key: artifact.storageKey,\n expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS,\n });\n\n return c.json(\n DownloadActiveProjectArtifactResponseSchema.parse({\n artifactId: artifact.id,\n downloadUrl,\n expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS,\n }),\n );\n};\n","import {\n CompleteProjectArtifactResponseSchema,\n ErrorResponseSchema,\n mapProject,\n mapProjectArtifact,\n parseStoredRouteManifest,\n} from \"@keystrokehq/shared\";\nimport {\n completeProjectArtifact,\n createOrgStorageClient,\n selectOrganizationById,\n selectProjectArtifactForProject,\n} from \"@keystrokehq/platform-database\";\nimport { enqueueProjectRuntime } from \"@keystrokehq/projects\";\nimport { extractRouteManifestFromArtifact } from \"@keystrokehq/storage\";\nimport type { ProjectRouteHandler } from \"../../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const artifactId = c.req.param(\"artifactId\");\n if (!artifactId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact id is required\" }), 400);\n }\n\n const existing = await selectProjectArtifactForProject(artifactId, project.id);\n if (!existing) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact not found\" }), 404);\n }\n\n if (existing.status === \"ready\") {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact already completed\" }), 409);\n }\n\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n const storage = createOrgStorageClient(organization);\n const head = await storage.headObject(existing.storageKey);\n if (!head || head.contentLength <= 0) {\n return c.json(\n ErrorResponseSchema.parse({ error: \"Artifact upload not found in storage\" }),\n 400,\n );\n }\n\n try {\n const artifactBytes = await storage.getObject(existing.storageKey);\n if (!artifactBytes || artifactBytes.byteLength <= 0) {\n return c.json(\n ErrorResponseSchema.parse({ error: \"Artifact upload not found in storage\" }),\n 400,\n );\n }\n\n const manifestJson = parseStoredRouteManifest(\n extractRouteManifestFromArtifact(Buffer.from(artifactBytes)),\n );\n\n const result = await completeProjectArtifact({\n artifactId,\n projectId: project.id,\n manifestJson,\n });\n\n await enqueueProjectRuntime({\n projectId: project.id,\n name: project.name,\n artifactId,\n });\n\n return c.json(\n CompleteProjectArtifactResponseSchema.parse({\n artifact: mapProjectArtifact(result.artifact),\n project: mapProject(result.project),\n }),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to complete artifact\";\n return c.json(ErrorResponseSchema.parse({ error: message }), 400);\n }\n};\n","import {\n ErrorResponseSchema,\n PresignProjectSourceRequestSchema,\n PresignProjectSourceResponseSchema,\n} from \"@keystrokehq/shared\";\nimport {\n createOrgStorageClient,\n selectOrganizationById,\n selectProjectArtifactForProject,\n} from \"@keystrokehq/platform-database\";\nimport { projectSourceBlobKey } from \"@keystrokehq/storage\";\n\nimport type { ProjectRouteHandler } from \"../../../../../../../types\";\n\nconst SOURCE_BLOB_CONTENT_TYPE = \"text/plain; charset=utf-8\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const artifactId = c.req.param(\"artifactId\");\n if (!artifactId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact id is required\" }), 400);\n }\n\n const artifact = await selectProjectArtifactForProject(artifactId, project.id);\n if (!artifact) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact not found\" }), 404);\n }\n\n const parsed = PresignProjectSourceRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid blob list\" }), 400);\n }\n\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n const storage = createOrgStorageClient(organization);\n\n // De-dupe requested hashes, then presign PUTs only for blobs not already\n // stored so unchanged files are never re-uploaded across deploys.\n const hashes = [...new Set(parsed.data.blobs.map((blob) => blob.hash))];\n const uploads = await Promise.all(\n hashes.map(async (hash) => {\n const key = projectSourceBlobKey(project.id, hash);\n const head = await storage.headObject(key);\n if (head && head.contentLength > 0) {\n return null;\n }\n const url = await storage.presignPut({ key, contentType: SOURCE_BLOB_CONTENT_TYPE });\n return { hash, url };\n }),\n );\n\n return c.json(\n PresignProjectSourceResponseSchema.parse({\n uploads: uploads.filter((upload): upload is { hash: string; url: string } => upload !== null),\n }),\n );\n};\n","import {\n ErrorResponseSchema,\n StoredProjectSourceManifestSchema,\n UploadProjectSourceManifestRequestSchema,\n UploadProjectSourceResponseSchema,\n projectFileId,\n} from \"@keystrokehq/shared\";\nimport {\n selectProjectArtifactForProject,\n updateProjectArtifactSourceManifest,\n} from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const artifactId = c.req.param(\"artifactId\");\n if (!artifactId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact id is required\" }), 400);\n }\n\n const artifact = await selectProjectArtifactForProject(artifactId, project.id);\n if (!artifact) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact not found\" }), 404);\n }\n\n const parsed = UploadProjectSourceManifestRequestSchema.safeParse(\n await c.req.json().catch(() => null),\n );\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid source manifest\" }), 400);\n }\n\n const manifest = StoredProjectSourceManifestSchema.parse({\n files: parsed.data.files.map((file) => ({\n id: projectFileId(file.path),\n path: file.path,\n hash: file.hash,\n })),\n generatedAt: new Date().toISOString(),\n });\n\n await updateProjectArtifactSourceManifest({\n artifactId,\n projectId: project.id,\n sourceManifestJson: manifest,\n });\n\n return c.json(\n UploadProjectSourceResponseSchema.parse({ ok: true, fileCount: manifest.files.length }),\n 201,\n );\n};\n","import {\n ListProjectFilesResponseSchema,\n ProjectSourceResourcesSchema,\n StoredProjectSourceManifestSchema,\n} from \"@keystrokehq/shared\";\nimport { listActiveAgents, listActiveSkills, listActiveWorkflows } from \"@keystrokehq/database\";\nimport { selectActiveArtifactSourceManifestForProject } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\n/**\n * Resolve registry moduleFile values to paths in the deploy source snapshot.\n *\n * New deploys store project-root-relative source paths (`src/agents/support.ts`),\n * matched exactly. Rows synced by older runtimes hold module-dir-relative values\n * (`support.ts` under `src/agents/`), matched by suffix. Resources without a\n * match are dropped rather than emitting paths clients can't find in the tree.\n */\nexport function resolveSourcePaths(\n rows: Array<{ slug: string; moduleFile: string }>,\n kindDir: string,\n filePaths: string[],\n): Array<{ slug: string; path: string }> {\n return rows.flatMap((row) => {\n const suffix = `${kindDir}/${row.moduleFile}`;\n const path =\n filePaths.find((filePath) => filePath === row.moduleFile) ??\n filePaths.find((filePath) => filePath === suffix || filePath.endsWith(`/${suffix}`));\n return path ? [{ slug: row.slug, path }] : [];\n });\n}\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const active = await selectActiveArtifactSourceManifestForProject(project.id);\n\n if (!active || !active.sourceManifestJson) {\n return c.json(\n ListProjectFilesResponseSchema.parse({ artifactId: active?.artifactId ?? null, files: [] }),\n );\n }\n\n const manifest = StoredProjectSourceManifestSchema.parse(active.sourceManifestJson);\n const [agents, workflows, skills] = await Promise.all([\n listActiveAgents({ projectIds: [project.id] }),\n listActiveWorkflows({ projectIds: [project.id] }),\n listActiveSkills({ projectIds: [project.id] }),\n ]);\n\n const filePaths = manifest.files.map((file) => file.path);\n const resources = ProjectSourceResourcesSchema.parse({\n agents: resolveSourcePaths(agents, \"agents\", filePaths),\n workflows: resolveSourcePaths(workflows, \"workflows\", filePaths),\n // Skill moduleFile values are already project-root-relative source paths.\n skills: skills.map((row) => ({ slug: row.slug, path: row.moduleFile })),\n });\n\n return c.json(\n ListProjectFilesResponseSchema.parse({\n artifactId: active.artifactId,\n files: manifest.files.map((file) => ({ id: file.id, path: file.path, hash: file.hash })),\n resources,\n }),\n );\n};\n","import { ErrorResponseSchema, StoredProjectSourceManifestSchema } from \"@keystrokehq/shared\";\nimport {\n createOrgStorageClient,\n selectOrganizationById,\n selectProjectArtifactForProject,\n} from \"@keystrokehq/platform-database\";\nimport { projectSourceBlobKey } from \"@keystrokehq/storage\";\n\nimport type { ProjectRouteHandler } from \"../../../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const artifactId = c.req.param(\"artifactId\");\n if (!artifactId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact id is required\" }), 400);\n }\n\n const path = c.req.query(\"path\");\n if (!path) {\n return c.json(ErrorResponseSchema.parse({ error: \"File path is required\" }), 400);\n }\n\n const artifact = await selectProjectArtifactForProject(artifactId, project.id);\n if (!artifact || !artifact.sourceManifestJson) {\n return c.json(ErrorResponseSchema.parse({ error: \"Artifact not found\" }), 404);\n }\n\n // Resolve path -> hash via the manifest so we only ever serve files that\n // belong to this deploy (no arbitrary blob access).\n const manifest = StoredProjectSourceManifestSchema.parse(artifact.sourceManifestJson);\n const file = manifest.files.find((entry) => entry.path === path);\n if (!file) {\n return c.json(ErrorResponseSchema.parse({ error: \"File not found\" }), 404);\n }\n\n const { organizationId } = c.get(\"organization\");\n const organization = await selectOrganizationById(organizationId);\n if (!organization) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n const storage = createOrgStorageClient(organization);\n let bytes: Uint8Array;\n try {\n bytes = await storage.getObject(projectSourceBlobKey(project.id, file.hash));\n } catch {\n return c.json(ErrorResponseSchema.parse({ error: \"File contents not found\" }), 404);\n }\n\n // Browser/CDN caching (immutable hash-addressed responses) is intentionally\n // deferred to a follow-up PR.\n c.header(\"Content-Type\", \"text/plain; charset=utf-8\");\n return c.body(new TextDecoder().decode(bytes));\n};\n","import { ProjectReachabilityResponseSchema } from \"@keystrokehq/shared\";\nimport { pingProjectTarget } from \"@keystrokehq/hosting\";\nimport { selectOrganizationById } from \"@keystrokehq/platform-database\";\n\nimport type { HostingPlugin } from \"@keystrokehq/hosting\";\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport function createProjectReachabilityHandler(hosting: HostingPlugin): ProjectRouteHandler {\n return async (c) => {\n const project = c.get(\"project\");\n\n if (project.status !== \"active\") {\n return c.json(ProjectReachabilityResponseSchema.parse({ reachable: false }));\n }\n\n const organization = await selectOrganizationById(project.organizationId);\n const baseUrl = organization?.baseUrl ?? project.baseUrl;\n const runtimeId = organization?.runtimeId ?? project.runtimeId;\n\n const reachable = await pingProjectTarget(\n {\n baseUrl,\n runtimeId,\n },\n { plugin: hosting },\n );\n\n return c.json(ProjectReachabilityResponseSchema.parse({ reachable }));\n };\n}\n","import { ListProjectMembersResponseSchema, mapProjectMember } from \"@keystrokehq/shared\";\nimport { selectProjectMembers } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const currentUserId = c.get(\"user\").id;\n const members = await selectProjectMembers(project.id);\n\n return c.json(\n ListProjectMembersResponseSchema.parse(\n members.map((member) =>\n mapProjectMember(member, { isCurrentUser: member.id === currentUserId }),\n ),\n ),\n );\n};\n","import {\n ErrorResponseSchema,\n InviteProjectMembersRequestSchema,\n InviteProjectMembersResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { inviteProjectMembers } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const project = c.get(\"project\");\n const body = await c.req.json().catch(() => null);\n const parsed = InviteProjectMembersRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid invite request\" }), 400);\n }\n\n const results = await inviteProjectMembers({\n projectId: project.id,\n organizationId: organization.organizationId,\n emails: parsed.data.emails,\n role: parsed.data.role,\n });\n\n return c.json(InviteProjectMembersResponseSchema.parse(results));\n};\n","import {\n ErrorResponseSchema,\n mapProjectMember,\n UpdateProjectMemberRequestSchema,\n UpdateProjectMemberResponseSchema,\n} from \"@keystrokehq/shared\";\nimport {\n ProjectMemberNotFoundError,\n updateProjectMemberRole,\n} from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const userId = c.req.param(\"userId\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateProjectMemberRequestSchema.safeParse(body);\n\n if (!userId) {\n return c.json(ErrorResponseSchema.parse({ error: \"User id is required\" }), 400);\n }\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid member update request\" }), 400);\n }\n\n try {\n const member = await updateProjectMemberRole(project.id, userId, parsed.data.role);\n return c.json(UpdateProjectMemberResponseSchema.parse(mapProjectMember(member)));\n } catch (error) {\n if (error instanceof ProjectMemberNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n throw error;\n }\n};\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { ProjectMemberNotFoundError, removeProjectMember } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const userId = c.req.param(\"userId\");\n\n if (!userId) {\n return c.json(ErrorResponseSchema.parse({ error: \"User id is required\" }), 400);\n }\n\n try {\n await removeProjectMember(project.id, userId);\n return c.body(null, 204);\n } catch (error) {\n if (error instanceof ProjectMemberNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n throw error;\n }\n};\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport { ProjectMemberNotFoundError, removeProjectMember } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n const userId = c.get(\"user\").id;\n\n try {\n await removeProjectMember(project.id, userId);\n return c.body(null, 204);\n } catch (error) {\n if (error instanceof ProjectMemberNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n throw error;\n }\n};\n","import { ProjectSettingsResponseSchema, mapProjectSettings } from \"@keystrokehq/shared\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const project = c.get(\"project\");\n\n return c.json(ProjectSettingsResponseSchema.parse(mapProjectSettings(project)));\n};\n","import {\n ErrorResponseSchema,\n ProjectSettingsResponseSchema,\n UpdateProjectSettingsRequestSchema,\n mapProjectSettings,\n} from \"@keystrokehq/shared\";\nimport { updateProjectSettings } from \"@keystrokehq/platform-database\";\n\nimport type { ProjectRouteHandler } from \"../../../../types\";\n\nexport const handler: ProjectRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const project = c.get(\"project\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateProjectSettingsRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid project settings request\" }), 400);\n }\n\n const updated = await updateProjectSettings(organization.organizationId, project.id, {\n description: parsed.data.description,\n defaultMemberRole: parsed.data.defaultRole,\n invitePermission: parsed.data.invitePermission,\n });\n\n if (!updated) {\n return c.json(ErrorResponseSchema.parse({ error: \"Project not found\" }), 404);\n }\n\n return c.json(ProjectSettingsResponseSchema.parse(mapProjectSettings(updated)));\n};\n","import type { AppCredentialScope, AppCredentialSummary } from \"@keystrokehq/shared\";\nimport { displayCredentialAppName, parseAppSlug } from \"@keystrokehq/shared\";\nimport { runWithProjectScope, type CredentialInstanceRow } from \"@keystrokehq/database\";\nimport {\n selectOAuthConnectionsByIds,\n selectProjectsByOrganizationId,\n selectUsersByIds,\n type OAuthConnectionRow,\n type UserRow,\n} from \"@keystrokehq/platform-database\";\nimport { readCredentialInstanceSecret } from \"@keystrokehq/secrets\";\n\nconst APP_CREDENTIAL_SCOPES: readonly string[] = [\"user\", \"project\", \"organization\"];\n\nexport function toAppCredentialScope(scopeType: string): AppCredentialScope | null {\n return APP_CREDENTIAL_SCOPES.includes(scopeType) ? (scopeType as AppCredentialScope) : null;\n}\n\n/** Run `fn` with the row's project scope bound (no-op for org/user rows). */\nexport function withCredentialRowScope<T>(\n row: Pick<CredentialInstanceRow, \"scopeType\" | \"projectId\">,\n fn: () => Promise<T>,\n): Promise<T> {\n if (row.scopeType === \"project\") {\n return runWithProjectScope(row.projectId, fn);\n }\n return fn();\n}\n\n/** User-scoped credentials are only manageable by their owner. */\nexport function canManageCredential(\n row: Pick<CredentialInstanceRow, \"scopeType\" | \"scopeId\">,\n userId: string | undefined,\n): boolean {\n if (row.scopeType === \"user\") {\n return userId !== undefined && row.scopeId === userId;\n }\n return true;\n}\n\n/** Display name derived from the app slug (org-custom slugs use the segment after `/`). */\nfunction displayAppName(appId: string): string {\n try {\n const parsed = parseAppSlug(appId);\n if (parsed.kind === \"org\") {\n return displayCredentialAppName(parsed.name);\n }\n } catch {\n // fall through for legacy slugs\n }\n\n return displayCredentialAppName(appId);\n}\n\n/** Masked preview of a secret — last 4 chars revealed, the rest masked. Plaintext never returned. */\nfunction maskSecretPreview(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length <= 4) {\n return \"•\".repeat(Math.max(trimmed.length, 4));\n }\n return `${\"•\".repeat(Math.min(trimmed.length - 4, 20))}${trimmed.slice(-4)}`;\n}\n\nasync function readSecretKeyPreviews(\n instanceId: string,\n): Promise<{ credentialKeys: string[]; keyPreviews: Record<string, string> } | null> {\n // List/get decrypt every api-key secret to build masked previews (hot-path decryption).\n const payload = await readCredentialInstanceSecret(instanceId);\n if (!payload) {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n\n const keyPreviews: Record<string, string> = {};\n for (const [key, value] of Object.entries(parsed)) {\n keyPreviews[key] = maskSecretPreview(typeof value === \"string\" ? value : JSON.stringify(value));\n }\n\n const credentialKeys = Object.keys(keyPreviews);\n return credentialKeys.length > 0 ? { credentialKeys, keyPreviews } : null;\n}\n\nfunction ownerFields(owner: UserRow | undefined): Partial<AppCredentialSummary> {\n if (!owner) {\n return {};\n }\n return {\n ownerUserId: owner.id,\n ownerName: owner.name,\n ...(owner.image && URL.canParse(owner.image) ? { ownerAvatarUrl: owner.image } : {}),\n };\n}\n\ntype CredentialLookups = {\n projectNameById: Map<string, string>;\n ownersById: Map<string, UserRow>;\n connectionsById: Map<string, OAuthConnectionRow>;\n};\n\nfunction uniqueIds(\n rows: CredentialInstanceRow[],\n pick: (row: CredentialInstanceRow) => string | null,\n): string[] {\n return [...new Set(rows.map(pick).filter((id): id is string => Boolean(id)))];\n}\n\n/** Cross-database lookups: instances live in the org DB; projects/users/connections in the platform DB. */\nasync function loadCredentialLookups(\n rows: CredentialInstanceRow[],\n organizationId: string,\n): Promise<CredentialLookups> {\n const [projects, owners, connections] = await Promise.all([\n selectProjectsByOrganizationId(organizationId),\n selectUsersByIds(uniqueIds(rows, (row) => (row.scopeType === \"user\" ? row.scopeId : null))),\n selectOAuthConnectionsByIds(\n uniqueIds(rows, (row) => (row.authKind === \"oauth_managed\" ? row.connectionId : null)),\n ),\n ]);\n\n return {\n projectNameById: new Map(projects.map((project) => [project.id, project.name])),\n ownersById: new Map(owners.map((owner) => [owner.id, owner])),\n connectionsById: new Map(connections.map((connection) => [connection.id, connection])),\n };\n}\n\nasync function toCredentialSummary(\n row: CredentialInstanceRow,\n scope: AppCredentialScope,\n lookups: CredentialLookups,\n): Promise<AppCredentialSummary> {\n const isOAuth = row.authKind === \"oauth_managed\";\n const isKeystroke = row.authKind === \"keystroke\";\n const appName = displayAppName(row.slug);\n const connection = row.connectionId ? lookups.connectionsById.get(row.connectionId) : undefined;\n const secretKeys = isOAuth || isKeystroke ? null : await readSecretKeyPreviews(row.id);\n const projectId = scope === \"project\" ? (row.scopeId ?? row.projectId) : undefined;\n const projectName = projectId ? lookups.projectNameById.get(projectId) : undefined;\n\n return {\n id: row.id,\n appId: row.slug,\n label: row.label ?? appName,\n scope,\n lastRefreshedAt: isOAuth ? (connection?.updatedAt.toISOString() ?? null) : null,\n appName,\n ...(projectId ? { projectId } : {}),\n ...(projectName ? { projectName } : {}),\n status: isOAuth && !connection ? \"Disconnected\" : \"Active\",\n createdAt: row.createdAt.toISOString(),\n lastUsedAt: null,\n isDefault: Boolean(row.isDefault),\n connectionKind: isOAuth ? \"oauth\" : isKeystroke ? \"oauth\" : \"manual\",\n ...(scope === \"user\" && row.scopeId ? ownerFields(lookups.ownersById.get(row.scopeId)) : {}),\n ...(connection?.grantedScopes?.length ? { grantedScopes: connection.grantedScopes } : {}),\n ...(secretKeys ?? {}),\n ...(connection?.accessTokenExpiresAt\n ? { expiresAt: connection.accessTokenExpiresAt.toISOString() }\n : {}),\n };\n}\n\n/** Build `AppCredentialSummary` rows from org-database instances plus platform lookups. */\nexport async function enrichCredentialInstances(\n rows: CredentialInstanceRow[],\n organizationId: string,\n): Promise<AppCredentialSummary[]> {\n const visible = rows.filter((row) => toAppCredentialScope(row.scopeType) !== null);\n const lookups = await loadCredentialLookups(visible, organizationId);\n\n const summaries = await Promise.all(\n visible.map((row) => toCredentialSummary(row, toAppCredentialScope(row.scopeType)!, lookups)),\n );\n\n return summaries.sort(\n (a, b) => new Date(b.createdAt ?? 0).getTime() - new Date(a.createdAt ?? 0).getTime(),\n );\n}\n","import { ListCredentialsResponseSchema } from \"@keystrokehq/shared\";\nimport { listAllCredentialInstances } from \"@keystrokehq/database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { enrichCredentialInstances } from \"./enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const rows = await listAllCredentialInstances();\n const credentials = await enrichCredentialInstances(rows, organization.organizationId);\n return c.json(ListCredentialsResponseSchema.parse(credentials));\n};\n","import {\n CreateCredentialsRequestSchema,\n CreateCredentialsResponseSchema,\n buildCredentialInstanceLabel,\n displayCredentialAppName,\n resolveUniqueCredentialInstanceLabel,\n validateCredentialValueAgainstFields,\n} from \"@keystrokehq/shared\";\nimport {\n getServerTenantScopeId,\n runWithProjectScope,\n selectCredentialInstanceById,\n selectCredentialInstancesForScope,\n type CredentialInstanceRow,\n} from \"@keystrokehq/database\";\nimport {\n hasCredentialFieldTemplate,\n selectAppForOrganization,\n selectProjectForOrganizationBySlug,\n} from \"@keystrokehq/platform-database\";\nimport { setCredentialInstanceSecret } from \"@keystrokehq/secrets\";\nimport type { CredentialScopeType } from \"@keystrokehq/shared\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { enrichCredentialInstances } from \"./enrich\";\n\ntype CreateTarget = {\n scopeType: CredentialScopeType;\n scopeId: string;\n /** Project scope to bind while reading/writing rows for this target. */\n projectScope?: string;\n projectName?: string;\n};\n\nfunction withTargetScope<T>(target: CreateTarget, fn: () => Promise<T>): Promise<T> {\n if (target.projectScope) {\n return runWithProjectScope(target.projectScope, fn);\n }\n return fn();\n}\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const user = c.get(\"user\");\n\n const parsed = CreateCredentialsRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n const message = parsed.error.issues[0]?.message ?? \"Invalid request body\";\n return c.json({ error: message }, 400);\n }\n const input = parsed.data;\n\n if (input.connectionKind === \"manual\" && input.value) {\n const app = await selectAppForOrganization(organization.organizationId, input.appId);\n if (app && hasCredentialFieldTemplate(app)) {\n const validation = validateCredentialValueAgainstFields(app.credentialFields, input.value);\n if (!validation.ok) {\n return c.json({ error: validation.message }, 400);\n }\n }\n }\n\n const resolvedProjects: Array<{ id: string; name: string }> = [];\n for (const slug of input.projects) {\n const project = await selectProjectForOrganizationBySlug(organization.organizationId, slug);\n if (!project) {\n return c.json({ error: `Project \"${slug}\" not found` }, 400);\n }\n resolvedProjects.push({ id: project.id, name: project.name });\n }\n\n const targets: CreateTarget[] = [\n ...resolvedProjects.map((project) => ({\n scopeType: \"project\" as const,\n scopeId: project.id,\n projectScope: project.id,\n projectName: project.name,\n })),\n ...(input.createOrganizationCredential\n ? [{ scopeType: \"organization\" as const, scopeId: getServerTenantScopeId() }]\n : []),\n ...(input.createUserProvidedCredential\n ? [{ scopeType: \"user\" as const, scopeId: user.id }]\n : []),\n ];\n\n const appName = displayCredentialAppName(input.appId);\n\n // Pre-check every target before writing anything so a conflict can't leave partial fan-out.\n const siblingCounts = new Map<CreateTarget, number>();\n for (const target of targets) {\n const siblings = await withTargetScope(target, () =>\n selectCredentialInstancesForScope(input.appId, target.scopeType, target.scopeId),\n );\n siblingCounts.set(target, siblings.length);\n }\n\n const value = input.value;\n\n const createdIds: string[] = [];\n for (const target of targets) {\n const siblings = await withTargetScope(target, () =>\n selectCredentialInstancesForScope(input.appId, target.scopeType, target.scopeId),\n );\n const userLabel = input.label?.trim();\n const baseLabel =\n userLabel ||\n buildCredentialInstanceLabel({\n scopeType: target.scopeType,\n appName,\n projectName: target.projectName,\n });\n const label = resolveUniqueCredentialInstanceLabel({\n baseLabel,\n takenLabels: siblings.map((row) => row.label),\n });\n\n const id = crypto.randomUUID();\n await withTargetScope(target, () =>\n setCredentialInstanceSecret({\n id,\n key: input.appId,\n scopeType: target.scopeType,\n scopeId: target.scopeId,\n label,\n isDefault: (siblingCounts.get(target) ?? 0) === 0,\n value,\n }),\n );\n createdIds.push(id);\n }\n\n const rows: CredentialInstanceRow[] = [];\n for (const id of createdIds) {\n const row = await selectCredentialInstanceById(id);\n if (row) {\n rows.push(row);\n }\n }\n\n const credentials = await enrichCredentialInstances(rows, organization.organizationId);\n return c.json(CreateCredentialsResponseSchema.parse(credentials), 201);\n};\n","import { GetCredentialResponseSchema } from \"@keystrokehq/shared\";\nimport { selectCredentialInstanceById } from \"@keystrokehq/database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { enrichCredentialInstances, toAppCredentialScope } from \"../enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n\n const credentialId = c.req.param(\"credentialId\") ?? \"\";\n const row = credentialId ? await selectCredentialInstanceById(credentialId) : undefined;\n if (!row || toAppCredentialScope(row.scopeType) === null) {\n return c.json({ error: \"Credential not found\" }, 404);\n }\n\n const [credential] = await enrichCredentialInstances([row], organization.organizationId);\n return c.json(GetCredentialResponseSchema.parse(credential));\n};\n","import { GetCredentialResponseSchema, UpdateCredentialRequestSchema } from \"@keystrokehq/shared\";\nimport {\n clearCredentialInstanceDefaults,\n selectCredentialInstanceById,\n selectCredentialInstancesForScope,\n upsertCredentialInstance,\n} from \"@keystrokehq/database\";\nimport { setCredentialInstanceSecret } from \"@keystrokehq/secrets\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport {\n canManageCredential,\n enrichCredentialInstances,\n toAppCredentialScope,\n withCredentialRowScope,\n} from \"../enrich\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const user = c.get(\"user\");\n\n const credentialId = c.req.param(\"credentialId\") ?? \"\";\n const existing = credentialId ? await selectCredentialInstanceById(credentialId) : undefined;\n if (!existing || toAppCredentialScope(existing.scopeType) === null) {\n return c.json({ error: \"Credential not found\" }, 404);\n }\n\n if (!canManageCredential(existing, user.id)) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n\n const parsed = UpdateCredentialRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n const message = parsed.error.issues[0]?.message ?? \"Invalid request body\";\n return c.json({ error: message }, 400);\n }\n\n if (parsed.data.value && existing.authKind !== \"api_key\") {\n return c.json({ error: \"Only api-key credentials support secret rotation\" }, 400);\n }\n\n const label = parsed.data.label !== undefined ? parsed.data.label : existing.label;\n const isDefault =\n parsed.data.isDefault !== undefined ? parsed.data.isDefault : Boolean(existing.isDefault);\n\n if (label !== existing.label) {\n const siblings = await withCredentialRowScope(existing, () =>\n selectCredentialInstancesForScope(existing.slug, existing.scopeType, existing.scopeId),\n );\n if (siblings.some((row) => row.id !== credentialId && (row.label ?? null) === label)) {\n return c.json({ error: \"A credential with this label already exists\" }, 409);\n }\n }\n\n await withCredentialRowScope(existing, async () => {\n if (parsed.data.value) {\n await setCredentialInstanceSecret({\n id: existing.id,\n key: existing.slug,\n scopeType: existing.scopeType,\n scopeId: existing.scopeId,\n label,\n isDefault,\n value: parsed.data.value,\n });\n return;\n }\n\n if (isDefault) {\n await clearCredentialInstanceDefaults({\n slug: existing.slug,\n scopeType: existing.scopeType,\n scopeId: existing.scopeId,\n exceptId: credentialId,\n });\n }\n\n await upsertCredentialInstance({\n id: existing.id,\n slug: existing.slug,\n scopeType: existing.scopeType,\n scopeId: existing.scopeId,\n label,\n isDefault,\n authKind: existing.authKind,\n ciphertext: existing.ciphertext,\n connectionId: existing.connectionId,\n createdAt: existing.createdAt,\n updatedAt: new Date(),\n });\n });\n\n const updated = await selectCredentialInstanceById(credentialId);\n const [credential] = await enrichCredentialInstances(\n updated ? [updated] : [],\n organization.organizationId,\n );\n return c.json(GetCredentialResponseSchema.parse(credential));\n};\n","import {\n deleteCredentialInstanceById,\n listCredentialInstancesByConnectionId,\n selectCredentialInstanceById,\n} from \"@keystrokehq/database\";\nimport { deleteOAuthConnectionById } from \"@keystrokehq/platform-database\";\nimport { deleteCredentialInstanceSecret } from \"@keystrokehq/secrets\";\n\nimport type { McpProviderPlugin } from \"@keystrokehq/http\";\nimport { resolveMcpEntityId } from \"@keystrokehq/http\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { canManageCredential, toAppCredentialScope } from \"../enrich\";\n\ntype DeleteCredentialHandlerOptions = {\n mcp?: McpProviderPlugin;\n};\n\nexport function createDeleteCredentialHandler(\n options: DeleteCredentialHandlerOptions = {},\n): OrganizationRouteHandler {\n return async (c) => {\n const user = c.get(\"user\");\n\n const credentialId = c.req.param(\"credentialId\") ?? \"\";\n const existing = credentialId ? await selectCredentialInstanceById(credentialId) : undefined;\n if (!existing || toAppCredentialScope(existing.scopeType) === null) {\n return c.json({ error: \"Credential not found\" }, 404);\n }\n\n if (!canManageCredential(existing, user.id)) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n\n if (existing.authKind === \"oauth_managed\") {\n // Revoke the underlying connection when this is its last credential instance.\n if (existing.connectionId) {\n const references = await listCredentialInstancesByConnectionId(existing.connectionId);\n if (references.every((row) => row.id === existing.id)) {\n await deleteOAuthConnectionById(existing.connectionId);\n }\n }\n } else if (existing.authKind === \"keystroke\") {\n if (existing.connectionId) {\n const references = await listCredentialInstancesByConnectionId(existing.connectionId);\n if (references.every((row) => row.id === existing.id)) {\n if (!options.mcp) {\n return c.json({ error: \"mcp_unconfigured\" }, 501);\n }\n\n await options.mcp.revokeConnection(resolveMcpEntityId(existing), existing.connectionId);\n }\n }\n } else {\n await deleteCredentialInstanceSecret(existing.id);\n }\n\n await deleteCredentialInstanceById(credentialId);\n return c.body(null, 204);\n };\n}\n","import { ListOrganizationMembersResponseSchema, mapOrganizationMember } from \"@keystrokehq/shared\";\nimport { selectOrganizationMembers } from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const members = await selectOrganizationMembers(organizationId);\n\n return c.json(ListOrganizationMembersResponseSchema.parse(members.map(mapOrganizationMember)));\n};\n","import { resolveAuthEmailFrom } from \"@keystrokehq/auth\";\nimport { organizationInvitationAcceptPath } from \"@keystrokehq/shared\";\nimport { Resend } from \"resend\";\n\nexport type OrganizationInviteEmailPayload = {\n email: string;\n organizationName: string;\n invitationId: string;\n inviterName?: string;\n};\n\nfunction envValue(name: string): string | undefined {\n const value = process.env[name]?.trim();\n return value || undefined;\n}\n\nexport function resolveOrganizationInviteUrl(invitationId: string): string {\n const base = envValue(\"PUBLIC_WEB_URL\") ?? \"http://localhost:3000\";\n return `${base.replace(/\\/$/, \"\")}${organizationInvitationAcceptPath(invitationId)}`;\n}\n\nexport function isOrganizationInviteEmailConfigured(): boolean {\n return envValue(\"RESEND_API_KEY\") !== undefined;\n}\n\nfunction resolveResendApiKey(): string | undefined {\n return envValue(\"RESEND_API_KEY\");\n}\n\nfunction buildOrganizationInviteEmailHtml(payload: OrganizationInviteEmailPayload): string {\n const inviteUrl = resolveOrganizationInviteUrl(payload.invitationId);\n const escapedOrg = payload.organizationName.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\");\n const inviterLine = payload.inviterName\n ? `<p>${payload.inviterName.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\")} invited you to join <strong>${escapedOrg}</strong> on Keystroke.</p>`\n : `<p>You have been invited to join <strong>${escapedOrg}</strong> on Keystroke.</p>`;\n\n return `<!DOCTYPE html>\n<html>\n <body style=\"font-family: system-ui, sans-serif; line-height: 1.5; color: #111;\">\n ${inviterLine}\n <p><a href=\"${inviteUrl}\" style=\"display: inline-block; padding: 10px 16px; background: #111; color: #fff; text-decoration: none; border-radius: 8px;\">View invitation</a></p>\n <p style=\"color: #666; font-size: 13px;\">Sign in with this email address to accept the invitation.</p>\n </body>\n</html>`;\n}\n\nexport async function sendOrganizationInviteEmail(\n payload: OrganizationInviteEmailPayload,\n resend?: Resend,\n): Promise<boolean> {\n const apiKey = resolveResendApiKey();\n if (!apiKey) {\n console.warn(\"[platform] RESEND_API_KEY not set; organization invite email skipped\");\n return false;\n }\n\n const client = resend ?? new Resend(apiKey);\n const { error } = await client.emails.send({\n from: resolveAuthEmailFrom(),\n to: payload.email,\n subject: `Invitation to join ${payload.organizationName} on Keystroke`,\n html: buildOrganizationInviteEmailHtml(payload),\n });\n\n if (error) {\n console.warn(`[platform] Failed to send organization invite email: ${error.message}`);\n return false;\n }\n\n return true;\n}\n","import {\n ErrorResponseSchema,\n InviteOrganizationMembersRequestSchema,\n InviteOrganizationMembersResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { inviteOrganizationMembers, selectUserById } from \"@keystrokehq/platform-database\";\n\nimport { sendOrganizationInviteEmail } from \"../../../../email/organization-invite-email\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const organization = c.get(\"organization\");\n const body = await c.req.json().catch(() => null);\n const parsed = InviteOrganizationMembersRequestSchema.safeParse(body);\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid invite request\" }), 400);\n }\n\n const results = await inviteOrganizationMembers({\n organizationId: organization.organizationId,\n invitedByUserId: user.id,\n emails: parsed.data.emails,\n role: parsed.data.role,\n });\n\n const inviter = await selectUserById(user.id);\n for (const result of results) {\n if (!result.invitationId || (result.status !== \"sent\" && result.status !== \"pending\")) {\n continue;\n }\n\n await sendOrganizationInviteEmail({\n email: result.email,\n organizationName: organization.organizationName,\n invitationId: result.invitationId,\n inviterName: inviter?.name,\n });\n }\n\n return c.json(InviteOrganizationMembersResponseSchema.parse(results));\n};\n","import {\n ErrorResponseSchema,\n mapOrganizationMember,\n UpdateOrganizationMemberRequestSchema,\n UpdateOrganizationMemberResponseSchema,\n} from \"@keystrokehq/shared\";\nimport {\n CannotModifyOwnerError,\n OrganizationMemberNotFoundError,\n updateOrganizationMemberRole,\n} from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const userId = c.req.param(\"userId\");\n const body = await c.req.json().catch(() => null);\n const parsed = UpdateOrganizationMemberRequestSchema.safeParse(body);\n\n if (!userId) {\n return c.json(ErrorResponseSchema.parse({ error: \"User id is required\" }), 400);\n }\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid member update request\" }), 400);\n }\n\n try {\n const member = await updateOrganizationMemberRole(organizationId, userId, parsed.data.role);\n\n return c.json(UpdateOrganizationMemberResponseSchema.parse(mapOrganizationMember(member)));\n } catch (error) {\n if (\n error instanceof CannotModifyOwnerError ||\n error instanceof OrganizationMemberNotFoundError\n ) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n\n throw error;\n }\n};\n","import { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport {\n CannotModifyOwnerError,\n OrganizationMemberNotFoundError,\n removeOrganizationMember,\n} from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const userId = c.req.param(\"userId\");\n\n if (!userId) {\n return c.json(ErrorResponseSchema.parse({ error: \"User id is required\" }), 400);\n }\n\n try {\n await removeOrganizationMember(organizationId, userId);\n return c.body(null, 204);\n } catch (error) {\n if (\n error instanceof CannotModifyOwnerError ||\n error instanceof OrganizationMemberNotFoundError\n ) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);\n }\n\n throw error;\n }\n};\n","import {\n ListOrganizationInvitationsResponseSchema,\n mapOrganizationInvitation,\n} from \"@keystrokehq/shared\";\nimport { selectPendingInvitationsForUser } from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const invitations = await selectPendingInvitationsForUser(user.id);\n\n return c.json(\n ListOrganizationInvitationsResponseSchema.parse(invitations.map(mapOrganizationInvitation)),\n );\n};\n","import {\n AcceptOrganizationInvitationResponseSchema,\n ErrorResponseSchema,\n mapUserOrganization,\n} from \"@keystrokehq/shared\";\nimport {\n acceptInvitation,\n OrganizationInvitationExpiredError,\n OrganizationInvitationForbiddenError,\n OrganizationInvitationNotFoundError,\n} from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const invitationId = c.req.param(\"invitationId\");\n\n if (!invitationId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invitation id is required\" }), 400);\n }\n\n try {\n const membership = await acceptInvitation(invitationId, user.id);\n\n return c.json(\n AcceptOrganizationInvitationResponseSchema.parse(mapUserOrganization(membership)),\n );\n } catch (error) {\n if (error instanceof OrganizationInvitationNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 404);\n }\n\n if (error instanceof OrganizationInvitationForbiddenError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 403);\n }\n\n if (error instanceof OrganizationInvitationExpiredError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 410);\n }\n\n throw error;\n }\n};\n","import {\n DeclineOrganizationInvitationResponseSchema,\n ErrorResponseSchema,\n} from \"@keystrokehq/shared\";\nimport {\n declineInvitation,\n OrganizationInvitationForbiddenError,\n OrganizationInvitationNotFoundError,\n} from \"@keystrokehq/platform-database\";\n\nimport type { AccountRouteHandler } from \"../../../../types\";\n\nexport const handler: AccountRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const invitationId = c.req.param(\"invitationId\");\n\n if (!invitationId) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invitation id is required\" }), 400);\n }\n\n try {\n await declineInvitation(invitationId, user.id);\n\n return c.json(DeclineOrganizationInvitationResponseSchema.parse({ success: true }));\n } catch (error) {\n if (error instanceof OrganizationInvitationNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 404);\n }\n\n if (error instanceof OrganizationInvitationForbiddenError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 403);\n }\n\n throw error;\n }\n};\n","import type { AppRow } from \"@keystrokehq/platform-database\";\nimport { hasCredentialFieldTemplate } from \"@keystrokehq/platform-database\";\nimport type { AppCatalogEntry, AppCredentialFields, CustomAppDetail } from \"@keystrokehq/shared\";\n\n/** Map a platform `apps` row to the connect-picker wire shape. */\nexport function appRowToCatalogEntry(row: AppRow): AppCatalogEntry {\n return {\n id: row.slug,\n name: row.name,\n description: row.description,\n category: row.category,\n integrationDescription: row.description,\n ...(row.logo ? { logo: row.logo } : {}),\n authKind: row.authKind,\n oauthScopes: row.oauthScopes,\n source: row.source,\n ...(hasCredentialFieldTemplate(row)\n ? { credentialFields: row.credentialFields as AppCredentialFields }\n : {}),\n };\n}\n\nexport function appRowToCustomAppDetail(row: AppRow): CustomAppDetail {\n if (row.source !== \"custom\" || row.authKind !== \"api_key\") {\n throw new Error(`App is not a custom api_key app: ${row.slug}`);\n }\n\n if (!hasCredentialFieldTemplate(row)) {\n throw new Error(`Custom app is missing credential fields: ${row.slug}`);\n }\n\n return {\n id: row.slug,\n slug: row.slug,\n name: row.name,\n description: row.description,\n category: row.category,\n authKind: \"api_key\",\n source: \"custom\",\n credentialFields: row.credentialFields as AppCredentialFields,\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n };\n}\n","import { listAppsForOrganization } from \"@keystrokehq/platform-database\";\nimport { ListAppsResponseSchema } from \"@keystrokehq/shared\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { appRowToCatalogEntry } from \"./map-catalog\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const rows = await listAppsForOrganization(organization.organizationId);\n const apps = rows.map(appRowToCatalogEntry);\n return c.json(ListAppsResponseSchema.parse(apps));\n};\n","import {\n createOrgApp,\n OrgAppSlugTakenError,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\nimport {\n CreateCustomAppRequestSchema,\n CreateCustomAppResponseSchema,\n ErrorResponseSchema,\n} from \"@keystrokehq/shared\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\nimport { appRowToCustomAppDetail } from \"./map-catalog\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const parsed = CreateCustomAppRequestSchema.safeParse(await c.req.json().catch(() => null));\n\n if (!parsed.success) {\n const message = parsed.error.issues[0]?.message ?? \"Invalid request body\";\n return c.json(ErrorResponseSchema.parse({ error: message }), 400);\n }\n\n const org = await selectOrganizationById(organization.organizationId);\n if (!org) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n try {\n const row = await createOrgApp({\n organizationId: organization.organizationId,\n orgSlug: org.slug,\n name: parsed.data.name,\n slug: parsed.data.slug,\n description: parsed.data.description,\n credentialFields: parsed.data.fields,\n });\n\n return c.json(CreateCustomAppResponseSchema.parse(appRowToCustomAppDetail(row)), 201);\n } catch (error) {\n if (error instanceof OrgAppSlugTakenError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 409);\n }\n\n throw error;\n }\n};\n","import {\n AppSlugAvailabilityQuerySchema,\n AppSlugAvailabilityResponseSchema,\n ErrorResponseSchema,\n} from \"@keystrokehq/shared\";\nimport {\n checkOrgAppSlugAvailability,\n selectOrganizationById,\n} from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const parsed = AppSlugAvailabilityQuerySchema.safeParse({\n slug: c.req.query(\"slug\"),\n });\n\n if (!parsed.success) {\n return c.json(ErrorResponseSchema.parse({ error: \"Invalid slug query\" }), 400);\n }\n\n const org = await selectOrganizationById(organization.organizationId);\n if (!org) {\n return c.json(ErrorResponseSchema.parse({ error: \"Organization not found\" }), 404);\n }\n\n const availability = await checkOrgAppSlugAvailability(org.slug, parsed.data.slug);\n return c.json(AppSlugAvailabilityResponseSchema.parse(availability));\n};\n","import { selectAppForOrganization } from \"@keystrokehq/platform-database\";\nimport { ErrorResponseSchema, GetCustomAppResponseSchema } from \"@keystrokehq/shared\";\n\nimport type { OrganizationRouteHandler } from \"../../../types\";\nimport { appRowToCustomAppDetail } from \"../map-catalog\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const organization = c.get(\"organization\");\n const slug = c.req.param(\"slug\") ?? \"\";\n if (!slug) {\n return c.json(ErrorResponseSchema.parse({ error: \"App not found\" }), 404);\n }\n\n const row = await selectAppForOrganization(organization.organizationId, decodeURIComponent(slug));\n if (!row || row.source !== \"custom\") {\n return c.json(ErrorResponseSchema.parse({ error: \"App not found\" }), 404);\n }\n\n try {\n return c.json(GetCustomAppResponseSchema.parse(appRowToCustomAppDetail(row)));\n } catch {\n return c.json(ErrorResponseSchema.parse({ error: \"App not found\" }), 404);\n }\n};\n","import { apiKeyListScope } from \"@keystrokehq/access-control\";\nimport { ListApiKeysResponseSchema } from \"@keystrokehq/shared\";\nimport {\n listOrgPlatformApiKeysForOrganization,\n listOrgPlatformApiKeysForUser,\n mapOrgPlatformApiKeyCreatorOrDeleted,\n selectUsersByIds,\n} from \"@keystrokehq/platform-database\";\n\nimport { accessContext } from \"../../../auth/access-context\";\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const user = c.get(\"user\");\n const scope = apiKeyListScope(accessContext(c));\n const records =\n scope.kind === \"all\"\n ? await listOrgPlatformApiKeysForOrganization(organizationId)\n : await listOrgPlatformApiKeysForUser(organizationId, user.id);\n\n const creators = await selectUsersByIds([\n ...new Set(records.map((record) => record.createdByUserId)),\n ]);\n const creatorsById = new Map(creators.map((creator) => [creator.id, creator]));\n\n return c.json(\n ListApiKeysResponseSchema.parse(\n records.map((record) => ({\n id: record.id,\n name: record.name,\n keyPreview: record.keyPreview,\n createdAt: record.createdAt.toISOString(),\n createdBy: mapOrgPlatformApiKeyCreatorOrDeleted(\n record.createdByUserId,\n creatorsById.get(record.createdByUserId),\n ),\n isCreatedByCurrentUser: record.createdByUserId === user.id,\n })),\n ),\n );\n};\n","import { CreateApiKeyRequestSchema, CreateApiKeyResponseSchema } from \"@keystrokehq/shared\";\nimport {\n createOrgPlatformApiKey,\n loadOrgPlatformApiKeyUser,\n mapOrgPlatformApiKeyCreator,\n} from \"@keystrokehq/platform-database\";\n\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const user = c.get(\"user\");\n const body = CreateApiKeyRequestSchema.parse(await c.req.json());\n const created = await createOrgPlatformApiKey({\n organizationId,\n userId: user.id,\n name: body.name,\n });\n const creator = await loadOrgPlatformApiKeyUser(user.id);\n\n if (!creator) {\n return c.json({ error: \"User not found\" }, 404);\n }\n\n return c.json(\n CreateApiKeyResponseSchema.parse({\n id: created.id,\n name: created.name,\n keyPreview: created.keyPreview,\n createdAt: created.createdAt.toISOString(),\n createdBy: mapOrgPlatformApiKeyCreator(creator),\n isCreatedByCurrentUser: true,\n secret: created.secret,\n }),\n 201,\n );\n};\n","import { canReadApiKey, canRevokeApiKey } from \"@keystrokehq/access-control\";\nimport { ErrorResponseSchema } from \"@keystrokehq/shared\";\nimport {\n OrgPlatformApiKeyNotFoundError,\n revokeOrgPlatformApiKey,\n selectOrgPlatformApiKeyForOrganization,\n} from \"@keystrokehq/platform-database\";\n\nimport { accessContext } from \"../../../../auth/access-context\";\nimport { forbidden } from \"@keystrokehq/http/auth\";\nimport type { OrganizationRouteHandler } from \"../../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const { organizationId } = c.get(\"organization\");\n const user = c.get(\"user\");\n const apiKeyId = c.req.param(\"apiKeyId\");\n\n if (!apiKeyId) {\n return c.json(ErrorResponseSchema.parse({ error: \"API key id is required\" }), 400);\n }\n\n const apiKey = await selectOrgPlatformApiKeyForOrganization(apiKeyId, organizationId);\n if (!apiKey) {\n return c.json(ErrorResponseSchema.parse({ error: \"API key not found\" }), 404);\n }\n\n if (\n !canReadApiKey(accessContext(c), {\n userId: user.id,\n createdByUserId: apiKey.createdByUserId,\n })\n ) {\n return c.json(ErrorResponseSchema.parse({ error: \"API key not found\" }), 404);\n }\n\n if (\n !canRevokeApiKey(accessContext(c), {\n userId: user.id,\n createdByUserId: apiKey.createdByUserId,\n })\n ) {\n return forbidden(c);\n }\n\n try {\n await revokeOrgPlatformApiKey(apiKeyId, organizationId);\n return c.body(null, 204);\n } catch (error) {\n if (error instanceof OrgPlatformApiKeyNotFoundError) {\n return c.json(ErrorResponseSchema.parse({ error: error.message }), 404);\n }\n\n throw error;\n }\n};\n","import type { TeamRequestType } from \"@keystrokehq/shared\";\n\nexport type TeamRequestSlackUser = {\n id: string;\n name: string;\n email: string;\n};\n\nexport type TeamRequestSlackOrg = {\n id: string;\n name: string;\n slug: string;\n};\n\nexport type PostTeamRequestToSlackInput = {\n type: TeamRequestType;\n message?: string;\n user: TeamRequestSlackUser;\n org: TeamRequestSlackOrg;\n timestamp?: string;\n};\n\nconst TEAM_REQUEST_HEADINGS: Record<TeamRequestType, string> = {\n \"org-deletion\": \"Org deletion requested\",\n contact: \"Contact request\",\n \"enterprise-upgrade\": \"Enterprise upgrade requested\",\n};\n\nexport function buildTeamRequestSlackPayload(input: PostTeamRequestToSlackInput): {\n text: string;\n blocks: Array<Record<string, unknown>>;\n} {\n const timestamp = input.timestamp ?? new Date().toISOString();\n const heading = TEAM_REQUEST_HEADINGS[input.type];\n const summary = `${heading} from ${input.user.name} (${input.org.name})`;\n\n const fields = [\n { type: \"mrkdwn\", text: `*Request type:*\\n${input.type}` },\n { type: \"mrkdwn\", text: `*Timestamp:*\\n${timestamp}` },\n {\n type: \"mrkdwn\",\n text: `*User:*\\n${input.user.name}\\n${input.user.email}\\n\\`${input.user.id}\\``,\n },\n {\n type: \"mrkdwn\",\n text: `*Organization:*\\n${input.org.name}\\n\\`${input.org.slug}\\`\\n\\`${input.org.id}\\``,\n },\n ];\n\n const blocks: Array<Record<string, unknown>> = [\n {\n type: \"header\",\n text: { type: \"plain_text\", text: heading, emoji: true },\n },\n {\n type: \"section\",\n fields,\n },\n ];\n\n if (input.type === \"contact\" && input.message?.trim()) {\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*Message:*\\n${input.message.trim()}`,\n },\n });\n }\n\n return { text: summary, blocks };\n}\n\nexport async function postTeamRequestToSlack(input: PostTeamRequestToSlackInput): Promise<void> {\n const webhookUrl = process.env.TEAM_SLACK_WEBHOOK_URL?.trim();\n if (!webhookUrl) {\n console.warn(\"TEAM_SLACK_WEBHOOK_URL is not set; skipping team request Slack delivery\");\n return;\n }\n\n const payload = buildTeamRequestSlackPayload(input);\n const response = await fetch(webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new Error(\n `Failed to deliver team request to Slack (${response.status})${body ? `: ${body}` : \"\"}`,\n );\n }\n}\n","import {\n SubmitTeamRequestRequestSchema,\n SubmitTeamRequestResponseSchema,\n} from \"@keystrokehq/shared\";\nimport { selectOrganizationById } from \"@keystrokehq/platform-database\";\n\nimport { postTeamRequestToSlack } from \"../../../lib/team-request-slack\";\nimport type { OrganizationRouteHandler } from \"../../types\";\n\nexport const handler: OrganizationRouteHandler = async (c) => {\n const user = c.get(\"user\");\n const organizationContext = c.get(\"organization\");\n\n const parsed = SubmitTeamRequestRequestSchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n const message = parsed.error.issues[0]?.message ?? \"Invalid request body\";\n return c.json({ error: message }, 400);\n }\n\n const organization = await selectOrganizationById(organizationContext.organizationId);\n if (!organization) {\n return c.json({ error: \"Organization not found\" }, 404);\n }\n\n try {\n await postTeamRequestToSlack({\n type: parsed.data.type,\n message: parsed.data.message,\n user: {\n id: user.id,\n name: user.name,\n email: user.email,\n },\n org: {\n id: organization.id,\n name: organization.name,\n slug: organization.slug,\n },\n });\n } catch (error) {\n console.error(\"Failed to deliver team request to Slack\", error);\n return c.json({ error: \"Failed to deliver team request\" }, 502);\n }\n\n return c.json(SubmitTeamRequestResponseSchema.parse({ ok: true }), 200);\n};\n","import { createDefaultAuthJwtVerifier } from \"@keystrokehq/auth\";\nimport type { CreateOrganizationDependencies } from \"../../services/create-organization\";\nimport { Hono } from \"hono\";\n\nimport {\n canInviteRole,\n canInviteToProject,\n apiKeysActions,\n organizationActions,\n projectActions,\n userActions,\n} from \"@keystrokehq/access-control\";\nimport {\n InviteOrganizationMembersRequestSchema,\n InviteProjectMembersRequestSchema,\n} from \"@keystrokehq/shared\";\n\nimport { authorize } from \"../../auth/authorize\";\nimport { authorizePayload } from \"../../auth/authorize-payload\";\nimport { requireOrganization } from \"@keystrokehq/http/auth\";\nimport { requireOrganizationParam } from \"../../auth/require-organization-param\";\nimport { requireProject } from \"@keystrokehq/http/auth\";\nimport { requireProjectMembership } from \"@keystrokehq/http/auth\";\nimport { getProjectInvitePermission } from \"../../auth/access-context\";\nimport { requireSession } from \"@keystrokehq/http/auth\";\nimport { withOrganizationProjectDatabase } from \"@keystrokehq/http/middleware\";\nimport type {\n OrganizationVariables,\n ProjectRouteVariables,\n SessionVariables,\n} from \"@keystrokehq/http/auth\";\nimport { handler as getUserAvatar } from \"./users/me/avatar/GET\";\nimport { handler as presignUserAvatar } from \"./users/me/avatar/presign/POST\";\nimport { handler as updateUserAvatar } from \"./users/me/avatar/PATCH\";\nimport { handler as getUserPreferences } from \"./users/me/preferences/GET\";\nimport { handler as updateUserPreferences } from \"./users/me/preferences/PATCH\";\nimport { handler as listOrganizations } from \"./organizations/GET\";\nimport { createOrganizationHandler } from \"./organizations/POST\";\nimport { handler as checkOrganizationSlugAvailability } from \"./organizations/slug-available/GET\";\nimport { handler as getOrganization } from \"./organizations/[organizationId]/GET\";\nimport { handler as updateOrganization } from \"./organizations/[organizationId]/PATCH\";\nimport { handler as getOrganizationSidebarBranding } from \"./organizations/[organizationId]/branding/GET\";\nimport { handler as updateOrganizationSidebarBranding } from \"./organizations/[organizationId]/branding/PATCH\";\nimport { handler as presignOrganizationSidebarLogo } from \"./organizations/[organizationId]/branding/logo/presign/POST\";\nimport { handler as listHistory } from \"./history/GET\";\nimport { handler as getHistoryRun } from \"./history/[runId]/GET\";\nimport { handler as listAgents } from \"./agents/GET\";\nimport { handler as getAgent } from \"./agents/[agentId]/GET\";\nimport { handler as cancelAgentSession } from \"./agents/sessions/[sessionId]/cancel/POST\";\nimport { handler as listWorkflows } from \"./workflows/GET\";\nimport { handler as getWorkflow } from \"./workflows/[workflowId]/GET\";\nimport { handler as cancelWorkflowRun } from \"./workflows/runs/[runId]/cancel/POST\";\nimport { handler as listSkills } from \"./skills/GET\";\nimport { handler as getSkill } from \"./skills/[skillId]/GET\";\nimport { handler as listRecents } from \"./recents/GET\";\nimport { handler as listProjects } from \"./projects/GET\";\nimport { handler as listProjectMetrics } from \"./projects/metrics/GET\";\nimport { handler as createProject } from \"./projects/POST\";\nimport { handler as checkProjectSlugAvailabilityRoute } from \"./projects/slug-available/GET\";\nimport { handler as getProject } from \"./projects/[projectId]/GET\";\nimport { handler as updateProject } from \"./projects/[projectId]/PATCH\";\nimport { handler as deleteProject } from \"./projects/[projectId]/DELETE\";\nimport { handler as listProjectDeployments } from \"./projects/[projectId]/deployments/GET\";\nimport { handler as createProjectArtifact } from \"./projects/[projectId]/artifacts/POST\";\nimport { handler as downloadActiveProjectArtifact } from \"./projects/[projectId]/artifacts/active/download/GET\";\nimport { handler as completeProjectArtifact } from \"./projects/[projectId]/artifacts/[artifactId]/complete/POST\";\nimport { handler as presignProjectArtifactSource } from \"./projects/[projectId]/artifacts/[artifactId]/source/presign/POST\";\nimport { handler as uploadProjectArtifactSourceManifest } from \"./projects/[projectId]/artifacts/[artifactId]/source/manifest/POST\";\nimport { handler as listProjectFiles } from \"./projects/[projectId]/files/GET\";\nimport { handler as getProjectFileContent } from \"./projects/[projectId]/artifacts/[artifactId]/files/content/GET\";\nimport { createProjectReachabilityHandler } from \"./projects/[projectId]/reachability/GET\";\nimport { handler as listProjectMembers } from \"./projects/[projectId]/members/GET\";\nimport { handler as inviteProjectMembers } from \"./projects/[projectId]/members/POST\";\nimport { handler as updateProjectMember } from \"./projects/[projectId]/members/[userId]/PATCH\";\nimport { handler as removeProjectMember } from \"./projects/[projectId]/members/[userId]/DELETE\";\nimport { handler as leaveProject } from \"./projects/[projectId]/members/me/DELETE\";\nimport { handler as getProjectSettings } from \"./projects/[projectId]/settings/GET\";\nimport { handler as updateProjectSettings } from \"./projects/[projectId]/settings/PATCH\";\nimport { handler as listCredentials } from \"./credentials/GET\";\nimport { handler as createCredentials } from \"./credentials/POST\";\nimport { handler as getCredential } from \"./credentials/[credentialId]/GET\";\nimport { handler as updateCredential } from \"./credentials/[credentialId]/PATCH\";\nimport { createDeleteCredentialHandler } from \"./credentials/[credentialId]/DELETE\";\nimport { handler as listOrganizationMembers } from \"./members/GET\";\nimport { handler as inviteOrganizationMembers } from \"./members/invitations/POST\";\nimport { handler as updateOrganizationMember } from \"./members/[userId]/PATCH\";\nimport { handler as removeOrganizationMember } from \"./members/[userId]/DELETE\";\nimport { handler as listOrganizationInvitations } from \"./invitations/GET\";\nimport { handler as acceptOrganizationInvitation } from \"./invitations/[invitationId]/accept/POST\";\nimport { handler as declineOrganizationInvitation } from \"./invitations/[invitationId]/decline/POST\";\nimport { handler as listApps } from \"./apps/GET\";\nimport { handler as createApp } from \"./apps/POST\";\nimport { handler as checkAppSlugAvailability } from \"./apps/slug-available/GET\";\nimport { handler as getAppBySlug } from \"./apps/[slug]/GET\";\nimport { handler as listApiKeys } from \"./api-keys/GET\";\nimport { handler as createApiKey } from \"./api-keys/POST\";\nimport { handler as revokeApiKey } from \"./api-keys/[apiKeyId]/DELETE\";\nimport { handler as submitTeamRequest } from \"./team-requests/POST\";\n\nexport function mountAccountRoutes(\n options: CreateOrganizationDependencies & {\n mcp?: import(\"@keystrokehq/http\").McpProviderPlugin;\n },\n): Hono<{ Variables: SessionVariables }> {\n const account = new Hono<{ Variables: SessionVariables }>();\n const orgScoped = new Hono<{ Variables: OrganizationVariables }>();\n const projectScoped = new Hono<{ Variables: ProjectRouteVariables }>();\n const jwtVerifier = createDefaultAuthJwtVerifier();\n const protect = requireSession(jwtVerifier);\n const deleteCredential = createDeleteCredentialHandler({ mcp: options.mcp });\n\n account.use(\"/*\", protect);\n orgScoped.use(\"/*\", protect);\n orgScoped.use(\"/*\", requireOrganization());\n projectScoped.use(\"/*\", protect);\n projectScoped.use(\"/*\", requireOrganization());\n\n const requireOrgUpdate = authorize(organizationActions.update);\n const requireUserManage = authorize(userActions.manage);\n const requireUserInvite = authorize(userActions.invite);\n const requireApiKeyCreate = authorize(apiKeysActions.create);\n const requireInvitableRole = authorizePayload(\n InviteOrganizationMembersRequestSchema,\n ({ ctx, body }) => canInviteRole(ctx.orgRole, body.role),\n );\n const requireProjectMember = requireProjectMembership();\n const requireProjectDeploy = authorize(projectActions.deploy);\n const requireProjectUpdate = authorize(projectActions.update);\n const requireProjectDelete = authorize(projectActions.delete);\n const requireProjectManageMembers = authorize(projectActions.manageMembers);\n const requireInvitableProjectRole = authorizePayload(\n InviteProjectMembersRequestSchema,\n ({ c, ctx, body }) =>\n canInviteToProject(ctx, { invitePermission: getProjectInvitePermission(c) }, body.role),\n );\n const requireOrgParam = requireOrganizationParam();\n\n account.get(\"/organizations\", listOrganizations);\n account.get(\"/organizations/slug-available\", checkOrganizationSlugAvailability);\n account.post(\"/organizations\", createOrganizationHandler(options));\n account.get(\"/organizations/:organizationId\", requireOrgParam, getOrganization);\n account.patch(\n \"/organizations/:organizationId\",\n requireOrgParam,\n requireOrgUpdate,\n updateOrganization,\n );\n\n account.get(\n \"/organizations/:organizationId/branding\",\n requireOrgParam,\n getOrganizationSidebarBranding,\n );\n account.patch(\n \"/organizations/:organizationId/branding\",\n requireOrgParam,\n requireOrgUpdate,\n updateOrganizationSidebarBranding,\n );\n account.post(\n \"/organizations/:organizationId/branding/logo/presign\",\n requireOrgParam,\n requireOrgUpdate,\n presignOrganizationSidebarLogo,\n );\n\n account.get(\"/invitations\", listOrganizationInvitations);\n account.post(\"/invitations/:invitationId/accept\", acceptOrganizationInvitation);\n account.post(\"/invitations/:invitationId/decline\", declineOrganizationInvitation);\n\n account.get(\"/users/me/avatar\", getUserAvatar);\n account.post(\"/users/me/avatar/presign\", presignUserAvatar);\n account.patch(\"/users/me/avatar\", updateUserAvatar);\n account.get(\"/users/me/preferences\", getUserPreferences);\n account.patch(\"/users/me/preferences\", updateUserPreferences);\n\n orgScoped.get(\"/apps\", listApps);\n orgScoped.get(\"/apps/slug-available\", checkAppSlugAvailability);\n orgScoped.post(\"/apps\", requireOrgUpdate, createApp);\n orgScoped.get(\"/apps/:slug\", getAppBySlug);\n\n orgScoped.get(\"/members\", listOrganizationMembers);\n orgScoped.post(\n \"/members/invitations\",\n requireUserInvite,\n requireInvitableRole,\n inviteOrganizationMembers,\n );\n orgScoped.patch(\"/members/:userId\", requireUserManage, updateOrganizationMember);\n orgScoped.delete(\"/members/:userId\", requireUserManage, removeOrganizationMember);\n\n orgScoped.get(\"/api-keys\", listApiKeys);\n orgScoped.post(\"/api-keys\", requireApiKeyCreate, createApiKey);\n orgScoped.delete(\"/api-keys/:apiKeyId\", revokeApiKey);\n\n const withOrgDb = withOrganizationProjectDatabase();\n\n orgScoped.get(\"/agents\", withOrgDb, listAgents);\n orgScoped.get(\"/agents/:agentId\", withOrgDb, getAgent);\n orgScoped.get(\"/workflows\", withOrgDb, listWorkflows);\n orgScoped.get(\"/workflows/:workflowId\", withOrgDb, getWorkflow);\n orgScoped.get(\"/skills\", withOrgDb, listSkills);\n orgScoped.get(\"/skills/:skillId\", withOrgDb, getSkill);\n orgScoped.get(\"/recents\", withOrgDb, listRecents);\n orgScoped.get(\"/history\", withOrgDb, listHistory);\n orgScoped.post(\"/team-requests\", submitTeamRequest);\n orgScoped.get(\"/history/:runId\", withOrgDb, getHistoryRun);\n orgScoped.post(\"/workflows/runs/:runId/cancel\", withOrgDb, cancelWorkflowRun);\n orgScoped.post(\"/agents/sessions/:sessionId/cancel\", withOrgDb, cancelAgentSession);\n\n orgScoped.get(\"/credentials\", withOrgDb, listCredentials);\n orgScoped.post(\"/credentials\", withOrgDb, createCredentials);\n // `/credentials/instances` (runtime mount) shares this prefix — fall through so the\n // param route doesn't shadow the instance list.\n orgScoped.get(\"/credentials/:credentialId\", withOrgDb, (c, next) =>\n c.req.param(\"credentialId\") === \"instances\" ? next() : getCredential(c, next),\n );\n orgScoped.patch(\"/credentials/:credentialId\", withOrgDb, updateCredential);\n orgScoped.delete(\"/credentials/:credentialId\", withOrgDb, deleteCredential);\n\n orgScoped.get(\"/projects\", listProjects);\n orgScoped.get(\"/projects/slug-available\", checkProjectSlugAvailabilityRoute);\n orgScoped.get(\"/projects/metrics\", withOrgDb, listProjectMetrics);\n orgScoped.post(\"/projects\", createProject);\n\n projectScoped.get(\"/:projectId\", requireProject(), requireProjectMember, getProject);\n projectScoped.patch(\n \"/:projectId\",\n requireProject(),\n requireProjectMember,\n requireProjectUpdate,\n updateProject,\n );\n projectScoped.delete(\n \"/:projectId\",\n requireProject(),\n requireProjectMember,\n requireProjectDelete,\n deleteProject,\n );\n projectScoped.get(\n \"/:projectId/settings\",\n requireProject(),\n requireProjectMember,\n getProjectSettings,\n );\n projectScoped.patch(\n \"/:projectId/settings\",\n requireProject(),\n requireProjectMember,\n requireProjectUpdate,\n updateProjectSettings,\n );\n projectScoped.get(\n \"/:projectId/members\",\n requireProject(),\n requireProjectMember,\n listProjectMembers,\n );\n projectScoped.post(\n \"/:projectId/members\",\n requireProject(),\n requireProjectMember,\n requireInvitableProjectRole,\n inviteProjectMembers,\n );\n projectScoped.patch(\n \"/:projectId/members/:userId\",\n requireProject(),\n requireProjectMember,\n requireProjectManageMembers,\n updateProjectMember,\n );\n projectScoped.delete(\n \"/:projectId/members/:userId\",\n requireProject(),\n requireProjectMember,\n requireProjectManageMembers,\n removeProjectMember,\n );\n projectScoped.delete(\n \"/:projectId/members/me\",\n requireProject(),\n requireProjectMember,\n leaveProject,\n );\n projectScoped.get(\n \"/:projectId/reachability\",\n requireProject(),\n requireProjectMember,\n createProjectReachabilityHandler(options.hosting),\n );\n projectScoped.get(\n \"/:projectId/files\",\n requireProject(),\n requireProjectMember,\n withOrgDb,\n listProjectFiles,\n );\n projectScoped.get(\n \"/:projectId/artifacts/:artifactId/files/content\",\n requireProject(),\n requireProjectMember,\n getProjectFileContent,\n );\n projectScoped.get(\n \"/:projectId/deployments\",\n requireProject(),\n requireProjectMember,\n listProjectDeployments,\n );\n projectScoped.get(\n \"/:projectId/artifacts/active/download\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n downloadActiveProjectArtifact,\n );\n projectScoped.post(\n \"/:projectId/artifacts\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n createProjectArtifact,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/complete\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n completeProjectArtifact,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/source/presign\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n presignProjectArtifactSource,\n );\n projectScoped.post(\n \"/:projectId/artifacts/:artifactId/source/manifest\",\n requireProject(),\n requireProjectMember,\n requireProjectDeploy,\n uploadProjectArtifactSourceManifest,\n );\n\n orgScoped.route(\"/projects\", projectScoped);\n\n account.route(\"/\", orgScoped);\n\n return account;\n}\n","import type { Context, MiddlewareHandler } from \"hono\";\n\n/** Worker auth from Bearer or x-api-key (Anthropic SDK uses the latter). */\nexport function readWorkerTokenFromRequest(c: Context): string | undefined {\n const authorization = c.req.header(\"authorization\");\n if (authorization?.startsWith(\"Bearer \")) {\n return authorization.slice(\"Bearer \".length).trim();\n }\n\n const apiKey = c.req.header(\"x-api-key\")?.trim();\n if (apiKey) {\n return apiKey;\n }\n\n return undefined;\n}\n\nexport function requireWorkerToken(expectedToken: string | undefined): MiddlewareHandler {\n return async (c, next) => {\n if (!expectedToken) {\n return c.json(\n { error: \"worker_auth_unconfigured\", message: \"Worker auth is not configured.\" },\n 503,\n );\n }\n\n const token = readWorkerTokenFromRequest(c);\n if (!token || token !== expectedToken) {\n return c.json({ error: \"unauthorized\", message: \"Invalid worker token.\" }, 401);\n }\n\n await next();\n };\n}\n","const EXA_API_ORIGIN = \"https://api.exa.ai\";\n\nexport type ProxyExaWebSearchOptions = {\n apiKey: string | undefined;\n method: string;\n path: string;\n requestUrl: string;\n body?: ArrayBuffer;\n fetchImpl?: typeof fetch;\n};\n\nexport async function proxyExaWebSearchRequest(\n options: ProxyExaWebSearchOptions,\n): Promise<Response> {\n const apiKey = options.apiKey?.trim();\n if (!apiKey) {\n return Response.json({ error: \"web_search_unconfigured\" }, { status: 501 });\n }\n\n const target = new URL(`${EXA_API_ORIGIN}/${options.path.replace(/^\\/+/, \"\")}`);\n target.search = new URL(options.requestUrl).search;\n\n const fetchImpl = options.fetchImpl ?? fetch;\n const response = await fetchImpl(target, {\n method: options.method,\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n },\n body: options.method === \"GET\" || options.method === \"HEAD\" ? undefined : options.body,\n });\n\n const headers = new Headers(response.headers);\n headers.delete(\"content-encoding\");\n headers.delete(\"transfer-encoding\");\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n","import {\n runWithProjectDatabase,\n runWithProjectScope,\n runWithTenantScope,\n} from \"@keystrokehq/database\";\nimport {\n resolveOrgDatabaseUrl,\n runWithOrganizationScope,\n selectOrganizationById,\n selectProjectById,\n} from \"@keystrokehq/platform-database\";\n\nexport async function withProjectScope<T>(\n projectId: string,\n fn: (ctx: { organizationId: string; projectId: string }) => Promise<T>,\n): Promise<T | undefined> {\n const project = await selectProjectById(projectId);\n if (!project) {\n return undefined;\n }\n\n const organization = await selectOrganizationById(project.organizationId);\n if (!organization) {\n return undefined;\n }\n\n const url = resolveOrgDatabaseUrl(organization);\n let result: T | undefined;\n\n await runWithOrganizationScope(project.organizationId, () =>\n runWithProjectDatabase({ url, searchPath: organization.dbSchema }, () =>\n runWithProjectScope(project.id, () =>\n runWithTenantScope(project.organizationId, async () => {\n result = await fn({\n organizationId: project.organizationId,\n projectId: project.id,\n });\n }),\n ),\n ),\n );\n\n return result;\n}\n","import { Hono } from \"hono\";\nimport { ensureWebhookApiKeyForRoute } from \"@keystrokehq/platform-database\";\nimport {\n buildWebhookUrl,\n createCredentialMaterializeHandler,\n createOAuthTokenRefreshRegistry,\n} from \"@keystrokehq/runtime\";\nimport { z } from \"zod\";\n\nimport type { LlmProxyPlugin } from \"../../llm-proxy-plugin\";\nimport type { SandboxProxyPlugin } from \"../../sandbox-proxy-plugin\";\nimport type { McpProviderPlugin } from \"@keystrokehq/http\";\nimport { externalPlatformOrigin, platformWebhookOrigin } from \"@keystrokehq/http\";\nimport { requireWorkerToken } from \"../../middleware/require-worker-token\";\nimport { proxyExaWebSearchRequest } from \"./web-search-proxy\";\nimport { withProjectScope } from \"./with-project-scope\";\n\nconst EnsureWebhookRouteBodySchema = z.object({\n route: z.string().trim().min(1),\n attachmentKeys: z.array(z.string().trim().min(1)).min(1),\n});\n\nconst SandboxSessionBodySchema = z.object({\n agentId: z.string().trim().min(1),\n sessionId: z.string().trim().min(1),\n});\n\nconst SandboxExecBodySchema = SandboxSessionBodySchema.extend({\n script: z.string(),\n options: z\n .object({\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n stdin: z.string().optional(),\n })\n .optional(),\n});\n\nconst SandboxReadBodySchema = SandboxSessionBodySchema.extend({\n path: z.string().trim().min(1),\n});\n\nconst SandboxWriteBodySchema = SandboxSessionBodySchema.extend({\n path: z.string().trim().min(1),\n content: z.string(),\n});\n\nexport function mountInternalRoutes(\n workerToken: string | undefined,\n tokenRefresh: ReturnType<typeof createOAuthTokenRefreshRegistry>,\n llmProxy?: LlmProxyPlugin,\n sandboxProxy?: SandboxProxyPlugin,\n mcp?: McpProviderPlugin,\n): Hono {\n const internal = new Hono();\n const protect = requireWorkerToken(workerToken);\n const materialize = createCredentialMaterializeHandler(tokenRefresh);\n\n internal.use(\"/*\", protect);\n\n mcp?.mountInternalRoutes?.(internal, { withProjectScope });\n\n internal.post(\"/projects/:projectId/credentials/materialize\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const response = await withProjectScope(projectId, async () => materialize(c));\n\n if (response === undefined) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n return (\n response ??\n c.json({ error: \"internal_error\", message: \"Failed to materialize credential.\" }, 500)\n );\n });\n\n internal.all(\"/projects/:projectId/web-search/:path{.+}\", async (c) => {\n const body =\n c.req.method === \"GET\" || c.req.method === \"HEAD\" ? undefined : await c.req.arrayBuffer();\n\n return proxyExaWebSearchRequest({\n apiKey: process.env.EXA_API_KEY,\n method: c.req.method,\n path: c.req.param(\"path\"),\n requestUrl: c.req.url,\n body,\n });\n });\n\n if (llmProxy) {\n internal.all(\"/projects/:projectId/llm/:path{.+}\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const response = await withProjectScope(projectId, async (ctx) =>\n llmProxy.handler(c, {\n organizationId: ctx.organizationId,\n projectId: ctx.projectId,\n pathSuffix: `/${c.req.param(\"path\")}`,\n }),\n );\n\n if (response === undefined) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n return (\n response ??\n c.json({ error: \"internal_error\", message: \"Failed to proxy LLM request.\" }, 500)\n );\n });\n }\n\n if (sandboxProxy) {\n internal.post(\"/projects/:projectId/sandbox/create\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const parsed = SandboxSessionBodySchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\", details: parsed.error.flatten() }, 400);\n }\n\n const result = await withProjectScope(projectId, async (ctx) =>\n sandboxProxy.create({ ...ctx, ...parsed.data }),\n );\n\n if (result === undefined) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n return c.json(result);\n });\n\n internal.post(\"/projects/:projectId/sandbox/exec\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const parsed = SandboxExecBodySchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\", details: parsed.error.flatten() }, 400);\n }\n\n const { script, options, ...session } = parsed.data;\n const result = await withProjectScope(projectId, async (ctx) =>\n sandboxProxy.exec({ ...ctx, ...session }, script, options),\n );\n\n if (result === undefined) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n return c.json(result);\n });\n\n internal.post(\"/projects/:projectId/sandbox/read\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const parsed = SandboxReadBodySchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\", details: parsed.error.flatten() }, 400);\n }\n\n const { path, ...session } = parsed.data;\n const content = await withProjectScope(projectId, async (ctx) =>\n sandboxProxy.readFile({ ...ctx, ...session }, path),\n );\n\n if (content === undefined) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n return c.json({ content });\n });\n\n internal.post(\"/projects/:projectId/sandbox/write\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const parsed = SandboxWriteBodySchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\", details: parsed.error.flatten() }, 400);\n }\n\n const { path, content, ...session } = parsed.data;\n const wrote = await withProjectScope(projectId, async (ctx) => {\n await sandboxProxy.writeFile({ ...ctx, ...session }, path, content);\n return true;\n });\n\n if (wrote === undefined) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n return c.json({});\n });\n\n internal.post(\"/projects/:projectId/sandbox/dispose\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const parsed = SandboxSessionBodySchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\", details: parsed.error.flatten() }, 400);\n }\n\n const disposed = await withProjectScope(projectId, async (ctx) => {\n await sandboxProxy.dispose({ ...ctx, ...parsed.data });\n return true;\n });\n\n if (disposed === undefined) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n return c.json({});\n });\n }\n\n internal.post(\"/projects/:projectId/webhooks/ensure\", async (c) => {\n const projectId = c.req.param(\"projectId\");\n const project = await withProjectScope(projectId, async (ctx) => ctx);\n if (!project) {\n return c.json({ error: \"Project not found\" }, 404);\n }\n\n const parsed = EnsureWebhookRouteBodySchema.safeParse(await c.req.json().catch(() => null));\n if (!parsed.success) {\n return c.json({ error: \"Invalid request body\", details: parsed.error.flatten() }, 400);\n }\n\n const origin = platformWebhookOrigin(projectId, externalPlatformOrigin());\n if (!origin) {\n return c.json({ error: \"PUBLIC_PLATFORM_URL is not configured\" }, 500);\n }\n\n try {\n const token = await ensureWebhookApiKeyForRoute(\n projectId,\n parsed.data.route,\n parsed.data.attachmentKeys,\n );\n\n return c.json({\n webhookUrl: buildWebhookUrl(origin, parsed.data.route, token),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to ensure webhook API key.\";\n return c.json({ error: \"webhook_provisioning_failed\", message }, 500);\n }\n });\n\n return internal;\n}\n","import type { Auth } from \"@keystrokehq/auth\";\nimport {\n createApp as createHttpApp,\n type CreateAppOptions as HttpCreateAppOptions,\n} from \"@keystrokehq/http\";\nimport type { Hono } from \"hono\";\n\nimport { mountAuth } from \"./auth/mount\";\nimport type { SessionVariables } from \"@keystrokehq/http/auth\";\nimport type { PlatformConfig } from \"./config\";\nimport { mountAccountRoutes } from \"./routes/account/mount\";\nimport { mountInternalRoutes } from \"./routes/internal/mount\";\n\nexport type CreateAppOptions = {\n /** Browser origin allowed for credentialed cross-origin requests (e.g. http://localhost:3000). */\n webOrigin?: string;\n hosting: PlatformConfig[\"hosting\"];\n storage: PlatformConfig[\"storage\"];\n scheduler: PlatformConfig[\"scheduler\"];\n llmProxy?: PlatformConfig[\"llmProxy\"];\n sandboxProxy?: PlatformConfig[\"sandboxProxy\"];\n mcp?: PlatformConfig[\"mcp\"];\n};\n\nexport async function createApp(\n auth: Auth,\n options: CreateAppOptions,\n): Promise<Hono<{ Variables: SessionVariables }>> {\n const httpOptions: HttpCreateAppOptions = {\n mode: \"platform\",\n webOrigin: options.webOrigin,\n schedulerPlugin: options.scheduler,\n mcp: options.mcp,\n auth,\n mountAuth: (app, authInstance) => {\n mountAuth(app, authInstance);\n },\n mountAccount: async (app) => {\n app.route(\n \"/api\",\n mountAccountRoutes({\n hosting: options.hosting,\n storage: options.storage,\n mcp: options.mcp,\n }),\n );\n },\n mountInternal: (app, { tokenRefresh }) => {\n app.route(\n \"/internal\",\n mountInternalRoutes(\n options.hosting.workerRuntime.workerToken,\n tokenRefresh,\n options.llmProxy,\n options.sandboxProxy,\n options.mcp,\n ),\n );\n },\n };\n\n return createHttpApp(httpOptions);\n}\n","import { serve } from \"@hono/node-server\";\nimport { createAuth } from \"@keystrokehq/auth\";\nimport { listenPortFromPublicUrl } from \"@keystrokehq/shared\";\nimport {\n ensureProjectPgBossGrants,\n initDatabase,\n resolveOrgRuntimeDatabase,\n selectOrganizationById,\n orgWorkspacesRuntimeEnv,\n} from \"@keystrokehq/platform-database\";\nimport { ensureKeystrokeAssetsBucket } from \"@keystrokehq/storage\";\nimport { seedOAuthAppsFromEnvForAllOrganizations } from \"@keystrokehq/runtime\";\nimport type { PlatformConfig } from \"./config\";\nimport { startProjectRuntimeWorker, configureProjectRuntimeScheduler } from \"@keystrokehq/projects\";\nimport type { Hono } from \"hono\";\n\nimport { createApp } from \"./app\";\nimport type { SessionVariables } from \"@keystrokehq/http/auth\";\n\nexport type StartPlatformServerHooks = {\n afterCreateApp?: (app: Hono<{ Variables: SessionVariables }>) => void | Promise<void>;\n};\n\n/** Fly `internal_port` — not the public HTTPS URL port. */\nconst PRODUCTION_PLATFORM_LISTEN_PORT = 8080;\nconst LOCAL_PLATFORM_PORT = 3002;\n\nfunction resolvePlatformListenPort(): number {\n if (process.env.NODE_ENV === \"production\") {\n return PRODUCTION_PLATFORM_LISTEN_PORT;\n }\n\n return listenPortFromPublicUrl(process.env.PUBLIC_PLATFORM_URL, LOCAL_PLATFORM_PORT);\n}\n\nfunction usesPgBossScheduler(platformConfig: PlatformConfig): boolean {\n return platformConfig.scheduler.name === \"pg-boss\" || platformConfig.scheduler.name === \"default\";\n}\n\nexport async function startPlatformServer(\n platformConfig: PlatformConfig,\n hooks: StartPlatformServerHooks = {},\n): Promise<void> {\n const runtime = platformConfig.hosting.createRuntime();\n\n await initDatabase();\n await ensureKeystrokeAssetsBucket();\n await seedOAuthAppsFromEnvForAllOrganizations();\n\n if (usesPgBossScheduler(platformConfig)) {\n await ensureProjectPgBossGrants();\n }\n\n configureProjectRuntimeScheduler(platformConfig.scheduler);\n await startProjectRuntimeWorker(runtime, {\n resolveStartInput: async (job) => {\n const organization = await selectOrganizationById(job.organizationId);\n if (!organization) {\n throw new Error(`Organization ${job.organizationId} not found`);\n }\n\n const database = await resolveOrgRuntimeDatabase(job.organizationId);\n const workerRuntime = platformConfig.hosting.workerRuntime;\n\n return {\n organizationId: job.organizationId,\n projects: [],\n database: {\n ...database,\n organizationId: job.organizationId,\n },\n env: {\n ...orgWorkspacesRuntimeEnv(organization, { containerEnv: process.env }),\n ...platformConfig.llmProxy?.workerEnv({\n platformUrl: workerRuntime.platformUrl,\n workerToken: workerRuntime.workerToken,\n }),\n ...platformConfig.sandboxProxy?.workerEnv({\n platformUrl: workerRuntime.platformUrl,\n workerToken: workerRuntime.workerToken,\n }),\n ...platformConfig.workerEnv?.({\n platformUrl: workerRuntime.platformUrl,\n workerToken: workerRuntime.workerToken,\n }),\n },\n hosting: organization.hostingAppName ? { appName: organization.hostingAppName } : undefined,\n previousRuntimeId: organization.runtimeId,\n };\n },\n });\n\n const webUrl = process.env.PUBLIC_WEB_URL;\n if (!webUrl) {\n throw new Error(\"PUBLIC_WEB_URL is required for the platform server\");\n }\n\n const platformUrl = process.env.PUBLIC_PLATFORM_URL?.replace(/\\/+$/, \"\");\n if (!platformUrl) {\n throw new Error(\"PUBLIC_PLATFORM_URL is required for the platform server\");\n }\n\n const auth = createAuth({\n baseURL: platformUrl,\n verificationUri: `${webUrl.replace(/\\/+$/, \"\")}/device`,\n trustedOrigins: [webUrl],\n });\n if (!auth) {\n throw new Error(\"BETTER_AUTH_SECRET is required for the platform server\");\n }\n\n const app = await createApp(auth, {\n webOrigin: webUrl,\n hosting: platformConfig.hosting,\n storage: platformConfig.storage,\n scheduler: platformConfig.scheduler,\n llmProxy: platformConfig.llmProxy,\n sandboxProxy: platformConfig.sandboxProxy,\n mcp: platformConfig.mcp,\n });\n await hooks.afterCreateApp?.(app);\n const port = resolvePlatformListenPort();\n\n serve({ fetch: app.fetch, port }, (info) => {\n console.log(`Platform API listening on http://localhost:${info.port}`);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,SAAS,yBAAyB,UAAU;CAC3C,OAAO,SAAS,QAAQ,cAAc,EAAE,EAAE,QAAQ,gBAAgB,EAAE;AACrE;AAaA,SAAS,yBAAyB,UAAU;CAC3C,MAAM,aAAa,yBAAyB,QAAQ;CACpD,IAAI,CAAC,YAAY,MAAM,IAAI,MAAM,oCAAoC;CACrE,OAAO,aAAa;AACrB;AAuNA,MAAM,WAAW,OAAO,IAAI,oBAAoB;AAChD,SAAS,mBAAmB,OAAO;CAClC,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,IAAI,EAAE,YAAY,UAAU,MAAM,cAAc,MAAM,OAAO;CAC7D,MAAM,WAAW;CACjB,OAAO,OAAO,SAAS,SAAS,YAAY,SAAS,KAAK,KAAK,EAAE,SAAS,KAAK,SAAS,iBAAiB,UAAU,eAAe,SAAS,SAAS,SAAS,kBAAkB,UAAU,eAAe,SAAS;AAClN;AAQA,MAAM,YAAY,EAAE,QAAQ,UAAU,iBAAiB,EAAE,SAAS,sBAAsB;AACxF,MAAM,qBAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,0CAA0C;AAC9F,MAAM,iBAAiB,EAAE,QAAQ,UAAU,mBAAmB,KAAK,GAAG,6BAA6B;AACnG,MAAM,cAAc,EAAE,QAAQ,UAAU,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO,MAAM,WAAW,YAAY,0BAA0B;AACvN,MAAM,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,SAAS,CAAC,CAAC;AACvD,MAAM,kBAAkB;CACvB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;CAC5B,QAAQ,EAAE,SAAS;AACpB;AACA,MAAM,sBAAsB,EAAE,OAAO;CACpC,MAAM,EAAE,QAAQ,SAAS;CACzB,GAAG;CACH,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;CAC1B,SAAS;CACT,QAAQ,UAAU,SAAS;CAC3B,QAAQ,EAAE,SAAS;AACpB,CAAC;AACD,MAAM,mBAAmB,EAAE,OAAO;CACjC,MAAM,EAAE,QAAQ,MAAM;CACtB,GAAG;CACH,UAAU;AACX,CAAC;AACD,MAAM,mBAAmB,EAAE,OAAO;CACjC,MAAM,EAAE,QAAQ,MAAM;CACtB,GAAG;CACH,IAAI,EAAE,OAAO,EAAE,SAAS;CACxB,UAAU;CACV,KAAK,EAAE,SAAS;CAChB,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC;CAC7B,QAAQ,EAAE,SAAS;AACpB,CAAC;AACD,MAAM,sBAAsB,EAAE,mBAAmB,QAAQ;CACxD;CACA;CACA;AACD,CAAC;AACD,MAAM,2BAA2B,EAAE,OAAO;CACzC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;CAC5B,QAAQ;CACR,QAAQ,EAAE,QAAQ,UAAU;CAC5B,UAAU;CACV,WAAW,EAAE,SAAS,EAAE,SAAS;AAClC,CAAC;AACD,MAAM,wBAAwB,EAAE,OAAO;CACtC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;CAC5B,QAAQ;CACR,QAAQ,EAAE,QAAQ,OAAO;CACzB,OAAO;CACP,QAAQ;AACT,CAAC;AACmC,EAAE,mBAAmB,UAAU,CAAC,0BAA0B,qBAAqB,CAAC;;;ACtPpH,eAAe,sBAAsB,OAAO;CAC3C,IAAI,MAAM,oBAAoB,MAAM,OAAO,yBAAyB,MAAM,gBAAgB;CAC1F,OAAO,yBAAyB,iCAAiC,MAAM,aAAa,CAAC;AACtF;;AAEA,eAAe,qBAAqB,OAAO;CAC1C,MAAM,UAAU,MAAM,kBAAkB,MAAM,SAAS;CACvD,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,WAAW,MAAM,UAAU,WAAW;CACpE,MAAM,WAAW,MAAM,0BAA0B,MAAM,UAAU;CACjE,IAAI,CAAC,YAAY,SAAS,cAAc,MAAM,WAAW,MAAM,IAAI,MAAM,YAAY,MAAM,WAAW,yBAAyB,MAAM,WAAW;CAChJ,MAAM,eAAe,MAAM,uBAAuB,QAAQ,cAAc;CACxE,IAAI,CAAC,cAAc,MAAM,IAAI,MAAM,sCAAsC,MAAM,WAAW;CAC1F,IAAI,CAAC,MAAM,iBAAiB,SAAS,gBAAgB,MAAM,MAAM,IAAI,2BAA2B,6DAA6D;CAC7J,MAAM,WAAW,MAAM,sBAAsB;EAC5C,YAAY,MAAM;EAClB,kBAAkB,SAAS;EAC3B,eAAe,MAAM,iBAAiB,OAAO,MAAM,CAAC;CACrD,CAAC;CACD,IAAI,SAAS,gBAAgB,MAAM,MAAM,8BAA8B;EACtE,YAAY,MAAM;EAClB,cAAc;CACf,CAAC;CACD,IAAI,QAAQ,sBAAsB,MAAM,YAAY,MAAM,uBAAuB;EAChF,WAAW,MAAM;EACjB,YAAY,MAAM;CACnB,CAAC;MACI,IAAI,QAAQ,qBAAqB,MAAM,YAAY,MAAM,IAAI,MAAM,YAAY,MAAM,WAAW,yCAAyC,MAAM,WAAW;CAC/J,MAAM,kBAAkB,CAAC;CACzB,MAAM,uBAAuB;EAC5B,KAAK,sBAAsB,YAAY;EACvC,YAAY,aAAa;CAC1B,GAAG,YAAY,oBAAoB,QAAQ,IAAI,YAAY;EAC1D,MAAM,+BAA+B,QAAQ;EAC7C,MAAM,0BAA0B,IAAI,IAAI;EACxC,KAAK,MAAM,OAAO,MAAM,kCAAkC,GAAG;GAC5D,IAAI,IAAI,OAAO,SAAS,WAAW;GACnC,MAAM,QAAQ,yBAAyB,IAAI,OAAO,QAAQ;GAC1D,QAAQ,IAAI,OAAO,CAAC,GAAG,QAAQ,IAAI,KAAK,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;EAC3D;EACA,KAAK,MAAM,CAAC,OAAO,mBAAmB,SAAS,gBAAgB,KAAK;GACnE;GACA;EACD,CAAC;CACF,CAAC,CAAC;CACF,MAAM,gBAAgB,CAAC,GAAG,iCAAiC,QAAQ,GAAG,GAAG,eAAe;CACxF,IAAI,cAAc,SAAS,GAAG,MAAM,qBAAqB,QAAQ,IAAI,eAAe,QAAQ,EAAE;AAC/F;;AAIA,SAAS,4BAA4B,SAAS;CAC7C,IAAI,QAAQ,WAAW,cAAc,QAAQ,mBAAmB,OAAO;CACvE,IAAI,QAAQ,qBAAqB,QAAQ,qBAAqB,QAAQ,mBAAmB,OAAO;CAChG,OAAO;AACR;AACA,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,SAAS,iCAAiC,QAAQ;CACjD,yBAAyB;CACzB,eAAe,KAAK;CACpB,mBAAmB,KAAK;AACzB;AACA,eAAe,qBAAqB;CACnC,IAAI,cAAc,OAAO;CACzB,IAAI,CAAC,kBAAkB,oBAAoB,YAAY;EACtD,MAAM,QAAQ,MAAM,eAAe;GAClC,OAAO;GACP,QAAQ,0BAA0B,uBAAuB;EAC1D,CAAC;EACD,eAAe;EACf,OAAO;CACR,GAAG;CACH,OAAO;AACR;AACA,SAAS,gBAAgB,SAAS;CACjC,MAAM,MAAM,QAAQ;CACpB,IAAI,CAAC,KAAK,gBAAgB,MAAM,IAAI,MAAM,iCAAiC;CAC3E,OAAO;EACN,gBAAgB,IAAI;EACpB,kBAAkB,IAAI;EACtB,mBAAmB,IAAI;CACxB;AACD;AACA,eAAe,mBAAmB,KAAK;CACtC,MAAM,WAAW,MAAM,+BAA+B,IAAI,cAAc;CACxE,MAAM,UAAU,CAAC;CACjB,KAAK,MAAM,WAAW,UAAU;EAC/B,MAAM,aAAa,QAAQ,OAAO,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,QAAQ,qBAAqB,QAAQ;EAC/I,IAAI,CAAC,YAAY;EACjB,MAAM,WAAW,MAAM,0BAA0B,UAAU;EAC3D,IAAI,CAAC,YAAY,SAAS,cAAc,QAAQ,MAAM,SAAS,WAAW,SAAS;GAClF,IAAI,QAAQ,OAAO,IAAI,kBAAkB,MAAM,IAAI,MAAM,WAAW,QAAQ,GAAG,+BAA+B;GAC9G;EACD;EACA,QAAQ,KAAK;GACZ,WAAW,QAAQ;GACnB,MAAM,QAAQ;GACd;GACA,oBAAoB,SAAS;EAC9B,CAAC;CACF;CACA,IAAI,QAAQ,WAAW,GAAG,MAAM,IAAI,MAAM,gBAAgB,IAAI,eAAe,4BAA4B;CACzG,OAAO;AACR;AACA,eAAe,wBAAwB,gBAAgB;CACtD,QAAQ,MAAM,+BAA+B,cAAc,GAAG,KAAK,2BAA2B;AAC/F;AACA,eAAe,kBAAkB,KAAK;CACrC,QAAQ,MAAM,mBAAmB,GAAG,QAAQ;EAC3C,MAAM;EACN,UAAU,IAAI;EACd,OAAO,OAAO,WAAW;EACzB,SAAS;EACT,SAAS;EACT,aAAa;EACb,WAAW,IAAI;CAChB,CAAC;AACF;AACA,eAAe,sBAAsB,KAAK;CACzC,MAAM,UAAU,MAAM,kBAAkB,IAAI,SAAS;CACrD,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,WAAW,IAAI,UAAU,WAAW;CAClE,OAAO,kBAAkB;EACxB,gBAAgB,QAAQ;EACxB,kBAAkB,IAAI;EACtB,mBAAmB,IAAI;CACxB,CAAC;AACF;AACA,eAAe,kBAAkB,SAAS,OAAO,WAAW;CAC3D,IAAI,CAAC,QAAQ,SAAS;CACtB,IAAI;EACH,MAAM,QAAQ,QAAQ;GACrB;GACA,SAAS,MAAM;EAChB,CAAC;CACF,SAAS,cAAc;EACtB,QAAQ,MAAM,2CAA2C,aAAa,YAAY;CACnF;AACD;AACA,eAAe,oBAAoB,SAAS,mBAAmB,SAAS;CACvE,IAAI,QAAQ,SAAS,WAAW;CAChC,MAAM,MAAM,gBAAgB,OAAO;CACnC,IAAI;EACH,MAAM,eAAe,MAAM,uBAAuB,IAAI,cAAc;EACpE,IAAI,CAAC,cAAc,MAAM,IAAI,MAAM,gBAAgB,IAAI,eAAe,WAAW;EACjF,MAAM,WAAW,MAAM,mBAAmB,GAAG;EAC7C,MAAM,QAAQ,MAAM,kBAAkB,GAAG;EACzC,MAAM,cAAc;GACnB,GAAG;GACH,gBAAgB,IAAI;GACpB;GACA,mBAAmB,MAAM,qBAAqB,aAAa;EAC5D;EACA,IAAI;EACJ,IAAI;GACH,SAAS,MAAM,QAAQ,MAAM,WAAW;GACxC,KAAK,MAAM,WAAW,UAAU;IAC/B,MAAM,qBAAqB;KAC1B,WAAW,QAAQ;KACnB,YAAY,QAAQ;KACpB,SAAS,OAAO;IACjB,CAAC;IACD,MAAM,oBAAoB,QAAQ,WAAW;KAC5C,SAAS,OAAO;KAChB,WAAW,OAAO;IACnB,CAAC;GACF;GACA,MAAM,yBAAyB,IAAI,gBAAgB;IAClD,SAAS,OAAO;IAChB,WAAW,OAAO;GACnB,CAAC;GACD,IAAI,YAAY,mBAAmB,MAAM,kBAAkB,SAAS,aAAa,YAAY,iBAAiB;GAC9G,IAAI,MAAM,wBAAwB,IAAI,cAAc,GAAG,MAAM,kBAAkB,EAAE,gBAAgB,IAAI,eAAe,CAAC;EACtH,SAAS,OAAO;GACf,IAAI,QAAQ,MAAM,kBAAkB,SAAS,aAAa,OAAO,SAAS;GAC1E,MAAM;EACP;CACD,SAAS,OAAO;EACf,QAAQ,MAAM,iBAAiB,IAAI,eAAe,UAAU,KAAK;EACjE,IAAI,QAAQ,kBAAkB,MAAM,yBAAyB,IAAI,gBAAgB,kCAAkC;EACnH,MAAM;CACP;AACD;AACA,eAAe,0BAA0B,SAAS,UAAU,CAAC,GAAG;CAC/D,MAAM,QAAQ,MAAM,mBAAmB;CACvC,MAAM,oBAAoB,QAAQ,sBAAsB,OAAO,QAAQ;EACtE,MAAM,IAAI,MAAM,mBAAmB,IAAI,eAAe,sDAAsD;CAC7G;CACA,MAAM,MAAM,YAAY,OAAO,YAAY;EAC1C,MAAM,oBAAoB,SAAS,mBAAmB,OAAO;CAC9D,CAAC;AACF;;;ACnQA,SAAgB,UAAyB,KAAc,MAAkB;CACvE,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,gBAAgB,MAAM,kBAAkB,MAAM,EAAE,IAAI,GAAG,CAAC;AAClF;;;ACJA,MAAM,iBAAiB;CACtB,MAAM;CACN,QAAQ;AACT;AACA,MAAM,gBAAgB,OAAO,OAAO,cAAc;AAClD,MAAM,oBAAoB;CACzB,OAAO,CAAC,eAAe,MAAM,eAAe,MAAM;CAClD,OAAO,CAAC,eAAe,MAAM,eAAe,MAAM;CAClD,SAAS,CAAC,eAAe,MAAM;AAChC;AAGA,MAAM,sBAAsB;CAC3B,QAAQ;CACR,QAAQ;AACT;AACA,MAAM,qBAAqB,OAAO,OAAO,mBAAmB;AAC5D,MAAM,yBAAyB;CAC9B,OAAO,CAAC,oBAAoB,QAAQ,oBAAoB,MAAM;CAC9D,OAAO,CAAC,oBAAoB,MAAM;CAClC,SAAS,CAAC;AACX;AAGA,MAAM,cAAc;CACnB,QAAQ;CACR,QAAQ;AACT;AACA,MAAM,aAAa,OAAO,OAAO,WAAW;AAC5C,MAAM,iBAAiB;CACtB,OAAO,CAAC,YAAY,QAAQ,YAAY,MAAM;CAC9C,OAAO,CAAC,YAAY,QAAQ,YAAY,MAAM;CAC9C,SAAS,CAAC,YAAY,MAAM;AAC7B;;AAEA,MAAM,uBAAuB;CAC5B,OAAO,CAAC,SAAS,SAAS;CAC1B,OAAO,CAAC,SAAS,SAAS;CAC1B,SAAS,CAAC,SAAS;AACpB;AACA,SAAS,cAAc,SAAS,SAAS;CACxC,OAAO,qBAAqB,SAAS,SAAS,OAAO;AACtD;AAGA,SAAS,gBAAgB,MAAM;CAC9B,OAAO;EACN,GAAG,uBAAuB;EAC1B,GAAG,eAAe;EAClB,GAAG,kBAAkB;CACtB;AACD;AACA,MAAM,qBAAqB;CAC1B,OAAO,gBAAgB,OAAO;CAC9B,OAAO,gBAAgB,OAAO;CAC9B,SAAS,gBAAgB,SAAS;AACnC;AAGA,MAAM,iBAAiB;CACtB,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,eAAe;CACf,QAAQ;AACT;AACA,MAAM,gBAAgB,OAAO,OAAO,cAAc;AAClD,MAAM,oBAAoB;CACzB,OAAO,OAAO,OAAO,cAAc;CACnC,SAAS,CAAC,eAAe,MAAM,eAAe,MAAM;AACrD;AAGA,MAAM,gBAAgB,IAAI,IAAI,CAAC,SAAS,OAAO,CAAC;AAChD,MAAM,mBAAmB,IAAI,IAAI,aAAa;AAC9C,SAAS,gBAAgB,QAAQ;CAChC,OAAO,iBAAiB,IAAI,MAAM;AACnC;AACA,SAAS,gBAAgB,QAAQ,KAAK;CACrC,IAAI,gBAAgB,MAAM,GAAG;EAC5B,IAAI,cAAc,IAAI,IAAI,OAAO,GAAG,OAAO;EAC3C,OAAO,IAAI,eAAe,QAAQ,kBAAkB,IAAI,aAAa,SAAS,MAAM;CACrF;CACA,OAAO,mBAAmB,IAAI,SAAS,SAAS,MAAM;AACvD;AAGA,SAAS,iBAAiB,KAAK;CAC9B,OAAO,gBAAgB,eAAe,MAAM,GAAG,IAAI,EAAE,MAAM,MAAM,IAAI,EAAE,MAAM,cAAc;AAC5F;AACA,SAAS,eAAe,KAAK,eAAe;CAC3C,OAAO,gBAAgB,eAAe,MAAM,GAAG,KAAK;AACrD;AAGA,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AAGvB,SAAS,gBAAgB,KAAK,OAAO;CACpC,OAAO,MAAM,WAAW,MAAM,mBAAmB,gBAAgB,YAAY,QAAQ,GAAG;AACzF;AAGA,SAAS,gBAAgB,KAAK;CAC7B,OAAO,gBAAgB,eAAe,MAAM,GAAG,IAAI,EAAE,MAAM,MAAM,IAAI,EAAE,MAAM,eAAe;AAC7F;AACA,SAAS,cAAc,KAAK,OAAO;CAClC,OAAO,gBAAgB,eAAe,MAAM,GAAG,KAAK,MAAM,WAAW,MAAM;AAC5E;AAGgB;CACf,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACJ;AAcA,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAG5B,SAAS,mBAAmB,KAAK,UAAU,aAAa;CACvD,IAAI,EAAE,gBAAgB,eAAe,QAAQ,GAAG,KAAK,SAAS,qBAAqB,SAAS,IAAI,gBAAgB,YAAY,OAAO;CACnI,IAAI,gBAAgB,eAAe,eAAe,GAAG,GAAG,OAAO;CAC/D,OAAO,gBAAgB;AACxB;AAOA,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AAGvB,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;;;ACnJ1B,SAAgB,cAAc,GAA2B;CACvD,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,gBAAgB,EAAE,IAAI,eAAe;CAE3C,OAAO;EACL,SAAS,aAAa;EACtB,aAAa,eAAe;CAC9B;AACF;AAEA,SAAgB,2BAA2B,GAAqC;CAE9E,OADgB,EAAE,IAAI,SACT,EAAE;AACjB;;;ACdA,SAAS,4BAA4B,GAAG;CACvC,MAAM,SAAS,EAAE,IAAI,OAAO,iBAAiB,GAAG,KAAK;CACrD,IAAI,QAAQ,OAAO;CACnB,OAAO,EAAE,IAAI,YAAY,GAAG;AAC7B;AAGA,eAAe,2BAA2B,GAAG;CAC5C,MAAM,iBAAiB,4BAA4B,CAAC;CACpD,IAAI,CAAC,gBAAgB,OAAO;EAC3B,IAAI;EACJ,UAAU,EAAE,KAAK,oBAAoB,MAAM;GAC1C,OAAO;GACP,MAAM;EACP,CAAC,GAAG,GAAG;CACR;CACA,MAAM,aAAa,EAAE,IAAI,YAAY;CACrC,IAAI,cAAc,WAAW,mBAAmB,gBAAgB,OAAO;EACtE,IAAI;EACJ,UAAU,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,YAAY,CAAC,GAAG,GAAG;CACxE;CACA,MAAM,aAAa,MAAM,iCAAiC,EAAE,IAAI,MAAM,EAAE,IAAI,cAAc;CAC1F,IAAI,CAAC,YAAY,OAAO;EACvB,IAAI;EACJ,UAAU,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,YAAY,CAAC,GAAG,GAAG;CACxE;CACA,OAAO;EACN,IAAI;EACJ,cAAc;GACb,gBAAgB,WAAW,aAAa;GACxC,kBAAkB,WAAW,aAAa;GAC1C,MAAM,WAAW;EAClB;CACD;AACD;AACA,SAAS,sBAAsB;CAC9B,OAAO,OAAO,GAAG,SAAS;EACzB,MAAM,WAAW,MAAM,2BAA2B,CAAC;EACnD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS;EAClC,EAAE,IAAI,gBAAgB,SAAS,YAAY;EAC3C,MAAM,KAAK;CACZ;AACD;AAGA,SAAS,iBAAiB;CACzB,OAAO,OAAO,GAAG,SAAS;EACzB,MAAM,eAAe,EAAE,IAAI,cAAc;EACzC,MAAM,YAAY,EAAE,IAAI,MAAM,WAAW,GAAG,KAAK;EACjD,IAAI,CAAC,WAAW,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;EACjG,MAAM,CAAC,SAAS,mBAAmB,MAAM,QAAQ,IAAI,CAAC,6BAA6B,aAAa,gBAAgB,SAAS,GAAG,uBAAuB,aAAa,cAAc,CAAC,CAAC;EAChL,IAAI,CAAC,SAAS,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,oBAAoB,CAAC,GAAG,GAAG;EAC1F,IAAI,CAAC,iBAAiB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;EACvG,EAAE,IAAI,WAAW,OAAO;EACxB,MAAM,wBAAwB;GAC7B,gBAAgB,aAAa;GAC7B,MAAM,aAAa;GACnB,WAAW,QAAQ;GACnB,UAAU,gBAAgB;EAC3B,SAAS,KAAK,CAAC;CAChB;AACD;AACA,SAAS,aAAa,SAAS;CAC9B,OAAO,WAAW,OAAO;AAC1B;AAGA,SAAS,UAAU,GAAG;CACrB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,YAAY,CAAC,GAAG,GAAG;AACrE;AACA,SAAS,SAAS,GAAG,UAAU,aAAa;CAC3C,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,QAAQ,CAAC,GAAG,GAAG;AACjE;AAGA,SAAS,2BAA2B;CACnC,OAAO,OAAO,GAAG,SAAS;EACzB,MAAM,EAAE,MAAM,YAAY,EAAE,IAAI,cAAc;EAC9C,MAAM,UAAU,EAAE,IAAI,SAAS;EAC/B,IAAI,gBAAgB,eAAe,MAAM,EAAE,QAAQ,CAAC,GAAG;GACtD,MAAM,KAAK;GACX;EACD;EACA,MAAM,aAAa,MAAM,4BAA4B,EAAE,IAAI,MAAM,EAAE,IAAI,QAAQ,EAAE;EACjF,IAAI,CAAC,YAAY,OAAO,SAAS,GAAG,mBAAmB;EACvD,EAAE,IAAI,iBAAiB,EAAE,MAAM,WAAW,KAAK,CAAC;EAChD,MAAM,KAAK;CACZ;AACD;AAGA,SAAS,sBAAsB,MAAM,OAAO;CAC3C,OAAO;EACN,MAAM;GACL,IAAI,KAAK;GACT,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,OAAO,KAAK,SAAS;GACrB,eAAe,KAAK;GACpB,WAAW,KAAK;GAChB,WAAW,KAAK;EACjB;EACA,SAAS;GACR,IAAI,KAAK;GACT,QAAQ,KAAK;GACb;GACA,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,GAAG;GAC1C,2BAA2B,IAAI,KAAK;GACpC,2BAA2B,IAAI,KAAK;EACrC;CACD;AACD;AACA,SAAS,eAAe,aAAa;CACpC,MAAM,WAAW,eAAe,6BAA6B;CAC7D,OAAO,OAAO,GAAG,SAAS;EACzB,MAAM,SAAS,MAAM,mBAAmB,UAAU,EAAE,IAAI,IAAI,OAAO;EACnE,IAAI,QAAQ;GACX,EAAE,IAAI,QAAQ,OAAO,IAAI;GACzB,EAAE,IAAI,WAAW,OAAO,OAAO;GAC/B,MAAM,KAAK;GACX;EACD;EACA,MAAM,eAAe,gCAAgC,EAAE,IAAI,GAAG;EAC9D,IAAI,cAAc;GACjB,MAAM,WAAW,MAAM,8BAA8B,YAAY;GACjE,IAAI,UAAU;IACb,MAAM,OAAO,MAAM,0BAA0B,SAAS,MAAM;IAC5D,IAAI,MAAM;KACT,MAAM,UAAU,sBAAsB,MAAM,YAAY;KACxD,EAAE,IAAI,QAAQ,QAAQ,IAAI;KAC1B,EAAE,IAAI,WAAW,QAAQ,OAAO;KAChC,EAAE,IAAI,cAAc;MACnB,UAAU,SAAS;MACnB,gBAAgB,SAAS;KAC1B,CAAC;KACD,MAAM,KAAK;KACX;IACD;GACD;EACD;EACA,OAAO,EAAE,KAAK,EAAE,OAAO,eAAe,GAAG,GAAG;CAC7C;AACD;;;AC5IA,SAAgB,UAAU,QAAyE;CACjG,OAAO,OAAO,GAAG,SAAS;EACxB,IAAI,CAAC,gBAAgB,QAAQ,cAAc,CAAC,CAAC,GAC3C,OAAO,UAAU,CAAC;EAGpB,MAAM,KAAK;CACb;AACF;;;ACNA,SAAgB,iBACd,QACA,OACyD;CACzD,OAAO,OAAO,GAAG,SAAS;EACxB,MAAM,SAAS,OAAO,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;EAEpE,IAAI,OAAO,WAAW,CAAC,MAAM;GAAE;GAAG,KAAK,cAAc,CAAC;GAAG,MAAM,OAAO;EAAK,CAAC,GAC1E,OAAO,UAAU,CAAC;EAGpB,MAAM,KAAK;CACb;AACF;;;AChBA,SAAgB,2BAEb;CACD,OAAO,OAAO,GAAG,SAAS;EACxB,MAAM,iBAAiB,EAAE,IAAI,MAAM,gBAAgB,GAAG,KAAK;EAE3D,IAAI,CAAC,gBACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,8BAA8B,CAAC,GAAG,GAAG;EAIxF,MAAM,aAAa,MAAM,iCADZ,EAAE,IAAI,MAC0C,EAAE,IAAI,cAAc;EAEjF,IAAI,CAAC,YACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,YAAY,CAAC,GAAG,GAAG;EAGtE,EAAE,IAAI,gBAAgB;GACpB,gBAAgB,WAAW,aAAa;GACxC,kBAAkB,WAAW,aAAa;GAC1C,MAAM,WAAW;EACnB,CAAC;EAED,MAAM,KAAK;CACb;AACF;;;ACsBA,MAAM,yBAAyB,IAAI,kBAAkB;AACrD,SAAS,8BAA8B,IAAI;CAC1C,OAAO,uBAAuB,IAAI,CAAC,GAAG,EAAE;AACzC;AACA,SAAS,2BAA2B,MAAM;CACzC,MAAM,QAAQ,uBAAuB,SAAS;CAC9C,IAAI,CAAC,OAAO;CACZ,MAAM,KAAK,IAAI;AAChB;AACA,eAAe,8BAA8B;CAC5C,MAAM,QAAQ,uBAAuB,SAAS,KAAK,CAAC;CACpD,MAAM,QAAQ,WAAW,KAAK;AAC/B;;AAIA,SAAS,iCAAiC,cAAc;CACvD,MAAM,MAAM,sBAAsB,YAAY;CAC9C,IAAI,aAAa,GAAG,MAAM,YAAY,OAAO;EAC5C;EACA,YAAY,aAAa;CAC1B;CACA,OAAO,EAAE,IAAI;AACd;;AAIA,SAAS,kCAAkC;CAC1C,OAAO,OAAO,GAAG,SAAS;EACzB,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;EAC/C,MAAM,eAAe,MAAM,uBAAuB,cAAc;EAChE,IAAI,CAAC,cAAc,OAAO,EAAE,KAAK,EAAE,OAAO,yBAAyB,GAAG,GAAG;EACzE,MAAM,YAAY,iCAAiC,YAAY;EAC/D,MAAM,yBAAyB,sBAAsB,uBAAuB,iBAAiB,mBAAmB,sBAAsB,8BAA8B,YAAY;GAC/K,MAAM,KAAK;GACX,MAAM,4BAA4B;EACnC,CAAC,CAAC,CAAC,CAAC;CACL;AACD;;;ACtFA,MAAaA,aAA+B,OAAO,MAAM;CAEvD,MAAM,SAAS,MAAM,eADR,EAAE,IAAI,MACoB,EAAE,EAAE;CAC3C,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,iBAAiB,CAAC,GAAG,GAAG;CAG3E,OAAO,EAAE,KAAK,iBAAiB,MAAM,EAAE,KAAK,OAAO,SAAS,KAAK,CAAC,CAAC;AACrE;;;ACbA,MAAM,+BAA+B;CACnC,cAAc;CACd,aAAa;CACb,aAAa;CACb,cAAc;CACd,aAAa;AACf;AAIA,SAAgB,8BAA8B,aAAoC;CAEhF,OAAO,6BADY,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,YAAY,KAAK,OACS;AACjF;;;ACHA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,SAAS,+BAA+B,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;CAC5F,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,gCAAgC,CAAC,GAAG,GAAG;CAG1F,MAAM,YAAY,8BAA8B,OAAO,KAAK,WAAW;CACvE,IAAI,CAAC,WACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAInF,MAAM,aAAa,qBADN,EAAE,IAAI,MACwB,EAAE,IAAI,SAAS;CAE1D,MAAM,YAAY,MADF,0BACc,EAAE,WAAW;EACzC,KAAK;EACL,aAAa,OAAO,KAAK;CAC3B,CAAC;CAED,OAAO,EAAE,KACP,gCAAgC,MAAM;EACpC;EACA;CACF,CAAC,CACH;AACF;;;ACjCA,eAAsB,0BAA0B,OAK4B;CAC1E,IAAI,CAAC,MAAM,kBAAkB,MAAM,UAAU,GAC3C,OAAO;EAAE,IAAI;EAAO,OAAO;CAAsB;CAGnD,MAAM,OAAO,MAAM,MAAM,QAAQ,WAAW,MAAM,UAAU;CAC5D,IAAI,CAAC,QAAQ,KAAK,iBAAiB,GACjC,OAAO;EAAE,IAAI;EAAO,OAAO;CAAmB;CAGhD,OAAO;EAAE,IAAI;EAAM,WAAW,MAAM,eAAe,MAAM,UAAU;CAAE;AACvE;AAEA,eAAsB,yBAAyB,OAK7B;CAChB,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,iBAAiB,MAAM,GAAG,GACjD;CAGF,MAAM,MAAM,MAAM,iBAAiB,MAAM,GAAG;CAC5C,IAAI,CAAC,KACH;CAGF,MAAM,MAAM,QAAQ,aAAa,GAAG,EAAE,YAAY,KAAA,CAAS;AAC7D;;;ACpBA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,SAAS,sBAAsB,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;CACnF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,wBAAwB,CAAC,GAAG,GAAG;CAGlF,MAAM,OAAO,EAAE,IAAI,MAAM;CACzB,MAAM,SAAS,MAAM,eAAe,KAAK,EAAE;CAC3C,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,iBAAiB,CAAC,GAAG,GAAG;CAG3E,MAAM,UAAU,0BAA0B;CAC1C,MAAM,EAAE,eAAe,OAAO;CAE9B,IAAI,eAAe,MAAM;EACvB,MAAM,yBAAyB;GAC7B;GACA,KAAK,OAAO;GACZ,kBAAkB;GAClB,kBAAkB;EACpB,CAAC;EACD,MAAM,eAAe,KAAK,IAAI;GAAE,OAAO;GAAM,2BAAW,IAAI,KAAK;EAAE,CAAC;EACpE,OAAO,EAAE,KAAK,iBAAiB,MAAM,EAAE,KAAK,KAAK,CAAC,CAAC;CACrD;CAEA,MAAM,YAAY,MAAM,0BAA0B;EAChD;EACA;EACA,oBAAoB,QAAQ,uBAAuB,KAAK,KAAK,EAAE;EAC/D,gBAAgB;CAClB,CAAC;CAED,IAAI,CAAC,UAAU,IACb,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,UAAU,MAAM,CAAC,GAAG,GAAG;CAG1E,IAAI,OAAO,SAAS,OAAO,UAAU,UAAU,WAC7C,MAAM,yBAAyB;EAC7B;EACA,KAAK,OAAO;EACZ,kBAAkB;EAClB,kBAAkB;CACpB,CAAC;CAGH,MAAM,eAAe,KAAK,IAAI;EAAE,OAAO,UAAU;EAAW,2BAAW,IAAI,KAAK;CAAE,CAAC;CACnF,OAAO,EAAE,KAAK,iBAAiB,MAAM,EAAE,KAAK,UAAU,UAAU,CAAC,CAAC;AACpE;;;ACvDA,MAAaC,aAA+B,OAAO,MAAM;CAEvD,MAAM,SAAS,MAAM,eADR,EAAE,IAAI,MACoB,EAAE,EAAE;CAC3C,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,iBAAiB,CAAC,GAAG,GAAG;CAG3E,OAAO,EAAE,KAAK,sBAAsB,MAAM,yBAAyB,OAAO,WAAW,CAAC,CAAC;AACzF;;;ACNA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,SAAS,2BAA2B,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;CACxF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,6BAA6B,CAAC,GAAG,GAAG;CAGvF,MAAM,OAAO,EAAE,IAAI,MAAM;CACzB,MAAM,SAAS,MAAM,eAAe,KAAK,EAAE;CAC3C,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,iBAAiB,CAAC,GAAG,GAAG;CAI3E,MAAM,OAAO,qBADG,yBAAyB,OAAO,WACR,GAAG,OAAO,IAAI;CAEtD,MAAM,eAAe,KAAK,IAAI;EAC5B,aAAa;EACb,2BAAW,IAAI,KAAK;CACtB,CAAC;CAED,OAAO,EAAE,KAAK,sBAAsB,MAAM,IAAI,CAAC;AACjD;;;AC3BA,MAAaC,aAA+B,OAAO,MAAM;CAEvD,MAAM,cAAc,MAAM,wBADb,EAAE,IAAI,MACkC,EAAE,EAAE;CAEzD,OAAO,EAAE,KAAK,gCAAgC,MAAM,YAAY,IAAI,mBAAmB,CAAC,CAAC;AAC3F;;;ACOA,eAAsB,8BACpB,MACA,QACA,MACA,eACqC;CACrC,MAAM,EAAE,SAAS,YAAY;CAC7B,MAAM,WAAW,MAAM,+BAA+B,MAAM,aAAa;CACzE,IAAI;CACJ,IAAI;CACJ,IAAI,wBAAwB;CAE5B,IAAI;EACF,IAAI,QAAQ,uBAKV,iBAAgB,MAJK,QAAQ,sBAAsB;GACjD,gBAAgB,SAAS;GACzB,MAAM,KAAK,KAAK;EAClB,CAAC,GACsB;EAGzB,qBAAqB,MAAM,QAAQ,sBAAsB;GACvD,gBAAgB,SAAS;GACzB,MAAM,KAAK,KAAK;EAClB,CAAC;EAED,MAAM,aAAa,MAAM,0BAA0B,QAAQ,MAAM,eAAe;GAC9E,gBAAgB,SAAS;GACzB,MAAM,SAAS;GACf,gBAAgB,iBAAiB;GACjC,SAAS;IACP,QAAQ,mBAAmB;IAC3B,UAAU,mBAAmB;IAC7B,uBAAuBC,2BAAyB,mBAAmB,WAAW;IAC9E,2BAA2BA,2BAAyB,mBAAmB,eAAe;IACtF,QAAQ,mBAAmB,UAAU;IACrC,gBAAgB,mBAAmB,kBAAkB;GACvD;EACF,CAAC;EACD,wBAAwB;EACxB,MAAM,oCAAoC,SAAS,cAAc;EACjE,OAAO;CACT,SAAS,OAAO;EACd,IAAI,sBAAsB,CAAC;OAErB,CAAC,MADqB,iCAAiC,mBAAmB,MAAM,GAElF,MAAM,QAAQ,wBAAwB,kBAAkB,EAAE,YAAY,KAAA,CAAS;EAAA;EAGnF,IAAI,iBAAiB,QAAQ,yBAC3B,MAAM,QAAQ,wBAAwB,EAAE,SAAS,cAAc,CAAC,EAAE,YAAY,KAAA,CAAS;EAGzF,MAAM;CACR;AACF;;;ACnEA,SAAgB,0BAA0B,OAGxC;CACA,IAAI,iBAAiB,4BACnB,OAAO;EAAE,OAAO,MAAM;EAAS,MAAM;CAAa;CAGpD,MAAM,UAAU,MAAM,OAAO,IAAI,WAAW;CAC5C,OAAO;EACL,OAAO;EACP,MAAM,qCAAqC,OAAO;CACpD;AACF;;;ACFA,SAAgB,0BACd,MACqB;CACrB,OAAO,OAAO,MAAM;EAClB,MAAM,OAAO,EAAE,IAAI,MAAM;EACzB,MAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI;EAChD,MAAM,SAAS,gCAAgC,UAAU,IAAI;EAE7D,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,+BAA+B,CAAC,GAAG,GAAG;EAGzF,IAAI;GACF,MAAM,aAAa,MAAM,8BACvB,MACA,KAAK,IACL,OAAO,KAAK,MACZ,OAAO,KAAK,IACd;GAEA,OAAO,EAAE,KAAK,iCAAiC,MAAM,oBAAoB,UAAU,CAAC,GAAG,GAAG;EAC5F,SAAS,OAAO;GACd,IAAI,iBAAiBC,8BACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,0BAA0B,KAAK,CAAC,GAAG,GAAG;GAGhF,IAAI,iBAAiB,UACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,0BAA0B,KAAK,CAAC,GAAG,GAAG;GAGhF,MAAM;EACR;CACF;AACF;;;ACxCA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,SAAS,4BAA4B,UAAU;EACnD,MAAM,EAAE,IAAI,MAAM,MAAM;EACxB,uBAAuB,EAAE,IAAI,MAAM,uBAAuB;CAC5D,CAAC;CAED,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,qBAAqB,CAAC,GAAG,GAAG;CAG/E,MAAM,eAAe,MAAM,kCACzB,OAAO,KAAK,MACZ,OAAO,KAAK,qBACd;CAEA,OAAO,EAAE,KAAK,+BAA+B,MAAM,YAAY,CAAC;AAClE;;;ACpBA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAE/C,MAAM,aAAa,MAAM,iCADZ,EAAE,IAAI,MAC0C,EAAE,IAAI,cAAc;CAEjF,IAAI,CAAC,YACH,MAAM,IAAI,MAAM,sDAAsD,gBAAgB;CAGxF,OAAO,EAAE,KAAK,iCAAiC,MAAM,oBAAoB,UAAU,CAAC,CAAC;AACvF;;;ACGA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI;CAChD,MAAM,SAAS,gCAAgC,UAAU,IAAI;CAE7D,IAAI,CAAC,OAAO,SAAS;EACnB,MAAM,YAAY,OAAO,MAAM,OAAO,MAAM,UAAU,MAAM,KAAK,OAAO,MAAM,IAC1E,0BAA0B,OAAO,KAAK,IACtC,wBAAwB,OAAO,OAAO,6BAA6B;EAEvE,OAAO,EAAE,KAAK,oBAAoB,MAAM,SAAS,GAAG,GAAG;CACzD;CAEA,IAAI;EACF,IAAI;EAEJ,IAAI,OAAO,KAAK,SAAS,KAAA,GACvB,UAAU,MAAM,uBAAuB,aAAa,gBAAgB,OAAO,KAAK,IAAI;EAGtF,IAAI,OAAO,KAAK,SAAS,KAAA,GACvB,UAAU,MAAM,uBAAuB,aAAa,gBAAgB,OAAO,KAAK,IAAI;EAGtF,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,2CAA2C,aAAa,gBAAgB;EAG1F,OAAO,EAAE,KACP,iCAAiC,MAC/B,oBAAoB;GAClB,cAAc;GACd,MAAM,aAAa;EACrB,CAAC,CACH,CACF;CACF,SAAS,OAAO;EACd,IAAI,iBAAiB,4BACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,0BAA0B,KAAK,CAAC,GAAG,GAAG;EAGhF,IAAI,iBAAiB,UACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,0BAA0B,KAAK,CAAC,GAAG,GAAG;EAGhF,MAAM;CACR;AACF;;;ACzDA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,eAAe,MAAM,uBAAuB,cAAc;CAEhE,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,OAAO,EAAE,KACP,kCAAkC,MAAM,iCAAiC,YAAY,CAAC,CACxF;AACF;;;ACOA,MAAM,gBAAgB,CACpB;CACE,SAAS;CACT,iBAAiB;CACjB,UAAU;AACZ,GACA;CACE,SAAS;CACT,iBAAiB;CACjB,UAAU;AACZ,CACF;AAEA,eAAe,uBAAuB,OAK6C;CACjF,MAAM,UAAU,0BAA0B;CAE1C,IAAI,MAAM,eAAe,MAAM;EAC7B,MAAM,yBAAyB;GAC7B;GACA,KAAK,MAAM;GACX,kBAAkB;GAClB,kBAAkB;EACpB,CAAC;EACD,OAAO;GAAE,IAAI;GAAM,WAAW;EAAK;CACrC;CAEA,MAAM,YAAY,MAAM,0BAA0B;EAChD;EACA,YAAY,MAAM;EAClB,oBAAoB,QAAQ,oBAAoB,KAAK,MAAM,gBAAgB,MAAM,OAAO;EACxF,gBAAgB;CAClB,CAAC;CAED,IAAI,CAAC,UAAU,IACb,OAAO;CAGT,IAAI,MAAM,cAAc,MAAM,eAAe,UAAU,WACrD,MAAM,yBAAyB;EAC7B;EACA,KAAK,MAAM;EACX,kBAAkB;EAClB,kBAAkB;CACpB,CAAC;CAGH,OAAO;EAAE,IAAI;EAAM,WAAW,UAAU;CAAU;AACpD;AAEA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,SAAS,uCAAuC,UACpD,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CACrC;CACA,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,0BAA0B,CAAC,GAAG,GAAG;CAGpF,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,eAAe,MAAM,uBAAuB,cAAc;CAChE,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,MAAM,WAAmD;EACvD,mBAAmB,OAAO,KAAK;EAC/B,8BAA8B,OAAO,KAAK;EAC1C,cAAc,OAAO,KAAK;CAC5B;CAEA,KAAK,MAAM,EAAE,SAAS,iBAAiB,cAAc,eAAe;EAClE,MAAM,aAAa,OAAO,KAAK;EAC/B,IAAI,eAAe,KAAA,GACjB;EAGF,MAAM,SAAS,MAAM,uBAAuB;GAC1C;GACA;GACA;GACA,YAAY,aAAa;EAC3B,CAAC;EACD,IAAI,CAAC,OAAO,IACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,OAAO,MAAM,CAAC,GAAG,GAAG;EAEvE,SAAS,YAAY,OAAO;CAC9B;CAEA,MAAM,UAAU,MAAM,kCAAkC,gBAAgB,QAAQ;CAChF,OAAO,EAAE,KAAK,kCAAkC,MAAM,iCAAiC,OAAO,CAAC,CAAC;AAClG;;;AC9GA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,SAAS,4BAA4B,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;CACzF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,8BAA8B,CAAC,GAAG,GAAG;CAGxF,MAAM,YAAY,8BAA8B,OAAO,KAAK,WAAW;CACvE,IAAI,CAAC,WACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,aAAa,kBAAkB,gBAAgB,OAAO,KAAK,SAAS,SAAS;CAEnF,MAAM,YAAY,MADF,0BACc,EAAE,WAAW;EACzC,KAAK;EACL,aAAa,OAAO,KAAK;CAC3B,CAAC;CAED,OAAO,EAAE,KACP,6BAA6B,MAAM;EACjC;EACA;CACF,CAAC,CACH;AACF;;;ACvBA,SAAgB,mBAAmB,GAAiC;CAClE,OAAO,EAAE,IAAI,MAAM,OAAO,MAAM;AAClC;;AAGA,SAAgB,UAAU,GAAwB,YAAgD;CAChG,OAAO,mBAAmB,CAAC,IAAI,aAAa,EAAE,MAAM,cAAc;AACpE;AAEA,eAAsB,kBACpB,GACA,OAC+B;CAC/B,IAAI,MAAM,SAAS,OACjB;CAGF,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,OAAO,wBAAwB,gBAAgB,EAAE,IAAI,MAAM,EAAE,EAAE;AACjE;AAEA,eAAsB,sBACpB,GACA,OACA,WACyC;CACzC,MAAM,UAAU,MAAM,kBAAkB,GAAG,KAAK;CAChD,MAAM,YAAY,WAAW,KAAK,KAAK,KAAA;CAEvC,IAAI,WAAW;EACb,IAAI,YAAY,KAAA,KAAa,CAAC,QAAQ,SAAS,SAAS,GACtD,OAAO;EAET,OAAO,EAAE,YAAY,CAAC,SAAS,EAAE;CACnC;CAEA,IAAI,YAAY,KAAA,GACd,OAAO,CAAC;CAGV,IAAI,QAAQ,WAAW,GACrB,OAAO;CAGT,OAAO,EAAE,YAAY,QAAQ;AAC/B;AAEA,eAAsB,mBACpB,GACA,WACA,OACkB;CAClB,MAAM,MAAM,cAAc,CAAC;CAC3B,MAAM,UAAU,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,CAAC;CAEhE,OAAO,MAAM,KADS,YAAY,KAAA,IAAY,QAAQ,QAAQ,SAAS,SAAS,CACjD;AACjC;;;AChEA,eAAsB,uBACpB,aACiC;CACjC,IAAI,CAAC,aACH,OAAO;CAGT,MAAM,OAAO,MAAM,eAAe,WAAW;CAC7C,IAAI,CAAC,MACH,OAAO;CAGT,OAAO;EACL,QAAQ,KAAK;EACb,MAAM,KAAK;EACX,WAAW,KAAK,SAAS;CAC3B;AACF;AAEA,eAAsB,iBACpB,KACA,iBACqB;CACrB,MAAM,EAAE,aAAa,GAAG,SAAS;CACjC,OAAO;EACL,GAAG;EACH,aAAa,gBAAgB,IAAI,IAAI,SAAS,KAAK;EACnD,OAAO,MAAM,uBAAuB,WAAW;CACjD;AACF;AAEA,eAAsB,kBACpB,MACA,iBACuB;CACvB,MAAM,gCAAgB,IAAI,IAAoC;CAE9D,OAAO,QAAQ,IACb,KAAK,IAAI,OAAO,QAAQ;EACtB,MAAM,EAAE,aAAa,GAAG,SAAS;EACjC,IAAI,QAAgC;EACpC,IAAI,aAAa;GACf,IAAI,CAAC,cAAc,IAAI,WAAW,GAChC,cAAc,IAAI,aAAa,MAAM,uBAAuB,WAAW,CAAC;GAE1E,QAAQ,cAAc,IAAI,WAAW,KAAK;EAC5C;EAEA,OAAO;GACL,GAAG;GACH,aAAa,gBAAgB,IAAI,IAAI,SAAS,KAAK;GACnD;EACF;CACF,CAAC,CACH;AACF;AAEA,eAAsB,oBACpB,QACA,aACY;CACZ,MAAM,QAAQ,MAAM,uBAAuB,WAAW;CACtD,OAAO;EACL,GAAG;EACH;CACF;AACF;;;AC5DA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,MAAM,cAAc,CAAC;CAC3B,MAAM,QAAQ,0BAA0B,MAAM;EAC5C,SAAS,EAAE,IAAI,MAAM,SAAS,GAAG,KAAK,KAAK,KAAA;EAC3C,QAAQ,EAAE,IAAI,MAAM,QAAQ,GAAG,KAAK,KAAK,KAAA;EACzC,MAAM,EAAE,IAAI,MAAM,MAAM,GAAG,KAAK,KAAK,KAAA;CACvC,CAAC;CAED,MAAM,QAAQ,UAAU,GAAG,iBAAiB,GAAG,CAAC;CAChD,MAAM,SAAS,MAAM,sBAAsB,GAAG,OAAO,MAAM,OAAO;CAClE,IAAI,WAAW,SACb,OAAO,EAAE,KAAK,6BAA6B,MAAM,CAAC,CAAC,CAAC;CAGtD,MAAM,OAAO,MAAM,gBAAgB;EACjC,GAAG;EACH,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;EAC/C,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;CAC3C,CAAC;CAED,MAAM,wBAAwB,MAAM,kBAAkB,GAAG,KAAK;CAC9D,MAAM,WAAW,MAAM,+BAA+B,aAAa,gBAAgB,EACjF,mBAAmB,sBACrB,CAAC;CAGD,MAAM,cAAc,MAAM,kBAAkB,MAAM,IAFtB,IAAI,SAAS,KAAK,YAAY,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,CAEpB,CAAC;CAEjE,OAAO,EAAE,KAAK,6BAA6B,MAAM,WAAW,CAAC;AAC/D;;;ACxBA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,QAAQ,EAAE,IAAI,MAAM,OAAO,KAAK;CACtC,IAAI,CAAC,OACH,OAAO,EAAE,KAAK,MAAM,GAAG;CAGzB,MAAM,OAAO,MAAM,mBAAmB,KAAK;CAC3C,IAAI,CAAC,QAAQ,CAAE,MAAM,mBAAmB,GAAG,KAAK,WAAW,mBAAmB,GAC5E,OAAO,EAAE,KAAK,MAAM,GAAG;CAGzB,MAAM,SAAS,MAAM,oBAAoB,KAAK,WAAW,YAAY;EACnE,IAAI,KAAK,SAAS,YAAY;GAC5B,MAAM,MAAM,MAAM,sBAAsB,KAAK;GAC7C,IAAI,CAAC,KACH,OAAO;GAGT,OAAO,8BAA8B,IAAI,cAAc,KAAK;EAC9D;EAEA,MAAM,UAAU,MAAM,uBAAuB,KAAK;EAClD,IAAI,CAAC,SACH,OAAO;EAGT,MAAM,QAAQ,MAAM,sBAAsB,QAAQ,OAAO;EACzD,IAAI,CAAC,OACH,OAAO;EAGT,OAAO,+BAA+B,MAAM,MAAM,KAAK;CACzD,CAAC;CAED,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,MAAM,GAAG;CAGzB,OAAO,EAAE,KACP,+BAA+B,MAAM,MAAM,oBAAoB,QAAQ,KAAK,WAAW,CAAC,CAC1F;AACF;;;;ACtDA,SAAgB,aAAa,MAAsB;CACjD,MAAM,aAAa,KAChB,MAAM,QAAQ,EACd,OAAO,OAAO,EACd,KAAK,GAAG;CAEX,IAAI,CAAC,YACH,OAAO;CAGT,OAAO,WAAW,QAAQ,UAAU,SAAS,KAAK,YAAY,CAAC;AACjE;;;ACTA,SAAS,YAAY,OAA8C;CACjE,IAAI,CAAC,OACH;CAGF,OAAO;AACT;AAEA,SAAgB,eAAe,KAAe,SAAqD;CACjG,OAAO,mBAAmB,MAAM;EAC9B,IAAI,IAAI;EACR,MAAM,IAAI;EACV,MAAM,IAAI,MAAM,KAAK,KAAK,aAAa,IAAI,IAAI;EAC/C,aAAa,IAAI,eAAe,KAAA;EAChC,WAAW,IAAI;EACf,WAAW,IAAI,UAAU,YAAY;EACrC,YAAY,IAAI;EAChB,OAAO,YAAY,IAAI,KAAK;EAC5B,WAAW,IAAI,aAAa,KAAA;EAC5B,iBAAiB,IAAI,mBAAmB,KAAA;EACxC,WAAW,SAAS,WAAW,YAAY;CAC7C,CAAC;AACH;;;AClBA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,SAAS,MAAM,sBACnB,GACA,UAAU,GAAG,eAAe,cAAc,CAAC,CAAC,CAAC,GAC7C,EAAE,IAAI,MAAM,WAAW,CACzB;CACA,IAAI,WAAW,SACb,OAAO,EAAE,KAAK,+BAA+B,MAAM,CAAC,CAAC,CAAC;CAGxD,MAAM,OAAO,MAAM,iBAAiB,MAAM;CAC1C,MAAM,gBAAgB,MAAM,0BAA0B,KAAK,KAAK,QAAQ,IAAI,EAAE,CAAC;CAE/E,OAAO,EAAE,KACP,+BAA+B,MAC7B,KAAK,KAAK,QAAQ,eAAe,KAAK,EAAE,WAAW,cAAc,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CACzF,CACF;AACF;;;ACvBA,SAAgB,gCAAgC,SAKvC;CACP,2BACE,sBAAsB,OAAO,EAAE,YAAY,CAE3C,CAAC,CACH;AACF;;;ACNA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,UAAU,EAAE,IAAI,MAAM,SAAS,KAAK;CAC1C,MAAM,MAAM,UAAU,MAAM,sBAAsB,OAAO,IAAI,KAAA;CAE7D,IAAI,CAAC,OAAO,CAAE,MAAM,mBAAmB,GAAG,IAAI,WAAW,cAAc,GACrE,OAAO,EAAE,KAAK,iCAAiC,MAAM,IAAI,CAAC;CAG5D,gCAAgC;EAC9B,QAAQ,EAAE,IAAI,MAAM,EAAE;EACtB,WAAW,IAAI;EACf,cAAc;EACd,YAAY,IAAI;CAClB,CAAC;CAED,MAAM,gBAAgB,MAAM,0BAA0B,CAAC,IAAI,EAAE,CAAC;CAE9D,OAAO,EAAE,KACP,iCAAiC,MAC/B,eAAe,KAAK,EAAE,WAAW,cAAc,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,CACtE,CACF;AACF;;;;ACTA,eAAsB,iBACpB,GACA,MACA,QACmB;CACnB,MAAM,sBAAsB,EAAE,IAAI,cAAc;CAChD,MAAM,KAAK,EAAE,IAAI,MAAM,SAAS,aAAa,UAAU,WAAW,KAAK;CACvE,IAAI,CAAC,IACH,OAAO,EAAE,KAAK,MAAM,GAAG;CAGzB,MAAM,OAAO,MAAM,mBAAmB,EAAE;CACxC,IAAI,CAAC,QAAQ,KAAK,SAAS,MACzB,OAAO,EAAE,KAAK,MAAM,GAAG;CAGzB,IAAI,CAAE,MAAM,mBAAmB,GAAG,KAAK,WAAW,mBAAmB,GACnE,OAAO,EAAE,KAAK,MAAM,GAAG;CAGzB,MAAM,MAAM,MAAM,oBAAoB,KAAK,iBAAiB,OAAO,EAAE,CAAC;CACtE,IAAI,CAAC,KACH,OAAO,EAAE,KAAK,MAAM,GAAG;CAGzB,MAAM,eAAe,MAAM,uBAAuB,oBAAoB,cAAc;CACpF,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,MAAM,GAAG;CAIzB,OAAM,MADkB,oBAAoB,cAAc,KAAK,SAAS,GACxD,cAAc,EAAE;CAEhC,MAAM,wBAAwB,MAAM,kBAAkB,GAAG,iBAAiB,cAAc,CAAC,CAAC,CAAC;CAC3F,MAAM,WAAW,MAAM,+BAA+B,oBAAoB,gBAAgB,EACxF,mBAAmB,sBACrB,CAAC;CAGD,MAAM,aAAa,MAAM,iBAAiB,KAAK,IAFnB,IAAI,SAAS,KAAK,YAAY,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,CAEvB,CAAC;CAC9D,OAAO,EAAE,KAAK,+BAA+B,MAAM,UAAU,CAAC;AAChE;;;AC1DA,MAAaC,cAAqC,MAChD,iBAAiB,GAAG,SAAS,kBAAkB;;;ACDjD,SAAgB,kBACd,KACA,SACiB;CACjB,OAAO,sBAAsB,MAAM;EACjC,IAAI,IAAI;EACR,MAAM,IAAI;EACV,MAAM,IAAI,MAAM,KAAK,KAAK,aAAa,IAAI,IAAI;EAC/C,aAAa,IAAI,eAAe,KAAA;EAChC,WAAW,IAAI;EACf,WAAW,IAAI,UAAU,YAAY;EACrC,YAAY,IAAI;EAChB,WAAW,SAAS,WAAW,YAAY;CAC7C,CAAC;AACH;;;ACVA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,SAAS,MAAM,sBACnB,GACA,UAAU,GAAG,kBAAkB,cAAc,CAAC,CAAC,CAAC,GAChD,EAAE,IAAI,MAAM,WAAW,CACzB;CACA,IAAI,WAAW,SACb,OAAO,EAAE,KAAK,kCAAkC,MAAM,CAAC,CAAC,CAAC;CAG3D,MAAM,OAAO,MAAM,oBAAoB,MAAM;CAC7C,MAAM,gBAAgB,MAAM,6BAA6B,KAAK,KAAK,QAAQ,IAAI,EAAE,CAAC;CAElF,OAAO,EAAE,KACP,kCAAkC,MAChC,KAAK,KAAK,QAAQ,kBAAkB,KAAK,EAAE,WAAW,cAAc,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAC5F,CACF;AACF;;;AClBA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,aAAa,EAAE,IAAI,MAAM,YAAY,KAAK;CAChD,MAAM,MAAM,aAAa,MAAM,yBAAyB,UAAU,IAAI,KAAA;CAEtE,IAAI,CAAC,OAAO,CAAE,MAAM,mBAAmB,GAAG,IAAI,WAAW,iBAAiB,GACxE,OAAO,EAAE,KAAK,oCAAoC,MAAM,IAAI,CAAC;CAG/D,gCAAgC;EAC9B,QAAQ,EAAE,IAAI,MAAM,EAAE;EACtB,WAAW,IAAI;EACf,cAAc;EACd,YAAY,IAAI;CAClB,CAAC;CAED,MAAM,gBAAgB,MAAM,6BAA6B,CAAC,IAAI,EAAE,CAAC;CAEjE,OAAO,EAAE,KACP,oCAAoC,MAClC,kBAAkB,KAAK,EAAE,WAAW,cAAc,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,CACzE,CACF;AACF;;;AC1BA,MAAaC,cAAqC,MAChD,iBAAiB,GAAG,YAAY,iBAAiB;;;ACDnD,SAAgB,eAAe,KAA6B;CAC1D,OAAO,mBAAmB,MAAM;EAC9B,IAAI,IAAI;EACR,MAAM,IAAI;EACV,MAAM,IAAI,MAAM,KAAK,KAAK,aAAa,IAAI,IAAI;EAC/C,aAAa,IAAI,eAAe,KAAA;EAChC,WAAW,IAAI;EACf,WAAW,IAAI,UAAU,YAAY;EACrC,YAAY,IAAI;CAClB,CAAC;AACH;;;ACNA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,SAAS,MAAM,sBACnB,GACA,UAAU,GAAG,eAAe,cAAc,CAAC,CAAC,CAAC,GAC7C,EAAE,IAAI,MAAM,WAAW,CACzB;CACA,IAAI,WAAW,SACb,OAAO,EAAE,KAAK,+BAA+B,MAAM,CAAC,CAAC,CAAC;CAGxD,MAAM,OAAO,MAAM,iBAAiB,MAAM;CAE1C,OAAO,EAAE,KAAK,+BAA+B,MAAM,KAAK,IAAI,cAAc,CAAC,CAAC;AAC9E;;;ACbA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,UAAU,EAAE,IAAI,MAAM,SAAS,KAAK;CAC1C,MAAM,MAAM,UAAU,MAAM,sBAAsB,OAAO,IAAI,KAAA;CAE7D,IAAI,CAAC,OAAO,CAAE,MAAM,mBAAmB,GAAG,IAAI,WAAW,cAAc,GACrE,OAAO,EAAE,KAAK,iCAAiC,MAAM,IAAI,CAAC;CAG5D,gCAAgC;EAC9B,QAAQ,EAAE,IAAI,MAAM,EAAE;EACtB,WAAW,IAAI;EACf,cAAc;EACd,YAAY,IAAI;CAClB,CAAC;CAED,OAAO,EAAE,KAAK,iCAAiC,MAAM,eAAe,GAAG,CAAC,CAAC;AAC3E;;;ACTA,SAAgB,iBACd,UACA,UACA,aACgB;CAChB,OAAO,qBAAqB,MAAM;EAChC,IAAI,SAAS;EACb,cAAc,SAAS;EACvB,YAAY,SAAS;EACrB,MAAM,SAAS;EACf,WAAW,SAAS;EACpB;EACA,YAAY,SAAS;EACrB,QAAQ;EACR,cAAc,SAAS,aAAa,YAAY;EAChD,gBAAgB,SAAS,eAAe,YAAY;CACtD,CAAC;AACH;AAEA,SAAgB,sBACd,UACA,QACA,iBACuB;CAEvB,MAAM,WAAW,OADI,SAAS,eACS,IAAI,SAAS,UAAU;CAC9D,IAAI,CAAC,UACH,OAAO;CAIT,OAAO,iBAAiB,UAAU,UADd,gBAAgB,IAAI,SAAS,SAAS,KAAK,SAAS,SACjB;AACzD;AAEA,SAAgB,6BAA6B,KAMxB;CACnB,OAAO;EACL,MAAM,IAAI,MAAM,KAAK,KAAK,aAAa,IAAI,IAAI;EAC/C,WAAW,IAAI;EACf,YAAY,IAAI;EAChB,gBAAgB,IAAI;CACtB;AACF;AAEA,SAAgB,0BAA0B,QAAgC;CACxE,OAAO,KAAK,IACV,IAAI,KAAK,OAAO,YAAY,EAAE,QAAQ,GACtC,IAAI,KAAK,OAAO,cAAc,EAAE,QAAQ,CAC1C;AACF;;;ACrDA,MAAM,gBAAgB;AAEtB,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,SAAS,EAAE,IAAI,MAAM,EAAE;CAC7B,MAAM,eAAe,EAAE,IAAI,cAAc;CAGzC,MAAM,wBAAwB,MAAM,kBAAkB,GAAG,EAAE,MAAM,cAAc,CAAC;CAChF,MAAM,aAAa,MAAM,2BAA2B,QAAQ,aAAa;CACzE,MAAM,oBACJ,0BAA0B,KAAA,IACtB,aACA,WAAW,QAAQ,aAAa,sBAAsB,SAAS,SAAS,SAAS,CAAC;CAExF,MAAM,WAAW,kBACd,QAAQ,aAAa,SAAS,iBAAiB,OAAO,EACtD,KAAK,aAAa,SAAS,UAAU;CACxC,MAAM,cAAc,kBACjB,QAAQ,aAAa,SAAS,iBAAiB,UAAU,EACzD,KAAK,aAAa,SAAS,UAAU;CACxC,MAAM,WAAW,kBACd,QAAQ,aAAa,SAAS,iBAAiB,OAAO,EACtD,KAAK,aAAa,SAAS,UAAU;CAExC,MAAM,CAAC,QAAQ,WAAW,QAAQ,YAAY,MAAM,QAAQ,IAAI;EAC9D,wBAAwB,QAAQ;EAChC,2BAA2B,WAAW;EACtC,wBAAwB,QAAQ;EAChC,+BAA+B,aAAa,gBAAgB,EAC1D,mBAAmB,sBACrB,CAAC;CACH,CAAC;CAED,MAAM,kBAAkB,IAAI,IAAI,SAAS,KAAK,YAAY,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,CAAC;CACrF,MAAM,SAAS;EACb,OAAO,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC,IAAI,IAAI,6BAA6B,GAAG,CAAC,CAAU,CAAC;EACxF,UAAU,IAAI,IAAI,UAAU,KAAK,QAAQ,CAAC,IAAI,IAAI,6BAA6B,GAAG,CAAC,CAAU,CAAC;EAC9F,OAAO,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC,IAAI,IAAI,6BAA6B,GAAG,CAAC,CAAU,CAAC;CAC1F;CAEA,MAAM,UAAU,kBACb,KAAK,aAAa,sBAAsB,UAAU,QAAQ,eAAe,CAAC,EAC1E,QAAQ,WAAW,WAAW,IAAI,EAClC,MAAM,MAAM,UAAU,0BAA0B,KAAK,IAAI,0BAA0B,IAAI,CAAC;CAE3F,OAAO,EAAE,KAAK,iCAAiC,MAAM,OAAO,CAAC;AAC/D;;;ACvDA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,wBAAwB,MAAM,kBAClC,GACA,UAAU,GAAG,iBAAiB,cAAc,CAAC,CAAC,CAAC,CACjD;CAEA,MAAM,WAAW,MAAM,+BAA+B,aAAa,gBAAgB,EACjF,mBAAmB,sBACrB,CAAC;CAED,OAAO,EAAE,KAAK,2BAA2B,MAAM,SAAS,IAAI,UAAU,CAAC,CAAC;AAC1E;;;ACjBA,SAAgB,wBAAwB,OAGD;CACrC,MAAM,aAAa,IAAI,IAAI,CACzB,GAAG,OAAO,KAAK,MAAM,cAAc,GACnC,GAAG,OAAO,KAAK,MAAM,yBAAyB,CAChD,CAAC;CAED,MAAM,UAA8C,CAAC;CAErD,KAAK,MAAM,aAAa,YAAY;EAClC,MAAM,SAAS,MAAM,eAAe;EACpC,MAAM,mBAAmB,MAAM,0BAA0B;EAEzD,QAAQ,aAAa;GACnB,YAAY,QAAQ,cAAc;GAClC,eAAe,QAAQ,iBAAiB;GACxC,YAAY,QAAQ,cAAc;GAClC,iBAAiB,QAAQ,mBAAmB;GAC5C,kBAAkB,mBAAmB,iBAAiB,YAAY,IAAI;EACxE;CACF;CAEA,OAAO;AACT;;;AClBA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,wBAAwB,MAAM,kBAClC,GACA,UAAU,GAAG,iBAAiB,cAAc,CAAC,CAAC,CAAC,CACjD;CAEA,MAAM,CAAC,gBAAgB,6BAA6B,MAAM,QAAQ,IAAI,CACpE,4BACE,0BAA0B,KAAA,IAAY,EAAE,YAAY,sBAAsB,IAAI,KAAA,CAChF,GACA,gCAAgC,aAAa,cAAc,CAC7D,CAAC;CAED,IAAI,UAAU,wBAAwB;EAAE;EAAgB;CAA0B,CAAC;CACnF,IAAI,0BAA0B,KAAA,GAAW;EACvC,MAAM,UAAU,IAAI,IAAI,qBAAqB;EAC7C,UAAU,OAAO,YACf,OAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,eAAe,QAAQ,IAAI,SAAS,CAAC,CACxE;CACF;CAEA,OAAO,EAAE,KAAK,iCAAiC,MAAM,OAAO,CAAC;AAC/D;;;ACvBA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,OAAO,EAAE,IAAI,MAAM;CACzB,MAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI;CAChD,MAAM,SAAS,2BAA2B,UAAU,IAAI;CAExD,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,2BAA2B,CAAC,GAAG,GAAG;CAGrF,MAAM,UAAU,MAAM,6BACpB,aAAa,gBACb,OAAO,KAAK,MACZ,OAAO,KAAK,aACZ,KAAK,EACP;CAEA,OAAO,EAAE,KAAK,4BAA4B,MAAM,WAAW,OAAO,CAAC,GAAG,GAAG;AAC3E;;;ACnBA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,SAAS,mCAAmC,UAAU;EAC1D,MAAM,EAAE,IAAI,MAAM,MAAM;EACxB,kBAAkB,EAAE,IAAI,MAAM,kBAAkB;CAClD,CAAC;CAED,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,qBAAqB,CAAC,GAAG,GAAG;CAG/E,MAAM,eAAe,MAAM,6BACzB,aAAa,gBACb,OAAO,KAAK,MACZ,OAAO,KAAK,gBACd;CAEA,OAAO,EAAE,KAAK,sCAAsC,MAAM,YAAY,CAAC;AACzE;;;ACtBA,MAAaC,aAA+B,OAAO,MAAM;CACvD,OAAO,EAAE,KAAK,sBAAsB,MAAM,aAAa,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC;AAC3E;;;ACOA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI;CAChD,MAAM,SAAS,2BAA2B,UAAU,IAAI;CAExD,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,iCAAiC,CAAC,GAAG,GAAG;CAG3F,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,6BACd,aAAa,gBACb,QAAQ,IACR,OAAO,IACT;CACF,SAAS,OAAO;EACd,IAAI,iBAAiB,uBACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,2BAA2B,CAAC,GAAG,GAAG;EAErF,MAAM;CACR;CAEA,IAAI,CAAC,SACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,oBAAoB,CAAC,GAAG,GAAG;CAG9E,OAAO,EAAE,KAAK,sBAAsB,MAAM,WAAW,OAAO,CAAC,CAAC;AAChE;;;ACtCA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,UAAU,EAAE,IAAI,SAAS;CAI/B,IAAI,CAAC,MAFiB,6BAA6B,aAAa,gBAAgB,QAAQ,EAAE,GAGxF,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,oBAAoB,CAAC,GAAG,GAAG;CAG9E,OAAO,EAAE,KAAK,MAAM,GAAG;AACzB;;;ACXA,MAAaC,aAA+B,OAAO,MAAM;CAEvD,MAAM,OAAO,MAAM,yBADH,EAAE,IAAI,SAC4B,EAAE,EAAE;CAEtD,OAAO,EAAE,KAAK,qCAAqC,MAAM,KAAK,IAAI,oBAAoB,CAAC,CAAC;AAC1F;;;ACDA,MAAMC,gCAA8B;AACpC,MAAM,wBAAwB;AAE9B,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,eAAe,MAAM,uBAAuB,cAAc;CAChE,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,EAAE,OAAO,yBAAyB,GAAG,GAAG;CAGxD,MAAM,aAAa,OAAO,WAAW;CACrC,MAAM,aAAa,mBAAmB,QAAQ,IAAI,UAAU;CAC5D,MAAM,UAAU,uBAAuB,YAAY;CAEnD,MAAM,WAAW,MAAM,sBAAsB;EAC3C,IAAI;EACJ,WAAW,QAAQ;EACnB;EACA,iBAAiB,EAAE,IAAI,MAAM,EAAE;CACjC,CAAC;CAED,MAAM,YAAY,MAAM,QAAQ,WAAW;EACzC,KAAK;EACL,aAAa;EACb,kBAAkBD;CACpB,CAAC;CAED,OAAO,EAAE,KACP,oCAAoC,MAAM;EACxC,UAAU,mBAAmB,QAAQ;EACrC;EACA,kBAAkBA;CACpB,CAAC,GACD,GACF;AACF;;;ACrCA,MAAM,8BAA8B;AAEpC,MAAaE,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,eAAe,MAAM,uBAAuB,cAAc;CAChE,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,EAAE,OAAO,yBAAyB,GAAG,GAAG;CAGxD,MAAM,WAAW,MAAM,sCAAsC,QAAQ,EAAE;CACvE,IAAI,CAAC,UACH,OAAO,EAAE,KAAK,EAAE,OAAO,iCAAiC,GAAG,GAAG;CAIhE,MAAM,cAAc,MADJ,uBAAuB,YACP,EAAE,WAAW;EAC3C,KAAK,SAAS;EACd,kBAAkB;CACpB,CAAC;CAED,OAAO,EAAE,KACP,4CAA4C,MAAM;EAChD,YAAY,SAAS;EACrB;EACA,kBAAkB;CACpB,CAAC,CACH;AACF;;;ACnBA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,aAAa,EAAE,IAAI,MAAM,YAAY;CAC3C,IAAI,CAAC,YACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,0BAA0B,CAAC,GAAG,GAAG;CAGpF,MAAM,WAAW,MAAM,gCAAgC,YAAY,QAAQ,EAAE;CAC7E,IAAI,CAAC,UACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,qBAAqB,CAAC,GAAG,GAAG;CAG/E,IAAI,SAAS,WAAW,SACtB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,6BAA6B,CAAC,GAAG,GAAG;CAGvF,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,eAAe,MAAM,uBAAuB,cAAc;CAChE,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,MAAM,UAAU,uBAAuB,YAAY;CACnD,MAAM,OAAO,MAAM,QAAQ,WAAW,SAAS,UAAU;CACzD,IAAI,CAAC,QAAQ,KAAK,iBAAiB,GACjC,OAAO,EAAE,KACP,oBAAoB,MAAM,EAAE,OAAO,uCAAuC,CAAC,GAC3E,GACF;CAGF,IAAI;EACF,MAAM,gBAAgB,MAAM,QAAQ,UAAU,SAAS,UAAU;EACjE,IAAI,CAAC,iBAAiB,cAAc,cAAc,GAChD,OAAO,EAAE,KACP,oBAAoB,MAAM,EAAE,OAAO,uCAAuC,CAAC,GAC3E,GACF;EAGF,MAAM,eAAe,yBACnB,iCAAiC,OAAO,KAAK,aAAa,CAAC,CAC7D;EAEA,MAAM,SAAS,MAAM,wBAAwB;GAC3C;GACA,WAAW,QAAQ;GACnB;EACF,CAAC;EAED,MAAM,sBAAsB;GAC1B,WAAW,QAAQ;GACnB,MAAM,QAAQ;GACd;EACF,CAAC;EAED,OAAO,EAAE,KACP,sCAAsC,MAAM;GAC1C,UAAU,mBAAmB,OAAO,QAAQ;GAC5C,SAAS,WAAW,OAAO,OAAO;EACpC,CAAC,CACH;CACF,SAAS,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;EACzD,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,QAAQ,CAAC,GAAG,GAAG;CAClE;AACF;;;ACrEA,MAAM,2BAA2B;AAEjC,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,aAAa,EAAE,IAAI,MAAM,YAAY;CAC3C,IAAI,CAAC,YACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,0BAA0B,CAAC,GAAG,GAAG;CAIpF,IAAI,CAAC,MADkB,gCAAgC,YAAY,QAAQ,EAAE,GAE3E,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,qBAAqB,CAAC,GAAG,GAAG;CAG/E,MAAM,SAAS,kCAAkC,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;CAC/F,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,oBAAoB,CAAC,GAAG,GAAG;CAG9E,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,eAAe,MAAM,uBAAuB,cAAc;CAChE,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,MAAM,UAAU,uBAAuB,YAAY;CAInD,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;CACtE,MAAM,UAAU,MAAM,QAAQ,IAC5B,OAAO,IAAI,OAAO,SAAS;EACzB,MAAM,MAAM,qBAAqB,QAAQ,IAAI,IAAI;EACjD,MAAM,OAAO,MAAM,QAAQ,WAAW,GAAG;EACzC,IAAI,QAAQ,KAAK,gBAAgB,GAC/B,OAAO;EAGT,OAAO;GAAE;GAAM,KAAA,MADG,QAAQ,WAAW;IAAE;IAAK,aAAa;GAAyB,CAAC;EAChE;CACrB,CAAC,CACH;CAEA,OAAO,EAAE,KACP,mCAAmC,MAAM,EACvC,SAAS,QAAQ,QAAQ,WAAoD,WAAW,IAAI,EAC9F,CAAC,CACH;AACF;;;AC/CA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,aAAa,EAAE,IAAI,MAAM,YAAY;CAC3C,IAAI,CAAC,YACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,0BAA0B,CAAC,GAAG,GAAG;CAIpF,IAAI,CAAC,MADkB,gCAAgC,YAAY,QAAQ,EAAE,GAE3E,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,qBAAqB,CAAC,GAAG,GAAG;CAG/E,MAAM,SAAS,yCAAyC,UACtD,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CACrC;CACA,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,0BAA0B,CAAC,GAAG,GAAG;CAGpF,MAAM,WAAW,kCAAkC,MAAM;EACvD,OAAO,OAAO,KAAK,MAAM,KAAK,UAAU;GACtC,IAAI,cAAc,KAAK,IAAI;GAC3B,MAAM,KAAK;GACX,MAAM,KAAK;EACb,EAAE;EACF,8BAAa,IAAI,KAAK,GAAE,YAAY;CACtC,CAAC;CAED,MAAM,oCAAoC;EACxC;EACA,WAAW,QAAQ;EACnB,oBAAoB;CACtB,CAAC;CAED,OAAO,EAAE,KACP,kCAAkC,MAAM;EAAE,IAAI;EAAM,WAAW,SAAS,MAAM;CAAO,CAAC,GACtF,GACF;AACF;;;;;;;;;;;AClCA,SAAgB,mBACd,MACA,SACA,WACuC;CACvC,OAAO,KAAK,SAAS,QAAQ;EAC3B,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI;EACjC,MAAM,OACJ,UAAU,MAAM,aAAa,aAAa,IAAI,UAAU,KACxD,UAAU,MAAM,aAAa,aAAa,UAAU,SAAS,SAAS,IAAI,QAAQ,CAAC;EACrF,OAAO,OAAO,CAAC;GAAE,MAAM,IAAI;GAAM;EAAK,CAAC,IAAI,CAAC;CAC9C,CAAC;AACH;AAEA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,SAAS,MAAM,6CAA6C,QAAQ,EAAE;CAE5E,IAAI,CAAC,UAAU,CAAC,OAAO,oBACrB,OAAO,EAAE,KACP,+BAA+B,MAAM;EAAE,YAAY,QAAQ,cAAc;EAAM,OAAO,CAAC;CAAE,CAAC,CAC5F;CAGF,MAAM,WAAW,kCAAkC,MAAM,OAAO,kBAAkB;CAClF,MAAM,CAAC,QAAQ,WAAW,UAAU,MAAM,QAAQ,IAAI;EACpD,iBAAiB,EAAE,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;EAC7C,oBAAoB,EAAE,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;EAChD,iBAAiB,EAAE,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;CAC/C,CAAC;CAED,MAAM,YAAY,SAAS,MAAM,KAAK,SAAS,KAAK,IAAI;CACxD,MAAM,YAAY,6BAA6B,MAAM;EACnD,QAAQ,mBAAmB,QAAQ,UAAU,SAAS;EACtD,WAAW,mBAAmB,WAAW,aAAa,SAAS;EAE/D,QAAQ,OAAO,KAAK,SAAS;GAAE,MAAM,IAAI;GAAM,MAAM,IAAI;EAAW,EAAE;CACxE,CAAC;CAED,OAAO,EAAE,KACP,+BAA+B,MAAM;EACnC,YAAY,OAAO;EACnB,OAAO,SAAS,MAAM,KAAK,UAAU;GAAE,IAAI,KAAK;GAAI,MAAM,KAAK;GAAM,MAAM,KAAK;EAAK,EAAE;EACvF;CACF,CAAC,CACH;AACF;;;ACtDA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,aAAa,EAAE,IAAI,MAAM,YAAY;CAC3C,IAAI,CAAC,YACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,0BAA0B,CAAC,GAAG,GAAG;CAGpF,MAAM,OAAO,EAAE,IAAI,MAAM,MAAM;CAC/B,IAAI,CAAC,MACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,wBAAwB,CAAC,GAAG,GAAG;CAGlF,MAAM,WAAW,MAAM,gCAAgC,YAAY,QAAQ,EAAE;CAC7E,IAAI,CAAC,YAAY,CAAC,SAAS,oBACzB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,qBAAqB,CAAC,GAAG,GAAG;CAM/E,MAAM,OADW,kCAAkC,MAAM,SAAS,kBAC9C,EAAE,MAAM,MAAM,UAAU,MAAM,SAAS,IAAI;CAC/D,IAAI,CAAC,MACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,iBAAiB,CAAC,GAAG,GAAG;CAG3E,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,eAAe,MAAM,uBAAuB,cAAc;CAChE,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,MAAM,UAAU,uBAAuB,YAAY;CACnD,IAAI;CACJ,IAAI;EACF,QAAQ,MAAM,QAAQ,UAAU,qBAAqB,QAAQ,IAAI,KAAK,IAAI,CAAC;CAC7E,QAAQ;EACN,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,0BAA0B,CAAC,GAAG,GAAG;CACpF;CAIA,EAAE,OAAO,gBAAgB,2BAA2B;CACpD,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,OAAO,KAAK,CAAC;AAC/C;;;AC9CA,SAAgB,iCAAiC,SAA6C;CAC5F,OAAO,OAAO,MAAM;EAClB,MAAM,UAAU,EAAE,IAAI,SAAS;EAE/B,IAAI,QAAQ,WAAW,UACrB,OAAO,EAAE,KAAK,kCAAkC,MAAM,EAAE,WAAW,MAAM,CAAC,CAAC;EAG7E,MAAM,eAAe,MAAM,uBAAuB,QAAQ,cAAc;EAIxE,MAAM,YAAY,MAAM,kBACtB;GACE,SALY,cAAc,WAAW,QAAQ;GAM7C,WALc,cAAc,aAAa,QAAQ;EAMnD,GACA,EAAE,QAAQ,QAAQ,CACpB;EAEA,OAAO,EAAE,KAAK,kCAAkC,MAAM,EAAE,UAAU,CAAC,CAAC;CACtE;AACF;;;ACxBA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,gBAAgB,EAAE,IAAI,MAAM,EAAE;CACpC,MAAM,UAAU,MAAM,qBAAqB,QAAQ,EAAE;CAErD,OAAO,EAAE,KACP,iCAAiC,MAC/B,QAAQ,KAAK,WACX,iBAAiB,QAAQ,EAAE,eAAe,OAAO,OAAO,cAAc,CAAC,CACzE,CACF,CACF;AACF;;;ACRA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI;CAChD,MAAM,SAAS,kCAAkC,UAAU,IAAI;CAE/D,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,MAAM,UAAU,MAAM,qBAAqB;EACzC,WAAW,QAAQ;EACnB,gBAAgB,aAAa;EAC7B,QAAQ,OAAO,KAAK;EACpB,MAAM,OAAO,KAAK;CACpB,CAAC;CAED,OAAO,EAAE,KAAK,mCAAmC,MAAM,OAAO,CAAC;AACjE;;;ACdA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,SAAS,EAAE,IAAI,MAAM,QAAQ;CACnC,MAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI;CAChD,MAAM,SAAS,iCAAiC,UAAU,IAAI;CAE9D,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,sBAAsB,CAAC,GAAG,GAAG;CAGhF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,gCAAgC,CAAC,GAAG,GAAG;CAG1F,IAAI;EACF,MAAM,SAAS,MAAM,wBAAwB,QAAQ,IAAI,QAAQ,OAAO,KAAK,IAAI;EACjF,OAAO,EAAE,KAAK,kCAAkC,MAAM,iBAAiB,MAAM,CAAC,CAAC;CACjF,SAAS,OAAO;EACd,IAAI,iBAAiB,4BACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAExE,MAAM;CACR;AACF;;;AC/BA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,SAAS,EAAE,IAAI,MAAM,QAAQ;CAEnC,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,sBAAsB,CAAC,GAAG,GAAG;CAGhF,IAAI;EACF,MAAM,oBAAoB,QAAQ,IAAI,MAAM;EAC5C,OAAO,EAAE,KAAK,MAAM,GAAG;CACzB,SAAS,OAAO;EACd,IAAI,iBAAiB,4BACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAExE,MAAM;CACR;AACF;;;ACjBA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,SAAS,EAAE,IAAI,MAAM,EAAE;CAE7B,IAAI;EACF,MAAM,oBAAoB,QAAQ,IAAI,MAAM;EAC5C,OAAO,EAAE,KAAK,MAAM,GAAG;CACzB,SAAS,OAAO;EACd,IAAI,iBAAiB,4BACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAExE,MAAM;CACR;AACF;;;ACdA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,UAAU,EAAE,IAAI,SAAS;CAE/B,OAAO,EAAE,KAAK,8BAA8B,MAAM,mBAAmB,OAAO,CAAC,CAAC;AAChF;;;ACEA,MAAaC,aAA+B,OAAO,MAAM;CACvD,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,UAAU,EAAE,IAAI,SAAS;CAC/B,MAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI;CAChD,MAAM,SAAS,mCAAmC,UAAU,IAAI;CAEhE,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,mCAAmC,CAAC,GAAG,GAAG;CAG7F,MAAM,UAAU,MAAM,sBAAsB,aAAa,gBAAgB,QAAQ,IAAI;EACnF,aAAa,OAAO,KAAK;EACzB,mBAAmB,OAAO,KAAK;EAC/B,kBAAkB,OAAO,KAAK;CAChC,CAAC;CAED,IAAI,CAAC,SACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,oBAAoB,CAAC,GAAG,GAAG;CAG9E,OAAO,EAAE,KAAK,8BAA8B,MAAM,mBAAmB,OAAO,CAAC,CAAC;AAChF;;;ACnBA,MAAM,wBAA2C;CAAC;CAAQ;CAAW;AAAc;AAEnF,SAAgB,qBAAqB,WAA8C;CACjF,OAAO,sBAAsB,SAAS,SAAS,IAAK,YAAmC;AACzF;;AAGA,SAAgB,uBACd,KACA,IACY;CACZ,IAAI,IAAI,cAAc,WACpB,OAAO,oBAAoB,IAAI,WAAW,EAAE;CAE9C,OAAO,GAAG;AACZ;;AAGA,SAAgB,oBACd,KACA,QACS;CACT,IAAI,IAAI,cAAc,QACpB,OAAO,WAAW,KAAA,KAAa,IAAI,YAAY;CAEjD,OAAO;AACT;;AAGA,SAAS,eAAe,OAAuB;CAC7C,IAAI;EACF,MAAM,SAAS,aAAa,KAAK;EACjC,IAAI,OAAO,SAAS,OAClB,OAAO,yBAAyB,OAAO,IAAI;CAE/C,QAAQ,CAER;CAEA,OAAO,yBAAyB,KAAK;AACvC;;AAGA,SAAS,kBAAkB,OAAuB;CAChD,MAAM,UAAU,MAAM,KAAK;CAC3B,IAAI,QAAQ,UAAU,GACpB,OAAO,IAAI,OAAO,KAAK,IAAI,QAAQ,QAAQ,CAAC,CAAC;CAE/C,OAAO,GAAG,IAAI,OAAO,KAAK,IAAI,QAAQ,SAAS,GAAG,EAAE,CAAC,IAAI,QAAQ,MAAM,EAAE;AAC3E;AAEA,eAAe,sBACb,YACmF;CAEnF,MAAM,UAAU,MAAM,6BAA6B,UAAU;CAC7D,IAAI,CAAC,SACH,OAAO;CAGT,IAAI;CACJ,IAAI;EACF,SAAS,KAAK,MAAM,OAAO;CAC7B,QAAQ;EACN,OAAO;CACT;CACA,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAC/D,OAAO;CAGT,MAAM,cAAsC,CAAC;CAC7C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,YAAY,OAAO,kBAAkB,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK,CAAC;CAGhG,MAAM,iBAAiB,OAAO,KAAK,WAAW;CAC9C,OAAO,eAAe,SAAS,IAAI;EAAE;EAAgB;CAAY,IAAI;AACvE;AAEA,SAAS,YAAY,OAA2D;CAC9E,IAAI,CAAC,OACH,OAAO,CAAC;CAEV,OAAO;EACL,aAAa,MAAM;EACnB,WAAW,MAAM;EACjB,GAAI,MAAM,SAAS,IAAI,SAAS,MAAM,KAAK,IAAI,EAAE,gBAAgB,MAAM,MAAM,IAAI,CAAC;CACpF;AACF;AAQA,SAAS,UACP,MACA,MACU;CACV,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,QAAQ,OAAqB,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC9E;;AAGA,eAAe,sBACb,MACA,gBAC4B;CAC5B,MAAM,CAAC,UAAU,QAAQ,eAAe,MAAM,QAAQ,IAAI;EACxD,+BAA+B,cAAc;EAC7C,iBAAiB,UAAU,OAAO,QAAS,IAAI,cAAc,SAAS,IAAI,UAAU,IAAK,CAAC;EAC1F,4BACE,UAAU,OAAO,QAAS,IAAI,aAAa,kBAAkB,IAAI,eAAe,IAAK,CACvF;CACF,CAAC;CAED,OAAO;EACL,iBAAiB,IAAI,IAAI,SAAS,KAAK,YAAY,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,CAAC;EAC9E,YAAY,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;EAC5D,iBAAiB,IAAI,IAAI,YAAY,KAAK,eAAe,CAAC,WAAW,IAAI,UAAU,CAAC,CAAC;CACvF;AACF;AAEA,eAAe,oBACb,KACA,OACA,SAC+B;CAC/B,MAAM,UAAU,IAAI,aAAa;CACjC,MAAM,cAAc,IAAI,aAAa;CACrC,MAAM,UAAU,eAAe,IAAI,IAAI;CACvC,MAAM,aAAa,IAAI,eAAe,QAAQ,gBAAgB,IAAI,IAAI,YAAY,IAAI,KAAA;CACtF,MAAM,aAAa,WAAW,cAAc,OAAO,MAAM,sBAAsB,IAAI,EAAE;CACrF,MAAM,YAAY,UAAU,YAAa,IAAI,WAAW,IAAI,YAAa,KAAA;CACzE,MAAM,cAAc,YAAY,QAAQ,gBAAgB,IAAI,SAAS,IAAI,KAAA;CAEzE,OAAO;EACL,IAAI,IAAI;EACR,OAAO,IAAI;EACX,OAAO,IAAI,SAAS;EACpB;EACA,iBAAiB,UAAW,YAAY,UAAU,YAAY,KAAK,OAAQ;EAC3E;EACA,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;EACjC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;EACrC,QAAQ,WAAW,CAAC,aAAa,iBAAiB;EAClD,WAAW,IAAI,UAAU,YAAY;EACrC,YAAY;EACZ,WAAW,QAAQ,IAAI,SAAS;EAChC,gBAAgB,UAAU,UAAU,cAAc,UAAU;EAC5D,GAAI,UAAU,UAAU,IAAI,UAAU,YAAY,QAAQ,WAAW,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;EAC1F,GAAI,YAAY,eAAe,SAAS,EAAE,eAAe,WAAW,cAAc,IAAI,CAAC;EACvF,GAAI,cAAc,CAAC;EACnB,GAAI,YAAY,uBACZ,EAAE,WAAW,WAAW,qBAAqB,YAAY,EAAE,IAC3D,CAAC;CACP;AACF;;AAGA,eAAsB,0BACpB,MACA,gBACiC;CACjC,MAAM,UAAU,KAAK,QAAQ,QAAQ,qBAAqB,IAAI,SAAS,MAAM,IAAI;CACjF,MAAM,UAAU,MAAM,sBAAsB,SAAS,cAAc;CAMnE,QAAO,MAJiB,QAAQ,IAC9B,QAAQ,KAAK,QAAQ,oBAAoB,KAAK,qBAAqB,IAAI,SAAS,GAAI,OAAO,CAAC,CAC9F,GAEiB,MACd,GAAG,MAAM,IAAI,KAAK,EAAE,aAAa,CAAC,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,aAAa,CAAC,EAAE,QAAQ,CACtF;AACF;;;ACpLA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CAEzC,MAAM,cAAc,MAAM,0BAA0B,MADjC,2BAA2B,GACY,aAAa,cAAc;CACrF,OAAO,EAAE,KAAK,8BAA8B,MAAM,WAAW,CAAC;AAChE;;;ACuBA,SAAS,gBAAmB,QAAsB,IAAkC;CAClF,IAAI,OAAO,cACT,OAAO,oBAAoB,OAAO,cAAc,EAAE;CAEpD,OAAO,GAAG;AACZ;AAEA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,OAAO,EAAE,IAAI,MAAM;CAEzB,MAAM,SAAS,+BAA+B,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;CAC5F,IAAI,CAAC,OAAO,SAAS;EACnB,MAAM,UAAU,OAAO,MAAM,OAAO,IAAI,WAAW;EACnD,OAAO,EAAE,KAAK,EAAE,OAAO,QAAQ,GAAG,GAAG;CACvC;CACA,MAAM,QAAQ,OAAO;CAErB,IAAI,MAAM,mBAAmB,YAAY,MAAM,OAAO;EACpD,MAAM,MAAM,MAAM,yBAAyB,aAAa,gBAAgB,MAAM,KAAK;EACnF,IAAI,OAAO,2BAA2B,GAAG,GAAG;GAC1C,MAAM,aAAa,qCAAqC,IAAI,kBAAkB,MAAM,KAAK;GACzF,IAAI,CAAC,WAAW,IACd,OAAO,EAAE,KAAK,EAAE,OAAO,WAAW,QAAQ,GAAG,GAAG;EAEpD;CACF;CAEA,MAAM,mBAAwD,CAAC;CAC/D,KAAK,MAAM,QAAQ,MAAM,UAAU;EACjC,MAAM,UAAU,MAAM,mCAAmC,aAAa,gBAAgB,IAAI;EAC1F,IAAI,CAAC,SACH,OAAO,EAAE,KAAK,EAAE,OAAO,YAAY,KAAK,aAAa,GAAG,GAAG;EAE7D,iBAAiB,KAAK;GAAE,IAAI,QAAQ;GAAI,MAAM,QAAQ;EAAK,CAAC;CAC9D;CAEA,MAAM,UAA0B;EAC9B,GAAG,iBAAiB,KAAK,aAAa;GACpC,WAAW;GACX,SAAS,QAAQ;GACjB,cAAc,QAAQ;GACtB,aAAa,QAAQ;EACvB,EAAE;EACF,GAAI,MAAM,+BACN,CAAC;GAAE,WAAW;GAAyB,SAAS,uBAAuB;EAAE,CAAC,IAC1E,CAAC;EACL,GAAI,MAAM,+BACN,CAAC;GAAE,WAAW;GAAiB,SAAS,KAAK;EAAG,CAAC,IACjD,CAAC;CACP;CAEA,MAAM,UAAU,yBAAyB,MAAM,KAAK;CAGpD,MAAM,gCAAgB,IAAI,IAA0B;CACpD,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,WAAW,MAAM,gBAAgB,cACrC,kCAAkC,MAAM,OAAO,OAAO,WAAW,OAAO,OAAO,CACjF;EACA,cAAc,IAAI,QAAQ,SAAS,MAAM;CAC3C;CAEA,MAAM,QAAQ,MAAM;CAEpB,MAAM,aAAuB,CAAC;CAC9B,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,WAAW,MAAM,gBAAgB,cACrC,kCAAkC,MAAM,OAAO,OAAO,WAAW,OAAO,OAAO,CACjF;EASA,MAAM,QAAQ,qCAAqC;GACjD,WATgB,MAAM,OAAO,KAAK,KAGlC,6BAA6B;IAC3B,WAAW,OAAO;IAClB;IACA,aAAa,OAAO;GACtB,CAAC;GAGD,aAAa,SAAS,KAAK,QAAQ,IAAI,KAAK;EAC9C,CAAC;EAED,MAAM,KAAK,OAAO,WAAW;EAC7B,MAAM,gBAAgB,cACpB,4BAA4B;GAC1B;GACA,KAAK,MAAM;GACX,WAAW,OAAO;GAClB,SAAS,OAAO;GAChB;GACA,YAAY,cAAc,IAAI,MAAM,KAAK,OAAO;GAChD;EACF,CAAC,CACH;EACA,WAAW,KAAK,EAAE;CACpB;CAEA,MAAM,OAAgC,CAAC;CACvC,KAAK,MAAM,MAAM,YAAY;EAC3B,MAAM,MAAM,MAAM,6BAA6B,EAAE;EACjD,IAAI,KACF,KAAK,KAAK,GAAG;CAEjB;CAEA,MAAM,cAAc,MAAM,0BAA0B,MAAM,aAAa,cAAc;CACrF,OAAO,EAAE,KAAK,gCAAgC,MAAM,WAAW,GAAG,GAAG;AACvE;;;ACxIA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CAEzC,MAAM,eAAe,EAAE,IAAI,MAAM,cAAc,KAAK;CACpD,MAAM,MAAM,eAAe,MAAM,6BAA6B,YAAY,IAAI,KAAA;CAC9E,IAAI,CAAC,OAAO,qBAAqB,IAAI,SAAS,MAAM,MAClD,OAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;CAGtD,MAAM,CAAC,cAAc,MAAM,0BAA0B,CAAC,GAAG,GAAG,aAAa,cAAc;CACvF,OAAO,EAAE,KAAK,4BAA4B,MAAM,UAAU,CAAC;AAC7D;;;ACAA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,OAAO,EAAE,IAAI,MAAM;CAEzB,MAAM,eAAe,EAAE,IAAI,MAAM,cAAc,KAAK;CACpD,MAAM,WAAW,eAAe,MAAM,6BAA6B,YAAY,IAAI,KAAA;CACnF,IAAI,CAAC,YAAY,qBAAqB,SAAS,SAAS,MAAM,MAC5D,OAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;CAGtD,IAAI,CAAC,oBAAoB,UAAU,KAAK,EAAE,GACxC,OAAO,EAAE,KAAK,EAAE,OAAO,YAAY,GAAG,GAAG;CAG3C,MAAM,SAAS,8BAA8B,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;CAC3F,IAAI,CAAC,OAAO,SAAS;EACnB,MAAM,UAAU,OAAO,MAAM,OAAO,IAAI,WAAW;EACnD,OAAO,EAAE,KAAK,EAAE,OAAO,QAAQ,GAAG,GAAG;CACvC;CAEA,IAAI,OAAO,KAAK,SAAS,SAAS,aAAa,WAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,mDAAmD,GAAG,GAAG;CAGlF,MAAM,QAAQ,OAAO,KAAK,UAAU,KAAA,IAAY,OAAO,KAAK,QAAQ,SAAS;CAC7E,MAAM,YACJ,OAAO,KAAK,cAAc,KAAA,IAAY,OAAO,KAAK,YAAY,QAAQ,SAAS,SAAS;CAE1F,IAAI,UAAU,SAAS;OAIjB,MAHmB,uBAAuB,gBAC5C,kCAAkC,SAAS,MAAM,SAAS,WAAW,SAAS,OAAO,CACvF,GACa,MAAM,QAAQ,IAAI,OAAO,iBAAiB,IAAI,SAAS,UAAU,KAAK,GACjF,OAAO,EAAE,KAAK,EAAE,OAAO,8CAA8C,GAAG,GAAG;CAAA;CAI/E,MAAM,uBAAuB,UAAU,YAAY;EACjD,IAAI,OAAO,KAAK,OAAO;GACrB,MAAM,4BAA4B;IAChC,IAAI,SAAS;IACb,KAAK,SAAS;IACd,WAAW,SAAS;IACpB,SAAS,SAAS;IAClB;IACA;IACA,OAAO,OAAO,KAAK;GACrB,CAAC;GACD;EACF;EAEA,IAAI,WACF,MAAM,gCAAgC;GACpC,MAAM,SAAS;GACf,WAAW,SAAS;GACpB,SAAS,SAAS;GAClB,UAAU;EACZ,CAAC;EAGH,MAAM,yBAAyB;GAC7B,IAAI,SAAS;GACb,MAAM,SAAS;GACf,WAAW,SAAS;GACpB,SAAS,SAAS;GAClB;GACA;GACA,UAAU,SAAS;GACnB,YAAY,SAAS;GACrB,cAAc,SAAS;GACvB,WAAW,SAAS;GACpB,2BAAW,IAAI,KAAK;EACtB,CAAC;CACH,CAAC;CAED,MAAM,UAAU,MAAM,6BAA6B,YAAY;CAC/D,MAAM,CAAC,cAAc,MAAM,0BACzB,UAAU,CAAC,OAAO,IAAI,CAAC,GACvB,aAAa,cACf;CACA,OAAO,EAAE,KAAK,4BAA4B,MAAM,UAAU,CAAC;AAC7D;;;ACjFA,SAAgB,8BACd,UAA0C,CAAC,GACjB;CAC1B,OAAO,OAAO,MAAM;EAClB,MAAM,OAAO,EAAE,IAAI,MAAM;EAEzB,MAAM,eAAe,EAAE,IAAI,MAAM,cAAc,KAAK;EACpD,MAAM,WAAW,eAAe,MAAM,6BAA6B,YAAY,IAAI,KAAA;EACnF,IAAI,CAAC,YAAY,qBAAqB,SAAS,SAAS,MAAM,MAC5D,OAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;EAGtD,IAAI,CAAC,oBAAoB,UAAU,KAAK,EAAE,GACxC,OAAO,EAAE,KAAK,EAAE,OAAO,YAAY,GAAG,GAAG;EAG3C,IAAI,SAAS,aAAa;OAEpB,SAAS;SAEP,MADqB,sCAAsC,SAAS,YAAY,GACrE,OAAO,QAAQ,IAAI,OAAO,SAAS,EAAE,GAClD,MAAM,0BAA0B,SAAS,YAAY;GAAA;EACvD,OAEG,IAAI,SAAS,aAAa;OAC3B,SAAS;SAEP,MADqB,sCAAsC,SAAS,YAAY,GACrE,OAAO,QAAQ,IAAI,OAAO,SAAS,EAAE,GAAG;KACrD,IAAI,CAAC,QAAQ,KACX,OAAO,EAAE,KAAK,EAAE,OAAO,mBAAmB,GAAG,GAAG;KAGlD,MAAM,QAAQ,IAAI,iBAAiB,mBAAmB,QAAQ,GAAG,SAAS,YAAY;IACxF;;SAGF,MAAM,+BAA+B,SAAS,EAAE;EAGlD,MAAM,6BAA6B,YAAY;EAC/C,OAAO,EAAE,KAAK,MAAM,GAAG;CACzB;AACF;;;ACtDA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,UAAU,MAAM,0BAA0B,cAAc;CAE9D,OAAO,EAAE,KAAK,sCAAsC,MAAM,QAAQ,IAAI,qBAAqB,CAAC,CAAC;AAC/F;;;ACCA,SAAS,SAAS,MAAkC;CAElD,OADc,QAAQ,IAAI,OAAO,KAAK,KACtB,KAAA;AAClB;AAEA,SAAgB,6BAA6B,cAA8B;CAEzE,OAAO,IADM,SAAS,gBAAgB,KAAK,yBAC5B,QAAQ,OAAO,EAAE,IAAI,iCAAiC,YAAY;AACnF;AAMA,SAAS,sBAA0C;CACjD,OAAO,SAAS,gBAAgB;AAClC;AAEA,SAAS,iCAAiC,SAAiD;CACzF,MAAM,YAAY,6BAA6B,QAAQ,YAAY;CACnE,MAAM,aAAa,QAAQ,iBAAiB,WAAW,KAAK,OAAO,EAAE,WAAW,KAAK,MAAM;CAK3F,OAAO;;;MAJa,QAAQ,cACxB,MAAM,QAAQ,YAAY,WAAW,KAAK,OAAO,EAAE,WAAW,KAAK,MAAM,EAAE,+BAA+B,WAAW,+BACrH,4CAA4C,WAAW,6BAK3C;kBACA,UAAU;;;;AAI5B;AAEA,eAAsB,4BACpB,SACA,QACkB;CAClB,MAAM,SAAS,oBAAoB;CACnC,IAAI,CAAC,QAAQ;EACX,QAAQ,KAAK,sEAAsE;EACnF,OAAO;CACT;CAGA,MAAM,EAAE,UAAU,OADH,UAAU,IAAI,OAAO,MAAM,GACX,OAAO,KAAK;EACzC,MAAM,qBAAqB;EAC3B,IAAI,QAAQ;EACZ,SAAS,sBAAsB,QAAQ,iBAAiB;EACxD,MAAM,iCAAiC,OAAO;CAChD,CAAC;CAED,IAAI,OAAO;EACT,QAAQ,KAAK,wDAAwD,MAAM,SAAS;EACpF,OAAO;CACT;CAEA,OAAO;AACT;;;AC5DA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,OAAO,EAAE,IAAI,MAAM;CACzB,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI;CAChD,MAAM,SAAS,uCAAuC,UAAU,IAAI;CAEpE,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,MAAM,UAAU,MAAM,0BAA0B;EAC9C,gBAAgB,aAAa;EAC7B,iBAAiB,KAAK;EACtB,QAAQ,OAAO,KAAK;EACpB,MAAM,OAAO,KAAK;CACpB,CAAC;CAED,MAAM,UAAU,MAAM,eAAe,KAAK,EAAE;CAC5C,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,CAAC,OAAO,gBAAiB,OAAO,WAAW,UAAU,OAAO,WAAW,WACzE;EAGF,MAAM,4BAA4B;GAChC,OAAO,OAAO;GACd,kBAAkB,aAAa;GAC/B,cAAc,OAAO;GACrB,aAAa,SAAS;EACxB,CAAC;CACH;CAEA,OAAO,EAAE,KAAK,wCAAwC,MAAM,OAAO,CAAC;AACtE;;;AC5BA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,SAAS,EAAE,IAAI,MAAM,QAAQ;CACnC,MAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI;CAChD,MAAM,SAAS,sCAAsC,UAAU,IAAI;CAEnE,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,sBAAsB,CAAC,GAAG,GAAG;CAGhF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,gCAAgC,CAAC,GAAG,GAAG;CAG1F,IAAI;EACF,MAAM,SAAS,MAAM,6BAA6B,gBAAgB,QAAQ,OAAO,KAAK,IAAI;EAE1F,OAAO,EAAE,KAAK,uCAAuC,MAAM,sBAAsB,MAAM,CAAC,CAAC;CAC3F,SAAS,OAAO;EACd,IACE,iBAAiB,0BACjB,iBAAiB,iCAEjB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAGxE,MAAM;CACR;AACF;;;ACjCA,MAAaC,aAAoC,OAAO,MAAM;CAC5D,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,SAAS,EAAE,IAAI,MAAM,QAAQ;CAEnC,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,sBAAsB,CAAC,GAAG,GAAG;CAGhF,IAAI;EACF,MAAM,yBAAyB,gBAAgB,MAAM;EACrD,OAAO,EAAE,KAAK,MAAM,GAAG;CACzB,SAAS,OAAO;EACd,IACE,iBAAiB,0BACjB,iBAAiB,iCAEjB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAGxE,MAAM;CACR;AACF;;;ACtBA,MAAaC,aAA+B,OAAO,MAAM;CAEvD,MAAM,cAAc,MAAM,gCADb,EAAE,IAAI,MAC0C,EAAE,EAAE;CAEjE,OAAO,EAAE,KACP,0CAA0C,MAAM,YAAY,IAAI,yBAAyB,CAAC,CAC5F;AACF;;;ACDA,MAAaC,YAA+B,OAAO,MAAM;CACvD,MAAM,OAAO,EAAE,IAAI,MAAM;CACzB,MAAM,eAAe,EAAE,IAAI,MAAM,cAAc;CAE/C,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,4BAA4B,CAAC,GAAG,GAAG;CAGtF,IAAI;EACF,MAAM,aAAa,MAAM,iBAAiB,cAAc,KAAK,EAAE;EAE/D,OAAO,EAAE,KACP,2CAA2C,MAAM,oBAAoB,UAAU,CAAC,CAClF;CACF,SAAS,OAAO;EACd,IAAI,iBAAiB,qCACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAGxE,IAAI,iBAAiB,sCACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAGxE,IAAI,iBAAiB,oCACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAGxE,MAAM;CACR;AACF;;;AC/BA,MAAaC,YAA+B,OAAO,MAAM;CACvD,MAAM,OAAO,EAAE,IAAI,MAAM;CACzB,MAAM,eAAe,EAAE,IAAI,MAAM,cAAc;CAE/C,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,4BAA4B,CAAC,GAAG,GAAG;CAGtF,IAAI;EACF,MAAM,kBAAkB,cAAc,KAAK,EAAE;EAE7C,OAAO,EAAE,KAAK,4CAA4C,MAAM,EAAE,SAAS,KAAK,CAAC,CAAC;CACpF,SAAS,OAAO;EACd,IAAI,iBAAiB,qCACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAGxE,IAAI,iBAAiB,sCACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAGxE,MAAM;CACR;AACF;;;;AC9BA,SAAgB,qBAAqB,KAA8B;CACjE,OAAO;EACL,IAAI,IAAI;EACR,MAAM,IAAI;EACV,aAAa,IAAI;EACjB,UAAU,IAAI;EACd,wBAAwB,IAAI;EAC5B,GAAI,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;EACrC,UAAU,IAAI;EACd,aAAa,IAAI;EACjB,QAAQ,IAAI;EACZ,GAAI,2BAA2B,GAAG,IAC9B,EAAE,kBAAkB,IAAI,iBAAwC,IAChE,CAAC;CACP;AACF;AAEA,SAAgB,wBAAwB,KAA8B;CACpE,IAAI,IAAI,WAAW,YAAY,IAAI,aAAa,WAC9C,MAAM,IAAI,MAAM,oCAAoC,IAAI,MAAM;CAGhE,IAAI,CAAC,2BAA2B,GAAG,GACjC,MAAM,IAAI,MAAM,4CAA4C,IAAI,MAAM;CAGxE,OAAO;EACL,IAAI,IAAI;EACR,MAAM,IAAI;EACV,MAAM,IAAI;EACV,aAAa,IAAI;EACjB,UAAU,IAAI;EACd,UAAU;EACV,QAAQ;EACR,kBAAkB,IAAI;EACtB,WAAW,IAAI,UAAU,YAAY;EACrC,WAAW,IAAI,UAAU,YAAY;CACvC;AACF;;;ACrCA,MAAaC,YAAoC,OAAO,MAAM;CAG5D,MAAM,QAAO,MADM,wBADE,EAAE,IAAI,cAC2B,EAAE,cAAc,GACpD,IAAI,oBAAoB;CAC1C,OAAO,EAAE,KAAK,uBAAuB,MAAM,IAAI,CAAC;AAClD;;;ACGA,MAAaC,YAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,SAAS,6BAA6B,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;CAE1F,IAAI,CAAC,OAAO,SAAS;EACnB,MAAM,UAAU,OAAO,MAAM,OAAO,IAAI,WAAW;EACnD,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,QAAQ,CAAC,GAAG,GAAG;CAClE;CAEA,MAAM,MAAM,MAAM,uBAAuB,aAAa,cAAc;CACpE,IAAI,CAAC,KACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,IAAI;EACF,MAAM,MAAM,MAAM,aAAa;GAC7B,gBAAgB,aAAa;GAC7B,SAAS,IAAI;GACb,MAAM,OAAO,KAAK;GAClB,MAAM,OAAO,KAAK;GAClB,aAAa,OAAO,KAAK;GACzB,kBAAkB,OAAO,KAAK;EAChC,CAAC;EAED,OAAO,EAAE,KAAK,8BAA8B,MAAM,wBAAwB,GAAG,CAAC,GAAG,GAAG;CACtF,SAAS,OAAO;EACd,IAAI,iBAAiB,sBACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAGxE,MAAM;CACR;AACF;;;AClCA,MAAaC,YAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,SAAS,+BAA+B,UAAU,EACtD,MAAM,EAAE,IAAI,MAAM,MAAM,EAC1B,CAAC;CAED,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,qBAAqB,CAAC,GAAG,GAAG;CAG/E,MAAM,MAAM,MAAM,uBAAuB,aAAa,cAAc;CACpE,IAAI,CAAC,KACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,MAAM,eAAe,MAAM,4BAA4B,IAAI,MAAM,OAAO,KAAK,IAAI;CACjF,OAAO,EAAE,KAAK,kCAAkC,MAAM,YAAY,CAAC;AACrE;;;ACvBA,MAAaC,YAAoC,OAAO,MAAM;CAC5D,MAAM,eAAe,EAAE,IAAI,cAAc;CACzC,MAAM,OAAO,EAAE,IAAI,MAAM,MAAM,KAAK;CACpC,IAAI,CAAC,MACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,gBAAgB,CAAC,GAAG,GAAG;CAG1E,MAAM,MAAM,MAAM,yBAAyB,aAAa,gBAAgB,mBAAmB,IAAI,CAAC;CAChG,IAAI,CAAC,OAAO,IAAI,WAAW,UACzB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,gBAAgB,CAAC,GAAG,GAAG;CAG1E,IAAI;EACF,OAAO,EAAE,KAAK,2BAA2B,MAAM,wBAAwB,GAAG,CAAC,CAAC;CAC9E,QAAQ;EACN,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,gBAAgB,CAAC,GAAG,GAAG;CAC1E;AACF;;;ACXA,MAAaC,YAAoC,OAAO,MAAM;CAC5D,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,OAAO,EAAE,IAAI,MAAM;CAEzB,MAAM,UADQ,gBAAgB,cAAc,CAAC,CAEvC,EAAE,SAAS,QACX,MAAM,sCAAsC,cAAc,IAC1D,MAAM,8BAA8B,gBAAgB,KAAK,EAAE;CAEjE,MAAM,WAAW,MAAM,iBAAiB,CACtC,GAAG,IAAI,IAAI,QAAQ,KAAK,WAAW,OAAO,eAAe,CAAC,CAC5D,CAAC;CACD,MAAM,eAAe,IAAI,IAAI,SAAS,KAAK,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;CAE7E,OAAO,EAAE,KACP,0BAA0B,MACxB,QAAQ,KAAK,YAAY;EACvB,IAAI,OAAO;EACX,MAAM,OAAO;EACb,YAAY,OAAO;EACnB,WAAW,OAAO,UAAU,YAAY;EACxC,WAAW,qCACT,OAAO,iBACP,aAAa,IAAI,OAAO,eAAe,CACzC;EACA,wBAAwB,OAAO,oBAAoB,KAAK;CAC1D,EAAE,CACJ,CACF;AACF;;;AChCA,MAAaC,YAAoC,OAAO,MAAM;CAC5D,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,OAAO,EAAE,IAAI,MAAM;CACzB,MAAM,OAAO,0BAA0B,MAAM,MAAM,EAAE,IAAI,KAAK,CAAC;CAC/D,MAAM,UAAU,MAAM,wBAAwB;EAC5C;EACA,QAAQ,KAAK;EACb,MAAM,KAAK;CACb,CAAC;CACD,MAAM,UAAU,MAAM,0BAA0B,KAAK,EAAE;CAEvD,IAAI,CAAC,SACH,OAAO,EAAE,KAAK,EAAE,OAAO,iBAAiB,GAAG,GAAG;CAGhD,OAAO,EAAE,KACP,2BAA2B,MAAM;EAC/B,IAAI,QAAQ;EACZ,MAAM,QAAQ;EACd,YAAY,QAAQ;EACpB,WAAW,QAAQ,UAAU,YAAY;EACzC,WAAW,4BAA4B,OAAO;EAC9C,wBAAwB;EACxB,QAAQ,QAAQ;CAClB,CAAC,GACD,GACF;AACF;;;ACxBA,MAAaC,YAAoC,OAAO,MAAM;CAC5D,MAAM,EAAE,mBAAmB,EAAE,IAAI,cAAc;CAC/C,MAAM,OAAO,EAAE,IAAI,MAAM;CACzB,MAAM,WAAW,EAAE,IAAI,MAAM,UAAU;CAEvC,IAAI,CAAC,UACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,yBAAyB,CAAC,GAAG,GAAG;CAGnF,MAAM,SAAS,MAAM,uCAAuC,UAAU,cAAc;CACpF,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,oBAAoB,CAAC,GAAG,GAAG;CAG9E,IACE,CAAC,cAAc,cAAc,CAAC,GAAG;EAC/B,QAAQ,KAAK;EACb,iBAAiB,OAAO;CAC1B,CAAC,GAED,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,oBAAoB,CAAC,GAAG,GAAG;CAG9E,IACE,CAAC,gBAAgB,cAAc,CAAC,GAAG;EACjC,QAAQ,KAAK;EACb,iBAAiB,OAAO;CAC1B,CAAC,GAED,OAAO,UAAU,CAAC;CAGpB,IAAI;EACF,MAAM,wBAAwB,UAAU,cAAc;EACtD,OAAO,EAAE,KAAK,MAAM,GAAG;CACzB,SAAS,OAAO;EACd,IAAI,iBAAiB,gCACnB,OAAO,EAAE,KAAK,oBAAoB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,GAAG;EAGxE,MAAM;CACR;AACF;;;AChCA,MAAM,wBAAyD;CAC7D,gBAAgB;CAChB,SAAS;CACT,sBAAsB;AACxB;AAEA,SAAgB,6BAA6B,OAG3C;CACA,MAAM,YAAY,MAAM,8BAAa,IAAI,KAAK,GAAE,YAAY;CAC5D,MAAM,UAAU,sBAAsB,MAAM;CAC5C,MAAM,UAAU,GAAG,QAAQ,QAAQ,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI,KAAK;CAEtE,MAAM,SAAS;EACb;GAAE,MAAM;GAAU,MAAM,oBAAoB,MAAM;EAAO;EACzD;GAAE,MAAM;GAAU,MAAM,iBAAiB;EAAY;EACrD;GACE,MAAM;GACN,MAAM,YAAY,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,MAAM,MAAM,KAAK,GAAG;EAC7E;EACA;GACE,MAAM;GACN,MAAM,oBAAoB,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,QAAQ,MAAM,IAAI,GAAG;EACrF;CACF;CAEA,MAAM,SAAyC,CAC7C;EACE,MAAM;EACN,MAAM;GAAE,MAAM;GAAc,MAAM;GAAS,OAAO;EAAK;CACzD,GACA;EACE,MAAM;EACN;CACF,CACF;CAEA,IAAI,MAAM,SAAS,aAAa,MAAM,SAAS,KAAK,GAClD,OAAO,KAAK;EACV,MAAM;EACN,MAAM;GACJ,MAAM;GACN,MAAM,eAAe,MAAM,QAAQ,KAAK;EAC1C;CACF,CAAC;CAGH,OAAO;EAAE,MAAM;EAAS;CAAO;AACjC;AAEA,eAAsB,uBAAuB,OAAmD;CAC9F,MAAM,aAAa,QAAQ,IAAI,wBAAwB,KAAK;CAC5D,IAAI,CAAC,YAAY;EACf,QAAQ,KAAK,yEAAyE;EACtF;CACF;CAEA,MAAM,UAAU,6BAA6B,KAAK;CAClD,MAAM,WAAW,MAAM,MAAM,YAAY;EACvC,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,MAAM,KAAK,UAAU,OAAO;CAC9B,CAAC;CAED,IAAI,CAAC,SAAS,IAAI;EAChB,MAAM,OAAO,MAAM,SAAS,KAAK,EAAE,YAAY,EAAE;EACjD,MAAM,IAAI,MACR,4CAA4C,SAAS,OAAO,GAAG,OAAO,KAAK,SAAS,IACtF;CACF;AACF;;;ACpFA,MAAa,UAAoC,OAAO,MAAM;CAC5D,MAAM,OAAO,EAAE,IAAI,MAAM;CACzB,MAAM,sBAAsB,EAAE,IAAI,cAAc;CAEhD,MAAM,SAAS,+BAA+B,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;CAC5F,IAAI,CAAC,OAAO,SAAS;EACnB,MAAM,UAAU,OAAO,MAAM,OAAO,IAAI,WAAW;EACnD,OAAO,EAAE,KAAK,EAAE,OAAO,QAAQ,GAAG,GAAG;CACvC;CAEA,MAAM,eAAe,MAAM,uBAAuB,oBAAoB,cAAc;CACpF,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,EAAE,OAAO,yBAAyB,GAAG,GAAG;CAGxD,IAAI;EACF,MAAM,uBAAuB;GAC3B,MAAM,OAAO,KAAK;GAClB,SAAS,OAAO,KAAK;GACrB,MAAM;IACJ,IAAI,KAAK;IACT,MAAM,KAAK;IACX,OAAO,KAAK;GACd;GACA,KAAK;IACH,IAAI,aAAa;IACjB,MAAM,aAAa;IACnB,MAAM,aAAa;GACrB;EACF,CAAC;CACH,SAAS,OAAO;EACd,QAAQ,MAAM,2CAA2C,KAAK;EAC9D,OAAO,EAAE,KAAK,EAAE,OAAO,iCAAiC,GAAG,GAAG;CAChE;CAEA,OAAO,EAAE,KAAK,gCAAgC,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG;AACxE;;;ACsDA,SAAgB,mBACd,SAGuC;CACvC,MAAM,UAAU,IAAI,KAAsC;CAC1D,MAAM,YAAY,IAAI,KAA2C;CACjE,MAAM,gBAAgB,IAAI,KAA2C;CAErE,MAAM,UAAU,eADI,6BACqB,CAAC;CAC1C,MAAM,mBAAmB,8BAA8B,EAAE,KAAK,QAAQ,IAAI,CAAC;CAE3E,QAAQ,IAAI,MAAM,OAAO;CACzB,UAAU,IAAI,MAAM,OAAO;CAC3B,UAAU,IAAI,MAAM,oBAAoB,CAAC;CACzC,cAAc,IAAI,MAAM,OAAO;CAC/B,cAAc,IAAI,MAAM,oBAAoB,CAAC;CAE7C,MAAM,mBAAmB,UAAU,oBAAoB,MAAM;CAC7D,MAAM,oBAAoB,UAAU,YAAY,MAAM;CACtD,MAAM,oBAAoB,UAAU,YAAY,MAAM;CACtD,MAAM,sBAAsB,UAAU,eAAe,MAAM;CAC3D,MAAM,uBAAuB,iBAC3B,yCACC,EAAE,KAAK,WAAW,cAAc,IAAI,SAAS,KAAK,IAAI,CACzD;CACA,MAAM,uBAAuB,yBAAyB;CACtD,MAAM,uBAAuB,UAAU,eAAe,MAAM;CAC5D,MAAM,uBAAuB,UAAU,eAAe,MAAM;CAC5D,MAAM,uBAAuB,UAAU,eAAe,MAAM;CAC5D,MAAM,8BAA8B,UAAU,eAAe,aAAa;CAC1E,MAAM,8BAA8B,iBAClC,oCACC,EAAE,GAAG,KAAK,WACT,mBAAmB,KAAK,EAAE,kBAAkB,2BAA2B,CAAC,EAAE,GAAG,KAAK,IAAI,CAC1F;CACA,MAAM,kBAAkB,yBAAyB;CAEjD,QAAQ,IAAI,kBAAkBC,UAAiB;CAC/C,QAAQ,IAAI,iCAAiCC,UAAiC;CAC9E,QAAQ,KAAK,kBAAkB,0BAA0B,OAAO,CAAC;CACjE,QAAQ,IAAI,kCAAkC,iBAAiBC,UAAe;CAC9E,QAAQ,MACN,kCACA,iBACA,kBACAC,UACF;CAEA,QAAQ,IACN,2CACA,iBACAC,UACF;CACA,QAAQ,MACN,2CACA,iBACA,kBACAC,UACF;CACA,QAAQ,KACN,wDACA,iBACA,kBACAC,UACF;CAEA,QAAQ,IAAI,gBAAgBC,UAA2B;CACvD,QAAQ,KAAK,qCAAqCC,SAA4B;CAC9E,QAAQ,KAAK,sCAAsCC,SAA6B;CAEhF,QAAQ,IAAI,oBAAoBC,UAAa;CAC7C,QAAQ,KAAK,4BAA4BC,UAAiB;CAC1D,QAAQ,MAAM,oBAAoBC,UAAgB;CAClD,QAAQ,IAAI,yBAAyBC,UAAkB;CACvD,QAAQ,MAAM,yBAAyBC,UAAqB;CAE5D,UAAU,IAAI,SAASC,SAAQ;CAC/B,UAAU,IAAI,wBAAwBC,SAAwB;CAC9D,UAAU,KAAK,SAAS,kBAAkBC,SAAS;CACnD,UAAU,IAAI,eAAeC,SAAY;CAEzC,UAAU,IAAI,YAAYC,UAAuB;CACjD,UAAU,KACR,wBACA,mBACA,sBACAC,UACF;CACA,UAAU,MAAM,oBAAoB,mBAAmBC,UAAwB;CAC/E,UAAU,OAAO,oBAAoB,mBAAmBC,UAAwB;CAEhF,UAAU,IAAI,aAAaC,SAAW;CACtC,UAAU,KAAK,aAAa,qBAAqBC,SAAY;CAC7D,UAAU,OAAO,uBAAuBC,SAAY;CAEpD,MAAM,YAAY,gCAAgC;CAElD,UAAU,IAAI,WAAW,WAAWC,UAAU;CAC9C,UAAU,IAAI,oBAAoB,WAAWC,UAAQ;CACrD,UAAU,IAAI,cAAc,WAAWC,UAAa;CACpD,UAAU,IAAI,0BAA0B,WAAWC,UAAW;CAC9D,UAAU,IAAI,WAAW,WAAWC,UAAU;CAC9C,UAAU,IAAI,oBAAoB,WAAWC,UAAQ;CACrD,UAAU,IAAI,YAAY,WAAWC,UAAW;CAChD,UAAU,IAAI,YAAY,WAAWC,UAAW;CAChD,UAAU,KAAK,kBAAkBC,OAAiB;CAClD,UAAU,IAAI,mBAAmB,WAAWC,UAAa;CACzD,UAAU,KAAK,iCAAiC,WAAWC,UAAiB;CAC5E,UAAU,KAAK,sCAAsC,WAAWC,UAAkB;CAElF,UAAU,IAAI,gBAAgB,WAAWC,UAAe;CACxD,UAAU,KAAK,gBAAgB,WAAWC,UAAiB;CAG3D,UAAU,IAAI,8BAA8B,YAAY,GAAG,SACzD,EAAE,IAAI,MAAM,cAAc,MAAM,cAAc,KAAK,IAAIC,WAAc,GAAG,IAAI,CAC9E;CACA,UAAU,MAAM,8BAA8B,WAAWC,UAAgB;CACzE,UAAU,OAAO,8BAA8B,WAAW,gBAAgB;CAE1E,UAAU,IAAI,aAAaC,UAAY;CACvC,UAAU,IAAI,4BAA4BC,UAAiC;CAC3E,UAAU,IAAI,qBAAqB,WAAWC,UAAkB;CAChE,UAAU,KAAK,aAAaC,UAAa;CAEzC,cAAc,IAAI,eAAe,eAAe,GAAG,sBAAsBC,UAAU;CACnF,cAAc,MACZ,eACA,eAAe,GACf,sBACA,sBACAC,UACF;CACA,cAAc,OACZ,eACA,eAAe,GACf,sBACA,sBACAC,UACF;CACA,cAAc,IACZ,wBACA,eAAe,GACf,sBACAC,UACF;CACA,cAAc,MACZ,wBACA,eAAe,GACf,sBACA,sBACAC,UACF;CACA,cAAc,IACZ,uBACA,eAAe,GACf,sBACAC,UACF;CACA,cAAc,KACZ,uBACA,eAAe,GACf,sBACA,6BACAC,UACF;CACA,cAAc,MACZ,+BACA,eAAe,GACf,sBACA,6BACAC,UACF;CACA,cAAc,OACZ,+BACA,eAAe,GACf,sBACA,6BACAC,UACF;CACA,cAAc,OACZ,0BACA,eAAe,GACf,sBACAC,UACF;CACA,cAAc,IACZ,4BACA,eAAe,GACf,sBACA,iCAAiC,QAAQ,OAAO,CAClD;CACA,cAAc,IACZ,qBACA,eAAe,GACf,sBACA,WACAC,UACF;CACA,cAAc,IACZ,mDACA,eAAe,GACf,sBACAC,UACF;CACA,cAAc,IACZ,2BACA,eAAe,GACf,sBACAC,UACF;CACA,cAAc,IACZ,yCACA,eAAe,GACf,sBACA,sBACAC,UACF;CACA,cAAc,KACZ,yBACA,eAAe,GACf,sBACA,sBACAC,UACF;CACA,cAAc,KACZ,8CACA,eAAe,GACf,sBACA,sBACAC,UACF;CACA,cAAc,KACZ,oDACA,eAAe,GACf,sBACA,sBACAC,UACF;CACA,cAAc,KACZ,qDACA,eAAe,GACf,sBACA,sBACAC,UACF;CAEA,UAAU,MAAM,aAAa,aAAa;CAE1C,QAAQ,MAAM,KAAK,SAAS;CAE5B,OAAO;AACT;;;;AC7VA,SAAgB,2BAA2B,GAAgC;CACzE,MAAM,gBAAgB,EAAE,IAAI,OAAO,eAAe;CAClD,IAAI,eAAe,WAAW,SAAS,GACrC,OAAO,cAAc,MAAM,CAAgB,EAAE,KAAK;CAGpD,MAAM,SAAS,EAAE,IAAI,OAAO,WAAW,GAAG,KAAK;CAC/C,IAAI,QACF,OAAO;AAIX;AAEA,SAAgB,mBAAmB,eAAsD;CACvF,OAAO,OAAO,GAAG,SAAS;EACxB,IAAI,CAAC,eACH,OAAO,EAAE,KACP;GAAE,OAAO;GAA4B,SAAS;EAAiC,GAC/E,GACF;EAGF,MAAM,QAAQ,2BAA2B,CAAC;EAC1C,IAAI,CAAC,SAAS,UAAU,eACtB,OAAO,EAAE,KAAK;GAAE,OAAO;GAAgB,SAAS;EAAwB,GAAG,GAAG;EAGhF,MAAM,KAAK;CACb;AACF;;;ACjCA,MAAM,iBAAiB;AAWvB,eAAsB,yBACpB,SACmB;CACnB,MAAM,SAAS,QAAQ,QAAQ,KAAK;CACpC,IAAI,CAAC,QACH,OAAO,SAAS,KAAK,EAAE,OAAO,0BAA0B,GAAG,EAAE,QAAQ,IAAI,CAAC;CAG5E,MAAM,SAAS,IAAI,IAAI,GAAG,eAAe,GAAG,QAAQ,KAAK,QAAQ,QAAQ,EAAE,GAAG;CAC9E,OAAO,SAAS,IAAI,IAAI,QAAQ,UAAU,EAAE;CAG5C,MAAM,WAAW,OADC,QAAQ,aAAa,OACN,QAAQ;EACvC,QAAQ,QAAQ;EAChB,SAAS;GACP,gBAAgB;GAChB,aAAa;EACf;EACA,MAAM,QAAQ,WAAW,SAAS,QAAQ,WAAW,SAAS,KAAA,IAAY,QAAQ;CACpF,CAAC;CAED,MAAM,UAAU,IAAI,QAAQ,SAAS,OAAO;CAC5C,QAAQ,OAAO,kBAAkB;CACjC,QAAQ,OAAO,mBAAmB;CAElC,OAAO,IAAI,SAAS,SAAS,MAAM;EACjC,QAAQ,SAAS;EACjB,YAAY,SAAS;EACrB;CACF,CAAC;AACH;;;AC7BA,eAAsB,iBACpB,WACA,IACwB;CACxB,MAAM,UAAU,MAAM,kBAAkB,SAAS;CACjD,IAAI,CAAC,SACH;CAGF,MAAM,eAAe,MAAM,uBAAuB,QAAQ,cAAc;CACxE,IAAI,CAAC,cACH;CAGF,MAAM,MAAM,sBAAsB,YAAY;CAC9C,IAAI;CAEJ,MAAM,yBAAyB,QAAQ,sBACrC,uBAAuB;EAAE;EAAK,YAAY,aAAa;CAAS,SAC9D,oBAAoB,QAAQ,UAC1B,mBAAmB,QAAQ,gBAAgB,YAAY;EACrD,SAAS,MAAM,GAAG;GAChB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;EACrB,CAAC;CACH,CAAC,CACH,CACF,CACF;CAEA,OAAO;AACT;;;AC1BA,MAAM,+BAA+B,EAAE,OAAO;CAC5C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;CAC9B,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AACzD,CAAC;AAED,MAAM,2BAA2B,EAAE,OAAO;CACxC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;CAChC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AACpC,CAAC;AAED,MAAM,wBAAwB,yBAAyB,OAAO;CAC5D,QAAQ,EAAE,OAAO;CACjB,SAAS,EACN,OAAO;EACN,KAAK,EAAE,OAAO,EAAE,SAAS;EACzB,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;EAC/C,OAAO,EAAE,OAAO,EAAE,SAAS;CAC7B,CAAC,EACA,SAAS;AACd,CAAC;AAED,MAAM,wBAAwB,yBAAyB,OAAO,EAC5D,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAC/B,CAAC;AAED,MAAM,yBAAyB,yBAAyB,OAAO;CAC7D,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;CAC7B,SAAS,EAAE,OAAO;AACpB,CAAC;AAED,SAAgB,oBACd,aACA,cACA,UACA,cACA,KACM;CACN,MAAM,WAAW,IAAI,KAAK;CAC1B,MAAM,UAAU,mBAAmB,WAAW;CAC9C,MAAM,cAAc,mCAAmC,YAAY;CAEnE,SAAS,IAAI,MAAM,OAAO;CAE1B,KAAK,sBAAsB,UAAU,EAAE,iBAAiB,CAAC;CAEzD,SAAS,KAAK,gDAAgD,OAAO,MAAM;EAEzE,MAAM,WAAW,MAAM,iBADL,EAAE,IAAI,MAAM,WACkB,GAAG,YAAY,YAAY,CAAC,CAAC;EAE7E,IAAI,aAAa,KAAA,GACf,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;EAGnD,OACE,YACA,EAAE,KAAK;GAAE,OAAO;GAAkB,SAAS;EAAoC,GAAG,GAAG;CAEzF,CAAC;CAED,SAAS,IAAI,6CAA6C,OAAO,MAAM;EACrE,MAAM,OACJ,EAAE,IAAI,WAAW,SAAS,EAAE,IAAI,WAAW,SAAS,KAAA,IAAY,MAAM,EAAE,IAAI,YAAY;EAE1F,OAAO,yBAAyB;GAC9B,QAAQ,QAAQ,IAAI;GACpB,QAAQ,EAAE,IAAI;GACd,MAAM,EAAE,IAAI,MAAM,MAAM;GACxB,YAAY,EAAE,IAAI;GAClB;EACF,CAAC;CACH,CAAC;CAED,IAAI,UACF,SAAS,IAAI,sCAAsC,OAAO,MAAM;EAE9D,MAAM,WAAW,MAAM,iBADL,EAAE,IAAI,MAAM,WACkB,GAAG,OAAO,QACxD,SAAS,QAAQ,GAAG;GAClB,gBAAgB,IAAI;GACpB,WAAW,IAAI;GACf,YAAY,IAAI,EAAE,IAAI,MAAM,MAAM;EACpC,CAAC,CACH;EAEA,IAAI,aAAa,KAAA,GACf,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;EAGnD,OACE,YACA,EAAE,KAAK;GAAE,OAAO;GAAkB,SAAS;EAA+B,GAAG,GAAG;CAEpF,CAAC;CAGH,IAAI,cAAc;EAChB,SAAS,KAAK,uCAAuC,OAAO,MAAM;GAChE,MAAM,YAAY,EAAE,IAAI,MAAM,WAAW;GACzC,MAAM,SAAS,yBAAyB,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;GACtF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK;IAAE,OAAO;IAAwB,SAAS,OAAO,MAAM,QAAQ;GAAE,GAAG,GAAG;GAGvF,MAAM,SAAS,MAAM,iBAAiB,WAAW,OAAO,QACtD,aAAa,OAAO;IAAE,GAAG;IAAK,GAAG,OAAO;GAAK,CAAC,CAChD;GAEA,IAAI,WAAW,KAAA,GACb,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;GAGnD,OAAO,EAAE,KAAK,MAAM;EACtB,CAAC;EAED,SAAS,KAAK,qCAAqC,OAAO,MAAM;GAC9D,MAAM,YAAY,EAAE,IAAI,MAAM,WAAW;GACzC,MAAM,SAAS,sBAAsB,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;GACnF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK;IAAE,OAAO;IAAwB,SAAS,OAAO,MAAM,QAAQ;GAAE,GAAG,GAAG;GAGvF,MAAM,EAAE,QAAQ,SAAS,GAAG,YAAY,OAAO;GAC/C,MAAM,SAAS,MAAM,iBAAiB,WAAW,OAAO,QACtD,aAAa,KAAK;IAAE,GAAG;IAAK,GAAG;GAAQ,GAAG,QAAQ,OAAO,CAC3D;GAEA,IAAI,WAAW,KAAA,GACb,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;GAGnD,OAAO,EAAE,KAAK,MAAM;EACtB,CAAC;EAED,SAAS,KAAK,qCAAqC,OAAO,MAAM;GAC9D,MAAM,YAAY,EAAE,IAAI,MAAM,WAAW;GACzC,MAAM,SAAS,sBAAsB,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;GACnF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK;IAAE,OAAO;IAAwB,SAAS,OAAO,MAAM,QAAQ;GAAE,GAAG,GAAG;GAGvF,MAAM,EAAE,MAAM,GAAG,YAAY,OAAO;GACpC,MAAM,UAAU,MAAM,iBAAiB,WAAW,OAAO,QACvD,aAAa,SAAS;IAAE,GAAG;IAAK,GAAG;GAAQ,GAAG,IAAI,CACpD;GAEA,IAAI,YAAY,KAAA,GACd,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;GAGnD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;EAC3B,CAAC;EAED,SAAS,KAAK,sCAAsC,OAAO,MAAM;GAC/D,MAAM,YAAY,EAAE,IAAI,MAAM,WAAW;GACzC,MAAM,SAAS,uBAAuB,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;GACpF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK;IAAE,OAAO;IAAwB,SAAS,OAAO,MAAM,QAAQ;GAAE,GAAG,GAAG;GAGvF,MAAM,EAAE,MAAM,SAAS,GAAG,YAAY,OAAO;GAM7C,IAAI,MALgB,iBAAiB,WAAW,OAAO,QAAQ;IAC7D,MAAM,aAAa,UAAU;KAAE,GAAG;KAAK,GAAG;IAAQ,GAAG,MAAM,OAAO;IAClE,OAAO;GACT,CAAC,MAEa,KAAA,GACZ,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;GAGnD,OAAO,EAAE,KAAK,CAAC,CAAC;EAClB,CAAC;EAED,SAAS,KAAK,wCAAwC,OAAO,MAAM;GACjE,MAAM,YAAY,EAAE,IAAI,MAAM,WAAW;GACzC,MAAM,SAAS,yBAAyB,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;GACtF,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK;IAAE,OAAO;IAAwB,SAAS,OAAO,MAAM,QAAQ;GAAE,GAAG,GAAG;GAQvF,IAAI,MALmB,iBAAiB,WAAW,OAAO,QAAQ;IAChE,MAAM,aAAa,QAAQ;KAAE,GAAG;KAAK,GAAG,OAAO;IAAK,CAAC;IACrD,OAAO;GACT,CAAC,MAEgB,KAAA,GACf,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;GAGnD,OAAO,EAAE,KAAK,CAAC,CAAC;EAClB,CAAC;CACH;CAEA,SAAS,KAAK,wCAAwC,OAAO,MAAM;EACjE,MAAM,YAAY,EAAE,IAAI,MAAM,WAAW;EAEzC,IAAI,CAAC,MADiB,iBAAiB,WAAW,OAAO,QAAQ,GAAG,GAElE,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;EAGnD,MAAM,SAAS,6BAA6B,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,CAAC;EAC1F,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK;GAAE,OAAO;GAAwB,SAAS,OAAO,MAAM,QAAQ;EAAE,GAAG,GAAG;EAGvF,MAAM,SAAS,sBAAsB,WAAW,uBAAuB,CAAC;EACxE,IAAI,CAAC,QACH,OAAO,EAAE,KAAK,EAAE,OAAO,wCAAwC,GAAG,GAAG;EAGvE,IAAI;GACF,MAAM,QAAQ,MAAM,4BAClB,WACA,OAAO,KAAK,OACZ,OAAO,KAAK,cACd;GAEA,OAAO,EAAE,KAAK,EACZ,YAAY,gBAAgB,QAAQ,OAAO,KAAK,OAAO,KAAK,EAC9D,CAAC;EACH,SAAS,OAAO;GACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;GACzD,OAAO,EAAE,KAAK;IAAE,OAAO;IAA+B;GAAQ,GAAG,GAAG;EACtE;CACF,CAAC;CAED,OAAO;AACT;;;AC1NA,eAAsBC,YACpB,MACA,SACgD;CAkChD,OAAOC,UAAc;EAhCnB,MAAM;EACN,WAAW,QAAQ;EACnB,iBAAiB,QAAQ;EACzB,KAAK,QAAQ;EACb;EACA,YAAY,KAAK,iBAAiB;GAChC,UAAU,KAAK,YAAY;EAC7B;EACA,cAAc,OAAO,QAAQ;GAC3B,IAAI,MACF,QACA,mBAAmB;IACjB,SAAS,QAAQ;IACjB,SAAS,QAAQ;IACjB,KAAK,QAAQ;GACf,CAAC,CACH;EACF;EACA,gBAAgB,KAAK,EAAE,mBAAmB;GACxC,IAAI,MACF,aACA,oBACE,QAAQ,QAAQ,cAAc,aAC9B,cACA,QAAQ,UACR,QAAQ,cACR,QAAQ,GACV,CACF;EACF;CAG6B,CAAC;AAClC;;;;ACtCA,MAAM,kCAAkC;AACxC,MAAM,sBAAsB;AAE5B,SAAS,4BAAoC;CAC3C,IAAI,QAAQ,IAAI,aAAa,cAC3B,OAAO;CAGT,OAAO,wBAAwB,QAAQ,IAAI,qBAAqB,mBAAmB;AACrF;AAEA,SAAS,oBAAoB,gBAAyC;CACpE,OAAO,eAAe,UAAU,SAAS,aAAa,eAAe,UAAU,SAAS;AAC1F;AAEA,eAAsB,oBACpB,gBACA,QAAkC,CAAC,GACpB;CACf,MAAM,UAAU,eAAe,QAAQ,cAAc;CAErD,MAAM,aAAa;CACnB,MAAM,4BAA4B;CAClC,MAAM,wCAAwC;CAE9C,IAAI,oBAAoB,cAAc,GACpC,MAAM,0BAA0B;CAGlC,iCAAiC,eAAe,SAAS;CACzD,MAAM,0BAA0B,SAAS,EACvC,mBAAmB,OAAO,QAAQ;EAChC,MAAM,eAAe,MAAM,uBAAuB,IAAI,cAAc;EACpE,IAAI,CAAC,cACH,MAAM,IAAI,MAAM,gBAAgB,IAAI,eAAe,WAAW;EAGhE,MAAM,WAAW,MAAM,0BAA0B,IAAI,cAAc;EACnE,MAAM,gBAAgB,eAAe,QAAQ;EAE7C,OAAO;GACL,gBAAgB,IAAI;GACpB,UAAU,CAAC;GACX,UAAU;IACR,GAAG;IACH,gBAAgB,IAAI;GACtB;GACA,KAAK;IACH,GAAG,wBAAwB,cAAc,EAAE,cAAc,QAAQ,IAAI,CAAC;IACtE,GAAG,eAAe,UAAU,UAAU;KACpC,aAAa,cAAc;KAC3B,aAAa,cAAc;IAC7B,CAAC;IACD,GAAG,eAAe,cAAc,UAAU;KACxC,aAAa,cAAc;KAC3B,aAAa,cAAc;IAC7B,CAAC;IACD,GAAG,eAAe,YAAY;KAC5B,aAAa,cAAc;KAC3B,aAAa,cAAc;IAC7B,CAAC;GACH;GACA,SAAS,aAAa,iBAAiB,EAAE,SAAS,aAAa,eAAe,IAAI,KAAA;GAClF,mBAAmB,aAAa;EAClC;CACF,EACF,CAAC;CAED,MAAM,SAAS,QAAQ,IAAI;CAC3B,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,oDAAoD;CAGtE,MAAM,cAAc,QAAQ,IAAI,qBAAqB,QAAQ,QAAQ,EAAE;CACvE,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,yDAAyD;CAG3E,MAAM,OAAO,WAAW;EACtB,SAAS;EACT,iBAAiB,GAAG,OAAO,QAAQ,QAAQ,EAAE,EAAE;EAC/C,gBAAgB,CAAC,MAAM;CACzB,CAAC;CACD,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,wDAAwD;CAG1E,MAAM,MAAM,MAAMC,YAAU,MAAM;EAChC,WAAW;EACX,SAAS,eAAe;EACxB,SAAS,eAAe;EACxB,WAAW,eAAe;EAC1B,UAAU,eAAe;EACzB,cAAc,eAAe;EAC7B,KAAK,eAAe;CACtB,CAAC;CACD,MAAM,MAAM,iBAAiB,GAAG;CAChC,MAAM,OAAO,0BAA0B;CAEvC,MAAM;EAAE,OAAO,IAAI;EAAO;CAAK,IAAI,SAAS;EAC1C,QAAQ,IAAI,8CAA8C,KAAK,MAAM;CACvE,CAAC;AACH"}
|