@keystrokehq/platform 0.1.2 → 0.1.4
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-Ddh1vPYe.cjs → awk2-LA3USKJP-D1rYfUKt.cjs} +40 -40
- package/dist/{awk2-LA3USKJP-Ddh1vPYe.cjs.map → awk2-LA3USKJP-D1rYfUKt.cjs.map} +1 -1
- package/dist/{awk2-LA3USKJP-C4BD4eVg.mjs → awk2-LA3USKJP-DUeD84nt.mjs} +2 -2
- package/dist/{awk2-LA3USKJP-C4BD4eVg.mjs.map → awk2-LA3USKJP-DUeD84nt.mjs.map} +1 -1
- package/dist/{base64-C2AIWVNC-BaiY8WTm.cjs → base64-C2AIWVNC-CHxJHAm1.cjs} +2 -2
- package/dist/{base64-C2AIWVNC-BaiY8WTm.cjs.map → base64-C2AIWVNC-CHxJHAm1.cjs.map} +1 -1
- package/dist/{base64-C2AIWVNC-ChQw62cb.mjs → base64-C2AIWVNC-DCgZ4OVw.mjs} +2 -2
- package/dist/{base64-C2AIWVNC-ChQw62cb.mjs.map → base64-C2AIWVNC-DCgZ4OVw.mjs.map} +1 -1
- package/dist/{bash-YZ33HQZQ-CSOYNHWg.cjs → bash-YZ33HQZQ-7G2TAT74.cjs} +5 -5
- package/dist/{bash-YZ33HQZQ-CSOYNHWg.cjs.map → bash-YZ33HQZQ-7G2TAT74.cjs.map} +1 -1
- package/dist/{bash-YZ33HQZQ-Y0B3uk-_.mjs → bash-YZ33HQZQ-BPjbb6w0.mjs} +2 -2
- package/dist/{bash-YZ33HQZQ-Y0B3uk-_.mjs.map → bash-YZ33HQZQ-BPjbb6w0.mjs.map} +1 -1
- package/dist/{cat-TSFMZVYS-xDkdXP7N.mjs → cat-TSFMZVYS-HIG335Ji.mjs} +3 -3
- package/dist/{cat-TSFMZVYS-xDkdXP7N.mjs.map → cat-TSFMZVYS-HIG335Ji.mjs.map} +1 -1
- package/dist/{cat-TSFMZVYS-DA84HtAp.cjs → cat-TSFMZVYS-mIzvH-qZ.cjs} +3 -3
- package/dist/{cat-TSFMZVYS-DA84HtAp.cjs.map → cat-TSFMZVYS-mIzvH-qZ.cjs.map} +1 -1
- package/dist/{chunk-5H5SCKJM-CH5cUv3d.cjs → chunk-5H5SCKJM-CBTxdgnD.cjs} +32 -32
- package/dist/{chunk-5H5SCKJM-CH5cUv3d.cjs.map → chunk-5H5SCKJM-CBTxdgnD.cjs.map} +1 -1
- package/dist/{chunk-5H5SCKJM-CS7KORUE.mjs → chunk-5H5SCKJM-CD7aK8AR.mjs} +2 -2
- package/dist/{chunk-5H5SCKJM-CS7KORUE.mjs.map → chunk-5H5SCKJM-CD7aK8AR.mjs.map} +1 -1
- package/dist/{chunk-AQ6FYS2X-CmF-1vT3.mjs → chunk-AQ6FYS2X-B6yFWOgA.mjs} +2 -2
- package/dist/{chunk-AQ6FYS2X-CmF-1vT3.mjs.map → chunk-AQ6FYS2X-B6yFWOgA.mjs.map} +1 -1
- package/dist/{chunk-AQ6FYS2X-BHfS6zKK.cjs → chunk-AQ6FYS2X-BEc3YCkn.cjs} +3 -3
- package/dist/{chunk-AQ6FYS2X-BHfS6zKK.cjs.map → chunk-AQ6FYS2X-BEc3YCkn.cjs.map} +1 -1
- package/dist/{chunk-CHFEPBH4-BeM01F0F.cjs → chunk-CHFEPBH4-DAgKa_ae.cjs} +3 -3
- package/dist/{chunk-CHFEPBH4-BeM01F0F.cjs.map → chunk-CHFEPBH4-DAgKa_ae.cjs.map} +1 -1
- package/dist/{chunk-CHFEPBH4-C7eTbJVK.mjs → chunk-CHFEPBH4-DszyllYf.mjs} +2 -2
- package/dist/{chunk-CHFEPBH4-C7eTbJVK.mjs.map → chunk-CHFEPBH4-DszyllYf.mjs.map} +1 -1
- package/dist/{chunk-EBAPSGAO-BZyQwwNU.mjs → chunk-EBAPSGAO-BQN5Sjrp.mjs} +2 -2
- package/dist/{chunk-EBAPSGAO-BZyQwwNU.mjs.map → chunk-EBAPSGAO-BQN5Sjrp.mjs.map} +1 -1
- package/dist/{chunk-EBAPSGAO-fp1lOUs3.cjs → chunk-EBAPSGAO-D8V_MK82.cjs} +3 -3
- package/dist/{chunk-EBAPSGAO-fp1lOUs3.cjs.map → chunk-EBAPSGAO-D8V_MK82.cjs.map} +1 -1
- package/dist/{chunk-LEKBROJD-CC4SPOIA.cjs → chunk-LEKBROJD-BdNyb-Zx.cjs} +17 -17
- package/dist/{chunk-LEKBROJD-CC4SPOIA.cjs.map → chunk-LEKBROJD-BdNyb-Zx.cjs.map} +1 -1
- package/dist/{chunk-LEKBROJD-DgEXP_ty.mjs → chunk-LEKBROJD-D0Z3abFc.mjs} +2 -2
- package/dist/{chunk-LEKBROJD-DgEXP_ty.mjs.map → chunk-LEKBROJD-D0Z3abFc.mjs.map} +1 -1
- package/dist/{chunk-VPADYNBD-CuU1_5VT.cjs → chunk-VPADYNBD-BcW9UUUJ.cjs} +3 -3
- package/dist/{chunk-VPADYNBD-CuU1_5VT.cjs.map → chunk-VPADYNBD-BcW9UUUJ.cjs.map} +1 -1
- package/dist/{chunk-VPADYNBD-DypZmvfB.mjs → chunk-VPADYNBD-Cz4RpzRs.mjs} +2 -2
- package/dist/{chunk-VPADYNBD-DypZmvfB.mjs.map → chunk-VPADYNBD-Cz4RpzRs.mjs.map} +1 -1
- package/dist/{chunk-YCLFEX4T-B5a3ihBC.mjs → chunk-YCLFEX4T-BuriAMZM.mjs} +2 -2
- package/dist/{chunk-YCLFEX4T-B5a3ihBC.mjs.map → chunk-YCLFEX4T-BuriAMZM.mjs.map} +1 -1
- package/dist/{chunk-YCLFEX4T-D4AWfbT8.cjs → chunk-YCLFEX4T-D5bZETGy.cjs} +3 -3
- package/dist/{chunk-YCLFEX4T-D4AWfbT8.cjs.map → chunk-YCLFEX4T-D5bZETGy.cjs.map} +1 -1
- package/dist/{column-XT6UFXNQ-D-31htgy.cjs → column-XT6UFXNQ-CK3Tgvp9.cjs} +4 -4
- package/dist/{column-XT6UFXNQ-D-31htgy.cjs.map → column-XT6UFXNQ-CK3Tgvp9.cjs.map} +1 -1
- package/dist/{column-XT6UFXNQ-B3nI2VCJ.mjs → column-XT6UFXNQ-D7U-7Zb_.mjs} +2 -2
- package/dist/{column-XT6UFXNQ-B3nI2VCJ.mjs.map → column-XT6UFXNQ-D7U-7Zb_.mjs.map} +1 -1
- package/dist/{comm-VV2LDX2J-DpNYwHST.mjs → comm-VV2LDX2J-CVpn9toT.mjs} +2 -2
- package/dist/{comm-VV2LDX2J-DpNYwHST.mjs.map → comm-VV2LDX2J-CVpn9toT.mjs.map} +1 -1
- package/dist/{comm-VV2LDX2J-CSfuzlYr.cjs → comm-VV2LDX2J-Dz_BBbXW.cjs} +3 -3
- package/dist/{comm-VV2LDX2J-CSfuzlYr.cjs.map → comm-VV2LDX2J-Dz_BBbXW.cjs.map} +1 -1
- package/dist/{config-Ck1BY0Ga.d.mts → config-DF8H5mS5.d.mts} +19 -14
- package/dist/{config-PWJeAlTn.d.cts → config-DqyMT-Xg.d.cts} +19 -14
- package/dist/config.cjs +3 -2
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +1 -1
- package/dist/config.d.mts +1 -1
- package/dist/config.mjs +3 -2
- package/dist/config.mjs.map +1 -1
- package/dist/{cp-BISAAS7A-BHfTBk1S.mjs → cp-BISAAS7A-DKr1SlBP.mjs} +2 -2
- package/dist/{cp-BISAAS7A-BHfTBk1S.mjs.map → cp-BISAAS7A-DKr1SlBP.mjs.map} +1 -1
- package/dist/{cp-BISAAS7A-CPlXYVs4.cjs → cp-BISAAS7A-jNcszZAJ.cjs} +3 -3
- package/dist/{cp-BISAAS7A-CPlXYVs4.cjs.map → cp-BISAAS7A-jNcszZAJ.cjs.map} +1 -1
- package/dist/{cut-OKARJCCV-CgfLOcVz.mjs → cut-OKARJCCV-BjKVWby5.mjs} +3 -3
- package/dist/{cut-OKARJCCV-CgfLOcVz.mjs.map → cut-OKARJCCV-BjKVWby5.mjs.map} +1 -1
- package/dist/{cut-OKARJCCV-Ci0PtEgB.cjs → cut-OKARJCCV-Cc-_kYHa.cjs} +4 -4
- package/dist/{cut-OKARJCCV-Ci0PtEgB.cjs.map → cut-OKARJCCV-Cc-_kYHa.cjs.map} +1 -1
- package/dist/{diff-MWJFIG7X-F82OACp-.cjs → diff-MWJFIG7X-B6ToWPAr.cjs} +4 -4
- package/dist/{diff-MWJFIG7X-F82OACp-.cjs.map → diff-MWJFIG7X-B6ToWPAr.cjs.map} +1 -1
- package/dist/{diff-MWJFIG7X-CJdAnnog.mjs → diff-MWJFIG7X-BCHpDWKE.mjs} +2 -2
- package/dist/{diff-MWJFIG7X-CJdAnnog.mjs.map → diff-MWJFIG7X-BCHpDWKE.mjs.map} +1 -1
- package/dist/{start-Cm1hxyF_.cjs → dist-CTYXqPDt.cjs} +4229 -7630
- package/dist/dist-CTYXqPDt.cjs.map +1 -0
- package/dist/{start-DmsuxtBI.mjs → dist-u6HScFsc.mjs} +3443 -7618
- package/dist/dist-u6HScFsc.mjs.map +1 -0
- package/dist/{du-572XNP42-BnHmg4U2.cjs → du-572XNP42-CQyl8s3u.cjs} +2 -2
- package/dist/{du-572XNP42-BnHmg4U2.cjs.map → du-572XNP42-CQyl8s3u.cjs.map} +1 -1
- package/dist/{du-572XNP42-D6bH6wn1.mjs → du-572XNP42-D2LEmfx9.mjs} +2 -2
- package/dist/{du-572XNP42-D6bH6wn1.mjs.map → du-572XNP42-D2LEmfx9.mjs.map} +1 -1
- package/dist/{env-36M5BO7M-BxusWRsf.cjs → env-36M5BO7M-BgS1oyaO.cjs} +3 -3
- package/dist/{env-36M5BO7M-BxusWRsf.cjs.map → env-36M5BO7M-BgS1oyaO.cjs.map} +1 -1
- package/dist/{env-36M5BO7M-a702Fh7w.mjs → env-36M5BO7M-CQz3heu4.mjs} +2 -2
- package/dist/{env-36M5BO7M-a702Fh7w.mjs.map → env-36M5BO7M-CQz3heu4.mjs.map} +1 -1
- package/dist/{expand-JSPG6VOP-BbtpP_uq.mjs → expand-JSPG6VOP-CjEvgYE7.mjs} +2 -2
- package/dist/{expand-JSPG6VOP-BbtpP_uq.mjs.map → expand-JSPG6VOP-CjEvgYE7.mjs.map} +1 -1
- package/dist/{expand-JSPG6VOP-DjHywCfM.cjs → expand-JSPG6VOP-w3B3Wcpp.cjs} +3 -3
- package/dist/{expand-JSPG6VOP-DjHywCfM.cjs.map → expand-JSPG6VOP-w3B3Wcpp.cjs.map} +1 -1
- package/dist/{expr-5JAACS4X-Cp_dIjlS.mjs → expr-5JAACS4X-CekL4kzy.mjs} +2 -2
- package/dist/{expr-5JAACS4X-Cp_dIjlS.mjs.map → expr-5JAACS4X-CekL4kzy.mjs.map} +1 -1
- package/dist/{expr-5JAACS4X-Df3xFZ4w.cjs → expr-5JAACS4X-CrqDcl6c.cjs} +5 -5
- package/dist/{expr-5JAACS4X-Df3xFZ4w.cjs.map → expr-5JAACS4X-CrqDcl6c.cjs.map} +1 -1
- package/dist/{find-INTH3OLC-B5hj2iWq.cjs → find-INTH3OLC-BLqmQymL.cjs} +7 -7
- package/dist/{find-INTH3OLC-B5hj2iWq.cjs.map → find-INTH3OLC-BLqmQymL.cjs.map} +1 -1
- package/dist/{find-INTH3OLC-DorC8D7k.mjs → find-INTH3OLC-BuB0ASqa.mjs} +3 -3
- package/dist/{find-INTH3OLC-DorC8D7k.mjs.map → find-INTH3OLC-BuB0ASqa.mjs.map} +1 -1
- package/dist/{fold-4TQNYMSW-DU7ysgn3.cjs → fold-4TQNYMSW-Cvoxzetz.cjs} +3 -3
- package/dist/{fold-4TQNYMSW-DU7ysgn3.cjs.map → fold-4TQNYMSW-Cvoxzetz.cjs.map} +1 -1
- package/dist/{fold-4TQNYMSW-DOzlyQla.mjs → fold-4TQNYMSW-DdElN4Da.mjs} +2 -2
- package/dist/{fold-4TQNYMSW-DOzlyQla.mjs.map → fold-4TQNYMSW-DdElN4Da.mjs.map} +1 -1
- package/dist/{grep-V3LQVMRQ-CnT0y0-P.cjs → grep-V3LQVMRQ-C3P-xkVL.cjs} +5 -5
- package/dist/{grep-V3LQVMRQ-CnT0y0-P.cjs.map → grep-V3LQVMRQ-C3P-xkVL.cjs.map} +1 -1
- package/dist/{grep-V3LQVMRQ-C7va-nQQ.mjs → grep-V3LQVMRQ-Q9iHVtcz.mjs} +4 -4
- package/dist/{grep-V3LQVMRQ-C7va-nQQ.mjs.map → grep-V3LQVMRQ-Q9iHVtcz.mjs.map} +1 -1
- package/dist/{gzip-O5ASJAFY-D25F69KM.mjs → gzip-O5ASJAFY-CQXRBTgw.mjs} +2 -2
- package/dist/{gzip-O5ASJAFY-D25F69KM.mjs.map → gzip-O5ASJAFY-CQXRBTgw.mjs.map} +1 -1
- package/dist/{gzip-O5ASJAFY-Dwnbh7Hd.cjs → gzip-O5ASJAFY-DTw8yzKj.cjs} +2 -2
- package/dist/{gzip-O5ASJAFY-Dwnbh7Hd.cjs.map → gzip-O5ASJAFY-DTw8yzKj.cjs.map} +1 -1
- package/dist/{head-442HYESI-Dh7Qcjzs.cjs → head-442HYESI-B5Zrtvzq.cjs} +2 -2
- package/dist/{head-442HYESI-Dh7Qcjzs.cjs.map → head-442HYESI-B5Zrtvzq.cjs.map} +1 -1
- package/dist/{head-442HYESI-W6FegHpm.mjs → head-442HYESI-DDn9puS-.mjs} +2 -2
- package/dist/{head-442HYESI-W6FegHpm.mjs.map → head-442HYESI-DDn9puS-.mjs.map} +1 -1
- package/dist/{help-HZ6M2CKN-pRM3zbwR.cjs → help-HZ6M2CKN-ShPRglNQ.cjs} +3 -3
- package/dist/{help-HZ6M2CKN-pRM3zbwR.cjs.map → help-HZ6M2CKN-ShPRglNQ.cjs.map} +1 -1
- package/dist/{help-HZ6M2CKN-B2mT_z-L.mjs → help-HZ6M2CKN-lSoKoXl4.mjs} +2 -2
- package/dist/{help-HZ6M2CKN-B2mT_z-L.mjs.map → help-HZ6M2CKN-lSoKoXl4.mjs.map} +1 -1
- package/dist/{html-to-markdown-JW4MSQZO-VzjAEp3C.mjs → html-to-markdown-JW4MSQZO-BthuArNM.mjs} +2 -2
- package/dist/{html-to-markdown-JW4MSQZO-VzjAEp3C.mjs.map → html-to-markdown-JW4MSQZO-BthuArNM.mjs.map} +1 -1
- package/dist/{html-to-markdown-JW4MSQZO-CD4oQKoL.cjs → html-to-markdown-JW4MSQZO-DUFlGd4H.cjs} +3 -4
- package/dist/{html-to-markdown-JW4MSQZO-CD4oQKoL.cjs.map → html-to-markdown-JW4MSQZO-DUFlGd4H.cjs.map} +1 -1
- package/dist/{join-TBRGI3LQ-CC2R6oH8.mjs → join-TBRGI3LQ-BPbb462M.mjs} +2 -2
- package/dist/{join-TBRGI3LQ-CC2R6oH8.mjs.map → join-TBRGI3LQ-BPbb462M.mjs.map} +1 -1
- package/dist/{join-TBRGI3LQ-DR2e5mf6.cjs → join-TBRGI3LQ-lLkX23Kg.cjs} +4 -4
- package/dist/{join-TBRGI3LQ-DR2e5mf6.cjs.map → join-TBRGI3LQ-lLkX23Kg.cjs.map} +1 -1
- package/dist/{jq-4XLYLOS5-CKdOTiVR.cjs → jq-4XLYLOS5-C43q5lUe.cjs} +13 -13
- package/dist/{jq-4XLYLOS5-CKdOTiVR.cjs.map → jq-4XLYLOS5-C43q5lUe.cjs.map} +1 -1
- package/dist/{jq-4XLYLOS5-QOU61AvR.mjs → jq-4XLYLOS5-vNG15h8L.mjs} +4 -4
- package/dist/{jq-4XLYLOS5-QOU61AvR.mjs.map → jq-4XLYLOS5-vNG15h8L.mjs.map} +1 -1
- package/dist/{js-exec-N5KEZBH7-8xgWmlL7.cjs → js-exec-N5KEZBH7-DD7o_C3B.cjs} +14 -14
- package/dist/{js-exec-N5KEZBH7-8xgWmlL7.cjs.map → js-exec-N5KEZBH7-DD7o_C3B.cjs.map} +1 -1
- package/dist/{js-exec-N5KEZBH7-CrHAJDpT.mjs → js-exec-N5KEZBH7-az3ZblrQ.mjs} +4 -4
- package/dist/{js-exec-N5KEZBH7-CrHAJDpT.mjs.map → js-exec-N5KEZBH7-az3ZblrQ.mjs.map} +1 -1
- package/dist/{lib-DecFXHrv.mjs → lib-CIBglQoq.mjs} +2 -2
- package/dist/{lib-DecFXHrv.mjs.map → lib-CIBglQoq.mjs.map} +1 -1
- package/dist/{lib-DLRZ2u6t.cjs → lib-CPYdOQHl.cjs} +2 -2
- package/dist/{lib-DLRZ2u6t.cjs.map → lib-CPYdOQHl.cjs.map} +1 -1
- package/dist/{ln-4LGSXXGD-Or1qYweN.mjs → ln-4LGSXXGD-C-x9d2b0.mjs} +2 -2
- package/dist/{ln-4LGSXXGD-Or1qYweN.mjs.map → ln-4LGSXXGD-C-x9d2b0.mjs.map} +1 -1
- package/dist/{ln-4LGSXXGD-DxTw2TAq.cjs → ln-4LGSXXGD-CIEgUkpB.cjs} +3 -3
- package/dist/{ln-4LGSXXGD-DxTw2TAq.cjs.map → ln-4LGSXXGD-CIEgUkpB.cjs.map} +1 -1
- package/dist/{ls-ZJGQER7M-BnKqqleV.mjs → ls-ZJGQER7M-Bcrhni0D.mjs} +2 -2
- package/dist/{ls-ZJGQER7M-BnKqqleV.mjs.map → ls-ZJGQER7M-Bcrhni0D.mjs.map} +1 -1
- package/dist/{ls-ZJGQER7M-CynOwieQ.cjs → ls-ZJGQER7M-Dco5ZVvc.cjs} +2 -2
- package/dist/{ls-ZJGQER7M-CynOwieQ.cjs.map → ls-ZJGQER7M-Dco5ZVvc.cjs.map} +1 -1
- package/dist/{lzma-DzpZapy8.mjs → lzma-BpK0w-SI.mjs} +3 -3
- package/dist/{lzma-DzpZapy8.mjs.map → lzma-BpK0w-SI.mjs.map} +1 -1
- package/dist/{lzma-YuGttxCP.cjs → lzma-COEsFpf6.cjs} +4 -4
- package/dist/{lzma-YuGttxCP.cjs.map → lzma-COEsFpf6.cjs.map} +1 -1
- package/dist/{md5sum-SPU24VSG-8_h79vAu.cjs → md5sum-SPU24VSG-7ehymDqh.cjs} +3 -3
- package/dist/{md5sum-SPU24VSG-8_h79vAu.cjs.map → md5sum-SPU24VSG-7ehymDqh.cjs.map} +1 -1
- package/dist/{md5sum-SPU24VSG-BusAHdrK.mjs → md5sum-SPU24VSG-BikEaErI.mjs} +3 -3
- package/dist/{md5sum-SPU24VSG-BusAHdrK.mjs.map → md5sum-SPU24VSG-BikEaErI.mjs.map} +1 -1
- package/dist/{mkdir-MEPGZOB6-Z0WHNFtR.cjs → mkdir-MEPGZOB6-BTuz9v_t.cjs} +4 -4
- package/dist/{mkdir-MEPGZOB6-Z0WHNFtR.cjs.map → mkdir-MEPGZOB6-BTuz9v_t.cjs.map} +1 -1
- package/dist/{mkdir-MEPGZOB6-BnYYgVxv.mjs → mkdir-MEPGZOB6-BhU6Z4rR.mjs} +2 -2
- package/dist/{mkdir-MEPGZOB6-BnYYgVxv.mjs.map → mkdir-MEPGZOB6-BhU6Z4rR.mjs.map} +1 -1
- package/dist/{mv-W5BIQ646-CDQ60965.mjs → mv-W5BIQ646-DYHSL0LU.mjs} +2 -2
- package/dist/{mv-W5BIQ646-CDQ60965.mjs.map → mv-W5BIQ646-DYHSL0LU.mjs.map} +1 -1
- package/dist/{mv-W5BIQ646-tAPnueJb.cjs → mv-W5BIQ646-rqsiQb7M.cjs} +3 -3
- package/dist/{mv-W5BIQ646-tAPnueJb.cjs.map → mv-W5BIQ646-rqsiQb7M.cjs.map} +1 -1
- package/dist/{nl-WSDW7I4O-BfBF-iiF.cjs → nl-WSDW7I4O-CnGKibFZ.cjs} +3 -3
- package/dist/{nl-WSDW7I4O-BfBF-iiF.cjs.map → nl-WSDW7I4O-CnGKibFZ.cjs.map} +1 -1
- package/dist/{nl-WSDW7I4O-C8m5GQ1G.mjs → nl-WSDW7I4O-Dkal6Jz6.mjs} +2 -2
- package/dist/{nl-WSDW7I4O-C8m5GQ1G.mjs.map → nl-WSDW7I4O-Dkal6Jz6.mjs.map} +1 -1
- package/dist/{od-WOKFDJTP-CHXPdcv9.cjs → od-WOKFDJTP-BScUR9bN.cjs} +3 -3
- package/dist/{od-WOKFDJTP-CHXPdcv9.cjs.map → od-WOKFDJTP-BScUR9bN.cjs.map} +1 -1
- package/dist/{od-WOKFDJTP-KIq-UMwl.mjs → od-WOKFDJTP-LkcVOtHj.mjs} +2 -2
- package/dist/{od-WOKFDJTP-KIq-UMwl.mjs.map → od-WOKFDJTP-LkcVOtHj.mjs.map} +1 -1
- package/dist/{paste-7JC6S4DX-Bs8ByIXb.cjs → paste-7JC6S4DX-HzWqjKmQ.cjs} +3 -3
- package/dist/{paste-7JC6S4DX-Bs8ByIXb.cjs.map → paste-7JC6S4DX-HzWqjKmQ.cjs.map} +1 -1
- package/dist/{paste-7JC6S4DX-u6xdoWS3.mjs → paste-7JC6S4DX-tqwrEvYy.mjs} +2 -2
- package/dist/{paste-7JC6S4DX-u6xdoWS3.mjs.map → paste-7JC6S4DX-tqwrEvYy.mjs.map} +1 -1
- package/dist/{printf-TWGXF445-CtvDPfv-.mjs → printf-TWGXF445-B8Sf39v5.mjs} +2 -2
- package/dist/{printf-TWGXF445-CtvDPfv-.mjs.map → printf-TWGXF445-B8Sf39v5.mjs.map} +1 -1
- package/dist/{printf-TWGXF445-B0tOxQT6.cjs → printf-TWGXF445-Bje4cyXe.cjs} +5 -6
- package/dist/{printf-TWGXF445-B0tOxQT6.cjs.map → printf-TWGXF445-Bje4cyXe.cjs.map} +1 -1
- package/dist/{python3-POMOR4OA-CYRVTFwe.mjs → python3-POMOR4OA-CQy0OWJW.mjs} +3 -3
- package/dist/{python3-POMOR4OA-CYRVTFwe.mjs.map → python3-POMOR4OA-CQy0OWJW.mjs.map} +1 -1
- package/dist/{python3-POMOR4OA-DYjQ3ccZ.cjs → python3-POMOR4OA-bgmedTpE.cjs} +22 -22
- package/dist/{python3-POMOR4OA-DYjQ3ccZ.cjs.map → python3-POMOR4OA-bgmedTpE.cjs.map} +1 -1
- package/dist/{rev-5EHFX4EJ-Cgya-Fo0.cjs → rev-5EHFX4EJ-BpzhDpp9.cjs} +4 -4
- package/dist/{rev-5EHFX4EJ-Cgya-Fo0.cjs.map → rev-5EHFX4EJ-BpzhDpp9.cjs.map} +1 -1
- package/dist/{rev-5EHFX4EJ-C41ieMgj.mjs → rev-5EHFX4EJ-Lno-pSvM.mjs} +2 -2
- package/dist/{rev-5EHFX4EJ-C41ieMgj.mjs.map → rev-5EHFX4EJ-Lno-pSvM.mjs.map} +1 -1
- package/dist/{rg-S4FXYXWB-ByK2CLxu.cjs → rg-S4FXYXWB-B3c-xS0T.cjs} +10 -10
- package/dist/{rg-S4FXYXWB-ByK2CLxu.cjs.map → rg-S4FXYXWB-B3c-xS0T.cjs.map} +1 -1
- package/dist/{rg-S4FXYXWB-DixtanJa.mjs → rg-S4FXYXWB-vO1CwZd4.mjs} +3 -3
- package/dist/{rg-S4FXYXWB-DixtanJa.mjs.map → rg-S4FXYXWB-vO1CwZd4.mjs.map} +1 -1
- package/dist/{rm-SSGETQVQ-CkwXZzCb.mjs → rm-SSGETQVQ-DVySAmdO.mjs} +2 -2
- package/dist/{rm-SSGETQVQ-CkwXZzCb.mjs.map → rm-SSGETQVQ-DVySAmdO.mjs.map} +1 -1
- package/dist/{rm-SSGETQVQ-BSLrKStW.cjs → rm-SSGETQVQ-emZmXVbD.cjs} +4 -4
- package/dist/{rm-SSGETQVQ-BSLrKStW.cjs.map → rm-SSGETQVQ-emZmXVbD.cjs.map} +1 -1
- package/dist/{rmdir-OC4ZLPYA-DmK6bDKx.mjs → rmdir-OC4ZLPYA-BiT5sPTn.mjs} +2 -2
- package/dist/{rmdir-OC4ZLPYA-DmK6bDKx.mjs.map → rmdir-OC4ZLPYA-BiT5sPTn.mjs.map} +1 -1
- package/dist/{rmdir-OC4ZLPYA-DrF3bZoQ.cjs → rmdir-OC4ZLPYA-D0vq3r9z.cjs} +3 -3
- package/dist/{rmdir-OC4ZLPYA-DrF3bZoQ.cjs.map → rmdir-OC4ZLPYA-D0vq3r9z.cjs.map} +1 -1
- package/dist/run.cjs +1 -1
- package/dist/run.mjs +1 -1
- package/dist/{sed-S5UIK574-B3Klx8N4.cjs → sed-S5UIK574-C_tmmJAF.cjs} +27 -27
- package/dist/{sed-S5UIK574-B3Klx8N4.cjs.map → sed-S5UIK574-C_tmmJAF.cjs.map} +1 -1
- package/dist/{sed-S5UIK574-tnYwSWkL.mjs → sed-S5UIK574-DOl6PWt5.mjs} +2 -2
- package/dist/{sed-S5UIK574-tnYwSWkL.mjs.map → sed-S5UIK574-DOl6PWt5.mjs.map} +1 -1
- package/dist/{sha1sum-2PTOAFR6-BP6dQ8V1.mjs → sha1sum-2PTOAFR6-GuPK_c0G.mjs} +3 -3
- package/dist/{sha1sum-2PTOAFR6-BP6dQ8V1.mjs.map → sha1sum-2PTOAFR6-GuPK_c0G.mjs.map} +1 -1
- package/dist/{sha1sum-2PTOAFR6-Bl7iC2ql.cjs → sha1sum-2PTOAFR6-eVUequm9.cjs} +3 -3
- package/dist/{sha1sum-2PTOAFR6-Bl7iC2ql.cjs.map → sha1sum-2PTOAFR6-eVUequm9.cjs.map} +1 -1
- package/dist/{sha256sum-NS7D3IXX-BJzrJC0M.mjs → sha256sum-NS7D3IXX-KDhoCBD7.mjs} +3 -3
- package/dist/{sha256sum-NS7D3IXX-BJzrJC0M.mjs.map → sha256sum-NS7D3IXX-KDhoCBD7.mjs.map} +1 -1
- package/dist/{sha256sum-NS7D3IXX-DdD-z8yU.cjs → sha256sum-NS7D3IXX-d1Vg6JxV.cjs} +3 -3
- package/dist/{sha256sum-NS7D3IXX-DdD-z8yU.cjs.map → sha256sum-NS7D3IXX-d1Vg6JxV.cjs.map} +1 -1
- package/dist/{sleep-X22JJINO-D3SDAJt4.mjs → sleep-X22JJINO-CyAkxQSD.mjs} +2 -2
- package/dist/{sleep-X22JJINO-D3SDAJt4.mjs.map → sleep-X22JJINO-CyAkxQSD.mjs.map} +1 -1
- package/dist/{sleep-X22JJINO-UJvessts.cjs → sleep-X22JJINO-DGw5kE6M.cjs} +5 -5
- package/dist/{sleep-X22JJINO-UJvessts.cjs.map → sleep-X22JJINO-DGw5kE6M.cjs.map} +1 -1
- package/dist/{sort-SW2YEO5B-CFc2Uu_A.mjs → sort-SW2YEO5B-DKjLTe-O.mjs} +3 -3
- package/dist/{sort-SW2YEO5B-CFc2Uu_A.mjs.map → sort-SW2YEO5B-DKjLTe-O.mjs.map} +1 -1
- package/dist/{sort-SW2YEO5B-DIDExLis.cjs → sort-SW2YEO5B-RuQckK0z.cjs} +4 -4
- package/dist/{sort-SW2YEO5B-DIDExLis.cjs.map → sort-SW2YEO5B-RuQckK0z.cjs.map} +1 -1
- package/dist/{split-4KKZZXXE-CSVvRIzD.cjs → split-4KKZZXXE-CFDvTWk8.cjs} +3 -3
- package/dist/{split-4KKZZXXE-CSVvRIzD.cjs.map → split-4KKZZXXE-CFDvTWk8.cjs.map} +1 -1
- package/dist/{split-4KKZZXXE-DMjoEV89.mjs → split-4KKZZXXE-DXwRJvCX.mjs} +2 -2
- package/dist/{split-4KKZZXXE-DMjoEV89.mjs.map → split-4KKZZXXE-DXwRJvCX.mjs.map} +1 -1
- package/dist/{sqlite3-CGOEFJAO-DTNqDMXu.cjs → sqlite3-CGOEFJAO-C2GzVRe7.cjs} +24 -25
- package/dist/sqlite3-CGOEFJAO-C2GzVRe7.cjs.map +1 -0
- package/dist/{sqlite3-CGOEFJAO-BXYj3z3Q.mjs → sqlite3-CGOEFJAO-CX7OvdMs.mjs} +3 -3
- package/dist/{sqlite3-CGOEFJAO-BXYj3z3Q.mjs.map → sqlite3-CGOEFJAO-CX7OvdMs.mjs.map} +1 -1
- package/dist/start-B90XtxnL.cjs +2758 -0
- package/dist/start-B90XtxnL.cjs.map +1 -0
- package/dist/start-JvUYlamf.mjs +2752 -0
- package/dist/start-JvUYlamf.mjs.map +1 -0
- package/dist/start.cjs +1 -1
- package/dist/start.d.cts +3 -997
- package/dist/start.d.mts +2 -998
- package/dist/start.mjs +1 -1
- package/dist/{strings-6WDHLGMX-Cs9B6z8x.mjs → strings-6WDHLGMX-DSFHiHo6.mjs} +2 -2
- package/dist/{strings-6WDHLGMX-Cs9B6z8x.mjs.map → strings-6WDHLGMX-DSFHiHo6.mjs.map} +1 -1
- package/dist/{strings-6WDHLGMX-D2bfJpyh.cjs → strings-6WDHLGMX-uhhFpIsD.cjs} +2 -2
- package/dist/{strings-6WDHLGMX-D2bfJpyh.cjs.map → strings-6WDHLGMX-uhhFpIsD.cjs.map} +1 -1
- package/dist/{tac-2STMMJYW-D0fFvjly.cjs → tac-2STMMJYW-CAeepy4C.cjs} +2 -2
- package/dist/{tac-2STMMJYW-D0fFvjly.cjs.map → tac-2STMMJYW-CAeepy4C.cjs.map} +1 -1
- package/dist/{tac-2STMMJYW-ceGFflzJ.mjs → tac-2STMMJYW-ilclcuYi.mjs} +2 -2
- package/dist/{tac-2STMMJYW-ceGFflzJ.mjs.map → tac-2STMMJYW-ilclcuYi.mjs.map} +1 -1
- package/dist/{tail-R4PCA2C4-BopvFWyi.mjs → tail-R4PCA2C4-BqXHf0GQ.mjs} +2 -2
- package/dist/{tail-R4PCA2C4-BopvFWyi.mjs.map → tail-R4PCA2C4-BqXHf0GQ.mjs.map} +1 -1
- package/dist/{tail-R4PCA2C4-CLtu5GPs.cjs → tail-R4PCA2C4-beByscYb.cjs} +2 -2
- package/dist/{tail-R4PCA2C4-CLtu5GPs.cjs.map → tail-R4PCA2C4-beByscYb.cjs.map} +1 -1
- package/dist/{tar-STHHZTZ6-QbV1N_D9.mjs → tar-STHHZTZ6-DEQqPt4f.mjs} +4 -4
- package/dist/{tar-STHHZTZ6-QbV1N_D9.mjs.map → tar-STHHZTZ6-DEQqPt4f.mjs.map} +1 -1
- package/dist/{tar-STHHZTZ6-Bxk0yG7D.cjs → tar-STHHZTZ6-D_3Avd2x.cjs} +6 -7
- package/dist/{tar-STHHZTZ6-Bxk0yG7D.cjs.map → tar-STHHZTZ6-D_3Avd2x.cjs.map} +1 -1
- package/dist/{tee-YUZ2FKCJ-DiFGWp4G.mjs → tee-YUZ2FKCJ-DeL5TxOv.mjs} +2 -2
- package/dist/{tee-YUZ2FKCJ-DiFGWp4G.mjs.map → tee-YUZ2FKCJ-DeL5TxOv.mjs.map} +1 -1
- package/dist/{tee-YUZ2FKCJ-BbxSWxw6.cjs → tee-YUZ2FKCJ-kgjQdGix.cjs} +2 -2
- package/dist/{tee-YUZ2FKCJ-BbxSWxw6.cjs.map → tee-YUZ2FKCJ-kgjQdGix.cjs.map} +1 -1
- package/dist/{time-D4LNBSWX-CTjUJUms.mjs → time-D4LNBSWX-BDvqGzoU.mjs} +2 -2
- package/dist/{time-D4LNBSWX-CTjUJUms.mjs.map → time-D4LNBSWX-BDvqGzoU.mjs.map} +1 -1
- package/dist/{time-D4LNBSWX-BQSWzFeK.cjs → time-D4LNBSWX-C1Jzh_FF.cjs} +8 -8
- package/dist/{time-D4LNBSWX-BQSWzFeK.cjs.map → time-D4LNBSWX-C1Jzh_FF.cjs.map} +1 -1
- package/dist/{timeout-YDCRSLPQ-DC-fdp1t.mjs → timeout-YDCRSLPQ-CDHmK2ET.mjs} +2 -2
- package/dist/{timeout-YDCRSLPQ-DC-fdp1t.mjs.map → timeout-YDCRSLPQ-CDHmK2ET.mjs.map} +1 -1
- package/dist/{timeout-YDCRSLPQ-DEPvQ6Ih.cjs → timeout-YDCRSLPQ-Ddgm55V3.cjs} +5 -5
- package/dist/{timeout-YDCRSLPQ-DEPvQ6Ih.cjs.map → timeout-YDCRSLPQ-Ddgm55V3.cjs.map} +1 -1
- package/dist/{touch-UA33VN3N-DIda6f8u.cjs → touch-UA33VN3N-CBfo-fUk.cjs} +3 -3
- package/dist/{touch-UA33VN3N-DIda6f8u.cjs.map → touch-UA33VN3N-CBfo-fUk.cjs.map} +1 -1
- package/dist/{touch-UA33VN3N-BMhGO9VC.mjs → touch-UA33VN3N-CLRU8dwp.mjs} +2 -2
- package/dist/{touch-UA33VN3N-BMhGO9VC.mjs.map → touch-UA33VN3N-CLRU8dwp.mjs.map} +1 -1
- package/dist/{tr-36LHWFRQ-DjY4IsPF.mjs → tr-36LHWFRQ--Lxi-rUi.mjs} +2 -2
- package/dist/{tr-36LHWFRQ-DjY4IsPF.mjs.map → tr-36LHWFRQ--Lxi-rUi.mjs.map} +1 -1
- package/dist/{tr-36LHWFRQ-COkRmY_6.cjs → tr-36LHWFRQ-Bel6G8Xw.cjs} +4 -4
- package/dist/{tr-36LHWFRQ-COkRmY_6.cjs.map → tr-36LHWFRQ-Bel6G8Xw.cjs.map} +1 -1
- package/dist/{tree-YLD52CNT-N-vPBfJO.mjs → tree-YLD52CNT-BX10X2C8.mjs} +2 -2
- package/dist/{tree-YLD52CNT-N-vPBfJO.mjs.map → tree-YLD52CNT-BX10X2C8.mjs.map} +1 -1
- package/dist/{tree-YLD52CNT-kZ9vPZ-R.cjs → tree-YLD52CNT-DarfOTzE.cjs} +2 -2
- package/dist/{tree-YLD52CNT-kZ9vPZ-R.cjs.map → tree-YLD52CNT-DarfOTzE.cjs.map} +1 -1
- package/dist/{unexpand-CADSA4VO-Byi4s0o8.mjs → unexpand-CADSA4VO-CE8Q-7DI.mjs} +2 -2
- package/dist/{unexpand-CADSA4VO-Byi4s0o8.mjs.map → unexpand-CADSA4VO-CE8Q-7DI.mjs.map} +1 -1
- package/dist/{unexpand-CADSA4VO-DekKk-hg.cjs → unexpand-CADSA4VO-CLZLDBM9.cjs} +3 -3
- package/dist/{unexpand-CADSA4VO-DekKk-hg.cjs.map → unexpand-CADSA4VO-CLZLDBM9.cjs.map} +1 -1
- package/dist/{uniq-XSIZR6PB-BhdgA9iI.cjs → uniq-XSIZR6PB-CvkGBiie.cjs} +4 -4
- package/dist/{uniq-XSIZR6PB-BhdgA9iI.cjs.map → uniq-XSIZR6PB-CvkGBiie.cjs.map} +1 -1
- package/dist/{uniq-XSIZR6PB-D0HICyAj.mjs → uniq-XSIZR6PB-DVI8BEWZ.mjs} +3 -3
- package/dist/{uniq-XSIZR6PB-D0HICyAj.mjs.map → uniq-XSIZR6PB-DVI8BEWZ.mjs.map} +1 -1
- package/dist/{wc-LF7NU4LA-Ci3_hJug.cjs → wc-LF7NU4LA-B87JyYK9.cjs} +4 -4
- package/dist/{wc-LF7NU4LA-Ci3_hJug.cjs.map → wc-LF7NU4LA-B87JyYK9.cjs.map} +1 -1
- package/dist/{wc-LF7NU4LA-CnEel3wT.mjs → wc-LF7NU4LA-D2NJbTrF.mjs} +3 -3
- package/dist/{wc-LF7NU4LA-CnEel3wT.mjs.map → wc-LF7NU4LA-D2NJbTrF.mjs.map} +1 -1
- package/dist/{xan-Y6WF3IRG-BEGK5ruS.mjs → xan-Y6WF3IRG-BezI-KTd.mjs} +6 -6
- package/dist/{xan-Y6WF3IRG-BEGK5ruS.mjs.map → xan-Y6WF3IRG-BezI-KTd.mjs.map} +1 -1
- package/dist/{xan-Y6WF3IRG-EnrntEIM.cjs → xan-Y6WF3IRG-C28WXL79.cjs} +11 -11
- package/dist/{xan-Y6WF3IRG-EnrntEIM.cjs.map → xan-Y6WF3IRG-C28WXL79.cjs.map} +1 -1
- package/dist/{xan-view-HDVKHFC2-CvEDnphU.mjs → xan-view-HDVKHFC2-BI6E4WF5.mjs} +3 -3
- package/dist/{xan-view-HDVKHFC2-CvEDnphU.mjs.map → xan-view-HDVKHFC2-BI6E4WF5.mjs.map} +1 -1
- package/dist/{xan-view-HDVKHFC2-c1gcVO0A.cjs → xan-view-HDVKHFC2-DcPqeIFZ.cjs} +3 -3
- package/dist/{xan-view-HDVKHFC2-c1gcVO0A.cjs.map → xan-view-HDVKHFC2-DcPqeIFZ.cjs.map} +1 -1
- package/dist/{xargs-MGZPH7AX-DNyBXxK4.cjs → xargs-MGZPH7AX-D80gglJT.cjs} +4 -4
- package/dist/{xargs-MGZPH7AX-DNyBXxK4.cjs.map → xargs-MGZPH7AX-D80gglJT.cjs.map} +1 -1
- package/dist/{xargs-MGZPH7AX-BvI6LK8I.mjs → xargs-MGZPH7AX-Da4TABeU.mjs} +2 -2
- package/dist/{xargs-MGZPH7AX-BvI6LK8I.mjs.map → xargs-MGZPH7AX-Da4TABeU.mjs.map} +1 -1
- package/dist/{yq-4QJW3EQG-CYt1C3ZB.mjs → yq-4QJW3EQG-D785OqS8.mjs} +3 -3
- package/dist/{yq-4QJW3EQG-CYt1C3ZB.mjs.map → yq-4QJW3EQG-D785OqS8.mjs.map} +1 -1
- package/dist/{yq-4QJW3EQG-9kH_HlxF.cjs → yq-4QJW3EQG-DqHEdSO6.cjs} +10 -10
- package/dist/{yq-4QJW3EQG-9kH_HlxF.cjs.map → yq-4QJW3EQG-DqHEdSO6.cjs.map} +1 -1
- package/package.json +1 -1
- package/dist/dist-B1hOOWjl.mjs +0 -3044
- package/dist/dist-B1hOOWjl.mjs.map +0 -1
- package/dist/dist-DvjFaP47.cjs +0 -3799
- package/dist/dist-DvjFaP47.cjs.map +0 -1
- package/dist/sqlite3-CGOEFJAO-DTNqDMXu.cjs.map +0 -1
- package/dist/start-Cm1hxyF_.cjs.map +0 -1
- package/dist/start-DmsuxtBI.mjs.map +0 -1
package/dist/dist-B1hOOWjl.mjs
DELETED
|
@@ -1,3044 +0,0 @@
|
|
|
1
|
-
import Docker from "dockerode";
|
|
2
|
-
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { spawnSync } from "node:child_process";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
|
-
import { z } from "zod";
|
|
7
|
-
import { CreateBucketCommand, DeleteBucketCommand, DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, ListObjectsV2Command, PutBucketAclCommand, PutBucketPolicyCommand, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
|
|
8
|
-
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
|
9
|
-
//#region ../../packages/hosting/dist/index.mjs
|
|
10
|
-
const PROJECT_SERVER_PORT = 3e3;
|
|
11
|
-
const PROJECT_SERVER_ROOT = "/app";
|
|
12
|
-
const PROJECT_SERVER_FRAMEWORK_NODE_MODULES = `/opt/keystroke/node_modules`;
|
|
13
|
-
const PROJECT_SERVER_HEALTH = {
|
|
14
|
-
path: "/health",
|
|
15
|
-
port: PROJECT_SERVER_PORT
|
|
16
|
-
};
|
|
17
|
-
const RUNTIME_ENV_KEYS = [
|
|
18
|
-
"BETTER_AUTH_SECRET",
|
|
19
|
-
"PUBLIC_SERVER_URL",
|
|
20
|
-
"PUBLIC_WEB_URL",
|
|
21
|
-
"POSTGRES_SSL",
|
|
22
|
-
"KEYSTROKE_SCHEDULER_MODULE",
|
|
23
|
-
"UPSTASH_REDIS_URL",
|
|
24
|
-
"REDIS_URL",
|
|
25
|
-
"KEYSTROKE_QUEUE_PREFIX"
|
|
26
|
-
];
|
|
27
|
-
/** Provider and gateway env forwarded from the platform into project servers. */
|
|
28
|
-
const PROVIDER_ENV_KEYS = [
|
|
29
|
-
"ANTHROPIC_API_KEY",
|
|
30
|
-
"OPENAI_API_KEY",
|
|
31
|
-
"AI_GATEWAY_API_KEY",
|
|
32
|
-
"AI_GATEWAY_BASE_URL"
|
|
33
|
-
];
|
|
34
|
-
/** Shared dev token when `PLATFORM_WORKER_TOKEN` is unset (non-production only). */
|
|
35
|
-
const DEV_PLATFORM_WORKER_TOKEN = "dev-platform-worker-token";
|
|
36
|
-
/** Per-project postgres env injected into every project server container/machine. */
|
|
37
|
-
function projectDatabaseRuntimeEnv(database) {
|
|
38
|
-
return {
|
|
39
|
-
POSTGRES_HOST: rewriteLoopbackHost(database.host),
|
|
40
|
-
POSTGRES_PORT: String(database.port),
|
|
41
|
-
POSTGRES_DB: database.database,
|
|
42
|
-
POSTGRES_USER: database.user,
|
|
43
|
-
POSTGRES_PASSWORD: database.password,
|
|
44
|
-
DATABASE_SEARCH_PATH: database.searchPath
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Builds the launch spec for a single project server. `artifactStorageKey` is the
|
|
49
|
-
* object key for that deploy's built `dist` tarball in the org bucket — there is
|
|
50
|
-
* no base image, so it is required.
|
|
51
|
-
*/
|
|
52
|
-
function resolveRuntimeLaunch(options, artifactStorageKey, database, extraEnv) {
|
|
53
|
-
if (!artifactStorageKey) throw new Error("Cannot start a project server without an artifact storage key");
|
|
54
|
-
const env = options.env ?? process.env;
|
|
55
|
-
return {
|
|
56
|
-
image: resolveProjectServerImage(env, options.image),
|
|
57
|
-
env: buildRuntimeEnv(env, artifactStorageKey, database, extraEnv),
|
|
58
|
-
port: PROJECT_SERVER_PORT,
|
|
59
|
-
health: PROJECT_SERVER_HEALTH
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/** Env vars passed into the project server container/machine. */
|
|
63
|
-
function buildRuntimeEnv(source, artifactStorageKey, database, extraEnv) {
|
|
64
|
-
const entries = new Map([
|
|
65
|
-
["PORT", String(PROJECT_SERVER_PORT)],
|
|
66
|
-
["KEYSTROKE_ROOT", PROJECT_SERVER_ROOT],
|
|
67
|
-
["KEYSTROKE_RUNTIME_NODE_MODULES", PROJECT_SERVER_FRAMEWORK_NODE_MODULES],
|
|
68
|
-
["ARTIFACT_STORAGE_KEY", artifactStorageKey],
|
|
69
|
-
["PROJECT_ID", database.projectId],
|
|
70
|
-
["ORGANIZATION_ID", database.organizationId],
|
|
71
|
-
["TENANT_ID", database.organizationId]
|
|
72
|
-
]);
|
|
73
|
-
for (const key of RUNTIME_ENV_KEYS) {
|
|
74
|
-
const value = source[key]?.trim();
|
|
75
|
-
if (!value) {
|
|
76
|
-
if (key === "POSTGRES_SSL") throw new Error("POSTGRES_SSL is required");
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
entries.set(key, value);
|
|
80
|
-
}
|
|
81
|
-
if (!extraEnv) for (const key of PROVIDER_ENV_KEYS) {
|
|
82
|
-
const value = source[key]?.trim();
|
|
83
|
-
if (value) entries.set(key, value);
|
|
84
|
-
}
|
|
85
|
-
const worker = resolveWorkerRuntimeConfig(source);
|
|
86
|
-
entries.set("PLATFORM_URL", worker.platformUrl);
|
|
87
|
-
entries.set("WORKER_INTERNAL_TOKEN", worker.workerToken);
|
|
88
|
-
for (const [key, value] of Object.entries(projectDatabaseRuntimeEnv(database))) entries.set(key, value);
|
|
89
|
-
if (extraEnv) for (const [key, value] of Object.entries(extraEnv)) entries.set(key, value);
|
|
90
|
-
return Object.fromEntries(entries);
|
|
91
|
-
}
|
|
92
|
-
function resolvePlatformWorkerToken(source = process.env) {
|
|
93
|
-
const explicit = source.PLATFORM_WORKER_TOKEN?.trim() ?? source.WORKER_INTERNAL_TOKEN?.trim();
|
|
94
|
-
if (explicit) return explicit;
|
|
95
|
-
if (source.NODE_ENV === "production") return;
|
|
96
|
-
return DEV_PLATFORM_WORKER_TOKEN;
|
|
97
|
-
}
|
|
98
|
-
/** Platform API URL reachable from a project-server container. */
|
|
99
|
-
const DEV_PLATFORM_URL = "http://localhost:3002";
|
|
100
|
-
function resolveWorkerPlatformUrl(source = process.env) {
|
|
101
|
-
const raw = source.PLATFORM_URL?.trim() ?? source.PUBLIC_PLATFORM_URL?.trim() ?? (source.NODE_ENV === "production" ? void 0 : DEV_PLATFORM_URL);
|
|
102
|
-
if (!raw) return;
|
|
103
|
-
return rewriteLoopbackUrl(raw);
|
|
104
|
-
}
|
|
105
|
-
/** Rewrite loopback hosts so containers can reach Postgres and other host services. */
|
|
106
|
-
function rewriteLoopbackHost(host) {
|
|
107
|
-
if (host === "localhost" || host === "127.0.0.1") return "host.docker.internal";
|
|
108
|
-
return host;
|
|
109
|
-
}
|
|
110
|
-
function rewriteLoopbackUrl(url) {
|
|
111
|
-
try {
|
|
112
|
-
const parsed = new URL(url);
|
|
113
|
-
parsed.hostname = rewriteLoopbackHost(parsed.hostname);
|
|
114
|
-
return parsed.toString().replace(/\/$/, "");
|
|
115
|
-
} catch {
|
|
116
|
-
return url;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/** dockerode expects `KEY=value` strings. */
|
|
120
|
-
function formatDockerEnv(env) {
|
|
121
|
-
return Object.entries(env).map(([key, value]) => `${key}=${value}`);
|
|
122
|
-
}
|
|
123
|
-
function resolveProjectServerImage(env = process.env, override) {
|
|
124
|
-
return override ?? env.PROJECT_DOCKER_IMAGE ?? env.TENANT_DOCKER_IMAGE ?? "keystroke/project-server:local";
|
|
125
|
-
}
|
|
126
|
-
var WorkerRuntimeConfigError = class extends Error {
|
|
127
|
-
missing;
|
|
128
|
-
constructor(missing) {
|
|
129
|
-
super(`Worker runtime config incomplete (missing: ${missing.join(", ")}). In production set PLATFORM_WORKER_TOKEN and PUBLIC_PLATFORM_URL (or PLATFORM_URL).`);
|
|
130
|
-
this.name = "WorkerRuntimeConfigError";
|
|
131
|
-
this.missing = missing;
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
/** Fail fast when the platform cannot start worker-mode project servers. */
|
|
135
|
-
function resolveWorkerRuntimeConfig(source = process.env) {
|
|
136
|
-
const platformUrl = resolveWorkerPlatformUrl(source);
|
|
137
|
-
const workerToken = resolvePlatformWorkerToken(source);
|
|
138
|
-
const missing = [];
|
|
139
|
-
if (!platformUrl) missing.push("PUBLIC_PLATFORM_URL or PLATFORM_URL");
|
|
140
|
-
if (!workerToken) missing.push("PLATFORM_WORKER_TOKEN");
|
|
141
|
-
if (missing.length > 0) throw new WorkerRuntimeConfigError(missing);
|
|
142
|
-
return {
|
|
143
|
-
platformUrl,
|
|
144
|
-
workerToken
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
const DEFAULT_TIMEOUT_MS = 12e4;
|
|
148
|
-
const DEFAULT_INTERVAL_MS = 500;
|
|
149
|
-
async function waitForHealth(baseUrl, options = {}) {
|
|
150
|
-
const fetchImpl = options.fetchImpl ?? fetch;
|
|
151
|
-
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
152
|
-
const intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
153
|
-
const deadline = Date.now() + timeoutMs;
|
|
154
|
-
const url = new URL(PROJECT_SERVER_HEALTH.path, baseUrl);
|
|
155
|
-
while (Date.now() < deadline) {
|
|
156
|
-
try {
|
|
157
|
-
if ((await fetchImpl(url, { signal: AbortSignal.timeout(2e3) })).ok) return;
|
|
158
|
-
} catch {}
|
|
159
|
-
await sleep(intervalMs);
|
|
160
|
-
}
|
|
161
|
-
throw new Error(`Project server health check timed out after ${timeoutMs}ms (${url})`);
|
|
162
|
-
}
|
|
163
|
-
function sleep(ms) {
|
|
164
|
-
return new Promise((resolve) => {
|
|
165
|
-
setTimeout(resolve, ms);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
const MINIO_DOCKER_NETWORK = process.env.MINIO_DOCKER_NETWORK ?? "keystroke";
|
|
169
|
-
function createDockerRuntime(options = {}) {
|
|
170
|
-
const docker = options.docker ?? new Docker();
|
|
171
|
-
return { async start(input) {
|
|
172
|
-
const launch = resolveRuntimeLaunch(options, input.artifactStorageKey, input.database, input.env);
|
|
173
|
-
await ensureImage(docker, launch.image);
|
|
174
|
-
await removeExistingContainer(docker, input.projectId);
|
|
175
|
-
const container = await docker.createContainer({
|
|
176
|
-
Image: launch.image,
|
|
177
|
-
name: containerName(input.projectId),
|
|
178
|
-
Labels: {
|
|
179
|
-
"keystroke.project.id": input.projectId,
|
|
180
|
-
"keystroke.project.name": input.name
|
|
181
|
-
},
|
|
182
|
-
ExposedPorts: { [`${launch.port}/tcp`]: {} },
|
|
183
|
-
HostConfig: {
|
|
184
|
-
ExtraHosts: ["host.docker.internal:host-gateway"],
|
|
185
|
-
PortBindings: { [`${launch.port}/tcp`]: [{ HostPort: "0" }] }
|
|
186
|
-
},
|
|
187
|
-
NetworkingConfig: { EndpointsConfig: { [MINIO_DOCKER_NETWORK]: {} } },
|
|
188
|
-
Env: formatDockerEnv(launch.env)
|
|
189
|
-
});
|
|
190
|
-
await container.start();
|
|
191
|
-
const inspect = await container.inspect();
|
|
192
|
-
const binding = inspect.NetworkSettings.Ports?.[`${launch.port}/tcp`]?.[0];
|
|
193
|
-
if (!binding?.HostPort) throw new Error("Failed to resolve project container host port");
|
|
194
|
-
const baseUrl = `http://127.0.0.1:${binding.HostPort}`;
|
|
195
|
-
await waitForHealth(baseUrl, {
|
|
196
|
-
fetchImpl: options.fetchImpl,
|
|
197
|
-
timeoutMs: options.healthTimeoutMs
|
|
198
|
-
});
|
|
199
|
-
return {
|
|
200
|
-
runtimeId: inspect.Id,
|
|
201
|
-
baseUrl
|
|
202
|
-
};
|
|
203
|
-
} };
|
|
204
|
-
}
|
|
205
|
-
function containerName(projectId) {
|
|
206
|
-
return `keystroke-project-${projectId}`;
|
|
207
|
-
}
|
|
208
|
-
async function removeExistingContainer(docker, projectId) {
|
|
209
|
-
try {
|
|
210
|
-
const existing = docker.getContainer(containerName(projectId));
|
|
211
|
-
await existing.stop({ t: 5 }).catch(() => void 0);
|
|
212
|
-
await existing.remove({ force: true });
|
|
213
|
-
} catch {}
|
|
214
|
-
}
|
|
215
|
-
async function ensureImage(docker, image) {
|
|
216
|
-
try {
|
|
217
|
-
await docker.getImage(image).inspect();
|
|
218
|
-
return;
|
|
219
|
-
} catch {}
|
|
220
|
-
await new Promise((resolvePromise, reject) => {
|
|
221
|
-
docker.pull(image, (error, stream) => {
|
|
222
|
-
if (error) {
|
|
223
|
-
reject(error);
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
if (!stream) {
|
|
227
|
-
reject(/* @__PURE__ */ new Error(`Failed to pull image ${image}`));
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
docker.modem.followProgress(stream, (progressError) => {
|
|
231
|
-
if (progressError) {
|
|
232
|
-
reject(progressError);
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
resolvePromise();
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
function dockerPlugin(options = {}) {
|
|
241
|
-
const env = options.env ?? process.env;
|
|
242
|
-
return {
|
|
243
|
-
name: "docker",
|
|
244
|
-
workerRuntime: resolveWorkerRuntimeConfig(env),
|
|
245
|
-
createRuntime: () => createDockerRuntime({
|
|
246
|
-
...options,
|
|
247
|
-
env
|
|
248
|
-
})
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
/** Local Docker hosting — default for platform and dev. */
|
|
252
|
-
function defaultHostingPlugin(options = {}) {
|
|
253
|
-
return dockerPlugin(options);
|
|
254
|
-
}
|
|
255
|
-
async function pingProject(baseUrl, options = {}) {
|
|
256
|
-
const timeoutMs = options.timeoutMs ?? 15e3;
|
|
257
|
-
const headers = options.plugin?.pingRequestHeaders?.(options.runtimeId ?? null) ?? {};
|
|
258
|
-
try {
|
|
259
|
-
return (await (options.fetchImpl ?? fetch)(new URL(PROJECT_SERVER_HEALTH.path, baseUrl), {
|
|
260
|
-
signal: AbortSignal.timeout(timeoutMs),
|
|
261
|
-
headers
|
|
262
|
-
})).ok;
|
|
263
|
-
} catch {
|
|
264
|
-
return false;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
function canPingProjectTarget(target, plugin) {
|
|
268
|
-
if (plugin?.canPingTarget) return plugin.canPingTarget(target);
|
|
269
|
-
return !!target.baseUrl;
|
|
270
|
-
}
|
|
271
|
-
async function pingProjectTarget(target, options = {}) {
|
|
272
|
-
if (!canPingProjectTarget(target, options.plugin)) return false;
|
|
273
|
-
return pingProject(target.baseUrl, {
|
|
274
|
-
...options,
|
|
275
|
-
runtimeId: target.runtimeId
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
//#endregion
|
|
279
|
-
//#region ../../packages/shared/dist/index.mjs
|
|
280
|
-
const ACTIVE_ORG_HEADER = "x-keystroke-org-id";
|
|
281
|
-
/** Auth, session, and account-entry URL segments. */
|
|
282
|
-
const AUTH_ACCOUNT_SLUGS = [
|
|
283
|
-
"2fa",
|
|
284
|
-
"accept-invite",
|
|
285
|
-
"auth",
|
|
286
|
-
"authorize",
|
|
287
|
-
"callback",
|
|
288
|
-
"callbacks",
|
|
289
|
-
"confirm-email",
|
|
290
|
-
"confirmation",
|
|
291
|
-
"connect",
|
|
292
|
-
"device",
|
|
293
|
-
"email-verification",
|
|
294
|
-
"forgot-password",
|
|
295
|
-
"invite",
|
|
296
|
-
"invites",
|
|
297
|
-
"login",
|
|
298
|
-
"logout",
|
|
299
|
-
"magic-link",
|
|
300
|
-
"mfa",
|
|
301
|
-
"oauth",
|
|
302
|
-
"onboarding",
|
|
303
|
-
"password",
|
|
304
|
-
"recovery",
|
|
305
|
-
"register",
|
|
306
|
-
"reset-password",
|
|
307
|
-
"saml",
|
|
308
|
-
"session",
|
|
309
|
-
"sessions",
|
|
310
|
-
"sign-in",
|
|
311
|
-
"sign-up",
|
|
312
|
-
"signin",
|
|
313
|
-
"signout",
|
|
314
|
-
"signup",
|
|
315
|
-
"sso",
|
|
316
|
-
"token",
|
|
317
|
-
"tokens",
|
|
318
|
-
"unlink",
|
|
319
|
-
"verify",
|
|
320
|
-
"verify-email"
|
|
321
|
-
];
|
|
322
|
-
/** Org, workspace, billing, and account-management URL segments. */
|
|
323
|
-
const ORG_ACCOUNT_SLUGS = [
|
|
324
|
-
"account",
|
|
325
|
-
"accounts",
|
|
326
|
-
"billing",
|
|
327
|
-
"console",
|
|
328
|
-
"invoice",
|
|
329
|
-
"invoices",
|
|
330
|
-
"member",
|
|
331
|
-
"members",
|
|
332
|
-
"me",
|
|
333
|
-
"org",
|
|
334
|
-
"organization",
|
|
335
|
-
"organizations",
|
|
336
|
-
"orgs",
|
|
337
|
-
"payment",
|
|
338
|
-
"payments",
|
|
339
|
-
"plan",
|
|
340
|
-
"plans",
|
|
341
|
-
"portal",
|
|
342
|
-
"preferences",
|
|
343
|
-
"profile",
|
|
344
|
-
"settings",
|
|
345
|
-
"subscription",
|
|
346
|
-
"subscriptions",
|
|
347
|
-
"team",
|
|
348
|
-
"teams",
|
|
349
|
-
"upgrade",
|
|
350
|
-
"usage",
|
|
351
|
-
"user",
|
|
352
|
-
"users",
|
|
353
|
-
"workspace",
|
|
354
|
-
"workspaces"
|
|
355
|
-
];
|
|
356
|
-
/** Product surfaces, resource types, and in-app navigation segments. */
|
|
357
|
-
const PRODUCT_SLUGS = [
|
|
358
|
-
"action",
|
|
359
|
-
"actions",
|
|
360
|
-
"activity",
|
|
361
|
-
"agent",
|
|
362
|
-
"agents",
|
|
363
|
-
"analytics",
|
|
364
|
-
"app",
|
|
365
|
-
"apps",
|
|
366
|
-
"artifact",
|
|
367
|
-
"artifacts",
|
|
368
|
-
"assistant",
|
|
369
|
-
"assistants",
|
|
370
|
-
"audit",
|
|
371
|
-
"audit-log",
|
|
372
|
-
"automation",
|
|
373
|
-
"automations",
|
|
374
|
-
"branch",
|
|
375
|
-
"branches",
|
|
376
|
-
"canvas",
|
|
377
|
-
"chat",
|
|
378
|
-
"chats",
|
|
379
|
-
"connection",
|
|
380
|
-
"connections",
|
|
381
|
-
"create",
|
|
382
|
-
"credential",
|
|
383
|
-
"credentials",
|
|
384
|
-
"dashboard",
|
|
385
|
-
"deployment",
|
|
386
|
-
"deployments",
|
|
387
|
-
"examples",
|
|
388
|
-
"execute",
|
|
389
|
-
"execution",
|
|
390
|
-
"executions",
|
|
391
|
-
"explore",
|
|
392
|
-
"get-started",
|
|
393
|
-
"history",
|
|
394
|
-
"inbox",
|
|
395
|
-
"inspector",
|
|
396
|
-
"integration",
|
|
397
|
-
"integrations",
|
|
398
|
-
"library",
|
|
399
|
-
"logs",
|
|
400
|
-
"marketplace",
|
|
401
|
-
"mcp",
|
|
402
|
-
"mcps",
|
|
403
|
-
"new",
|
|
404
|
-
"notifications",
|
|
405
|
-
"observe",
|
|
406
|
-
"plugin",
|
|
407
|
-
"plugins",
|
|
408
|
-
"primitive",
|
|
409
|
-
"primitives",
|
|
410
|
-
"project",
|
|
411
|
-
"projects",
|
|
412
|
-
"recents",
|
|
413
|
-
"registry",
|
|
414
|
-
"reports",
|
|
415
|
-
"run",
|
|
416
|
-
"runs",
|
|
417
|
-
"runtime",
|
|
418
|
-
"runtimes",
|
|
419
|
-
"sandbox",
|
|
420
|
-
"sandboxes",
|
|
421
|
-
"search",
|
|
422
|
-
"skill",
|
|
423
|
-
"skills",
|
|
424
|
-
"templates",
|
|
425
|
-
"thread",
|
|
426
|
-
"threads",
|
|
427
|
-
"trigger",
|
|
428
|
-
"triggers",
|
|
429
|
-
"version",
|
|
430
|
-
"versions",
|
|
431
|
-
"workflow",
|
|
432
|
-
"workflows"
|
|
433
|
-
];
|
|
434
|
-
/** Marketing, docs, company, and go-to-market URL segments. */
|
|
435
|
-
const MARKETING_SITE_SLUGS = [
|
|
436
|
-
"about",
|
|
437
|
-
"affiliates",
|
|
438
|
-
"ai",
|
|
439
|
-
"announcements",
|
|
440
|
-
"anthropic",
|
|
441
|
-
"blog",
|
|
442
|
-
"book-demo",
|
|
443
|
-
"brand",
|
|
444
|
-
"campaigns",
|
|
445
|
-
"career",
|
|
446
|
-
"careers",
|
|
447
|
-
"case-studies",
|
|
448
|
-
"casestudies",
|
|
449
|
-
"changelog",
|
|
450
|
-
"chatgpt",
|
|
451
|
-
"chrome-extension",
|
|
452
|
-
"claude",
|
|
453
|
-
"codex",
|
|
454
|
-
"community",
|
|
455
|
-
"company",
|
|
456
|
-
"compare",
|
|
457
|
-
"contact",
|
|
458
|
-
"contribute",
|
|
459
|
-
"creators",
|
|
460
|
-
"customers",
|
|
461
|
-
"demo",
|
|
462
|
-
"demos",
|
|
463
|
-
"discord",
|
|
464
|
-
"docs",
|
|
465
|
-
"documentation",
|
|
466
|
-
"download",
|
|
467
|
-
"downloads",
|
|
468
|
-
"dust",
|
|
469
|
-
"emerging-talent",
|
|
470
|
-
"engineering-blog",
|
|
471
|
-
"enterprise",
|
|
472
|
-
"events",
|
|
473
|
-
"experts",
|
|
474
|
-
"extension",
|
|
475
|
-
"faq",
|
|
476
|
-
"faqs",
|
|
477
|
-
"features",
|
|
478
|
-
"forum",
|
|
479
|
-
"glean",
|
|
480
|
-
"grok",
|
|
481
|
-
"guide",
|
|
482
|
-
"guides",
|
|
483
|
-
"gumloop",
|
|
484
|
-
"handbook",
|
|
485
|
-
"help",
|
|
486
|
-
"help-center",
|
|
487
|
-
"home",
|
|
488
|
-
"how-it-works",
|
|
489
|
-
"howitworks",
|
|
490
|
-
"inspo",
|
|
491
|
-
"intern",
|
|
492
|
-
"investors",
|
|
493
|
-
"jobs",
|
|
494
|
-
"legal",
|
|
495
|
-
"lindy",
|
|
496
|
-
"llm",
|
|
497
|
-
"llms",
|
|
498
|
-
"love",
|
|
499
|
-
"make",
|
|
500
|
-
"manifesto",
|
|
501
|
-
"media",
|
|
502
|
-
"merch",
|
|
503
|
-
"mission",
|
|
504
|
-
"mobile",
|
|
505
|
-
"models",
|
|
506
|
-
"n8n",
|
|
507
|
-
"news",
|
|
508
|
-
"newsroom",
|
|
509
|
-
"open",
|
|
510
|
-
"open-claw",
|
|
511
|
-
"open-source",
|
|
512
|
-
"openai",
|
|
513
|
-
"our-story",
|
|
514
|
-
"overview",
|
|
515
|
-
"partners",
|
|
516
|
-
"pi",
|
|
517
|
-
"pipedream",
|
|
518
|
-
"platform",
|
|
519
|
-
"press",
|
|
520
|
-
"press-kit",
|
|
521
|
-
"pricing",
|
|
522
|
-
"privacy",
|
|
523
|
-
"product",
|
|
524
|
-
"products",
|
|
525
|
-
"provider",
|
|
526
|
-
"providers",
|
|
527
|
-
"quick-start",
|
|
528
|
-
"quickstart",
|
|
529
|
-
"refer",
|
|
530
|
-
"relay",
|
|
531
|
-
"relay-app",
|
|
532
|
-
"reporting",
|
|
533
|
-
"request-demo",
|
|
534
|
-
"resources",
|
|
535
|
-
"roadmap",
|
|
536
|
-
"schedule-demo",
|
|
537
|
-
"security",
|
|
538
|
-
"solutions",
|
|
539
|
-
"stack-ai",
|
|
540
|
-
"stackai",
|
|
541
|
-
"startup",
|
|
542
|
-
"startups",
|
|
543
|
-
"status",
|
|
544
|
-
"stories",
|
|
545
|
-
"story",
|
|
546
|
-
"students",
|
|
547
|
-
"support",
|
|
548
|
-
"swag",
|
|
549
|
-
"switch",
|
|
550
|
-
"talent",
|
|
551
|
-
"terms",
|
|
552
|
-
"testimonials",
|
|
553
|
-
"thesis",
|
|
554
|
-
"tines",
|
|
555
|
-
"trust",
|
|
556
|
-
"tutorials",
|
|
557
|
-
"university",
|
|
558
|
-
"use-case",
|
|
559
|
-
"use-cases",
|
|
560
|
-
"usecases",
|
|
561
|
-
"versus",
|
|
562
|
-
"vellum",
|
|
563
|
-
"vs",
|
|
564
|
-
"webinars",
|
|
565
|
-
"workato",
|
|
566
|
-
"xai",
|
|
567
|
-
"yc",
|
|
568
|
-
"zapier"
|
|
569
|
-
];
|
|
570
|
-
/** Integrations, competitors, and partner brand slugs (marketing / integration pages). */
|
|
571
|
-
const INTEGRATION_BRAND_SLUGS = [
|
|
572
|
-
"airtable",
|
|
573
|
-
"asana",
|
|
574
|
-
"aws",
|
|
575
|
-
"azure",
|
|
576
|
-
"bun",
|
|
577
|
-
"confluence",
|
|
578
|
-
"copilot",
|
|
579
|
-
"cursor",
|
|
580
|
-
"databricks",
|
|
581
|
-
"figma",
|
|
582
|
-
"firebase",
|
|
583
|
-
"fly",
|
|
584
|
-
"gcp",
|
|
585
|
-
"gemini",
|
|
586
|
-
"github",
|
|
587
|
-
"gitlab",
|
|
588
|
-
"gmail",
|
|
589
|
-
"heroku",
|
|
590
|
-
"hubspot",
|
|
591
|
-
"huggingface",
|
|
592
|
-
"jira",
|
|
593
|
-
"linear",
|
|
594
|
-
"mailchimp",
|
|
595
|
-
"meta",
|
|
596
|
-
"mistral",
|
|
597
|
-
"mixmax",
|
|
598
|
-
"monday",
|
|
599
|
-
"netlify",
|
|
600
|
-
"neon",
|
|
601
|
-
"notion",
|
|
602
|
-
"npm",
|
|
603
|
-
"outlook",
|
|
604
|
-
"outreach",
|
|
605
|
-
"perplexity",
|
|
606
|
-
"planetscale",
|
|
607
|
-
"pnpm",
|
|
608
|
-
"postmark",
|
|
609
|
-
"ramp",
|
|
610
|
-
"railway",
|
|
611
|
-
"render",
|
|
612
|
-
"resend",
|
|
613
|
-
"salesforce",
|
|
614
|
-
"segment",
|
|
615
|
-
"sendgrid",
|
|
616
|
-
"shopify",
|
|
617
|
-
"slack",
|
|
618
|
-
"snowflake",
|
|
619
|
-
"stripe",
|
|
620
|
-
"supabase",
|
|
621
|
-
"terraform",
|
|
622
|
-
"trello",
|
|
623
|
-
"turso",
|
|
624
|
-
"twilio",
|
|
625
|
-
"typeform",
|
|
626
|
-
"vercel",
|
|
627
|
-
"vscode",
|
|
628
|
-
"windsurf",
|
|
629
|
-
"yarn"
|
|
630
|
-
];
|
|
631
|
-
/** Company, team, and department landing-page segments. */
|
|
632
|
-
const COMPANY_TEAM_SLUGS = [
|
|
633
|
-
"engineers",
|
|
634
|
-
"engineering",
|
|
635
|
-
"executives",
|
|
636
|
-
"hc",
|
|
637
|
-
"intern",
|
|
638
|
-
"it",
|
|
639
|
-
"leadership",
|
|
640
|
-
"marketing",
|
|
641
|
-
"ops",
|
|
642
|
-
"revops",
|
|
643
|
-
"sales",
|
|
644
|
-
"services",
|
|
645
|
-
"tech"
|
|
646
|
-
];
|
|
647
|
-
/** Legal, trust, compliance, and policy URL segments. */
|
|
648
|
-
const LEGAL_TRUST_SLUGS = [
|
|
649
|
-
"accessibility",
|
|
650
|
-
"agreement",
|
|
651
|
-
"a11y",
|
|
652
|
-
"bug-bounty",
|
|
653
|
-
"compliance",
|
|
654
|
-
"cookie-policy",
|
|
655
|
-
"cookies",
|
|
656
|
-
"disclose",
|
|
657
|
-
"dpa",
|
|
658
|
-
"eula",
|
|
659
|
-
"gdpr",
|
|
660
|
-
"hipaa",
|
|
661
|
-
"iso",
|
|
662
|
-
"msa",
|
|
663
|
-
"pci",
|
|
664
|
-
"responsible-disclosure",
|
|
665
|
-
"sla",
|
|
666
|
-
"soc2",
|
|
667
|
-
"tos",
|
|
668
|
-
"trust-center",
|
|
669
|
-
"trustcenter",
|
|
670
|
-
"vulnerability"
|
|
671
|
-
];
|
|
672
|
-
/** Developer, API, CLI, and technical URL segments. */
|
|
673
|
-
const DEVELOPER_TECH_SLUGS = [
|
|
674
|
-
"api",
|
|
675
|
-
"api-docs",
|
|
676
|
-
"cli",
|
|
677
|
-
"code",
|
|
678
|
-
"config",
|
|
679
|
-
"developer",
|
|
680
|
-
"developer-tools",
|
|
681
|
-
"developers",
|
|
682
|
-
"dev-tools",
|
|
683
|
-
"devtools",
|
|
684
|
-
"dev",
|
|
685
|
-
"dev-states",
|
|
686
|
-
"graphql",
|
|
687
|
-
"graphql-playground",
|
|
688
|
-
"mcp-server",
|
|
689
|
-
"mcp-servers",
|
|
690
|
-
"openapi",
|
|
691
|
-
"sdk",
|
|
692
|
-
"swagger"
|
|
693
|
-
];
|
|
694
|
-
/** Infra, ops, static assets, and system URL segments. */
|
|
695
|
-
const INFRA_SYSTEM_SLUGS = [
|
|
696
|
-
"acme-challenge",
|
|
697
|
-
"admin",
|
|
698
|
-
"apple-app-site-association",
|
|
699
|
-
"assets",
|
|
700
|
-
"batch",
|
|
701
|
-
"cache",
|
|
702
|
-
"cdn",
|
|
703
|
-
"cron",
|
|
704
|
-
"debug",
|
|
705
|
-
"error",
|
|
706
|
-
"errors",
|
|
707
|
-
"favicon",
|
|
708
|
-
"feed",
|
|
709
|
-
"files",
|
|
710
|
-
"health",
|
|
711
|
-
"healthcheck",
|
|
712
|
-
"healthz",
|
|
713
|
-
"hooks",
|
|
714
|
-
"internal",
|
|
715
|
-
"item",
|
|
716
|
-
"manifest",
|
|
717
|
-
"metrics",
|
|
718
|
-
"null",
|
|
719
|
-
"ping",
|
|
720
|
-
"prod",
|
|
721
|
-
"public",
|
|
722
|
-
"redirect",
|
|
723
|
-
"robots",
|
|
724
|
-
"rpc",
|
|
725
|
-
"rss",
|
|
726
|
-
"sharer",
|
|
727
|
-
"sitemap",
|
|
728
|
-
"staging",
|
|
729
|
-
"static",
|
|
730
|
-
"storage",
|
|
731
|
-
"test",
|
|
732
|
-
"undefined",
|
|
733
|
-
"universal",
|
|
734
|
-
"webhooks",
|
|
735
|
-
"well-known",
|
|
736
|
-
"www"
|
|
737
|
-
];
|
|
738
|
-
/** Reserved slugs that are valid org names in theory but blocked for routing safety. */
|
|
739
|
-
const ROUTING_SAFETY_SLUGS = [
|
|
740
|
-
"alpha",
|
|
741
|
-
"anonymous",
|
|
742
|
-
"archive",
|
|
743
|
-
"archived",
|
|
744
|
-
"beta",
|
|
745
|
-
"clone",
|
|
746
|
-
"copy",
|
|
747
|
-
"default",
|
|
748
|
-
"deleted",
|
|
749
|
-
"demo-org",
|
|
750
|
-
"draft",
|
|
751
|
-
"drafts",
|
|
752
|
-
"duplicate",
|
|
753
|
-
"early-access",
|
|
754
|
-
"embed",
|
|
755
|
-
"embedded",
|
|
756
|
-
"export",
|
|
757
|
-
"fork",
|
|
758
|
-
"free",
|
|
759
|
-
"guest",
|
|
760
|
-
"import",
|
|
761
|
-
"index",
|
|
762
|
-
"list",
|
|
763
|
-
"manage",
|
|
764
|
-
"moderator",
|
|
765
|
-
"newsletter",
|
|
766
|
-
"owner",
|
|
767
|
-
"preview",
|
|
768
|
-
"previews",
|
|
769
|
-
"private",
|
|
770
|
-
"pro",
|
|
771
|
-
"public-api",
|
|
772
|
-
"publish",
|
|
773
|
-
"published",
|
|
774
|
-
"queue",
|
|
775
|
-
"remove",
|
|
776
|
-
"root",
|
|
777
|
-
"sample",
|
|
778
|
-
"samples",
|
|
779
|
-
"selection",
|
|
780
|
-
"share",
|
|
781
|
-
"shared",
|
|
782
|
-
"sponsor",
|
|
783
|
-
"sponsors",
|
|
784
|
-
"sponsorship",
|
|
785
|
-
"subscribe",
|
|
786
|
-
"super",
|
|
787
|
-
"superuser",
|
|
788
|
-
"system",
|
|
789
|
-
"sys",
|
|
790
|
-
"test-org",
|
|
791
|
-
"trash",
|
|
792
|
-
"unpublish",
|
|
793
|
-
"unsubscribe",
|
|
794
|
-
"upload",
|
|
795
|
-
"uploads",
|
|
796
|
-
"waitlist",
|
|
797
|
-
"widget",
|
|
798
|
-
"widgets",
|
|
799
|
-
"worker",
|
|
800
|
-
"workers"
|
|
801
|
-
];
|
|
802
|
-
/**
|
|
803
|
-
* URL segments reserved for global (non-org) routes — cannot be used as an org slug.
|
|
804
|
-
* Prefer adding new entries to the category arrays above; the Set is the enforcement surface.
|
|
805
|
-
*/
|
|
806
|
-
const RESERVED_ORGANIZATION_SLUGS = new Set([
|
|
807
|
-
...AUTH_ACCOUNT_SLUGS,
|
|
808
|
-
...ORG_ACCOUNT_SLUGS,
|
|
809
|
-
...PRODUCT_SLUGS,
|
|
810
|
-
...MARKETING_SITE_SLUGS,
|
|
811
|
-
...INTEGRATION_BRAND_SLUGS,
|
|
812
|
-
...COMPANY_TEAM_SLUGS,
|
|
813
|
-
...LEGAL_TRUST_SLUGS,
|
|
814
|
-
...DEVELOPER_TECH_SLUGS,
|
|
815
|
-
...INFRA_SYSTEM_SLUGS,
|
|
816
|
-
...ROUTING_SAFETY_SLUGS
|
|
817
|
-
]);
|
|
818
|
-
/**
|
|
819
|
-
* Base slug format: lowercase, 2-64 chars, alphanumeric + dashes.
|
|
820
|
-
*
|
|
821
|
-
* IMPORTANT: this is the schema for *reading* slugs (persisted rows, API
|
|
822
|
-
* responses). It intentionally does NOT enforce the reserved-name list — an org
|
|
823
|
-
* created before a name became reserved must still parse on read. Use
|
|
824
|
-
* `ClaimableOrganizationSlugSchema` to validate slugs a user is trying to claim.
|
|
825
|
-
*/
|
|
826
|
-
const OrganizationSlugSchema = z.string().trim().toLowerCase().min(2, "Slug must be at least 2 characters").max(64, "Slug must be at most 64 characters").regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, "Use lowercase letters, numbers, and dashes only");
|
|
827
|
-
/**
|
|
828
|
-
* Slug validation for *claiming* a slug (organization create/rename). Adds the
|
|
829
|
-
* reserved-name check on top of the base format. Never use this to parse
|
|
830
|
-
* existing org data, or pre-existing orgs whose slug later became reserved would
|
|
831
|
-
* fail to load.
|
|
832
|
-
*/
|
|
833
|
-
const ClaimableOrganizationSlugSchema = OrganizationSlugSchema.refine((slug) => !RESERVED_ORGANIZATION_SLUGS.has(slug), "This slug is reserved");
|
|
834
|
-
/** Same format as organization slugs — org-scoped, no global reserved list. */
|
|
835
|
-
const ProjectSlugSchema = OrganizationSlugSchema;
|
|
836
|
-
/** TCP port to bind for a local server, derived from a public URL. */
|
|
837
|
-
function listenPortFromUrl(url, fallback) {
|
|
838
|
-
const parsed = new URL(url);
|
|
839
|
-
if (parsed.port) {
|
|
840
|
-
const port = Number(parsed.port);
|
|
841
|
-
if (Number.isFinite(port) && port > 0) return port;
|
|
842
|
-
}
|
|
843
|
-
if (parsed.protocol === "https:") return 443;
|
|
844
|
-
if (parsed.protocol === "http:") return 80;
|
|
845
|
-
return fallback;
|
|
846
|
-
}
|
|
847
|
-
/** Shorthand: listen port from `PUBLIC_*_URL` or fallback. */
|
|
848
|
-
function listenPortFromPublicUrl(value, fallback) {
|
|
849
|
-
const trimmed = value?.trim();
|
|
850
|
-
if (!trimmed) return fallback;
|
|
851
|
-
try {
|
|
852
|
-
return listenPortFromUrl(trimmed, fallback);
|
|
853
|
-
} catch {
|
|
854
|
-
return fallback;
|
|
855
|
-
}
|
|
856
|
-
}
|
|
857
|
-
/** On-disk path under the project root (packed in deploy artifacts when present). */
|
|
858
|
-
const ROUTE_MANIFEST_REL_PATH = "dist/.keystroke/route-manifest.json";
|
|
859
|
-
const StoredRouteManifestSkillSchema = z.object({
|
|
860
|
-
slug: z.string(),
|
|
861
|
-
name: z.string().optional(),
|
|
862
|
-
description: z.string().optional(),
|
|
863
|
-
moduleFile: z.string()
|
|
864
|
-
});
|
|
865
|
-
const serializedRouteManifestEntrySchema = z.discriminatedUnion("kind", [
|
|
866
|
-
z.object({
|
|
867
|
-
kind: z.literal("health"),
|
|
868
|
-
method: z.literal("GET"),
|
|
869
|
-
path: z.literal("/health")
|
|
870
|
-
}),
|
|
871
|
-
z.object({
|
|
872
|
-
kind: z.literal("agent"),
|
|
873
|
-
method: z.literal("POST"),
|
|
874
|
-
path: z.string(),
|
|
875
|
-
agentSlug: z.string(),
|
|
876
|
-
moduleFile: z.string(),
|
|
877
|
-
name: z.string().optional(),
|
|
878
|
-
description: z.string().optional(),
|
|
879
|
-
model: z.string(),
|
|
880
|
-
systemPrompt: z.string(),
|
|
881
|
-
toolCount: z.number().int().nonnegative(),
|
|
882
|
-
credentialCount: z.number().int().nonnegative(),
|
|
883
|
-
requestSchema: z.record(z.string(), z.unknown()),
|
|
884
|
-
responseSchema: z.record(z.string(), z.unknown())
|
|
885
|
-
}),
|
|
886
|
-
z.object({
|
|
887
|
-
kind: z.literal("agent-sessions-list"),
|
|
888
|
-
method: z.literal("GET"),
|
|
889
|
-
path: z.string(),
|
|
890
|
-
agentSlug: z.string(),
|
|
891
|
-
moduleFile: z.string()
|
|
892
|
-
}),
|
|
893
|
-
z.object({
|
|
894
|
-
kind: z.literal("agent-session-detail"),
|
|
895
|
-
method: z.literal("GET"),
|
|
896
|
-
path: z.string(),
|
|
897
|
-
agentSlug: z.string(),
|
|
898
|
-
moduleFile: z.string()
|
|
899
|
-
}),
|
|
900
|
-
z.object({
|
|
901
|
-
kind: z.literal("workflow"),
|
|
902
|
-
method: z.literal("POST"),
|
|
903
|
-
path: z.string(),
|
|
904
|
-
workflowSlug: z.string(),
|
|
905
|
-
workflowName: z.string().optional(),
|
|
906
|
-
description: z.string().optional(),
|
|
907
|
-
subscribable: z.boolean(),
|
|
908
|
-
moduleFile: z.string(),
|
|
909
|
-
requestSchema: z.record(z.string(), z.unknown()),
|
|
910
|
-
responseSchema: z.record(z.string(), z.unknown())
|
|
911
|
-
}),
|
|
912
|
-
z.object({
|
|
913
|
-
kind: z.literal("workflow-runs-list"),
|
|
914
|
-
method: z.literal("GET"),
|
|
915
|
-
path: z.string(),
|
|
916
|
-
workflowSlug: z.string(),
|
|
917
|
-
workflowName: z.string().optional(),
|
|
918
|
-
moduleFile: z.string()
|
|
919
|
-
}),
|
|
920
|
-
z.object({
|
|
921
|
-
kind: z.literal("workflow-run-detail"),
|
|
922
|
-
method: z.literal("GET"),
|
|
923
|
-
path: z.string(),
|
|
924
|
-
workflowSlug: z.string(),
|
|
925
|
-
workflowName: z.string().optional(),
|
|
926
|
-
moduleFile: z.string()
|
|
927
|
-
}),
|
|
928
|
-
z.object({
|
|
929
|
-
kind: z.literal("trigger-webhook"),
|
|
930
|
-
method: z.literal("POST"),
|
|
931
|
-
path: z.string(),
|
|
932
|
-
attachmentIds: z.array(z.string()),
|
|
933
|
-
moduleFile: z.string(),
|
|
934
|
-
requestSchema: z.record(z.string(), z.unknown()),
|
|
935
|
-
attachmentSchemas: z.record(z.string(), z.object({
|
|
936
|
-
requestSchema: z.record(z.string(), z.unknown()),
|
|
937
|
-
filterSchema: z.record(z.string(), z.unknown()).optional()
|
|
938
|
-
})),
|
|
939
|
-
responseSchema: z.record(z.string(), z.unknown())
|
|
940
|
-
}),
|
|
941
|
-
z.object({
|
|
942
|
-
kind: z.literal("trigger-poll"),
|
|
943
|
-
method: z.literal("POST"),
|
|
944
|
-
path: z.string(),
|
|
945
|
-
attachmentId: z.string(),
|
|
946
|
-
moduleFile: z.string(),
|
|
947
|
-
schedule: z.string(),
|
|
948
|
-
responseSchema: z.record(z.string(), z.unknown())
|
|
949
|
-
}),
|
|
950
|
-
z.object({
|
|
951
|
-
kind: z.literal("trigger-poll-group"),
|
|
952
|
-
method: z.literal("POST"),
|
|
953
|
-
path: z.string(),
|
|
954
|
-
pollId: z.string(),
|
|
955
|
-
attachmentIds: z.array(z.string()),
|
|
956
|
-
moduleFile: z.string(),
|
|
957
|
-
schedule: z.string(),
|
|
958
|
-
responseSchema: z.record(z.string(), z.unknown())
|
|
959
|
-
}),
|
|
960
|
-
z.object({
|
|
961
|
-
kind: z.literal("trigger-runs-list"),
|
|
962
|
-
method: z.literal("GET"),
|
|
963
|
-
path: z.string(),
|
|
964
|
-
attachmentId: z.string(),
|
|
965
|
-
moduleFile: z.string()
|
|
966
|
-
}),
|
|
967
|
-
z.object({
|
|
968
|
-
kind: z.literal("trigger-run-detail"),
|
|
969
|
-
method: z.literal("GET"),
|
|
970
|
-
path: z.string(),
|
|
971
|
-
attachmentId: z.string(),
|
|
972
|
-
moduleFile: z.string()
|
|
973
|
-
}),
|
|
974
|
-
z.object({
|
|
975
|
-
kind: z.literal("cron-schedule"),
|
|
976
|
-
attachmentId: z.string(),
|
|
977
|
-
moduleFile: z.string(),
|
|
978
|
-
schedule: z.string()
|
|
979
|
-
}),
|
|
980
|
-
z.object({
|
|
981
|
-
kind: z.literal("plugin"),
|
|
982
|
-
method: z.enum([
|
|
983
|
-
"GET",
|
|
984
|
-
"POST",
|
|
985
|
-
"PUT",
|
|
986
|
-
"PATCH",
|
|
987
|
-
"DELETE"
|
|
988
|
-
]),
|
|
989
|
-
path: z.string(),
|
|
990
|
-
plugin: z.string()
|
|
991
|
-
})
|
|
992
|
-
]);
|
|
993
|
-
const StoredRouteManifestSchema = z.object({
|
|
994
|
-
version: z.literal(1),
|
|
995
|
-
entries: z.array(serializedRouteManifestEntrySchema),
|
|
996
|
-
skills: z.array(StoredRouteManifestSkillSchema).default([]),
|
|
997
|
-
integrations: z.array(z.string()).optional()
|
|
998
|
-
});
|
|
999
|
-
function parseStoredRouteManifest(value) {
|
|
1000
|
-
return StoredRouteManifestSchema.parse(value);
|
|
1001
|
-
}
|
|
1002
|
-
/** Messaging platforms that support agent gateway bindings. */
|
|
1003
|
-
const ChannelPlatformKeySchema = z.enum(["slack"]);
|
|
1004
|
-
const ChannelReactionSupportSchema = z.enum([
|
|
1005
|
-
"full",
|
|
1006
|
-
"read-only",
|
|
1007
|
-
"none"
|
|
1008
|
-
]);
|
|
1009
|
-
const ChannelCardSupportSchema = z.enum([
|
|
1010
|
-
"full",
|
|
1011
|
-
"partial",
|
|
1012
|
-
"none"
|
|
1013
|
-
]);
|
|
1014
|
-
const ChannelStreamingSupportSchema = z.enum([
|
|
1015
|
-
"native",
|
|
1016
|
-
"post-edit",
|
|
1017
|
-
"buffered",
|
|
1018
|
-
"drafts",
|
|
1019
|
-
"none"
|
|
1020
|
-
]);
|
|
1021
|
-
const ChannelCapabilitiesSchema = z.object({
|
|
1022
|
-
mentions: z.boolean(),
|
|
1023
|
-
reactions: ChannelReactionSupportSchema,
|
|
1024
|
-
cards: ChannelCardSupportSchema,
|
|
1025
|
-
modals: z.boolean(),
|
|
1026
|
-
streaming: ChannelStreamingSupportSchema,
|
|
1027
|
-
dms: z.boolean()
|
|
1028
|
-
});
|
|
1029
|
-
const ChannelListenModeSchema = z.enum([
|
|
1030
|
-
"mention",
|
|
1031
|
-
"all",
|
|
1032
|
-
"dm"
|
|
1033
|
-
]);
|
|
1034
|
-
const ChannelBindingKindSchema = z.enum([
|
|
1035
|
-
"public",
|
|
1036
|
-
"private",
|
|
1037
|
-
"dm",
|
|
1038
|
-
"group",
|
|
1039
|
-
"space"
|
|
1040
|
-
]);
|
|
1041
|
-
const AppGatewaySchema = z.object({
|
|
1042
|
-
capabilities: ChannelCapabilitiesSchema,
|
|
1043
|
-
supportedModes: z.array(ChannelListenModeSchema).min(1),
|
|
1044
|
-
resourceNoun: z.object({
|
|
1045
|
-
singular: z.string().min(1),
|
|
1046
|
-
plural: z.string().min(1)
|
|
1047
|
-
}),
|
|
1048
|
-
supportsChannelDirectory: z.boolean(),
|
|
1049
|
-
webhookPathHint: z.string().min(1),
|
|
1050
|
-
docsUrl: z.string().url().optional(),
|
|
1051
|
-
tagline: z.string().min(1).optional()
|
|
1052
|
-
});
|
|
1053
|
-
z.object({
|
|
1054
|
-
key: ChannelPlatformKeySchema,
|
|
1055
|
-
name: z.string().min(1),
|
|
1056
|
-
appLogoId: z.string().min(1),
|
|
1057
|
-
fallbackDomain: z.string().min(1),
|
|
1058
|
-
description: z.string().min(1),
|
|
1059
|
-
tagline: z.string().min(1),
|
|
1060
|
-
authKind: z.enum(["oauth", "api_key"]),
|
|
1061
|
-
credentialFields: z.array(z.object({
|
|
1062
|
-
key: z.string().min(1),
|
|
1063
|
-
label: z.string().min(1),
|
|
1064
|
-
placeholder: z.string().optional(),
|
|
1065
|
-
helpText: z.string().optional(),
|
|
1066
|
-
type: z.enum([
|
|
1067
|
-
"text",
|
|
1068
|
-
"password",
|
|
1069
|
-
"textarea"
|
|
1070
|
-
]),
|
|
1071
|
-
required: z.boolean(),
|
|
1072
|
-
prefix: z.string().optional()
|
|
1073
|
-
})),
|
|
1074
|
-
capabilities: ChannelCapabilitiesSchema,
|
|
1075
|
-
supportedModes: z.array(ChannelListenModeSchema).min(1),
|
|
1076
|
-
resourceNoun: z.object({
|
|
1077
|
-
singular: z.string().min(1),
|
|
1078
|
-
plural: z.string().min(1)
|
|
1079
|
-
}),
|
|
1080
|
-
webhookPathHint: z.string().min(1),
|
|
1081
|
-
supportsChannelDirectory: z.boolean(),
|
|
1082
|
-
docsUrl: z.string().url().optional()
|
|
1083
|
-
});
|
|
1084
|
-
const ChannelBindingSchema = z.object({
|
|
1085
|
-
id: z.string().min(1),
|
|
1086
|
-
channelId: z.string().min(1),
|
|
1087
|
-
channelName: z.string().min(1),
|
|
1088
|
-
channelKind: ChannelBindingKindSchema,
|
|
1089
|
-
mode: ChannelListenModeSchema,
|
|
1090
|
-
subscribeOnMention: z.boolean(),
|
|
1091
|
-
createdAt: z.string(),
|
|
1092
|
-
updatedAt: z.string()
|
|
1093
|
-
});
|
|
1094
|
-
const ChannelConnectionSchema = z.object({
|
|
1095
|
-
id: z.string().min(1),
|
|
1096
|
-
platform: ChannelPlatformKeySchema,
|
|
1097
|
-
agentId: z.string().min(1),
|
|
1098
|
-
accountLabel: z.string().min(1),
|
|
1099
|
-
accountId: z.string().min(1),
|
|
1100
|
-
connectedAt: z.string(),
|
|
1101
|
-
bindings: z.array(ChannelBindingSchema)
|
|
1102
|
-
});
|
|
1103
|
-
const ChannelDirectoryEntrySchema = z.object({
|
|
1104
|
-
id: z.string().min(1),
|
|
1105
|
-
name: z.string().min(1),
|
|
1106
|
-
kind: ChannelBindingKindSchema,
|
|
1107
|
-
memberCount: z.number().int().nonnegative().optional(),
|
|
1108
|
-
isArchived: z.boolean().optional()
|
|
1109
|
-
});
|
|
1110
|
-
z.object({ connections: z.array(ChannelConnectionSchema) });
|
|
1111
|
-
z.object({ channels: z.array(ChannelDirectoryEntrySchema) });
|
|
1112
|
-
z.object({ teamName: z.string().min(1).optional() });
|
|
1113
|
-
/** OAuth workspace available for channel bindings (e.g. Slack team). */
|
|
1114
|
-
const ChannelAccountSchema = z.object({
|
|
1115
|
-
id: z.string().min(1),
|
|
1116
|
-
platform: ChannelPlatformKeySchema,
|
|
1117
|
-
label: z.string().min(1),
|
|
1118
|
-
connectedAt: z.string()
|
|
1119
|
-
});
|
|
1120
|
-
z.object({ accounts: z.array(ChannelAccountSchema) });
|
|
1121
|
-
const NewChannelBindingInputSchema = z.object({
|
|
1122
|
-
channelId: z.string().min(1),
|
|
1123
|
-
channelName: z.string().min(1),
|
|
1124
|
-
channelKind: ChannelBindingKindSchema.optional(),
|
|
1125
|
-
mode: ChannelListenModeSchema.optional(),
|
|
1126
|
-
subscribeOnMention: z.boolean().optional()
|
|
1127
|
-
});
|
|
1128
|
-
z.object({
|
|
1129
|
-
platform: ChannelPlatformKeySchema,
|
|
1130
|
-
accountId: z.string().min(1),
|
|
1131
|
-
binding: NewChannelBindingInputSchema
|
|
1132
|
-
});
|
|
1133
|
-
z.object({ patch: z.object({
|
|
1134
|
-
mode: ChannelListenModeSchema.optional(),
|
|
1135
|
-
subscribeOnMention: z.boolean().optional()
|
|
1136
|
-
}) });
|
|
1137
|
-
/** A single OAuth scope an app can request, with human copy for connect UI. */
|
|
1138
|
-
const OAuthScopeOptionSchema = z.object({
|
|
1139
|
-
name: z.string().min(1),
|
|
1140
|
-
description: z.string().min(1),
|
|
1141
|
-
defaultSelected: z.boolean().optional(),
|
|
1142
|
-
required: z.boolean().optional()
|
|
1143
|
-
});
|
|
1144
|
-
/** How an app authenticates when connecting credentials. */
|
|
1145
|
-
const AppAuthKindSchema = z.enum([
|
|
1146
|
-
"oauth",
|
|
1147
|
-
"api_key",
|
|
1148
|
-
"keystroke"
|
|
1149
|
-
]);
|
|
1150
|
-
/**
|
|
1151
|
-
* Where app metadata and execution are sourced (e.g. native, composio, pipedream, custom).
|
|
1152
|
-
* Opaque string — cloud/hosted entrypoints choose values; keystroke stays provider-agnostic.
|
|
1153
|
-
*/
|
|
1154
|
-
const AppSourceSchema = z.string().trim().min(1);
|
|
1155
|
-
z.object({
|
|
1156
|
-
slug: z.string().trim().min(1),
|
|
1157
|
-
name: z.string().min(1),
|
|
1158
|
-
description: z.string().min(1),
|
|
1159
|
-
category: z.string().min(1),
|
|
1160
|
-
logo: z.string().url().optional(),
|
|
1161
|
-
authKind: AppAuthKindSchema,
|
|
1162
|
-
oauthScopes: z.array(OAuthScopeOptionSchema)
|
|
1163
|
-
}).extend({ source: AppSourceSchema });
|
|
1164
|
-
z.object({
|
|
1165
|
-
id: z.string().min(1),
|
|
1166
|
-
organizationId: z.string().min(1).nullable(),
|
|
1167
|
-
slug: z.string().min(1),
|
|
1168
|
-
name: z.string().min(1),
|
|
1169
|
-
description: z.string().min(1),
|
|
1170
|
-
category: z.string().min(1),
|
|
1171
|
-
logo: z.string().url().nullable(),
|
|
1172
|
-
authKind: AppAuthKindSchema,
|
|
1173
|
-
oauthScopes: z.array(OAuthScopeOptionSchema),
|
|
1174
|
-
source: AppSourceSchema,
|
|
1175
|
-
createdAt: z.string().min(1),
|
|
1176
|
-
updatedAt: z.string().min(1)
|
|
1177
|
-
});
|
|
1178
|
-
/**
|
|
1179
|
-
* A connectable integration shown in the "Connect an app" picker. An "app" is
|
|
1180
|
-
* an integration / credential set — connected state is whether a credential exists.
|
|
1181
|
-
*/
|
|
1182
|
-
const AppCatalogEntrySchema = z.object({
|
|
1183
|
-
id: z.string().min(1),
|
|
1184
|
-
name: z.string().min(1),
|
|
1185
|
-
description: z.string().min(1),
|
|
1186
|
-
category: z.string().min(1),
|
|
1187
|
-
integrationDescription: z.string().min(1),
|
|
1188
|
-
logo: z.string().url().nullable().optional(),
|
|
1189
|
-
authKind: AppAuthKindSchema,
|
|
1190
|
-
oauthScopes: z.array(OAuthScopeOptionSchema),
|
|
1191
|
-
/** When present, the app supports agent gateway bindings (external channels). */
|
|
1192
|
-
gateway: AppGatewaySchema.optional()
|
|
1193
|
-
});
|
|
1194
|
-
const ListAppsResponseSchema = z.object({ apps: z.array(AppCatalogEntrySchema) });
|
|
1195
|
-
/** How a credential instance is stored (`credential_instances.auth_kind`). */
|
|
1196
|
-
const CredentialAuthKindSchema = z.enum([
|
|
1197
|
-
"api_key",
|
|
1198
|
-
"oauth_managed",
|
|
1199
|
-
"keystroke"
|
|
1200
|
-
]);
|
|
1201
|
-
/**
|
|
1202
|
-
* Where a credential instance is stored (`credential_instances.scope_type`), and the only thing an
|
|
1203
|
-
* action/tool can pin via `.scope(...)`. There is no resolution chain: when no scope is pinned, the
|
|
1204
|
-
* resolver tries the project default, then the org default, then throws.
|
|
1205
|
-
*/
|
|
1206
|
-
const CredentialScopeTypeSchema = z.enum([
|
|
1207
|
-
"organization",
|
|
1208
|
-
"project",
|
|
1209
|
-
"user"
|
|
1210
|
-
]);
|
|
1211
|
-
CredentialAuthKindSchema.options;
|
|
1212
|
-
CredentialScopeTypeSchema.options;
|
|
1213
|
-
/** Human-readable app name from a credential slug (e.g. `google-drive` → `Google Drive`). */
|
|
1214
|
-
function displayCredentialAppName(appId) {
|
|
1215
|
-
return appId.split(/[-_]+/).filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
1216
|
-
}
|
|
1217
|
-
function buildCredentialInstanceLabel(options) {
|
|
1218
|
-
const appName = options.appName.trim();
|
|
1219
|
-
switch (options.scopeType) {
|
|
1220
|
-
case "organization": return `Organization ${appName}`;
|
|
1221
|
-
case "user": return `Personal ${appName}`;
|
|
1222
|
-
case "project": return `${appName} (${options.projectName?.trim() || "Project"})`;
|
|
1223
|
-
default: return options.scopeType;
|
|
1224
|
-
}
|
|
1225
|
-
}
|
|
1226
|
-
/** Pick a label that is unused within a credential scope, suffixing when needed. */
|
|
1227
|
-
function resolveUniqueCredentialInstanceLabel(options) {
|
|
1228
|
-
const taken = new Set([...options.takenLabels].map((label) => label ?? null));
|
|
1229
|
-
if (!taken.has(options.baseLabel)) return options.baseLabel;
|
|
1230
|
-
const disambiguator = options.disambiguator?.trim();
|
|
1231
|
-
if (disambiguator) {
|
|
1232
|
-
const withDisambiguator = `${options.baseLabel} (${disambiguator})`;
|
|
1233
|
-
if (!taken.has(withDisambiguator)) return withDisambiguator;
|
|
1234
|
-
}
|
|
1235
|
-
let suffix = 2;
|
|
1236
|
-
while (taken.has(`${options.baseLabel} (${suffix})`)) suffix += 1;
|
|
1237
|
-
return `${options.baseLabel} (${suffix})`;
|
|
1238
|
-
}
|
|
1239
|
-
/** Scope of a platform app credential (maps to `credential_instances.scope_type`). */
|
|
1240
|
-
const AppCredentialScopeSchema = z.enum([
|
|
1241
|
-
"user",
|
|
1242
|
-
"project",
|
|
1243
|
-
"organization"
|
|
1244
|
-
]);
|
|
1245
|
-
/** How the credential was connected (OAuth vs manual api-key entry). */
|
|
1246
|
-
const AppCredentialConnectionKindSchema = z.enum(["oauth", "manual"]);
|
|
1247
|
-
/** Connect-dialog permission preset for OAuth scope selection. */
|
|
1248
|
-
const OAuthPermissionModeSchema = z.enum(["default", "restricted"]);
|
|
1249
|
-
const optionalTimestamp$1 = z.string().optional();
|
|
1250
|
-
const nullableOptionalTimestamp = z.string().nullable().optional();
|
|
1251
|
-
/**
|
|
1252
|
-
* Summary row for the apps/credentials table and credential detail page.
|
|
1253
|
-
* Plaintext secrets are never returned — only masked `keyPreviews`.
|
|
1254
|
-
*/
|
|
1255
|
-
const AppCredentialSummarySchema = z.object({
|
|
1256
|
-
id: z.string().min(1),
|
|
1257
|
-
appId: z.string().min(1),
|
|
1258
|
-
label: z.string().min(1),
|
|
1259
|
-
scope: AppCredentialScopeSchema,
|
|
1260
|
-
lastRefreshedAt: z.string().nullable(),
|
|
1261
|
-
appName: z.string().min(1).optional(),
|
|
1262
|
-
projectId: z.string().min(1).optional(),
|
|
1263
|
-
projectName: z.string().min(1).optional(),
|
|
1264
|
-
status: z.string().optional(),
|
|
1265
|
-
createdAt: optionalTimestamp$1,
|
|
1266
|
-
lastUsedAt: nullableOptionalTimestamp,
|
|
1267
|
-
isDefault: z.boolean().optional(),
|
|
1268
|
-
connectionKind: AppCredentialConnectionKindSchema.optional(),
|
|
1269
|
-
ownerUserId: z.string().min(1).optional(),
|
|
1270
|
-
ownerName: z.string().min(1).optional(),
|
|
1271
|
-
ownerAvatarUrl: z.string().url().optional(),
|
|
1272
|
-
grantedScopes: z.array(z.string().min(1)).optional(),
|
|
1273
|
-
credentialKeys: z.array(z.string().min(1)).optional(),
|
|
1274
|
-
keyPreviews: z.record(z.string(), z.string()).optional(),
|
|
1275
|
-
expiresAt: optionalTimestamp$1
|
|
1276
|
-
});
|
|
1277
|
-
const credentialSecretValueSchema = z.record(z.string(), z.unknown()).refine((value) => Object.keys(value).length > 0, { message: "value must be a non-empty object" });
|
|
1278
|
-
function hasCredentialTarget(input) {
|
|
1279
|
-
return input.projects.length > 0 || input.createOrganizationCredential || input.createUserProvidedCredential;
|
|
1280
|
-
}
|
|
1281
|
-
function addMissingCredentialTargetIssue(ctx, path = ["projects"]) {
|
|
1282
|
-
ctx.addIssue({
|
|
1283
|
-
code: "custom",
|
|
1284
|
-
message: "At least one credential target is required",
|
|
1285
|
-
path
|
|
1286
|
-
});
|
|
1287
|
-
}
|
|
1288
|
-
/** Target fields shared by create and OAuth start flows. */
|
|
1289
|
-
const CredentialTargetsFieldsSchema = z.object({
|
|
1290
|
-
projects: z.array(z.string().min(1)).default([]),
|
|
1291
|
-
createOrganizationCredential: z.boolean().default(false),
|
|
1292
|
-
createUserProvidedCredential: z.boolean().default(false)
|
|
1293
|
-
});
|
|
1294
|
-
CredentialTargetsFieldsSchema.extend({
|
|
1295
|
-
appId: z.string().min(1),
|
|
1296
|
-
scopes: z.array(z.string().min(1)),
|
|
1297
|
-
permissionMode: OAuthPermissionModeSchema
|
|
1298
|
-
});
|
|
1299
|
-
z.object({
|
|
1300
|
-
status: z.enum(["connected", "redirecting"]),
|
|
1301
|
-
authorizeUrl: z.string().url().nullable()
|
|
1302
|
-
});
|
|
1303
|
-
/** Request body for `POST /api/credentials` (manual api-key fan-out). */
|
|
1304
|
-
const CreateCredentialsRequestSchema = CredentialTargetsFieldsSchema.extend({
|
|
1305
|
-
appId: z.string().min(1),
|
|
1306
|
-
connectionKind: AppCredentialConnectionKindSchema,
|
|
1307
|
-
value: credentialSecretValueSchema.optional(),
|
|
1308
|
-
scopes: z.array(z.string().min(1)).optional()
|
|
1309
|
-
}).superRefine((input, ctx) => {
|
|
1310
|
-
if (!hasCredentialTarget(input)) addMissingCredentialTargetIssue(ctx);
|
|
1311
|
-
if (input.connectionKind === "manual" && !input.value) ctx.addIssue({
|
|
1312
|
-
code: "custom",
|
|
1313
|
-
message: "value is required for manual connections",
|
|
1314
|
-
path: ["value"]
|
|
1315
|
-
});
|
|
1316
|
-
if (input.connectionKind === "oauth") ctx.addIssue({
|
|
1317
|
-
code: "custom",
|
|
1318
|
-
message: "OAuth credentials are created via the OAuth callback",
|
|
1319
|
-
path: ["connectionKind"]
|
|
1320
|
-
});
|
|
1321
|
-
});
|
|
1322
|
-
/** Request body for `PATCH /api/credentials/:id`. */
|
|
1323
|
-
const UpdateCredentialRequestSchema = z.object({
|
|
1324
|
-
label: z.string().trim().min(1).optional(),
|
|
1325
|
-
isDefault: z.boolean().optional(),
|
|
1326
|
-
value: credentialSecretValueSchema.optional()
|
|
1327
|
-
}).refine((input) => input.label !== void 0 || input.isDefault !== void 0 || input.value !== void 0, { message: "At least one field is required" });
|
|
1328
|
-
const ListCredentialsResponseSchema = z.object({ credentials: z.array(AppCredentialSummarySchema) });
|
|
1329
|
-
const GetCredentialResponseSchema = z.object({ credential: AppCredentialSummarySchema });
|
|
1330
|
-
const CreateCredentialsResponseSchema = z.object({ credentials: z.array(AppCredentialSummarySchema) });
|
|
1331
|
-
const McpConnectionStatusSchema = z.enum([
|
|
1332
|
-
"INITIATED",
|
|
1333
|
-
"ACTIVE",
|
|
1334
|
-
"EXPIRED",
|
|
1335
|
-
"FAILED",
|
|
1336
|
-
"INACTIVE",
|
|
1337
|
-
"REVOKED"
|
|
1338
|
-
]);
|
|
1339
|
-
const McpAppSchema = z.object({
|
|
1340
|
-
slug: z.string(),
|
|
1341
|
-
name: z.string(),
|
|
1342
|
-
connected: z.boolean(),
|
|
1343
|
-
connectionId: z.string().optional(),
|
|
1344
|
-
status: McpConnectionStatusSchema.optional()
|
|
1345
|
-
});
|
|
1346
|
-
z.object({ apps: z.array(McpAppSchema) });
|
|
1347
|
-
z.object({
|
|
1348
|
-
connectionId: z.string(),
|
|
1349
|
-
entityId: z.string(),
|
|
1350
|
-
instanceId: z.string()
|
|
1351
|
-
});
|
|
1352
|
-
z.object({
|
|
1353
|
-
app: z.string().trim().min(1),
|
|
1354
|
-
tool: z.string().trim().min(1),
|
|
1355
|
-
arguments: z.record(z.string(), z.unknown()).default({}),
|
|
1356
|
-
/**
|
|
1357
|
-
* Resolved credential instance to execute against. When set, the platform executes that exact
|
|
1358
|
-
* connection (scoped to the caller's org); when omitted it resolves the app's instance by scope.
|
|
1359
|
-
*/
|
|
1360
|
-
instanceId: z.string().trim().min(1).optional(),
|
|
1361
|
-
/** Pinned provider toolkit version, sourced from the app definition; forwarded to the provider. */
|
|
1362
|
-
version: z.string().trim().min(1)
|
|
1363
|
-
});
|
|
1364
|
-
const TeamRequestTypeSchema = z.enum([
|
|
1365
|
-
"org-deletion",
|
|
1366
|
-
"contact",
|
|
1367
|
-
"enterprise-upgrade"
|
|
1368
|
-
]);
|
|
1369
|
-
const SubmitTeamRequestRequestSchema = z.object({
|
|
1370
|
-
type: TeamRequestTypeSchema,
|
|
1371
|
-
message: z.string().trim().max(5e3).optional()
|
|
1372
|
-
});
|
|
1373
|
-
const SubmitTeamRequestResponseSchema = z.object({ ok: z.literal(true) });
|
|
1374
|
-
function isCredentialInput(value) {
|
|
1375
|
-
if (typeof value !== "object" || value === null) return false;
|
|
1376
|
-
const candidate = value;
|
|
1377
|
-
return typeof candidate.key === "string" && CredentialAuthKindSchema.safeParse(candidate.kind).success && candidate.schema instanceof z.ZodType;
|
|
1378
|
-
}
|
|
1379
|
-
const credentialInputSchema = z.custom((value) => isCredentialInput(value), "must be a credential requirement");
|
|
1380
|
-
const PROJECT_SLUG_TAKEN_MESSAGE = "That slug is already taken.";
|
|
1381
|
-
const OrganizationSlugErrorCodeSchema = z.enum([
|
|
1382
|
-
"slug_taken",
|
|
1383
|
-
"slug_reserved",
|
|
1384
|
-
"slug_invalid"
|
|
1385
|
-
]);
|
|
1386
|
-
const SlugAvailabilityReasonSchema = z.enum([
|
|
1387
|
-
"taken",
|
|
1388
|
-
"reserved",
|
|
1389
|
-
"invalid"
|
|
1390
|
-
]);
|
|
1391
|
-
const SlugAvailabilityResponseSchema = z.object({
|
|
1392
|
-
slug: z.string(),
|
|
1393
|
-
available: z.boolean(),
|
|
1394
|
-
reason: SlugAvailabilityReasonSchema.optional(),
|
|
1395
|
-
suggestion: OrganizationSlugSchema.optional()
|
|
1396
|
-
});
|
|
1397
|
-
const SlugAvailabilityQuerySchema = z.object({
|
|
1398
|
-
slug: z.string().trim().min(1),
|
|
1399
|
-
excludeOrganizationId: z.string().min(1).optional()
|
|
1400
|
-
});
|
|
1401
|
-
const ProjectSlugAvailabilityReasonSchema = z.enum(["taken", "invalid"]);
|
|
1402
|
-
const ProjectSlugAvailabilityResponseSchema = z.object({
|
|
1403
|
-
slug: z.string(),
|
|
1404
|
-
available: z.boolean(),
|
|
1405
|
-
reason: ProjectSlugAvailabilityReasonSchema.optional(),
|
|
1406
|
-
suggestion: ProjectSlugSchema.optional()
|
|
1407
|
-
});
|
|
1408
|
-
const ProjectSlugAvailabilityQuerySchema = z.object({
|
|
1409
|
-
slug: z.string().trim().min(1),
|
|
1410
|
-
excludeProjectId: z.string().min(1).optional()
|
|
1411
|
-
});
|
|
1412
|
-
function organizationSlugErrorCodeFromMessage(message) {
|
|
1413
|
-
if (message === "That slug is already taken." || /already taken/i.test(message)) return "slug_taken";
|
|
1414
|
-
if (/reserved/i.test(message)) return "slug_reserved";
|
|
1415
|
-
return "slug_invalid";
|
|
1416
|
-
}
|
|
1417
|
-
const ProjectStatusSchema = z.enum([
|
|
1418
|
-
"inactive",
|
|
1419
|
-
"starting",
|
|
1420
|
-
"active",
|
|
1421
|
-
"failed"
|
|
1422
|
-
]);
|
|
1423
|
-
const OrganizationUserRoleSchema = z.enum([
|
|
1424
|
-
"owner",
|
|
1425
|
-
"admin",
|
|
1426
|
-
"builder"
|
|
1427
|
-
]);
|
|
1428
|
-
const isoDateTime$5 = z.string().datetime();
|
|
1429
|
-
const OrganizationSchema = z.object({
|
|
1430
|
-
id: z.string(),
|
|
1431
|
-
name: z.string(),
|
|
1432
|
-
slug: OrganizationSlugSchema,
|
|
1433
|
-
createdAt: isoDateTime$5,
|
|
1434
|
-
updatedAt: isoDateTime$5
|
|
1435
|
-
});
|
|
1436
|
-
const ProjectSchema = z.object({
|
|
1437
|
-
id: z.string(),
|
|
1438
|
-
organizationId: z.string(),
|
|
1439
|
-
name: z.string(),
|
|
1440
|
-
slug: ProjectSlugSchema,
|
|
1441
|
-
description: z.string().nullable(),
|
|
1442
|
-
status: ProjectStatusSchema,
|
|
1443
|
-
baseUrl: z.string().nullable(),
|
|
1444
|
-
runtimeId: z.string().nullable(),
|
|
1445
|
-
lastError: z.string().nullable(),
|
|
1446
|
-
createdAt: isoDateTime$5,
|
|
1447
|
-
updatedAt: isoDateTime$5
|
|
1448
|
-
});
|
|
1449
|
-
const UserOrganizationSchema = z.object({
|
|
1450
|
-
organization: OrganizationSchema,
|
|
1451
|
-
role: OrganizationUserRoleSchema
|
|
1452
|
-
});
|
|
1453
|
-
const ActiveOrganizationResponseSchema = z.object({ organization: UserOrganizationSchema.nullable() });
|
|
1454
|
-
const ListOrganizationsResponseSchema = z.object({ organizations: z.array(UserOrganizationSchema) });
|
|
1455
|
-
const CreateOrganizationRequestSchema = z.object({
|
|
1456
|
-
name: z.string().trim().min(1),
|
|
1457
|
-
/** Format-only at the wire boundary; reserved-name checks run in platform-database. */
|
|
1458
|
-
slug: OrganizationSlugSchema.optional()
|
|
1459
|
-
});
|
|
1460
|
-
const UpdateOrganizationRequestSchema = z.object({
|
|
1461
|
-
name: z.string().trim().min(1).optional(),
|
|
1462
|
-
slug: ClaimableOrganizationSlugSchema.optional()
|
|
1463
|
-
}).refine((data) => data.name !== void 0 || data.slug !== void 0, { message: "At least one field is required" });
|
|
1464
|
-
const CreateOrganizationResponseSchema = z.object({ organization: UserOrganizationSchema });
|
|
1465
|
-
const ListProjectsResponseSchema = z.object({ projects: z.array(ProjectSchema) });
|
|
1466
|
-
const ProjectListMetricsSchema = z.object({
|
|
1467
|
-
agentCount: z.number(),
|
|
1468
|
-
workflowCount: z.number(),
|
|
1469
|
-
skillCount: z.number(),
|
|
1470
|
-
credentialCount: z.number(),
|
|
1471
|
-
lastDeploymentAt: isoDateTime$5.nullable()
|
|
1472
|
-
});
|
|
1473
|
-
const ListProjectMetricsResponseSchema = z.object({ metrics: z.record(z.string(), ProjectListMetricsSchema) });
|
|
1474
|
-
const CreateProjectRequestSchema = z.object({
|
|
1475
|
-
name: z.string().trim().min(1),
|
|
1476
|
-
description: z.string().trim().min(1).optional()
|
|
1477
|
-
});
|
|
1478
|
-
const UpdateProjectRequestSchema = z.object({
|
|
1479
|
-
name: z.string().trim().min(1).optional(),
|
|
1480
|
-
description: z.string().trim().optional(),
|
|
1481
|
-
slug: ProjectSlugSchema.optional()
|
|
1482
|
-
}).refine((data) => data.name !== void 0 || data.description !== void 0 || data.slug !== void 0, { message: "At least one field is required" });
|
|
1483
|
-
const CreateProjectResponseSchema = z.object({ project: ProjectSchema });
|
|
1484
|
-
const ProjectResponseSchema = z.object({ project: ProjectSchema });
|
|
1485
|
-
const ProjectReachabilityResponseSchema = z.object({ reachable: z.boolean() });
|
|
1486
|
-
const ValidationErrorDetailSchema = z.object({
|
|
1487
|
-
path: z.string(),
|
|
1488
|
-
message: z.string()
|
|
1489
|
-
});
|
|
1490
|
-
/** Machine-readable codes returned in standard API error bodies. */
|
|
1491
|
-
const ErrorResponseCodeSchema = OrganizationSlugErrorCodeSchema.or(z.enum(["needs_org_selection"]));
|
|
1492
|
-
/** Standard JSON error body returned by the HTTP API. */
|
|
1493
|
-
const ErrorResponseSchema = z.object({
|
|
1494
|
-
error: z.string(),
|
|
1495
|
-
code: ErrorResponseCodeSchema.optional(),
|
|
1496
|
-
message: z.string().optional(),
|
|
1497
|
-
details: z.array(ValidationErrorDetailSchema).optional()
|
|
1498
|
-
});
|
|
1499
|
-
/** Build the JSON body for HTTP 400 validation failures. */
|
|
1500
|
-
function validationErrorResponse(error, summary) {
|
|
1501
|
-
return {
|
|
1502
|
-
error: summary,
|
|
1503
|
-
details: error.issues.map((issue) => ({
|
|
1504
|
-
path: issue.path.join("."),
|
|
1505
|
-
message: issue.message
|
|
1506
|
-
}))
|
|
1507
|
-
};
|
|
1508
|
-
}
|
|
1509
|
-
z.object({ message: z.string() });
|
|
1510
|
-
const CredentialRunContextSchema = z.object({
|
|
1511
|
-
orgId: z.string().min(1).optional(),
|
|
1512
|
-
projectId: z.string().min(1).optional(),
|
|
1513
|
-
userId: z.string().min(1).optional(),
|
|
1514
|
-
userIds: z.record(z.string(), z.string()).optional(),
|
|
1515
|
-
selection: z.record(z.string(), z.string()).optional()
|
|
1516
|
-
});
|
|
1517
|
-
const ThinkingLevelSchema = z.enum([
|
|
1518
|
-
"off",
|
|
1519
|
-
"minimal",
|
|
1520
|
-
"low",
|
|
1521
|
-
"medium",
|
|
1522
|
-
"high",
|
|
1523
|
-
"xhigh"
|
|
1524
|
-
]);
|
|
1525
|
-
z.object({
|
|
1526
|
-
message: z.string().min(1),
|
|
1527
|
-
sessionId: z.string().min(1).optional(),
|
|
1528
|
-
subscriptionId: z.string().min(1).optional(),
|
|
1529
|
-
context: CredentialRunContextSchema.optional(),
|
|
1530
|
-
thinkingLevel: ThinkingLevelSchema.optional()
|
|
1531
|
-
});
|
|
1532
|
-
z.object({
|
|
1533
|
-
sessionId: z.string(),
|
|
1534
|
-
messages: z.array(z.record(z.string(), z.unknown())),
|
|
1535
|
-
error: z.string().nullable()
|
|
1536
|
-
});
|
|
1537
|
-
const SkipResponseSchema = z.object({
|
|
1538
|
-
ok: z.literal(true),
|
|
1539
|
-
skipped: z.literal(true)
|
|
1540
|
-
});
|
|
1541
|
-
z.object({ ok: z.literal(true) });
|
|
1542
|
-
z.object({ service: z.string() });
|
|
1543
|
-
const ConnectProviderSchema = z.object({
|
|
1544
|
-
key: z.string(),
|
|
1545
|
-
mode: z.enum(["authorize-url", "browser-redirect"]),
|
|
1546
|
-
path: z.string(),
|
|
1547
|
-
requiresAuth: z.boolean()
|
|
1548
|
-
});
|
|
1549
|
-
z.object({ providers: z.array(ConnectProviderSchema) });
|
|
1550
|
-
z.object({ url: z.string() });
|
|
1551
|
-
z.object({ runId: z.string() });
|
|
1552
|
-
z.object({ sessionId: z.string() });
|
|
1553
|
-
z.object({
|
|
1554
|
-
workflows: z.array(z.string().min(1)).optional(),
|
|
1555
|
-
attachments: z.array(z.string().min(1)).optional()
|
|
1556
|
-
});
|
|
1557
|
-
const PollAttachmentResultSchema = z.object({
|
|
1558
|
-
attachmentKey: z.string(),
|
|
1559
|
-
workflowKey: z.string(),
|
|
1560
|
-
runId: z.string().optional(),
|
|
1561
|
-
body: z.unknown().optional(),
|
|
1562
|
-
queued: z.boolean(),
|
|
1563
|
-
skipped: z.boolean().optional()
|
|
1564
|
-
});
|
|
1565
|
-
const PollRunMultiResponseSchema = z.object({ results: z.array(PollAttachmentResultSchema) });
|
|
1566
|
-
z.union([
|
|
1567
|
-
z.record(z.string(), z.unknown()),
|
|
1568
|
-
PollRunMultiResponseSchema,
|
|
1569
|
-
SkipResponseSchema,
|
|
1570
|
-
z.object({ runId: z.string() })
|
|
1571
|
-
]);
|
|
1572
|
-
const RunSourceKindSchema = z.enum([
|
|
1573
|
-
"api",
|
|
1574
|
-
"trigger",
|
|
1575
|
-
"gateway",
|
|
1576
|
-
"workflow",
|
|
1577
|
-
"agent"
|
|
1578
|
-
]);
|
|
1579
|
-
z.object({
|
|
1580
|
-
kind: RunSourceKindSchema,
|
|
1581
|
-
id: z.string().nullable()
|
|
1582
|
-
});
|
|
1583
|
-
const WorkflowRunStatusSchema = z.enum([
|
|
1584
|
-
"pending",
|
|
1585
|
-
"running",
|
|
1586
|
-
"sleeping",
|
|
1587
|
-
"waiting_hook",
|
|
1588
|
-
"completed",
|
|
1589
|
-
"failed",
|
|
1590
|
-
"canceled"
|
|
1591
|
-
]);
|
|
1592
|
-
const WorkflowRunTriggerSchema = z.enum([
|
|
1593
|
-
"api",
|
|
1594
|
-
"cron",
|
|
1595
|
-
"webhook",
|
|
1596
|
-
"poll",
|
|
1597
|
-
"retry"
|
|
1598
|
-
]);
|
|
1599
|
-
z.enum([
|
|
1600
|
-
"run_started",
|
|
1601
|
-
"step_completed",
|
|
1602
|
-
"step_failed",
|
|
1603
|
-
"step_retrying",
|
|
1604
|
-
"sleep_scheduled",
|
|
1605
|
-
"sleep_completed",
|
|
1606
|
-
"hook_created",
|
|
1607
|
-
"hook_resumed",
|
|
1608
|
-
"run_completed",
|
|
1609
|
-
"run_failed",
|
|
1610
|
-
"run_canceled"
|
|
1611
|
-
]);
|
|
1612
|
-
const WorkflowRunSummarySchema = z.object({
|
|
1613
|
-
id: z.string(),
|
|
1614
|
-
status: WorkflowRunStatusSchema,
|
|
1615
|
-
trigger: WorkflowRunTriggerSchema,
|
|
1616
|
-
triggeredAt: z.string(),
|
|
1617
|
-
startedAt: z.string().nullable(),
|
|
1618
|
-
finishedAt: z.string().nullable(),
|
|
1619
|
-
sourceKind: RunSourceKindSchema,
|
|
1620
|
-
sourceId: z.string().nullable(),
|
|
1621
|
-
triggerRunId: z.string().nullable(),
|
|
1622
|
-
attachmentId: z.string().nullable()
|
|
1623
|
-
});
|
|
1624
|
-
const WorkflowRunRecordSchema = z.object({
|
|
1625
|
-
id: z.string(),
|
|
1626
|
-
workflowSlug: z.string(),
|
|
1627
|
-
status: WorkflowRunStatusSchema,
|
|
1628
|
-
trigger: WorkflowRunTriggerSchema,
|
|
1629
|
-
triggeredAt: z.string(),
|
|
1630
|
-
startedAt: z.string().nullable(),
|
|
1631
|
-
finishedAt: z.string().nullable(),
|
|
1632
|
-
sourceKind: RunSourceKindSchema,
|
|
1633
|
-
sourceId: z.string().nullable(),
|
|
1634
|
-
triggerRunId: z.string().nullable(),
|
|
1635
|
-
attachmentId: z.string().nullable(),
|
|
1636
|
-
parentWorkflowRunId: z.string().nullable(),
|
|
1637
|
-
parentSpanId: z.string().nullable(),
|
|
1638
|
-
input: z.unknown().nullable(),
|
|
1639
|
-
output: z.unknown().nullable(),
|
|
1640
|
-
error: z.unknown().nullable()
|
|
1641
|
-
});
|
|
1642
|
-
z.object({
|
|
1643
|
-
limit: z.coerce.number().int().min(1).max(100).optional().default(20),
|
|
1644
|
-
cursor: z.string().min(1).optional(),
|
|
1645
|
-
status: WorkflowRunStatusSchema.optional(),
|
|
1646
|
-
trigger: WorkflowRunTriggerSchema.optional()
|
|
1647
|
-
});
|
|
1648
|
-
z.object({
|
|
1649
|
-
items: z.array(WorkflowRunSummarySchema),
|
|
1650
|
-
nextCursor: z.string().nullable()
|
|
1651
|
-
});
|
|
1652
|
-
z.enum([
|
|
1653
|
-
"trigger",
|
|
1654
|
-
"steps",
|
|
1655
|
-
"trace"
|
|
1656
|
-
]);
|
|
1657
|
-
z.object({ include: z.string().optional() });
|
|
1658
|
-
const TriggerRunDetailSchema = z.object({
|
|
1659
|
-
id: z.string(),
|
|
1660
|
-
attachmentId: z.string(),
|
|
1661
|
-
attachmentSlug: z.string().nullable(),
|
|
1662
|
-
triggerType: z.enum([
|
|
1663
|
-
"cron",
|
|
1664
|
-
"webhook",
|
|
1665
|
-
"poll"
|
|
1666
|
-
]),
|
|
1667
|
-
sourcePath: z.string().nullable(),
|
|
1668
|
-
payload: z.unknown().nullable(),
|
|
1669
|
-
triggeredAt: z.string()
|
|
1670
|
-
});
|
|
1671
|
-
const WorkflowStepRunSchema = z.object({
|
|
1672
|
-
id: z.string(),
|
|
1673
|
-
actionKey: z.string(),
|
|
1674
|
-
output: z.unknown(),
|
|
1675
|
-
completedAt: z.string()
|
|
1676
|
-
});
|
|
1677
|
-
const TraceTriggerSummarySchema = z.object({
|
|
1678
|
-
triggerType: z.string(),
|
|
1679
|
-
triggerRunId: z.string(),
|
|
1680
|
-
workflowSlug: z.string().optional(),
|
|
1681
|
-
agentSlug: z.string().optional(),
|
|
1682
|
-
attachmentId: z.string().nullable().optional(),
|
|
1683
|
-
attachmentSlug: z.string().nullable().optional(),
|
|
1684
|
-
route: z.string().optional(),
|
|
1685
|
-
sourcePath: z.string().nullable().optional()
|
|
1686
|
-
}).nullable();
|
|
1687
|
-
const TraceGatewaySummarySchema = z.object({
|
|
1688
|
-
gatewayAttachmentId: z.string(),
|
|
1689
|
-
gatewayAttachmentKey: z.string(),
|
|
1690
|
-
threadId: z.string().optional(),
|
|
1691
|
-
channelId: z.string().optional(),
|
|
1692
|
-
mode: z.string().optional()
|
|
1693
|
-
}).nullable();
|
|
1694
|
-
const TraceSpanSchema = z.object({
|
|
1695
|
-
id: z.string(),
|
|
1696
|
-
traceId: z.string(),
|
|
1697
|
-
parentSpanId: z.string().nullable(),
|
|
1698
|
-
kind: z.string(),
|
|
1699
|
-
refId: z.string(),
|
|
1700
|
-
name: z.string(),
|
|
1701
|
-
status: z.string(),
|
|
1702
|
-
startedAt: z.string(),
|
|
1703
|
-
finishedAt: z.string().nullable(),
|
|
1704
|
-
metadata: z.unknown().nullable(),
|
|
1705
|
-
error: z.unknown().nullable()
|
|
1706
|
-
});
|
|
1707
|
-
const TraceLogSchema = z.object({
|
|
1708
|
-
id: z.string(),
|
|
1709
|
-
traceId: z.string(),
|
|
1710
|
-
spanId: z.string(),
|
|
1711
|
-
seq: z.number(),
|
|
1712
|
-
level: z.string(),
|
|
1713
|
-
message: z.string(),
|
|
1714
|
-
data: z.unknown().nullable(),
|
|
1715
|
-
source: z.string(),
|
|
1716
|
-
createdAt: z.string()
|
|
1717
|
-
});
|
|
1718
|
-
const TraceResponseSchema = z.object({
|
|
1719
|
-
traceId: z.string(),
|
|
1720
|
-
trigger: TraceTriggerSummarySchema,
|
|
1721
|
-
gateway: TraceGatewaySummarySchema,
|
|
1722
|
-
spans: z.array(TraceSpanSchema),
|
|
1723
|
-
logs: z.array(TraceLogSchema)
|
|
1724
|
-
});
|
|
1725
|
-
z.object({
|
|
1726
|
-
run: WorkflowRunRecordSchema,
|
|
1727
|
-
trigger: TriggerRunDetailSchema.nullable(),
|
|
1728
|
-
steps: z.array(WorkflowStepRunSchema),
|
|
1729
|
-
trace: TraceResponseSchema.nullable()
|
|
1730
|
-
});
|
|
1731
|
-
const AgentSessionStatusSchema = z.enum([
|
|
1732
|
-
"running",
|
|
1733
|
-
"completed",
|
|
1734
|
-
"failed",
|
|
1735
|
-
"canceled"
|
|
1736
|
-
]);
|
|
1737
|
-
const AgentSessionSummarySchema = z.object({
|
|
1738
|
-
id: z.string(),
|
|
1739
|
-
status: AgentSessionStatusSchema,
|
|
1740
|
-
source: RunSourceKindSchema,
|
|
1741
|
-
sourceId: z.string().nullable(),
|
|
1742
|
-
createdAt: z.string(),
|
|
1743
|
-
updatedAt: z.string(),
|
|
1744
|
-
messageCount: z.number()
|
|
1745
|
-
});
|
|
1746
|
-
const AgentSessionRecordSchema = z.object({
|
|
1747
|
-
id: z.string(),
|
|
1748
|
-
agentSlug: z.string(),
|
|
1749
|
-
status: AgentSessionStatusSchema,
|
|
1750
|
-
source: RunSourceKindSchema,
|
|
1751
|
-
sourceId: z.string().nullable(),
|
|
1752
|
-
createdAt: z.string(),
|
|
1753
|
-
updatedAt: z.string(),
|
|
1754
|
-
parentSpanId: z.string().nullable(),
|
|
1755
|
-
messageCount: z.number(),
|
|
1756
|
-
error: z.unknown().nullable()
|
|
1757
|
-
});
|
|
1758
|
-
z.object({
|
|
1759
|
-
limit: z.coerce.number().int().min(1).max(100).optional().default(20),
|
|
1760
|
-
cursor: z.string().min(1).optional(),
|
|
1761
|
-
status: AgentSessionStatusSchema.optional(),
|
|
1762
|
-
source: RunSourceKindSchema.optional()
|
|
1763
|
-
});
|
|
1764
|
-
z.object({
|
|
1765
|
-
items: z.array(AgentSessionSummarySchema),
|
|
1766
|
-
nextCursor: z.string().nullable()
|
|
1767
|
-
});
|
|
1768
|
-
z.enum([
|
|
1769
|
-
"gateway",
|
|
1770
|
-
"messages",
|
|
1771
|
-
"events",
|
|
1772
|
-
"trace"
|
|
1773
|
-
]);
|
|
1774
|
-
z.object({ include: z.string().optional() });
|
|
1775
|
-
const GatewaySessionDetailSchema = z.object({
|
|
1776
|
-
threadId: z.string(),
|
|
1777
|
-
attachmentId: z.string(),
|
|
1778
|
-
attachmentSlug: z.string().nullable()
|
|
1779
|
-
});
|
|
1780
|
-
const AgentEventSchema = z.object({
|
|
1781
|
-
id: z.string(),
|
|
1782
|
-
sessionId: z.string(),
|
|
1783
|
-
seq: z.number(),
|
|
1784
|
-
eventType: z.string(),
|
|
1785
|
-
payload: z.unknown(),
|
|
1786
|
-
createdAt: z.string()
|
|
1787
|
-
});
|
|
1788
|
-
z.object({
|
|
1789
|
-
session: AgentSessionRecordSchema,
|
|
1790
|
-
gateway: GatewaySessionDetailSchema.nullable(),
|
|
1791
|
-
messages: z.array(z.record(z.string(), z.unknown())),
|
|
1792
|
-
events: z.array(AgentEventSchema),
|
|
1793
|
-
trace: TraceResponseSchema.nullable()
|
|
1794
|
-
});
|
|
1795
|
-
const SlackGatewayModeSchema = z.enum([
|
|
1796
|
-
"mention",
|
|
1797
|
-
"channel",
|
|
1798
|
-
"dm"
|
|
1799
|
-
]);
|
|
1800
|
-
const GatewayAttachmentSourceSchema = z.object({
|
|
1801
|
-
kind: z.literal("slack"),
|
|
1802
|
-
mode: SlackGatewayModeSchema,
|
|
1803
|
-
credentialKey: z.string(),
|
|
1804
|
-
channelIds: z.array(z.string()).optional(),
|
|
1805
|
-
subscribeOnMention: z.boolean()
|
|
1806
|
-
});
|
|
1807
|
-
const GatewayAttachmentRecordSchema = z.object({
|
|
1808
|
-
id: z.string(),
|
|
1809
|
-
key: z.string(),
|
|
1810
|
-
agentKey: z.string(),
|
|
1811
|
-
channelId: z.string(),
|
|
1812
|
-
teamId: z.string().nullable().optional(),
|
|
1813
|
-
platform: z.string(),
|
|
1814
|
-
source: GatewayAttachmentSourceSchema,
|
|
1815
|
-
registeredAt: z.string(),
|
|
1816
|
-
updatedAt: z.string()
|
|
1817
|
-
});
|
|
1818
|
-
z.object({ attachments: z.array(GatewayAttachmentRecordSchema) });
|
|
1819
|
-
z.object({
|
|
1820
|
-
agentKey: z.string().min(1),
|
|
1821
|
-
teamId: z.string().min(1).optional(),
|
|
1822
|
-
mode: SlackGatewayModeSchema.optional(),
|
|
1823
|
-
subscribeOnMention: z.boolean().optional()
|
|
1824
|
-
});
|
|
1825
|
-
const AgentListItemSchema = z.object({
|
|
1826
|
-
key: z.string(),
|
|
1827
|
-
name: z.string().optional(),
|
|
1828
|
-
route: z.string()
|
|
1829
|
-
});
|
|
1830
|
-
z.object({ agents: z.array(AgentListItemSchema) });
|
|
1831
|
-
const HistoryRunKindSchema = z.enum(["workflow", "agent"]);
|
|
1832
|
-
const HistoryRunStatusSchema = z.enum([
|
|
1833
|
-
"pending",
|
|
1834
|
-
"running",
|
|
1835
|
-
"sleeping",
|
|
1836
|
-
"waiting_hook",
|
|
1837
|
-
"completed",
|
|
1838
|
-
"failed",
|
|
1839
|
-
"canceled"
|
|
1840
|
-
]);
|
|
1841
|
-
const HistoryRunActorSchema = z.object({
|
|
1842
|
-
userId: z.string(),
|
|
1843
|
-
name: z.string(),
|
|
1844
|
-
avatarUrl: z.string().nullable().optional()
|
|
1845
|
-
});
|
|
1846
|
-
const HistoryRunUsageLineItemSchema = z.object({
|
|
1847
|
-
id: z.string(),
|
|
1848
|
-
label: z.string(),
|
|
1849
|
-
amountUsd: z.number()
|
|
1850
|
-
});
|
|
1851
|
-
const HistoryRunUsageSchema = z.object({
|
|
1852
|
-
runDurationMs: z.number().nullable(),
|
|
1853
|
-
lineItems: z.array(HistoryRunUsageLineItemSchema),
|
|
1854
|
-
totalExcludingDurationUsd: z.number().nullable()
|
|
1855
|
-
});
|
|
1856
|
-
const HistoryRunSchema = z.object({
|
|
1857
|
-
id: z.string(),
|
|
1858
|
-
kind: HistoryRunKindSchema,
|
|
1859
|
-
traceId: z.string().nullable(),
|
|
1860
|
-
projectId: z.string(),
|
|
1861
|
-
projectName: z.string(),
|
|
1862
|
-
resourceKey: z.string(),
|
|
1863
|
-
resourceId: z.string(),
|
|
1864
|
-
resourceName: z.string(),
|
|
1865
|
-
status: HistoryRunStatusSchema,
|
|
1866
|
-
triggeredAt: z.string(),
|
|
1867
|
-
timeInQueueMs: z.number().nullable(),
|
|
1868
|
-
startedAt: z.string(),
|
|
1869
|
-
finishedAt: z.string().nullable(),
|
|
1870
|
-
durationMs: z.number().nullable(),
|
|
1871
|
-
triggerLabel: z.string(),
|
|
1872
|
-
triggerRaw: z.string(),
|
|
1873
|
-
ranAs: HistoryRunActorSchema.nullable(),
|
|
1874
|
-
modelsUsed: z.array(z.string()),
|
|
1875
|
-
otherServicesUsed: z.array(z.string()),
|
|
1876
|
-
totalCostUsd: z.number().nullable(),
|
|
1877
|
-
messageCount: z.number().optional(),
|
|
1878
|
-
stepCount: z.number().optional()
|
|
1879
|
-
});
|
|
1880
|
-
const HistoryTraceSpanSchema = z.object({
|
|
1881
|
-
id: z.string(),
|
|
1882
|
-
traceId: z.string(),
|
|
1883
|
-
parentSpanId: z.string().nullable(),
|
|
1884
|
-
kind: z.string(),
|
|
1885
|
-
refId: z.string(),
|
|
1886
|
-
name: z.string(),
|
|
1887
|
-
status: z.string(),
|
|
1888
|
-
startedAt: z.string(),
|
|
1889
|
-
finishedAt: z.string().nullable(),
|
|
1890
|
-
metadata: z.unknown().nullable(),
|
|
1891
|
-
error: z.unknown().nullable()
|
|
1892
|
-
});
|
|
1893
|
-
const HistoryTraceLogSchema = z.object({
|
|
1894
|
-
id: z.string(),
|
|
1895
|
-
traceId: z.string(),
|
|
1896
|
-
spanId: z.string(),
|
|
1897
|
-
seq: z.number(),
|
|
1898
|
-
level: z.string(),
|
|
1899
|
-
message: z.string(),
|
|
1900
|
-
data: z.unknown().nullable(),
|
|
1901
|
-
source: z.string(),
|
|
1902
|
-
createdAt: z.string()
|
|
1903
|
-
});
|
|
1904
|
-
const HistoryTraceTriggerSchema = z.object({
|
|
1905
|
-
triggerType: z.string(),
|
|
1906
|
-
triggerRunId: z.string(),
|
|
1907
|
-
workflowKey: z.string().optional(),
|
|
1908
|
-
agentKey: z.string().optional(),
|
|
1909
|
-
attachmentId: z.string().nullable().optional(),
|
|
1910
|
-
attachmentKey: z.string().nullable().optional(),
|
|
1911
|
-
route: z.string().optional(),
|
|
1912
|
-
sourcePath: z.string().nullable().optional()
|
|
1913
|
-
}).nullable();
|
|
1914
|
-
const HistoryTraceGatewaySchema = z.object({
|
|
1915
|
-
gatewayAttachmentId: z.string(),
|
|
1916
|
-
gatewayAttachmentKey: z.string(),
|
|
1917
|
-
threadId: z.string().optional(),
|
|
1918
|
-
channelId: z.string().optional(),
|
|
1919
|
-
mode: z.string().optional()
|
|
1920
|
-
}).nullable();
|
|
1921
|
-
const HistoryTraceSchema = z.object({
|
|
1922
|
-
traceId: z.string(),
|
|
1923
|
-
trigger: HistoryTraceTriggerSchema,
|
|
1924
|
-
gateway: HistoryTraceGatewaySchema,
|
|
1925
|
-
spans: z.array(HistoryTraceSpanSchema),
|
|
1926
|
-
logs: z.array(HistoryTraceLogSchema)
|
|
1927
|
-
});
|
|
1928
|
-
const HistoryWorkflowStepSchema = z.object({
|
|
1929
|
-
id: z.string(),
|
|
1930
|
-
actionKey: z.string(),
|
|
1931
|
-
output: z.unknown(),
|
|
1932
|
-
completedAt: z.string()
|
|
1933
|
-
});
|
|
1934
|
-
const HistoryWorkflowRunDetailSchema = z.object({
|
|
1935
|
-
kind: z.literal("workflow"),
|
|
1936
|
-
run: z.object({
|
|
1937
|
-
id: z.string(),
|
|
1938
|
-
workflowKey: z.string(),
|
|
1939
|
-
status: HistoryRunStatusSchema,
|
|
1940
|
-
trigger: z.string(),
|
|
1941
|
-
triggeredAt: z.string(),
|
|
1942
|
-
startedAt: z.string().nullable(),
|
|
1943
|
-
finishedAt: z.string().nullable(),
|
|
1944
|
-
input: z.unknown().nullable(),
|
|
1945
|
-
output: z.unknown().nullable(),
|
|
1946
|
-
error: z.unknown().nullable()
|
|
1947
|
-
}),
|
|
1948
|
-
trigger: z.object({
|
|
1949
|
-
id: z.string(),
|
|
1950
|
-
attachmentKey: z.string().nullable(),
|
|
1951
|
-
triggerType: z.string(),
|
|
1952
|
-
sourcePath: z.string().nullable(),
|
|
1953
|
-
payload: z.unknown().nullable(),
|
|
1954
|
-
triggeredAt: z.string()
|
|
1955
|
-
}).nullable(),
|
|
1956
|
-
steps: z.array(HistoryWorkflowStepSchema),
|
|
1957
|
-
trace: HistoryTraceSchema.nullable(),
|
|
1958
|
-
ranAs: HistoryRunActorSchema.nullable().optional(),
|
|
1959
|
-
usage: HistoryRunUsageSchema.nullable().optional()
|
|
1960
|
-
});
|
|
1961
|
-
const HistoryAgentSessionDetailSchema = z.object({
|
|
1962
|
-
kind: z.literal("agent"),
|
|
1963
|
-
runId: z.string(),
|
|
1964
|
-
session: z.object({
|
|
1965
|
-
id: z.string(),
|
|
1966
|
-
agentKey: z.string(),
|
|
1967
|
-
status: HistoryRunStatusSchema,
|
|
1968
|
-
source: z.enum([
|
|
1969
|
-
"api",
|
|
1970
|
-
"gateway",
|
|
1971
|
-
"trigger",
|
|
1972
|
-
"workflow",
|
|
1973
|
-
"agent"
|
|
1974
|
-
]),
|
|
1975
|
-
sourceId: z.string().nullable(),
|
|
1976
|
-
createdAt: z.string(),
|
|
1977
|
-
updatedAt: z.string(),
|
|
1978
|
-
messageCount: z.number(),
|
|
1979
|
-
error: z.unknown().nullable()
|
|
1980
|
-
}),
|
|
1981
|
-
gateway: z.object({
|
|
1982
|
-
threadId: z.string(),
|
|
1983
|
-
attachmentKey: z.string().nullable()
|
|
1984
|
-
}).nullable(),
|
|
1985
|
-
messages: z.array(z.record(z.string(), z.unknown())),
|
|
1986
|
-
trace: HistoryTraceSchema.nullable(),
|
|
1987
|
-
ranAs: HistoryRunActorSchema.nullable().optional(),
|
|
1988
|
-
usage: HistoryRunUsageSchema.nullable().optional()
|
|
1989
|
-
});
|
|
1990
|
-
const HistoryRunDetailSchema = z.discriminatedUnion("kind", [HistoryWorkflowRunDetailSchema, HistoryAgentSessionDetailSchema]);
|
|
1991
|
-
const HistoryRunListQuerySchema = z.object({
|
|
1992
|
-
project: z.string().min(1).optional(),
|
|
1993
|
-
status: HistoryRunStatusSchema.optional(),
|
|
1994
|
-
kind: HistoryRunKindSchema.optional()
|
|
1995
|
-
});
|
|
1996
|
-
const HistoryRunListResponseSchema = z.array(HistoryRunSchema);
|
|
1997
|
-
const HistoryRunDetailResponseSchema = HistoryRunDetailSchema.nullable();
|
|
1998
|
-
const HistoryRunCancelResponseSchema = HistoryRunSchema.nullable();
|
|
1999
|
-
const WorkflowSubscriptionRecordSchema = z.object({
|
|
2000
|
-
id: z.string(),
|
|
2001
|
-
workflowKey: z.string(),
|
|
2002
|
-
userId: z.string(),
|
|
2003
|
-
enabled: z.boolean(),
|
|
2004
|
-
createdAt: z.string(),
|
|
2005
|
-
updatedAt: z.string()
|
|
2006
|
-
});
|
|
2007
|
-
z.object({ subscriptions: z.array(WorkflowSubscriptionRecordSchema) });
|
|
2008
|
-
z.object({
|
|
2009
|
-
userId: z.string().min(1).optional(),
|
|
2010
|
-
enabled: z.boolean().optional()
|
|
2011
|
-
});
|
|
2012
|
-
const CredentialInstanceRecordSchema = z.object({
|
|
2013
|
-
id: z.string(),
|
|
2014
|
-
key: z.string(),
|
|
2015
|
-
scopeType: CredentialScopeTypeSchema,
|
|
2016
|
-
scopeId: z.string().nullable(),
|
|
2017
|
-
label: z.string().nullable(),
|
|
2018
|
-
isDefault: z.boolean(),
|
|
2019
|
-
authKind: CredentialAuthKindSchema
|
|
2020
|
-
});
|
|
2021
|
-
z.object({ instances: z.array(CredentialInstanceRecordSchema) });
|
|
2022
|
-
z.object({
|
|
2023
|
-
key: z.string().min(1),
|
|
2024
|
-
scopeType: CredentialScopeTypeSchema,
|
|
2025
|
-
scopeId: z.string().nullable().optional(),
|
|
2026
|
-
label: z.string().nullable().optional(),
|
|
2027
|
-
isDefault: z.boolean().optional(),
|
|
2028
|
-
value: z.record(z.string(), z.unknown()).refine((value) => Object.keys(value).length > 0, { message: "value must be a non-empty object" })
|
|
2029
|
-
});
|
|
2030
|
-
z.object({
|
|
2031
|
-
label: z.string().nullable().optional(),
|
|
2032
|
-
isDefault: z.boolean().optional(),
|
|
2033
|
-
value: z.record(z.string(), z.unknown()).refine((value) => Object.keys(value).length > 0, { message: "value must be a non-empty object" }).optional()
|
|
2034
|
-
});
|
|
2035
|
-
const TriggerRunTypeSchema = z.enum([
|
|
2036
|
-
"cron",
|
|
2037
|
-
"webhook",
|
|
2038
|
-
"poll"
|
|
2039
|
-
]);
|
|
2040
|
-
const TriggerRunWorkflowSummarySchema = z.object({
|
|
2041
|
-
id: z.string(),
|
|
2042
|
-
status: WorkflowRunStatusSchema,
|
|
2043
|
-
workflowSlug: z.string()
|
|
2044
|
-
});
|
|
2045
|
-
const TriggerRunAgentSessionSummarySchema = z.object({
|
|
2046
|
-
id: z.string(),
|
|
2047
|
-
agentSlug: z.string()
|
|
2048
|
-
});
|
|
2049
|
-
const TriggerRunSummarySchema = z.object({
|
|
2050
|
-
id: z.string(),
|
|
2051
|
-
triggerType: TriggerRunTypeSchema,
|
|
2052
|
-
triggeredAt: z.string(),
|
|
2053
|
-
sourcePath: z.string().nullable(),
|
|
2054
|
-
workflowRun: TriggerRunWorkflowSummarySchema.nullable(),
|
|
2055
|
-
agentSession: TriggerRunAgentSessionSummarySchema.nullable()
|
|
2056
|
-
});
|
|
2057
|
-
const TriggerRunRecordSchema = z.object({
|
|
2058
|
-
id: z.string(),
|
|
2059
|
-
attachmentId: z.string(),
|
|
2060
|
-
attachmentSlug: z.string(),
|
|
2061
|
-
triggerType: TriggerRunTypeSchema,
|
|
2062
|
-
sourcePath: z.string().nullable(),
|
|
2063
|
-
payload: z.unknown().nullable(),
|
|
2064
|
-
triggeredAt: z.string()
|
|
2065
|
-
});
|
|
2066
|
-
z.object({
|
|
2067
|
-
limit: z.coerce.number().int().min(1).max(100).optional().default(20),
|
|
2068
|
-
cursor: z.string().min(1).optional(),
|
|
2069
|
-
triggerType: TriggerRunTypeSchema.optional()
|
|
2070
|
-
});
|
|
2071
|
-
z.object({
|
|
2072
|
-
items: z.array(TriggerRunSummarySchema),
|
|
2073
|
-
nextCursor: z.string().nullable()
|
|
2074
|
-
});
|
|
2075
|
-
z.enum([
|
|
2076
|
-
"workflows",
|
|
2077
|
-
"agents",
|
|
2078
|
-
"trace"
|
|
2079
|
-
]);
|
|
2080
|
-
z.object({ include: z.string().optional() });
|
|
2081
|
-
const TriggerRunAgentSessionDetailSchema = z.object({
|
|
2082
|
-
id: z.string(),
|
|
2083
|
-
agentSlug: z.string()
|
|
2084
|
-
});
|
|
2085
|
-
z.object({
|
|
2086
|
-
run: TriggerRunRecordSchema,
|
|
2087
|
-
workflowRuns: z.array(WorkflowRunSummarySchema),
|
|
2088
|
-
agentSessions: z.array(TriggerRunAgentSessionDetailSchema),
|
|
2089
|
-
trace: TraceResponseSchema.nullable()
|
|
2090
|
-
});
|
|
2091
|
-
const TriggerTypeSchema = z.enum([
|
|
2092
|
-
"webhook",
|
|
2093
|
-
"poll",
|
|
2094
|
-
"cron"
|
|
2095
|
-
]);
|
|
2096
|
-
const TriggerTargetKindSchema = z.enum(["workflow", "agent"]);
|
|
2097
|
-
const TriggerListItemSchema = z.object({
|
|
2098
|
-
key: z.string(),
|
|
2099
|
-
type: TriggerTypeSchema,
|
|
2100
|
-
route: z.string().optional(),
|
|
2101
|
-
webhookUrl: z.string().url().optional(),
|
|
2102
|
-
targetKind: TriggerTargetKindSchema,
|
|
2103
|
-
workflowKey: z.string().optional(),
|
|
2104
|
-
agentKey: z.string().optional()
|
|
2105
|
-
});
|
|
2106
|
-
z.object({ triggers: z.array(TriggerListItemSchema) });
|
|
2107
|
-
z.object({ endpoint: z.string().min(1).optional() });
|
|
2108
|
-
const OrganizationMemberRoleSchema = z.enum([
|
|
2109
|
-
"owner",
|
|
2110
|
-
"admin",
|
|
2111
|
-
"builder"
|
|
2112
|
-
]);
|
|
2113
|
-
const OrganizationMemberStatusSchema = z.enum([
|
|
2114
|
-
"invited",
|
|
2115
|
-
"active",
|
|
2116
|
-
"rejected",
|
|
2117
|
-
"suspended"
|
|
2118
|
-
]);
|
|
2119
|
-
const InvitableOrganizationMemberRoleSchema = z.enum(["admin", "builder"]);
|
|
2120
|
-
const isoDateTime$4 = z.string().datetime();
|
|
2121
|
-
const OrganizationMemberSchema = z.object({
|
|
2122
|
-
id: z.string(),
|
|
2123
|
-
name: z.string(),
|
|
2124
|
-
email: z.string().email(),
|
|
2125
|
-
role: OrganizationMemberRoleSchema,
|
|
2126
|
-
status: OrganizationMemberStatusSchema,
|
|
2127
|
-
avatarUrl: z.string().optional(),
|
|
2128
|
-
joinedAt: isoDateTime$4.optional(),
|
|
2129
|
-
lastActiveAt: isoDateTime$4.nullable().optional()
|
|
2130
|
-
});
|
|
2131
|
-
const ListOrganizationMembersResponseSchema = z.object({ members: z.array(OrganizationMemberSchema) });
|
|
2132
|
-
const InviteOrganizationMembersRequestSchema = z.object({
|
|
2133
|
-
emails: z.array(z.string().trim().email()).min(1),
|
|
2134
|
-
role: InvitableOrganizationMemberRoleSchema
|
|
2135
|
-
});
|
|
2136
|
-
const InviteOrganizationMemberResultStatusSchema = z.enum([
|
|
2137
|
-
"sent",
|
|
2138
|
-
"already_member",
|
|
2139
|
-
"pending",
|
|
2140
|
-
"invalid"
|
|
2141
|
-
]);
|
|
2142
|
-
const InviteOrganizationMemberResultSchema = z.object({
|
|
2143
|
-
email: z.string(),
|
|
2144
|
-
status: InviteOrganizationMemberResultStatusSchema,
|
|
2145
|
-
invitationId: z.string().optional()
|
|
2146
|
-
});
|
|
2147
|
-
const InviteOrganizationMembersResponseSchema = z.object({ results: z.array(InviteOrganizationMemberResultSchema) });
|
|
2148
|
-
const UpdateOrganizationMemberRequestSchema = z.object({ role: InvitableOrganizationMemberRoleSchema });
|
|
2149
|
-
const UpdateOrganizationMemberResponseSchema = z.object({ member: OrganizationMemberSchema });
|
|
2150
|
-
const OrganizationInvitationSchema = z.object({
|
|
2151
|
-
id: z.string(),
|
|
2152
|
-
organizationName: z.string(),
|
|
2153
|
-
organizationSlug: OrganizationSlugSchema,
|
|
2154
|
-
invitedByName: z.string().optional(),
|
|
2155
|
-
invitedByEmail: z.string().email().optional(),
|
|
2156
|
-
role: OrganizationMemberRoleSchema
|
|
2157
|
-
});
|
|
2158
|
-
const ListOrganizationInvitationsResponseSchema = z.object({ invitations: z.array(OrganizationInvitationSchema) });
|
|
2159
|
-
const AcceptOrganizationInvitationResponseSchema = z.object({ organization: UserOrganizationSchema });
|
|
2160
|
-
const DeclineOrganizationInvitationResponseSchema = z.object({ success: z.literal(true) });
|
|
2161
|
-
/** Web path to auto-accept an invitation after sign-in (used in invite emails). */
|
|
2162
|
-
function organizationInvitationAcceptPath(invitationId) {
|
|
2163
|
-
return `/organization/invitations?${new URLSearchParams({ accept: invitationId }).toString()}`;
|
|
2164
|
-
}
|
|
2165
|
-
const isoDateTime$3 = z.string().datetime();
|
|
2166
|
-
const ApiKeyCreatorSchema = z.object({
|
|
2167
|
-
id: z.string(),
|
|
2168
|
-
name: z.string(),
|
|
2169
|
-
email: z.string().email().optional(),
|
|
2170
|
-
avatarUrl: z.string().optional(),
|
|
2171
|
-
/** True when the creator user row no longer exists. */
|
|
2172
|
-
deleted: z.boolean().optional()
|
|
2173
|
-
});
|
|
2174
|
-
const ApiKeySummarySchema = z.object({
|
|
2175
|
-
id: z.string(),
|
|
2176
|
-
name: z.string(),
|
|
2177
|
-
keyPreview: z.string(),
|
|
2178
|
-
createdAt: isoDateTime$3,
|
|
2179
|
-
createdBy: ApiKeyCreatorSchema,
|
|
2180
|
-
isCreatedByCurrentUser: z.boolean()
|
|
2181
|
-
});
|
|
2182
|
-
const ListApiKeysResponseSchema = z.object({ apiKeys: z.array(ApiKeySummarySchema) });
|
|
2183
|
-
const CreateApiKeyRequestSchema = z.object({ name: z.string().trim().min(1).max(128) });
|
|
2184
|
-
const CreateApiKeyResponseSchema = ApiKeySummarySchema.extend({ secret: z.string() });
|
|
2185
|
-
const ProjectUserRoleSchema = z.enum(["admin", "builder"]);
|
|
2186
|
-
const ProjectInvitePermissionSchema = z.enum(["admin", "all"]);
|
|
2187
|
-
const ProjectMemberStatusSchema = z.enum(["active", "invited"]);
|
|
2188
|
-
const isoDateTime$2 = z.string().datetime();
|
|
2189
|
-
const ProjectMemberSchema = z.object({
|
|
2190
|
-
id: z.string(),
|
|
2191
|
-
projectId: z.string(),
|
|
2192
|
-
name: z.string(),
|
|
2193
|
-
email: z.string().email(),
|
|
2194
|
-
role: ProjectUserRoleSchema,
|
|
2195
|
-
status: ProjectMemberStatusSchema,
|
|
2196
|
-
image: z.string().nullable(),
|
|
2197
|
-
createdAt: isoDateTime$2,
|
|
2198
|
-
isCurrentUser: z.boolean().optional()
|
|
2199
|
-
});
|
|
2200
|
-
const ListProjectMembersResponseSchema = z.object({ members: z.array(ProjectMemberSchema) });
|
|
2201
|
-
const InviteProjectMembersRequestSchema = z.object({
|
|
2202
|
-
emails: z.array(z.string().trim().email()).min(1),
|
|
2203
|
-
role: ProjectUserRoleSchema
|
|
2204
|
-
});
|
|
2205
|
-
const InviteProjectMemberResultStatusSchema = z.enum([
|
|
2206
|
-
"added",
|
|
2207
|
-
"already_member",
|
|
2208
|
-
"not_org_member",
|
|
2209
|
-
"invalid"
|
|
2210
|
-
]);
|
|
2211
|
-
const InviteProjectMemberResultSchema = z.object({
|
|
2212
|
-
email: z.string(),
|
|
2213
|
-
status: InviteProjectMemberResultStatusSchema
|
|
2214
|
-
});
|
|
2215
|
-
const InviteProjectMembersResponseSchema = z.object({ results: z.array(InviteProjectMemberResultSchema) });
|
|
2216
|
-
const UpdateProjectMemberRequestSchema = z.object({ role: ProjectUserRoleSchema });
|
|
2217
|
-
const UpdateProjectMemberResponseSchema = z.object({ member: ProjectMemberSchema });
|
|
2218
|
-
const ProjectSettingsSchema = z.object({
|
|
2219
|
-
description: z.string(),
|
|
2220
|
-
defaultRole: ProjectUserRoleSchema,
|
|
2221
|
-
invitePermission: ProjectInvitePermissionSchema
|
|
2222
|
-
});
|
|
2223
|
-
const UpdateProjectSettingsRequestSchema = z.object({
|
|
2224
|
-
description: z.string().optional(),
|
|
2225
|
-
defaultRole: ProjectUserRoleSchema.optional(),
|
|
2226
|
-
invitePermission: ProjectInvitePermissionSchema.optional()
|
|
2227
|
-
}).refine((data) => data.description !== void 0 || data.defaultRole !== void 0 || data.invitePermission !== void 0, { message: "At least one field is required" });
|
|
2228
|
-
const ProjectSettingsResponseSchema = z.object({ settings: ProjectSettingsSchema });
|
|
2229
|
-
/** Custom avatar override; null means fall back to OAuth `users.image`. */
|
|
2230
|
-
const UserAvatarSchema = z.object({ url: z.url().nullable() });
|
|
2231
|
-
const UserAvatarPatchSchema = z.object({
|
|
2232
|
-
/** Storage key returned from presign; null removes the custom override. */
|
|
2233
|
-
storageKey: z.string().min(1).nullable() });
|
|
2234
|
-
const PresignUserAvatarRequestSchema = z.object({ contentType: z.string().trim().min(1) });
|
|
2235
|
-
const PresignUserAvatarResponseSchema = z.object({
|
|
2236
|
-
uploadUrl: z.url(),
|
|
2237
|
-
storageKey: z.string().min(1)
|
|
2238
|
-
});
|
|
2239
|
-
const UserInterfaceThemeSchema = z.enum([
|
|
2240
|
-
"system",
|
|
2241
|
-
"light",
|
|
2242
|
-
"dark"
|
|
2243
|
-
]);
|
|
2244
|
-
const UserSurfaceContrastSchema = z.enum(["off", "on"]);
|
|
2245
|
-
const UserWorkspaceLayoutModeSchema = z.enum(["default", "linear"]);
|
|
2246
|
-
const UserWorkspaceFontSizeSchema = z.enum(["default", "large"]);
|
|
2247
|
-
const UserSidebarNavIconVisibilitySchema = z.enum(["hidden", "visible"]);
|
|
2248
|
-
const UserSidebarFooterChatRowVisibilitySchema = z.enum(["hidden", "visible"]);
|
|
2249
|
-
const UserWorkspaceFavoriteKindSchema = z.enum([
|
|
2250
|
-
"agent",
|
|
2251
|
-
"workflow",
|
|
2252
|
-
"skill",
|
|
2253
|
-
"run"
|
|
2254
|
-
]);
|
|
2255
|
-
const UserWorkspaceFavoriteSchema = z.object({
|
|
2256
|
-
kind: UserWorkspaceFavoriteKindSchema,
|
|
2257
|
-
resourceId: z.string().min(1)
|
|
2258
|
-
});
|
|
2259
|
-
const UserSidebarPreferencesSchema = z.object({
|
|
2260
|
-
navIconVisibility: UserSidebarNavIconVisibilitySchema,
|
|
2261
|
-
footerChatRowVisibility: UserSidebarFooterChatRowVisibilitySchema,
|
|
2262
|
-
hiddenNavItemIds: z.array(z.string()),
|
|
2263
|
-
topNavItemOrderIds: z.array(z.string()),
|
|
2264
|
-
workspaceNavItemOrderIds: z.array(z.string())
|
|
2265
|
-
});
|
|
2266
|
-
const UserPreferencesSchema = z.object({
|
|
2267
|
-
interfaceTheme: UserInterfaceThemeSchema,
|
|
2268
|
-
surfaceContrast: UserSurfaceContrastSchema,
|
|
2269
|
-
layoutMode: UserWorkspaceLayoutModeSchema,
|
|
2270
|
-
fontSize: UserWorkspaceFontSizeSchema,
|
|
2271
|
-
sidebar: UserSidebarPreferencesSchema,
|
|
2272
|
-
favorites: z.array(UserWorkspaceFavoriteSchema),
|
|
2273
|
-
projectOrderIds: z.array(z.string()),
|
|
2274
|
-
projectDotColors: z.record(z.string(), z.string()),
|
|
2275
|
-
onboardingTabVisible: z.boolean()
|
|
2276
|
-
});
|
|
2277
|
-
const UserSidebarPreferencesPatchSchema = z.object({
|
|
2278
|
-
navIconVisibility: UserSidebarNavIconVisibilitySchema.optional(),
|
|
2279
|
-
footerChatRowVisibility: UserSidebarFooterChatRowVisibilitySchema.optional(),
|
|
2280
|
-
hiddenNavItemIds: z.array(z.string()).optional(),
|
|
2281
|
-
topNavItemOrderIds: z.array(z.string()).optional(),
|
|
2282
|
-
workspaceNavItemOrderIds: z.array(z.string()).optional()
|
|
2283
|
-
});
|
|
2284
|
-
const UserPreferencesPatchSchema = z.object({
|
|
2285
|
-
interfaceTheme: UserInterfaceThemeSchema.optional(),
|
|
2286
|
-
surfaceContrast: UserSurfaceContrastSchema.optional(),
|
|
2287
|
-
layoutMode: UserWorkspaceLayoutModeSchema.optional(),
|
|
2288
|
-
fontSize: UserWorkspaceFontSizeSchema.optional(),
|
|
2289
|
-
sidebar: UserSidebarPreferencesPatchSchema.optional(),
|
|
2290
|
-
favorites: z.array(UserWorkspaceFavoriteSchema).optional(),
|
|
2291
|
-
projectOrderIds: z.array(z.string()).optional(),
|
|
2292
|
-
projectDotColors: z.record(z.string(), z.string()).optional(),
|
|
2293
|
-
onboardingTabVisible: z.boolean().optional()
|
|
2294
|
-
}).refine((value) => value.interfaceTheme !== void 0 || value.surfaceContrast !== void 0 || value.layoutMode !== void 0 || value.fontSize !== void 0 || value.sidebar !== void 0 || value.favorites !== void 0 || value.projectOrderIds !== void 0 || value.projectDotColors !== void 0 || value.onboardingTabVisible !== void 0, { message: "At least one preference field is required" });
|
|
2295
|
-
const DEFAULT_USER_SIDEBAR_PREFERENCES = {
|
|
2296
|
-
navIconVisibility: "visible",
|
|
2297
|
-
footerChatRowVisibility: "visible",
|
|
2298
|
-
hiddenNavItemIds: ["registry"],
|
|
2299
|
-
topNavItemOrderIds: [],
|
|
2300
|
-
workspaceNavItemOrderIds: []
|
|
2301
|
-
};
|
|
2302
|
-
const DEFAULT_USER_PREFERENCES = {
|
|
2303
|
-
interfaceTheme: "system",
|
|
2304
|
-
surfaceContrast: "on",
|
|
2305
|
-
layoutMode: "linear",
|
|
2306
|
-
fontSize: "default",
|
|
2307
|
-
sidebar: DEFAULT_USER_SIDEBAR_PREFERENCES,
|
|
2308
|
-
favorites: [],
|
|
2309
|
-
projectOrderIds: [],
|
|
2310
|
-
projectDotColors: {},
|
|
2311
|
-
onboardingTabVisible: true
|
|
2312
|
-
};
|
|
2313
|
-
function normalizeInterfaceTheme(value) {
|
|
2314
|
-
if (value === "light" || value === "dark") return value;
|
|
2315
|
-
return "system";
|
|
2316
|
-
}
|
|
2317
|
-
function normalizeSurfaceContrast(value) {
|
|
2318
|
-
return value === "off" ? "off" : "on";
|
|
2319
|
-
}
|
|
2320
|
-
function normalizeLayoutMode(value) {
|
|
2321
|
-
return value === "default" ? "default" : "linear";
|
|
2322
|
-
}
|
|
2323
|
-
function normalizeFontSize(value) {
|
|
2324
|
-
return value === "large" ? "large" : "default";
|
|
2325
|
-
}
|
|
2326
|
-
function normalizeStringList(value) {
|
|
2327
|
-
if (!Array.isArray(value)) return [];
|
|
2328
|
-
return Array.from(new Set(value.filter((item) => typeof item === "string")));
|
|
2329
|
-
}
|
|
2330
|
-
function normalizeHiddenNavItemIds(value) {
|
|
2331
|
-
if (!Array.isArray(value)) return DEFAULT_USER_SIDEBAR_PREFERENCES.hiddenNavItemIds;
|
|
2332
|
-
return normalizeStringList(value);
|
|
2333
|
-
}
|
|
2334
|
-
function normalizeSidebarPreferences(value) {
|
|
2335
|
-
if (!value || typeof value !== "object") return DEFAULT_USER_SIDEBAR_PREFERENCES;
|
|
2336
|
-
const sidebar = value;
|
|
2337
|
-
return {
|
|
2338
|
-
navIconVisibility: sidebar.navIconVisibility === "visible" ? "visible" : "hidden",
|
|
2339
|
-
footerChatRowVisibility: sidebar.footerChatRowVisibility === "hidden" ? "hidden" : "visible",
|
|
2340
|
-
hiddenNavItemIds: normalizeHiddenNavItemIds(sidebar.hiddenNavItemIds),
|
|
2341
|
-
topNavItemOrderIds: normalizeStringList(sidebar.topNavItemOrderIds),
|
|
2342
|
-
workspaceNavItemOrderIds: normalizeStringList(sidebar.workspaceNavItemOrderIds)
|
|
2343
|
-
};
|
|
2344
|
-
}
|
|
2345
|
-
function isWorkspaceFavoriteKind(value) {
|
|
2346
|
-
return value === "agent" || value === "workflow" || value === "skill" || value === "run";
|
|
2347
|
-
}
|
|
2348
|
-
function normalizeFavorites(value) {
|
|
2349
|
-
if (!Array.isArray(value)) return [];
|
|
2350
|
-
const seenKeys = /* @__PURE__ */ new Set();
|
|
2351
|
-
const favorites = [];
|
|
2352
|
-
for (const item of value) {
|
|
2353
|
-
if (!item || typeof item !== "object") continue;
|
|
2354
|
-
const favorite = item;
|
|
2355
|
-
if (typeof favorite.kind !== "string" || !isWorkspaceFavoriteKind(favorite.kind) || typeof favorite.resourceId !== "string" || favorite.resourceId.length === 0) continue;
|
|
2356
|
-
const key = `${favorite.kind}:${favorite.resourceId}`;
|
|
2357
|
-
if (seenKeys.has(key)) continue;
|
|
2358
|
-
seenKeys.add(key);
|
|
2359
|
-
favorites.push({
|
|
2360
|
-
kind: favorite.kind,
|
|
2361
|
-
resourceId: favorite.resourceId
|
|
2362
|
-
});
|
|
2363
|
-
}
|
|
2364
|
-
return favorites;
|
|
2365
|
-
}
|
|
2366
|
-
function normalizeProjectDotColors(value) {
|
|
2367
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
2368
|
-
return Object.fromEntries(Object.entries(value).filter((entry) => typeof entry[0] === "string" && typeof entry[1] === "string"));
|
|
2369
|
-
}
|
|
2370
|
-
function normalizeOnboardingTabVisible(value) {
|
|
2371
|
-
return typeof value === "boolean" ? value : DEFAULT_USER_PREFERENCES.onboardingTabVisible;
|
|
2372
|
-
}
|
|
2373
|
-
function normalizeUserPreferences(value) {
|
|
2374
|
-
if (!value || typeof value !== "object") return DEFAULT_USER_PREFERENCES;
|
|
2375
|
-
const preferences = value;
|
|
2376
|
-
return UserPreferencesSchema.parse({
|
|
2377
|
-
interfaceTheme: normalizeInterfaceTheme(preferences.interfaceTheme),
|
|
2378
|
-
surfaceContrast: normalizeSurfaceContrast(preferences.surfaceContrast),
|
|
2379
|
-
layoutMode: normalizeLayoutMode(preferences.layoutMode),
|
|
2380
|
-
fontSize: normalizeFontSize(preferences.fontSize),
|
|
2381
|
-
sidebar: normalizeSidebarPreferences(preferences.sidebar),
|
|
2382
|
-
favorites: normalizeFavorites(preferences.favorites),
|
|
2383
|
-
projectOrderIds: normalizeStringList(preferences.projectOrderIds),
|
|
2384
|
-
projectDotColors: normalizeProjectDotColors(preferences.projectDotColors),
|
|
2385
|
-
onboardingTabVisible: normalizeOnboardingTabVisible(preferences.onboardingTabVisible)
|
|
2386
|
-
});
|
|
2387
|
-
}
|
|
2388
|
-
function mergeUserPreferences(current, patch) {
|
|
2389
|
-
return normalizeUserPreferences({
|
|
2390
|
-
...current,
|
|
2391
|
-
...patch,
|
|
2392
|
-
sidebar: patch.sidebar ? {
|
|
2393
|
-
...current.sidebar,
|
|
2394
|
-
...patch.sidebar
|
|
2395
|
-
} : current.sidebar
|
|
2396
|
-
});
|
|
2397
|
-
}
|
|
2398
|
-
const OrganizationLogoVariantSchema = z.enum(["light", "dark"]);
|
|
2399
|
-
const OrganizationSidebarBrandingSchema = z.object({
|
|
2400
|
-
customLogoEnabled: z.boolean(),
|
|
2401
|
-
customLogoExplicitlyDisabled: z.boolean(),
|
|
2402
|
-
logoLightUrl: z.url().nullable(),
|
|
2403
|
-
logoDarkUrl: z.url().nullable(),
|
|
2404
|
-
logoHeightPx: z.number().int().min(14).max(32)
|
|
2405
|
-
});
|
|
2406
|
-
const OrganizationSidebarBrandingPatchSchema = z.object({
|
|
2407
|
-
customLogoEnabled: z.boolean().optional(),
|
|
2408
|
-
customLogoExplicitlyDisabled: z.boolean().optional(),
|
|
2409
|
-
logoLightStorageKey: z.string().min(1).nullable().optional(),
|
|
2410
|
-
logoDarkStorageKey: z.string().min(1).nullable().optional(),
|
|
2411
|
-
logoHeightPx: z.number().int().min(14).max(32).optional()
|
|
2412
|
-
}).refine((value) => value.customLogoEnabled !== void 0 || value.customLogoExplicitlyDisabled !== void 0 || value.logoLightStorageKey !== void 0 || value.logoDarkStorageKey !== void 0 || value.logoHeightPx !== void 0, { message: "At least one branding field is required" });
|
|
2413
|
-
const PresignOrgLogoRequestSchema = z.object({
|
|
2414
|
-
variant: OrganizationLogoVariantSchema,
|
|
2415
|
-
contentType: z.string().trim().min(1)
|
|
2416
|
-
});
|
|
2417
|
-
const PresignOrgLogoResponseSchema = z.object({
|
|
2418
|
-
uploadUrl: z.url(),
|
|
2419
|
-
storageKey: z.string().min(1)
|
|
2420
|
-
});
|
|
2421
|
-
const ProjectArtifactStatusSchema = z.enum(["pending", "ready"]);
|
|
2422
|
-
const isoDateTime$1 = z.string().datetime();
|
|
2423
|
-
const ProjectArtifactSchema = z.object({
|
|
2424
|
-
id: z.string(),
|
|
2425
|
-
projectId: z.string(),
|
|
2426
|
-
storageKey: z.string(),
|
|
2427
|
-
status: ProjectArtifactStatusSchema,
|
|
2428
|
-
createdAt: isoDateTime$1,
|
|
2429
|
-
updatedAt: isoDateTime$1
|
|
2430
|
-
});
|
|
2431
|
-
const CreateProjectArtifactResponseSchema = z.object({
|
|
2432
|
-
artifact: ProjectArtifactSchema,
|
|
2433
|
-
uploadUrl: z.string().url(),
|
|
2434
|
-
expiresInSeconds: z.number().int().positive()
|
|
2435
|
-
});
|
|
2436
|
-
const CompleteProjectArtifactResponseSchema = z.object({
|
|
2437
|
-
artifact: ProjectArtifactSchema,
|
|
2438
|
-
project: ProjectSchema
|
|
2439
|
-
});
|
|
2440
|
-
const DownloadActiveProjectArtifactResponseSchema = z.object({
|
|
2441
|
-
artifactId: z.string(),
|
|
2442
|
-
downloadUrl: z.string().url(),
|
|
2443
|
-
expiresInSeconds: z.number().int().positive()
|
|
2444
|
-
});
|
|
2445
|
-
const ProjectDeploymentSchema = z.object({
|
|
2446
|
-
id: z.string(),
|
|
2447
|
-
projectId: z.string(),
|
|
2448
|
-
version: z.number().int().positive(),
|
|
2449
|
-
deployedBy: z.string().nullable(),
|
|
2450
|
-
deployedByEmail: z.string().optional(),
|
|
2451
|
-
deployedByAvatarUrl: z.string().optional(),
|
|
2452
|
-
createdAt: isoDateTime$1,
|
|
2453
|
-
active: z.boolean()
|
|
2454
|
-
});
|
|
2455
|
-
const ListProjectDeploymentsResponseSchema = z.object({ deployments: z.array(ProjectDeploymentSchema) });
|
|
2456
|
-
const PLATFORM_RESOURCE_UNSUPPORTED_TEXT = "Not Supported";
|
|
2457
|
-
const optionalCount = z.number().int().nonnegative().nullable().optional();
|
|
2458
|
-
const optionalTimestamp = z.string().nullable().optional();
|
|
2459
|
-
const AgentSummarySchema = z.object({
|
|
2460
|
-
id: z.string().min(1),
|
|
2461
|
-
slug: z.string().min(1),
|
|
2462
|
-
name: z.string().min(1),
|
|
2463
|
-
projectId: z.string().min(1),
|
|
2464
|
-
updatedAt: z.string().min(1),
|
|
2465
|
-
description: z.string().optional(),
|
|
2466
|
-
sourcePath: z.string().min(1).optional(),
|
|
2467
|
-
model: z.string().optional(),
|
|
2468
|
-
toolCount: optionalCount,
|
|
2469
|
-
credentialCount: optionalCount,
|
|
2470
|
-
lastRunAt: optionalTimestamp
|
|
2471
|
-
});
|
|
2472
|
-
const WorkflowSummarySchema = z.object({
|
|
2473
|
-
id: z.string().min(1),
|
|
2474
|
-
slug: z.string().min(1),
|
|
2475
|
-
name: z.string().min(1),
|
|
2476
|
-
projectId: z.string().min(1),
|
|
2477
|
-
updatedAt: z.string().min(1),
|
|
2478
|
-
description: z.string().optional(),
|
|
2479
|
-
sourcePath: z.string().min(1).optional(),
|
|
2480
|
-
lastRunAt: optionalTimestamp
|
|
2481
|
-
});
|
|
2482
|
-
const SkillSummarySchema = z.object({
|
|
2483
|
-
id: z.string().min(1),
|
|
2484
|
-
slug: z.string().min(1),
|
|
2485
|
-
name: z.string().min(1),
|
|
2486
|
-
projectId: z.string().min(1),
|
|
2487
|
-
updatedAt: z.string().min(1),
|
|
2488
|
-
description: z.string().optional(),
|
|
2489
|
-
sourcePath: z.string().min(1).optional()
|
|
2490
|
-
});
|
|
2491
|
-
const AgentSummaryListResponseSchema = z.array(AgentSummarySchema);
|
|
2492
|
-
const AgentSummaryDetailResponseSchema = AgentSummarySchema.nullable();
|
|
2493
|
-
const WorkflowSummaryListResponseSchema = z.array(WorkflowSummarySchema);
|
|
2494
|
-
const WorkflowSummaryDetailResponseSchema = WorkflowSummarySchema.nullable();
|
|
2495
|
-
const SkillSummaryListResponseSchema = z.array(SkillSummarySchema);
|
|
2496
|
-
const SkillSummaryDetailResponseSchema = SkillSummarySchema.nullable();
|
|
2497
|
-
const RecentResourceKindSchema = z.enum([
|
|
2498
|
-
"agent",
|
|
2499
|
-
"workflow",
|
|
2500
|
-
"skill"
|
|
2501
|
-
]);
|
|
2502
|
-
const RecentResourceSourceSchema = z.enum(["owned", "shared"]);
|
|
2503
|
-
const RecentResourceSchema = z.object({
|
|
2504
|
-
id: z.string().min(1),
|
|
2505
|
-
resourceKind: RecentResourceKindSchema,
|
|
2506
|
-
resourceId: z.string().min(1),
|
|
2507
|
-
name: z.string().min(1),
|
|
2508
|
-
description: z.string().optional(),
|
|
2509
|
-
projectId: z.string().min(1),
|
|
2510
|
-
projectName: z.string().min(1),
|
|
2511
|
-
sourcePath: z.string().min(1).optional(),
|
|
2512
|
-
source: RecentResourceSourceSchema,
|
|
2513
|
-
lastOpenedAt: z.string().min(1),
|
|
2514
|
-
lastModifiedAt: z.string().min(1)
|
|
2515
|
-
});
|
|
2516
|
-
const RecentResourceListResponseSchema = z.array(RecentResourceSchema);
|
|
2517
|
-
const isoDateTime = z.string().datetime();
|
|
2518
|
-
const sha256Hex = z.string().regex(/^[a-f0-9]{64}$/, "Expected a lowercase hex sha256 digest");
|
|
2519
|
-
/**
|
|
2520
|
-
* A single entry in a deploy's file tree, as served to the dashboard. Carries
|
|
2521
|
-
* no contents: `id` is a stable, path-derived handle used for selection and
|
|
2522
|
-
* `?file=` deep links; `hash` is the content address used to fetch the bytes
|
|
2523
|
-
* lazily and to cache them immutably in the browser.
|
|
2524
|
-
*/
|
|
2525
|
-
const ProjectFileSummarySchema = z.object({
|
|
2526
|
-
id: z.string(),
|
|
2527
|
-
path: z.string().min(1),
|
|
2528
|
-
hash: sha256Hex
|
|
2529
|
-
});
|
|
2530
|
-
/** Maps a runtime resource slug (agent/workflow/skill) to its source file path. */
|
|
2531
|
-
const ProjectSourceResourceRefSchema = z.object({
|
|
2532
|
-
slug: z.string().min(1),
|
|
2533
|
-
path: z.string().min(1)
|
|
2534
|
-
});
|
|
2535
|
-
const ProjectSourceResourcesSchema = z.object({
|
|
2536
|
-
agents: z.array(ProjectSourceResourceRefSchema).default([]),
|
|
2537
|
-
workflows: z.array(ProjectSourceResourceRefSchema).default([]),
|
|
2538
|
-
skills: z.array(ProjectSourceResourceRefSchema).default([])
|
|
2539
|
-
});
|
|
2540
|
-
const emptyResources = () => ({
|
|
2541
|
-
agents: [],
|
|
2542
|
-
workflows: [],
|
|
2543
|
-
skills: []
|
|
2544
|
-
});
|
|
2545
|
-
/** Response for the file-tree listing of a project's active deploy. */
|
|
2546
|
-
const ListProjectFilesResponseSchema = z.object({
|
|
2547
|
-
artifactId: z.string().nullable(),
|
|
2548
|
-
files: z.array(ProjectFileSummarySchema),
|
|
2549
|
-
resources: ProjectSourceResourcesSchema.default(emptyResources())
|
|
2550
|
-
});
|
|
2551
|
-
z.object({
|
|
2552
|
-
path: z.string().min(1),
|
|
2553
|
-
contents: z.string(),
|
|
2554
|
-
hash: sha256Hex
|
|
2555
|
-
});
|
|
2556
|
-
/** A blob the CLI may need to upload, keyed by content hash. */
|
|
2557
|
-
const SourceBlobRefSchema = z.object({
|
|
2558
|
-
hash: sha256Hex,
|
|
2559
|
-
size: z.number().int().nonnegative()
|
|
2560
|
-
});
|
|
2561
|
-
/** Request: ask the platform which blobs are missing and get presigned PUTs. */
|
|
2562
|
-
const PresignProjectSourceRequestSchema = z.object({ blobs: z.array(SourceBlobRefSchema) });
|
|
2563
|
-
const PresignedBlobUploadSchema = z.object({
|
|
2564
|
-
hash: sha256Hex,
|
|
2565
|
-
url: z.string().url()
|
|
2566
|
-
});
|
|
2567
|
-
/** Response: presigned PUTs for the subset of blobs not already stored. */
|
|
2568
|
-
const PresignProjectSourceResponseSchema = z.object({ uploads: z.array(PresignedBlobUploadSchema) });
|
|
2569
|
-
/** A file reference in a manifest upload: where the path's content lives. */
|
|
2570
|
-
const ManifestFileRefSchema = z.object({
|
|
2571
|
-
path: z.string().min(1),
|
|
2572
|
-
hash: sha256Hex
|
|
2573
|
-
});
|
|
2574
|
-
/** Request body the CLI sends to finalize a deploy's source manifest. */
|
|
2575
|
-
const UploadProjectSourceManifestRequestSchema = z.object({ files: z.array(ManifestFileRefSchema) });
|
|
2576
|
-
const UploadProjectSourceResponseSchema = z.object({
|
|
2577
|
-
ok: z.literal(true),
|
|
2578
|
-
fileCount: z.number().int().nonnegative()
|
|
2579
|
-
});
|
|
2580
|
-
/** A file entry as persisted in the stored manifest (path-derived id added). */
|
|
2581
|
-
const StoredManifestFileSchema = z.object({
|
|
2582
|
-
id: z.string(),
|
|
2583
|
-
path: z.string().min(1),
|
|
2584
|
-
hash: sha256Hex
|
|
2585
|
-
});
|
|
2586
|
-
/** The immutable per-deploy manifest persisted to object storage. */
|
|
2587
|
-
const StoredProjectSourceManifestSchema = z.object({
|
|
2588
|
-
files: z.array(StoredManifestFileSchema),
|
|
2589
|
-
generatedAt: isoDateTime
|
|
2590
|
-
});
|
|
2591
|
-
/** Stable, path-derived file id (used by the web for selection + deep links). */
|
|
2592
|
-
function projectFileId(path) {
|
|
2593
|
-
return `file-${path.trim().replace(/^\.?\/+/, "").replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase()}`;
|
|
2594
|
-
}
|
|
2595
|
-
function mapOrganization(row) {
|
|
2596
|
-
return OrganizationSchema.parse({
|
|
2597
|
-
id: row.id,
|
|
2598
|
-
name: row.name,
|
|
2599
|
-
slug: row.slug,
|
|
2600
|
-
createdAt: row.createdAt.toISOString(),
|
|
2601
|
-
updatedAt: row.updatedAt.toISOString()
|
|
2602
|
-
});
|
|
2603
|
-
}
|
|
2604
|
-
function mapProject(row) {
|
|
2605
|
-
return ProjectSchema.parse({
|
|
2606
|
-
id: row.id,
|
|
2607
|
-
organizationId: row.organizationId,
|
|
2608
|
-
name: row.name,
|
|
2609
|
-
slug: row.slug,
|
|
2610
|
-
description: row.description,
|
|
2611
|
-
status: row.status,
|
|
2612
|
-
baseUrl: row.baseUrl,
|
|
2613
|
-
runtimeId: row.runtimeId,
|
|
2614
|
-
lastError: row.lastError,
|
|
2615
|
-
createdAt: row.createdAt.toISOString(),
|
|
2616
|
-
updatedAt: row.updatedAt.toISOString()
|
|
2617
|
-
});
|
|
2618
|
-
}
|
|
2619
|
-
function mapUserOrganization(row) {
|
|
2620
|
-
return UserOrganizationSchema.parse({
|
|
2621
|
-
organization: mapOrganization(row.organization),
|
|
2622
|
-
role: row.role
|
|
2623
|
-
});
|
|
2624
|
-
}
|
|
2625
|
-
function mapOrganizationMember(row) {
|
|
2626
|
-
return OrganizationMemberSchema.parse({
|
|
2627
|
-
id: row.id,
|
|
2628
|
-
name: row.name,
|
|
2629
|
-
email: row.email,
|
|
2630
|
-
role: row.role,
|
|
2631
|
-
status: row.status,
|
|
2632
|
-
...row.image ? { avatarUrl: row.image } : {},
|
|
2633
|
-
joinedAt: row.createdAt.toISOString(),
|
|
2634
|
-
lastActiveAt: null
|
|
2635
|
-
});
|
|
2636
|
-
}
|
|
2637
|
-
function mapOrganizationInvitation(row) {
|
|
2638
|
-
return OrganizationInvitationSchema.parse({
|
|
2639
|
-
id: row.id,
|
|
2640
|
-
organizationName: row.organizationName,
|
|
2641
|
-
organizationSlug: row.organizationSlug,
|
|
2642
|
-
role: row.role,
|
|
2643
|
-
...row.invitedByName ? { invitedByName: row.invitedByName } : {},
|
|
2644
|
-
...row.invitedByEmail ? { invitedByEmail: row.invitedByEmail } : {}
|
|
2645
|
-
});
|
|
2646
|
-
}
|
|
2647
|
-
function mapProjectMember(row, options) {
|
|
2648
|
-
return ProjectMemberSchema.parse({
|
|
2649
|
-
id: row.id,
|
|
2650
|
-
projectId: row.projectId,
|
|
2651
|
-
name: row.name,
|
|
2652
|
-
email: row.email,
|
|
2653
|
-
role: row.role,
|
|
2654
|
-
status: row.status,
|
|
2655
|
-
image: row.image,
|
|
2656
|
-
createdAt: row.createdAt.toISOString(),
|
|
2657
|
-
isCurrentUser: options?.isCurrentUser
|
|
2658
|
-
});
|
|
2659
|
-
}
|
|
2660
|
-
function mapProjectSettings(row) {
|
|
2661
|
-
return {
|
|
2662
|
-
description: row.description ?? "",
|
|
2663
|
-
defaultRole: row.defaultMemberRole,
|
|
2664
|
-
invitePermission: row.invitePermission
|
|
2665
|
-
};
|
|
2666
|
-
}
|
|
2667
|
-
function mapProjectArtifact(row) {
|
|
2668
|
-
return ProjectArtifactSchema.parse({
|
|
2669
|
-
id: row.id,
|
|
2670
|
-
projectId: row.projectId,
|
|
2671
|
-
storageKey: row.storageKey,
|
|
2672
|
-
status: row.status,
|
|
2673
|
-
createdAt: row.createdAt.toISOString(),
|
|
2674
|
-
updatedAt: row.updatedAt.toISOString()
|
|
2675
|
-
});
|
|
2676
|
-
}
|
|
2677
|
-
function mapProjectDeployment(row) {
|
|
2678
|
-
return ProjectDeploymentSchema.parse({
|
|
2679
|
-
id: row.id,
|
|
2680
|
-
projectId: row.projectId,
|
|
2681
|
-
version: row.version,
|
|
2682
|
-
deployedBy: row.deployedByName,
|
|
2683
|
-
...row.deployedByEmail ? { deployedByEmail: row.deployedByEmail } : {},
|
|
2684
|
-
...row.deployedByAvatarUrl ? { deployedByAvatarUrl: row.deployedByAvatarUrl } : {},
|
|
2685
|
-
createdAt: row.createdAt.toISOString(),
|
|
2686
|
-
active: row.active
|
|
2687
|
-
});
|
|
2688
|
-
}
|
|
2689
|
-
//#endregion
|
|
2690
|
-
//#region ../../packages/storage/dist/index.mjs
|
|
2691
|
-
function readEnv$1(env, ...keys) {
|
|
2692
|
-
for (const key of keys) {
|
|
2693
|
-
const value = env[key]?.trim();
|
|
2694
|
-
if (value) return value;
|
|
2695
|
-
}
|
|
2696
|
-
}
|
|
2697
|
-
function requireEnv(env, keys) {
|
|
2698
|
-
const candidates = Array.isArray(keys) ? keys : [keys];
|
|
2699
|
-
const value = readEnv$1(env, ...candidates);
|
|
2700
|
-
if (!value) throw new Error(`${candidates[0]} is required`);
|
|
2701
|
-
return value;
|
|
2702
|
-
}
|
|
2703
|
-
/** Admin S3 credentials for storage plugins (bucket is per-org, not from env). */
|
|
2704
|
-
function storageAdminConfigFromEnv(env = process.env) {
|
|
2705
|
-
const accessKeyId = requireEnv(env, ["STORAGE_ACCESS_KEY_ID", "AWS_ACCESS_KEY_ID"]);
|
|
2706
|
-
const secretAccessKey = requireEnv(env, ["STORAGE_SECRET_ACCESS_KEY", "AWS_SECRET_ACCESS_KEY"]);
|
|
2707
|
-
const endpoint = requireEnv(env, [
|
|
2708
|
-
"STORAGE_ENDPOINT",
|
|
2709
|
-
"AWS_ENDPOINT_URL_S3",
|
|
2710
|
-
"AWS_S3_ENDPOINT"
|
|
2711
|
-
]);
|
|
2712
|
-
return {
|
|
2713
|
-
region: readEnv$1(env, "STORAGE_REGION", "AWS_REGION") ?? "us-east-1",
|
|
2714
|
-
accessKeyId,
|
|
2715
|
-
secretAccessKey,
|
|
2716
|
-
endpoint,
|
|
2717
|
-
forcePathStyle: env.STORAGE_FORCE_PATH_STYLE === void 0 ? true : env.STORAGE_FORCE_PATH_STYLE === "true"
|
|
2718
|
-
};
|
|
2719
|
-
}
|
|
2720
|
-
const DEFAULT_PRESIGN_TTL_SECONDS = 900;
|
|
2721
|
-
function createStorage(config) {
|
|
2722
|
-
const client = new S3Client(toClientConfig(config));
|
|
2723
|
-
return {
|
|
2724
|
-
async putObject(input) {
|
|
2725
|
-
await client.send(new PutObjectCommand({
|
|
2726
|
-
Bucket: config.bucket,
|
|
2727
|
-
Key: input.key,
|
|
2728
|
-
Body: input.body,
|
|
2729
|
-
ContentType: input.contentType
|
|
2730
|
-
}));
|
|
2731
|
-
},
|
|
2732
|
-
async getObject(key) {
|
|
2733
|
-
const response = await client.send(new GetObjectCommand({
|
|
2734
|
-
Bucket: config.bucket,
|
|
2735
|
-
Key: key
|
|
2736
|
-
}));
|
|
2737
|
-
if (!response.Body) throw new Error(`Object body missing for key ${key}`);
|
|
2738
|
-
return response.Body.transformToByteArray();
|
|
2739
|
-
},
|
|
2740
|
-
async headObject(key) {
|
|
2741
|
-
try {
|
|
2742
|
-
return { contentLength: (await client.send(new HeadObjectCommand({
|
|
2743
|
-
Bucket: config.bucket,
|
|
2744
|
-
Key: key
|
|
2745
|
-
}))).ContentLength ?? 0 };
|
|
2746
|
-
} catch (error) {
|
|
2747
|
-
if (isNotFoundError(error)) return;
|
|
2748
|
-
throw error;
|
|
2749
|
-
}
|
|
2750
|
-
},
|
|
2751
|
-
async presignGet(input) {
|
|
2752
|
-
return getSignedUrl(client, new GetObjectCommand({
|
|
2753
|
-
Bucket: config.bucket,
|
|
2754
|
-
Key: input.key
|
|
2755
|
-
}), { expiresIn: input.expiresInSeconds ?? DEFAULT_PRESIGN_TTL_SECONDS });
|
|
2756
|
-
},
|
|
2757
|
-
async presignPut(input) {
|
|
2758
|
-
return getSignedUrl(client, new PutObjectCommand({
|
|
2759
|
-
Bucket: config.bucket,
|
|
2760
|
-
Key: input.key,
|
|
2761
|
-
ContentType: input.contentType ?? "application/gzip"
|
|
2762
|
-
}), { expiresIn: input.expiresInSeconds ?? DEFAULT_PRESIGN_TTL_SECONDS });
|
|
2763
|
-
},
|
|
2764
|
-
async deleteObject(key) {
|
|
2765
|
-
await client.send(new DeleteObjectCommand({
|
|
2766
|
-
Bucket: config.bucket,
|
|
2767
|
-
Key: key
|
|
2768
|
-
}));
|
|
2769
|
-
}
|
|
2770
|
-
};
|
|
2771
|
-
}
|
|
2772
|
-
function toClientConfig(config) {
|
|
2773
|
-
return {
|
|
2774
|
-
region: config.region,
|
|
2775
|
-
credentials: {
|
|
2776
|
-
accessKeyId: config.accessKeyId,
|
|
2777
|
-
secretAccessKey: config.secretAccessKey
|
|
2778
|
-
},
|
|
2779
|
-
endpoint: config.endpoint,
|
|
2780
|
-
forcePathStyle: config.forcePathStyle
|
|
2781
|
-
};
|
|
2782
|
-
}
|
|
2783
|
-
function isNotFoundError(error) {
|
|
2784
|
-
if (!error || typeof error !== "object") return false;
|
|
2785
|
-
const name = "name" in error ? String(error.name) : "";
|
|
2786
|
-
const status = "$metadata" in error ? error.$metadata : void 0;
|
|
2787
|
-
return name === "NotFound" || name === "NoSuchKey" || status?.httpStatusCode === 404;
|
|
2788
|
-
}
|
|
2789
|
-
var RouteManifestNotFoundError = class extends Error {
|
|
2790
|
-
constructor(message = `Route manifest missing in artifact (${ROUTE_MANIFEST_REL_PATH})`) {
|
|
2791
|
-
super(message);
|
|
2792
|
-
this.name = "RouteManifestNotFoundError";
|
|
2793
|
-
}
|
|
2794
|
-
};
|
|
2795
|
-
/** Read `.keystroke/route-manifest.json` from a packed project artifact tarball. */
|
|
2796
|
-
function extractRouteManifestFromArtifact(archive) {
|
|
2797
|
-
const tempDir = mkdtempSync(join(tmpdir(), "keystroke-artifact-"));
|
|
2798
|
-
const archivePath = join(tempDir, "artifact.tgz");
|
|
2799
|
-
try {
|
|
2800
|
-
writeFileSync(archivePath, archive);
|
|
2801
|
-
if (spawnSync("tar", [
|
|
2802
|
-
"-xzf",
|
|
2803
|
-
archivePath,
|
|
2804
|
-
"-C",
|
|
2805
|
-
tempDir,
|
|
2806
|
-
"dist/.keystroke/route-manifest.json"
|
|
2807
|
-
], { encoding: "utf8" }).status !== 0) throw new RouteManifestNotFoundError();
|
|
2808
|
-
const raw = readFileSync(join(tempDir, ROUTE_MANIFEST_REL_PATH), "utf8");
|
|
2809
|
-
return JSON.parse(raw);
|
|
2810
|
-
} catch (error) {
|
|
2811
|
-
if (error instanceof RouteManifestNotFoundError) throw error;
|
|
2812
|
-
throw new RouteManifestNotFoundError(error instanceof Error ? error.message : "Failed to extract route manifest");
|
|
2813
|
-
} finally {
|
|
2814
|
-
rmSync(tempDir, {
|
|
2815
|
-
recursive: true,
|
|
2816
|
-
force: true
|
|
2817
|
-
});
|
|
2818
|
-
}
|
|
2819
|
-
}
|
|
2820
|
-
/** Object key for a built project artifact tarball. */
|
|
2821
|
-
function projectArtifactKey(projectId, version) {
|
|
2822
|
-
return `projects/${projectId}/artifacts/${version}.tgz`;
|
|
2823
|
-
}
|
|
2824
|
-
const SHA256_HEX = /^[a-f0-9]{64}$/;
|
|
2825
|
-
/** True when `hash` is a lowercase hex sha256 digest (64 chars). */
|
|
2826
|
-
function isSourceBlobHash(hash) {
|
|
2827
|
-
return SHA256_HEX.test(hash);
|
|
2828
|
-
}
|
|
2829
|
-
/**
|
|
2830
|
-
* Content-addressed key for a single source file's contents, deduped across all
|
|
2831
|
-
* of a project's deploys. `hash` is a lowercase hex sha256 of the file bytes.
|
|
2832
|
-
*/
|
|
2833
|
-
function projectSourceBlobKey(projectId, hash) {
|
|
2834
|
-
if (!isSourceBlobHash(hash)) throw new Error("Invalid source blob hash");
|
|
2835
|
-
return `projects/${projectId}/sources/blobs/${hash}`;
|
|
2836
|
-
}
|
|
2837
|
-
const AVATAR_EXTENSION = /^[a-z0-9]+$/;
|
|
2838
|
-
/** Object key for a user's custom profile avatar in the shared keystroke-users bucket. */
|
|
2839
|
-
function userAvatarStorageKey(userId, extension) {
|
|
2840
|
-
const ext = extension.replace(/^\./, "").toLowerCase();
|
|
2841
|
-
if (!AVATAR_EXTENSION.test(ext)) throw new Error("Invalid avatar extension");
|
|
2842
|
-
return `avatars/${userId}/avatar.${ext}`;
|
|
2843
|
-
}
|
|
2844
|
-
/** True when `key` is the canonical avatar object for `userId`. */
|
|
2845
|
-
function isUserAvatarStorageKey(key, userId) {
|
|
2846
|
-
const prefix = `avatars/${userId}/avatar.`;
|
|
2847
|
-
if (!key.startsWith(prefix)) return false;
|
|
2848
|
-
const ext = key.slice(prefix.length);
|
|
2849
|
-
return AVATAR_EXTENSION.test(ext);
|
|
2850
|
-
}
|
|
2851
|
-
/** Object key for an org logo in the shared keystroke-assets bucket. */
|
|
2852
|
-
function orgLogoStorageKey(organizationId, variant, extension) {
|
|
2853
|
-
const ext = extension.replace(/^\./, "").toLowerCase();
|
|
2854
|
-
if (!AVATAR_EXTENSION.test(ext)) throw new Error("Invalid org logo extension");
|
|
2855
|
-
return `org-logos/${organizationId}/logo-${variant}.${ext}`;
|
|
2856
|
-
}
|
|
2857
|
-
/** True when `key` is the canonical logo object for `organizationId` and `variant`. */
|
|
2858
|
-
function isOrgLogoStorageKey(key, organizationId, variant) {
|
|
2859
|
-
const prefix = `org-logos/${organizationId}/logo-${variant}.`;
|
|
2860
|
-
if (!key.startsWith(prefix)) return false;
|
|
2861
|
-
const ext = key.slice(prefix.length);
|
|
2862
|
-
return AVATAR_EXTENSION.test(ext);
|
|
2863
|
-
}
|
|
2864
|
-
function isBucketAlreadyExistsError(error) {
|
|
2865
|
-
if (!error || typeof error !== "object") return false;
|
|
2866
|
-
const name = "name" in error ? String(error.name) : "";
|
|
2867
|
-
const code = "Code" in error ? String(error.Code) : "";
|
|
2868
|
-
return name === "BucketAlreadyOwnedByYou" || code === "BucketAlreadyOwnedByYou" || name === "BucketAlreadyExists" || code === "BucketAlreadyExists";
|
|
2869
|
-
}
|
|
2870
|
-
/** Shared bucket for cross-org public assets (avatars, org sidebar logos). */
|
|
2871
|
-
const KEYSTROKE_ASSETS_BUCKET = "keystroke-assets";
|
|
2872
|
-
/** Env var for the browser-facing origin of public asset objects (no trailing slash). */
|
|
2873
|
-
const KEYSTROKE_ASSETS_PUBLIC_URL_BASE_ENV = "KEYSTROKE_ASSETS_PUBLIC_URL_BASE";
|
|
2874
|
-
const KEYSTROKE_ASSETS_AVATAR_PREFIX = "avatars/";
|
|
2875
|
-
const KEYSTROKE_ASSETS_ORG_LOGO_PREFIX = "org-logos/";
|
|
2876
|
-
function readEnv(env, key) {
|
|
2877
|
-
return env[key]?.trim() || void 0;
|
|
2878
|
-
}
|
|
2879
|
-
/** Default path-style base when `KEYSTROKE_ASSETS_PUBLIC_URL_BASE` is unset (local MinIO). */
|
|
2880
|
-
function defaultKeystrokeAssetsPublicUrlBase(env = process.env) {
|
|
2881
|
-
return `${storageAdminConfigFromEnv(env).endpoint.replace(/\/+$/, "")}/${KEYSTROKE_ASSETS_BUCKET}`;
|
|
2882
|
-
}
|
|
2883
|
-
/** Public URL prefix for asset objects — configured base or local path-style default. */
|
|
2884
|
-
function keystrokeAssetsPublicUrlBase(env = process.env) {
|
|
2885
|
-
const configured = readEnv(env, KEYSTROKE_ASSETS_PUBLIC_URL_BASE_ENV);
|
|
2886
|
-
if (configured) return configured.replace(/\/+$/, "");
|
|
2887
|
-
return defaultKeystrokeAssetsPublicUrlBase(env);
|
|
2888
|
-
}
|
|
2889
|
-
function keystrokeAssetsPublicUrlPrefixes(env = process.env) {
|
|
2890
|
-
const prefixes = [keystrokeAssetsPublicUrlBase(env)];
|
|
2891
|
-
if (readEnv(env, "KEYSTROKE_ASSETS_PUBLIC_URL_BASE")) prefixes.push(defaultKeystrokeAssetsPublicUrlBase(env));
|
|
2892
|
-
return [...new Set(prefixes)];
|
|
2893
|
-
}
|
|
2894
|
-
function createAssetsStorageClient(env = process.env) {
|
|
2895
|
-
return createStorage({
|
|
2896
|
-
...storageAdminConfigFromEnv(env),
|
|
2897
|
-
bucket: KEYSTROKE_ASSETS_BUCKET
|
|
2898
|
-
});
|
|
2899
|
-
}
|
|
2900
|
-
/** Stable public URL for an object in the keystroke-assets bucket. */
|
|
2901
|
-
function publicKeystrokeAssetsObjectUrl(key, env = process.env) {
|
|
2902
|
-
return `${keystrokeAssetsPublicUrlBase(env)}/${key}`;
|
|
2903
|
-
}
|
|
2904
|
-
/** Extract the object key from a public keystroke-assets URL when it matches `requiredPrefix`. */
|
|
2905
|
-
function keystrokeAssetsKeyFromPublicUrl(url, requiredPrefix, env = process.env) {
|
|
2906
|
-
for (const prefix of keystrokeAssetsPublicUrlPrefixes(env)) {
|
|
2907
|
-
const normalizedPrefix = `${prefix.replace(/\/+$/, "")}/`;
|
|
2908
|
-
if (!url.startsWith(normalizedPrefix)) continue;
|
|
2909
|
-
const key = decodeURIComponent(url.slice(normalizedPrefix.length).split("?")[0] ?? "");
|
|
2910
|
-
if (key.startsWith(requiredPrefix)) return key;
|
|
2911
|
-
}
|
|
2912
|
-
return null;
|
|
2913
|
-
}
|
|
2914
|
-
function isKeystrokeAssetsAvatarPublicUrl(url, env = process.env) {
|
|
2915
|
-
return keystrokeAssetsKeyFromPublicUrl(url, KEYSTROKE_ASSETS_AVATAR_PREFIX, env) !== null;
|
|
2916
|
-
}
|
|
2917
|
-
function keystrokeAssetsAvatarKeyFromPublicUrl(url, env = process.env) {
|
|
2918
|
-
return keystrokeAssetsKeyFromPublicUrl(url, KEYSTROKE_ASSETS_AVATAR_PREFIX, env);
|
|
2919
|
-
}
|
|
2920
|
-
function isKeystrokeAssetsOrgLogoPublicUrl(url, env = process.env) {
|
|
2921
|
-
return keystrokeAssetsKeyFromPublicUrl(url, KEYSTROKE_ASSETS_ORG_LOGO_PREFIX, env) !== null;
|
|
2922
|
-
}
|
|
2923
|
-
function keystrokeAssetsOrgLogoKeyFromPublicUrl(url, env = process.env) {
|
|
2924
|
-
return keystrokeAssetsKeyFromPublicUrl(url, KEYSTROKE_ASSETS_ORG_LOGO_PREFIX, env);
|
|
2925
|
-
}
|
|
2926
|
-
async function ensureKeystrokeAssetsBucket(env = process.env) {
|
|
2927
|
-
const adminConfig = storageAdminConfigFromEnv(env);
|
|
2928
|
-
const adminClient = new S3Client({
|
|
2929
|
-
region: adminConfig.region,
|
|
2930
|
-
credentials: {
|
|
2931
|
-
accessKeyId: adminConfig.accessKeyId,
|
|
2932
|
-
secretAccessKey: adminConfig.secretAccessKey
|
|
2933
|
-
},
|
|
2934
|
-
endpoint: adminConfig.endpoint,
|
|
2935
|
-
forcePathStyle: adminConfig.forcePathStyle
|
|
2936
|
-
});
|
|
2937
|
-
await createAssetsBucketIfNeeded(adminClient, KEYSTROKE_ASSETS_BUCKET);
|
|
2938
|
-
await applyPublicAssetsBucketAcl(adminClient, KEYSTROKE_ASSETS_BUCKET);
|
|
2939
|
-
await applyPublicAssetsBucketPolicy(adminClient, KEYSTROKE_ASSETS_BUCKET);
|
|
2940
|
-
}
|
|
2941
|
-
async function createAssetsBucketIfNeeded(adminClient, bucket) {
|
|
2942
|
-
try {
|
|
2943
|
-
await adminClient.send(new CreateBucketCommand({
|
|
2944
|
-
Bucket: bucket,
|
|
2945
|
-
ACL: "public-read"
|
|
2946
|
-
}));
|
|
2947
|
-
return;
|
|
2948
|
-
} catch (error) {
|
|
2949
|
-
if (isBucketAlreadyExistsError(error)) return;
|
|
2950
|
-
}
|
|
2951
|
-
try {
|
|
2952
|
-
await adminClient.send(new CreateBucketCommand({ Bucket: bucket }));
|
|
2953
|
-
} catch (error) {
|
|
2954
|
-
if (!isBucketAlreadyExistsError(error)) throw error;
|
|
2955
|
-
}
|
|
2956
|
-
}
|
|
2957
|
-
async function applyPublicAssetsBucketAcl(adminClient, bucket) {
|
|
2958
|
-
try {
|
|
2959
|
-
await adminClient.send(new PutBucketAclCommand({
|
|
2960
|
-
Bucket: bucket,
|
|
2961
|
-
ACL: "public-read"
|
|
2962
|
-
}));
|
|
2963
|
-
} catch (error) {
|
|
2964
|
-
if (!isUnsupportedStorageFeatureError(error)) console.warn("[storage] PutBucketAcl failed (continuing):", error);
|
|
2965
|
-
}
|
|
2966
|
-
}
|
|
2967
|
-
async function applyPublicAssetsBucketPolicy(adminClient, bucket) {
|
|
2968
|
-
try {
|
|
2969
|
-
await adminClient.send(new PutBucketPolicyCommand({
|
|
2970
|
-
Bucket: bucket,
|
|
2971
|
-
Policy: JSON.stringify({
|
|
2972
|
-
Version: "2012-10-17",
|
|
2973
|
-
Statement: [{
|
|
2974
|
-
Effect: "Allow",
|
|
2975
|
-
Principal: "*",
|
|
2976
|
-
Action: ["s3:GetObject"],
|
|
2977
|
-
Resource: [`arn:aws:s3:::${bucket}/${KEYSTROKE_ASSETS_AVATAR_PREFIX}*`, `arn:aws:s3:::${bucket}/${KEYSTROKE_ASSETS_ORG_LOGO_PREFIX}*`]
|
|
2978
|
-
}]
|
|
2979
|
-
})
|
|
2980
|
-
}));
|
|
2981
|
-
} catch (error) {
|
|
2982
|
-
if (!isUnsupportedStorageFeatureError(error)) console.warn("[storage] PutBucketPolicy failed (continuing):", error);
|
|
2983
|
-
}
|
|
2984
|
-
}
|
|
2985
|
-
function isUnsupportedStorageFeatureError(error) {
|
|
2986
|
-
if (!error || typeof error !== "object") return false;
|
|
2987
|
-
const name = "name" in error ? String(error.name) : "";
|
|
2988
|
-
const code = "Code" in error ? String(error.Code) : "";
|
|
2989
|
-
return name === "NotImplemented" || code === "NotImplemented" || code === "NotSupported";
|
|
2990
|
-
}
|
|
2991
|
-
const DEFAULT_BUCKET_NAME_PREFIX = "ks";
|
|
2992
|
-
function orgStorageBucketName(input, prefix = DEFAULT_BUCKET_NAME_PREFIX) {
|
|
2993
|
-
return `${prefix.trim().replace(/-+$/g, "")}-${input.organizationId.toLowerCase()}`;
|
|
2994
|
-
}
|
|
2995
|
-
function minioStoragePlugin(options = {}) {
|
|
2996
|
-
const adminConfig = storageAdminConfigFromEnv(options.env ?? process.env);
|
|
2997
|
-
const adminClient = new S3Client({
|
|
2998
|
-
region: adminConfig.region,
|
|
2999
|
-
credentials: {
|
|
3000
|
-
accessKeyId: adminConfig.accessKeyId,
|
|
3001
|
-
secretAccessKey: adminConfig.secretAccessKey
|
|
3002
|
-
},
|
|
3003
|
-
endpoint: adminConfig.endpoint,
|
|
3004
|
-
forcePathStyle: adminConfig.forcePathStyle
|
|
3005
|
-
});
|
|
3006
|
-
return {
|
|
3007
|
-
async provisionOrganization(input) {
|
|
3008
|
-
const bucket = orgStorageBucketName(input, options.bucketNamePrefix);
|
|
3009
|
-
try {
|
|
3010
|
-
await adminClient.send(new CreateBucketCommand({ Bucket: bucket }));
|
|
3011
|
-
} catch (error) {
|
|
3012
|
-
if (!isBucketAlreadyExistsError(error)) throw error;
|
|
3013
|
-
}
|
|
3014
|
-
return {
|
|
3015
|
-
bucket,
|
|
3016
|
-
endpoint: adminConfig.endpoint,
|
|
3017
|
-
accessKeyId: adminConfig.accessKeyId,
|
|
3018
|
-
secretAccessKey: adminConfig.secretAccessKey,
|
|
3019
|
-
region: adminConfig.region,
|
|
3020
|
-
forcePathStyle: adminConfig.forcePathStyle
|
|
3021
|
-
};
|
|
3022
|
-
},
|
|
3023
|
-
async deprovisionOrganization(result) {
|
|
3024
|
-
const client = new S3Client({
|
|
3025
|
-
region: result.region ?? adminConfig.region,
|
|
3026
|
-
credentials: {
|
|
3027
|
-
accessKeyId: result.accessKeyId,
|
|
3028
|
-
secretAccessKey: result.secretAccessKey
|
|
3029
|
-
},
|
|
3030
|
-
endpoint: result.endpoint,
|
|
3031
|
-
forcePathStyle: result.forcePathStyle ?? true
|
|
3032
|
-
});
|
|
3033
|
-
if (((await client.send(new ListObjectsV2Command({
|
|
3034
|
-
Bucket: result.bucket,
|
|
3035
|
-
MaxKeys: 1
|
|
3036
|
-
}))).KeyCount ?? 0) > 0) throw new Error(`Refusing to delete non-empty storage bucket ${result.bucket}`);
|
|
3037
|
-
await client.send(new DeleteBucketCommand({ Bucket: result.bucket }));
|
|
3038
|
-
}
|
|
3039
|
-
};
|
|
3040
|
-
}
|
|
3041
|
-
//#endregion
|
|
3042
|
-
export { ListProjectMembersResponseSchema as $, mapProjectDeployment as $t, CreateProjectArtifactResponseSchema as A, UpdateOrganizationMemberResponseSchema as At, HistoryRunListResponseSchema as B, UserPreferencesPatchSchema as Bt, CompleteProjectArtifactResponseSchema as C, SlugAvailabilityQuerySchema as Ct, CreateCredentialsResponseSchema as D, SubmitTeamRequestResponseSchema as Dt, CreateCredentialsRequestSchema as E, SubmitTeamRequestRequestSchema as Et, ErrorResponseSchema as F, UpdateProjectSettingsRequestSchema as Ft, ListApiKeysResponseSchema as G, buildCredentialInstanceLabel as Gt, InviteOrganizationMembersResponseSchema as H, WorkflowSummaryDetailResponseSchema as Ht, GetCredentialResponseSchema as I, UploadProjectSourceManifestRequestSchema as It, ListOrganizationInvitationsResponseSchema as J, listenPortFromPublicUrl as Jt, ListAppsResponseSchema as K, credentialInputSchema as Kt, HistoryRunCancelResponseSchema as L, UploadProjectSourceResponseSchema as Lt, CreateProjectResponseSchema as M, UpdateProjectMemberRequestSchema as Mt, DeclineOrganizationInvitationResponseSchema as N, UpdateProjectMemberResponseSchema as Nt, CreateOrganizationRequestSchema as O, UpdateCredentialRequestSchema as Ot, DownloadActiveProjectArtifactResponseSchema as P, UpdateProjectRequestSchema as Pt, ListProjectFilesResponseSchema as Q, mapProjectArtifact as Qt, HistoryRunDetailResponseSchema as R, UserAvatarPatchSchema as Rt, AgentSummarySchema as S, SkillSummarySchema as St, CreateApiKeyResponseSchema as T, StoredProjectSourceManifestSchema as Tt, InviteProjectMembersRequestSchema as U, WorkflowSummaryListResponseSchema as Ut, InviteOrganizationMembersRequestSchema as V, UserPreferencesSchema as Vt, InviteProjectMembersResponseSchema as W, WorkflowSummarySchema as Wt, ListOrganizationsResponseSchema as X, mapOrganizationMember as Xt, ListOrganizationMembersResponseSchema as Y, mapOrganizationInvitation as Yt, ListProjectDeploymentsResponseSchema as Z, mapProject as Zt, ACTIVE_ORG_HEADER as _, ProjectSourceResourcesSchema as _t, isKeystrokeAssetsAvatarPublicUrl as a, organizationInvitationAcceptPath as an, PROJECT_SLUG_TAKEN_MESSAGE as at, AgentSummaryDetailResponseSchema as b, SkillSummaryDetailResponseSchema as bt, isUserAvatarStorageKey as c, projectFileId as cn, PresignProjectSourceRequestSchema as ct, minioStoragePlugin as d, defaultHostingPlugin as dn, PresignUserAvatarResponseSchema as dt, mapProjectMember as en, ListProjectMetricsResponseSchema as et, orgLogoStorageKey as f, pingProjectTarget as fn, ProjectReachabilityResponseSchema as ft, userAvatarStorageKey as g, ProjectSlugAvailabilityResponseSchema as gt, publicKeystrokeAssetsObjectUrl as h, ProjectSlugAvailabilityQuerySchema as ht, extractRouteManifestFromArtifact as i, normalizeUserPreferences as in, PLATFORM_RESOURCE_UNSUPPORTED_TEXT as it, CreateProjectRequestSchema as j, UpdateOrganizationRequestSchema as jt, CreateOrganizationResponseSchema as k, UpdateOrganizationMemberRequestSchema as kt, keystrokeAssetsAvatarKeyFromPublicUrl as l, resolveUniqueCredentialInstanceLabel as ln, PresignProjectSourceResponseSchema as lt, projectSourceBlobKey as m, ProjectSettingsResponseSchema as mt, createAssetsStorageClient as n, mapUserOrganization as nn, OrganizationSidebarBrandingPatchSchema as nt, isKeystrokeAssetsOrgLogoPublicUrl as o, organizationSlugErrorCodeFromMessage as on, PresignOrgLogoRequestSchema as ot, projectArtifactKey as p, ProjectResponseSchema as pt, ListCredentialsResponseSchema as q, displayCredentialAppName as qt, ensureKeystrokeAssetsBucket as r, mergeUserPreferences as rn, OrganizationSidebarBrandingSchema as rt, isOrgLogoStorageKey as s, parseStoredRouteManifest as sn, PresignOrgLogoResponseSchema as st, RouteManifestNotFoundError as t, mapProjectSettings as tn, ListProjectsResponseSchema as tt, keystrokeAssetsOrgLogoKeyFromPublicUrl as u, validationErrorResponse as un, PresignUserAvatarRequestSchema as ut, AcceptOrganizationInvitationResponseSchema as v, RecentResourceListResponseSchema as vt, CreateApiKeyRequestSchema as w, SlugAvailabilityResponseSchema as wt, AgentSummaryListResponseSchema as x, SkillSummaryListResponseSchema as xt, ActiveOrganizationResponseSchema as y, RecentResourceSchema as yt, HistoryRunListQuerySchema as z, UserAvatarSchema as zt };
|
|
3043
|
-
|
|
3044
|
-
//# sourceMappingURL=dist-B1hOOWjl.mjs.map
|