@keystrokehq/platform 0.1.5 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/dist/{awk2-LA3USKJP-AIZOQ0nh.cjs → awk2-LA3USKJP-BX_f5xEm.cjs} +40 -40
  2. package/dist/{awk2-LA3USKJP-AIZOQ0nh.cjs.map → awk2-LA3USKJP-BX_f5xEm.cjs.map} +1 -1
  3. package/dist/{awk2-LA3USKJP-CPcab6tL.mjs → awk2-LA3USKJP-Og7WTTTV.mjs} +2 -2
  4. package/dist/{awk2-LA3USKJP-CPcab6tL.mjs.map → awk2-LA3USKJP-Og7WTTTV.mjs.map} +1 -1
  5. package/dist/{base64-C2AIWVNC-BU7vFrSz.mjs → base64-C2AIWVNC-CWnEsAFR.mjs} +2 -2
  6. package/dist/{base64-C2AIWVNC-BU7vFrSz.mjs.map → base64-C2AIWVNC-CWnEsAFR.mjs.map} +1 -1
  7. package/dist/{base64-C2AIWVNC-fWp5IaIt.cjs → base64-C2AIWVNC-xY0o1izr.cjs} +2 -2
  8. package/dist/{base64-C2AIWVNC-fWp5IaIt.cjs.map → base64-C2AIWVNC-xY0o1izr.cjs.map} +1 -1
  9. package/dist/{bash-YZ33HQZQ-B7vkAJM1.mjs → bash-YZ33HQZQ-CwBcNtq8.mjs} +2 -2
  10. package/dist/{bash-YZ33HQZQ-B7vkAJM1.mjs.map → bash-YZ33HQZQ-CwBcNtq8.mjs.map} +1 -1
  11. package/dist/{bash-YZ33HQZQ-BfFH_xKv.cjs → bash-YZ33HQZQ-DEgQkmLN.cjs} +5 -5
  12. package/dist/{bash-YZ33HQZQ-BfFH_xKv.cjs.map → bash-YZ33HQZQ-DEgQkmLN.cjs.map} +1 -1
  13. package/dist/{cat-TSFMZVYS-Lk2fLg0m.cjs → cat-TSFMZVYS-CE8iJIL3.cjs} +3 -3
  14. package/dist/{cat-TSFMZVYS-Lk2fLg0m.cjs.map → cat-TSFMZVYS-CE8iJIL3.cjs.map} +1 -1
  15. package/dist/{cat-TSFMZVYS-BoRCwL0X.mjs → cat-TSFMZVYS-DIffGanR.mjs} +3 -3
  16. package/dist/{cat-TSFMZVYS-BoRCwL0X.mjs.map → cat-TSFMZVYS-DIffGanR.mjs.map} +1 -1
  17. package/dist/{chunk-5H5SCKJM-Bf_pfjgz.cjs → chunk-5H5SCKJM-BqPkrOgR.cjs} +32 -32
  18. package/dist/{chunk-5H5SCKJM-Bf_pfjgz.cjs.map → chunk-5H5SCKJM-BqPkrOgR.cjs.map} +1 -1
  19. package/dist/{chunk-5H5SCKJM-CCkl-6iR.mjs → chunk-5H5SCKJM-CoKwUfnC.mjs} +2 -2
  20. package/dist/{chunk-5H5SCKJM-CCkl-6iR.mjs.map → chunk-5H5SCKJM-CoKwUfnC.mjs.map} +1 -1
  21. package/dist/{chunk-AQ6FYS2X-CaSbvwYS.mjs → chunk-AQ6FYS2X-CdU2NSVs.mjs} +2 -2
  22. package/dist/{chunk-AQ6FYS2X-CaSbvwYS.mjs.map → chunk-AQ6FYS2X-CdU2NSVs.mjs.map} +1 -1
  23. package/dist/{chunk-AQ6FYS2X-C_kf5YCJ.cjs → chunk-AQ6FYS2X-CgExDvHQ.cjs} +3 -3
  24. package/dist/{chunk-AQ6FYS2X-C_kf5YCJ.cjs.map → chunk-AQ6FYS2X-CgExDvHQ.cjs.map} +1 -1
  25. package/dist/{chunk-CHFEPBH4-Bk9Prhxt.mjs → chunk-CHFEPBH4-B8Yle41q.mjs} +2 -2
  26. package/dist/{chunk-CHFEPBH4-Bk9Prhxt.mjs.map → chunk-CHFEPBH4-B8Yle41q.mjs.map} +1 -1
  27. package/dist/{chunk-CHFEPBH4-Cdk9vq_c.cjs → chunk-CHFEPBH4-DkZruhqP.cjs} +3 -3
  28. package/dist/{chunk-CHFEPBH4-Cdk9vq_c.cjs.map → chunk-CHFEPBH4-DkZruhqP.cjs.map} +1 -1
  29. package/dist/{chunk-EBAPSGAO-BPVz-6BX.mjs → chunk-EBAPSGAO-Ba-I7RAs.mjs} +2 -2
  30. package/dist/{chunk-EBAPSGAO-BPVz-6BX.mjs.map → chunk-EBAPSGAO-Ba-I7RAs.mjs.map} +1 -1
  31. package/dist/{chunk-EBAPSGAO-9HAVo6nm.cjs → chunk-EBAPSGAO-CVyFc0vH.cjs} +3 -3
  32. package/dist/{chunk-EBAPSGAO-9HAVo6nm.cjs.map → chunk-EBAPSGAO-CVyFc0vH.cjs.map} +1 -1
  33. package/dist/{chunk-LEKBROJD-Bk_pJfFK.mjs → chunk-LEKBROJD-BCPXdvWw.mjs} +2 -2
  34. package/dist/{chunk-LEKBROJD-Bk_pJfFK.mjs.map → chunk-LEKBROJD-BCPXdvWw.mjs.map} +1 -1
  35. package/dist/{chunk-LEKBROJD-4MTnJXG3.cjs → chunk-LEKBROJD-DEy7k23L.cjs} +17 -17
  36. package/dist/{chunk-LEKBROJD-4MTnJXG3.cjs.map → chunk-LEKBROJD-DEy7k23L.cjs.map} +1 -1
  37. package/dist/{chunk-VPADYNBD-CS9VA1aJ.cjs → chunk-VPADYNBD-BtNErXh7.cjs} +3 -3
  38. package/dist/{chunk-VPADYNBD-CS9VA1aJ.cjs.map → chunk-VPADYNBD-BtNErXh7.cjs.map} +1 -1
  39. package/dist/{chunk-VPADYNBD-Bc5abqkF.mjs → chunk-VPADYNBD-D6W8m472.mjs} +2 -2
  40. package/dist/{chunk-VPADYNBD-Bc5abqkF.mjs.map → chunk-VPADYNBD-D6W8m472.mjs.map} +1 -1
  41. package/dist/{chunk-YCLFEX4T-Cz2QbPh0.mjs → chunk-YCLFEX4T-C5Zm6f-y.mjs} +2 -2
  42. package/dist/{chunk-YCLFEX4T-Cz2QbPh0.mjs.map → chunk-YCLFEX4T-C5Zm6f-y.mjs.map} +1 -1
  43. package/dist/{chunk-YCLFEX4T-D65vwGHr.cjs → chunk-YCLFEX4T-CVuOhI4h.cjs} +3 -3
  44. package/dist/{chunk-YCLFEX4T-D65vwGHr.cjs.map → chunk-YCLFEX4T-CVuOhI4h.cjs.map} +1 -1
  45. package/dist/{column-XT6UFXNQ-BsXqWbAP.mjs → column-XT6UFXNQ-CKR9qK7y.mjs} +2 -2
  46. package/dist/{column-XT6UFXNQ-BsXqWbAP.mjs.map → column-XT6UFXNQ-CKR9qK7y.mjs.map} +1 -1
  47. package/dist/{column-XT6UFXNQ-CwtLFuCh.cjs → column-XT6UFXNQ-CeiWNAzO.cjs} +4 -4
  48. package/dist/{column-XT6UFXNQ-CwtLFuCh.cjs.map → column-XT6UFXNQ-CeiWNAzO.cjs.map} +1 -1
  49. package/dist/{comm-VV2LDX2J-YL8m_4d1.cjs → comm-VV2LDX2J-5awXD4SJ.cjs} +3 -3
  50. package/dist/{comm-VV2LDX2J-YL8m_4d1.cjs.map → comm-VV2LDX2J-5awXD4SJ.cjs.map} +1 -1
  51. package/dist/{comm-VV2LDX2J-BZdS-Fqy.mjs → comm-VV2LDX2J-By6PvRFk.mjs} +2 -2
  52. package/dist/{comm-VV2LDX2J-BZdS-Fqy.mjs.map → comm-VV2LDX2J-By6PvRFk.mjs.map} +1 -1
  53. package/dist/{config-DF8H5mS5.d.mts → config-pCKnlcL-.d.mts} +2 -2
  54. package/dist/config.cjs +1 -1
  55. package/dist/config.d.mts +1 -1
  56. package/dist/config.mjs +1 -1
  57. package/dist/{cp-BISAAS7A-Dx6QG-P9.cjs → cp-BISAAS7A-Cs_viays.cjs} +3 -3
  58. package/dist/{cp-BISAAS7A-Dx6QG-P9.cjs.map → cp-BISAAS7A-Cs_viays.cjs.map} +1 -1
  59. package/dist/{cp-BISAAS7A-C0MVoZpt.mjs → cp-BISAAS7A-McE5zv9m.mjs} +2 -2
  60. package/dist/{cp-BISAAS7A-C0MVoZpt.mjs.map → cp-BISAAS7A-McE5zv9m.mjs.map} +1 -1
  61. package/dist/{cut-OKARJCCV-C1CAocst.cjs → cut-OKARJCCV-CNiRA71s.cjs} +4 -4
  62. package/dist/{cut-OKARJCCV-C1CAocst.cjs.map → cut-OKARJCCV-CNiRA71s.cjs.map} +1 -1
  63. package/dist/{cut-OKARJCCV-BKWEQwCZ.mjs → cut-OKARJCCV-VyVT0kyn.mjs} +3 -3
  64. package/dist/{cut-OKARJCCV-BKWEQwCZ.mjs.map → cut-OKARJCCV-VyVT0kyn.mjs.map} +1 -1
  65. package/dist/{diff-MWJFIG7X-YTniIfbL.mjs → diff-MWJFIG7X-B6ciCjQa.mjs} +2 -2
  66. package/dist/{diff-MWJFIG7X-YTniIfbL.mjs.map → diff-MWJFIG7X-B6ciCjQa.mjs.map} +1 -1
  67. package/dist/{diff-MWJFIG7X-D5nTdPdk.cjs → diff-MWJFIG7X-DJfHAQq4.cjs} +4 -4
  68. package/dist/{diff-MWJFIG7X-D5nTdPdk.cjs.map → diff-MWJFIG7X-DJfHAQq4.cjs.map} +1 -1
  69. package/dist/{dist-C3ioU2dM.cjs → dist-DCerSc01.cjs} +146 -24117
  70. package/dist/dist-DCerSc01.cjs.map +1 -0
  71. package/dist/{dist-CQMZgfp_.mjs → dist-Drb4M1g2.mjs} +11 -23852
  72. package/dist/dist-Drb4M1g2.mjs.map +1 -0
  73. package/dist/{du-572XNP42-CmxmrMJd.mjs → du-572XNP42-B5rNwUSo.mjs} +2 -2
  74. package/dist/{du-572XNP42-CmxmrMJd.mjs.map → du-572XNP42-B5rNwUSo.mjs.map} +1 -1
  75. package/dist/{du-572XNP42-B2vhVgxe.cjs → du-572XNP42-Iv7bX_J6.cjs} +2 -2
  76. package/dist/{du-572XNP42-B2vhVgxe.cjs.map → du-572XNP42-Iv7bX_J6.cjs.map} +1 -1
  77. package/dist/{env-36M5BO7M-Dj2YwzST.cjs → env-36M5BO7M-BcJWF_p3.cjs} +3 -3
  78. package/dist/{env-36M5BO7M-Dj2YwzST.cjs.map → env-36M5BO7M-BcJWF_p3.cjs.map} +1 -1
  79. package/dist/{env-36M5BO7M-DupdD4fz.mjs → env-36M5BO7M-Blzb5FzN.mjs} +2 -2
  80. package/dist/{env-36M5BO7M-DupdD4fz.mjs.map → env-36M5BO7M-Blzb5FzN.mjs.map} +1 -1
  81. package/dist/{expand-JSPG6VOP-BtD3fO-u.mjs → expand-JSPG6VOP-C_wueGj3.mjs} +2 -2
  82. package/dist/{expand-JSPG6VOP-BtD3fO-u.mjs.map → expand-JSPG6VOP-C_wueGj3.mjs.map} +1 -1
  83. package/dist/{expand-JSPG6VOP-C4VQzWfg.cjs → expand-JSPG6VOP-DMhqbYB4.cjs} +3 -3
  84. package/dist/{expand-JSPG6VOP-C4VQzWfg.cjs.map → expand-JSPG6VOP-DMhqbYB4.cjs.map} +1 -1
  85. package/dist/{expr-5JAACS4X-DX-k1Bjo.cjs → expr-5JAACS4X-CDzmynhc.cjs} +5 -5
  86. package/dist/{expr-5JAACS4X-DX-k1Bjo.cjs.map → expr-5JAACS4X-CDzmynhc.cjs.map} +1 -1
  87. package/dist/{expr-5JAACS4X-C75E9ncn.mjs → expr-5JAACS4X-GAOVSam5.mjs} +2 -2
  88. package/dist/{expr-5JAACS4X-C75E9ncn.mjs.map → expr-5JAACS4X-GAOVSam5.mjs.map} +1 -1
  89. package/dist/{find-INTH3OLC-2rIv2Sgt.cjs → find-INTH3OLC-CkFpi26_.cjs} +7 -7
  90. package/dist/{find-INTH3OLC-2rIv2Sgt.cjs.map → find-INTH3OLC-CkFpi26_.cjs.map} +1 -1
  91. package/dist/{find-INTH3OLC-B2oqqlwt.mjs → find-INTH3OLC-DAn3o_TH.mjs} +3 -3
  92. package/dist/{find-INTH3OLC-B2oqqlwt.mjs.map → find-INTH3OLC-DAn3o_TH.mjs.map} +1 -1
  93. package/dist/{fold-4TQNYMSW-DFQEjMsZ.cjs → fold-4TQNYMSW-CgU0z0Lb.cjs} +3 -3
  94. package/dist/{fold-4TQNYMSW-DFQEjMsZ.cjs.map → fold-4TQNYMSW-CgU0z0Lb.cjs.map} +1 -1
  95. package/dist/{fold-4TQNYMSW-DzA5SsAN.mjs → fold-4TQNYMSW-D3z6H_wP.mjs} +2 -2
  96. package/dist/{fold-4TQNYMSW-DzA5SsAN.mjs.map → fold-4TQNYMSW-D3z6H_wP.mjs.map} +1 -1
  97. package/dist/{grep-V3LQVMRQ-D--OXkar.cjs → grep-V3LQVMRQ-BKZqP55P.cjs} +5 -5
  98. package/dist/{grep-V3LQVMRQ-D--OXkar.cjs.map → grep-V3LQVMRQ-BKZqP55P.cjs.map} +1 -1
  99. package/dist/{grep-V3LQVMRQ-CUJiTsKp.mjs → grep-V3LQVMRQ-DsCks6zK.mjs} +4 -4
  100. package/dist/{grep-V3LQVMRQ-CUJiTsKp.mjs.map → grep-V3LQVMRQ-DsCks6zK.mjs.map} +1 -1
  101. package/dist/{gzip-O5ASJAFY-D8i6m9_W.mjs → gzip-O5ASJAFY-BhSGt17k.mjs} +2 -2
  102. package/dist/{gzip-O5ASJAFY-D8i6m9_W.mjs.map → gzip-O5ASJAFY-BhSGt17k.mjs.map} +1 -1
  103. package/dist/{gzip-O5ASJAFY-B3o0_eql.cjs → gzip-O5ASJAFY-CDdmGJoy.cjs} +2 -2
  104. package/dist/{gzip-O5ASJAFY-B3o0_eql.cjs.map → gzip-O5ASJAFY-CDdmGJoy.cjs.map} +1 -1
  105. package/dist/{head-442HYESI-Bztg6Xka.cjs → head-442HYESI-SA3F5DC4.cjs} +2 -2
  106. package/dist/{head-442HYESI-Bztg6Xka.cjs.map → head-442HYESI-SA3F5DC4.cjs.map} +1 -1
  107. package/dist/{head-442HYESI-BDYHKho-.mjs → head-442HYESI-lJuvsyI-.mjs} +2 -2
  108. package/dist/{head-442HYESI-BDYHKho-.mjs.map → head-442HYESI-lJuvsyI-.mjs.map} +1 -1
  109. package/dist/{help-HZ6M2CKN-CFA5POOW.cjs → help-HZ6M2CKN-DF6aW5QI.cjs} +3 -3
  110. package/dist/{help-HZ6M2CKN-CFA5POOW.cjs.map → help-HZ6M2CKN-DF6aW5QI.cjs.map} +1 -1
  111. package/dist/{help-HZ6M2CKN-C95bcvt_.mjs → help-HZ6M2CKN-Ds-v_img.mjs} +2 -2
  112. package/dist/{help-HZ6M2CKN-C95bcvt_.mjs.map → help-HZ6M2CKN-Ds-v_img.mjs.map} +1 -1
  113. package/dist/{html-to-markdown-JW4MSQZO-8YYzjAx0.mjs → html-to-markdown-JW4MSQZO-BKk0AOob.mjs} +3 -2
  114. package/dist/{html-to-markdown-JW4MSQZO-8YYzjAx0.mjs.map → html-to-markdown-JW4MSQZO-BKk0AOob.mjs.map} +1 -1
  115. package/dist/{html-to-markdown-JW4MSQZO-B3xkcb1w.cjs → html-to-markdown-JW4MSQZO-BckwnA2L.cjs} +4 -3
  116. package/dist/{html-to-markdown-JW4MSQZO-B3xkcb1w.cjs.map → html-to-markdown-JW4MSQZO-BckwnA2L.cjs.map} +1 -1
  117. package/dist/{join-TBRGI3LQ-CzBO0uid.cjs → join-TBRGI3LQ-C9BulcHm.cjs} +4 -4
  118. package/dist/{join-TBRGI3LQ-CzBO0uid.cjs.map → join-TBRGI3LQ-C9BulcHm.cjs.map} +1 -1
  119. package/dist/{join-TBRGI3LQ-Cb96ZaTF.mjs → join-TBRGI3LQ-CgQarzOH.mjs} +2 -2
  120. package/dist/{join-TBRGI3LQ-Cb96ZaTF.mjs.map → join-TBRGI3LQ-CgQarzOH.mjs.map} +1 -1
  121. package/dist/{jq-4XLYLOS5-QEF-9JGc.mjs → jq-4XLYLOS5-BYyExpBl.mjs} +4 -4
  122. package/dist/{jq-4XLYLOS5-QEF-9JGc.mjs.map → jq-4XLYLOS5-BYyExpBl.mjs.map} +1 -1
  123. package/dist/{jq-4XLYLOS5-Dmw7PtvC.cjs → jq-4XLYLOS5-D39tJb2U.cjs} +13 -13
  124. package/dist/{jq-4XLYLOS5-Dmw7PtvC.cjs.map → jq-4XLYLOS5-D39tJb2U.cjs.map} +1 -1
  125. package/dist/{js-exec-N5KEZBH7-BLGWy2LA.cjs → js-exec-N5KEZBH7-BJOFfHf8.cjs} +14 -14
  126. package/dist/{js-exec-N5KEZBH7-BLGWy2LA.cjs.map → js-exec-N5KEZBH7-BJOFfHf8.cjs.map} +1 -1
  127. package/dist/{js-exec-N5KEZBH7-DWi8fMhN.mjs → js-exec-N5KEZBH7-DxplSQRT.mjs} +4 -4
  128. package/dist/{js-exec-N5KEZBH7-DWi8fMhN.mjs.map → js-exec-N5KEZBH7-DxplSQRT.mjs.map} +1 -1
  129. package/dist/{lib-C8lgRYXp.mjs → lib-3ViR76Gd.mjs} +2 -2
  130. package/dist/{lib-C8lgRYXp.mjs.map → lib-3ViR76Gd.mjs.map} +1 -1
  131. package/dist/{lib-ux1xJJmr.cjs → lib-JWxj2-D3.cjs} +2 -2
  132. package/dist/{lib-ux1xJJmr.cjs.map → lib-JWxj2-D3.cjs.map} +1 -1
  133. package/dist/{ln-4LGSXXGD-BtA5nI4o.mjs → ln-4LGSXXGD-C78UmFEd.mjs} +2 -2
  134. package/dist/{ln-4LGSXXGD-BtA5nI4o.mjs.map → ln-4LGSXXGD-C78UmFEd.mjs.map} +1 -1
  135. package/dist/{ln-4LGSXXGD-CkQRVPru.cjs → ln-4LGSXXGD-CqxQarhQ.cjs} +3 -3
  136. package/dist/{ln-4LGSXXGD-CkQRVPru.cjs.map → ln-4LGSXXGD-CqxQarhQ.cjs.map} +1 -1
  137. package/dist/{ls-ZJGQER7M-H5DDO7bw.cjs → ls-ZJGQER7M-BY4afQpT.cjs} +2 -2
  138. package/dist/{ls-ZJGQER7M-H5DDO7bw.cjs.map → ls-ZJGQER7M-BY4afQpT.cjs.map} +1 -1
  139. package/dist/{ls-ZJGQER7M-Bm9zc4KC.mjs → ls-ZJGQER7M-DcW0UZMa.mjs} +2 -2
  140. package/dist/{ls-ZJGQER7M-Bm9zc4KC.mjs.map → ls-ZJGQER7M-DcW0UZMa.mjs.map} +1 -1
  141. package/dist/{lzma-CjqgTQ5J.cjs → lzma-BLOYSj5Z.cjs} +8 -8
  142. package/dist/{lzma-CjqgTQ5J.cjs.map → lzma-BLOYSj5Z.cjs.map} +1 -1
  143. package/dist/{lzma-BpK0w-SI.mjs → lzma-DtV0zx4R.mjs} +5 -5
  144. package/dist/{lzma-BpK0w-SI.mjs.map → lzma-DtV0zx4R.mjs.map} +1 -1
  145. package/dist/{md5sum-SPU24VSG-Dqy3agsE.mjs → md5sum-SPU24VSG-BSpePryl.mjs} +3 -3
  146. package/dist/{md5sum-SPU24VSG-Dqy3agsE.mjs.map → md5sum-SPU24VSG-BSpePryl.mjs.map} +1 -1
  147. package/dist/{md5sum-SPU24VSG-B6JGibcS.cjs → md5sum-SPU24VSG-Bm744Cs-.cjs} +3 -3
  148. package/dist/{md5sum-SPU24VSG-B6JGibcS.cjs.map → md5sum-SPU24VSG-Bm744Cs-.cjs.map} +1 -1
  149. package/dist/{mkdir-MEPGZOB6-CMrYu1Ht.mjs → mkdir-MEPGZOB6-B7hdGbmg.mjs} +2 -2
  150. package/dist/{mkdir-MEPGZOB6-CMrYu1Ht.mjs.map → mkdir-MEPGZOB6-B7hdGbmg.mjs.map} +1 -1
  151. package/dist/{mkdir-MEPGZOB6-BFwkd4Z7.cjs → mkdir-MEPGZOB6-D4EkMCni.cjs} +4 -4
  152. package/dist/{mkdir-MEPGZOB6-BFwkd4Z7.cjs.map → mkdir-MEPGZOB6-D4EkMCni.cjs.map} +1 -1
  153. package/dist/{mv-W5BIQ646-hheW03eh.cjs → mv-W5BIQ646-Bt5XMX7z.cjs} +3 -3
  154. package/dist/{mv-W5BIQ646-hheW03eh.cjs.map → mv-W5BIQ646-Bt5XMX7z.cjs.map} +1 -1
  155. package/dist/{mv-W5BIQ646-CWgyAnYE.mjs → mv-W5BIQ646-CSGqJxBv.mjs} +2 -2
  156. package/dist/{mv-W5BIQ646-CWgyAnYE.mjs.map → mv-W5BIQ646-CSGqJxBv.mjs.map} +1 -1
  157. package/dist/{nl-WSDW7I4O-DcVnQp-1.cjs → nl-WSDW7I4O-DRGfkJbS.cjs} +3 -3
  158. package/dist/{nl-WSDW7I4O-DcVnQp-1.cjs.map → nl-WSDW7I4O-DRGfkJbS.cjs.map} +1 -1
  159. package/dist/{nl-WSDW7I4O-hZyrJS6m.mjs → nl-WSDW7I4O-D_yBlUmI.mjs} +2 -2
  160. package/dist/{nl-WSDW7I4O-hZyrJS6m.mjs.map → nl-WSDW7I4O-D_yBlUmI.mjs.map} +1 -1
  161. package/dist/{od-WOKFDJTP-CIGKYa74.cjs → od-WOKFDJTP-Cg03Ruvo.cjs} +3 -3
  162. package/dist/{od-WOKFDJTP-CIGKYa74.cjs.map → od-WOKFDJTP-Cg03Ruvo.cjs.map} +1 -1
  163. package/dist/{od-WOKFDJTP-60QMVWxL.mjs → od-WOKFDJTP-uP7Llgn-.mjs} +2 -2
  164. package/dist/{od-WOKFDJTP-60QMVWxL.mjs.map → od-WOKFDJTP-uP7Llgn-.mjs.map} +1 -1
  165. package/dist/{paste-7JC6S4DX-CC0xWPbo.cjs → paste-7JC6S4DX-CqoX7bst.cjs} +3 -3
  166. package/dist/{paste-7JC6S4DX-CC0xWPbo.cjs.map → paste-7JC6S4DX-CqoX7bst.cjs.map} +1 -1
  167. package/dist/{paste-7JC6S4DX-QB7MigtV.mjs → paste-7JC6S4DX-D6z5xV4U.mjs} +2 -2
  168. package/dist/{paste-7JC6S4DX-QB7MigtV.mjs.map → paste-7JC6S4DX-D6z5xV4U.mjs.map} +1 -1
  169. package/dist/{printf-TWGXF445-bSICkDD6.cjs → printf-TWGXF445-BlK0hMdH.cjs} +6 -5
  170. package/dist/{printf-TWGXF445-BuI_jQx5.mjs.map → printf-TWGXF445-BlK0hMdH.cjs.map} +1 -1
  171. package/dist/{printf-TWGXF445-BuI_jQx5.mjs → printf-TWGXF445-Zy7nN7h0.mjs} +3 -2
  172. package/dist/{printf-TWGXF445-bSICkDD6.cjs.map → printf-TWGXF445-Zy7nN7h0.mjs.map} +1 -1
  173. package/dist/{python3-POMOR4OA-CQv_ljO3.mjs → python3-POMOR4OA-BouZk0El.mjs} +4 -4
  174. package/dist/{python3-POMOR4OA-CQv_ljO3.mjs.map → python3-POMOR4OA-BouZk0El.mjs.map} +1 -1
  175. package/dist/{python3-POMOR4OA-D8YyzdQy.cjs → python3-POMOR4OA-DKcZfsrx.cjs} +23 -23
  176. package/dist/{python3-POMOR4OA-D8YyzdQy.cjs.map → python3-POMOR4OA-DKcZfsrx.cjs.map} +1 -1
  177. package/dist/{rev-5EHFX4EJ-BCHr71Dm.mjs → rev-5EHFX4EJ-B3FQZayg.mjs} +2 -2
  178. package/dist/{rev-5EHFX4EJ-BCHr71Dm.mjs.map → rev-5EHFX4EJ-B3FQZayg.mjs.map} +1 -1
  179. package/dist/{rev-5EHFX4EJ-BS2n_x9V.cjs → rev-5EHFX4EJ-cFYVlRMT.cjs} +4 -4
  180. package/dist/{rev-5EHFX4EJ-BS2n_x9V.cjs.map → rev-5EHFX4EJ-cFYVlRMT.cjs.map} +1 -1
  181. package/dist/{rg-S4FXYXWB-C8PEpvTX.mjs → rg-S4FXYXWB-CKl0cbhA.mjs} +3 -3
  182. package/dist/{rg-S4FXYXWB-C8PEpvTX.mjs.map → rg-S4FXYXWB-CKl0cbhA.mjs.map} +1 -1
  183. package/dist/{rg-S4FXYXWB-Bol68AvR.cjs → rg-S4FXYXWB-Ht7rOUCy.cjs} +10 -10
  184. package/dist/{rg-S4FXYXWB-Bol68AvR.cjs.map → rg-S4FXYXWB-Ht7rOUCy.cjs.map} +1 -1
  185. package/dist/{rm-SSGETQVQ-BPv10nPA.cjs → rm-SSGETQVQ-DHWdd6XE.cjs} +4 -4
  186. package/dist/{rm-SSGETQVQ-BPv10nPA.cjs.map → rm-SSGETQVQ-DHWdd6XE.cjs.map} +1 -1
  187. package/dist/{rm-SSGETQVQ-C1OgRoSu.mjs → rm-SSGETQVQ-fhHj5N9k.mjs} +2 -2
  188. package/dist/{rm-SSGETQVQ-C1OgRoSu.mjs.map → rm-SSGETQVQ-fhHj5N9k.mjs.map} +1 -1
  189. package/dist/{rmdir-OC4ZLPYA-DngaXCWg.cjs → rmdir-OC4ZLPYA-D1NuXPa1.cjs} +3 -3
  190. package/dist/{rmdir-OC4ZLPYA-DngaXCWg.cjs.map → rmdir-OC4ZLPYA-D1NuXPa1.cjs.map} +1 -1
  191. package/dist/{rmdir-OC4ZLPYA-BFuqEQ5J.mjs → rmdir-OC4ZLPYA-DVoEJTP5.mjs} +2 -2
  192. package/dist/{rmdir-OC4ZLPYA-BFuqEQ5J.mjs.map → rmdir-OC4ZLPYA-DVoEJTP5.mjs.map} +1 -1
  193. package/dist/run.cjs +1 -1
  194. package/dist/run.mjs +1 -1
  195. package/dist/{sed-S5UIK574-C8OThvO-.mjs → sed-S5UIK574-2BJSJJLu.mjs} +2 -2
  196. package/dist/{sed-S5UIK574-C8OThvO-.mjs.map → sed-S5UIK574-2BJSJJLu.mjs.map} +1 -1
  197. package/dist/{sed-S5UIK574-CF78rdnK.cjs → sed-S5UIK574-ttFzHdIm.cjs} +27 -27
  198. package/dist/{sed-S5UIK574-CF78rdnK.cjs.map → sed-S5UIK574-ttFzHdIm.cjs.map} +1 -1
  199. package/dist/{sha1sum-2PTOAFR6-C48qu6hM.cjs → sha1sum-2PTOAFR6-BZQuSfLJ.cjs} +3 -3
  200. package/dist/{sha1sum-2PTOAFR6-C48qu6hM.cjs.map → sha1sum-2PTOAFR6-BZQuSfLJ.cjs.map} +1 -1
  201. package/dist/{sha1sum-2PTOAFR6-BgSg3k-0.mjs → sha1sum-2PTOAFR6-DkiDbM7V.mjs} +3 -3
  202. package/dist/{sha1sum-2PTOAFR6-BgSg3k-0.mjs.map → sha1sum-2PTOAFR6-DkiDbM7V.mjs.map} +1 -1
  203. package/dist/{sha256sum-NS7D3IXX-BML40mGR.mjs → sha256sum-NS7D3IXX-CZSi6sUb.mjs} +3 -3
  204. package/dist/{sha256sum-NS7D3IXX-BML40mGR.mjs.map → sha256sum-NS7D3IXX-CZSi6sUb.mjs.map} +1 -1
  205. package/dist/{sha256sum-NS7D3IXX-DTZ34xii.cjs → sha256sum-NS7D3IXX-CeRL0-VH.cjs} +3 -3
  206. package/dist/{sha256sum-NS7D3IXX-DTZ34xii.cjs.map → sha256sum-NS7D3IXX-CeRL0-VH.cjs.map} +1 -1
  207. package/dist/{sleep-X22JJINO-Dy9v8Z4n.cjs → sleep-X22JJINO-BpueuSM3.cjs} +5 -5
  208. package/dist/{sleep-X22JJINO-Dy9v8Z4n.cjs.map → sleep-X22JJINO-BpueuSM3.cjs.map} +1 -1
  209. package/dist/{sleep-X22JJINO-BzDRKdtv.mjs → sleep-X22JJINO-Dq8TwvQ6.mjs} +2 -2
  210. package/dist/{sleep-X22JJINO-BzDRKdtv.mjs.map → sleep-X22JJINO-Dq8TwvQ6.mjs.map} +1 -1
  211. package/dist/{sort-SW2YEO5B-ClyGJwMQ.mjs → sort-SW2YEO5B-C_BUqduL.mjs} +3 -3
  212. package/dist/{sort-SW2YEO5B-ClyGJwMQ.mjs.map → sort-SW2YEO5B-C_BUqduL.mjs.map} +1 -1
  213. package/dist/{sort-SW2YEO5B-DwbO0wml.cjs → sort-SW2YEO5B-DSdbpA5g.cjs} +4 -4
  214. package/dist/{sort-SW2YEO5B-DwbO0wml.cjs.map → sort-SW2YEO5B-DSdbpA5g.cjs.map} +1 -1
  215. package/dist/{split-4KKZZXXE-D3kKToq-.cjs → split-4KKZZXXE-Cfy-caAx.cjs} +3 -3
  216. package/dist/{split-4KKZZXXE-D3kKToq-.cjs.map → split-4KKZZXXE-Cfy-caAx.cjs.map} +1 -1
  217. package/dist/{split-4KKZZXXE-oyZFQtYU.mjs → split-4KKZZXXE-DgpfZxEv.mjs} +2 -2
  218. package/dist/{split-4KKZZXXE-oyZFQtYU.mjs.map → split-4KKZZXXE-DgpfZxEv.mjs.map} +1 -1
  219. package/dist/{sqlite3-CGOEFJAO-BedLxgf_.mjs → sqlite3-CGOEFJAO-B1k5gRse.mjs} +5 -4
  220. package/dist/sqlite3-CGOEFJAO-B1k5gRse.mjs.map +1 -0
  221. package/dist/{sqlite3-CGOEFJAO-DUW1XIou.cjs → sqlite3-CGOEFJAO-B_AeZJOw.cjs} +26 -25
  222. package/dist/sqlite3-CGOEFJAO-B_AeZJOw.cjs.map +1 -0
  223. package/dist/start-CSKzlyiU.cjs +26845 -0
  224. package/dist/start-CSKzlyiU.cjs.map +1 -0
  225. package/dist/start-xmxO-nhn.mjs +26711 -0
  226. package/dist/start-xmxO-nhn.mjs.map +1 -0
  227. package/dist/start.cjs +1 -1
  228. package/dist/start.d.cts +1 -1
  229. package/dist/start.d.mts +2 -2
  230. package/dist/start.mjs +1 -1
  231. package/dist/{strings-6WDHLGMX-DXaUbNpx.mjs → strings-6WDHLGMX-O26XgPLP.mjs} +2 -2
  232. package/dist/{strings-6WDHLGMX-DXaUbNpx.mjs.map → strings-6WDHLGMX-O26XgPLP.mjs.map} +1 -1
  233. package/dist/{strings-6WDHLGMX-5ObhNSGS.cjs → strings-6WDHLGMX-WrYHjmYR.cjs} +2 -2
  234. package/dist/{strings-6WDHLGMX-5ObhNSGS.cjs.map → strings-6WDHLGMX-WrYHjmYR.cjs.map} +1 -1
  235. package/dist/{tac-2STMMJYW-Ov0tcgNn.mjs → tac-2STMMJYW-B3nwHTgj.mjs} +2 -2
  236. package/dist/{tac-2STMMJYW-Ov0tcgNn.mjs.map → tac-2STMMJYW-B3nwHTgj.mjs.map} +1 -1
  237. package/dist/{tac-2STMMJYW-CLSjS7F2.cjs → tac-2STMMJYW-bH0PmIFC.cjs} +2 -2
  238. package/dist/{tac-2STMMJYW-CLSjS7F2.cjs.map → tac-2STMMJYW-bH0PmIFC.cjs.map} +1 -1
  239. package/dist/{tail-R4PCA2C4-C018_ZAk.cjs → tail-R4PCA2C4-CBJsd2wD.cjs} +2 -2
  240. package/dist/{tail-R4PCA2C4-C018_ZAk.cjs.map → tail-R4PCA2C4-CBJsd2wD.cjs.map} +1 -1
  241. package/dist/{tail-R4PCA2C4-KgqykSFz.mjs → tail-R4PCA2C4-t0agG73W.mjs} +2 -2
  242. package/dist/{tail-R4PCA2C4-KgqykSFz.mjs.map → tail-R4PCA2C4-t0agG73W.mjs.map} +1 -1
  243. package/dist/{tar-STHHZTZ6-CCPYnq7u.mjs → tar-STHHZTZ6-nTNd_mUA.mjs} +5 -4
  244. package/dist/{tar-STHHZTZ6-BcBkmdCH.cjs.map → tar-STHHZTZ6-nTNd_mUA.mjs.map} +1 -1
  245. package/dist/{tar-STHHZTZ6-BcBkmdCH.cjs → tar-STHHZTZ6-ol7sffwQ.cjs} +7 -6
  246. package/dist/{tar-STHHZTZ6-CCPYnq7u.mjs.map → tar-STHHZTZ6-ol7sffwQ.cjs.map} +1 -1
  247. package/dist/{tee-YUZ2FKCJ-Cce_gOKf.cjs → tee-YUZ2FKCJ-BItvCSLS.cjs} +2 -2
  248. package/dist/{tee-YUZ2FKCJ-Cce_gOKf.cjs.map → tee-YUZ2FKCJ-BItvCSLS.cjs.map} +1 -1
  249. package/dist/{tee-YUZ2FKCJ-D7LOkjQo.mjs → tee-YUZ2FKCJ-CRnAkzyY.mjs} +2 -2
  250. package/dist/{tee-YUZ2FKCJ-D7LOkjQo.mjs.map → tee-YUZ2FKCJ-CRnAkzyY.mjs.map} +1 -1
  251. package/dist/{time-D4LNBSWX-D9C8_lG9.cjs → time-D4LNBSWX-CRb0M_G6.cjs} +8 -8
  252. package/dist/{time-D4LNBSWX-D9C8_lG9.cjs.map → time-D4LNBSWX-CRb0M_G6.cjs.map} +1 -1
  253. package/dist/{time-D4LNBSWX-CvYHvswI.mjs → time-D4LNBSWX-DQ_s98Uj.mjs} +2 -2
  254. package/dist/{time-D4LNBSWX-CvYHvswI.mjs.map → time-D4LNBSWX-DQ_s98Uj.mjs.map} +1 -1
  255. package/dist/{timeout-YDCRSLPQ-CacPbawx.mjs → timeout-YDCRSLPQ-BffepZAF.mjs} +2 -2
  256. package/dist/{timeout-YDCRSLPQ-CacPbawx.mjs.map → timeout-YDCRSLPQ-BffepZAF.mjs.map} +1 -1
  257. package/dist/{timeout-YDCRSLPQ-Ccs9ipQM.cjs → timeout-YDCRSLPQ-D74y5y7z.cjs} +5 -5
  258. package/dist/{timeout-YDCRSLPQ-Ccs9ipQM.cjs.map → timeout-YDCRSLPQ-D74y5y7z.cjs.map} +1 -1
  259. package/dist/{touch-UA33VN3N-D2ndvYPZ.mjs → touch-UA33VN3N-78TDr_Cd.mjs} +2 -2
  260. package/dist/{touch-UA33VN3N-D2ndvYPZ.mjs.map → touch-UA33VN3N-78TDr_Cd.mjs.map} +1 -1
  261. package/dist/{touch-UA33VN3N-Dxlmlbm_.cjs → touch-UA33VN3N-CP3QIjbf.cjs} +3 -3
  262. package/dist/{touch-UA33VN3N-Dxlmlbm_.cjs.map → touch-UA33VN3N-CP3QIjbf.cjs.map} +1 -1
  263. package/dist/{tr-36LHWFRQ-Bzq2x5-h.cjs → tr-36LHWFRQ-BRvI2dHQ.cjs} +4 -4
  264. package/dist/{tr-36LHWFRQ-Bzq2x5-h.cjs.map → tr-36LHWFRQ-BRvI2dHQ.cjs.map} +1 -1
  265. package/dist/{tr-36LHWFRQ-CWCuChgL.mjs → tr-36LHWFRQ-SA2CA_S1.mjs} +2 -2
  266. package/dist/{tr-36LHWFRQ-CWCuChgL.mjs.map → tr-36LHWFRQ-SA2CA_S1.mjs.map} +1 -1
  267. package/dist/{tree-YLD52CNT-BQipj5RY.cjs → tree-YLD52CNT-C3_lLUpl.cjs} +2 -2
  268. package/dist/{tree-YLD52CNT-BQipj5RY.cjs.map → tree-YLD52CNT-C3_lLUpl.cjs.map} +1 -1
  269. package/dist/{tree-YLD52CNT-CDfF4vcr.mjs → tree-YLD52CNT-KZAShLek.mjs} +2 -2
  270. package/dist/{tree-YLD52CNT-CDfF4vcr.mjs.map → tree-YLD52CNT-KZAShLek.mjs.map} +1 -1
  271. package/dist/{unexpand-CADSA4VO-C4qGbx-B.cjs → unexpand-CADSA4VO-DJB8iOb2.cjs} +3 -3
  272. package/dist/{unexpand-CADSA4VO-C4qGbx-B.cjs.map → unexpand-CADSA4VO-DJB8iOb2.cjs.map} +1 -1
  273. package/dist/{unexpand-CADSA4VO-COvRSVlE.mjs → unexpand-CADSA4VO-QJhpquBs.mjs} +2 -2
  274. package/dist/{unexpand-CADSA4VO-COvRSVlE.mjs.map → unexpand-CADSA4VO-QJhpquBs.mjs.map} +1 -1
  275. package/dist/{uniq-XSIZR6PB-bJo9kdHr.cjs → uniq-XSIZR6PB--zd07u5J.cjs} +4 -4
  276. package/dist/{uniq-XSIZR6PB-bJo9kdHr.cjs.map → uniq-XSIZR6PB--zd07u5J.cjs.map} +1 -1
  277. package/dist/{uniq-XSIZR6PB-C8bN8gfm.mjs → uniq-XSIZR6PB-D8Uw2jAH.mjs} +3 -3
  278. package/dist/{uniq-XSIZR6PB-C8bN8gfm.mjs.map → uniq-XSIZR6PB-D8Uw2jAH.mjs.map} +1 -1
  279. package/dist/{wc-LF7NU4LA-D4xFJZxz.mjs → wc-LF7NU4LA-B-YAlUqD.mjs} +3 -3
  280. package/dist/{wc-LF7NU4LA-D4xFJZxz.mjs.map → wc-LF7NU4LA-B-YAlUqD.mjs.map} +1 -1
  281. package/dist/{wc-LF7NU4LA-NAR5lgIG.cjs → wc-LF7NU4LA-BEMBfNm9.cjs} +4 -4
  282. package/dist/{wc-LF7NU4LA-NAR5lgIG.cjs.map → wc-LF7NU4LA-BEMBfNm9.cjs.map} +1 -1
  283. package/dist/{xan-Y6WF3IRG-D16SQobd.mjs → xan-Y6WF3IRG-ByEdCuAi.mjs} +6 -6
  284. package/dist/{xan-Y6WF3IRG-D16SQobd.mjs.map → xan-Y6WF3IRG-ByEdCuAi.mjs.map} +1 -1
  285. package/dist/{xan-Y6WF3IRG-RigAd0GA.cjs → xan-Y6WF3IRG-DCru93RE.cjs} +11 -11
  286. package/dist/{xan-Y6WF3IRG-RigAd0GA.cjs.map → xan-Y6WF3IRG-DCru93RE.cjs.map} +1 -1
  287. package/dist/{xan-view-HDVKHFC2-pRqYeBi3.cjs → xan-view-HDVKHFC2-BPuiufGQ.cjs} +3 -3
  288. package/dist/{xan-view-HDVKHFC2-pRqYeBi3.cjs.map → xan-view-HDVKHFC2-BPuiufGQ.cjs.map} +1 -1
  289. package/dist/{xan-view-HDVKHFC2-CJ527xHS.mjs → xan-view-HDVKHFC2-HTtRuSIN.mjs} +3 -3
  290. package/dist/{xan-view-HDVKHFC2-CJ527xHS.mjs.map → xan-view-HDVKHFC2-HTtRuSIN.mjs.map} +1 -1
  291. package/dist/{xargs-MGZPH7AX-C0bVMPGM.cjs → xargs-MGZPH7AX-SGQW1zLf.cjs} +4 -4
  292. package/dist/{xargs-MGZPH7AX-C0bVMPGM.cjs.map → xargs-MGZPH7AX-SGQW1zLf.cjs.map} +1 -1
  293. package/dist/{xargs-MGZPH7AX-DWIn3Zwh.mjs → xargs-MGZPH7AX-w2W-Yyzf.mjs} +2 -2
  294. package/dist/{xargs-MGZPH7AX-DWIn3Zwh.mjs.map → xargs-MGZPH7AX-w2W-Yyzf.mjs.map} +1 -1
  295. package/dist/{yq-4QJW3EQG-CSTlai1q.cjs → yq-4QJW3EQG-Cx9pL4eC.cjs} +10 -10
  296. package/dist/{yq-4QJW3EQG-CSTlai1q.cjs.map → yq-4QJW3EQG-Cx9pL4eC.cjs.map} +1 -1
  297. package/dist/{yq-4QJW3EQG-CPcwcHbw.mjs → yq-4QJW3EQG-eornzh5f.mjs} +3 -3
  298. package/dist/{yq-4QJW3EQG-CPcwcHbw.mjs.map → yq-4QJW3EQG-eornzh5f.mjs.map} +1 -1
  299. package/package.json +1 -1
  300. package/dist/dist-C3ioU2dM.cjs.map +0 -1
  301. package/dist/dist-CQMZgfp_.mjs.map +0 -1
  302. package/dist/sqlite3-CGOEFJAO-BedLxgf_.mjs.map +0 -1
  303. package/dist/sqlite3-CGOEFJAO-DUW1XIou.cjs.map +0 -1
  304. package/dist/start-9_8ZcdaU.mjs +0 -2836
  305. package/dist/start-9_8ZcdaU.mjs.map +0 -1
  306. package/dist/start-CBrH4KOb.cjs +0 -2842
  307. package/dist/start-CBrH4KOb.cjs.map +0 -1
@@ -1,2836 +0,0 @@
1
- import { $ as InviteProjectMembersRequestSchema, $t as WorkflowSummaryListResponseSchema, A as CompleteProjectArtifactResponseSchema, At as SkillSummaryDetailResponseSchema, B as CreateProjectRequestSchema, Bt as UpdateOrganizationMemberResponseSchema, C as AcceptOrganizationInvitationResponseSchema, Ct as ProjectResponseSchema, D as AgentSummarySchema, Dt as ProjectSourceResourcesSchema, E as AgentSummaryListResponseSchema, Et as ProjectSlugAvailabilityResponseSchema, F as CreateCustomAppRequestSchema, Ft as StoredProjectSourceManifestSchema, G as GetCredentialResponseSchema, Gt as UpdateProjectSettingsRequestSchema, H as DeclineOrganizationInvitationResponseSchema, Ht as UpdateProjectMemberRequestSchema, I as CreateCustomAppResponseSchema, It as SubmitTeamRequestRequestSchema, J as HistoryRunDetailResponseSchema, Jt as UserAvatarPatchSchema, K as GetCustomAppResponseSchema, Kt as UploadProjectSourceManifestRequestSchema, L as CreateOrganizationRequestSchema, Lt as SubmitTeamRequestResponseSchema, M as CreateApiKeyResponseSchema, Mt as SkillSummarySchema, N as CreateCredentialsRequestSchema, Nt as SlugAvailabilityQuerySchema, O as AppSlugAvailabilityQuerySchema, Ot as RecentResourceListResponseSchema, P as CreateCredentialsResponseSchema, Pt as SlugAvailabilityResponseSchema, Q as InviteOrganizationMembersResponseSchema, Qt as WorkflowSummaryDetailResponseSchema, R as CreateOrganizationResponseSchema, Rt as UpdateCredentialRequestSchema, S as ACTIVE_ORG_HEADER, St as ProjectReachabilityResponseSchema, T as AgentSummaryDetailResponseSchema, Tt as ProjectSlugAvailabilityQuerySchema, U as DownloadActiveProjectArtifactResponseSchema, Ut as UpdateProjectMemberResponseSchema, V as CreateProjectResponseSchema, Vt as UpdateOrganizationRequestSchema, W as ErrorResponseSchema, Wn as pingProjectTarget, Wt as UpdateProjectRequestSchema, X as HistoryRunListResponseSchema, Xt as UserPreferencesPatchSchema, Y as HistoryRunListQuerySchema, Yt as UserAvatarSchema, Z as InviteOrganizationMembersRequestSchema, Zt as UserPreferencesSchema, _ as createJobQueue, _n as parseStoredRouteManifest, _t as PresignOrgLogoResponseSchema, a as isKeystrokeAssetsAvatarPublicUrl, an as mapOrganizationMember, at as ListOrganizationMembersResponseSchema, b as readCredentialInstanceSecret, bn as validateCredentialValueAgainstFields, bt as PresignUserAvatarRequestSchema, c as isUserAvatarStorageKey, cn as mapProjectDeployment, ct as ListProjectFilesResponseSchema, dn as mapUserOrganization, dt as ListProjectsResponseSchema, en as WorkflowSummarySchema, et as InviteProjectMembersResponseSchema, f as orgLogoStorageKey, fn as mergeUserPreferences, ft as OrganizationSidebarBrandingPatchSchema, g as userAvatarStorageKey, gn as parseAppSlug, gt as PresignOrgLogoRequestSchema, h as publicKeystrokeAssetsObjectUrl, hn as organizationSlugErrorCodeFromMessage, ht as PROJECT_SLUG_TAKEN_MESSAGE, i as extractRouteManifestFromArtifact, in as mapOrganizationInvitation, it as ListOrganizationInvitationsResponseSchema, j as CreateApiKeyRequestSchema, jt as SkillSummaryListResponseSchema, k as AppSlugAvailabilityResponseSchema, kt as RecentResourceSchema, l as keystrokeAssetsAvatarKeyFromPublicUrl, ln as mapProjectMember, lt as ListProjectMembersResponseSchema, m as projectSourceBlobKey, mn as organizationInvitationAcceptPath, mt as PLATFORM_RESOURCE_UNSUPPORTED_TEXT, n as createAssetsStorageClient, nn as displayCredentialAppName, nt as ListAppsResponseSchema, o as isKeystrokeAssetsOrgLogoPublicUrl, on as mapProject, ot as ListOrganizationsResponseSchema, p as projectArtifactKey, pn as normalizeUserPreferences, pt as OrganizationSidebarBrandingSchema, q as HistoryRunCancelResponseSchema, qt as UploadProjectSourceResponseSchema, r as ensureKeystrokeAssetsBucket, rn as listenPortFromPublicUrl, rt as ListCredentialsResponseSchema, s as isOrgLogoStorageKey, sn as mapProjectArtifact, st as ListProjectDeploymentsResponseSchema, t as RouteManifestNotFoundError, tn as buildCredentialInstanceLabel, tt as ListApiKeysResponseSchema, u as keystrokeAssetsOrgLogoKeyFromPublicUrl, un as mapProjectSettings, ut as ListProjectMetricsResponseSchema, v as defaultSchedulerPlugin, vn as projectFileId, vt as PresignProjectSourceRequestSchema, w as ActiveOrganizationResponseSchema, wt as ProjectSettingsResponseSchema, x as setCredentialInstanceSecret, xn as validationErrorResponse, xt as PresignUserAvatarResponseSchema, y as deleteCredentialInstanceSecret, yn as resolveUniqueCredentialInstanceLabel, yt as PresignProjectSourceResponseSchema, z as CreateProjectArtifactResponseSchema, zt as UpdateOrganizationMemberRequestSchema } from "./dist-CQMZgfp_.mjs";
2
- import { buildHistoryAgentSessionDetail, buildHistoryWorkflowRunDetail, cancelAgentSession, cancelWorkflowRun, clearCredentialInstanceDefaults, deleteCredentialInstanceById, findHistoryRunCore, getServerTenantScopeId, inferDialect, listActiveAgents, listActiveSkills, listActiveWorkflows, listAllCredentialInstances, listCredentialInstancesByConnectionId, listHistoryRuns, listRecentResourceActivity, runWithProjectDatabase, runWithProjectScope, runWithTenantScope, selectActiveAgentById, selectActiveAgentsByIds, selectActiveSkillById, selectActiveSkillsByIds, selectActiveWorkflowById, selectActiveWorkflowsByIds, selectAgentLastRunAtByIds, selectAgentSessionById, selectCredentialInstanceById, selectCredentialInstancesForScope, selectEphemeralTriggerAttachments, selectProjectResourceCounts, selectWorkflowLastRunAtByIds, selectWorkflowRunById, touchResourceActivity, upsertCredentialInstance } from "@keystrokehq/database";
3
- import { ZodError, z } from "zod";
4
- import "node:path";
5
- import "node:fs";
6
- import { AsyncLocalStorage } from "node:async_hooks";
7
- import { CannotModifyOwnerError, OrgAppSlugTakenError, OrgPlatformApiKeyNotFoundError, OrganizationInvitationExpiredError, OrganizationInvitationForbiddenError, OrganizationInvitationNotFoundError, OrganizationMemberNotFoundError, OrganizationSlugTakenError, OrganizationSlugTakenError as OrganizationSlugTakenError$1, ProjectMemberNotFoundError, ProjectSlugTakenError, acceptInvitation, checkOrgAppSlugAvailability, checkOrganizationSlugAvailability, checkProjectSlugAvailability, completeProjectArtifact, createOrgApp, createOrgPlatformApiKey, createOrgStorageClient, createOrganizationForUser, createProjectForOrganization, declineInvitation, deleteOAuthConnectionById, deleteProjectForOrganization, encryptCredentialPayload as encryptCredentialPayload$1, ensureProjectPgBossGrants, ensureWebhookApiKeyForRoute, ensureWebhookApiKeys, hasCredentialFieldTemplate, initDatabase, insertProjectArtifact, inviteOrganizationMembers, inviteProjectMembers, isOrganizationStorageBucketInUse, listAppsForOrganization, listOrgPlatformApiKeysForOrganization, listOrgPlatformApiKeysForUser, loadOrgPlatformApiKeyUser, mapOrgPlatformApiKeyCreator, mapOrgPlatformApiKeyCreatorOrDeleted, orgWorkspacesRuntimeEnv, organizationRowToSidebarBranding, promoteProjectArtifact, removeOrganizationMember, removeProjectMember, resolveNewOrganizationIdentity, resolveOrgDatabaseUrl, resolveOrgRuntimeDatabase, revokeOrgPlatformApiKey, runWithOrganizationScope, runWithWorkspaceContext, selectActiveArtifactSourceManifestForProject, selectActiveProjectArtifactForProject, selectAppForOrganization, selectLastDeploymentAtByProject, selectOAuthConnectionsByIds, selectOrgPlatformApiKeyForOrganization, selectOrganizationById, selectOrganizationMembers, selectPendingInvitationsForUser, selectProjectArtifactById, selectProjectArtifactForProject, selectProjectById, selectProjectDeployments, selectProjectForOrganization, selectProjectForOrganizationBySlug, selectProjectIdsForUser, selectProjectMembers, selectProjectsByOrganizationId, selectUserById, selectUserOrganizationMembership, selectUserOrganizations, selectUserProjectMembership, selectUsersByIds, updateOrganizationActive, updateOrganizationFailed, updateOrganizationMemberRole, updateOrganizationName, updateOrganizationSidebarBranding, updateOrganizationSlug, updateProjectActive, updateProjectArtifactManifest, updateProjectArtifactSourceManifest, updateProjectForOrganization, updateProjectMemberRole, updateProjectSettings, updateUserById, verifyOrgPlatformApiKeySecret } from "@keystrokehq/platform-database";
8
- import { serve } from "@hono/node-server";
9
- import { AUTH_API_PATH, createAuth, createDefaultAuthJwtVerifier, extractWebhookApiKeyFromRequest, handleAuthRequest, resolveAuthEmailFrom, resolveRequestAuth } from "@keystrokehq/auth";
10
- import { buildWebhookUrl, createCredentialMaterializeHandler, extractWebhookRoutesFromManifest, seedOAuthAppsFromEnvForAllOrganizations, seedOAuthAppsFromEnvForOrganization, syncRegistryFromStoredManifest } from "@keystrokehq/runtime";
11
- import { createApp, externalPlatformOrigin, getProjectScheduler, platformWebhookOrigin, resolveMcpEntityId } from "@keystrokehq/http";
12
- import { Hono } from "hono";
13
- import { Resend } from "resend";
14
- //#region ../../packages/manifest/dist/index.mjs
15
- function normalizeWebhookEndpoint(endpoint) {
16
- return endpoint.replace(/^\/+|\/+$/g, "").replace(/^triggers\/?/, "");
17
- }
18
- function webhookRouteFromEndpoint(endpoint) {
19
- const normalized = normalizeWebhookEndpoint(endpoint);
20
- if (!normalized) throw new Error("Webhook endpoint must not be empty");
21
- return `/triggers/${normalized}`;
22
- }
23
- const WORKFLOW = Symbol.for("keystroke.workflow");
24
- function isManifestWorkflow(value) {
25
- if (typeof value !== "object" || value === null) return false;
26
- if (!(WORKFLOW in value) || value[WORKFLOW] !== true) return false;
27
- const workflow = value;
28
- return typeof workflow.slug === "string" && workflow.slug.trim().length > 0 && workflow.input instanceof Object && "safeParse" in workflow.input && workflow.output instanceof Object && "safeParse" in workflow.output;
29
- }
30
- const zodSchema = z.custom((value) => value instanceof z.ZodType, "must be a Zod schema");
31
- const cronScheduleSchema = z.string().trim().min(1, "cron schedule must be a non-empty string");
32
- const workflowSchema = z.custom((value) => isManifestWorkflow(value), "must be defineWorkflow(...)");
33
- const agentSchema = z.custom((value) => typeof value === "object" && value !== null && typeof value.slug === "string" && value.slug.trim().length > 0 && typeof value.prompt === "function", "must be defineAgent(...)");
34
- const promptSchema = z.union([z.string(), z.function()]);
35
- const baseSourceShape = {
36
- key: z.string().trim().min(1),
37
- attach: z.function()
38
- };
39
- const webhookSourceSchema = z.object({
40
- kind: z.literal("webhook"),
41
- ...baseSourceShape,
42
- endpoint: z.string().min(1),
43
- request: zodSchema,
44
- filter: zodSchema.optional(),
45
- passes: z.function()
46
- });
47
- const cronSourceSchema = z.object({
48
- kind: z.literal("cron"),
49
- ...baseSourceShape,
50
- schedule: cronScheduleSchema
51
- });
52
- const pollSourceSchema = z.object({
53
- kind: z.literal("poll"),
54
- ...baseSourceShape,
55
- id: z.string().optional(),
56
- schedule: cronScheduleSchema,
57
- run: z.function(),
58
- filters: z.array(z.function()),
59
- passes: z.function()
60
- });
61
- const triggerSourceSchema = z.discriminatedUnion("kind", [
62
- webhookSourceSchema,
63
- cronSourceSchema,
64
- pollSourceSchema
65
- ]);
66
- const workflowAttachmentSchema = z.object({
67
- key: z.string().trim().min(1),
68
- source: triggerSourceSchema,
69
- target: z.literal("workflow"),
70
- workflow: workflowSchema,
71
- transform: z.function().optional()
72
- });
73
- const agentAttachmentSchema = z.object({
74
- key: z.string().trim().min(1),
75
- source: triggerSourceSchema,
76
- target: z.literal("agent"),
77
- agent: agentSchema,
78
- prompt: promptSchema
79
- });
80
- z.discriminatedUnion("target", [workflowAttachmentSchema, agentAttachmentSchema]);
81
- //#endregion
82
- //#region ../../packages/projects/dist/index.mjs
83
- async function resolveDeployManifest(input) {
84
- if (input.artifactManifest != null) return parseStoredRouteManifest(input.artifactManifest);
85
- return parseStoredRouteManifest(extractRouteManifestFromArtifact(input.artifactBytes));
86
- }
87
- /** Cut over activeArtifactId, then sync org project registry from the artifact manifest. */
88
- async function promoteProjectDeploy(input) {
89
- const project = await selectProjectById(input.projectId);
90
- if (!project) throw new Error(`Project ${input.projectId} not found`);
91
- const artifact = await selectProjectArtifactById(input.artifactId);
92
- if (!artifact || artifact.projectId !== input.projectId) throw new Error(`Artifact ${input.artifactId} not found for project ${input.projectId}`);
93
- const organization = await selectOrganizationById(project.organizationId);
94
- if (!organization) throw new Error(`Organization not found for project ${input.projectId}`);
95
- if (!input.artifactBytes && artifact.manifestJson == null) throw new RouteManifestNotFoundError("Artifact has no stored route manifest; rebuild and redeploy");
96
- const manifest = await resolveDeployManifest({
97
- artifactId: input.artifactId,
98
- artifactManifest: artifact.manifestJson,
99
- artifactBytes: input.artifactBytes ?? Buffer.alloc(0)
100
- });
101
- if (artifact.manifestJson == null) await updateProjectArtifactManifest({
102
- artifactId: input.artifactId,
103
- manifestJson: manifest
104
- });
105
- if (project.pendingArtifactId === input.artifactId) await promoteProjectArtifact({
106
- projectId: input.projectId,
107
- artifactId: input.artifactId
108
- });
109
- else if (project.activeArtifactId !== input.artifactId) throw new Error(`Artifact ${input.artifactId} is not the pending deploy for project ${input.projectId}`);
110
- const ephemeralRoutes = [];
111
- await runWithProjectDatabase({
112
- url: resolveOrgDatabaseUrl(organization),
113
- searchPath: organization.dbSchema
114
- }, async () => runWithProjectScope(project.id, async () => {
115
- await syncRegistryFromStoredManifest(manifest);
116
- const byRoute = /* @__PURE__ */ new Map();
117
- for (const row of await selectEphemeralTriggerAttachments()) {
118
- if (row.source.kind !== "webhook") continue;
119
- const route = webhookRouteFromEndpoint(row.source.endpoint);
120
- byRoute.set(route, [...byRoute.get(route) ?? [], row.slug]);
121
- }
122
- for (const [route, attachmentKeys] of byRoute) ephemeralRoutes.push({
123
- route,
124
- attachmentKeys
125
- });
126
- }));
127
- const webhookRoutes = [...extractWebhookRoutesFromManifest(manifest), ...ephemeralRoutes];
128
- if (webhookRoutes.length > 0) await ensureWebhookApiKeys(project.id, webhookRoutes, project.id);
129
- }
130
- /** True when a project still needs an org worker rebuild after a runtime job finishes. */
131
- function projectNeedsRuntimeFollowUp(project) {
132
- if (project.status === "starting" && project.pendingArtifactId) return true;
133
- if (project.pendingArtifactId && project.activeArtifactId !== project.pendingArtifactId) return true;
134
- return false;
135
- }
136
- let runtimeQueue;
137
- let runtimeQueueInit;
138
- let runtimeSchedulerPlugin;
139
- function configureProjectRuntimeScheduler(plugin) {
140
- runtimeSchedulerPlugin = plugin;
141
- runtimeQueue = void 0;
142
- runtimeQueueInit = void 0;
143
- }
144
- async function getOrgRuntimeQueue() {
145
- if (runtimeQueue) return runtimeQueue;
146
- if (!runtimeQueueInit) runtimeQueueInit = (async () => {
147
- const queue = await createJobQueue({
148
- scope: "platform",
149
- plugin: runtimeSchedulerPlugin ?? defaultSchedulerPlugin()
150
- });
151
- runtimeQueue = queue;
152
- return queue;
153
- })();
154
- return runtimeQueueInit;
155
- }
156
- function toOrgRuntimeJob(payload) {
157
- const job = payload.payload;
158
- if (!job?.organizationId) throw new Error("Invalid org runtime job payload");
159
- return {
160
- organizationId: job.organizationId,
161
- triggerProjectId: job.triggerProjectId,
162
- triggerArtifactId: job.triggerArtifactId
163
- };
164
- }
165
- async function resolveOrgProjects(job) {
166
- const projects = await selectProjectsByOrganizationId(job.organizationId);
167
- const deploys = [];
168
- for (const project of projects) {
169
- const artifactId = project.id === job.triggerProjectId && job.triggerArtifactId ? job.triggerArtifactId : project.pendingArtifactId ?? project.activeArtifactId;
170
- if (!artifactId) continue;
171
- const artifact = await selectProjectArtifactById(artifactId);
172
- if (!artifact || artifact.projectId !== project.id || artifact.status !== "ready") {
173
- if (project.id === job.triggerProjectId) throw new Error(`Project ${project.id} pending artifact is not ready`);
174
- continue;
175
- }
176
- deploys.push({
177
- projectId: project.id,
178
- name: project.name,
179
- artifactId,
180
- artifactStorageKey: artifact.storageKey
181
- });
182
- }
183
- if (deploys.length === 0) throw new Error(`Organization ${job.organizationId} has no deployable projects`);
184
- return deploys;
185
- }
186
- async function orgNeedsRuntimeFollowUp(organizationId) {
187
- return (await selectProjectsByOrganizationId(organizationId)).some(projectNeedsRuntimeFollowUp);
188
- }
189
- async function enqueueOrgRuntime(job) {
190
- return (await getOrgRuntimeQueue()).enqueue({
191
- kind: "runtime",
192
- targetId: job.organizationId,
193
- runId: crypto.randomUUID(),
194
- trigger: "api",
195
- payload: job,
196
- maxAttempts: 5,
197
- dedupeKey: job.organizationId
198
- });
199
- }
200
- async function enqueueProjectRuntime(job) {
201
- const project = await selectProjectById(job.projectId);
202
- if (!project) throw new Error(`Project ${job.projectId} not found`);
203
- return enqueueOrgRuntime({
204
- organizationId: project.organizationId,
205
- triggerProjectId: job.projectId,
206
- triggerArtifactId: job.artifactId
207
- });
208
- }
209
- async function destroyOrgRuntime(runtime, input, runtimeId) {
210
- if (!runtime.destroy) return;
211
- try {
212
- await runtime.destroy({
213
- runtimeId,
214
- hosting: input.hosting
215
- });
216
- } catch (destroyError) {
217
- console.error(`[org.runtime] failed to destroy runtime ${runtimeId}`, destroyError);
218
- }
219
- }
220
- async function handleOrgRuntimeJob(runtime, resolveStartInput, payload) {
221
- if (payload.kind !== "runtime") return;
222
- const job = toOrgRuntimeJob(payload);
223
- try {
224
- const organization = await selectOrganizationById(job.organizationId);
225
- if (!organization) throw new Error(`Organization ${job.organizationId} not found`);
226
- const projects = await resolveOrgProjects(job);
227
- const input = await resolveStartInput(job);
228
- const mergedInput = {
229
- ...input,
230
- organizationId: job.organizationId,
231
- projects,
232
- previousRuntimeId: input.previousRuntimeId ?? organization.runtimeId
233
- };
234
- let result;
235
- try {
236
- result = await runtime.start(mergedInput);
237
- for (const project of projects) {
238
- await promoteProjectDeploy({
239
- projectId: project.projectId,
240
- artifactId: project.artifactId,
241
- baseUrl: result.baseUrl
242
- });
243
- await updateProjectActive(project.projectId, {
244
- baseUrl: result.baseUrl,
245
- runtimeId: result.runtimeId
246
- });
247
- }
248
- await updateOrganizationActive(job.organizationId, {
249
- baseUrl: result.baseUrl,
250
- runtimeId: result.runtimeId
251
- });
252
- if (mergedInput.previousRuntimeId) await destroyOrgRuntime(runtime, mergedInput, mergedInput.previousRuntimeId);
253
- if (await orgNeedsRuntimeFollowUp(job.organizationId)) await enqueueOrgRuntime({ organizationId: job.organizationId });
254
- } catch (error) {
255
- if (result) await destroyOrgRuntime(runtime, mergedInput, result.runtimeId);
256
- throw error;
257
- }
258
- } catch (error) {
259
- console.error(`[org.runtime] ${job.organizationId} failed`, error);
260
- if (payload.exhaustedRetries) await updateOrganizationFailed(job.organizationId, "Org runtime failed after retries");
261
- throw error;
262
- }
263
- }
264
- async function startProjectRuntimeWorker(runtime, options = {}) {
265
- const queue = await getOrgRuntimeQueue();
266
- const resolveStartInput = options.resolveStartInput ?? (async (job) => {
267
- throw new Error(`Org runtime for ${job.organizationId} requires resolveStartInput with database credentials`);
268
- });
269
- await queue.startWorker(async (payload) => {
270
- await handleOrgRuntimeJob(runtime, resolveStartInput, payload);
271
- });
272
- }
273
- //#endregion
274
- //#region src/auth/mount.ts
275
- function mountAuth(app, auth) {
276
- app.on(["POST", "GET"], AUTH_API_PATH, (c) => handleAuthRequest(auth, c.req.raw));
277
- }
278
- //#endregion
279
- //#region ../../packages/access-control/dist/index.mjs
280
- const apiKeysActions = {
281
- read: "apiKeys:read",
282
- create: "apiKeys:create"
283
- };
284
- const apiKeysGrants = Object.values(apiKeysActions);
285
- const apiKeysRoleGrants = {
286
- owner: [apiKeysActions.read, apiKeysActions.create],
287
- admin: [apiKeysActions.read, apiKeysActions.create],
288
- builder: [apiKeysActions.create]
289
- };
290
- const organizationActions = {
291
- update: "organization:update",
292
- delete: "organization:delete"
293
- };
294
- const organizationGrants = Object.values(organizationActions);
295
- const organizationRoleGrants = {
296
- owner: [organizationActions.update, organizationActions.delete],
297
- admin: [organizationActions.update],
298
- builder: []
299
- };
300
- const userActions = {
301
- manage: "users:manage",
302
- invite: "users:invite"
303
- };
304
- const userGrants = Object.values(userActions);
305
- const userRoleGrants = {
306
- owner: [userActions.manage, userActions.invite],
307
- admin: [userActions.manage, userActions.invite],
308
- builder: [userActions.invite]
309
- };
310
- /** Role ceiling: which roles each inviter may grant. Owner is never invitable (shared schema). */
311
- const invitableRolesByRole = {
312
- owner: ["admin", "builder"],
313
- admin: ["admin", "builder"],
314
- builder: ["builder"]
315
- };
316
- function canInviteRole(inviter, invited) {
317
- return invitableRolesByRole[inviter].includes(invited);
318
- }
319
- function mergeRoleGrants(role) {
320
- return [
321
- ...organizationRoleGrants[role],
322
- ...userRoleGrants[role],
323
- ...apiKeysRoleGrants[role]
324
- ];
325
- }
326
- const orgRolePermissions = {
327
- owner: mergeRoleGrants("owner"),
328
- admin: mergeRoleGrants("admin"),
329
- builder: mergeRoleGrants("builder")
330
- };
331
- const projectActions = {
332
- read: "project:read",
333
- deploy: "project:deploy",
334
- update: "project:update",
335
- delete: "project:delete",
336
- manageMembers: "project:manage-members",
337
- invite: "project:invite"
338
- };
339
- const projectGrants = Object.values(projectActions);
340
- const projectRoleGrants = {
341
- admin: Object.values(projectActions),
342
- builder: [projectActions.read, projectActions.deploy]
343
- };
344
- const orgAdminRoles = new Set(["owner", "admin"]);
345
- const projectActionSet = new Set(projectGrants);
346
- function isProjectAction(action) {
347
- return projectActionSet.has(action);
348
- }
349
- function checkPermission(action, ctx) {
350
- if (isProjectAction(action)) {
351
- if (orgAdminRoles.has(ctx.orgRole)) return true;
352
- return ctx.projectRole != null && projectRoleGrants[ctx.projectRole].includes(action);
353
- }
354
- return orgRolePermissions[ctx.orgRole].includes(action);
355
- }
356
- function projectListScope(ctx) {
357
- return checkPermission(projectActions.read, ctx) ? { kind: "all" } : { kind: "member-only" };
358
- }
359
- function canReadProject(ctx, hasMembership) {
360
- return checkPermission(projectActions.read, ctx) || hasMembership;
361
- }
362
- const agentListScope = projectListScope;
363
- const canAccessAgent = canReadProject;
364
- function canRevokeApiKey(ctx, input) {
365
- return input.userId === input.createdByUserId || checkPermission(userActions.manage, ctx);
366
- }
367
- function apiKeyListScope(ctx) {
368
- return checkPermission(apiKeysActions.read, ctx) ? { kind: "all" } : { kind: "creator-only" };
369
- }
370
- function canReadApiKey(ctx, input) {
371
- return checkPermission(apiKeysActions.read, ctx) || input.userId === input.createdByUserId;
372
- }
373
- [
374
- ...organizationGrants,
375
- ...userGrants,
376
- ...apiKeysGrants,
377
- ...projectGrants
378
- ];
379
- const historyListScope = projectListScope;
380
- const canAccessHistoryRun = canReadProject;
381
- function canInviteToProject(ctx, settings, invitedRole) {
382
- if (!(checkPermission(projectActions.invite, ctx) || settings.invitePermission === "all" && ctx.projectRole === "builder")) return false;
383
- if (checkPermission(projectActions.manageMembers, ctx)) return true;
384
- return invitedRole === "builder";
385
- }
386
- const skillListScope = projectListScope;
387
- const canAccessSkill = canReadProject;
388
- const workflowListScope = projectListScope;
389
- const canAccessWorkflow = canReadProject;
390
- //#endregion
391
- //#region src/auth/access-context.ts
392
- function accessContext(c) {
393
- const organization = c.get("organization");
394
- const projectMember = c.get("projectMember");
395
- return {
396
- orgRole: organization.role,
397
- projectRole: projectMember?.role
398
- };
399
- }
400
- function getProjectInvitePermission(c) {
401
- return c.get("project").invitePermission;
402
- }
403
- //#endregion
404
- //#region ../../packages/http/dist/require-session-BLPGA50N.mjs
405
- function resolveActiveOrganizationId(c) {
406
- const header = c.req.header(ACTIVE_ORG_HEADER)?.trim();
407
- if (header) return header;
408
- return c.get("apiKeyAuth")?.organizationId;
409
- }
410
- async function resolveOrganizationContext(c) {
411
- const organizationId = resolveActiveOrganizationId(c);
412
- if (!organizationId) return {
413
- ok: false,
414
- response: c.json(ErrorResponseSchema.parse({
415
- error: "Select an organization to continue",
416
- code: "needs_org_selection"
417
- }), 409)
418
- };
419
- const apiKeyAuth = c.get("apiKeyAuth");
420
- if (apiKeyAuth && apiKeyAuth.organizationId !== organizationId) return {
421
- ok: false,
422
- response: c.json(ErrorResponseSchema.parse({ error: "Forbidden" }), 403)
423
- };
424
- const membership = await selectUserOrganizationMembership(c.get("user").id, organizationId);
425
- if (!membership) return {
426
- ok: false,
427
- response: c.json(ErrorResponseSchema.parse({ error: "Forbidden" }), 403)
428
- };
429
- return {
430
- ok: true,
431
- organization: {
432
- organizationId: membership.organization.id,
433
- organizationName: membership.organization.name,
434
- role: membership.role
435
- }
436
- };
437
- }
438
- function requireOrganization() {
439
- return async (c, next) => {
440
- const resolved = await resolveOrganizationContext(c);
441
- if (!resolved.ok) return resolved.response;
442
- c.set("organization", resolved.organization);
443
- await next();
444
- };
445
- }
446
- function requireProject() {
447
- return async (c, next) => {
448
- const organization = c.get("organization");
449
- const projectId = c.req.param("projectId")?.trim();
450
- if (!projectId) return c.json(ErrorResponseSchema.parse({ error: "Project id is required" }), 400);
451
- const [project, organizationRow] = await Promise.all([selectProjectForOrganization(organization.organizationId, projectId), selectOrganizationById(organization.organizationId)]);
452
- if (!project) return c.json(ErrorResponseSchema.parse({ error: "Project not found" }), 404);
453
- if (!organizationRow) return c.json(ErrorResponseSchema.parse({ error: "Organization not found" }), 404);
454
- c.set("project", project);
455
- await runWithWorkspaceContext({
456
- organizationId: organization.organizationId,
457
- role: organization.role,
458
- projectId: project.id,
459
- dbSchema: organizationRow.dbSchema
460
- }, () => next());
461
- };
462
- }
463
- function routeProject(project) {
464
- return mapProject(project);
465
- }
466
- function forbidden(c) {
467
- return c.json(ErrorResponseSchema.parse({ error: "Forbidden" }), 403);
468
- }
469
- function notFound(c, message = "Not found") {
470
- return c.json(ErrorResponseSchema.parse({ error: message }), 404);
471
- }
472
- function requireProjectMembership() {
473
- return async (c, next) => {
474
- const { role: orgRole } = c.get("organization");
475
- const project = c.get("project");
476
- if (checkPermission(projectActions.read, { orgRole })) {
477
- await next();
478
- return;
479
- }
480
- const membership = await selectUserProjectMembership(c.get("user").id, project.id);
481
- if (!membership) return notFound(c, "Project not found");
482
- c.set("projectMember", { role: membership.role });
483
- await next();
484
- };
485
- }
486
- function sessionFromApiKeyUser(user, token) {
487
- return {
488
- user: {
489
- id: user.id,
490
- email: user.email,
491
- name: user.name,
492
- image: user.image ?? null,
493
- emailVerified: user.emailVerified,
494
- createdAt: user.createdAt,
495
- updatedAt: user.updatedAt
496
- },
497
- session: {
498
- id: user.id,
499
- userId: user.id,
500
- token,
501
- expiresAt: new Date(Date.now() + 900 * 1e3),
502
- createdAt: /* @__PURE__ */ new Date(),
503
- updatedAt: /* @__PURE__ */ new Date()
504
- }
505
- };
506
- }
507
- function requireSession(jwtVerifier) {
508
- const verifier = jwtVerifier ?? createDefaultAuthJwtVerifier();
509
- return async (c, next) => {
510
- const result = await resolveRequestAuth(verifier, c.req.raw.headers);
511
- if (result) {
512
- c.set("user", result.user);
513
- c.set("session", result.session);
514
- await next();
515
- return;
516
- }
517
- const apiKeySecret = extractWebhookApiKeyFromRequest(c.req.raw);
518
- if (apiKeySecret) {
519
- const verified = await verifyOrgPlatformApiKeySecret(apiKeySecret);
520
- if (verified) {
521
- const user = await loadOrgPlatformApiKeyUser(verified.userId);
522
- if (user) {
523
- const session = sessionFromApiKeyUser(user, apiKeySecret);
524
- c.set("user", session.user);
525
- c.set("session", session.session);
526
- c.set("apiKeyAuth", {
527
- apiKeyId: verified.apiKeyId,
528
- organizationId: verified.organizationId
529
- });
530
- await next();
531
- return;
532
- }
533
- }
534
- }
535
- return c.json({ error: "Unauthorized" }, 401);
536
- };
537
- }
538
- //#endregion
539
- //#region src/auth/authorize.ts
540
- function authorize(action) {
541
- return async (c, next) => {
542
- if (!checkPermission(action, accessContext(c))) return forbidden(c);
543
- await next();
544
- };
545
- }
546
- //#endregion
547
- //#region src/auth/authorize-payload.ts
548
- function authorizePayload(schema, allow) {
549
- return async (c, next) => {
550
- const parsed = schema.safeParse(await c.req.json().catch(() => null));
551
- if (parsed.success && !allow({
552
- c,
553
- ctx: accessContext(c),
554
- body: parsed.data
555
- })) return forbidden(c);
556
- await next();
557
- };
558
- }
559
- //#endregion
560
- //#region src/auth/require-organization-param.ts
561
- function requireOrganizationParam() {
562
- return async (c, next) => {
563
- const organizationId = c.req.param("organizationId")?.trim();
564
- if (!organizationId) return c.json(ErrorResponseSchema.parse({ error: "Organization id is required" }), 400);
565
- const membership = await selectUserOrganizationMembership(c.get("user").id, organizationId);
566
- if (!membership) return c.json(ErrorResponseSchema.parse({ error: "Forbidden" }), 403);
567
- c.set("organization", {
568
- organizationId: membership.organization.id,
569
- organizationName: membership.organization.name,
570
- role: membership.role
571
- });
572
- await next();
573
- };
574
- }
575
- //#endregion
576
- //#region ../../packages/http/dist/with-public-project-runtime-B7hmgjbi.mjs
577
- const requestBackgroundTasks = new AsyncLocalStorage();
578
- function runWithRequestBackgroundTasks(fn) {
579
- return requestBackgroundTasks.run([], fn);
580
- }
581
- function deferRequestBackgroundTask(task) {
582
- const tasks = requestBackgroundTasks.getStore();
583
- if (!tasks) return;
584
- tasks.push(task);
585
- }
586
- async function flushRequestBackgroundTasks() {
587
- const tasks = requestBackgroundTasks.getStore() ?? [];
588
- await Promise.allSettled(tasks);
589
- }
590
- /** Org DB connection options for `@keystrokehq/database` project scope (pg schema vs sqlite file). */
591
- function resolveOrgProjectDatabaseOptions(organization) {
592
- const url = resolveOrgDatabaseUrl(organization);
593
- if (inferDialect(url) === "postgres") return {
594
- url,
595
- searchPath: organization.dbSchema
596
- };
597
- return { url };
598
- }
599
- /** Bind the org's shared Postgres schema (all projects in the org use this DB). */
600
- function withOrganizationProjectDatabase() {
601
- return async (c, next) => {
602
- const { organizationId } = c.get("organization");
603
- const organization = await selectOrganizationById(organizationId);
604
- if (!organization) return c.json({ error: "Organization not found" }, 404);
605
- const dbOptions = resolveOrgProjectDatabaseOptions(organization);
606
- await runWithOrganizationScope(organizationId, () => runWithProjectDatabase(dbOptions, () => runWithTenantScope(organizationId, () => runWithRequestBackgroundTasks(async () => {
607
- await next();
608
- await flushRequestBackgroundTasks();
609
- }))));
610
- };
611
- }
612
- //#endregion
613
- //#region src/routes/account/users/me/avatar/GET.ts
614
- const handler$63 = async (c) => {
615
- const dbUser = await selectUserById(c.get("user").id);
616
- if (!dbUser) return c.json(ErrorResponseSchema.parse({ error: "User not found" }), 404);
617
- return c.json(UserAvatarSchema.parse({ url: dbUser.image ?? null }));
618
- };
619
- //#endregion
620
- //#region src/lib/user-avatar-content-type.ts
621
- const ALLOWED_AVATAR_CONTENT_TYPES = {
622
- "image/jpeg": "jpg",
623
- "image/jpg": "jpg",
624
- "image/png": "png",
625
- "image/webp": "webp",
626
- "image/gif": "gif"
627
- };
628
- function avatarExtensionForContentType(contentType) {
629
- return ALLOWED_AVATAR_CONTENT_TYPES[contentType.split(";")[0]?.trim().toLowerCase() ?? ""] ?? null;
630
- }
631
- //#endregion
632
- //#region src/routes/account/users/me/avatar/presign/POST.ts
633
- const handler$62 = async (c) => {
634
- const parsed = PresignUserAvatarRequestSchema.safeParse(await c.req.json().catch(() => null));
635
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid avatar upload request" }), 400);
636
- const extension = avatarExtensionForContentType(parsed.data.contentType);
637
- if (!extension) return c.json(ErrorResponseSchema.parse({ error: "Unsupported image type" }), 400);
638
- const storageKey = userAvatarStorageKey(c.get("user").id, extension);
639
- const uploadUrl = await createAssetsStorageClient().presignPut({
640
- key: storageKey,
641
- contentType: parsed.data.contentType
642
- });
643
- return c.json(PresignUserAvatarResponseSchema.parse({
644
- uploadUrl,
645
- storageKey
646
- }));
647
- };
648
- //#endregion
649
- //#region src/lib/stored-image.ts
650
- async function finalizeStoredImageUpload(input) {
651
- if (!input.isValidStorageKey(input.storageKey)) return {
652
- ok: false,
653
- error: "Invalid storage key"
654
- };
655
- const head = await input.storage.headObject(input.storageKey);
656
- if (!head || head.contentLength <= 0) return {
657
- ok: false,
658
- error: "Upload not found"
659
- };
660
- return {
661
- ok: true,
662
- publicUrl: input.buildPublicUrl(input.storageKey)
663
- };
664
- }
665
- async function deleteStoredImageIfOwned(input) {
666
- if (!input.url || !input.isOwnedPublicUrl(input.url)) return;
667
- const key = input.keyFromPublicUrl(input.url);
668
- if (!key) return;
669
- await input.storage.deleteObject(key).catch(() => void 0);
670
- }
671
- //#endregion
672
- //#region src/routes/account/users/me/avatar/PATCH.ts
673
- const handler$61 = async (c) => {
674
- const parsed = UserAvatarPatchSchema.safeParse(await c.req.json().catch(() => null));
675
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid avatar update" }), 400);
676
- const user = c.get("user");
677
- const dbUser = await selectUserById(user.id);
678
- if (!dbUser) return c.json(ErrorResponseSchema.parse({ error: "User not found" }), 404);
679
- const storage = createAssetsStorageClient();
680
- const { storageKey } = parsed.data;
681
- if (storageKey === null) {
682
- await deleteStoredImageIfOwned({
683
- storage,
684
- url: dbUser.image,
685
- isOwnedPublicUrl: isKeystrokeAssetsAvatarPublicUrl,
686
- keyFromPublicUrl: keystrokeAssetsAvatarKeyFromPublicUrl
687
- });
688
- await updateUserById(user.id, {
689
- image: null,
690
- updatedAt: /* @__PURE__ */ new Date()
691
- });
692
- return c.json(UserAvatarSchema.parse({ url: null }));
693
- }
694
- const finalized = await finalizeStoredImageUpload({
695
- storage,
696
- storageKey,
697
- isValidStorageKey: (key) => isUserAvatarStorageKey(key, user.id),
698
- buildPublicUrl: publicKeystrokeAssetsObjectUrl
699
- });
700
- if (!finalized.ok) return c.json(ErrorResponseSchema.parse({ error: finalized.error }), 400);
701
- if (dbUser.image && dbUser.image !== finalized.publicUrl) await deleteStoredImageIfOwned({
702
- storage,
703
- url: dbUser.image,
704
- isOwnedPublicUrl: isKeystrokeAssetsAvatarPublicUrl,
705
- keyFromPublicUrl: keystrokeAssetsAvatarKeyFromPublicUrl
706
- });
707
- await updateUserById(user.id, {
708
- image: finalized.publicUrl,
709
- updatedAt: /* @__PURE__ */ new Date()
710
- });
711
- return c.json(UserAvatarSchema.parse({ url: finalized.publicUrl }));
712
- };
713
- //#endregion
714
- //#region src/routes/account/users/me/preferences/GET.ts
715
- const handler$60 = async (c) => {
716
- const dbUser = await selectUserById(c.get("user").id);
717
- if (!dbUser) return c.json(ErrorResponseSchema.parse({ error: "User not found" }), 404);
718
- return c.json(UserPreferencesSchema.parse(normalizeUserPreferences(dbUser.preferences)));
719
- };
720
- //#endregion
721
- //#region src/routes/account/users/me/preferences/PATCH.ts
722
- const handler$59 = async (c) => {
723
- const parsed = UserPreferencesPatchSchema.safeParse(await c.req.json().catch(() => null));
724
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid preferences update" }), 400);
725
- const user = c.get("user");
726
- const dbUser = await selectUserById(user.id);
727
- if (!dbUser) return c.json(ErrorResponseSchema.parse({ error: "User not found" }), 404);
728
- const next = mergeUserPreferences(normalizeUserPreferences(dbUser.preferences), parsed.data);
729
- await updateUserById(user.id, {
730
- preferences: next,
731
- updatedAt: /* @__PURE__ */ new Date()
732
- });
733
- return c.json(UserPreferencesSchema.parse(next));
734
- };
735
- //#endregion
736
- //#region src/routes/account/organizations/GET.ts
737
- const handler$58 = async (c) => {
738
- const memberships = await selectUserOrganizations(c.get("user").id);
739
- return c.json(ListOrganizationsResponseSchema.parse(memberships.map(mapUserOrganization)));
740
- };
741
- //#endregion
742
- //#region src/services/create-organization.ts
743
- async function createOrganizationWithHosting(deps, userId, name, preferredSlug) {
744
- const { hosting, storage } = deps;
745
- const identity = await resolveNewOrganizationIdentity(name, preferredSlug);
746
- let hostedAppName;
747
- let provisionedStorage;
748
- let organizationPersisted = false;
749
- try {
750
- if (hosting.provisionOrganization) hostedAppName = (await hosting.provisionOrganization({
751
- organizationId: identity.organizationId,
752
- name: name.trim()
753
- })).appName;
754
- provisionedStorage = await storage.provisionOrganization({
755
- organizationId: identity.organizationId,
756
- name: name.trim()
757
- });
758
- const membership = await createOrganizationForUser(userId, name, preferredSlug, {
759
- organizationId: identity.organizationId,
760
- slug: identity.slug,
761
- hostingAppName: hostedAppName ?? null,
762
- storage: {
763
- bucket: provisionedStorage.bucket,
764
- endpoint: provisionedStorage.endpoint,
765
- accessKeyIdCiphertext: encryptCredentialPayload$1(provisionedStorage.accessKeyId),
766
- secretAccessKeyCiphertext: encryptCredentialPayload$1(provisionedStorage.secretAccessKey),
767
- region: provisionedStorage.region ?? null,
768
- forcePathStyle: provisionedStorage.forcePathStyle ?? null
769
- }
770
- });
771
- organizationPersisted = true;
772
- await seedOAuthAppsFromEnvForOrganization(identity.organizationId);
773
- return membership;
774
- } catch (error) {
775
- if (provisionedStorage && !organizationPersisted) {
776
- if (!await isOrganizationStorageBucketInUse(provisionedStorage.bucket)) await storage.deprovisionOrganization(provisionedStorage).catch(() => void 0);
777
- }
778
- if (hostedAppName && hosting.deprovisionOrganization) await hosting.deprovisionOrganization({ appName: hostedAppName }).catch(() => void 0);
779
- throw error;
780
- }
781
- }
782
- //#endregion
783
- //#region src/routes/account/organizations/slug-errors.ts
784
- function organizationSlugErrorBody(error) {
785
- if (error instanceof OrganizationSlugTakenError) return {
786
- error: error.message,
787
- code: "slug_taken"
788
- };
789
- const message = error.issues[0]?.message ?? "Invalid organization slug";
790
- return {
791
- error: message,
792
- code: organizationSlugErrorCodeFromMessage(message)
793
- };
794
- }
795
- //#endregion
796
- //#region src/routes/account/organizations/POST.ts
797
- function createOrganizationHandler(deps) {
798
- return async (c) => {
799
- const user = c.get("user");
800
- const body = await c.req.json().catch(() => null);
801
- const parsed = CreateOrganizationRequestSchema.safeParse(body);
802
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid organization request" }), 400);
803
- try {
804
- const membership = await createOrganizationWithHosting(deps, user.id, parsed.data.name, parsed.data.slug);
805
- return c.json(CreateOrganizationResponseSchema.parse(mapUserOrganization(membership)), 201);
806
- } catch (error) {
807
- if (error instanceof OrganizationSlugTakenError$1) return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 409);
808
- if (error instanceof ZodError) return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 400);
809
- throw error;
810
- }
811
- };
812
- }
813
- //#endregion
814
- //#region src/routes/account/organizations/slug-available/GET.ts
815
- const handler$57 = async (c) => {
816
- const parsed = SlugAvailabilityQuerySchema.safeParse({
817
- slug: c.req.query("slug"),
818
- excludeOrganizationId: c.req.query("excludeOrganizationId")
819
- });
820
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid slug query" }), 400);
821
- const availability = await checkOrganizationSlugAvailability(parsed.data.slug, parsed.data.excludeOrganizationId);
822
- return c.json(SlugAvailabilityResponseSchema.parse(availability));
823
- };
824
- //#endregion
825
- //#region src/routes/account/organizations/[organizationId]/GET.ts
826
- const handler$56 = async (c) => {
827
- const { organizationId } = c.get("organization");
828
- const membership = await selectUserOrganizationMembership(c.get("user").id, organizationId);
829
- if (!membership) throw new Error(`Organization membership missing after param guard: ${organizationId}`);
830
- return c.json(ActiveOrganizationResponseSchema.parse(mapUserOrganization(membership)));
831
- };
832
- //#endregion
833
- //#region src/routes/account/organizations/[organizationId]/PATCH.ts
834
- const handler$55 = async (c) => {
835
- const organization = c.get("organization");
836
- const body = await c.req.json().catch(() => null);
837
- const parsed = UpdateOrganizationRequestSchema.safeParse(body);
838
- if (!parsed.success) {
839
- const errorBody = parsed.error.issues.some((issue) => issue.path[0] === "slug") ? organizationSlugErrorBody(parsed.error) : validationErrorResponse(parsed.error, "Invalid organization update");
840
- return c.json(ErrorResponseSchema.parse(errorBody), 400);
841
- }
842
- try {
843
- let updated;
844
- if (parsed.data.name !== void 0) updated = await updateOrganizationName(organization.organizationId, parsed.data.name);
845
- if (parsed.data.slug !== void 0) updated = await updateOrganizationSlug(organization.organizationId, parsed.data.slug);
846
- if (!updated) throw new Error(`Organization update produced no result: ${organization.organizationId}`);
847
- return c.json(ActiveOrganizationResponseSchema.parse(mapUserOrganization({
848
- organization: updated,
849
- role: organization.role
850
- })));
851
- } catch (error) {
852
- if (error instanceof OrganizationSlugTakenError) return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 409);
853
- if (error instanceof ZodError) return c.json(ErrorResponseSchema.parse(organizationSlugErrorBody(error)), 400);
854
- throw error;
855
- }
856
- };
857
- //#endregion
858
- //#region src/routes/account/organizations/[organizationId]/branding/GET.ts
859
- const handler$54 = async (c) => {
860
- const { organizationId } = c.get("organization");
861
- const organization = await selectOrganizationById(organizationId);
862
- if (!organization) return c.json(ErrorResponseSchema.parse({ error: "Organization not found" }), 404);
863
- return c.json(OrganizationSidebarBrandingSchema.parse(organizationRowToSidebarBranding(organization)));
864
- };
865
- //#endregion
866
- //#region src/routes/account/organizations/[organizationId]/branding/PATCH.ts
867
- const LOGO_VARIANTS = [{
868
- variant: "light",
869
- storageKeyField: "logoLightStorageKey",
870
- urlField: "logoLightUrl"
871
- }, {
872
- variant: "dark",
873
- storageKeyField: "logoDarkStorageKey",
874
- urlField: "logoDarkUrl"
875
- }];
876
- async function finalizeOrgLogoVariant(input) {
877
- const storage = createAssetsStorageClient();
878
- if (input.storageKey === null) {
879
- await deleteStoredImageIfOwned({
880
- storage,
881
- url: input.currentUrl,
882
- isOwnedPublicUrl: isKeystrokeAssetsOrgLogoPublicUrl,
883
- keyFromPublicUrl: keystrokeAssetsOrgLogoKeyFromPublicUrl
884
- });
885
- return {
886
- ok: true,
887
- publicUrl: null
888
- };
889
- }
890
- const finalized = await finalizeStoredImageUpload({
891
- storage,
892
- storageKey: input.storageKey,
893
- isValidStorageKey: (key) => isOrgLogoStorageKey(key, input.organizationId, input.variant),
894
- buildPublicUrl: publicKeystrokeAssetsObjectUrl
895
- });
896
- if (!finalized.ok) return finalized;
897
- if (input.currentUrl && input.currentUrl !== finalized.publicUrl) await deleteStoredImageIfOwned({
898
- storage,
899
- url: input.currentUrl,
900
- isOwnedPublicUrl: isKeystrokeAssetsOrgLogoPublicUrl,
901
- keyFromPublicUrl: keystrokeAssetsOrgLogoKeyFromPublicUrl
902
- });
903
- return {
904
- ok: true,
905
- publicUrl: finalized.publicUrl
906
- };
907
- }
908
- const handler$53 = async (c) => {
909
- const parsed = OrganizationSidebarBrandingPatchSchema.safeParse(await c.req.json().catch(() => null));
910
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid branding update" }), 400);
911
- const { organizationId } = c.get("organization");
912
- const organization = await selectOrganizationById(organizationId);
913
- if (!organization) return c.json(ErrorResponseSchema.parse({ error: "Organization not found" }), 404);
914
- const dbUpdate = {
915
- customLogoEnabled: parsed.data.customLogoEnabled,
916
- customLogoExplicitlyDisabled: parsed.data.customLogoExplicitlyDisabled,
917
- logoHeightPx: parsed.data.logoHeightPx
918
- };
919
- for (const { variant, storageKeyField, urlField } of LOGO_VARIANTS) {
920
- const storageKey = parsed.data[storageKeyField];
921
- if (storageKey === void 0) continue;
922
- const result = await finalizeOrgLogoVariant({
923
- organizationId,
924
- variant,
925
- storageKey,
926
- currentUrl: organization[urlField]
927
- });
928
- if (!result.ok) return c.json(ErrorResponseSchema.parse({ error: result.error }), 400);
929
- dbUpdate[urlField] = result.publicUrl;
930
- }
931
- const updated = await updateOrganizationSidebarBranding(organizationId, dbUpdate);
932
- return c.json(OrganizationSidebarBrandingSchema.parse(organizationRowToSidebarBranding(updated)));
933
- };
934
- //#endregion
935
- //#region src/routes/account/organizations/[organizationId]/branding/logo/presign/POST.ts
936
- const handler$52 = async (c) => {
937
- const parsed = PresignOrgLogoRequestSchema.safeParse(await c.req.json().catch(() => null));
938
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid logo upload request" }), 400);
939
- const extension = avatarExtensionForContentType(parsed.data.contentType);
940
- if (!extension) return c.json(ErrorResponseSchema.parse({ error: "Unsupported image type" }), 400);
941
- const { organizationId } = c.get("organization");
942
- const storageKey = orgLogoStorageKey(organizationId, parsed.data.variant, extension);
943
- const uploadUrl = await createAssetsStorageClient().presignPut({
944
- key: storageKey,
945
- contentType: parsed.data.contentType
946
- });
947
- return c.json(PresignOrgLogoResponseSchema.parse({
948
- uploadUrl,
949
- storageKey
950
- }));
951
- };
952
- //#endregion
953
- //#region src/auth/project-access.ts
954
- function adminViewRequested(c) {
955
- return c.req.query("admin") === "true";
956
- }
957
- /** Capability from policy, narrowed by the caller's view preference. */
958
- function listScope(c, capability) {
959
- return adminViewRequested(c) ? capability : { kind: "member-only" };
960
- }
961
- async function grantedProjectIds(c, scope) {
962
- if (scope.kind === "all") return;
963
- const { organizationId } = c.get("organization");
964
- return selectProjectIdsForUser(organizationId, c.get("user").id);
965
- }
966
- async function resolveListProjectIds(c, scope, requested) {
967
- const granted = await grantedProjectIds(c, scope);
968
- const projectId = requested?.trim() || void 0;
969
- if (projectId) {
970
- if (granted !== void 0 && !granted.includes(projectId)) return "empty";
971
- return { projectIds: [projectId] };
972
- }
973
- if (granted === void 0) return {};
974
- if (granted.length === 0) return "empty";
975
- return { projectIds: granted };
976
- }
977
- async function canAccessProjectId(c, projectId, check) {
978
- const ctx = accessContext(c);
979
- const granted = await grantedProjectIds(c, projectListScope(ctx));
980
- return check(ctx, granted === void 0 ? false : granted.includes(projectId));
981
- }
982
- //#endregion
983
- //#region src/routes/account/history/enrich.ts
984
- async function resolveHistoryRunActor(ranByUserId) {
985
- if (!ranByUserId) return null;
986
- const user = await selectUserById(ranByUserId);
987
- if (!user) return null;
988
- return {
989
- userId: user.id,
990
- name: user.name,
991
- avatarUrl: user.image ?? null
992
- };
993
- }
994
- async function enrichHistoryRun(run, projectNameById) {
995
- const { ranByUserId, ...rest } = run;
996
- return {
997
- ...rest,
998
- projectName: projectNameById.get(run.projectId) ?? "Project",
999
- ranAs: await resolveHistoryRunActor(ranByUserId)
1000
- };
1001
- }
1002
- async function enrichHistoryRuns(runs, projectNameById) {
1003
- const actorByUserId = /* @__PURE__ */ new Map();
1004
- return Promise.all(runs.map(async (run) => {
1005
- const { ranByUserId, ...rest } = run;
1006
- let ranAs = null;
1007
- if (ranByUserId) {
1008
- if (!actorByUserId.has(ranByUserId)) actorByUserId.set(ranByUserId, await resolveHistoryRunActor(ranByUserId));
1009
- ranAs = actorByUserId.get(ranByUserId) ?? null;
1010
- }
1011
- return {
1012
- ...rest,
1013
- projectName: projectNameById.get(run.projectId) ?? "Project",
1014
- ranAs
1015
- };
1016
- }));
1017
- }
1018
- async function attachRanAsToDetail(detail, ranByUserId) {
1019
- const ranAs = await resolveHistoryRunActor(ranByUserId);
1020
- return {
1021
- ...detail,
1022
- ranAs
1023
- };
1024
- }
1025
- //#endregion
1026
- //#region src/routes/account/history/GET.ts
1027
- const handler$51 = async (c) => {
1028
- const organization = c.get("organization");
1029
- const ctx = accessContext(c);
1030
- const query = HistoryRunListQuerySchema.parse({
1031
- project: c.req.query("project")?.trim() || void 0,
1032
- status: c.req.query("status")?.trim() || void 0,
1033
- kind: c.req.query("kind")?.trim() || void 0
1034
- });
1035
- const scope = listScope(c, historyListScope(ctx));
1036
- const filter = await resolveListProjectIds(c, scope, query.project);
1037
- if (filter === "empty") return c.json(HistoryRunListResponseSchema.parse([]));
1038
- const runs = await listHistoryRuns({
1039
- ...filter,
1040
- ...query.status ? { status: query.status } : {},
1041
- ...query.kind ? { kind: query.kind } : {}
1042
- });
1043
- const grantedProjectIdsList = await grantedProjectIds(c, scope);
1044
- const projects = await selectProjectsByOrganizationId(organization.organizationId, { grantedProjectIds: grantedProjectIdsList });
1045
- const historyRuns = await enrichHistoryRuns(runs, new Map(projects.map((project) => [project.id, project.name])));
1046
- return c.json(HistoryRunListResponseSchema.parse(historyRuns));
1047
- };
1048
- //#endregion
1049
- //#region src/routes/account/history/[runId]/GET.ts
1050
- const handler$50 = async (c) => {
1051
- const runId = c.req.param("runId") ?? "";
1052
- if (!runId) return c.json(null, 404);
1053
- const core = await findHistoryRunCore(runId);
1054
- if (!core || !await canAccessProjectId(c, core.projectId, canAccessHistoryRun)) return c.json(null, 404);
1055
- const detail = await runWithProjectScope(core.projectId, async () => {
1056
- if (core.kind === "workflow") {
1057
- const row = await selectWorkflowRunById(runId);
1058
- if (!row) return null;
1059
- return buildHistoryWorkflowRunDetail(row.workflowSlug, runId);
1060
- }
1061
- const session = await selectAgentSessionById(runId);
1062
- if (!session) return null;
1063
- const agent = await selectActiveAgentById(session.agentId);
1064
- if (!agent) return null;
1065
- return buildHistoryAgentSessionDetail(agent.slug, runId);
1066
- });
1067
- if (!detail) return c.json(null, 404);
1068
- return c.json(HistoryRunDetailResponseSchema.parse(await attachRanAsToDetail(detail, core.ranByUserId)));
1069
- };
1070
- //#endregion
1071
- //#region src/routes/account/resources/common.ts
1072
- /** Derive a human display name from a resource slug when no explicit name is stored. */
1073
- function titleCaseKey(slug) {
1074
- const normalized = slug.split(/[/_-]+/).filter(Boolean).join(" ");
1075
- if (!normalized) return PLATFORM_RESOURCE_UNSUPPORTED_TEXT;
1076
- return normalized.replace(/\b\w/g, (char) => char.toUpperCase());
1077
- }
1078
- //#endregion
1079
- //#region src/routes/account/resources/agents.ts
1080
- function formatModel(model) {
1081
- if (!model) return;
1082
- return model;
1083
- }
1084
- function toAgentSummary(row, options) {
1085
- return AgentSummarySchema.parse({
1086
- id: row.id,
1087
- slug: row.slug,
1088
- name: row.name?.trim() || titleCaseKey(row.slug),
1089
- description: row.description ?? void 0,
1090
- projectId: row.projectId,
1091
- updatedAt: row.updatedAt.toISOString(),
1092
- sourcePath: row.moduleFile,
1093
- model: formatModel(row.model),
1094
- toolCount: row.toolCount ?? void 0,
1095
- credentialCount: row.credentialCount ?? void 0,
1096
- lastRunAt: options?.lastRunAt?.toISOString()
1097
- });
1098
- }
1099
- //#endregion
1100
- //#region src/routes/account/agents/GET.ts
1101
- const handler$49 = async (c) => {
1102
- const filter = await resolveListProjectIds(c, listScope(c, agentListScope(accessContext(c))), c.req.query("projectId"));
1103
- if (filter === "empty") return c.json(AgentSummaryListResponseSchema.parse([]));
1104
- const rows = await listActiveAgents(filter);
1105
- const lastRunAtById = await selectAgentLastRunAtByIds(rows.map((row) => row.id));
1106
- return c.json(AgentSummaryListResponseSchema.parse(rows.map((row) => toAgentSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null }))));
1107
- };
1108
- //#endregion
1109
- //#region src/routes/account/lib/touch-resource-activity.ts
1110
- function touchResourceActivityBestEffort(options) {
1111
- deferRequestBackgroundTask(touchResourceActivity(options).catch(() => {}));
1112
- }
1113
- //#endregion
1114
- //#region src/routes/account/agents/[agentId]/GET.ts
1115
- const handler$48 = async (c) => {
1116
- const agentId = c.req.param("agentId") ?? "";
1117
- const row = agentId ? await selectActiveAgentById(agentId) : void 0;
1118
- if (!row || !await canAccessProjectId(c, row.projectId, canAccessAgent)) return c.json(AgentSummaryDetailResponseSchema.parse(null));
1119
- touchResourceActivityBestEffort({
1120
- userId: c.get("user").id,
1121
- projectId: row.projectId,
1122
- resourceKind: "agent",
1123
- resourceId: row.id
1124
- });
1125
- const lastRunAtById = await selectAgentLastRunAtByIds([row.id]);
1126
- return c.json(AgentSummaryDetailResponseSchema.parse(toAgentSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null })));
1127
- };
1128
- //#endregion
1129
- //#region src/routes/account/history/cancel-run.ts
1130
- /** Shared body for the workflow-run and agent-session cancel endpoints. */
1131
- async function cancelHistoryRun(c, kind, cancel) {
1132
- const organizationContext = c.get("organization");
1133
- const id = c.req.param(kind === "workflow" ? "runId" : "sessionId") ?? "";
1134
- if (!id) return c.json(null, 404);
1135
- const core = await findHistoryRunCore(id);
1136
- if (!core || core.kind !== kind) return c.json(null, 404);
1137
- if (!await canAccessProjectId(c, core.projectId, canAccessHistoryRun)) return c.json(null, 404);
1138
- const run = await runWithProjectScope(core.projectId, () => cancel(id));
1139
- if (!run) return c.json(null, 404);
1140
- const organization = await selectOrganizationById(organizationContext.organizationId);
1141
- if (!organization) return c.json(null, 404);
1142
- await (await getProjectScheduler(organization, core.projectId)).publishCancel(id);
1143
- const grantedProjectIdsList = await grantedProjectIds(c, historyListScope(accessContext(c)));
1144
- const projects = await selectProjectsByOrganizationId(organizationContext.organizationId, { grantedProjectIds: grantedProjectIdsList });
1145
- const historyRun = await enrichHistoryRun(run, new Map(projects.map((project) => [project.id, project.name])));
1146
- return c.json(HistoryRunCancelResponseSchema.parse(historyRun));
1147
- }
1148
- //#endregion
1149
- //#region src/routes/account/agents/sessions/[sessionId]/cancel/POST.ts
1150
- const handler$47 = (c) => cancelHistoryRun(c, "agent", cancelAgentSession);
1151
- //#endregion
1152
- //#region src/routes/account/resources/workflows.ts
1153
- function toWorkflowSummary(row, options) {
1154
- return WorkflowSummarySchema.parse({
1155
- id: row.id,
1156
- slug: row.slug,
1157
- name: row.name?.trim() || titleCaseKey(row.slug),
1158
- description: row.description ?? void 0,
1159
- projectId: row.projectId,
1160
- updatedAt: row.updatedAt.toISOString(),
1161
- sourcePath: row.moduleFile,
1162
- lastRunAt: options?.lastRunAt?.toISOString()
1163
- });
1164
- }
1165
- //#endregion
1166
- //#region src/routes/account/workflows/GET.ts
1167
- const handler$46 = async (c) => {
1168
- const filter = await resolveListProjectIds(c, listScope(c, workflowListScope(accessContext(c))), c.req.query("projectId"));
1169
- if (filter === "empty") return c.json(WorkflowSummaryListResponseSchema.parse([]));
1170
- const rows = await listActiveWorkflows(filter);
1171
- const lastRunAtById = await selectWorkflowLastRunAtByIds(rows.map((row) => row.id));
1172
- return c.json(WorkflowSummaryListResponseSchema.parse(rows.map((row) => toWorkflowSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null }))));
1173
- };
1174
- //#endregion
1175
- //#region src/routes/account/workflows/[workflowId]/GET.ts
1176
- const handler$45 = async (c) => {
1177
- const workflowId = c.req.param("workflowId") ?? "";
1178
- const row = workflowId ? await selectActiveWorkflowById(workflowId) : void 0;
1179
- if (!row || !await canAccessProjectId(c, row.projectId, canAccessWorkflow)) return c.json(WorkflowSummaryDetailResponseSchema.parse(null));
1180
- touchResourceActivityBestEffort({
1181
- userId: c.get("user").id,
1182
- projectId: row.projectId,
1183
- resourceKind: "workflow",
1184
- resourceId: row.id
1185
- });
1186
- const lastRunAtById = await selectWorkflowLastRunAtByIds([row.id]);
1187
- return c.json(WorkflowSummaryDetailResponseSchema.parse(toWorkflowSummary(row, { lastRunAt: lastRunAtById.get(row.id) ?? null })));
1188
- };
1189
- //#endregion
1190
- //#region src/routes/account/workflows/runs/[runId]/cancel/POST.ts
1191
- const handler$44 = (c) => cancelHistoryRun(c, "workflow", cancelWorkflowRun);
1192
- //#endregion
1193
- //#region src/routes/account/resources/skills.ts
1194
- function toSkillSummary(row) {
1195
- return SkillSummarySchema.parse({
1196
- id: row.id,
1197
- slug: row.slug,
1198
- name: row.name?.trim() || titleCaseKey(row.slug),
1199
- description: row.description ?? void 0,
1200
- projectId: row.projectId,
1201
- updatedAt: row.updatedAt.toISOString(),
1202
- sourcePath: row.moduleFile
1203
- });
1204
- }
1205
- //#endregion
1206
- //#region src/routes/account/skills/GET.ts
1207
- const handler$43 = async (c) => {
1208
- const filter = await resolveListProjectIds(c, listScope(c, skillListScope(accessContext(c))), c.req.query("projectId"));
1209
- if (filter === "empty") return c.json(SkillSummaryListResponseSchema.parse([]));
1210
- const rows = await listActiveSkills(filter);
1211
- return c.json(SkillSummaryListResponseSchema.parse(rows.map(toSkillSummary)));
1212
- };
1213
- //#endregion
1214
- //#region src/routes/account/skills/[skillId]/GET.ts
1215
- const handler$42 = async (c) => {
1216
- const skillId = c.req.param("skillId") ?? "";
1217
- const row = skillId ? await selectActiveSkillById(skillId) : void 0;
1218
- if (!row || !await canAccessProjectId(c, row.projectId, canAccessSkill)) return c.json(SkillSummaryDetailResponseSchema.parse(null));
1219
- touchResourceActivityBestEffort({
1220
- userId: c.get("user").id,
1221
- projectId: row.projectId,
1222
- resourceKind: "skill",
1223
- resourceId: row.id
1224
- });
1225
- return c.json(SkillSummaryDetailResponseSchema.parse(toSkillSummary(row)));
1226
- };
1227
- //#endregion
1228
- //#region src/routes/account/resources/recents.ts
1229
- function toRecentResource(activity, resource, projectName) {
1230
- return RecentResourceSchema.parse({
1231
- id: activity.id,
1232
- resourceKind: activity.resourceKind,
1233
- resourceId: activity.resourceId,
1234
- name: resource.name,
1235
- projectId: resource.projectId,
1236
- projectName,
1237
- sourcePath: resource.sourcePath,
1238
- source: "owned",
1239
- lastOpenedAt: activity.lastOpenedAt.toISOString(),
1240
- lastModifiedAt: resource.lastModifiedAt.toISOString()
1241
- });
1242
- }
1243
- function hydrateRecentResource(activity, lookup, projectNameById) {
1244
- const resource = lookup[activity.resourceKind]?.get(activity.resourceId);
1245
- if (!resource) return null;
1246
- return toRecentResource(activity, resource, projectNameById.get(resource.projectId) ?? resource.projectId);
1247
- }
1248
- function hydratedResourceFromAgentRow(row) {
1249
- return {
1250
- name: row.name?.trim() || titleCaseKey(row.slug),
1251
- projectId: row.projectId,
1252
- sourcePath: row.moduleFile,
1253
- lastModifiedAt: row.updatedAt
1254
- };
1255
- }
1256
- function latestRecentInteractionAt(recent) {
1257
- return Math.max(new Date(recent.lastOpenedAt).getTime(), new Date(recent.lastModifiedAt).getTime());
1258
- }
1259
- //#endregion
1260
- //#region src/routes/account/recents/GET.ts
1261
- const RECENTS_LIMIT = 50;
1262
- const handler$41 = async (c) => {
1263
- const userId = c.get("user").id;
1264
- const organization = c.get("organization");
1265
- const grantedProjectIdsList = await grantedProjectIds(c, { kind: "member-only" });
1266
- const activities = await listRecentResourceActivity(userId, RECENTS_LIMIT);
1267
- const visibleActivities = grantedProjectIdsList === void 0 ? activities : activities.filter((activity) => grantedProjectIdsList.includes(activity.projectId));
1268
- const agentIds = visibleActivities.filter((activity) => activity.resourceKind === "agent").map((activity) => activity.resourceId);
1269
- const workflowIds = visibleActivities.filter((activity) => activity.resourceKind === "workflow").map((activity) => activity.resourceId);
1270
- const skillIds = visibleActivities.filter((activity) => activity.resourceKind === "skill").map((activity) => activity.resourceId);
1271
- const [agents, workflows, skills, projects] = await Promise.all([
1272
- selectActiveAgentsByIds(agentIds),
1273
- selectActiveWorkflowsByIds(workflowIds),
1274
- selectActiveSkillsByIds(skillIds),
1275
- selectProjectsByOrganizationId(organization.organizationId, { grantedProjectIds: grantedProjectIdsList })
1276
- ]);
1277
- const projectNameById = new Map(projects.map((project) => [project.id, project.name]));
1278
- const lookup = {
1279
- agent: new Map(agents.map((row) => [row.id, hydratedResourceFromAgentRow(row)])),
1280
- workflow: new Map(workflows.map((row) => [row.id, hydratedResourceFromAgentRow(row)])),
1281
- skill: new Map(skills.map((row) => [row.id, hydratedResourceFromAgentRow(row)]))
1282
- };
1283
- const recents = visibleActivities.map((activity) => hydrateRecentResource(activity, lookup, projectNameById)).filter((recent) => recent !== null).sort((left, right) => latestRecentInteractionAt(right) - latestRecentInteractionAt(left));
1284
- return c.json(RecentResourceListResponseSchema.parse(recents));
1285
- };
1286
- //#endregion
1287
- //#region src/routes/account/projects/GET.ts
1288
- const handler$40 = async (c) => {
1289
- const organization = c.get("organization");
1290
- const grantedProjectIdsList = await grantedProjectIds(c, listScope(c, projectListScope(accessContext(c))));
1291
- const projects = await selectProjectsByOrganizationId(organization.organizationId, { grantedProjectIds: grantedProjectIdsList });
1292
- return c.json(ListProjectsResponseSchema.parse(projects.map(mapProject)));
1293
- };
1294
- //#endregion
1295
- //#region src/routes/account/projects/metrics/merge-project-list-metrics.ts
1296
- function mergeProjectListMetrics(input) {
1297
- const projectIds = new Set([...Object.keys(input.resourceCounts), ...Object.keys(input.lastDeploymentAtByProject)]);
1298
- const metrics = {};
1299
- for (const projectId of projectIds) {
1300
- const counts = input.resourceCounts[projectId];
1301
- const lastDeploymentAt = input.lastDeploymentAtByProject[projectId];
1302
- metrics[projectId] = {
1303
- agentCount: counts?.agentCount ?? 0,
1304
- workflowCount: counts?.workflowCount ?? 0,
1305
- skillCount: counts?.skillCount ?? 0,
1306
- credentialCount: counts?.credentialCount ?? 0,
1307
- lastDeploymentAt: lastDeploymentAt ? lastDeploymentAt.toISOString() : null
1308
- };
1309
- }
1310
- return metrics;
1311
- }
1312
- //#endregion
1313
- //#region src/routes/account/projects/metrics/GET.ts
1314
- const handler$39 = async (c) => {
1315
- const organization = c.get("organization");
1316
- const grantedProjectIdsList = await grantedProjectIds(c, listScope(c, projectListScope(accessContext(c))));
1317
- const [resourceCounts, lastDeploymentAtByProject] = await Promise.all([selectProjectResourceCounts(grantedProjectIdsList !== void 0 ? { projectIds: grantedProjectIdsList } : void 0), selectLastDeploymentAtByProject(organization.organizationId)]);
1318
- let metrics = mergeProjectListMetrics({
1319
- resourceCounts,
1320
- lastDeploymentAtByProject
1321
- });
1322
- if (grantedProjectIdsList !== void 0) {
1323
- const allowed = new Set(grantedProjectIdsList);
1324
- metrics = Object.fromEntries(Object.entries(metrics).filter(([projectId]) => allowed.has(projectId)));
1325
- }
1326
- return c.json(ListProjectMetricsResponseSchema.parse(metrics));
1327
- };
1328
- //#endregion
1329
- //#region src/routes/account/projects/POST.ts
1330
- const handler$38 = async (c) => {
1331
- const organization = c.get("organization");
1332
- const user = c.get("user");
1333
- const body = await c.req.json().catch(() => null);
1334
- const parsed = CreateProjectRequestSchema.safeParse(body);
1335
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Project name is required" }), 400);
1336
- const project = await createProjectForOrganization(organization.organizationId, parsed.data.name, parsed.data.description, user.id);
1337
- return c.json(CreateProjectResponseSchema.parse(mapProject(project)), 201);
1338
- };
1339
- //#endregion
1340
- //#region src/routes/account/projects/slug-available/GET.ts
1341
- const handler$37 = async (c) => {
1342
- const organization = c.get("organization");
1343
- const parsed = ProjectSlugAvailabilityQuerySchema.safeParse({
1344
- slug: c.req.query("slug"),
1345
- excludeProjectId: c.req.query("excludeProjectId")
1346
- });
1347
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid slug query" }), 400);
1348
- const availability = await checkProjectSlugAvailability(organization.organizationId, parsed.data.slug, parsed.data.excludeProjectId);
1349
- return c.json(ProjectSlugAvailabilityResponseSchema.parse(availability));
1350
- };
1351
- //#endregion
1352
- //#region src/routes/account/projects/[projectId]/GET.ts
1353
- const handler$36 = async (c) => {
1354
- return c.json(ProjectResponseSchema.parse(routeProject(c.get("project"))));
1355
- };
1356
- //#endregion
1357
- //#region src/routes/account/projects/[projectId]/PATCH.ts
1358
- const handler$35 = async (c) => {
1359
- const organization = c.get("organization");
1360
- const project = c.get("project");
1361
- const body = await c.req.json().catch(() => null);
1362
- const parsed = UpdateProjectRequestSchema.safeParse(body);
1363
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid project update request" }), 400);
1364
- let updated;
1365
- try {
1366
- updated = await updateProjectForOrganization(organization.organizationId, project.id, parsed.data);
1367
- } catch (error) {
1368
- if (error instanceof ProjectSlugTakenError) return c.json(ErrorResponseSchema.parse({ error: PROJECT_SLUG_TAKEN_MESSAGE }), 409);
1369
- throw error;
1370
- }
1371
- if (!updated) return c.json(ErrorResponseSchema.parse({ error: "Project not found" }), 404);
1372
- return c.json(ProjectResponseSchema.parse(mapProject(updated)));
1373
- };
1374
- //#endregion
1375
- //#region src/routes/account/projects/[projectId]/DELETE.ts
1376
- const handler$34 = async (c) => {
1377
- const organization = c.get("organization");
1378
- const project = c.get("project");
1379
- if (!await deleteProjectForOrganization(organization.organizationId, project.id)) return c.json(ErrorResponseSchema.parse({ error: "Project not found" }), 404);
1380
- return c.body(null, 204);
1381
- };
1382
- //#endregion
1383
- //#region src/routes/account/projects/[projectId]/deployments/GET.ts
1384
- const handler$33 = async (c) => {
1385
- const rows = await selectProjectDeployments(c.get("project").id);
1386
- return c.json(ListProjectDeploymentsResponseSchema.parse(rows.map(mapProjectDeployment)));
1387
- };
1388
- //#endregion
1389
- //#region src/routes/account/projects/[projectId]/artifacts/POST.ts
1390
- const DEFAULT_PRESIGN_TTL_SECONDS$1 = 900;
1391
- const ARTIFACT_CONTENT_TYPE = "application/gzip";
1392
- const handler$32 = async (c) => {
1393
- const project = c.get("project");
1394
- const { organizationId } = c.get("organization");
1395
- const organization = await selectOrganizationById(organizationId);
1396
- if (!organization) return c.json({ error: "Organization not found" }, 404);
1397
- const artifactId = crypto.randomUUID();
1398
- const storageKey = projectArtifactKey(project.id, artifactId);
1399
- const storage = createOrgStorageClient(organization);
1400
- const artifact = await insertProjectArtifact({
1401
- id: artifactId,
1402
- projectId: project.id,
1403
- storageKey,
1404
- createdByUserId: c.get("user").id
1405
- });
1406
- const uploadUrl = await storage.presignPut({
1407
- key: storageKey,
1408
- contentType: ARTIFACT_CONTENT_TYPE,
1409
- expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS$1
1410
- });
1411
- return c.json(CreateProjectArtifactResponseSchema.parse({
1412
- artifact: mapProjectArtifact(artifact),
1413
- uploadUrl,
1414
- expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS$1
1415
- }), 201);
1416
- };
1417
- //#endregion
1418
- //#region src/routes/account/projects/[projectId]/artifacts/active/download/GET.ts
1419
- const DEFAULT_PRESIGN_TTL_SECONDS = 900;
1420
- const handler$31 = async (c) => {
1421
- const project = c.get("project");
1422
- const { organizationId } = c.get("organization");
1423
- const organization = await selectOrganizationById(organizationId);
1424
- if (!organization) return c.json({ error: "Organization not found" }, 404);
1425
- const artifact = await selectActiveProjectArtifactForProject(project.id);
1426
- if (!artifact) return c.json({ error: "No active artifact for project" }, 404);
1427
- const downloadUrl = await createOrgStorageClient(organization).presignGet({
1428
- key: artifact.storageKey,
1429
- expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS
1430
- });
1431
- return c.json(DownloadActiveProjectArtifactResponseSchema.parse({
1432
- artifactId: artifact.id,
1433
- downloadUrl,
1434
- expiresInSeconds: DEFAULT_PRESIGN_TTL_SECONDS
1435
- }));
1436
- };
1437
- //#endregion
1438
- //#region src/routes/account/projects/[projectId]/artifacts/[artifactId]/complete/POST.ts
1439
- const handler$30 = async (c) => {
1440
- const project = c.get("project");
1441
- const artifactId = c.req.param("artifactId");
1442
- if (!artifactId) return c.json(ErrorResponseSchema.parse({ error: "Artifact id is required" }), 400);
1443
- const existing = await selectProjectArtifactForProject(artifactId, project.id);
1444
- if (!existing) return c.json(ErrorResponseSchema.parse({ error: "Artifact not found" }), 404);
1445
- if (existing.status === "ready") return c.json(ErrorResponseSchema.parse({ error: "Artifact already completed" }), 409);
1446
- const { organizationId } = c.get("organization");
1447
- const organization = await selectOrganizationById(organizationId);
1448
- if (!organization) return c.json(ErrorResponseSchema.parse({ error: "Organization not found" }), 404);
1449
- const storage = createOrgStorageClient(organization);
1450
- const head = await storage.headObject(existing.storageKey);
1451
- if (!head || head.contentLength <= 0) return c.json(ErrorResponseSchema.parse({ error: "Artifact upload not found in storage" }), 400);
1452
- try {
1453
- const artifactBytes = await storage.getObject(existing.storageKey);
1454
- if (!artifactBytes || artifactBytes.byteLength <= 0) return c.json(ErrorResponseSchema.parse({ error: "Artifact upload not found in storage" }), 400);
1455
- const manifestJson = parseStoredRouteManifest(extractRouteManifestFromArtifact(Buffer.from(artifactBytes)));
1456
- const result = await completeProjectArtifact({
1457
- artifactId,
1458
- projectId: project.id,
1459
- manifestJson
1460
- });
1461
- await enqueueProjectRuntime({
1462
- projectId: project.id,
1463
- name: project.name,
1464
- artifactId
1465
- });
1466
- return c.json(CompleteProjectArtifactResponseSchema.parse({
1467
- artifact: mapProjectArtifact(result.artifact),
1468
- project: mapProject(result.project)
1469
- }));
1470
- } catch (error) {
1471
- const message = error instanceof Error ? error.message : "Failed to complete artifact";
1472
- return c.json(ErrorResponseSchema.parse({ error: message }), 400);
1473
- }
1474
- };
1475
- //#endregion
1476
- //#region src/routes/account/projects/[projectId]/artifacts/[artifactId]/source/presign/POST.ts
1477
- const SOURCE_BLOB_CONTENT_TYPE = "text/plain; charset=utf-8";
1478
- const handler$29 = async (c) => {
1479
- const project = c.get("project");
1480
- const artifactId = c.req.param("artifactId");
1481
- if (!artifactId) return c.json(ErrorResponseSchema.parse({ error: "Artifact id is required" }), 400);
1482
- if (!await selectProjectArtifactForProject(artifactId, project.id)) return c.json(ErrorResponseSchema.parse({ error: "Artifact not found" }), 404);
1483
- const parsed = PresignProjectSourceRequestSchema.safeParse(await c.req.json().catch(() => null));
1484
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid blob list" }), 400);
1485
- const { organizationId } = c.get("organization");
1486
- const organization = await selectOrganizationById(organizationId);
1487
- if (!organization) return c.json(ErrorResponseSchema.parse({ error: "Organization not found" }), 404);
1488
- const storage = createOrgStorageClient(organization);
1489
- const hashes = [...new Set(parsed.data.blobs.map((blob) => blob.hash))];
1490
- const uploads = await Promise.all(hashes.map(async (hash) => {
1491
- const key = projectSourceBlobKey(project.id, hash);
1492
- const head = await storage.headObject(key);
1493
- if (head && head.contentLength > 0) return null;
1494
- return {
1495
- hash,
1496
- url: await storage.presignPut({
1497
- key,
1498
- contentType: SOURCE_BLOB_CONTENT_TYPE
1499
- })
1500
- };
1501
- }));
1502
- return c.json(PresignProjectSourceResponseSchema.parse({ uploads: uploads.filter((upload) => upload !== null) }));
1503
- };
1504
- //#endregion
1505
- //#region src/routes/account/projects/[projectId]/artifacts/[artifactId]/source/manifest/POST.ts
1506
- const handler$28 = async (c) => {
1507
- const project = c.get("project");
1508
- const artifactId = c.req.param("artifactId");
1509
- if (!artifactId) return c.json(ErrorResponseSchema.parse({ error: "Artifact id is required" }), 400);
1510
- if (!await selectProjectArtifactForProject(artifactId, project.id)) return c.json(ErrorResponseSchema.parse({ error: "Artifact not found" }), 404);
1511
- const parsed = UploadProjectSourceManifestRequestSchema.safeParse(await c.req.json().catch(() => null));
1512
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid source manifest" }), 400);
1513
- const manifest = StoredProjectSourceManifestSchema.parse({
1514
- files: parsed.data.files.map((file) => ({
1515
- id: projectFileId(file.path),
1516
- path: file.path,
1517
- hash: file.hash
1518
- })),
1519
- generatedAt: (/* @__PURE__ */ new Date()).toISOString()
1520
- });
1521
- await updateProjectArtifactSourceManifest({
1522
- artifactId,
1523
- projectId: project.id,
1524
- sourceManifestJson: manifest
1525
- });
1526
- return c.json(UploadProjectSourceResponseSchema.parse({
1527
- ok: true,
1528
- fileCount: manifest.files.length
1529
- }), 201);
1530
- };
1531
- //#endregion
1532
- //#region src/routes/account/projects/[projectId]/files/GET.ts
1533
- /**
1534
- * Resolve registry moduleFile values to paths in the deploy source snapshot.
1535
- *
1536
- * New deploys store project-root-relative source paths (`src/agents/support.ts`),
1537
- * matched exactly. Rows synced by older runtimes hold module-dir-relative values
1538
- * (`support.ts` under `src/agents/`), matched by suffix. Resources without a
1539
- * match are dropped rather than emitting paths clients can't find in the tree.
1540
- */
1541
- function resolveSourcePaths(rows, kindDir, filePaths) {
1542
- return rows.flatMap((row) => {
1543
- const suffix = `${kindDir}/${row.moduleFile}`;
1544
- const path = filePaths.find((filePath) => filePath === row.moduleFile) ?? filePaths.find((filePath) => filePath === suffix || filePath.endsWith(`/${suffix}`));
1545
- return path ? [{
1546
- slug: row.slug,
1547
- path
1548
- }] : [];
1549
- });
1550
- }
1551
- const handler$27 = async (c) => {
1552
- const project = c.get("project");
1553
- const active = await selectActiveArtifactSourceManifestForProject(project.id);
1554
- if (!active || !active.sourceManifestJson) return c.json(ListProjectFilesResponseSchema.parse({
1555
- artifactId: active?.artifactId ?? null,
1556
- files: []
1557
- }));
1558
- const manifest = StoredProjectSourceManifestSchema.parse(active.sourceManifestJson);
1559
- const [agents, workflows, skills] = await Promise.all([
1560
- listActiveAgents({ projectIds: [project.id] }),
1561
- listActiveWorkflows({ projectIds: [project.id] }),
1562
- listActiveSkills({ projectIds: [project.id] })
1563
- ]);
1564
- const filePaths = manifest.files.map((file) => file.path);
1565
- const resources = ProjectSourceResourcesSchema.parse({
1566
- agents: resolveSourcePaths(agents, "agents", filePaths),
1567
- workflows: resolveSourcePaths(workflows, "workflows", filePaths),
1568
- skills: skills.map((row) => ({
1569
- slug: row.slug,
1570
- path: row.moduleFile
1571
- }))
1572
- });
1573
- return c.json(ListProjectFilesResponseSchema.parse({
1574
- artifactId: active.artifactId,
1575
- files: manifest.files.map((file) => ({
1576
- id: file.id,
1577
- path: file.path,
1578
- hash: file.hash
1579
- })),
1580
- resources
1581
- }));
1582
- };
1583
- //#endregion
1584
- //#region src/routes/account/projects/[projectId]/artifacts/[artifactId]/files/content/GET.ts
1585
- const handler$26 = async (c) => {
1586
- const project = c.get("project");
1587
- const artifactId = c.req.param("artifactId");
1588
- if (!artifactId) return c.json(ErrorResponseSchema.parse({ error: "Artifact id is required" }), 400);
1589
- const path = c.req.query("path");
1590
- if (!path) return c.json(ErrorResponseSchema.parse({ error: "File path is required" }), 400);
1591
- const artifact = await selectProjectArtifactForProject(artifactId, project.id);
1592
- if (!artifact || !artifact.sourceManifestJson) return c.json(ErrorResponseSchema.parse({ error: "Artifact not found" }), 404);
1593
- const file = StoredProjectSourceManifestSchema.parse(artifact.sourceManifestJson).files.find((entry) => entry.path === path);
1594
- if (!file) return c.json(ErrorResponseSchema.parse({ error: "File not found" }), 404);
1595
- const { organizationId } = c.get("organization");
1596
- const organization = await selectOrganizationById(organizationId);
1597
- if (!organization) return c.json(ErrorResponseSchema.parse({ error: "Organization not found" }), 404);
1598
- const storage = createOrgStorageClient(organization);
1599
- let bytes;
1600
- try {
1601
- bytes = await storage.getObject(projectSourceBlobKey(project.id, file.hash));
1602
- } catch {
1603
- return c.json(ErrorResponseSchema.parse({ error: "File contents not found" }), 404);
1604
- }
1605
- c.header("Content-Type", "text/plain; charset=utf-8");
1606
- return c.body(new TextDecoder().decode(bytes));
1607
- };
1608
- //#endregion
1609
- //#region src/routes/account/projects/[projectId]/reachability/GET.ts
1610
- function createProjectReachabilityHandler(hosting) {
1611
- return async (c) => {
1612
- const project = c.get("project");
1613
- if (project.status !== "active") return c.json(ProjectReachabilityResponseSchema.parse({ reachable: false }));
1614
- const organization = await selectOrganizationById(project.organizationId);
1615
- const reachable = await pingProjectTarget({
1616
- baseUrl: organization?.baseUrl ?? project.baseUrl,
1617
- runtimeId: organization?.runtimeId ?? project.runtimeId
1618
- }, { plugin: hosting });
1619
- return c.json(ProjectReachabilityResponseSchema.parse({ reachable }));
1620
- };
1621
- }
1622
- //#endregion
1623
- //#region src/routes/account/projects/[projectId]/members/GET.ts
1624
- const handler$25 = async (c) => {
1625
- const project = c.get("project");
1626
- const currentUserId = c.get("user").id;
1627
- const members = await selectProjectMembers(project.id);
1628
- return c.json(ListProjectMembersResponseSchema.parse(members.map((member) => mapProjectMember(member, { isCurrentUser: member.id === currentUserId }))));
1629
- };
1630
- //#endregion
1631
- //#region src/routes/account/projects/[projectId]/members/POST.ts
1632
- const handler$24 = async (c) => {
1633
- const organization = c.get("organization");
1634
- const project = c.get("project");
1635
- const body = await c.req.json().catch(() => null);
1636
- const parsed = InviteProjectMembersRequestSchema.safeParse(body);
1637
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid invite request" }), 400);
1638
- const results = await inviteProjectMembers({
1639
- projectId: project.id,
1640
- organizationId: organization.organizationId,
1641
- emails: parsed.data.emails,
1642
- role: parsed.data.role
1643
- });
1644
- return c.json(InviteProjectMembersResponseSchema.parse(results));
1645
- };
1646
- //#endregion
1647
- //#region src/routes/account/projects/[projectId]/members/[userId]/PATCH.ts
1648
- const handler$23 = async (c) => {
1649
- const project = c.get("project");
1650
- const userId = c.req.param("userId");
1651
- const body = await c.req.json().catch(() => null);
1652
- const parsed = UpdateProjectMemberRequestSchema.safeParse(body);
1653
- if (!userId) return c.json(ErrorResponseSchema.parse({ error: "User id is required" }), 400);
1654
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid member update request" }), 400);
1655
- try {
1656
- const member = await updateProjectMemberRole(project.id, userId, parsed.data.role);
1657
- return c.json(UpdateProjectMemberResponseSchema.parse(mapProjectMember(member)));
1658
- } catch (error) {
1659
- if (error instanceof ProjectMemberNotFoundError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);
1660
- throw error;
1661
- }
1662
- };
1663
- //#endregion
1664
- //#region src/routes/account/projects/[projectId]/members/[userId]/DELETE.ts
1665
- const handler$22 = async (c) => {
1666
- const project = c.get("project");
1667
- const userId = c.req.param("userId");
1668
- if (!userId) return c.json(ErrorResponseSchema.parse({ error: "User id is required" }), 400);
1669
- try {
1670
- await removeProjectMember(project.id, userId);
1671
- return c.body(null, 204);
1672
- } catch (error) {
1673
- if (error instanceof ProjectMemberNotFoundError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);
1674
- throw error;
1675
- }
1676
- };
1677
- //#endregion
1678
- //#region src/routes/account/projects/[projectId]/members/me/DELETE.ts
1679
- const handler$21 = async (c) => {
1680
- const project = c.get("project");
1681
- const userId = c.get("user").id;
1682
- try {
1683
- await removeProjectMember(project.id, userId);
1684
- return c.body(null, 204);
1685
- } catch (error) {
1686
- if (error instanceof ProjectMemberNotFoundError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);
1687
- throw error;
1688
- }
1689
- };
1690
- //#endregion
1691
- //#region src/routes/account/projects/[projectId]/settings/GET.ts
1692
- const handler$20 = async (c) => {
1693
- const project = c.get("project");
1694
- return c.json(ProjectSettingsResponseSchema.parse(mapProjectSettings(project)));
1695
- };
1696
- //#endregion
1697
- //#region src/routes/account/projects/[projectId]/settings/PATCH.ts
1698
- const handler$19 = async (c) => {
1699
- const organization = c.get("organization");
1700
- const project = c.get("project");
1701
- const body = await c.req.json().catch(() => null);
1702
- const parsed = UpdateProjectSettingsRequestSchema.safeParse(body);
1703
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid project settings request" }), 400);
1704
- const updated = await updateProjectSettings(organization.organizationId, project.id, {
1705
- description: parsed.data.description,
1706
- defaultMemberRole: parsed.data.defaultRole,
1707
- invitePermission: parsed.data.invitePermission
1708
- });
1709
- if (!updated) return c.json(ErrorResponseSchema.parse({ error: "Project not found" }), 404);
1710
- return c.json(ProjectSettingsResponseSchema.parse(mapProjectSettings(updated)));
1711
- };
1712
- //#endregion
1713
- //#region src/routes/account/credentials/enrich.ts
1714
- const APP_CREDENTIAL_SCOPES = [
1715
- "user",
1716
- "project",
1717
- "organization"
1718
- ];
1719
- function toAppCredentialScope(scopeType) {
1720
- return APP_CREDENTIAL_SCOPES.includes(scopeType) ? scopeType : null;
1721
- }
1722
- /** Run `fn` with the row's project scope bound (no-op for org/user rows). */
1723
- function withCredentialRowScope(row, fn) {
1724
- if (row.scopeType === "project") return runWithProjectScope(row.projectId, fn);
1725
- return fn();
1726
- }
1727
- /** User-scoped credentials are only manageable by their owner. */
1728
- function canManageCredential(row, userId) {
1729
- if (row.scopeType === "user") return userId !== void 0 && row.scopeId === userId;
1730
- return true;
1731
- }
1732
- /** Display name derived from the app slug (org-custom slugs use the segment after `/`). */
1733
- function displayAppName(appId) {
1734
- try {
1735
- const parsed = parseAppSlug(appId);
1736
- if (parsed.kind === "org") return displayCredentialAppName(parsed.name);
1737
- } catch {}
1738
- return displayCredentialAppName(appId);
1739
- }
1740
- /** Masked preview of a secret — last 4 chars revealed, the rest masked. Plaintext never returned. */
1741
- function maskSecretPreview(value) {
1742
- const trimmed = value.trim();
1743
- if (trimmed.length <= 4) return "•".repeat(Math.max(trimmed.length, 4));
1744
- return `${"•".repeat(Math.min(trimmed.length - 4, 20))}${trimmed.slice(-4)}`;
1745
- }
1746
- async function readSecretKeyPreviews(instanceId) {
1747
- const payload = await readCredentialInstanceSecret(instanceId);
1748
- if (!payload) return null;
1749
- let parsed;
1750
- try {
1751
- parsed = JSON.parse(payload);
1752
- } catch {
1753
- return null;
1754
- }
1755
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null;
1756
- const keyPreviews = {};
1757
- for (const [key, value] of Object.entries(parsed)) keyPreviews[key] = maskSecretPreview(typeof value === "string" ? value : JSON.stringify(value));
1758
- const credentialKeys = Object.keys(keyPreviews);
1759
- return credentialKeys.length > 0 ? {
1760
- credentialKeys,
1761
- keyPreviews
1762
- } : null;
1763
- }
1764
- function ownerFields(owner) {
1765
- if (!owner) return {};
1766
- return {
1767
- ownerUserId: owner.id,
1768
- ownerName: owner.name,
1769
- ...owner.image && URL.canParse(owner.image) ? { ownerAvatarUrl: owner.image } : {}
1770
- };
1771
- }
1772
- function uniqueIds(rows, pick) {
1773
- return [...new Set(rows.map(pick).filter((id) => Boolean(id)))];
1774
- }
1775
- /** Cross-database lookups: instances live in the org DB; projects/users/connections in the platform DB. */
1776
- async function loadCredentialLookups(rows, organizationId) {
1777
- const [projects, owners, connections] = await Promise.all([
1778
- selectProjectsByOrganizationId(organizationId),
1779
- selectUsersByIds(uniqueIds(rows, (row) => row.scopeType === "user" ? row.scopeId : null)),
1780
- selectOAuthConnectionsByIds(uniqueIds(rows, (row) => row.authKind === "oauth_managed" ? row.connectionId : null))
1781
- ]);
1782
- return {
1783
- projectNameById: new Map(projects.map((project) => [project.id, project.name])),
1784
- ownersById: new Map(owners.map((owner) => [owner.id, owner])),
1785
- connectionsById: new Map(connections.map((connection) => [connection.id, connection]))
1786
- };
1787
- }
1788
- async function toCredentialSummary(row, scope, lookups) {
1789
- const isOAuth = row.authKind === "oauth_managed";
1790
- const isKeystroke = row.authKind === "keystroke";
1791
- const appName = displayAppName(row.slug);
1792
- const connection = row.connectionId ? lookups.connectionsById.get(row.connectionId) : void 0;
1793
- const secretKeys = isOAuth || isKeystroke ? null : await readSecretKeyPreviews(row.id);
1794
- const projectId = scope === "project" ? row.scopeId ?? row.projectId : void 0;
1795
- const projectName = projectId ? lookups.projectNameById.get(projectId) : void 0;
1796
- return {
1797
- id: row.id,
1798
- appId: row.slug,
1799
- label: row.label ?? appName,
1800
- scope,
1801
- lastRefreshedAt: isOAuth ? connection?.updatedAt.toISOString() ?? null : null,
1802
- appName,
1803
- ...projectId ? { projectId } : {},
1804
- ...projectName ? { projectName } : {},
1805
- status: isOAuth && !connection ? "Disconnected" : "Active",
1806
- createdAt: row.createdAt.toISOString(),
1807
- lastUsedAt: null,
1808
- isDefault: Boolean(row.isDefault),
1809
- connectionKind: isOAuth ? "oauth" : isKeystroke ? "oauth" : "manual",
1810
- ...scope === "user" && row.scopeId ? ownerFields(lookups.ownersById.get(row.scopeId)) : {},
1811
- ...connection?.grantedScopes?.length ? { grantedScopes: connection.grantedScopes } : {},
1812
- ...secretKeys ?? {},
1813
- ...connection?.accessTokenExpiresAt ? { expiresAt: connection.accessTokenExpiresAt.toISOString() } : {}
1814
- };
1815
- }
1816
- /** Build `AppCredentialSummary` rows from org-database instances plus platform lookups. */
1817
- async function enrichCredentialInstances(rows, organizationId) {
1818
- const visible = rows.filter((row) => toAppCredentialScope(row.scopeType) !== null);
1819
- const lookups = await loadCredentialLookups(visible, organizationId);
1820
- return (await Promise.all(visible.map((row) => toCredentialSummary(row, toAppCredentialScope(row.scopeType), lookups)))).sort((a, b) => new Date(b.createdAt ?? 0).getTime() - new Date(a.createdAt ?? 0).getTime());
1821
- }
1822
- //#endregion
1823
- //#region src/routes/account/credentials/GET.ts
1824
- const handler$18 = async (c) => {
1825
- const organization = c.get("organization");
1826
- const credentials = await enrichCredentialInstances(await listAllCredentialInstances(), organization.organizationId);
1827
- return c.json(ListCredentialsResponseSchema.parse(credentials));
1828
- };
1829
- //#endregion
1830
- //#region src/routes/account/credentials/POST.ts
1831
- function withTargetScope(target, fn) {
1832
- if (target.projectScope) return runWithProjectScope(target.projectScope, fn);
1833
- return fn();
1834
- }
1835
- const handler$17 = async (c) => {
1836
- const organization = c.get("organization");
1837
- const user = c.get("user");
1838
- const parsed = CreateCredentialsRequestSchema.safeParse(await c.req.json().catch(() => null));
1839
- if (!parsed.success) {
1840
- const message = parsed.error.issues[0]?.message ?? "Invalid request body";
1841
- return c.json({ error: message }, 400);
1842
- }
1843
- const input = parsed.data;
1844
- if (input.connectionKind === "manual" && input.value) {
1845
- const app = await selectAppForOrganization(organization.organizationId, input.appId);
1846
- if (app && hasCredentialFieldTemplate(app)) {
1847
- const validation = validateCredentialValueAgainstFields(app.credentialFields, input.value);
1848
- if (!validation.ok) return c.json({ error: validation.message }, 400);
1849
- }
1850
- }
1851
- const resolvedProjects = [];
1852
- for (const slug of input.projects) {
1853
- const project = await selectProjectForOrganizationBySlug(organization.organizationId, slug);
1854
- if (!project) return c.json({ error: `Project "${slug}" not found` }, 400);
1855
- resolvedProjects.push({
1856
- id: project.id,
1857
- name: project.name
1858
- });
1859
- }
1860
- const targets = [
1861
- ...resolvedProjects.map((project) => ({
1862
- scopeType: "project",
1863
- scopeId: project.id,
1864
- projectScope: project.id,
1865
- projectName: project.name
1866
- })),
1867
- ...input.createOrganizationCredential ? [{
1868
- scopeType: "organization",
1869
- scopeId: getServerTenantScopeId()
1870
- }] : [],
1871
- ...input.createUserProvidedCredential ? [{
1872
- scopeType: "user",
1873
- scopeId: user.id
1874
- }] : []
1875
- ];
1876
- const appName = displayCredentialAppName(input.appId);
1877
- const siblingCounts = /* @__PURE__ */ new Map();
1878
- for (const target of targets) {
1879
- const siblings = await withTargetScope(target, () => selectCredentialInstancesForScope(input.appId, target.scopeType, target.scopeId));
1880
- siblingCounts.set(target, siblings.length);
1881
- }
1882
- const value = input.value;
1883
- const createdIds = [];
1884
- for (const target of targets) {
1885
- const siblings = await withTargetScope(target, () => selectCredentialInstancesForScope(input.appId, target.scopeType, target.scopeId));
1886
- const label = resolveUniqueCredentialInstanceLabel({
1887
- baseLabel: input.label?.trim() || buildCredentialInstanceLabel({
1888
- scopeType: target.scopeType,
1889
- appName,
1890
- projectName: target.projectName
1891
- }),
1892
- takenLabels: siblings.map((row) => row.label)
1893
- });
1894
- const id = crypto.randomUUID();
1895
- await withTargetScope(target, () => setCredentialInstanceSecret({
1896
- id,
1897
- key: input.appId,
1898
- scopeType: target.scopeType,
1899
- scopeId: target.scopeId,
1900
- label,
1901
- isDefault: (siblingCounts.get(target) ?? 0) === 0,
1902
- value
1903
- }));
1904
- createdIds.push(id);
1905
- }
1906
- const rows = [];
1907
- for (const id of createdIds) {
1908
- const row = await selectCredentialInstanceById(id);
1909
- if (row) rows.push(row);
1910
- }
1911
- const credentials = await enrichCredentialInstances(rows, organization.organizationId);
1912
- return c.json(CreateCredentialsResponseSchema.parse(credentials), 201);
1913
- };
1914
- //#endregion
1915
- //#region src/routes/account/credentials/[credentialId]/GET.ts
1916
- const handler$16 = async (c) => {
1917
- const organization = c.get("organization");
1918
- const credentialId = c.req.param("credentialId") ?? "";
1919
- const row = credentialId ? await selectCredentialInstanceById(credentialId) : void 0;
1920
- if (!row || toAppCredentialScope(row.scopeType) === null) return c.json({ error: "Credential not found" }, 404);
1921
- const [credential] = await enrichCredentialInstances([row], organization.organizationId);
1922
- return c.json(GetCredentialResponseSchema.parse(credential));
1923
- };
1924
- //#endregion
1925
- //#region src/routes/account/credentials/[credentialId]/PATCH.ts
1926
- const handler$15 = async (c) => {
1927
- const organization = c.get("organization");
1928
- const user = c.get("user");
1929
- const credentialId = c.req.param("credentialId") ?? "";
1930
- const existing = credentialId ? await selectCredentialInstanceById(credentialId) : void 0;
1931
- if (!existing || toAppCredentialScope(existing.scopeType) === null) return c.json({ error: "Credential not found" }, 404);
1932
- if (!canManageCredential(existing, user.id)) return c.json({ error: "Forbidden" }, 403);
1933
- const parsed = UpdateCredentialRequestSchema.safeParse(await c.req.json().catch(() => null));
1934
- if (!parsed.success) {
1935
- const message = parsed.error.issues[0]?.message ?? "Invalid request body";
1936
- return c.json({ error: message }, 400);
1937
- }
1938
- if (parsed.data.value && existing.authKind !== "api_key") return c.json({ error: "Only api-key credentials support secret rotation" }, 400);
1939
- const label = parsed.data.label !== void 0 ? parsed.data.label : existing.label;
1940
- const isDefault = parsed.data.isDefault !== void 0 ? parsed.data.isDefault : Boolean(existing.isDefault);
1941
- if (label !== existing.label) {
1942
- if ((await withCredentialRowScope(existing, () => selectCredentialInstancesForScope(existing.slug, existing.scopeType, existing.scopeId))).some((row) => row.id !== credentialId && (row.label ?? null) === label)) return c.json({ error: "A credential with this label already exists" }, 409);
1943
- }
1944
- await withCredentialRowScope(existing, async () => {
1945
- if (parsed.data.value) {
1946
- await setCredentialInstanceSecret({
1947
- id: existing.id,
1948
- key: existing.slug,
1949
- scopeType: existing.scopeType,
1950
- scopeId: existing.scopeId,
1951
- label,
1952
- isDefault,
1953
- value: parsed.data.value
1954
- });
1955
- return;
1956
- }
1957
- if (isDefault) await clearCredentialInstanceDefaults({
1958
- slug: existing.slug,
1959
- scopeType: existing.scopeType,
1960
- scopeId: existing.scopeId,
1961
- exceptId: credentialId
1962
- });
1963
- await upsertCredentialInstance({
1964
- id: existing.id,
1965
- slug: existing.slug,
1966
- scopeType: existing.scopeType,
1967
- scopeId: existing.scopeId,
1968
- label,
1969
- isDefault,
1970
- authKind: existing.authKind,
1971
- ciphertext: existing.ciphertext,
1972
- connectionId: existing.connectionId,
1973
- createdAt: existing.createdAt,
1974
- updatedAt: /* @__PURE__ */ new Date()
1975
- });
1976
- });
1977
- const updated = await selectCredentialInstanceById(credentialId);
1978
- const [credential] = await enrichCredentialInstances(updated ? [updated] : [], organization.organizationId);
1979
- return c.json(GetCredentialResponseSchema.parse(credential));
1980
- };
1981
- //#endregion
1982
- //#region src/routes/account/credentials/[credentialId]/DELETE.ts
1983
- function createDeleteCredentialHandler(options = {}) {
1984
- return async (c) => {
1985
- const user = c.get("user");
1986
- const credentialId = c.req.param("credentialId") ?? "";
1987
- const existing = credentialId ? await selectCredentialInstanceById(credentialId) : void 0;
1988
- if (!existing || toAppCredentialScope(existing.scopeType) === null) return c.json({ error: "Credential not found" }, 404);
1989
- if (!canManageCredential(existing, user.id)) return c.json({ error: "Forbidden" }, 403);
1990
- if (existing.authKind === "oauth_managed") {
1991
- if (existing.connectionId) {
1992
- if ((await listCredentialInstancesByConnectionId(existing.connectionId)).every((row) => row.id === existing.id)) await deleteOAuthConnectionById(existing.connectionId);
1993
- }
1994
- } else if (existing.authKind === "keystroke") {
1995
- if (existing.connectionId) {
1996
- if ((await listCredentialInstancesByConnectionId(existing.connectionId)).every((row) => row.id === existing.id)) {
1997
- if (!options.mcp) return c.json({ error: "mcp_unconfigured" }, 501);
1998
- await options.mcp.revokeConnection(resolveMcpEntityId(existing), existing.connectionId);
1999
- }
2000
- }
2001
- } else await deleteCredentialInstanceSecret(existing.id);
2002
- await deleteCredentialInstanceById(credentialId);
2003
- return c.body(null, 204);
2004
- };
2005
- }
2006
- //#endregion
2007
- //#region src/routes/account/members/GET.ts
2008
- const handler$14 = async (c) => {
2009
- const { organizationId } = c.get("organization");
2010
- const members = await selectOrganizationMembers(organizationId);
2011
- return c.json(ListOrganizationMembersResponseSchema.parse(members.map(mapOrganizationMember)));
2012
- };
2013
- //#endregion
2014
- //#region src/email/organization-invite-email.ts
2015
- function envValue(name) {
2016
- return process.env[name]?.trim() || void 0;
2017
- }
2018
- function resolveOrganizationInviteUrl(invitationId) {
2019
- return `${(envValue("PUBLIC_WEB_URL") ?? "http://localhost:3000").replace(/\/$/, "")}${organizationInvitationAcceptPath(invitationId)}`;
2020
- }
2021
- function resolveResendApiKey() {
2022
- return envValue("RESEND_API_KEY");
2023
- }
2024
- function buildOrganizationInviteEmailHtml(payload) {
2025
- const inviteUrl = resolveOrganizationInviteUrl(payload.invitationId);
2026
- const escapedOrg = payload.organizationName.replaceAll("&", "&amp;").replaceAll("<", "&lt;");
2027
- return `<!DOCTYPE html>
2028
- <html>
2029
- <body style="font-family: system-ui, sans-serif; line-height: 1.5; color: #111;">
2030
- ${payload.inviterName ? `<p>${payload.inviterName.replaceAll("&", "&amp;").replaceAll("<", "&lt;")} invited you to join <strong>${escapedOrg}</strong> on Keystroke.</p>` : `<p>You have been invited to join <strong>${escapedOrg}</strong> on Keystroke.</p>`}
2031
- <p><a href="${inviteUrl}" style="display: inline-block; padding: 10px 16px; background: #111; color: #fff; text-decoration: none; border-radius: 8px;">View invitation</a></p>
2032
- <p style="color: #666; font-size: 13px;">Sign in with this email address to accept the invitation.</p>
2033
- </body>
2034
- </html>`;
2035
- }
2036
- async function sendOrganizationInviteEmail(payload, resend) {
2037
- const apiKey = resolveResendApiKey();
2038
- if (!apiKey) {
2039
- console.warn("[platform] RESEND_API_KEY not set; organization invite email skipped");
2040
- return false;
2041
- }
2042
- const { error } = await (resend ?? new Resend(apiKey)).emails.send({
2043
- from: resolveAuthEmailFrom(),
2044
- to: payload.email,
2045
- subject: `Invitation to join ${payload.organizationName} on Keystroke`,
2046
- html: buildOrganizationInviteEmailHtml(payload)
2047
- });
2048
- if (error) {
2049
- console.warn(`[platform] Failed to send organization invite email: ${error.message}`);
2050
- return false;
2051
- }
2052
- return true;
2053
- }
2054
- //#endregion
2055
- //#region src/routes/account/members/invitations/POST.ts
2056
- const handler$13 = async (c) => {
2057
- const user = c.get("user");
2058
- const organization = c.get("organization");
2059
- const body = await c.req.json().catch(() => null);
2060
- const parsed = InviteOrganizationMembersRequestSchema.safeParse(body);
2061
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid invite request" }), 400);
2062
- const results = await inviteOrganizationMembers({
2063
- organizationId: organization.organizationId,
2064
- invitedByUserId: user.id,
2065
- emails: parsed.data.emails,
2066
- role: parsed.data.role
2067
- });
2068
- const inviter = await selectUserById(user.id);
2069
- for (const result of results) {
2070
- if (!result.invitationId || result.status !== "sent" && result.status !== "pending") continue;
2071
- await sendOrganizationInviteEmail({
2072
- email: result.email,
2073
- organizationName: organization.organizationName,
2074
- invitationId: result.invitationId,
2075
- inviterName: inviter?.name
2076
- });
2077
- }
2078
- return c.json(InviteOrganizationMembersResponseSchema.parse(results));
2079
- };
2080
- //#endregion
2081
- //#region src/routes/account/members/[userId]/PATCH.ts
2082
- const handler$12 = async (c) => {
2083
- const { organizationId } = c.get("organization");
2084
- const userId = c.req.param("userId");
2085
- const body = await c.req.json().catch(() => null);
2086
- const parsed = UpdateOrganizationMemberRequestSchema.safeParse(body);
2087
- if (!userId) return c.json(ErrorResponseSchema.parse({ error: "User id is required" }), 400);
2088
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid member update request" }), 400);
2089
- try {
2090
- const member = await updateOrganizationMemberRole(organizationId, userId, parsed.data.role);
2091
- return c.json(UpdateOrganizationMemberResponseSchema.parse(mapOrganizationMember(member)));
2092
- } catch (error) {
2093
- if (error instanceof CannotModifyOwnerError || error instanceof OrganizationMemberNotFoundError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);
2094
- throw error;
2095
- }
2096
- };
2097
- //#endregion
2098
- //#region src/routes/account/members/[userId]/DELETE.ts
2099
- const handler$11 = async (c) => {
2100
- const { organizationId } = c.get("organization");
2101
- const userId = c.req.param("userId");
2102
- if (!userId) return c.json(ErrorResponseSchema.parse({ error: "User id is required" }), 400);
2103
- try {
2104
- await removeOrganizationMember(organizationId, userId);
2105
- return c.body(null, 204);
2106
- } catch (error) {
2107
- if (error instanceof CannotModifyOwnerError || error instanceof OrganizationMemberNotFoundError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 400);
2108
- throw error;
2109
- }
2110
- };
2111
- //#endregion
2112
- //#region src/routes/account/invitations/GET.ts
2113
- const handler$10 = async (c) => {
2114
- const invitations = await selectPendingInvitationsForUser(c.get("user").id);
2115
- return c.json(ListOrganizationInvitationsResponseSchema.parse(invitations.map(mapOrganizationInvitation)));
2116
- };
2117
- //#endregion
2118
- //#region src/routes/account/invitations/[invitationId]/accept/POST.ts
2119
- const handler$9 = async (c) => {
2120
- const user = c.get("user");
2121
- const invitationId = c.req.param("invitationId");
2122
- if (!invitationId) return c.json(ErrorResponseSchema.parse({ error: "Invitation id is required" }), 400);
2123
- try {
2124
- const membership = await acceptInvitation(invitationId, user.id);
2125
- return c.json(AcceptOrganizationInvitationResponseSchema.parse(mapUserOrganization(membership)));
2126
- } catch (error) {
2127
- if (error instanceof OrganizationInvitationNotFoundError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 404);
2128
- if (error instanceof OrganizationInvitationForbiddenError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 403);
2129
- if (error instanceof OrganizationInvitationExpiredError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 410);
2130
- throw error;
2131
- }
2132
- };
2133
- //#endregion
2134
- //#region src/routes/account/invitations/[invitationId]/decline/POST.ts
2135
- const handler$8 = async (c) => {
2136
- const user = c.get("user");
2137
- const invitationId = c.req.param("invitationId");
2138
- if (!invitationId) return c.json(ErrorResponseSchema.parse({ error: "Invitation id is required" }), 400);
2139
- try {
2140
- await declineInvitation(invitationId, user.id);
2141
- return c.json(DeclineOrganizationInvitationResponseSchema.parse({ success: true }));
2142
- } catch (error) {
2143
- if (error instanceof OrganizationInvitationNotFoundError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 404);
2144
- if (error instanceof OrganizationInvitationForbiddenError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 403);
2145
- throw error;
2146
- }
2147
- };
2148
- //#endregion
2149
- //#region src/routes/account/apps/map-catalog.ts
2150
- /** Map a platform `apps` row to the connect-picker wire shape. */
2151
- function appRowToCatalogEntry(row) {
2152
- return {
2153
- id: row.slug,
2154
- name: row.name,
2155
- description: row.description,
2156
- category: row.category,
2157
- integrationDescription: row.description,
2158
- ...row.logo ? { logo: row.logo } : {},
2159
- authKind: row.authKind,
2160
- oauthScopes: row.oauthScopes,
2161
- source: row.source,
2162
- ...hasCredentialFieldTemplate(row) ? { credentialFields: row.credentialFields } : {}
2163
- };
2164
- }
2165
- function appRowToCustomAppDetail(row) {
2166
- if (row.source !== "custom" || row.authKind !== "api_key") throw new Error(`App is not a custom api_key app: ${row.slug}`);
2167
- if (!hasCredentialFieldTemplate(row)) throw new Error(`Custom app is missing credential fields: ${row.slug}`);
2168
- return {
2169
- id: row.slug,
2170
- slug: row.slug,
2171
- name: row.name,
2172
- description: row.description,
2173
- category: row.category,
2174
- authKind: "api_key",
2175
- source: "custom",
2176
- credentialFields: row.credentialFields,
2177
- createdAt: row.createdAt.toISOString(),
2178
- updatedAt: row.updatedAt.toISOString()
2179
- };
2180
- }
2181
- //#endregion
2182
- //#region src/routes/account/apps/GET.ts
2183
- const handler$7 = async (c) => {
2184
- const apps = (await listAppsForOrganization(c.get("organization").organizationId)).map(appRowToCatalogEntry);
2185
- return c.json(ListAppsResponseSchema.parse(apps));
2186
- };
2187
- //#endregion
2188
- //#region src/routes/account/apps/POST.ts
2189
- const handler$6 = async (c) => {
2190
- const organization = c.get("organization");
2191
- const parsed = CreateCustomAppRequestSchema.safeParse(await c.req.json().catch(() => null));
2192
- if (!parsed.success) {
2193
- const message = parsed.error.issues[0]?.message ?? "Invalid request body";
2194
- return c.json(ErrorResponseSchema.parse({ error: message }), 400);
2195
- }
2196
- const org = await selectOrganizationById(organization.organizationId);
2197
- if (!org) return c.json(ErrorResponseSchema.parse({ error: "Organization not found" }), 404);
2198
- try {
2199
- const row = await createOrgApp({
2200
- organizationId: organization.organizationId,
2201
- orgSlug: org.slug,
2202
- name: parsed.data.name,
2203
- slug: parsed.data.slug,
2204
- description: parsed.data.description,
2205
- credentialFields: parsed.data.fields
2206
- });
2207
- return c.json(CreateCustomAppResponseSchema.parse(appRowToCustomAppDetail(row)), 201);
2208
- } catch (error) {
2209
- if (error instanceof OrgAppSlugTakenError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 409);
2210
- throw error;
2211
- }
2212
- };
2213
- //#endregion
2214
- //#region src/routes/account/apps/slug-available/GET.ts
2215
- const handler$5 = async (c) => {
2216
- const organization = c.get("organization");
2217
- const parsed = AppSlugAvailabilityQuerySchema.safeParse({ slug: c.req.query("slug") });
2218
- if (!parsed.success) return c.json(ErrorResponseSchema.parse({ error: "Invalid slug query" }), 400);
2219
- const org = await selectOrganizationById(organization.organizationId);
2220
- if (!org) return c.json(ErrorResponseSchema.parse({ error: "Organization not found" }), 404);
2221
- const availability = await checkOrgAppSlugAvailability(org.slug, parsed.data.slug);
2222
- return c.json(AppSlugAvailabilityResponseSchema.parse(availability));
2223
- };
2224
- //#endregion
2225
- //#region src/routes/account/apps/[slug]/GET.ts
2226
- const handler$4 = async (c) => {
2227
- const organization = c.get("organization");
2228
- const slug = c.req.param("slug") ?? "";
2229
- if (!slug) return c.json(ErrorResponseSchema.parse({ error: "App not found" }), 404);
2230
- const row = await selectAppForOrganization(organization.organizationId, decodeURIComponent(slug));
2231
- if (!row || row.source !== "custom") return c.json(ErrorResponseSchema.parse({ error: "App not found" }), 404);
2232
- try {
2233
- return c.json(GetCustomAppResponseSchema.parse(appRowToCustomAppDetail(row)));
2234
- } catch {
2235
- return c.json(ErrorResponseSchema.parse({ error: "App not found" }), 404);
2236
- }
2237
- };
2238
- //#endregion
2239
- //#region src/routes/account/api-keys/GET.ts
2240
- const handler$3 = async (c) => {
2241
- const { organizationId } = c.get("organization");
2242
- const user = c.get("user");
2243
- const records = apiKeyListScope(accessContext(c)).kind === "all" ? await listOrgPlatformApiKeysForOrganization(organizationId) : await listOrgPlatformApiKeysForUser(organizationId, user.id);
2244
- const creators = await selectUsersByIds([...new Set(records.map((record) => record.createdByUserId))]);
2245
- const creatorsById = new Map(creators.map((creator) => [creator.id, creator]));
2246
- return c.json(ListApiKeysResponseSchema.parse(records.map((record) => ({
2247
- id: record.id,
2248
- name: record.name,
2249
- keyPreview: record.keyPreview,
2250
- createdAt: record.createdAt.toISOString(),
2251
- createdBy: mapOrgPlatformApiKeyCreatorOrDeleted(record.createdByUserId, creatorsById.get(record.createdByUserId)),
2252
- isCreatedByCurrentUser: record.createdByUserId === user.id
2253
- }))));
2254
- };
2255
- //#endregion
2256
- //#region src/routes/account/api-keys/POST.ts
2257
- const handler$2 = async (c) => {
2258
- const { organizationId } = c.get("organization");
2259
- const user = c.get("user");
2260
- const body = CreateApiKeyRequestSchema.parse(await c.req.json());
2261
- const created = await createOrgPlatformApiKey({
2262
- organizationId,
2263
- userId: user.id,
2264
- name: body.name
2265
- });
2266
- const creator = await loadOrgPlatformApiKeyUser(user.id);
2267
- if (!creator) return c.json({ error: "User not found" }, 404);
2268
- return c.json(CreateApiKeyResponseSchema.parse({
2269
- id: created.id,
2270
- name: created.name,
2271
- keyPreview: created.keyPreview,
2272
- createdAt: created.createdAt.toISOString(),
2273
- createdBy: mapOrgPlatformApiKeyCreator(creator),
2274
- isCreatedByCurrentUser: true,
2275
- secret: created.secret
2276
- }), 201);
2277
- };
2278
- //#endregion
2279
- //#region src/routes/account/api-keys/[apiKeyId]/DELETE.ts
2280
- const handler$1 = async (c) => {
2281
- const { organizationId } = c.get("organization");
2282
- const user = c.get("user");
2283
- const apiKeyId = c.req.param("apiKeyId");
2284
- if (!apiKeyId) return c.json(ErrorResponseSchema.parse({ error: "API key id is required" }), 400);
2285
- const apiKey = await selectOrgPlatformApiKeyForOrganization(apiKeyId, organizationId);
2286
- if (!apiKey) return c.json(ErrorResponseSchema.parse({ error: "API key not found" }), 404);
2287
- if (!canReadApiKey(accessContext(c), {
2288
- userId: user.id,
2289
- createdByUserId: apiKey.createdByUserId
2290
- })) return c.json(ErrorResponseSchema.parse({ error: "API key not found" }), 404);
2291
- if (!canRevokeApiKey(accessContext(c), {
2292
- userId: user.id,
2293
- createdByUserId: apiKey.createdByUserId
2294
- })) return forbidden(c);
2295
- try {
2296
- await revokeOrgPlatformApiKey(apiKeyId, organizationId);
2297
- return c.body(null, 204);
2298
- } catch (error) {
2299
- if (error instanceof OrgPlatformApiKeyNotFoundError) return c.json(ErrorResponseSchema.parse({ error: error.message }), 404);
2300
- throw error;
2301
- }
2302
- };
2303
- //#endregion
2304
- //#region src/lib/team-request-slack.ts
2305
- const TEAM_REQUEST_HEADINGS = {
2306
- "org-deletion": "Org deletion requested",
2307
- contact: "Contact request",
2308
- "enterprise-upgrade": "Enterprise upgrade requested"
2309
- };
2310
- function buildTeamRequestSlackPayload(input) {
2311
- const timestamp = input.timestamp ?? (/* @__PURE__ */ new Date()).toISOString();
2312
- const heading = TEAM_REQUEST_HEADINGS[input.type];
2313
- const summary = `${heading} from ${input.user.name} (${input.org.name})`;
2314
- const fields = [
2315
- {
2316
- type: "mrkdwn",
2317
- text: `*Request type:*\n${input.type}`
2318
- },
2319
- {
2320
- type: "mrkdwn",
2321
- text: `*Timestamp:*\n${timestamp}`
2322
- },
2323
- {
2324
- type: "mrkdwn",
2325
- text: `*User:*\n${input.user.name}\n${input.user.email}\n\`${input.user.id}\``
2326
- },
2327
- {
2328
- type: "mrkdwn",
2329
- text: `*Organization:*\n${input.org.name}\n\`${input.org.slug}\`\n\`${input.org.id}\``
2330
- }
2331
- ];
2332
- const blocks = [{
2333
- type: "header",
2334
- text: {
2335
- type: "plain_text",
2336
- text: heading,
2337
- emoji: true
2338
- }
2339
- }, {
2340
- type: "section",
2341
- fields
2342
- }];
2343
- if (input.type === "contact" && input.message?.trim()) blocks.push({
2344
- type: "section",
2345
- text: {
2346
- type: "mrkdwn",
2347
- text: `*Message:*\n${input.message.trim()}`
2348
- }
2349
- });
2350
- return {
2351
- text: summary,
2352
- blocks
2353
- };
2354
- }
2355
- async function postTeamRequestToSlack(input) {
2356
- const webhookUrl = process.env.TEAM_SLACK_WEBHOOK_URL?.trim();
2357
- if (!webhookUrl) {
2358
- console.warn("TEAM_SLACK_WEBHOOK_URL is not set; skipping team request Slack delivery");
2359
- return;
2360
- }
2361
- const payload = buildTeamRequestSlackPayload(input);
2362
- const response = await fetch(webhookUrl, {
2363
- method: "POST",
2364
- headers: { "Content-Type": "application/json" },
2365
- body: JSON.stringify(payload)
2366
- });
2367
- if (!response.ok) {
2368
- const body = await response.text().catch(() => "");
2369
- throw new Error(`Failed to deliver team request to Slack (${response.status})${body ? `: ${body}` : ""}`);
2370
- }
2371
- }
2372
- //#endregion
2373
- //#region src/routes/account/team-requests/POST.ts
2374
- const handler = async (c) => {
2375
- const user = c.get("user");
2376
- const organizationContext = c.get("organization");
2377
- const parsed = SubmitTeamRequestRequestSchema.safeParse(await c.req.json().catch(() => null));
2378
- if (!parsed.success) {
2379
- const message = parsed.error.issues[0]?.message ?? "Invalid request body";
2380
- return c.json({ error: message }, 400);
2381
- }
2382
- const organization = await selectOrganizationById(organizationContext.organizationId);
2383
- if (!organization) return c.json({ error: "Organization not found" }, 404);
2384
- try {
2385
- await postTeamRequestToSlack({
2386
- type: parsed.data.type,
2387
- message: parsed.data.message,
2388
- user: {
2389
- id: user.id,
2390
- name: user.name,
2391
- email: user.email
2392
- },
2393
- org: {
2394
- id: organization.id,
2395
- name: organization.name,
2396
- slug: organization.slug
2397
- }
2398
- });
2399
- } catch (error) {
2400
- console.error("Failed to deliver team request to Slack", error);
2401
- return c.json({ error: "Failed to deliver team request" }, 502);
2402
- }
2403
- return c.json(SubmitTeamRequestResponseSchema.parse({ ok: true }), 200);
2404
- };
2405
- //#endregion
2406
- //#region src/routes/account/mount.ts
2407
- function mountAccountRoutes(options) {
2408
- const account = new Hono();
2409
- const orgScoped = new Hono();
2410
- const projectScoped = new Hono();
2411
- const protect = requireSession(createDefaultAuthJwtVerifier());
2412
- const deleteCredential = createDeleteCredentialHandler({ mcp: options.mcp });
2413
- account.use("/*", protect);
2414
- orgScoped.use("/*", protect);
2415
- orgScoped.use("/*", requireOrganization());
2416
- projectScoped.use("/*", protect);
2417
- projectScoped.use("/*", requireOrganization());
2418
- const requireOrgUpdate = authorize(organizationActions.update);
2419
- const requireUserManage = authorize(userActions.manage);
2420
- const requireUserInvite = authorize(userActions.invite);
2421
- const requireApiKeyCreate = authorize(apiKeysActions.create);
2422
- const requireInvitableRole = authorizePayload(InviteOrganizationMembersRequestSchema, ({ ctx, body }) => canInviteRole(ctx.orgRole, body.role));
2423
- const requireProjectMember = requireProjectMembership();
2424
- const requireProjectDeploy = authorize(projectActions.deploy);
2425
- const requireProjectUpdate = authorize(projectActions.update);
2426
- const requireProjectDelete = authorize(projectActions.delete);
2427
- const requireProjectManageMembers = authorize(projectActions.manageMembers);
2428
- const requireInvitableProjectRole = authorizePayload(InviteProjectMembersRequestSchema, ({ c, ctx, body }) => canInviteToProject(ctx, { invitePermission: getProjectInvitePermission(c) }, body.role));
2429
- const requireOrgParam = requireOrganizationParam();
2430
- account.get("/organizations", handler$58);
2431
- account.get("/organizations/slug-available", handler$57);
2432
- account.post("/organizations", createOrganizationHandler(options));
2433
- account.get("/organizations/:organizationId", requireOrgParam, handler$56);
2434
- account.patch("/organizations/:organizationId", requireOrgParam, requireOrgUpdate, handler$55);
2435
- account.get("/organizations/:organizationId/branding", requireOrgParam, handler$54);
2436
- account.patch("/organizations/:organizationId/branding", requireOrgParam, requireOrgUpdate, handler$53);
2437
- account.post("/organizations/:organizationId/branding/logo/presign", requireOrgParam, requireOrgUpdate, handler$52);
2438
- account.get("/invitations", handler$10);
2439
- account.post("/invitations/:invitationId/accept", handler$9);
2440
- account.post("/invitations/:invitationId/decline", handler$8);
2441
- account.get("/users/me/avatar", handler$63);
2442
- account.post("/users/me/avatar/presign", handler$62);
2443
- account.patch("/users/me/avatar", handler$61);
2444
- account.get("/users/me/preferences", handler$60);
2445
- account.patch("/users/me/preferences", handler$59);
2446
- orgScoped.get("/apps", handler$7);
2447
- orgScoped.get("/apps/slug-available", handler$5);
2448
- orgScoped.post("/apps", requireOrgUpdate, handler$6);
2449
- orgScoped.get("/apps/:slug", handler$4);
2450
- orgScoped.get("/members", handler$14);
2451
- orgScoped.post("/members/invitations", requireUserInvite, requireInvitableRole, handler$13);
2452
- orgScoped.patch("/members/:userId", requireUserManage, handler$12);
2453
- orgScoped.delete("/members/:userId", requireUserManage, handler$11);
2454
- orgScoped.get("/api-keys", handler$3);
2455
- orgScoped.post("/api-keys", requireApiKeyCreate, handler$2);
2456
- orgScoped.delete("/api-keys/:apiKeyId", handler$1);
2457
- const withOrgDb = withOrganizationProjectDatabase();
2458
- orgScoped.get("/agents", withOrgDb, handler$49);
2459
- orgScoped.get("/agents/:agentId", withOrgDb, handler$48);
2460
- orgScoped.get("/workflows", withOrgDb, handler$46);
2461
- orgScoped.get("/workflows/:workflowId", withOrgDb, handler$45);
2462
- orgScoped.get("/skills", withOrgDb, handler$43);
2463
- orgScoped.get("/skills/:skillId", withOrgDb, handler$42);
2464
- orgScoped.get("/recents", withOrgDb, handler$41);
2465
- orgScoped.get("/history", withOrgDb, handler$51);
2466
- orgScoped.post("/team-requests", handler);
2467
- orgScoped.get("/history/:runId", withOrgDb, handler$50);
2468
- orgScoped.post("/workflows/runs/:runId/cancel", withOrgDb, handler$44);
2469
- orgScoped.post("/agents/sessions/:sessionId/cancel", withOrgDb, handler$47);
2470
- orgScoped.get("/credentials", withOrgDb, handler$18);
2471
- orgScoped.post("/credentials", withOrgDb, handler$17);
2472
- orgScoped.get("/credentials/:credentialId", withOrgDb, (c, next) => c.req.param("credentialId") === "instances" ? next() : handler$16(c, next));
2473
- orgScoped.patch("/credentials/:credentialId", withOrgDb, handler$15);
2474
- orgScoped.delete("/credentials/:credentialId", withOrgDb, deleteCredential);
2475
- orgScoped.get("/projects", handler$40);
2476
- orgScoped.get("/projects/slug-available", handler$37);
2477
- orgScoped.get("/projects/metrics", withOrgDb, handler$39);
2478
- orgScoped.post("/projects", handler$38);
2479
- projectScoped.get("/:projectId", requireProject(), requireProjectMember, handler$36);
2480
- projectScoped.patch("/:projectId", requireProject(), requireProjectMember, requireProjectUpdate, handler$35);
2481
- projectScoped.delete("/:projectId", requireProject(), requireProjectMember, requireProjectDelete, handler$34);
2482
- projectScoped.get("/:projectId/settings", requireProject(), requireProjectMember, handler$20);
2483
- projectScoped.patch("/:projectId/settings", requireProject(), requireProjectMember, requireProjectUpdate, handler$19);
2484
- projectScoped.get("/:projectId/members", requireProject(), requireProjectMember, handler$25);
2485
- projectScoped.post("/:projectId/members", requireProject(), requireProjectMember, requireInvitableProjectRole, handler$24);
2486
- projectScoped.patch("/:projectId/members/:userId", requireProject(), requireProjectMember, requireProjectManageMembers, handler$23);
2487
- projectScoped.delete("/:projectId/members/:userId", requireProject(), requireProjectMember, requireProjectManageMembers, handler$22);
2488
- projectScoped.delete("/:projectId/members/me", requireProject(), requireProjectMember, handler$21);
2489
- projectScoped.get("/:projectId/reachability", requireProject(), requireProjectMember, createProjectReachabilityHandler(options.hosting));
2490
- projectScoped.get("/:projectId/files", requireProject(), requireProjectMember, withOrgDb, handler$27);
2491
- projectScoped.get("/:projectId/artifacts/:artifactId/files/content", requireProject(), requireProjectMember, handler$26);
2492
- projectScoped.get("/:projectId/deployments", requireProject(), requireProjectMember, handler$33);
2493
- projectScoped.get("/:projectId/artifacts/active/download", requireProject(), requireProjectMember, requireProjectDeploy, handler$31);
2494
- projectScoped.post("/:projectId/artifacts", requireProject(), requireProjectMember, requireProjectDeploy, handler$32);
2495
- projectScoped.post("/:projectId/artifacts/:artifactId/complete", requireProject(), requireProjectMember, requireProjectDeploy, handler$30);
2496
- projectScoped.post("/:projectId/artifacts/:artifactId/source/presign", requireProject(), requireProjectMember, requireProjectDeploy, handler$29);
2497
- projectScoped.post("/:projectId/artifacts/:artifactId/source/manifest", requireProject(), requireProjectMember, requireProjectDeploy, handler$28);
2498
- orgScoped.route("/projects", projectScoped);
2499
- account.route("/", orgScoped);
2500
- return account;
2501
- }
2502
- //#endregion
2503
- //#region src/middleware/require-worker-token.ts
2504
- /** Worker auth from Bearer or x-api-key (Anthropic SDK uses the latter). */
2505
- function readWorkerTokenFromRequest(c) {
2506
- const authorization = c.req.header("authorization");
2507
- if (authorization?.startsWith("Bearer ")) return authorization.slice(7).trim();
2508
- const apiKey = c.req.header("x-api-key")?.trim();
2509
- if (apiKey) return apiKey;
2510
- }
2511
- function requireWorkerToken(expectedToken) {
2512
- return async (c, next) => {
2513
- if (!expectedToken) return c.json({
2514
- error: "worker_auth_unconfigured",
2515
- message: "Worker auth is not configured."
2516
- }, 503);
2517
- const token = readWorkerTokenFromRequest(c);
2518
- if (!token || token !== expectedToken) return c.json({
2519
- error: "unauthorized",
2520
- message: "Invalid worker token."
2521
- }, 401);
2522
- await next();
2523
- };
2524
- }
2525
- //#endregion
2526
- //#region src/routes/internal/web-search-proxy.ts
2527
- const EXA_API_ORIGIN = "https://api.exa.ai";
2528
- async function proxyExaWebSearchRequest(options) {
2529
- const apiKey = options.apiKey?.trim();
2530
- if (!apiKey) return Response.json({ error: "web_search_unconfigured" }, { status: 501 });
2531
- const target = new URL(`${EXA_API_ORIGIN}/${options.path.replace(/^\/+/, "")}`);
2532
- target.search = new URL(options.requestUrl).search;
2533
- const response = await (options.fetchImpl ?? fetch)(target, {
2534
- method: options.method,
2535
- headers: {
2536
- "content-type": "application/json",
2537
- "x-api-key": apiKey
2538
- },
2539
- body: options.method === "GET" || options.method === "HEAD" ? void 0 : options.body
2540
- });
2541
- const headers = new Headers(response.headers);
2542
- headers.delete("content-encoding");
2543
- headers.delete("transfer-encoding");
2544
- return new Response(response.body, {
2545
- status: response.status,
2546
- statusText: response.statusText,
2547
- headers
2548
- });
2549
- }
2550
- //#endregion
2551
- //#region src/routes/internal/with-project-scope.ts
2552
- async function withProjectScope(projectId, fn) {
2553
- const project = await selectProjectById(projectId);
2554
- if (!project) return;
2555
- const organization = await selectOrganizationById(project.organizationId);
2556
- if (!organization) return;
2557
- const url = resolveOrgDatabaseUrl(organization);
2558
- let result;
2559
- await runWithOrganizationScope(project.organizationId, () => runWithProjectDatabase({
2560
- url,
2561
- searchPath: organization.dbSchema
2562
- }, () => runWithProjectScope(project.id, () => runWithTenantScope(project.organizationId, async () => {
2563
- result = await fn({
2564
- organizationId: project.organizationId,
2565
- projectId: project.id
2566
- });
2567
- }))));
2568
- return result;
2569
- }
2570
- //#endregion
2571
- //#region src/routes/internal/mount.ts
2572
- const EnsureWebhookRouteBodySchema = z.object({
2573
- route: z.string().trim().min(1),
2574
- attachmentKeys: z.array(z.string().trim().min(1)).min(1)
2575
- });
2576
- const SandboxSessionBodySchema = z.object({
2577
- agentId: z.string().trim().min(1),
2578
- sessionId: z.string().trim().min(1)
2579
- });
2580
- const SandboxExecBodySchema = SandboxSessionBodySchema.extend({
2581
- script: z.string(),
2582
- options: z.object({
2583
- cwd: z.string().optional(),
2584
- env: z.record(z.string(), z.string()).optional(),
2585
- stdin: z.string().optional()
2586
- }).optional()
2587
- });
2588
- const SandboxReadBodySchema = SandboxSessionBodySchema.extend({ path: z.string().trim().min(1) });
2589
- const SandboxWriteBodySchema = SandboxSessionBodySchema.extend({
2590
- path: z.string().trim().min(1),
2591
- content: z.string()
2592
- });
2593
- function mountInternalRoutes(workerToken, tokenRefresh, llmProxy, sandboxProxy, mcp) {
2594
- const internal = new Hono();
2595
- const protect = requireWorkerToken(workerToken);
2596
- const materialize = createCredentialMaterializeHandler(tokenRefresh);
2597
- internal.use("/*", protect);
2598
- mcp?.mountInternalRoutes?.(internal, { withProjectScope });
2599
- internal.post("/projects/:projectId/credentials/materialize", async (c) => {
2600
- const response = await withProjectScope(c.req.param("projectId"), async () => materialize(c));
2601
- if (response === void 0) return c.json({ error: "Project not found" }, 404);
2602
- return response ?? c.json({
2603
- error: "internal_error",
2604
- message: "Failed to materialize credential."
2605
- }, 500);
2606
- });
2607
- internal.all("/projects/:projectId/web-search/:path{.+}", async (c) => {
2608
- const body = c.req.method === "GET" || c.req.method === "HEAD" ? void 0 : await c.req.arrayBuffer();
2609
- return proxyExaWebSearchRequest({
2610
- apiKey: process.env.EXA_API_KEY,
2611
- method: c.req.method,
2612
- path: c.req.param("path"),
2613
- requestUrl: c.req.url,
2614
- body
2615
- });
2616
- });
2617
- if (llmProxy) internal.all("/projects/:projectId/llm/:path{.+}", async (c) => {
2618
- const response = await withProjectScope(c.req.param("projectId"), async (ctx) => llmProxy.handler(c, {
2619
- organizationId: ctx.organizationId,
2620
- projectId: ctx.projectId,
2621
- pathSuffix: `/${c.req.param("path")}`
2622
- }));
2623
- if (response === void 0) return c.json({ error: "Project not found" }, 404);
2624
- return response ?? c.json({
2625
- error: "internal_error",
2626
- message: "Failed to proxy LLM request."
2627
- }, 500);
2628
- });
2629
- if (sandboxProxy) {
2630
- internal.post("/projects/:projectId/sandbox/create", async (c) => {
2631
- const projectId = c.req.param("projectId");
2632
- const parsed = SandboxSessionBodySchema.safeParse(await c.req.json().catch(() => null));
2633
- if (!parsed.success) return c.json({
2634
- error: "Invalid request body",
2635
- details: parsed.error.flatten()
2636
- }, 400);
2637
- const result = await withProjectScope(projectId, async (ctx) => sandboxProxy.create({
2638
- ...ctx,
2639
- ...parsed.data
2640
- }));
2641
- if (result === void 0) return c.json({ error: "Project not found" }, 404);
2642
- return c.json(result);
2643
- });
2644
- internal.post("/projects/:projectId/sandbox/exec", async (c) => {
2645
- const projectId = c.req.param("projectId");
2646
- const parsed = SandboxExecBodySchema.safeParse(await c.req.json().catch(() => null));
2647
- if (!parsed.success) return c.json({
2648
- error: "Invalid request body",
2649
- details: parsed.error.flatten()
2650
- }, 400);
2651
- const { script, options, ...session } = parsed.data;
2652
- const result = await withProjectScope(projectId, async (ctx) => sandboxProxy.exec({
2653
- ...ctx,
2654
- ...session
2655
- }, script, options));
2656
- if (result === void 0) return c.json({ error: "Project not found" }, 404);
2657
- return c.json(result);
2658
- });
2659
- internal.post("/projects/:projectId/sandbox/read", async (c) => {
2660
- const projectId = c.req.param("projectId");
2661
- const parsed = SandboxReadBodySchema.safeParse(await c.req.json().catch(() => null));
2662
- if (!parsed.success) return c.json({
2663
- error: "Invalid request body",
2664
- details: parsed.error.flatten()
2665
- }, 400);
2666
- const { path, ...session } = parsed.data;
2667
- const content = await withProjectScope(projectId, async (ctx) => sandboxProxy.readFile({
2668
- ...ctx,
2669
- ...session
2670
- }, path));
2671
- if (content === void 0) return c.json({ error: "Project not found" }, 404);
2672
- return c.json({ content });
2673
- });
2674
- internal.post("/projects/:projectId/sandbox/write", async (c) => {
2675
- const projectId = c.req.param("projectId");
2676
- const parsed = SandboxWriteBodySchema.safeParse(await c.req.json().catch(() => null));
2677
- if (!parsed.success) return c.json({
2678
- error: "Invalid request body",
2679
- details: parsed.error.flatten()
2680
- }, 400);
2681
- const { path, content, ...session } = parsed.data;
2682
- if (await withProjectScope(projectId, async (ctx) => {
2683
- await sandboxProxy.writeFile({
2684
- ...ctx,
2685
- ...session
2686
- }, path, content);
2687
- return true;
2688
- }) === void 0) return c.json({ error: "Project not found" }, 404);
2689
- return c.json({});
2690
- });
2691
- internal.post("/projects/:projectId/sandbox/dispose", async (c) => {
2692
- const projectId = c.req.param("projectId");
2693
- const parsed = SandboxSessionBodySchema.safeParse(await c.req.json().catch(() => null));
2694
- if (!parsed.success) return c.json({
2695
- error: "Invalid request body",
2696
- details: parsed.error.flatten()
2697
- }, 400);
2698
- if (await withProjectScope(projectId, async (ctx) => {
2699
- await sandboxProxy.dispose({
2700
- ...ctx,
2701
- ...parsed.data
2702
- });
2703
- return true;
2704
- }) === void 0) return c.json({ error: "Project not found" }, 404);
2705
- return c.json({});
2706
- });
2707
- }
2708
- internal.post("/projects/:projectId/webhooks/ensure", async (c) => {
2709
- const projectId = c.req.param("projectId");
2710
- if (!await withProjectScope(projectId, async (ctx) => ctx)) return c.json({ error: "Project not found" }, 404);
2711
- const parsed = EnsureWebhookRouteBodySchema.safeParse(await c.req.json().catch(() => null));
2712
- if (!parsed.success) return c.json({
2713
- error: "Invalid request body",
2714
- details: parsed.error.flatten()
2715
- }, 400);
2716
- const origin = platformWebhookOrigin(projectId, externalPlatformOrigin());
2717
- if (!origin) return c.json({ error: "PUBLIC_PLATFORM_URL is not configured" }, 500);
2718
- try {
2719
- const token = await ensureWebhookApiKeyForRoute(projectId, parsed.data.route, parsed.data.attachmentKeys);
2720
- return c.json({ webhookUrl: buildWebhookUrl(origin, parsed.data.route, token) });
2721
- } catch (error) {
2722
- const message = error instanceof Error ? error.message : "Failed to ensure webhook API key.";
2723
- return c.json({
2724
- error: "webhook_provisioning_failed",
2725
- message
2726
- }, 500);
2727
- }
2728
- });
2729
- return internal;
2730
- }
2731
- //#endregion
2732
- //#region src/app.ts
2733
- async function createApp$1(auth, options) {
2734
- return createApp({
2735
- mode: "platform",
2736
- webOrigin: options.webOrigin,
2737
- schedulerPlugin: options.scheduler,
2738
- mcp: options.mcp,
2739
- auth,
2740
- mountAuth: (app, authInstance) => {
2741
- mountAuth(app, authInstance);
2742
- },
2743
- mountAccount: async (app) => {
2744
- app.route("/api", mountAccountRoutes({
2745
- hosting: options.hosting,
2746
- storage: options.storage,
2747
- mcp: options.mcp
2748
- }));
2749
- },
2750
- mountInternal: (app, { tokenRefresh }) => {
2751
- app.route("/internal", mountInternalRoutes(options.hosting.workerRuntime.workerToken, tokenRefresh, options.llmProxy, options.sandboxProxy, options.mcp));
2752
- }
2753
- });
2754
- }
2755
- //#endregion
2756
- //#region src/start.ts
2757
- /** Fly `internal_port` — not the public HTTPS URL port. */
2758
- const PRODUCTION_PLATFORM_LISTEN_PORT = 8080;
2759
- const LOCAL_PLATFORM_PORT = 3002;
2760
- function resolvePlatformListenPort() {
2761
- if (process.env.NODE_ENV === "production") return PRODUCTION_PLATFORM_LISTEN_PORT;
2762
- return listenPortFromPublicUrl(process.env.PUBLIC_PLATFORM_URL, LOCAL_PLATFORM_PORT);
2763
- }
2764
- function usesPgBossScheduler(platformConfig) {
2765
- return platformConfig.scheduler.name === "pg-boss" || platformConfig.scheduler.name === "default";
2766
- }
2767
- async function startPlatformServer(platformConfig, hooks = {}) {
2768
- const runtime = platformConfig.hosting.createRuntime();
2769
- await initDatabase();
2770
- await ensureKeystrokeAssetsBucket();
2771
- await seedOAuthAppsFromEnvForAllOrganizations();
2772
- if (usesPgBossScheduler(platformConfig)) await ensureProjectPgBossGrants();
2773
- configureProjectRuntimeScheduler(platformConfig.scheduler);
2774
- await startProjectRuntimeWorker(runtime, { resolveStartInput: async (job) => {
2775
- const organization = await selectOrganizationById(job.organizationId);
2776
- if (!organization) throw new Error(`Organization ${job.organizationId} not found`);
2777
- const database = await resolveOrgRuntimeDatabase(job.organizationId);
2778
- const workerRuntime = platformConfig.hosting.workerRuntime;
2779
- return {
2780
- organizationId: job.organizationId,
2781
- projects: [],
2782
- database: {
2783
- ...database,
2784
- organizationId: job.organizationId
2785
- },
2786
- env: {
2787
- ...orgWorkspacesRuntimeEnv(organization, { containerEnv: process.env }),
2788
- ...platformConfig.llmProxy?.workerEnv({
2789
- platformUrl: workerRuntime.platformUrl,
2790
- workerToken: workerRuntime.workerToken
2791
- }),
2792
- ...platformConfig.sandboxProxy?.workerEnv({
2793
- platformUrl: workerRuntime.platformUrl,
2794
- workerToken: workerRuntime.workerToken
2795
- }),
2796
- ...platformConfig.workerEnv?.({
2797
- platformUrl: workerRuntime.platformUrl,
2798
- workerToken: workerRuntime.workerToken
2799
- })
2800
- },
2801
- hosting: organization.hostingAppName ? { appName: organization.hostingAppName } : void 0,
2802
- previousRuntimeId: organization.runtimeId
2803
- };
2804
- } });
2805
- const webUrl = process.env.PUBLIC_WEB_URL;
2806
- if (!webUrl) throw new Error("PUBLIC_WEB_URL is required for the platform server");
2807
- const platformUrl = process.env.PUBLIC_PLATFORM_URL?.replace(/\/+$/, "");
2808
- if (!platformUrl) throw new Error("PUBLIC_PLATFORM_URL is required for the platform server");
2809
- const auth = createAuth({
2810
- baseURL: platformUrl,
2811
- verificationUri: `${webUrl.replace(/\/+$/, "")}/device`,
2812
- trustedOrigins: [webUrl]
2813
- });
2814
- if (!auth) throw new Error("BETTER_AUTH_SECRET is required for the platform server");
2815
- const app = await createApp$1(auth, {
2816
- webOrigin: webUrl,
2817
- hosting: platformConfig.hosting,
2818
- storage: platformConfig.storage,
2819
- scheduler: platformConfig.scheduler,
2820
- llmProxy: platformConfig.llmProxy,
2821
- sandboxProxy: platformConfig.sandboxProxy,
2822
- mcp: platformConfig.mcp
2823
- });
2824
- await hooks.afterCreateApp?.(app);
2825
- const port = resolvePlatformListenPort();
2826
- serve({
2827
- fetch: app.fetch,
2828
- port
2829
- }, (info) => {
2830
- console.log(`Platform API listening on http://localhost:${info.port}`);
2831
- });
2832
- }
2833
- //#endregion
2834
- export { startPlatformServer as t };
2835
-
2836
- //# sourceMappingURL=start-9_8ZcdaU.mjs.map