@keystrokehq/platform 0.1.1 → 0.1.3

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