decocms 4.443.1 → 4.443.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/dist/README.md +7 -1
  2. package/dist/client/assets/{AlertCircle-nGDYftVI.js → AlertCircle-DXLs2YfX.js} +1 -1
  3. package/dist/client/assets/{AreaChart-ZSNWajPN.js → AreaChart-DLFvYTn8.js} +1 -1
  4. package/dist/client/assets/{ArrowLeft-DYsLCA2v.js → ArrowLeft--pkS1YcK.js} +1 -1
  5. package/dist/client/assets/{ArrowUp-DWz6jCWP.js → ArrowUp-DQxu9lq3.js} +1 -1
  6. package/dist/client/assets/{Building02-dkZL73Aq.js → Building02-CKLKiQ3U.js} +1 -1
  7. package/dist/client/assets/{CartesianChart-DhLgFSnL.js → CartesianChart-C6kBEFCy.js} +1 -1
  8. package/dist/client/assets/{Check-DdiNmh3G.js → Check-BbEloZu1.js} +1 -1
  9. package/dist/client/assets/{CheckCircle-DSYpSZ7G.js → CheckCircle-BDzQ_ECv.js} +1 -1
  10. package/dist/client/assets/{ChevronUp-RZ9D15nf.js → ChevronUp-D3ChNhrQ.js} +1 -1
  11. package/dist/client/assets/{Copy01-gcdR5IZX.js → Copy01-a63gH2RE.js} +1 -1
  12. package/dist/client/assets/{CreditCard01-Bl6sSiay.js → CreditCard01-BS5sPNh6.js} +1 -1
  13. package/dist/client/assets/{DotsVertical-DhpXY6GD.js → DotsVertical-vt_3gkoG.js} +1 -1
  14. package/dist/client/assets/{ErrorBarContext-DpIYs0cR.js → ErrorBarContext-CSPYPFXx.js} +1 -1
  15. package/dist/client/assets/{Image01-CR8VGKVo.js → Image01-BR5I_9pG.js} +1 -1
  16. package/dist/client/assets/{Key01-D0sQpTkE.js → Key01-C0k-gtwc.js} +1 -1
  17. package/dist/client/assets/{Line-u5ZQ6mA8.js → Line-C6bWuRZM.js} +1 -1
  18. package/dist/client/assets/{Link01-8ip-fr29.js → Link01-DM36157y.js} +1 -1
  19. package/dist/client/assets/{LinkBroken01-BkhUs9rq.js → LinkBroken01-DHksKx7R.js} +1 -1
  20. package/dist/client/assets/{LinkExternal01-DrJX7aC0.js → LinkExternal01-DZNYicBT.js} +1 -1
  21. package/dist/client/assets/{Monitor01-D7z7RGzV.js → Monitor01-BQxvNkHa.js} +1 -1
  22. package/dist/client/assets/{Palette-DnGo9yVI.js → Palette-D-JYBilo.js} +1 -1
  23. package/dist/client/assets/{Plus-DB4FI3R3.js → Plus-kevaXo9o.js} +1 -1
  24. package/dist/client/assets/{SearchMd-kP-wMwgH.js → SearchMd-CKY0v7Vy.js} +1 -1
  25. package/dist/client/assets/{Sector-LnIMaEQL.js → Sector-DTAQxGMo.js} +1 -1
  26. package/dist/client/assets/{ShoppingBag01-_DEXID55.js → ShoppingBag01-Dfpwkcdn.js} +1 -1
  27. package/dist/client/assets/{Sun-FPWNj6PU.js → Sun-DxmQEZP4.js} +1 -1
  28. package/dist/client/assets/{Tool01-BLZm9DPk.js → Tool01-D4pGeBop.js} +1 -1
  29. package/dist/client/assets/{Trash01-BvHf5UWo.js → Trash01-DFbco4Cc.js} +1 -1
  30. package/dist/client/assets/{Upload01-DKe2IKKC.js → Upload01-BZbq-HqK.js} +1 -1
  31. package/dist/client/assets/{User01-jJA28_tq.js → User01-d9Z_uT9d.js} +1 -1
  32. package/dist/client/assets/{UserSquare-QnfD_CaR.js → UserSquare-DRII3oW9.js} +1 -1
  33. package/dist/client/assets/{Users01-eyKYd8Cn.js → Users01-CNmS3Xkr.js} +1 -1
  34. package/dist/client/assets/{X-BuNT_jX4.js → X-Cul5rSgm.js} +1 -1
  35. package/dist/client/assets/{XAxis-C-LxgUvH.js → XAxis-Dkkejosu.js} +1 -1
  36. package/dist/client/assets/{XClose-4hmzGRgA.js → XClose-Cs8QbZ4B.js} +1 -1
  37. package/dist/client/assets/{ZoomOut-CAM_UTRK.js → ZoomOut-D59vA8XW.js} +1 -1
  38. package/dist/client/assets/{access-gate-BiuCzoWU.js → access-gate-Cxb2F7oE.js} +1 -1
  39. package/dist/client/assets/{add-connection-dialog-iTzdOqFh.js → add-connection-dialog-DplB0y07.js} +1 -1
  40. package/dist/client/assets/{agent-analytics-D9aMLNVy.js → agent-analytics-BS1b9iO0.js} +1 -1
  41. package/dist/client/assets/agent-app-CeqjVahj.js +1 -0
  42. package/dist/client/assets/{agent-assets-DoSUflp2.js → agent-assets-vaZlOnFb.js} +1 -1
  43. package/dist/client/assets/{agent-automation-uQB8fdi5.js → agent-automation-DjX3m9HB.js} +1 -1
  44. package/dist/client/assets/{agent-automations-F0sOGxBj.js → agent-automations-Bs5h0eCg.js} +1 -1
  45. package/dist/client/assets/{agent-connect-sources-DVTBcRKn.js → agent-connect-sources-CKd-sxH0.js} +1 -1
  46. package/dist/client/assets/agent-deck-DNb1Gyse.js +1 -0
  47. package/dist/client/assets/{agent-e2e-9hHGAsd3.js → agent-e2e-CJ8T7gRz.js} +1 -1
  48. package/dist/client/assets/{agent-experiments-Cj0u6Uac.js → agent-experiments-B8CMED50.js} +1 -1
  49. package/dist/client/assets/{agent-file-B3GYfKsE.js → agent-file-BwjSnTWU.js} +1 -1
  50. package/dist/client/assets/{agent-git-B_xWAjW4.js → agent-git-C5yb5yRL.js} +1 -1
  51. package/dist/client/assets/{agent-hosting-VZ4aUX1j.js → agent-hosting-pLomroMj.js} +1 -1
  52. package/dist/client/assets/{agent-icon-CJvQ4Zav.js → agent-icon-CR4t5Gu3.js} +1 -1
  53. package/dist/client/assets/agent-library-BfIYcZpQ.js +1 -0
  54. package/dist/client/assets/agent-library-file-p5s_MaTP.js +1 -0
  55. package/dist/client/assets/{agent-monitor-C-O9rh5l.js → agent-monitor-CSJ_ZPtI.js} +1 -1
  56. package/dist/client/assets/{agent-overview-Cui2wX4M.js → agent-overview-Cm-7P1_4.js} +1 -1
  57. package/dist/client/assets/agent-settings-Jhu1Dols.js +1 -0
  58. package/dist/client/assets/{agent-site-editor-DWYBh7yq.js → agent-site-editor-C8Vp2mSD.js} +1 -1
  59. package/dist/client/assets/agent-site-editor-code-CuDYYt6-.js +2 -0
  60. package/dist/client/assets/{agent-site-editor-content-55H-EEp_.js → agent-site-editor-content-DU89Xm1v.js} +3 -3
  61. package/dist/client/assets/{agent-site-editor-preview-BaYUgL0o.js → agent-site-editor-preview-DIGidFF-.js} +3 -3
  62. package/dist/client/assets/agent-view-DvDhKdxG.js +1 -0
  63. package/dist/client/assets/{agent-view-guard-DeQKdcs0.js → agent-view-guard-DI59nzL2.js} +1 -1
  64. package/dist/client/assets/{agents-list-WTk3WoPq.js → agents-list-h2QLMpr7.js} +1 -1
  65. package/dist/client/assets/{ai-providers-Dfnb3l7z.js → ai-providers-Cuo2aX4J.js} +1 -1
  66. package/dist/client/assets/{alert-5BSEJ36W.js → alert-DrqXlaB2.js} +1 -1
  67. package/dist/client/assets/{alert-dialog-BFv9kLvz.js → alert-dialog-SIUpU6uq.js} +1 -1
  68. package/dist/client/assets/{analytics-sections-CkfTQyP4.js → analytics-sections-BN5-cQxB.js} +1 -1
  69. package/dist/client/assets/{api-keys-BlUFkZIa.js → api-keys-9O3tzLbV.js} +1 -1
  70. package/dist/client/assets/api-keys-yPb18LqK.js +1 -0
  71. package/dist/client/assets/app-editor-DXvmafQO.js +1 -0
  72. package/dist/client/assets/{asset-utils-DOn8JWcy.js → asset-utils-DXGjR1jG.js} +1 -1
  73. package/dist/client/assets/{auth-catchall-BG6U1S1e.js → auth-catchall-Bba1CJfl.js} +1 -1
  74. package/dist/client/assets/{auth-entry-CFuD3npw.js → auth-entry-Ch8TvE5s.js} +1 -1
  75. package/dist/client/assets/{auth-_XhpWlCD.js → auth-gmg7d_GH.js} +1 -1
  76. package/dist/client/assets/{auth-split-layout-NaLq5k6q.js → auth-split-layout-DTU8WroU.js} +1 -1
  77. package/dist/client/assets/{authenticate-and-persist-oauth-CRtno7NA.js → authenticate-and-persist-oauth-jhfDVcJv.js} +1 -1
  78. package/dist/client/assets/{automation-list-row-BNT7qQVd.js → automation-list-row-BUEOdqlU.js} +1 -1
  79. package/dist/client/assets/{automation-runs-B-g9tmZQ.js → automation-runs-puDKBIgS.js} +1 -1
  80. package/dist/client/assets/{automations-DZWy3G0S.js → automations-QUisz5WY.js} +1 -1
  81. package/dist/client/assets/{autosend-C3AW9-Kc.js → autosend-pVPWEmgH.js} +1 -1
  82. package/dist/client/assets/{avatar-DFe8T8wv.js → avatar-BqlNIDCE.js} +1 -1
  83. package/dist/client/assets/{badge-HCDrWNgI.js → badge-DtU2WkJu.js} +1 -1
  84. package/dist/client/assets/{block-document-BjCJT_hj.js → block-document-C277Lv3R.js} +1 -1
  85. package/dist/client/assets/{blocks-preview-workspace-context-ygQViva-.js → blocks-preview-workspace-context-C3gS27DC.js} +1 -1
  86. package/dist/client/assets/{buckets-QfMGnFIM.js → buckets-i93if4PX.js} +1 -1
  87. package/dist/client/assets/{build-improve-prompt-doc-BmxeF3A8.js → build-improve-prompt-doc-DJwI2xSl.js} +1 -1
  88. package/dist/client/assets/{calendar-DfnovksK.js → calendar-FovdVD0Q.js} +1 -1
  89. package/dist/client/assets/{capability-load-error-BXP4fPem.js → capability-load-error-Ss9c_27I.js} +1 -1
  90. package/dist/client/assets/{category-editor-D0pwqTY2.js → category-editor-bw3NaN_p.js} +1 -1
  91. package/dist/client/assets/{chart-CgCcwj9R.js → chart-CgCPJzFe.js} +1 -1
  92. package/dist/client/assets/{chat-context-57WZg7Dj.js → chat-context-CXmGJCh6.js} +1 -1
  93. package/dist/client/assets/{chat-draft-BfNI0JT9.js → chat-draft-Cf6M_rqU.js} +1 -1
  94. package/dist/client/assets/{checkbox-DYTYP-sp.js → checkbox-TXsgr3EH.js} +1 -1
  95. package/dist/client/assets/{choose-editor-ConbAn_j.js → choose-editor-CthxYzyJ.js} +1 -1
  96. package/dist/client/assets/{claim-phase-copy-CxQ6pqyC.js → claim-phase-copy-ZnN8pI8I.js} +1 -1
  97. package/dist/client/assets/{cli-auth-success-BMJArkja.js → cli-auth-success-C_mfySiY.js} +1 -1
  98. package/dist/client/assets/{client-icons-B2e9fI9Z.js → client-icons-cFdIknOt.js} +1 -1
  99. package/dist/client/assets/{collapsible-DsWNr7eG.js → collapsible-DvCkKWwe.js} +1 -1
  100. package/dist/client/assets/{collection-detail-R8OxmdGe.js → collection-detail-CytBSKx7.js} +1 -1
  101. package/dist/client/assets/{collection-display-button-Djjcjybw.js → collection-display-button-D_YQnWY2.js} +1 -1
  102. package/dist/client/assets/{collection-search-HMFzfPbk.js → collection-search-CBqaYcDh.js} +1 -1
  103. package/dist/client/assets/{collection-table-wrapper-BHZQdR59.js → collection-table-wrapper-DdmsDfw6.js} +1 -1
  104. package/dist/client/assets/{collection-tabs-BAecEYSD.js → collection-tabs-CqkPnR43.js} +1 -1
  105. package/dist/client/assets/{column-rules-Dn8Oiij3.js → column-rules-DmIVY5oh.js} +1 -1
  106. package/dist/client/assets/{combobox-CoP6GrDz.js → combobox-CEvYMvN3.js} +1 -1
  107. package/dist/client/assets/{command-CYO6wqHE.js → command-BfeIom6N.js} +1 -1
  108. package/dist/client/assets/{companion-mcps-section-BQmDsmLP.js → companion-mcps-section-Ck8UUBzj.js} +1 -1
  109. package/dist/client/assets/{config-B-T5G-Sm.js → config-2E3xR2_y.js} +1 -1
  110. package/dist/client/assets/{connect-C6mMzkpn.js → connect-BAMAJEoE.js} +1 -1
  111. package/dist/client/assets/{connect-layout-Bcsicf_i.js → connect-layout-h3BrSWqp.js} +1 -1
  112. package/dist/client/assets/{connection-XKeDufat.js → connection-VweOjV2O.js} +1 -1
  113. package/dist/client/assets/{connection-card-CyPdimh-.js → connection-card-64g-eY4r.js} +1 -1
  114. package/dist/client/assets/{connection-detail-BuBsAR66.js → connection-detail-CfoyWU2W.js} +1 -1
  115. package/dist/client/assets/{connection-form-helpers-D5a67gIJ.js → connection-form-helpers-Dyv9IKEP.js} +1 -1
  116. package/dist/client/assets/{connections-DaLdX42y.js → connections-2-CXQYIi.js} +1 -1
  117. package/dist/client/assets/{context-CKropqbM.js → context-DWFfHXBw.js} +1 -1
  118. package/dist/client/assets/{context-menu-B8KQvqPz.js → context-menu-De4tqQQE.js} +1 -1
  119. package/dist/client/assets/{create-organization-dialog-CC3bfG-a.js → create-organization-dialog-B1RRLsDf.js} +1 -1
  120. package/dist/client/assets/{daily-pulse--izT7vL3.js → daily-pulse-CCBkb-iX.js} +1 -1
  121. package/dist/client/assets/{decopilot-C0YgIJ6X.js → decopilot-lSZL3pEK.js} +1 -1
  122. package/dist/client/assets/{device-hint-BInEqiyb.js → device-hint-CYJEDP6x.js} +1 -1
  123. package/dist/client/assets/{dialog-DJN6MVgM.js → dialog-BSl2AX4W.js} +1 -1
  124. package/dist/client/assets/{discover-C9MDCBi0.js → discover-XwZddFEz.js} +1 -1
  125. package/dist/client/assets/{domain-settings-DE44PRLU.js → domain-settings-DUDo0z8q.js} +1 -1
  126. package/dist/client/assets/{download-app-dialog-CCGZxufS.js → download-app-dialog-C2P7W8iK.js} +1 -1
  127. package/dist/client/assets/{drawer-BltlXHm_.js → drawer-DqBseAyM.js} +1 -1
  128. package/dist/client/assets/{editor-CVrodmvC.js → editor-BRstAcuG.js} +1 -1
  129. package/dist/client/assets/{empty-state-d5T0jvmw.js → empty-state-B_1GXkEg.js} +1 -1
  130. package/dist/client/assets/{empty-state-CMomFSLr.js → empty-state-CZ4GlZ32.js} +1 -1
  131. package/dist/client/assets/{extract-connection-data-oeQMV1x5.js → extract-connection-data-Dv6mCSuT.js} +1 -1
  132. package/dist/client/assets/{feature-gate-txxC8V7V.js → feature-gate-Kap3Vwes.js} +1 -1
  133. package/dist/client/assets/{feature-paywall-CCAdf3Sa.js → feature-paywall-BMjJberI.js} +1 -1
  134. package/dist/client/assets/{file-explorer-DvHTYZ00.js → file-explorer-sxnHpGtO.js} +1 -1
  135. package/dist/client/assets/{file-preview-CrbKDhEs.js → file-preview-qKX0Hj06.js} +1 -1
  136. package/dist/client/assets/{file-share-button-wrCnaVy5.js → file-share-button-DsEdF9_e.js} +1 -1
  137. package/dist/client/assets/{file-type-icon-bXE_k5sz.js → file-type-icon-q3jT_2Y8.js} +1 -1
  138. package/dist/client/assets/flat-project-DaiL6_Yc.js +1 -0
  139. package/dist/client/assets/{folder-icon-cKcXEBJn.js → folder-icon-VggWvkeC.js} +1 -1
  140. package/dist/client/assets/{form-BjXXuh2_.js → form-CbtSzwk4.js} +1 -1
  141. package/dist/client/assets/{gateway-client-BaqReu6H.js → gateway-client-CswynSYR.js} +1 -1
  142. package/dist/client/assets/{general-P324czHx.js → general-D16HtoNP.js} +1 -1
  143. package/dist/client/assets/{home-DQqHEr_I.js → home-C1DBRJdH.js} +1 -1
  144. package/dist/client/assets/{icon-button-DSeFHn8f.js → icon-button-D7NextCX.js} +1 -1
  145. package/dist/client/assets/{index-YUcuY-u2.js → index-6HS_Fth-.js} +1 -1
  146. package/dist/client/assets/{index-D2XyhTnn.js → index-B-ajDQ7x.js} +3 -3
  147. package/dist/client/assets/{index-kJRaT2AO.js → index-B05BvO6S.js} +1 -1
  148. package/dist/client/assets/{index-BKE4AJl4.js → index-BPJC_Lsm.js} +1 -1
  149. package/dist/client/assets/{index-DGnFk0_c.js → index-C7eGj3Yr.js} +1 -1
  150. package/dist/client/assets/{index-CdxHQZta.js → index-D2dTzz5J.js} +2 -2
  151. package/dist/client/assets/{index-eQ3HZ0eK.js → index-DBRaqXh3.js} +1 -1
  152. package/dist/client/assets/{index-8LgexCXT.js → index-DJmJwzWv.js} +1 -1
  153. package/dist/client/assets/{index-D5aMdsbk.js → index-DYekkvsC.js} +1 -1
  154. package/dist/client/assets/{index-BtUSf8NF.js → index-DnL0WJSy.js} +1 -1
  155. package/dist/client/assets/{index-CnKrz3BN.js → index-Dyu-dh6U.js} +1 -1
  156. package/dist/client/assets/{index-SCvLZwwK.js → index-I7SWL7Bn.js} +1 -1
  157. package/dist/client/assets/{index-CvxuRZwT.js → index-Q0xGMFy6.js} +1 -1
  158. package/dist/client/assets/{index-BzngvahP.js → index-k3WFemWm.js} +1 -1
  159. package/dist/client/assets/{index-redirect-D1pX-yVM.js → index-redirect-BIG2i9sg.js} +1 -1
  160. package/dist/client/assets/{index-M9qIKTGe.js → index-xXBxH1Ml.js} +1 -1
  161. package/dist/client/assets/{infiniteQueryObserver-CDMBojy0.js → infiniteQueryObserver-d9AVE-54.js} +1 -1
  162. package/dist/client/assets/{infra-billing-BdY0GEto.js → infra-billing-DeQI7Gu0.js} +1 -1
  163. package/dist/client/assets/{input-BKVvaN4k.js → input-BPxTfIlR.js} +3 -3
  164. package/dist/client/assets/{input-DYp-O8Zf.js → input-CcOKxxNa.js} +1 -1
  165. package/dist/client/assets/{input-CEyC_PjH.js → input-QVDvJxJt.js} +1 -1
  166. package/dist/client/assets/{integration-icon-CW837guT.js → integration-icon-LuLuvYpS.js} +1 -1
  167. package/dist/client/assets/{label-CyxA9Tlc.js → label-Vx4RXl56.js} +1 -1
  168. package/dist/client/assets/{layout-88zBftER.js → layout-DsjTg2tO.js} +1 -1
  169. package/dist/client/assets/{legacy-agents-deep-CH-IrvKb.js → legacy-agents-deep-0qlgcFpR.js} +1 -1
  170. package/dist/client/assets/{legacy-main-redirect-BdCKFNea.js → legacy-main-redirect-DJSSnCFn.js} +1 -1
  171. package/dist/client/assets/library-BT8MDbGE.js +1 -0
  172. package/dist/client/assets/{library-tab-Bce9HVRy.js → library-tab-D9vHUslE.js} +1 -1
  173. package/dist/client/assets/{login-FL-FWaUd.js → login-CXb7XfpW.js} +1 -1
  174. package/dist/client/assets/{markdown-npeX6Dvn.js → markdown-CbS8bzQj.js} +1 -1
  175. package/dist/client/assets/{mcp-app-renderer-BEYyNxBF.js → mcp-app-renderer-BtTj1I1A.js} +1 -1
  176. package/dist/client/assets/{mcp-oauth-DNfjV_-l.js → mcp-oauth-ClbbuLRW.js} +1 -1
  177. package/dist/client/assets/{members-BrVLMdZe.js → members-CDgN8Dmx.js} +1 -1
  178. package/dist/client/assets/{memory-Cu-GI3KY.js → memory-z1AwNIL_.js} +1 -1
  179. package/dist/client/assets/{message-templates-C9Ae73D3.js → message-templates-BEgMVTC5.js} +1 -1
  180. package/dist/client/assets/{mini-report-page-CTSRrcPg.js → mini-report-page-BD35Q2tB.js} +1 -1
  181. package/dist/client/assets/{mock-board-DVx1bLDB.js → mock-board-n9VluIvN.js} +1 -1
  182. package/dist/client/assets/{monaco-editor-DTjt4Gvf.js → monaco-editor-CWEy2Wmz.js} +1 -1
  183. package/dist/client/assets/{monitoring-stats-row-IPvge-Ql.js → monitoring-stats-row-CgOhkmn3.js} +1 -1
  184. package/dist/client/assets/{multi-select-C0pIDv4l.js → multi-select-C7Irc4wP.js} +1 -1
  185. package/dist/client/assets/{mustache-B86FuZTo.js → mustache-CEPRFGIa.js} +1 -1
  186. package/dist/client/assets/{new-project-dialog-Cf4og9hp.js → new-project-dialog-Bmu4ROdM.js} +1 -1
  187. package/dist/client/assets/{oauth-callback-DsxCT0Rg.js → oauth-callback-8Vm2F8OH.js} +1 -1
  188. package/dist/client/assets/{oauth-callback-ai-provider-B0Qj3jqd.js → oauth-callback-ai-provider-CzLoL-4K.js} +1 -1
  189. package/dist/client/assets/{onboarding-CaL1NynW.js → onboarding-Cs5e4xpz.js} +1 -1
  190. package/dist/client/assets/{openai-conversation-8bTGXza9.js → openai-conversation-DTYW8Nmt.js} +1 -1
  191. package/dist/client/assets/{optimistic-project-sidebar-views-CdcnoHMx.js → optimistic-project-sidebar-views-BUiqS2uK.js} +1 -1
  192. package/dist/client/assets/{org-file-open-context-CbfDthkV.js → org-file-open-context-Crp_VOcp.js} +1 -1
  193. package/dist/client/assets/{organization-choice-Bpd56bKF.js → organization-choice-CVTsLYoj.js} +1 -1
  194. package/dist/client/assets/{orgs-CaUdOCVi.js → orgs-CMBD-Ecp.js} +1 -1
  195. package/dist/client/assets/{page-seo-form-BFvo8crB.js → page-seo-form-DZ-tFdem.js} +1 -1
  196. package/dist/client/assets/{pair-qTA6WdF2.js → pair-C5MP6tmI.js} +1 -1
  197. package/dist/client/assets/{plan-ladder-B5Jixr7W.js → plan-ladder-BS_j29A8.js} +1 -1
  198. package/dist/client/assets/{popover-BzkBJGwj.js → popover-DiGkaZQG.js} +1 -1
  199. package/dist/client/assets/{post-calendar-BHQVcnMM.js → post-calendar-Bh1a7pzf.js} +1 -1
  200. package/dist/client/assets/{post-editor-C3uCwQ-d.js → post-editor-BK7Sv69A.js} +1 -1
  201. package/dist/client/assets/{preview-content-bTvDgjfl.js → preview-content-D26Qem-Y.js} +1 -1
  202. package/dist/client/assets/{preview-dialog-CLFTRCuY.js → preview-dialog-BF1ke6DE.js} +1 -1
  203. package/dist/client/assets/{profile-Dw0WQchl.js → profile-CNd7A2Gx.js} +1 -1
  204. package/dist/client/assets/{project-app-view-CfVgbcC9.js → project-app-view-CVyo8em-.js} +1 -1
  205. package/dist/client/assets/{project-feed-D1BIbHU5.js → project-feed-RRFZCFHK.js} +1 -1
  206. package/dist/client/assets/{project-icon-CFM_cw8o.js → project-icon-CXi3E4T2.js} +1 -1
  207. package/dist/client/assets/project-reports-C3bvGgip.js +1 -0
  208. package/dist/client/assets/project-tasks-DQ-t9ZQ0.js +1 -0
  209. package/dist/client/assets/{projects-DGayh67M.js → projects-DhDrpc2w.js} +1 -1
  210. package/dist/client/assets/{projects-empty-state-DjN6gjQD.js → projects-empty-state-uTdhn7up.js} +1 -1
  211. package/dist/client/assets/{prompts-BnFQvE8i.js → prompts-DbghR4VL.js} +1 -1
  212. package/dist/client/assets/record-editor-fQo5Y3o_.js +1 -0
  213. package/dist/client/assets/{redirect-editor-Du01ASpa.js → redirect-editor-Cyu7m0VD.js} +1 -1
  214. package/dist/client/assets/{reports-DC_p6jvC.js → reports-BilzDLyr.js} +1 -1
  215. package/dist/client/assets/reports-DGyFA0YC.js +1 -0
  216. package/dist/client/assets/{reports-onboarding-C3KYMwju.js → reports-onboarding-x2N1hyxW.js} +1 -1
  217. package/dist/client/assets/{reports-tab-Ctc7ePZA.js → reports-tab-Y4dGdrCw.js} +2 -2
  218. package/dist/client/assets/{repositories-CbVwqqBr.js → repositories-Byiu79Lf.js} +1 -1
  219. package/dist/client/assets/{repository-binding-JChFqkvS.js → repository-binding-rygwFtUU.js} +1 -1
  220. package/dist/client/assets/{repository-import-picker-NG5IIZpH.js → repository-import-picker-CMch2yXk.js} +1 -1
  221. package/dist/client/assets/{repository-picker-DZKt8b9q.js → repository-picker-DmMyT9uL.js} +1 -1
  222. package/dist/client/assets/{require-capability-jw-5LosR.js → require-capability-BOLN4wlq.js} +1 -1
  223. package/dist/client/assets/{required-auth-layout-DNnKhVnU.js → required-auth-layout-BaGMTRsq.js} +1 -1
  224. package/dist/client/assets/{reset-password-ZXs-mNLl.js → reset-password-VpKsYnOO.js} +1 -1
  225. package/dist/client/assets/{resizable-DxIrekeJ.js → resizable-B8UplbG9.js} +1 -1
  226. package/dist/client/assets/{resolve-tab-icon-BVcp3jJe.js → resolve-tab-icon-BBNKRvUX.js} +1 -1
  227. package/dist/client/assets/{review-settings-BBodJBzm.js → review-settings-Bg3gl59w.js} +1 -1
  228. package/dist/client/assets/{rich-text-link-control-CXkIRZhg.js → rich-text-link-control-Dtfq7e19.js} +1 -1
  229. package/dist/client/assets/{roles-zeY4MMAw.js → roles-DUiIBEus.js} +1 -1
  230. package/dist/client/assets/{route-B0c_8Y-t.js → route-BT7O0_Ir.js} +1 -1
  231. package/dist/client/assets/{route-BuqKjWBF.js → route-DBoucnX-.js} +1 -1
  232. package/dist/client/assets/route-P9yHnvom.js +1 -0
  233. package/dist/client/assets/{runnable-block-editor-CtVc7nrS.js → runnable-block-editor-BoFLRoxE.js} +1 -1
  234. package/dist/client/assets/{sandbox-lifecycle-context-COX6jko8.js → sandbox-lifecycle-context-CwQvVUN0.js} +1 -1
  235. package/dist/client/assets/{schema-C5rDsgZa.js → schema-D38GSwTR.js} +1 -1
  236. package/dist/client/assets/{scroll-area-CD247Puy.js → scroll-area-CMu3xzBy.js} +1 -1
  237. package/dist/client/assets/{search-input-B0oqfDX0.js → search-input-nZG5K7zX.js} +1 -1
  238. package/dist/client/assets/{search-toggle-CUD4gUyI.js → search-toggle-C5lsyKed.js} +1 -1
  239. package/dist/client/assets/{secret-picker-CI5SFXlz.js → secret-picker-DcIMyJMq.js} +1 -1
  240. package/dist/client/assets/{secrets-DMHBZ5b-.js → secrets-k9ofAEIC.js} +1 -1
  241. package/dist/client/assets/{sections-editor-DX78q9L5.js → sections-editor-ClENwd-n.js} +1 -1
  242. package/dist/client/assets/{select-BgBtUQbR.js → select-DNyFjSYg.js} +1 -1
  243. package/dist/client/assets/{select-model-BuabH7uX.js → select-model-Ob1Ytd6l.js} +1 -1
  244. package/dist/client/assets/{seo-editor-Bi2Y_Hq4.js → seo-editor-M7JSsuZE.js} +1 -1
  245. package/dist/client/assets/{separator-CfAX-CZE.js → separator-BFCJgJ_0.js} +1 -1
  246. package/dist/client/assets/{settings-tab-LAvWxx2s.js → settings-tab-CIXZsK00.js} +1 -1
  247. package/dist/client/assets/{sheet-D6pV4Eay.js → sheet-DYd28Fb7.js} +1 -1
  248. package/dist/client/assets/{shell-layout-DZwsj6tm.js → shell-layout-Dix32M24.js} +1 -1
  249. package/dist/client/assets/{skills-Bu1-kQnU.js → skills-DlWHM8Lq.js} +1 -1
  250. package/dist/client/assets/{sso-D2qJfsnQ.js → sso-CND-Sq4S.js} +1 -1
  251. package/dist/client/assets/{suggestion-CxAnGtnm.js → suggestion-CPJmHCe_.js} +1 -1
  252. package/dist/client/assets/{switch-F41L6dpN.js → switch-ZiO5P7k4.js} +1 -1
  253. package/dist/client/assets/{synced-repos-BPSH3MWj.js → synced-repos-BCPBok84.js} +1 -1
  254. package/dist/client/assets/{tab-icon-glyph-DzWhA8K9.js → tab-icon-glyph-DLiZkLIB.js} +1 -1
  255. package/dist/client/assets/{table-9HMGEyIJ.js → table-e3ZyDjwe.js} +1 -1
  256. package/dist/client/assets/{tabs-28356LbY.js → tabs-D81IF5HZ.js} +1 -1
  257. package/dist/client/assets/{task-board-Bwhtxe11.js → task-board-CWJgeu7Z.js} +1 -1
  258. package/dist/client/assets/{task-route-CQZICp4O.js → task-route-Bv6rVEq1.js} +1 -1
  259. package/dist/client/assets/{task-status-BKUG0suF.js → task-status-q2zy99n1.js} +1 -1
  260. package/dist/client/assets/{taskboard-analytics-Cijn2VAb.js → taskboard-analytics-BJyL2NNQ.js} +1 -1
  261. package/dist/client/assets/{tasks-SVHYdAQ9.js → tasks-CCkNOU1r.js} +1 -1
  262. package/dist/client/assets/tasks-DfgJkdfJ.js +1 -0
  263. package/dist/client/assets/{textarea-BgjIoA0a.js → textarea-PVngK0Di.js} +1 -1
  264. package/dist/client/assets/{thread-analytics-CJAwkwEl.js → thread-analytics-B1EKfHoB.js} +1 -1
  265. package/dist/client/assets/{thread-button-BFNgAW02.js → thread-button-jRtWzslL.js} +1 -1
  266. package/dist/client/assets/{thread-intent-CfYVTTpH.js → thread-intent-DkMl3Clw.js} +1 -1
  267. package/dist/client/assets/{thread-route-w0ePUXK3.js → thread-route-BRzPZsPr.js} +1 -1
  268. package/dist/client/assets/{thread-route-CSYBLpD5.js → thread-route-C9fk2CbW.js} +1 -1
  269. package/dist/client/assets/{thread-sheet-body-BzJujnLG.js → thread-sheet-body-Ceh-gQcv.js} +1 -1
  270. package/dist/client/assets/{toggle-group-f3cK2guz.js → toggle-group-Dc2uUHWD.js} +1 -1
  271. package/dist/client/assets/{toolbar-icon-button-VgyXKzQb.js → toolbar-icon-button-BVZ6tXmv.js} +1 -1
  272. package/dist/client/assets/{tooltip-DRbwF15X.js → tooltip-jK__fCo4.js} +1 -1
  273. package/dist/client/assets/{track-CpccMuBV.js → track-CbkWmrSD.js} +1 -1
  274. package/dist/client/assets/{types-xvRKIUh5.js → types-D3Y6TAqK.js} +1 -1
  275. package/dist/client/assets/{usage-stats-4-mJM_Ny.js → usage-stats-C7VDzGYl.js} +1 -1
  276. package/dist/client/assets/{use-ai-providers-C6jAJjpy.js → use-ai-providers-DfehKmIZ.js} +1 -1
  277. package/dist/client/assets/{use-automations-DW9RBnQP.js → use-automations-Dhxqirb4.js} +1 -1
  278. package/dist/client/assets/{use-autosave-CXmVaIbs.js → use-autosave-OyP0ttSE.js} +1 -1
  279. package/dist/client/assets/{use-chat-layout-state-YLz0zkkr.js → use-chat-layout-state-CqvKxYcd.js} +1 -1
  280. package/dist/client/assets/{use-clock-tick-wePDDvbf.js → use-clock-tick-bRYO-Rnq.js} +1 -1
  281. package/dist/client/assets/{use-connect-companion-CHb1DnmY.js → use-connect-companion-BWZLgFxk.js} +1 -1
  282. package/dist/client/assets/{use-connection-DPn99Ne3.js → use-connection-CNR2pmSM.js} +1 -1
  283. package/dist/client/assets/{use-copy-BQq90EWC.js → use-copy-DTgTF3rB.js} +1 -1
  284. package/dist/client/assets/{use-create-virtual-mcp-CMvC1FaJ.js → use-create-virtual-mcp-DE06yanc.js} +1 -1
  285. package/dist/client/assets/{use-date-fns-locale-Dw9npfv_.js → use-date-fns-locale-XYU3tVXv.js} +1 -1
  286. package/dist/client/assets/{use-debounced-autosave-Bp7ZbYT_.js → use-debounced-autosave-BZFchJN4.js} +1 -1
  287. package/dist/client/assets/{use-debounced-value-ABLDNwmN.js → use-debounced-value-CVxm5Do1.js} +1 -1
  288. package/dist/client/assets/{use-deco-credits-B7tO3-nF.js → use-deco-credits-DiEJ9aQR.js} +1 -1
  289. package/dist/client/assets/{use-decopilot-events-12vOrgcO.js → use-decopilot-events-0kg2dbb1.js} +1 -1
  290. package/dist/client/assets/{use-delete-connection-Qy8Crcvm.js → use-delete-connection-DkMNwEdI.js} +1 -1
  291. package/dist/client/assets/{use-deployment-admin-CeqkmFsj.js → use-deployment-admin-ywArJLll.js} +1 -1
  292. package/dist/client/assets/{use-fast-preview-draft-url-DzyQ0ge6.js → use-fast-preview-draft-url-qZiFROwq.js} +1 -1
  293. package/dist/client/assets/{use-file-configs-DOgSoqwq.js → use-file-configs-C194rQrE.js} +1 -1
  294. package/dist/client/assets/{use-infinite-scroll-BwyMk9UX.js → use-infinite-scroll-fz45Cy3c.js} +1 -1
  295. package/dist/client/assets/{use-join-requests-rPLnsPn6.js → use-join-requests-CroNt5uC.js} +1 -1
  296. package/dist/client/assets/{use-main-panel-tabs-D42qBZW9.js → use-main-panel-tabs-Crf-H9Ck.js} +1 -1
  297. package/dist/client/assets/{use-mcp-auth-status-BgZ-LE-_.js → use-mcp-auth-status-8ysc0TdM.js} +1 -1
  298. package/dist/client/assets/{use-mcp-client-CmW-CbmL.js → use-mcp-client-BGBcJfvU.js} +1 -1
  299. package/dist/client/assets/{use-mcp-prompts-DmPn5bN4.js → use-mcp-prompts-Bl7YpvT7.js} +1 -1
  300. package/dist/client/assets/{use-mcp-tools-JEz2u8-E.js → use-mcp-tools-fghoMnAo.js} +1 -1
  301. package/dist/client/assets/{use-members-zd75VUjT.js → use-members-BFzPg9DY.js} +1 -1
  302. package/dist/client/assets/{use-mobile-CdJjslx1.js → use-mobile-aquWF07B.js} +1 -1
  303. package/dist/client/assets/{use-navigate-to-agent-BoqkOdWC.js → use-navigate-to-agent-nkJg8O6N.js} +1 -1
  304. package/dist/client/assets/use-new-blocks-editor-D7CDsp29.js +1 -0
  305. package/dist/client/assets/{use-open-billing-url-B2MlLvJS.js → use-open-billing-url-CfSIGf8I.js} +1 -1
  306. package/dist/client/assets/{use-org-auth-client-DJFH34Mt.js → use-org-auth-client-BS1yNddv.js} +1 -1
  307. package/dist/client/assets/{use-org-fs-39Wz8rpU.js → use-org-fs-Xkb3iQn6.js} +1 -1
  308. package/dist/client/assets/{use-org-repo-syncs-Be91hjO3.js → use-org-repo-syncs-BuNTUtHD.js} +1 -1
  309. package/dist/client/assets/{use-org-sso-C-JMGiGS.js → use-org-sso-AI0KysNs.js} +1 -1
  310. package/dist/client/assets/{use-organization-roles-BKbuiSkF.js → use-organization-roles-D5TQuPKT.js} +1 -1
  311. package/dist/client/assets/{use-organization-settings-PXdLuNB9.js → use-organization-settings-BjL-KIcf.js} +1 -1
  312. package/dist/client/assets/{use-panel-navigate-D8_cxPJw.js → use-panel-navigate-vUjkTeRK.js} +1 -1
  313. package/dist/client/assets/{use-project-scope-Cv9ae9Ib.js → use-project-scope-EPuSPnhc.js} +1 -1
  314. package/dist/client/assets/{use-releases-C4vordN8.js → use-releases-CdRENGAZ.js} +1 -1
  315. package/dist/client/assets/{use-reports-diagnostic-B0fQh9dS.js → use-reports-diagnostic-DTL4fmvJ.js} +1 -1
  316. package/dist/client/assets/{use-secrets-Dh7U4HYj.js → use-secrets-CFvn68u4.js} +1 -1
  317. package/dist/client/assets/{use-section-preview-base-CR8mR1xB.js → use-section-preview-base-CjzKsAiD.js} +1 -1
  318. package/dist/client/assets/{use-session-runtime-D08Kep-m.js → use-session-runtime-CjMZc55F.js} +1 -1
  319. package/dist/client/assets/{use-tags-Dx_EaUo4.js → use-tags-nAtiuLhp.js} +1 -1
  320. package/dist/client/assets/{use-task-board-analytics-DfLR40s2.js → use-task-board-analytics-DGRYiUDJ.js} +1 -1
  321. package/dist/client/assets/{use-task-board-events-LvNi14dX.js → use-task-board-events-DYNk8AbJ.js} +1 -1
  322. package/dist/client/assets/{use-task-metadata-BEkBKOHv.js → use-task-metadata-SNGtaGxh.js} +1 -1
  323. package/dist/client/assets/{use-thread-analytics-CMsFZWvm.js → use-thread-analytics-BWj-iEGz.js} +1 -1
  324. package/dist/client/assets/{use-thread-outputs-BESubVM6.js → use-thread-outputs-BmJ_6OMW.js} +1 -1
  325. package/dist/client/assets/useInfiniteQuery-YfMLN54l.js +1 -0
  326. package/dist/client/assets/{useQueries-BVMdi_8j.js → useQueries-BP6syEbP.js} +1 -1
  327. package/dist/client/assets/useSuspenseInfiniteQuery-D12YW3Fz.js +1 -0
  328. package/dist/client/assets/{users-B5m9h87F.js → users-DNA_PGfC.js} +1 -1
  329. package/dist/client/assets/{utils-COR5sFjS.js → utils-BfD_oePk.js} +1 -1
  330. package/dist/client/assets/{variant-calendar-BsdnBVEZ.js → variant-calendar-DVUzd2f4.js} +1 -1
  331. package/dist/client/assets/{variant-matcher-override-b_ipBYkQ.js → variant-matcher-override-2G_9KQMP.js} +1 -1
  332. package/dist/client/assets/{view-mode-toggle-CQXn8Fs1.js → view-mode-toggle-ChV__WZh.js} +1 -1
  333. package/dist/client/assets/{virtual-mcp-LWC4V-2f.js → virtual-mcp-Dlg1yt61.js} +1 -1
  334. package/dist/client/index.html +1 -1
  335. package/dist/server/cli.js +2 -2
  336. package/dist/server/server.js +2 -2
  337. package/package.json +1 -1
  338. package/dist/client/assets/agent-app-Dyz8djHw.js +0 -1
  339. package/dist/client/assets/agent-deck-C5gRcDS2.js +0 -1
  340. package/dist/client/assets/agent-library-BhP6I_uS.js +0 -1
  341. package/dist/client/assets/agent-library-file-7ZIb4WIP.js +0 -1
  342. package/dist/client/assets/agent-settings-B5agphmp.js +0 -1
  343. package/dist/client/assets/agent-site-editor-code-BgLLWnwl.js +0 -2
  344. package/dist/client/assets/agent-view-B0bKIQvA.js +0 -1
  345. package/dist/client/assets/api-keys-CeG0QqxF.js +0 -1
  346. package/dist/client/assets/app-editor-R-Fk_pH9.js +0 -1
  347. package/dist/client/assets/flat-project-DRIXZZ_f.js +0 -1
  348. package/dist/client/assets/library-Cx7QZ5Pb.js +0 -1
  349. package/dist/client/assets/project-reports-G2lJWAZT.js +0 -1
  350. package/dist/client/assets/project-tasks-D4cxeI9B.js +0 -1
  351. package/dist/client/assets/record-editor-C9YZwrKG.js +0 -1
  352. package/dist/client/assets/reports-HUnDHvKz.js +0 -1
  353. package/dist/client/assets/route-CyP5dpSv.js +0 -1
  354. package/dist/client/assets/tasks-BdpOoIPv.js +0 -1
  355. package/dist/client/assets/use-new-blocks-editor-DAABxnGt.js +0 -1
  356. package/dist/client/assets/useInfiniteQuery-BlfFwct6.js +0 -1
  357. package/dist/client/assets/useSuspenseInfiniteQuery-C1pF6UJx.js +0 -1
@@ -2195,7 +2195,7 @@ Usage: deco services <up|down|status>`),process.exit(1)}}var oZ$=L(()=>{au()});f
2195
2195
  `.execute($)}}async function mj4($){if(!await E41($,"kysely_migration"))return{};let{rows:Z}=await UT`
2196
2196
  SELECT name FROM kysely_migration
2197
2197
  `.execute($),Q=Z.map((X)=>X.name).filter((X)=>!Object.hasOwn(_K0,X));if(Q.length>0)console.warn(`Database has migrations this build does not know, assuming a newer release applied them: ${Q.join(", ")}`);return Object.fromEntries(Q.map((X)=>[X,{up:async()=>{}}]))}async function tG$($){await lj4($),await cj4($);let Z=new nG$({db:$,provider:{getMigrations:async()=>({...await mj4($),..._K0})}}),{error:Q,results:X}=await Z.migrateToLatest(),Y=0;if(X?.forEach((J)=>{if(J.status==="Success")Y++;else if(J.status==="Error")console.error(`Failed to execute migration "${J.migrationName}"`)}),Q)throw console.error("Failed to migrate"),console.error(Q),Q;return Y}async function dj4($){let{keepOpen:Z=!1,database:Q,skipBetterAuth:X=!1}=$??{},Y="skipped";if(!X&&!Q)Y=await Oe0();let J=Q??Z8(),G=async()=>{if(!Z&&!Q)await hj(J).catch((W)=>{console.warn("Warning: Error closing database:",W)})};try{let W=await tG$(J.db);return await G(),{betterAuth:Y,kysely:W}}catch(W){throw await G(),W}}async function ij4(){let $=Z8(),Z=new nG$({db:$.db,provider:{getMigrations:()=>Promise.resolve(_K0)}}),{error:Q,results:X}=await Z.migrateDown();if(X?.forEach((Y)=>{if(Y.status==="Success")console.log(`\u2705 Migration "${Y.migrationName}" rolled back successfully`);else if(Y.status==="Error")console.error(`\u274C Failed to rollback migration "${Y.migrationName}"`)}),Q)throw console.error("Failed to rollback migration"),console.error(Q),Q}var aG$=L(()=>{pG$();je0();hQ()});async function vK0($){let Z={...process.env},Q=EX0($,Z);console.log(r_1(Q.settings.encryptionKey));let X=Q.settings.betterAuthSecret||(Q.settings.localMode?gQ$(Q.settings.dataDir):""),{ensureServices:Y}=await Promise.resolve().then(() => (SW0(),CW0)),{outputs:J,services:G}=await Y({home:Q.settings.dataDir,externalDatabaseUrl:Q.externalDatabaseUrl,externalNatsUrl:Q.externalNatsUrl});if(!Q.skipMigrations){let{migrateBetterAuth:K}=await Promise.resolve().then(() => (je0(),uQ$));await K(J.databaseUrl);let{createDatabase:H}=await Promise.resolve().then(() => (hQ(),p7$)),{migrateToLatest:F}=await Promise.resolve().then(() => (aG$(),oG$)),U=H(J.databaseUrl);await F({keepOpen:!0,database:U,skipBetterAuth:!0})}let W={...Q.settings,betterAuthSecret:X,databaseUrl:J.databaseUrl,natsUrls:J.natsUrls,...J.s3?{s3Endpoint:J.s3.endpoint,s3Bucket:J.s3.bucket,s3AccessKeyId:J.s3.accessKeyId,s3SecretAccessKey:J.s3.secretAccessKey,s3ForcePathStyle:J.s3.forcePathStyle}:{}};return aZ$(W),{settings:W,services:G.map((K)=>({name:K.name==="PostgreSQL"?"Postgres":K.name,port:K.port})),managedServiceNames:G.filter((K)=>K.owner==="managed").map((K)=>K.name)}}var z41=L(()=>{au();hQ$();Y$()});var $3$={};G0($3$,{updateService:()=>NT,subscribeCliState:()=>A41,setTuiConsoleIntercepted:()=>xK0,setServerUrl:()=>hs,setMigrationsDone:()=>gs,setDevMode:()=>nj4,resetCliStateForTests:()=>pj4,isTuiConsoleIntercepted:()=>fK0,getCliState:()=>T41,addLogEntry:()=>ij});function rG$(){return[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}]}function sG$(){return{services:rG$(),migrationsStatus:"pending",serverUrl:null,logs:[]}}function pj4(){_J=sG$()}function ys(){for(let $ of P41)$()}function T41(){return _J}function A41($){return P41.add($),()=>P41.delete($)}function NT($){_J={..._J,services:_J.services.map((Z)=>Z.name===$.name?$:Z)},ys()}function gs(){_J={..._J,migrationsStatus:"done"},ys()}function hs($){_J={..._J,serverUrl:$},ys()}function ij($){let Z=[..._J.logs,$];_J={..._J,logs:Z.length>500?Z.slice(-500):Z},ys()}function nj4(){_J={..._J,services:[...rG$(),{name:"API",status:"pending",port:0},{name:"Vite",status:"pending",port:0}]},ys()}function xK0($){eG$=$}function fK0(){return eG$}var _J,P41,eG$=!1;var BT=L(()=>{_J=sG$();P41=new Set});import{createServer as Z3$}from"net";function tj4($){return new Promise((Z)=>{let Q=Z3$();Q.once("error",()=>Z(!1)),Q.listen($,"0.0.0.0",()=>{Q.close(()=>Z(!0))})})}async function us($){if(await tj4($))return $;let Z=await new Promise((Q,X)=>{let Y=Z3$();Y.once("error",X),Y.listen(0,"0.0.0.0",()=>{let J=Y.address(),G=typeof J==="object"&&J?J.port:0;Y.close(()=>Q(G))})});return console.warn(`Port ${$} is in use, using port ${Z} instead.`),Z}var R41=()=>{};var M41={};G0(M41,{startDevServer:()=>aj4,pipeToLogStore:()=>q41});import{join as oj4}from"path";function q41($){let Z=$.getReader(),Q=new TextDecoder,X="";function Y(){let J=X.split(`
2198
- `);X=J.pop()??"";for(let G of J){let W=Bun.stripANSI(G).replace(/^\[\d+\]\s*/,"").trim();if(!W)continue;ij({method:"",path:"",status:0,duration:0,timestamp:new Date,rawLine:W})}}(async()=>{try{for(;;){let{done:J,value:G}=await Z.read();if(J)break;X+=Q.decode(G,{stream:!0}),Y()}}catch{}if(X.trim()){let J=Bun.stripANSI(X).replace(/^\[\d+\]\s*/,"").trim();if(J)ij({method:"",path:"",status:0,duration:0,timestamp:new Date,rawLine:J})}})()}async function aj4($){let{baseUrl:Z,noTui:Q}=$,X=process.env.HOST==="0.0.0.0"&&Boolean(process.env.PORT),Y=X?process.env.PORT:$.vitePort,J=Z||`http://localhost:${Y}`,G=X?await us(Number(Y)+1):await us(Number($.port)),{settings:W,services:K,managedServiceNames:H}=await vK0({port:String(G),home:$.home,baseUrl:$.baseUrl,localMode:$.localMode,skipMigrations:$.skipMigrations,noTui:$.noTui,vitePort:$.vitePort});for(let O of K)NT({name:O.name,status:"ready",port:O.port});gs();let F=oj4(import.meta.dir,"..","..","..","..",".."),U=Q===!0,N=Bun.spawn(["bun","run","dev:servers"],{cwd:F,env:{...process.env,PORT:String(W.port),VITE_PORT:String(Y),DATABASE_URL:W.databaseUrl,NATS_URL:W.natsUrls.join(","),NODE_ENV:W.nodeEnv,BASE_URL:J,DECOCMS_LOCAL_MODE:String(W.localMode),DECOCMS_HOME:W.dataDir,DATA_DIR:W.dataDir,DECO_CLI:"1",...W.betterAuthSecret?{BETTER_AUTH_SECRET:W.betterAuthSecret}:{},...W.s3Endpoint?{S3_ENDPOINT:W.s3Endpoint,S3_BUCKET:W.s3Bucket??"",S3_ACCESS_KEY_ID:W.s3AccessKeyId??"",S3_SECRET_ACCESS_KEY:W.s3SecretAccessKey??"",S3_FORCE_PATH_STYLE:String(W.s3ForcePathStyle)}:{},...W.natsCredsPath?{NATS_CREDS:W.natsCredsPath}:{}},stdio:["inherit",U?"inherit":"pipe",U?"inherit":"pipe"]});if(!U)q41(N.stdout),q41(N.stderr);hs(J),NT({name:"Vite",status:"ready",port:Number(Y)}),NT({name:"API",status:"ready",port:Number(W.port)});let D=async(O)=>{if(N.kill(O),await N.exited,H.length>0){let{stopServices:j}=await Promise.resolve().then(() => (SW0(),CW0));await j(W.dataDir)}};return process.on("SIGINT",()=>D("SIGINT")),process.on("SIGTERM",()=>D("SIGTERM")),{port:Number(Y),process:N}}var I41=L(()=>{z41();BT();R41()});var bK0;var V41=L(()=>{bK0={name:"decocms",version:"4.443.1",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^4.0.58","@ai-sdk/google":"^4.0.76","@ai-sdk/openai":"^4.0.71","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^3.1.0","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^4.0.17","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^7.0.107","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});import{Box as sj4,Text as Q3$}from"ink";import{jsx as ej4,jsxs as X3$}from"react/jsx-runtime";function Y3$({version:$}){return X3$(sj4,{flexDirection:"column",marginTop:1,children:[ZK0.map((Z,Q)=>ej4(Q3$,{color:QK0[Q],children:Z},Q)),X3$(Q3$,{dimColor:!0,children:[" v",$]})]})}var J3$=L(()=>{Ps()});import{Box as LT,Text as pj}from"ink";import{Spinner as $w4}from"@inkjs/ui";import{jsx as sG,jsxs as qc}from"react/jsx-runtime";function G3$({status:$}){if($==="pending")return sG($w4,{label:""});return sG(pj,{color:"green",children:"\u2713"})}function Zw4($){return`${$.name}: ${$.port||"...."}`}function W3$({services:$,migrationsStatus:Z,home:Q,serverUrl:X}){return qc(LT,{flexDirection:"column",paddingBottom:1,children:[sG(Y3$,{version:bK0.version}),sG(LT,{marginBottom:1,children:sG(pj,{dimColor:!0,children:"\u2500".repeat(80)})}),sG(LT,{children:qc(pj,{dimColor:!0,children:["Home: ",Q]})}),qc(LT,{gap:2,children:[$.map((Y)=>qc(LT,{gap:1,children:[sG(pj,{children:Zw4(Y)}),sG(G3$,{status:Y.status})]},Y.name)),qc(LT,{gap:1,children:[sG(pj,{children:"Migrations"}),sG(G3$,{status:Z})]})]}),sG(LT,{children:X?qc(pj,{children:["Open in browser: ",sG(pj,{color:"cyan",children:X})]}):sG(pj,{dimColor:!0,children:"Starting..."})})]})}var K3$=L(()=>{V41();J3$()});import{Box as Qw4,Text as ls}from"ink";import{jsx as k41,jsxs as C41}from"react/jsx-runtime";function Xw4($){if($>=500)return"red";if($>=400)return"yellow";if($>=300)return"cyan";return"green"}function H3$({logs:$}){return k41(Qw4,{flexDirection:"column",children:$.map((Z,Q)=>{if(Z.rawLine)return k41(ls,{dimColor:!0,children:Z.rawLine},Q);let X=Z.duration<1000?`${Z.duration}ms`:`${(Z.duration/1000).toFixed(1)}s`;return C41(ls,{children:[C41(ls,{dimColor:!0,children:[Z.method.padEnd(6)," ",Z.path.padEnd(30)," "]}),k41(ls,{color:Xw4(Z.status),children:Z.status}),C41(ls,{dimColor:!0,children:[" ",X.padStart(8)]})]},Q)})})}var F3$=()=>{};var S41={};G0(S41,{App:()=>Gw4});import{Box as Yw4}from"ink";import{useSyncExternalStore as Jw4}from"react";import{jsx as U3$,jsxs as Ww4}from"react/jsx-runtime";function Gw4({home:$}){let Z=Jw4(A41,T41);return Ww4(Yw4,{flexDirection:"column",children:[U3$(W3$,{services:Z.services,migrationsStatus:Z.migrationsStatus,home:$,serverUrl:Z.serverUrl}),U3$(H3$,{logs:Z.logs})]})}var _41=L(()=>{K3$();F3$();BT()});var _W="thread-gate",zL="decopilot-hosted-harness",PL="decopilot-hosted-harness-sandboxed",vW="automations",nj="background-tools",DT="task-board-github-reads";var N3$="13";function B3$($){return{name:"decocms",systemDatabaseUrl:$.systemDatabaseUrl,systemDatabaseSchemaName:"dbos",systemDatabasePoolSize:$.poolSize,runAdminServer:!1,executorID:$.executorID,applicationVersion:N3$,...$.listenQueues!==void 0?{listenQueues:$.listenQueues}:{}}}var L3$=()=>{};import Kw4 from"pg";async function O3$($,Z){let{databaseUrl:Q,lockTimeoutMs:X=Hw4}=$,Y=$.log??((K)=>console.log(K)),J=new Kw4.Client({connectionString:Q});await J.connect();let G=Date.now(),W=!1;try{while(!W){if(W=(await J.query("SELECT pg_try_advisory_lock($1) AS locked",[D3$.toString()])).rows[0]?.locked===!0,W)break;if(Date.now()-G>=X)throw Error(`Timed out after ${X}ms waiting for the DBOS migration lock. Another process is still migrating the dbos schema; this pod will restart and retry.`);await $$(Fw4)}let K=Date.now()-G;if(K>1000)Y(`[dbos] waited ${K}ms for the migration lock; another process migrated first`);return await Z()}finally{if(W)try{await J.query("SELECT pg_advisory_unlock($1)",[D3$.toString()])}catch{}await J.end().catch(()=>{})}}var D3$=8314027461559302n,Hw4=600000,Fw4=500;var j3$=L(()=>{$8()});function Uw4(){let $=(process.env.BUN_OPTIONS??"").split(/\s+/).filter(Boolean);return[...process.argv.slice(1),...$]}function v41($,Z){for(let Q=0;Q<$.length;Q++){let X=$[Q];if(X===void 0)continue;if(X===Z)return $[Q+1];if(X.startsWith(`${Z}=`))return X.slice(Z.length+1)}return}function w3$(){let $=Uw4();if($.includes("--cpu-prof")){console.log(JSON.stringify({msg:"cpu-profiling-active",dir:v41($,"--cpu-prof-dir")??process.cwd(),name:v41($,"--cpu-prof-name"),markdown:$.includes("--cpu-prof-md"),intervalUs:Number(v41($,"--cpu-prof-interval")??1000),note:"profile is written on process exit"}));return}if(process.env.CPU_PROFILE)console.warn(JSON.stringify({msg:"cpu-profiling-requested-but-inactive",hint:'CPU profiling is a Bun launch flag. Set BUN_OPTIONS="--cpu-prof --cpu-prof-md --cpu-prof-dir=/tmp" before starting the process.'}))}function E3$(){if(process.env.HEAP_WATCH!=="1")return()=>{};let $=Number(process.env.HEAP_WATCH_INTERVAL_MS??60000),Z=async()=>{let Q=JT();if(!Q)return;let X={};try{let{heapStats:Y}=await import("bun:jsc"),J=Y(),G=Object.entries(J.objectTypeCounts).sort((W,K)=>K[1]-W[1]).slice(0,20);X={objectCount:J.objectCount,heapSize:J.heapSize,top:Object.fromEntries(G)}}catch{}console.log(JSON.stringify({msg:"heap-watch",ts:new Date().toISOString(),uptimeS:Math.round(process.uptime()),rss:Q.rss,heapUsed:Q.heapUsed,heapTotal:Q.heapTotal,external:Q.external,arrayBuffers:Q.arrayBuffers,...X}))};return Z().catch(()=>{}),yK0=setInterval(()=>void Z().catch(()=>{}),$),yK0.unref?.(),process.on("SIGUSR2",()=>{try{let Q=Bun.generateHeapSnapshot("v8"),X=typeof Q==="string"?Q:JSON.stringify(Q),Y=`/tmp/heap-${process.pid}-${Date.now()}.heapsnapshot`;Bun.write(Y,X),console.log(JSON.stringify({msg:"heap-snapshot-written",path:Y}))}catch(Q){console.error("[heap-watch] snapshot failed:",Q)}}),()=>{if(yK0)clearInterval(yK0)}}var yK0;var z3$=()=>{};import*as Nw4 from"bun:jsc";function P3$(){if(process.env.STALL_WATCHDOG!=="1")return()=>{};let $=Number(process.env.STALL_WATCHDOG_MS??100),Z=Number(process.env.STALL_WATCHDOG_TICK_MS??50);try{Bw4()}catch(J){return console.error("[stall-watchdog] failed to start sampling profiler:",J),()=>{}}let Q,X=performance.now()+Z,Y=()=>{let J=performance.now(),G=J-X;X=J+Z;let W=[];try{W=Lw4()?.traces??[]}catch{}if(G>$&&W.length>0){let K=new Map;for(let F of W){let U=F.frames.find((D)=>D.sourceURL&&!/Unknown Executable/.test(D.category??""))??F.frames[0];if(!U)continue;let N=(U.sourceURL??"?").replace(/^.*\/node_modules\//,"node_modules/"),B=`${U.name??"?"} @ ${N}:${U.line??"?"}`;K.set(B,(K.get(B)??0)+1)}let H=[...K.entries()].sort((F,U)=>U[1]-F[1]).slice(0,8).map(([F,U])=>({frame:F,count:U}));console.warn(JSON.stringify({msg:"stall-stack",ts:new Date().toISOString(),lagMs:Math.round(G),samplesInWindow:W.length,top:H}))}Q=setTimeout(Y,Z),Q.unref?.()};return Q=setTimeout(Y,Z),Q.unref?.(),()=>{if(Q)clearTimeout(Q)}}var Bw4,Lw4;var T3$=L(()=>{({startSamplingProfiler:Bw4,samplingProfilerStackTraces:Lw4}=Nw4)});function A3$(){w3$();let $=[E3$(),y7$(),P3$()];return()=>{for(let Z of $)Z()}}var R3$=L(()=>{Ke0();z3$();T3$()});var OT=f((q3$)=>{Object.defineProperty(q3$,"__esModule",{value:!0});q3$.RepublishHeaders=q3$.DirectMsgHeaders=q3$.JsHeaders=q3$.AdvisoryKind=void 0;q3$.isOrderedPushConsumerOptions=Dw4;q3$.isPullConsumer=Ow4;q3$.isPushConsumer=jw4;q3$.isBoundPushConsumerOptions=ww4;function Dw4($){if($&&typeof $==="object")return"name_prefix"in $||"deliver_subject_prefix"in $||"filter_subjects"in $||"filter_subject"in $||"deliver_policy"in $||"opt_start_seq"in $||"opt_start_time"in $||"replay_policy"in $||"inactive_threshold"in $||"headers_only"in $||"deliver_prefix"in $;return!1}function Ow4($){return $.isPullConsumer()}function jw4($){return $.isPushConsumer()}function ww4($){if($&&typeof $==="object")return"deliver_subject"in $||"deliver_group"in $||"idle_heartbeat"in $;return!1}q3$.AdvisoryKind={API:"api_audit",StreamAction:"stream_action",ConsumerAction:"consumer_action",SnapshotCreate:"snapshot_create",SnapshotComplete:"snapshot_complete",RestoreCreate:"restore_create",RestoreComplete:"restore_complete",MaxDeliver:"max_deliver",Terminated:"terminated",Ack:"consumer_ack",StreamLeaderElected:"stream_leader_elected",StreamQuorumLost:"stream_quorum_lost",ConsumerLeaderElected:"consumer_leader_elected",ConsumerQuorumLost:"consumer_quorum_lost"};q3$.JsHeaders={StreamSourceHdr:"Nats-Stream-Source",LastConsumerSeqHdr:"Nats-Last-Consumer",LastStreamSeqHdr:"Nats-Last-Stream",ConsumerStalledHdr:"Nats-Consumer-Stalled",MessageSizeHdr:"Nats-Msg-Size",RollupHdr:"Nats-Rollup",RollupValueSubject:"sub",RollupValueAll:"all",PendingMessagesHdr:"Nats-Pending-Messages",PendingBytesHdr:"Nats-Pending-Bytes",RequiredApiLevel:"Nats-Required-Api-Level"};q3$.DirectMsgHeaders={Stream:"Nats-Stream",Sequence:"Nats-Sequence",TimeStamp:"Nats-Time-Stamp",Subject:"Nats-Subject",LastSequence:"Nats-Last-Sequence",NumPending:"Nats-Num-Pending"};q3$.RepublishHeaders={Stream:"Nats-Stream",Subject:"Nats-Subject",Sequence:"Nats-Sequence",LastSequence:"Nats-Last-Sequence",Size:"Nats-Msg-Size"}});var eG=f((I3$)=>{Object.defineProperty(I3$,"__esModule",{value:!0});I3$.TD=I3$.TE=I3$.Empty=void 0;I3$.encode=Iw4;I3$.decode=Vw4;I3$.Empty=new Uint8Array(0);I3$.TE=new TextEncoder;I3$.TD=new TextDecoder;function Mw4(...$){let Z=0;for(let Y=0;Y<$.length;Y++)Z+=$[Y].length;let Q=new Uint8Array(Z),X=0;for(let Y=0;Y<$.length;Y++)Q.set($[Y],X),X+=$[Y].length;return Q}function Iw4(...$){let Z=[];for(let Q=0;Q<$.length;Q++)Z.push(I3$.TE.encode($[Q]));if(Z.length===0)return I3$.Empty;if(Z.length===1)return Z[0];return Mw4(...Z)}function Vw4($){if(!$||$.length===0)return"";return I3$.TD.decode($)}});var $3=f((C3$)=>{Object.defineProperty(C3$,"__esModule",{value:!0});C3$.errors=C3$.PermissionViolationError=C3$.NoRespondersError=C3$.TimeoutError=C3$.RequestError=C3$.ProtocolError=C3$.ConnectionError=C3$.DrainingConnectionError=C3$.ClosedConnectionError=C3$.AuthorizationError=C3$.UserAuthenticationExpiredError=C3$.InvalidOperationError=C3$.InvalidArgumentError=C3$.InvalidSubjectError=void 0;class f41 extends Error{constructor($,Z){super(`illegal subject: '${$}'`,Z);this.name="InvalidSubjectError"}}C3$.InvalidSubjectError=f41;class gK0 extends Error{constructor($,Z){super($,Z);this.name="InvalidArgumentError"}static format($,Z,Q){if(Array.isArray(Z)&&Z.length>1)Z=Z[0];if(Array.isArray($))$=$.map((X)=>`'${X}'`),$=$.join(",");else $=`'${$}'`;return new gK0(`${$} ${Z}`,Q)}}C3$.InvalidArgumentError=gK0;class b41 extends Error{constructor($,Z){super($,Z);this.name="InvalidOperationError"}}C3$.InvalidOperationError=b41;class hK0 extends Error{constructor($,Z){super($,Z);this.name="UserAuthenticationExpiredError"}static parse($){if($.toLowerCase().indexOf("user authentication expired")!==-1)return new hK0($);return null}}C3$.UserAuthenticationExpiredError=hK0;class uK0 extends Error{constructor($,Z){super($,Z);this.name="AuthorizationError"}static parse($){let Z=["authorization violation","account authentication expired","authentication timeout"],Q=$.toLowerCase();for(let X=0;X<Z.length;X++)if(Q.indexOf(Z[X])!==-1)return new uK0($);return null}}C3$.AuthorizationError=uK0;class y41 extends Error{constructor(){super("closed connection");this.name="ClosedConnectionError"}}C3$.ClosedConnectionError=y41;class g41 extends Error{constructor(){super("connection draining");this.name="DrainingConnectionError"}}C3$.DrainingConnectionError=g41;class h41 extends Error{constructor($,Z){super($,Z);this.name="ConnectionError"}}C3$.ConnectionError=h41;class u41 extends Error{constructor($,Z){super($,Z);this.name="ProtocolError"}}C3$.ProtocolError=u41;class l41 extends Error{constructor($="",Z){super($,Z);this.name="RequestError"}isNoResponders(){return this.cause instanceof lK0}}C3$.RequestError=l41;class c41 extends Error{constructor($){super("timeout",$);this.name="TimeoutError"}}C3$.TimeoutError=c41;class lK0 extends Error{subject;constructor($,Z){super(`no responders: '${$}'`,Z);this.subject=$,this.name="NoResponders"}}C3$.NoRespondersError=lK0;class cK0 extends Error{operation;subject;queue;constructor($,Z,Q,X,Y){super($,Y);this.name="PermissionViolationError",this.operation=Z,this.subject=Q,this.queue=X}static parse($){if(($?$.toLowerCase():"").indexOf("permissions violation")===-1)return null;let Q="publish",X="",Y=void 0,J=$.match(/(Publish|Subscription) to "(\S+)"/);if(J){if(Q=J[1].toLowerCase(),X=J[2],Q==="subscription"){let G=$.match(/using queue "(\S+)"/);if(G)Y=G[1]}}return new cK0($,Q,X,Y)}}C3$.PermissionViolationError=cK0;C3$.errors={AuthorizationError:uK0,ClosedConnectionError:y41,ConnectionError:h41,DrainingConnectionError:g41,InvalidArgumentError:gK0,InvalidOperationError:b41,InvalidSubjectError:f41,NoRespondersError:lK0,PermissionViolationError:cK0,ProtocolError:u41,RequestError:l41,TimeoutError:c41,UserAuthenticationExpiredError:hK0}});var EH=f((f3$)=>{Object.defineProperty(f3$,"__esModule",{value:!0});f3$.SimpleMutex=f3$.Perf=void 0;f3$.extend=iw4;f3$.render=pw4;f3$.timeout=nw4;f3$.delay=tw4;f3$.deadline=ow4;f3$.deferred=d41;f3$.debugDeferred=aw4;f3$.shuffle=rw4;f3$.collect=sw4;f3$.jitter=x3$;f3$.backoff=ew4;f3$.nanos=$E4;f3$.millis=ZE4;f3$.randomToken=YE4;var dw4=eG(),m41=$3();function iw4($,...Z){for(let Q=0;Q<Z.length;Q++){let X=Z[Q];Object.keys(X).forEach(function(Y){$[Y]=X[Y]})}return $}function pw4($){return dw4.TD.decode($).replace(/\n/g,"\u240A").replace(/\r/g,"\u240D")}function nw4($,Z=!0){let Q=Z?new m41.TimeoutError:null,X,Y,J=new Promise((G,W)=>{X={cancel:()=>{if(Y)clearTimeout(Y)}},Y=setTimeout(()=>{if(Q===null)W(new m41.TimeoutError);else W(Q)},$)});return Object.assign(J,X)}function tw4($=0){let Z,Q=new Promise((X)=>{let Y=setTimeout(()=>{X()},$);Z={cancel:()=>{if(Y)clearTimeout(Y),X()}}});return Object.assign(Q,Z)}async function ow4($,Z=1000){let Q=d41(),X=setTimeout(()=>{Q.reject(new m41.TimeoutError)},Z);try{return await Promise.race([$,Q])}finally{clearTimeout(X)}}function d41(){let $={},Z=new Promise((Q,X)=>{$={resolve:Q,reject:X}});return Object.assign(Z,$)}function aw4(){let $={},Z=new Promise((Q,X)=>{$={resolve:(Y)=>{console.trace("resolve",Y),Q(Y)},reject:(Y)=>{console.trace("reject"),X(Y)}}});return Object.assign(Z,$)}function rw4($){for(let Z=$.length-1;Z>0;Z--){let Q=Math.floor(Math.random()*(Z+1));[$[Z],$[Q]]=[$[Q],$[Z]]}return $}async function sw4($){let Z=[];for await(let Q of $)Z.push(Q);return Z}class _3${timers;measures;constructor(){this.timers=new Map,this.measures=new Map}mark($){this.timers.set($,performance.now())}measure($,Z,Q){let X=this.timers.get(Z);if(X===void 0)throw Error(`${Z} is not defined`);let Y=this.timers.get(Q);if(Y===void 0)throw Error(`${Q} is not defined`);this.measures.set($,Y-X)}getEntries(){let $=[];return this.measures.forEach((Z,Q)=>{$.push({name:Q,duration:Z})}),$}}f3$.Perf=_3$;class v3${max;current;waiting;constructor($=1){this.max=$,this.current=0,this.waiting=[]}lock(){if(this.current++,this.current<=this.max)return Promise.resolve();let $=d41();return this.waiting.push($),$}unlock(){this.current--,this.waiting.pop()?.resolve()}}f3$.SimpleMutex=v3$;function x3$($){if($===0)return 0;return Math.floor($/2+Math.random()*$)}function ew4($=[0,250,250,500,500,3000,5000]){if(!Array.isArray($))$=[0,250,250,500,500,3000,5000];let Z=$.length-1;return{backoff(Q){return x3$(Q>Z?$[Z]:$[Q])}}}function $E4($){return $*1e6}function ZE4($){return Math.floor($/1e6)}var QE4="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",TL=new Uint8Array(62);for(let $=0;$<62;$++)TL[$]=QE4.charCodeAt($);var XE4=218340105584896;function YE4(){let $=Math.floor(Math.random()*XE4),Z=$%62,Q=TL[Z];$=($-Z)/62,Z=$%62;let X=TL[Z];$=($-Z)/62,Z=$%62;let Y=TL[Z];$=($-Z)/62,Z=$%62;let J=TL[Z];$=($-Z)/62,Z=$%62;let G=TL[Z];$=($-Z)/62,Z=$%62;let W=TL[Z];$=($-Z)/62,Z=$%62;let K=TL[Z];$=($-Z)/62;let H=TL[$];return String.fromCharCode(Q,X,Y,J,G,W,K,H)}});var m3$=f((l3$)=>{Object.defineProperty(l3$,"__esModule",{value:!0});l3$.nuid=l3$.NuidImpl=void 0;var zE4="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",tj=62,dK0=12,h3$=10,y3$=33,PE4=333,g3$=dK0+h3$,p41=new Uint8Array(tj);for(let $=0;$<tj;$++)p41[$]=zE4.charCodeAt($);var mK0=4294967296,u3$=BigInt(tj)**BigInt(h3$),cs=Number(u3$/(1n<<32n)),i41=Number(u3$%(1n<<32n));function TE4($){for(let Z=0;Z<$.length;Z++)$[Z]=Math.floor(Math.random()*256)}function AE4($){if(globalThis?.crypto?.getRandomValues)globalThis.crypto.getRandomValues($);else TE4($)}class n41{buf;cbuf;seqHi;seqLo;inc;inited;constructor(){this.buf=new Uint8Array(g3$),this.cbuf=new Uint8Array(dK0),this.inited=!1}init(){this.inited=!0,this.setPre(),this.initSeqAndInc(),this.fillSeq()}initSeqAndInc(){let $=0;do this.seqHi=Math.floor(Math.random()*(cs+1)),this.seqLo=Math.floor(Math.random()*mK0);while($++<8&&this.seqHi===cs&&this.seqLo>=i41);if(this.seqHi===cs&&this.seqLo>=i41)this.seqLo=0;this.inc=Math.random()*(PE4-y3$)+y3$|0}setPre(){AE4(this.cbuf);for(let $=0;$<dK0;$++)this.buf[$]=p41[this.cbuf[$]%tj]}fillSeq(){let $=this.seqHi,Z=this.seqLo;for(let Q=g3$-1;Q>=dK0;Q--){let X=Math.floor($/tj),J=($-X*tj)*mK0+Z,G=Math.floor(J/tj),W=J-G*tj;this.buf[Q]=p41[W],$=X,Z=G}}next(){if(!this.inited)this.init();if(this.seqLo+=this.inc,this.seqLo>=mK0)this.seqLo-=mK0,this.seqHi+=1;if(this.seqHi>cs||this.seqHi===cs&&this.seqLo>=i41)this.setPre(),this.initSeqAndInc();this.fillSeq();let $=this.buf;return String.fromCharCode($[0],$[1],$[2],$[3],$[4],$[5],$[6],$[7],$[8],$[9],$[10],$[11],$[12],$[13],$[14],$[15],$[16],$[17],$[18],$[19],$[20],$[21])}reset(){this.init()}}l3$.NuidImpl=n41;l3$.nuid=new n41});var n3$=f((i3$)=>{Object.defineProperty(i3$,"__esModule",{value:!0});i3$.nuid=i3$.Nuid=void 0;var d3$=m3$();i3$.Nuid=d3$.NuidImpl;i3$.nuid=d3$.nuid});var pK0=f((iK0)=>{Object.defineProperty(iK0,"__esModule",{value:!0});iK0.nuid=iK0.Nuid=void 0;var t3$=n3$();Object.defineProperty(iK0,"Nuid",{enumerable:!0,get:function(){return t3$.Nuid}});Object.defineProperty(iK0,"nuid",{enumerable:!0,get:function(){return t3$.nuid}})});var oj=f((o3$)=>{Object.defineProperty(o3$,"__esModule",{value:!0});o3$.DEFAULT_HOST=o3$.DEFAULT_PORT=o3$.Match=void 0;o3$.syncIterator=kE4;o3$.createInbox=CE4;var IE4=pK0(),VE4=$3();o3$.Match={Exact:"exact",CanonicalMIME:"canonical",IgnoreCase:"insensitive"};function kE4($){let Z=$[Symbol.asyncIterator]();return{async next(){let Q=await Z.next();if(Q.done)return Promise.resolve(null);return Promise.resolve(Q.value)}}}function CE4($=""){if($=$||"_INBOX",typeof $!=="string")throw TypeError("prefix must be a string");return $.split(".").forEach((Z)=>{if(Z==="*"||Z===">")throw VE4.InvalidArgumentError.format("prefix",`cannot have wildcards ('${$}')`)}),`${$}.${IE4.nuid.next()}`}o3$.DEFAULT_PORT=4222;o3$.DEFAULT_HOST="127.0.0.1"});var ms=f((e3$)=>{Object.defineProperty(e3$,"__esModule",{value:!0});e3$.DataBuffer=void 0;var r3$=eG();class s3${buffers;byteLength;constructor(){this.buffers=[],this.byteLength=0}static concat(...$){let Z=0;for(let Y=0;Y<$.length;Y++)Z+=$[Y].length;let Q=new Uint8Array(Z),X=0;for(let Y=0;Y<$.length;Y++)Q.set($[Y],X),X+=$[Y].length;return Q}static fromAscii($){if(!$)$="";return r3$.TE.encode($)}static toAscii($){return r3$.TD.decode($)}reset(){this.buffers.length=0,this.byteLength=0}pack(){if(this.buffers.length>1){let $=new Uint8Array(this.byteLength),Z=0;for(let Q=0;Q<this.buffers.length;Q++)$.set(this.buffers[Q],Z),Z+=this.buffers[Q].length;this.buffers.length=0,this.buffers.push($)}}shift(){if(this.buffers.length){let $=this.buffers.shift();if($)return this.byteLength-=$.length,$}return new Uint8Array(0)}drain($){if(this.buffers.length){this.pack();let Z=this.buffers.pop();if(Z){let Q=this.byteLength;if($===void 0||$>Q)$=Q;let X=Z.subarray(0,$);if(Q>$)this.buffers.push(Z.subarray($));return this.byteLength=Q-$,X}}return new Uint8Array(0)}fill($,...Z){if($)this.buffers.push($),this.byteLength+=$.length;for(let Q=0;Q<Z.length;Q++)if(Z[Q]&&Z[Q].length)this.buffers.push(Z[Q]),this.byteLength+=Z[Q].length}peek(){if(this.buffers.length)return this.pack(),this.buffers[0];return new Uint8Array(0)}size(){return this.byteLength}length(){return this.buffers.length}}e3$.DataBuffer=s3$});var jT=f((QW$)=>{Object.defineProperty(QW$,"__esModule",{value:!0});QW$.LF=QW$.CR=QW$.CRLF=QW$.CR_LF_LEN=QW$.CR_LF=void 0;QW$.setTransportFactory=gE4;QW$.defaultPort=hE4;QW$.getUrlParseFn=uE4;QW$.newTransport=lE4;QW$.getResolveFn=cE4;QW$.protoLen=ZW$;QW$.extractProtocolMessage=mE4;var fE4=eG(),bE4=oj(),yE4=ms(),Z3;function gE4($){Z3=$}function hE4(){return Z3!==void 0&&Z3.defaultPort!==void 0?Z3.defaultPort:bE4.DEFAULT_PORT}function uE4(){return Z3!==void 0&&Z3.urlParseFn?Z3.urlParseFn:void 0}function lE4(){if(!Z3||typeof Z3.factory!=="function")throw Error("transport fn is not set");return Z3.factory()}function cE4(){return Z3!==void 0&&Z3.dnsResolveFn?Z3.dnsResolveFn:void 0}QW$.CR_LF=`\r
2198
+ `);X=J.pop()??"";for(let G of J){let W=Bun.stripANSI(G).replace(/^\[\d+\]\s*/,"").trim();if(!W)continue;ij({method:"",path:"",status:0,duration:0,timestamp:new Date,rawLine:W})}}(async()=>{try{for(;;){let{done:J,value:G}=await Z.read();if(J)break;X+=Q.decode(G,{stream:!0}),Y()}}catch{}if(X.trim()){let J=Bun.stripANSI(X).replace(/^\[\d+\]\s*/,"").trim();if(J)ij({method:"",path:"",status:0,duration:0,timestamp:new Date,rawLine:J})}})()}async function aj4($){let{baseUrl:Z,noTui:Q}=$,X=process.env.HOST==="0.0.0.0"&&Boolean(process.env.PORT),Y=X?process.env.PORT:$.vitePort,J=Z||`http://localhost:${Y}`,G=X?await us(Number(Y)+1):await us(Number($.port)),{settings:W,services:K,managedServiceNames:H}=await vK0({port:String(G),home:$.home,baseUrl:$.baseUrl,localMode:$.localMode,skipMigrations:$.skipMigrations,noTui:$.noTui,vitePort:$.vitePort});for(let O of K)NT({name:O.name,status:"ready",port:O.port});gs();let F=oj4(import.meta.dir,"..","..","..","..",".."),U=Q===!0,N=Bun.spawn(["bun","run","dev:servers"],{cwd:F,env:{...process.env,PORT:String(W.port),VITE_PORT:String(Y),DATABASE_URL:W.databaseUrl,NATS_URL:W.natsUrls.join(","),NODE_ENV:W.nodeEnv,BASE_URL:J,DECOCMS_LOCAL_MODE:String(W.localMode),DECOCMS_HOME:W.dataDir,DATA_DIR:W.dataDir,DECO_CLI:"1",...W.betterAuthSecret?{BETTER_AUTH_SECRET:W.betterAuthSecret}:{},...W.s3Endpoint?{S3_ENDPOINT:W.s3Endpoint,S3_BUCKET:W.s3Bucket??"",S3_ACCESS_KEY_ID:W.s3AccessKeyId??"",S3_SECRET_ACCESS_KEY:W.s3SecretAccessKey??"",S3_FORCE_PATH_STYLE:String(W.s3ForcePathStyle)}:{},...W.natsCredsPath?{NATS_CREDS:W.natsCredsPath}:{}},stdio:["inherit",U?"inherit":"pipe",U?"inherit":"pipe"]});if(!U)q41(N.stdout),q41(N.stderr);hs(J),NT({name:"Vite",status:"ready",port:Number(Y)}),NT({name:"API",status:"ready",port:Number(W.port)});let D=async(O)=>{if(N.kill(O),await N.exited,H.length>0){let{stopServices:j}=await Promise.resolve().then(() => (SW0(),CW0));await j(W.dataDir)}};return process.on("SIGINT",()=>D("SIGINT")),process.on("SIGTERM",()=>D("SIGTERM")),{port:Number(Y),process:N}}var I41=L(()=>{z41();BT();R41()});var bK0;var V41=L(()=>{bK0={name:"decocms",version:"4.443.2",description:"Deco CMS \u2014 Self-hostable MCP Gateway for managing AI connections and tools",author:"Deco team",repository:{type:"git",url:"git+https://github.com/decocms/studio.git",directory:"apps/api"},bugs:{url:"https://github.com/decocms/studio/issues"},type:"module",bin:{deco:"./dist/server/cli.js"},files:["dist/**/*"],scripts:{dev:"bun run migrate && bun run dev:server","dev:server":"bun run --cwd=../../packages/sandbox build && NODE_ENV=development bun --env-file=.env --hot run src/index.ts",build:"bun run build:server","build:server":"bun run scripts/bundle-server-script.ts --dist ./dist/server","generate:tool-contracts":"bun run scripts/generate-tool-contracts.ts","db:migrate":"bun run ./dist/server/migrate.js","db:migrate:dbos":"bun run ./dist/server/migrate-dbos.js",check:"tsc --noEmit",start:"bun run ./dist/server/server.js",migrate:"bun run src/database/migrate.ts","migrate:dbos":"bun run src/database/migrate-dbos.ts",test:"bun test src","better-auth:migrate":"bunx --bun @better-auth/cli migrate -y --config src/auth/index.ts",prepublishOnly:"bun run --cwd=../.. build:studio"},optionalDependencies:{"@duckdb/node-api":"^1.5.0-r.1"},dependencies:{"@ai-sdk/anthropic":"^4.0.58","@ai-sdk/google":"^4.0.76","@ai-sdk/openai":"^4.0.71","@anthropic-ai/sdk":"^0.105.0","@aws-sdk/client-s3":"^3.1013.0","@aws-sdk/client-sts":"^3.1013.0","@aws-sdk/lib-storage":"^3.1013.0","@aws-sdk/s3-request-presigner":"^3.1013.0","@clickhouse/client":"^1.8.1","@dbos-inc/dbos-sdk":"^4.21.6","@inkjs/ui":"^2.0.0","@nats-io/jetstream":"3.4.0","@nats-io/kv":"3.4.0","@nats-io/nats-core":"3.4.0","@nats-io/transport-node":"3.4.0","@openrouter/ai-sdk-provider":"^3.1.0","@opentelemetry/core":"^2.6.0","embedded-postgres":"^18.3.0-beta.16",ink:"^6.8.0",kysely:"^0.28.12","posthog-node":"^5.0.0",react:"^19.2.6","react-dom":"^19.2.6"},devDependencies:{"@ai-sdk/provider":"^4.0.17","@better-auth/sso":"1.4.1","@decocms/better-auth":"1.5.17","@decocms/bindings":"workspace:*","@decocms/mcp-utils":"workspace:*","@decocms/runtime":"workspace:*","@decocms/sandbox":"workspace:*","@decocms/shared":"workspace:*","@jitl/quickjs-wasmfile-release-sync":"0.31.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.211.0","@opentelemetry/exporter-logs-otlp-proto":"^0.211.0","@opentelemetry/exporter-prometheus":"^0.208.0","@opentelemetry/exporter-trace-otlp-proto":"^0.207.0","@opentelemetry/instrumentation-runtime-node":"^0.24.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-logs":"^0.211.0","@opentelemetry/sdk-metrics":"^2.2.0","@opentelemetry/sdk-node":"^0.207.0","@opentelemetry/sdk-trace-base":"^2.5.0","@types/bun":"^1.3.1","@types/google.maps":"^3.65.2","@types/pg":"^8.15.6","@types/react-syntax-highlighter":"^15.5.13","@vercel/nft":"^1.1.1",ai:"^7.0.107","better-auth":"1.4.22",croner:"^9.1.0",degit:"^2.8.4",hono:"^4.10.7",jose:"^6.0.11",nanoid:"^5.1.6",pg:"^8.16.3",typescript:"^7.0.2",typescript5:"npm:typescript@^5.9.3",zod:"4.3.6"},homepage:"https://github.com/decocms/studio",keywords:["mcp","model-context-protocol","ai","gateway","self-hosted","tools"],license:"MIT",publishConfig:{access:"public"}}});import{Box as sj4,Text as Q3$}from"ink";import{jsx as ej4,jsxs as X3$}from"react/jsx-runtime";function Y3$({version:$}){return X3$(sj4,{flexDirection:"column",marginTop:1,children:[ZK0.map((Z,Q)=>ej4(Q3$,{color:QK0[Q],children:Z},Q)),X3$(Q3$,{dimColor:!0,children:[" v",$]})]})}var J3$=L(()=>{Ps()});import{Box as LT,Text as pj}from"ink";import{Spinner as $w4}from"@inkjs/ui";import{jsx as sG,jsxs as qc}from"react/jsx-runtime";function G3$({status:$}){if($==="pending")return sG($w4,{label:""});return sG(pj,{color:"green",children:"\u2713"})}function Zw4($){return`${$.name}: ${$.port||"...."}`}function W3$({services:$,migrationsStatus:Z,home:Q,serverUrl:X}){return qc(LT,{flexDirection:"column",paddingBottom:1,children:[sG(Y3$,{version:bK0.version}),sG(LT,{marginBottom:1,children:sG(pj,{dimColor:!0,children:"\u2500".repeat(80)})}),sG(LT,{children:qc(pj,{dimColor:!0,children:["Home: ",Q]})}),qc(LT,{gap:2,children:[$.map((Y)=>qc(LT,{gap:1,children:[sG(pj,{children:Zw4(Y)}),sG(G3$,{status:Y.status})]},Y.name)),qc(LT,{gap:1,children:[sG(pj,{children:"Migrations"}),sG(G3$,{status:Z})]})]}),sG(LT,{children:X?qc(pj,{children:["Open in browser: ",sG(pj,{color:"cyan",children:X})]}):sG(pj,{dimColor:!0,children:"Starting..."})})]})}var K3$=L(()=>{V41();J3$()});import{Box as Qw4,Text as ls}from"ink";import{jsx as k41,jsxs as C41}from"react/jsx-runtime";function Xw4($){if($>=500)return"red";if($>=400)return"yellow";if($>=300)return"cyan";return"green"}function H3$({logs:$}){return k41(Qw4,{flexDirection:"column",children:$.map((Z,Q)=>{if(Z.rawLine)return k41(ls,{dimColor:!0,children:Z.rawLine},Q);let X=Z.duration<1000?`${Z.duration}ms`:`${(Z.duration/1000).toFixed(1)}s`;return C41(ls,{children:[C41(ls,{dimColor:!0,children:[Z.method.padEnd(6)," ",Z.path.padEnd(30)," "]}),k41(ls,{color:Xw4(Z.status),children:Z.status}),C41(ls,{dimColor:!0,children:[" ",X.padStart(8)]})]},Q)})})}var F3$=()=>{};var S41={};G0(S41,{App:()=>Gw4});import{Box as Yw4}from"ink";import{useSyncExternalStore as Jw4}from"react";import{jsx as U3$,jsxs as Ww4}from"react/jsx-runtime";function Gw4({home:$}){let Z=Jw4(A41,T41);return Ww4(Yw4,{flexDirection:"column",children:[U3$(W3$,{services:Z.services,migrationsStatus:Z.migrationsStatus,home:$,serverUrl:Z.serverUrl}),U3$(H3$,{logs:Z.logs})]})}var _41=L(()=>{K3$();F3$();BT()});var _W="thread-gate",zL="decopilot-hosted-harness",PL="decopilot-hosted-harness-sandboxed",vW="automations",nj="background-tools",DT="task-board-github-reads";var N3$="13";function B3$($){return{name:"decocms",systemDatabaseUrl:$.systemDatabaseUrl,systemDatabaseSchemaName:"dbos",systemDatabasePoolSize:$.poolSize,runAdminServer:!1,executorID:$.executorID,applicationVersion:N3$,...$.listenQueues!==void 0?{listenQueues:$.listenQueues}:{}}}var L3$=()=>{};import Kw4 from"pg";async function O3$($,Z){let{databaseUrl:Q,lockTimeoutMs:X=Hw4}=$,Y=$.log??((K)=>console.log(K)),J=new Kw4.Client({connectionString:Q});await J.connect();let G=Date.now(),W=!1;try{while(!W){if(W=(await J.query("SELECT pg_try_advisory_lock($1) AS locked",[D3$.toString()])).rows[0]?.locked===!0,W)break;if(Date.now()-G>=X)throw Error(`Timed out after ${X}ms waiting for the DBOS migration lock. Another process is still migrating the dbos schema; this pod will restart and retry.`);await $$(Fw4)}let K=Date.now()-G;if(K>1000)Y(`[dbos] waited ${K}ms for the migration lock; another process migrated first`);return await Z()}finally{if(W)try{await J.query("SELECT pg_advisory_unlock($1)",[D3$.toString()])}catch{}await J.end().catch(()=>{})}}var D3$=8314027461559302n,Hw4=600000,Fw4=500;var j3$=L(()=>{$8()});function Uw4(){let $=(process.env.BUN_OPTIONS??"").split(/\s+/).filter(Boolean);return[...process.argv.slice(1),...$]}function v41($,Z){for(let Q=0;Q<$.length;Q++){let X=$[Q];if(X===void 0)continue;if(X===Z)return $[Q+1];if(X.startsWith(`${Z}=`))return X.slice(Z.length+1)}return}function w3$(){let $=Uw4();if($.includes("--cpu-prof")){console.log(JSON.stringify({msg:"cpu-profiling-active",dir:v41($,"--cpu-prof-dir")??process.cwd(),name:v41($,"--cpu-prof-name"),markdown:$.includes("--cpu-prof-md"),intervalUs:Number(v41($,"--cpu-prof-interval")??1000),note:"profile is written on process exit"}));return}if(process.env.CPU_PROFILE)console.warn(JSON.stringify({msg:"cpu-profiling-requested-but-inactive",hint:'CPU profiling is a Bun launch flag. Set BUN_OPTIONS="--cpu-prof --cpu-prof-md --cpu-prof-dir=/tmp" before starting the process.'}))}function E3$(){if(process.env.HEAP_WATCH!=="1")return()=>{};let $=Number(process.env.HEAP_WATCH_INTERVAL_MS??60000),Z=async()=>{let Q=JT();if(!Q)return;let X={};try{let{heapStats:Y}=await import("bun:jsc"),J=Y(),G=Object.entries(J.objectTypeCounts).sort((W,K)=>K[1]-W[1]).slice(0,20);X={objectCount:J.objectCount,heapSize:J.heapSize,top:Object.fromEntries(G)}}catch{}console.log(JSON.stringify({msg:"heap-watch",ts:new Date().toISOString(),uptimeS:Math.round(process.uptime()),rss:Q.rss,heapUsed:Q.heapUsed,heapTotal:Q.heapTotal,external:Q.external,arrayBuffers:Q.arrayBuffers,...X}))};return Z().catch(()=>{}),yK0=setInterval(()=>void Z().catch(()=>{}),$),yK0.unref?.(),process.on("SIGUSR2",()=>{try{let Q=Bun.generateHeapSnapshot("v8"),X=typeof Q==="string"?Q:JSON.stringify(Q),Y=`/tmp/heap-${process.pid}-${Date.now()}.heapsnapshot`;Bun.write(Y,X),console.log(JSON.stringify({msg:"heap-snapshot-written",path:Y}))}catch(Q){console.error("[heap-watch] snapshot failed:",Q)}}),()=>{if(yK0)clearInterval(yK0)}}var yK0;var z3$=()=>{};import*as Nw4 from"bun:jsc";function P3$(){if(process.env.STALL_WATCHDOG!=="1")return()=>{};let $=Number(process.env.STALL_WATCHDOG_MS??100),Z=Number(process.env.STALL_WATCHDOG_TICK_MS??50);try{Bw4()}catch(J){return console.error("[stall-watchdog] failed to start sampling profiler:",J),()=>{}}let Q,X=performance.now()+Z,Y=()=>{let J=performance.now(),G=J-X;X=J+Z;let W=[];try{W=Lw4()?.traces??[]}catch{}if(G>$&&W.length>0){let K=new Map;for(let F of W){let U=F.frames.find((D)=>D.sourceURL&&!/Unknown Executable/.test(D.category??""))??F.frames[0];if(!U)continue;let N=(U.sourceURL??"?").replace(/^.*\/node_modules\//,"node_modules/"),B=`${U.name??"?"} @ ${N}:${U.line??"?"}`;K.set(B,(K.get(B)??0)+1)}let H=[...K.entries()].sort((F,U)=>U[1]-F[1]).slice(0,8).map(([F,U])=>({frame:F,count:U}));console.warn(JSON.stringify({msg:"stall-stack",ts:new Date().toISOString(),lagMs:Math.round(G),samplesInWindow:W.length,top:H}))}Q=setTimeout(Y,Z),Q.unref?.()};return Q=setTimeout(Y,Z),Q.unref?.(),()=>{if(Q)clearTimeout(Q)}}var Bw4,Lw4;var T3$=L(()=>{({startSamplingProfiler:Bw4,samplingProfilerStackTraces:Lw4}=Nw4)});function A3$(){w3$();let $=[E3$(),y7$(),P3$()];return()=>{for(let Z of $)Z()}}var R3$=L(()=>{Ke0();z3$();T3$()});var OT=f((q3$)=>{Object.defineProperty(q3$,"__esModule",{value:!0});q3$.RepublishHeaders=q3$.DirectMsgHeaders=q3$.JsHeaders=q3$.AdvisoryKind=void 0;q3$.isOrderedPushConsumerOptions=Dw4;q3$.isPullConsumer=Ow4;q3$.isPushConsumer=jw4;q3$.isBoundPushConsumerOptions=ww4;function Dw4($){if($&&typeof $==="object")return"name_prefix"in $||"deliver_subject_prefix"in $||"filter_subjects"in $||"filter_subject"in $||"deliver_policy"in $||"opt_start_seq"in $||"opt_start_time"in $||"replay_policy"in $||"inactive_threshold"in $||"headers_only"in $||"deliver_prefix"in $;return!1}function Ow4($){return $.isPullConsumer()}function jw4($){return $.isPushConsumer()}function ww4($){if($&&typeof $==="object")return"deliver_subject"in $||"deliver_group"in $||"idle_heartbeat"in $;return!1}q3$.AdvisoryKind={API:"api_audit",StreamAction:"stream_action",ConsumerAction:"consumer_action",SnapshotCreate:"snapshot_create",SnapshotComplete:"snapshot_complete",RestoreCreate:"restore_create",RestoreComplete:"restore_complete",MaxDeliver:"max_deliver",Terminated:"terminated",Ack:"consumer_ack",StreamLeaderElected:"stream_leader_elected",StreamQuorumLost:"stream_quorum_lost",ConsumerLeaderElected:"consumer_leader_elected",ConsumerQuorumLost:"consumer_quorum_lost"};q3$.JsHeaders={StreamSourceHdr:"Nats-Stream-Source",LastConsumerSeqHdr:"Nats-Last-Consumer",LastStreamSeqHdr:"Nats-Last-Stream",ConsumerStalledHdr:"Nats-Consumer-Stalled",MessageSizeHdr:"Nats-Msg-Size",RollupHdr:"Nats-Rollup",RollupValueSubject:"sub",RollupValueAll:"all",PendingMessagesHdr:"Nats-Pending-Messages",PendingBytesHdr:"Nats-Pending-Bytes",RequiredApiLevel:"Nats-Required-Api-Level"};q3$.DirectMsgHeaders={Stream:"Nats-Stream",Sequence:"Nats-Sequence",TimeStamp:"Nats-Time-Stamp",Subject:"Nats-Subject",LastSequence:"Nats-Last-Sequence",NumPending:"Nats-Num-Pending"};q3$.RepublishHeaders={Stream:"Nats-Stream",Subject:"Nats-Subject",Sequence:"Nats-Sequence",LastSequence:"Nats-Last-Sequence",Size:"Nats-Msg-Size"}});var eG=f((I3$)=>{Object.defineProperty(I3$,"__esModule",{value:!0});I3$.TD=I3$.TE=I3$.Empty=void 0;I3$.encode=Iw4;I3$.decode=Vw4;I3$.Empty=new Uint8Array(0);I3$.TE=new TextEncoder;I3$.TD=new TextDecoder;function Mw4(...$){let Z=0;for(let Y=0;Y<$.length;Y++)Z+=$[Y].length;let Q=new Uint8Array(Z),X=0;for(let Y=0;Y<$.length;Y++)Q.set($[Y],X),X+=$[Y].length;return Q}function Iw4(...$){let Z=[];for(let Q=0;Q<$.length;Q++)Z.push(I3$.TE.encode($[Q]));if(Z.length===0)return I3$.Empty;if(Z.length===1)return Z[0];return Mw4(...Z)}function Vw4($){if(!$||$.length===0)return"";return I3$.TD.decode($)}});var $3=f((C3$)=>{Object.defineProperty(C3$,"__esModule",{value:!0});C3$.errors=C3$.PermissionViolationError=C3$.NoRespondersError=C3$.TimeoutError=C3$.RequestError=C3$.ProtocolError=C3$.ConnectionError=C3$.DrainingConnectionError=C3$.ClosedConnectionError=C3$.AuthorizationError=C3$.UserAuthenticationExpiredError=C3$.InvalidOperationError=C3$.InvalidArgumentError=C3$.InvalidSubjectError=void 0;class f41 extends Error{constructor($,Z){super(`illegal subject: '${$}'`,Z);this.name="InvalidSubjectError"}}C3$.InvalidSubjectError=f41;class gK0 extends Error{constructor($,Z){super($,Z);this.name="InvalidArgumentError"}static format($,Z,Q){if(Array.isArray(Z)&&Z.length>1)Z=Z[0];if(Array.isArray($))$=$.map((X)=>`'${X}'`),$=$.join(",");else $=`'${$}'`;return new gK0(`${$} ${Z}`,Q)}}C3$.InvalidArgumentError=gK0;class b41 extends Error{constructor($,Z){super($,Z);this.name="InvalidOperationError"}}C3$.InvalidOperationError=b41;class hK0 extends Error{constructor($,Z){super($,Z);this.name="UserAuthenticationExpiredError"}static parse($){if($.toLowerCase().indexOf("user authentication expired")!==-1)return new hK0($);return null}}C3$.UserAuthenticationExpiredError=hK0;class uK0 extends Error{constructor($,Z){super($,Z);this.name="AuthorizationError"}static parse($){let Z=["authorization violation","account authentication expired","authentication timeout"],Q=$.toLowerCase();for(let X=0;X<Z.length;X++)if(Q.indexOf(Z[X])!==-1)return new uK0($);return null}}C3$.AuthorizationError=uK0;class y41 extends Error{constructor(){super("closed connection");this.name="ClosedConnectionError"}}C3$.ClosedConnectionError=y41;class g41 extends Error{constructor(){super("connection draining");this.name="DrainingConnectionError"}}C3$.DrainingConnectionError=g41;class h41 extends Error{constructor($,Z){super($,Z);this.name="ConnectionError"}}C3$.ConnectionError=h41;class u41 extends Error{constructor($,Z){super($,Z);this.name="ProtocolError"}}C3$.ProtocolError=u41;class l41 extends Error{constructor($="",Z){super($,Z);this.name="RequestError"}isNoResponders(){return this.cause instanceof lK0}}C3$.RequestError=l41;class c41 extends Error{constructor($){super("timeout",$);this.name="TimeoutError"}}C3$.TimeoutError=c41;class lK0 extends Error{subject;constructor($,Z){super(`no responders: '${$}'`,Z);this.subject=$,this.name="NoResponders"}}C3$.NoRespondersError=lK0;class cK0 extends Error{operation;subject;queue;constructor($,Z,Q,X,Y){super($,Y);this.name="PermissionViolationError",this.operation=Z,this.subject=Q,this.queue=X}static parse($){if(($?$.toLowerCase():"").indexOf("permissions violation")===-1)return null;let Q="publish",X="",Y=void 0,J=$.match(/(Publish|Subscription) to "(\S+)"/);if(J){if(Q=J[1].toLowerCase(),X=J[2],Q==="subscription"){let G=$.match(/using queue "(\S+)"/);if(G)Y=G[1]}}return new cK0($,Q,X,Y)}}C3$.PermissionViolationError=cK0;C3$.errors={AuthorizationError:uK0,ClosedConnectionError:y41,ConnectionError:h41,DrainingConnectionError:g41,InvalidArgumentError:gK0,InvalidOperationError:b41,InvalidSubjectError:f41,NoRespondersError:lK0,PermissionViolationError:cK0,ProtocolError:u41,RequestError:l41,TimeoutError:c41,UserAuthenticationExpiredError:hK0}});var EH=f((f3$)=>{Object.defineProperty(f3$,"__esModule",{value:!0});f3$.SimpleMutex=f3$.Perf=void 0;f3$.extend=iw4;f3$.render=pw4;f3$.timeout=nw4;f3$.delay=tw4;f3$.deadline=ow4;f3$.deferred=d41;f3$.debugDeferred=aw4;f3$.shuffle=rw4;f3$.collect=sw4;f3$.jitter=x3$;f3$.backoff=ew4;f3$.nanos=$E4;f3$.millis=ZE4;f3$.randomToken=YE4;var dw4=eG(),m41=$3();function iw4($,...Z){for(let Q=0;Q<Z.length;Q++){let X=Z[Q];Object.keys(X).forEach(function(Y){$[Y]=X[Y]})}return $}function pw4($){return dw4.TD.decode($).replace(/\n/g,"\u240A").replace(/\r/g,"\u240D")}function nw4($,Z=!0){let Q=Z?new m41.TimeoutError:null,X,Y,J=new Promise((G,W)=>{X={cancel:()=>{if(Y)clearTimeout(Y)}},Y=setTimeout(()=>{if(Q===null)W(new m41.TimeoutError);else W(Q)},$)});return Object.assign(J,X)}function tw4($=0){let Z,Q=new Promise((X)=>{let Y=setTimeout(()=>{X()},$);Z={cancel:()=>{if(Y)clearTimeout(Y),X()}}});return Object.assign(Q,Z)}async function ow4($,Z=1000){let Q=d41(),X=setTimeout(()=>{Q.reject(new m41.TimeoutError)},Z);try{return await Promise.race([$,Q])}finally{clearTimeout(X)}}function d41(){let $={},Z=new Promise((Q,X)=>{$={resolve:Q,reject:X}});return Object.assign(Z,$)}function aw4(){let $={},Z=new Promise((Q,X)=>{$={resolve:(Y)=>{console.trace("resolve",Y),Q(Y)},reject:(Y)=>{console.trace("reject"),X(Y)}}});return Object.assign(Z,$)}function rw4($){for(let Z=$.length-1;Z>0;Z--){let Q=Math.floor(Math.random()*(Z+1));[$[Z],$[Q]]=[$[Q],$[Z]]}return $}async function sw4($){let Z=[];for await(let Q of $)Z.push(Q);return Z}class _3${timers;measures;constructor(){this.timers=new Map,this.measures=new Map}mark($){this.timers.set($,performance.now())}measure($,Z,Q){let X=this.timers.get(Z);if(X===void 0)throw Error(`${Z} is not defined`);let Y=this.timers.get(Q);if(Y===void 0)throw Error(`${Q} is not defined`);this.measures.set($,Y-X)}getEntries(){let $=[];return this.measures.forEach((Z,Q)=>{$.push({name:Q,duration:Z})}),$}}f3$.Perf=_3$;class v3${max;current;waiting;constructor($=1){this.max=$,this.current=0,this.waiting=[]}lock(){if(this.current++,this.current<=this.max)return Promise.resolve();let $=d41();return this.waiting.push($),$}unlock(){this.current--,this.waiting.pop()?.resolve()}}f3$.SimpleMutex=v3$;function x3$($){if($===0)return 0;return Math.floor($/2+Math.random()*$)}function ew4($=[0,250,250,500,500,3000,5000]){if(!Array.isArray($))$=[0,250,250,500,500,3000,5000];let Z=$.length-1;return{backoff(Q){return x3$(Q>Z?$[Z]:$[Q])}}}function $E4($){return $*1e6}function ZE4($){return Math.floor($/1e6)}var QE4="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",TL=new Uint8Array(62);for(let $=0;$<62;$++)TL[$]=QE4.charCodeAt($);var XE4=218340105584896;function YE4(){let $=Math.floor(Math.random()*XE4),Z=$%62,Q=TL[Z];$=($-Z)/62,Z=$%62;let X=TL[Z];$=($-Z)/62,Z=$%62;let Y=TL[Z];$=($-Z)/62,Z=$%62;let J=TL[Z];$=($-Z)/62,Z=$%62;let G=TL[Z];$=($-Z)/62,Z=$%62;let W=TL[Z];$=($-Z)/62,Z=$%62;let K=TL[Z];$=($-Z)/62;let H=TL[$];return String.fromCharCode(Q,X,Y,J,G,W,K,H)}});var m3$=f((l3$)=>{Object.defineProperty(l3$,"__esModule",{value:!0});l3$.nuid=l3$.NuidImpl=void 0;var zE4="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",tj=62,dK0=12,h3$=10,y3$=33,PE4=333,g3$=dK0+h3$,p41=new Uint8Array(tj);for(let $=0;$<tj;$++)p41[$]=zE4.charCodeAt($);var mK0=4294967296,u3$=BigInt(tj)**BigInt(h3$),cs=Number(u3$/(1n<<32n)),i41=Number(u3$%(1n<<32n));function TE4($){for(let Z=0;Z<$.length;Z++)$[Z]=Math.floor(Math.random()*256)}function AE4($){if(globalThis?.crypto?.getRandomValues)globalThis.crypto.getRandomValues($);else TE4($)}class n41{buf;cbuf;seqHi;seqLo;inc;inited;constructor(){this.buf=new Uint8Array(g3$),this.cbuf=new Uint8Array(dK0),this.inited=!1}init(){this.inited=!0,this.setPre(),this.initSeqAndInc(),this.fillSeq()}initSeqAndInc(){let $=0;do this.seqHi=Math.floor(Math.random()*(cs+1)),this.seqLo=Math.floor(Math.random()*mK0);while($++<8&&this.seqHi===cs&&this.seqLo>=i41);if(this.seqHi===cs&&this.seqLo>=i41)this.seqLo=0;this.inc=Math.random()*(PE4-y3$)+y3$|0}setPre(){AE4(this.cbuf);for(let $=0;$<dK0;$++)this.buf[$]=p41[this.cbuf[$]%tj]}fillSeq(){let $=this.seqHi,Z=this.seqLo;for(let Q=g3$-1;Q>=dK0;Q--){let X=Math.floor($/tj),J=($-X*tj)*mK0+Z,G=Math.floor(J/tj),W=J-G*tj;this.buf[Q]=p41[W],$=X,Z=G}}next(){if(!this.inited)this.init();if(this.seqLo+=this.inc,this.seqLo>=mK0)this.seqLo-=mK0,this.seqHi+=1;if(this.seqHi>cs||this.seqHi===cs&&this.seqLo>=i41)this.setPre(),this.initSeqAndInc();this.fillSeq();let $=this.buf;return String.fromCharCode($[0],$[1],$[2],$[3],$[4],$[5],$[6],$[7],$[8],$[9],$[10],$[11],$[12],$[13],$[14],$[15],$[16],$[17],$[18],$[19],$[20],$[21])}reset(){this.init()}}l3$.NuidImpl=n41;l3$.nuid=new n41});var n3$=f((i3$)=>{Object.defineProperty(i3$,"__esModule",{value:!0});i3$.nuid=i3$.Nuid=void 0;var d3$=m3$();i3$.Nuid=d3$.NuidImpl;i3$.nuid=d3$.nuid});var pK0=f((iK0)=>{Object.defineProperty(iK0,"__esModule",{value:!0});iK0.nuid=iK0.Nuid=void 0;var t3$=n3$();Object.defineProperty(iK0,"Nuid",{enumerable:!0,get:function(){return t3$.Nuid}});Object.defineProperty(iK0,"nuid",{enumerable:!0,get:function(){return t3$.nuid}})});var oj=f((o3$)=>{Object.defineProperty(o3$,"__esModule",{value:!0});o3$.DEFAULT_HOST=o3$.DEFAULT_PORT=o3$.Match=void 0;o3$.syncIterator=kE4;o3$.createInbox=CE4;var IE4=pK0(),VE4=$3();o3$.Match={Exact:"exact",CanonicalMIME:"canonical",IgnoreCase:"insensitive"};function kE4($){let Z=$[Symbol.asyncIterator]();return{async next(){let Q=await Z.next();if(Q.done)return Promise.resolve(null);return Promise.resolve(Q.value)}}}function CE4($=""){if($=$||"_INBOX",typeof $!=="string")throw TypeError("prefix must be a string");return $.split(".").forEach((Z)=>{if(Z==="*"||Z===">")throw VE4.InvalidArgumentError.format("prefix",`cannot have wildcards ('${$}')`)}),`${$}.${IE4.nuid.next()}`}o3$.DEFAULT_PORT=4222;o3$.DEFAULT_HOST="127.0.0.1"});var ms=f((e3$)=>{Object.defineProperty(e3$,"__esModule",{value:!0});e3$.DataBuffer=void 0;var r3$=eG();class s3${buffers;byteLength;constructor(){this.buffers=[],this.byteLength=0}static concat(...$){let Z=0;for(let Y=0;Y<$.length;Y++)Z+=$[Y].length;let Q=new Uint8Array(Z),X=0;for(let Y=0;Y<$.length;Y++)Q.set($[Y],X),X+=$[Y].length;return Q}static fromAscii($){if(!$)$="";return r3$.TE.encode($)}static toAscii($){return r3$.TD.decode($)}reset(){this.buffers.length=0,this.byteLength=0}pack(){if(this.buffers.length>1){let $=new Uint8Array(this.byteLength),Z=0;for(let Q=0;Q<this.buffers.length;Q++)$.set(this.buffers[Q],Z),Z+=this.buffers[Q].length;this.buffers.length=0,this.buffers.push($)}}shift(){if(this.buffers.length){let $=this.buffers.shift();if($)return this.byteLength-=$.length,$}return new Uint8Array(0)}drain($){if(this.buffers.length){this.pack();let Z=this.buffers.pop();if(Z){let Q=this.byteLength;if($===void 0||$>Q)$=Q;let X=Z.subarray(0,$);if(Q>$)this.buffers.push(Z.subarray($));return this.byteLength=Q-$,X}}return new Uint8Array(0)}fill($,...Z){if($)this.buffers.push($),this.byteLength+=$.length;for(let Q=0;Q<Z.length;Q++)if(Z[Q]&&Z[Q].length)this.buffers.push(Z[Q]),this.byteLength+=Z[Q].length}peek(){if(this.buffers.length)return this.pack(),this.buffers[0];return new Uint8Array(0)}size(){return this.byteLength}length(){return this.buffers.length}}e3$.DataBuffer=s3$});var jT=f((QW$)=>{Object.defineProperty(QW$,"__esModule",{value:!0});QW$.LF=QW$.CR=QW$.CRLF=QW$.CR_LF_LEN=QW$.CR_LF=void 0;QW$.setTransportFactory=gE4;QW$.defaultPort=hE4;QW$.getUrlParseFn=uE4;QW$.newTransport=lE4;QW$.getResolveFn=cE4;QW$.protoLen=ZW$;QW$.extractProtocolMessage=mE4;var fE4=eG(),bE4=oj(),yE4=ms(),Z3;function gE4($){Z3=$}function hE4(){return Z3!==void 0&&Z3.defaultPort!==void 0?Z3.defaultPort:bE4.DEFAULT_PORT}function uE4(){return Z3!==void 0&&Z3.urlParseFn?Z3.urlParseFn:void 0}function lE4(){if(!Z3||typeof Z3.factory!=="function")throw Error("transport fn is not set");return Z3.factory()}function cE4(){return Z3!==void 0&&Z3.dnsResolveFn?Z3.dnsResolveFn:void 0}QW$.CR_LF=`\r
2199
2199
  `;QW$.CR_LF_LEN=QW$.CR_LF.length;QW$.CRLF=yE4.DataBuffer.fromAscii(QW$.CR_LF);QW$.CR=new Uint8Array(QW$.CRLF)[0];QW$.LF=new Uint8Array(QW$.CRLF)[1];function ZW$($){for(let Z=0;Z<$.length;Z++){let Q=Z+1;if($.byteLength>Q&&$[Z]===QW$.CR&&$[Q]===QW$.LF)return Q+1}return 0}function mE4($){let Z=ZW$($);if(Z>0){let X=new Uint8Array($).slice(0,Z);return fE4.TD.decode(X)}return""}});var s41=f((FW$)=>{Object.defineProperty(FW$,"__esModule",{value:!0});FW$.ipV4=WW$;FW$.isIP=$z4;FW$.parseIP=KW$;var ds=4,wT=16,nK0=48,GW$=57,YW$=65,sE4=70,JW$=97,eE4=102,r41=16777215;function WW$($,Z,Q,X){let Y=new Uint8Array(wT);return[0,0,0,0,0,0,0,0,0,0,255,255].forEach((G,W)=>{Y[W]=G}),Y[12]=$,Y[13]=Z,Y[14]=Q,Y[15]=X,Y}function $z4($){return KW$($)!==void 0}function KW$($){for(let Z=0;Z<$.length;Z++)switch($[Z]){case".":return HW$($);case":":return Zz4($)}return}function HW$($){let Z=new Uint8Array(ds);for(let Q=0;Q<ds;Q++){if($.length===0)return;if(Q>0){if($[0]!==".")return;$=$.substring(1)}let{n:X,c:Y,ok:J}=Qz4($);if(!J||X>255)return;$=$.substring(Y),Z[Q]=X}return WW$(Z[0],Z[1],Z[2],Z[3])}function Zz4($){let Z=new Uint8Array(wT),Q=-1;if($.length>=2&&$[0]===":"&&$[1]===":"){if(Q=0,$=$.substring(2),$.length===0)return Z}let X=0;while(X<wT){let{n:Y,c:J,ok:G}=Xz4($);if(!G||Y>65535)return;if(J<$.length&&$[J]==="."){if(Q<0&&X!=wT-ds)return;if(X+ds>wT)return;let W=HW$($);if(W===void 0)return;Z[X]=W[12],Z[X+1]=W[13],Z[X+2]=W[14],Z[X+3]=W[15],$="",X+=ds;break}if(Z[X]=Y>>8,Z[X+1]=Y,X+=2,$=$.substring(J),$.length===0)break;if($[0]!==":"||$.length==1)return;if($=$.substring(1),$[0]===":"){if(Q>=0)return;if(Q=X,$=$.substring(1),$.length===0)break}}if($.length!==0)return;if(X<wT){if(Q<0)return;let Y=wT-X;for(let J=X-1;J>=Q;J--)Z[J+Y]=Z[J];for(let J=Q+Y-1;J>=Q;J--)Z[J]=0}else if(Q>=0)return;return Z}function Qz4($){let Z=0,Q=0;for(Z=0;Z<$.length&&nK0<=$.charCodeAt(Z)&&$.charCodeAt(Z)<=GW$;Z++)if(Q=Q*10+($.charCodeAt(Z)-nK0),Q>=r41)return{n:r41,c:Z,ok:!1};if(Z===0)return{n:0,c:0,ok:!1};return{n:Q,c:Z,ok:!0}}function Xz4($){let Z=0,Q=0;for(Q=0;Q<$.length;Q++){if(nK0<=$.charCodeAt(Q)&&$.charCodeAt(Q)<=GW$)Z*=16,Z+=$.charCodeAt(Q)-nK0;else if(JW$<=$.charCodeAt(Q)&&$.charCodeAt(Q)<=eE4)Z*=16,Z+=$.charCodeAt(Q)-JW$+10;else if(YW$<=$.charCodeAt(Q)&&$.charCodeAt(Q)<=sE4)Z*=16,Z+=$.charCodeAt(Q)-YW$+10;else break;if(Z>=r41)return{n:0,c:Q,ok:!1}}if(Q===0)return{n:0,c:Q,ok:!1};return{n:Z,c:Q,ok:!0}}});var Y61=f((NW$)=>{Object.defineProperty(NW$,"__esModule",{value:!0});NW$.Servers=NW$.ServerImpl=void 0;NW$.isIPV4OrHostname=UW$;NW$.hostPort=X61;var e41=jT(),$61=EH(),Z61=s41(),Wz4=oj(),Kz4=$3();function UW$($){if($.indexOf("[")!==-1||$.indexOf("::")!==-1)return!1;if($.indexOf(".")!==-1)return!0;if($.split(":").length<=2)return!0;return!1}function Q61($){return!UW$($)}function Hz4($){let Q=$.toUpperCase().indexOf("::FFFF:");if(Q!==-1&&$.indexOf(".")!==-1){let X=$.substring(Q+7);return X=X.replace("[",""),X.replace("]","")}return $}function X61($){if($=$.trim(),$.match(/^(.*:\/\/)(.*)/m))$=$.replace(/^(.*:\/\/)(.*)/gm,"$2");if($=Hz4($),Q61($)&&$.indexOf("[")===-1)$=`[${$}]`;let Z=Q61($)?$.match(/(]:)(\d+)/):$.match(/(:)(\d+)/),Q=Z&&Z.length===3&&Z[1]&&Z[2]?parseInt(Z[2]):Wz4.DEFAULT_PORT,Y=new URL(`${Q===80?"https":"http"}://${$}`);Y.port=`${Q}`;let J=Y.hostname;if(J.charAt(0)==="[")J=J.substring(1,J.length-1);return{listen:Y.host,hostname:J,port:Q}}class Mc{src;listen;hostname;port;didConnect;reconnects;lastConnect;gossiped;tlsName;resolves;constructor($,Z=!1){this.src=$,this.tlsName="";let Q=X61($);this.listen=Q.listen,this.hostname=Q.hostname,this.port=Q.port,this.didConnect=!1,this.reconnects=0,this.lastConnect=0,this.gossiped=Z}toString(){return this.listen}async resolve($){if(!$.fn||$.resolve===!1)return[this];let Z=[];if((0,Z61.isIP)(this.hostname))return[this];else{let Q=await $.fn(this.hostname);if($.debug)console.log(`resolve ${this.hostname} = ${Q.join(",")}`);for(let X of Q){let Y=this.port===80?"https":"http",J=new URL(`${Y}://${Q61(X)?"["+X+"]":X}`);J.port=`${this.port}`;let G=new Mc(J.host,!1);G.tlsName=this.hostname,Z.push(G)}}if($.randomize)(0,$61.shuffle)(Z);return this.resolves=Z,Z}}NW$.ServerImpl=Mc;class tK0{firstSelect;servers;currentServer;tlsName;randomize;constructor($={}){this.firstSelect=!0,this.servers=[],this.tlsName="",this.randomize=$.randomize||!1}setServers($){if(!Array.isArray($)||$.length===0)throw Kz4.InvalidArgumentError.format("servers","cannot be empty");let Z=(0,e41.getUrlParseFn)(),Q=new Map;for(let Y of this.servers)Q.set(Y.listen,Y);let X=[];for(let Y of $){Y=Z?Z(Y):Y;let{listen:J}=X61(Y),G=Q.get(J);if(G)G.gossiped=!1,X.push(G);else X.push(new Mc(Y))}if(this.randomize)(0,$61.shuffle)(X);if(this.servers=X,this.currentServer===void 0||!X.includes(this.currentServer))this.currentServer=X[0],this.firstSelect=!0}clear(){this.servers.length=0}updateTLSName(){let $=this.getCurrentServer();if(!(0,Z61.isIP)($.hostname))this.tlsName=$.hostname,this.servers.forEach((Z)=>{if(Z.gossiped)Z.tlsName=this.tlsName})}getCurrentServer(){return this.currentServer}addServer($,Z=!1){let Q=(0,e41.getUrlParseFn)();$=Q?Q($):$;let X=new Mc($,Z);if((0,Z61.isIP)(X.hostname))X.tlsName=this.tlsName;this.servers.push(X)}selectServer(){if(this.firstSelect)return this.firstSelect=!1,this.currentServer;let $=this.servers.shift();if($)this.servers.push($),this.currentServer=$;return $}removeCurrentServer(){this.removeServer(this.currentServer)}removeServer($){if($){let Z=this.servers.indexOf($);this.servers.splice(Z,1)}}snapshot(){return tK0.freezeAll(this.servers)}snapshotForHandler(){let $=this.currentServer;if(!$)return this.snapshot();let Z=this.servers.indexOf($);if(Z<=0)return this.snapshot();return tK0.freezeAll([$,...this.servers.slice(0,Z),...this.servers.slice(Z+1)])}static freezeAll($){return $.map((Z)=>Object.freeze({hostname:Z.hostname,port:Z.port,listen:Z.listen,src:Z.src,tlsName:Z.tlsName,reconnects:Z.reconnects,lastConnect:Z.lastConnect,gossiped:Z.gossiped,didConnect:Z.didConnect}))}find($){return this.servers.find((Z)=>Z.listen===$.listen)}setCurrent($){this.currentServer=$}length(){return this.servers.length}next(){return this.servers.length?this.servers[0]:void 0}getServers(){return this.servers}update($,Z){let Q=[],X=[],Y=(0,e41.getUrlParseFn)(),J=new Map;if($.connect_urls&&$.connect_urls.length>0)$.connect_urls.forEach((W)=>{W=Y?Y(W,Z):W;let K=new Mc(W,!0);J.set(W,K)});let G=[];if(this.servers.forEach((W,K)=>{let H=W.listen;if(W.gossiped&&this.currentServer.listen!==H&&J.get(H)===void 0)G.push(K);J.delete(H)}),G.reverse(),G.forEach((W)=>{let K=this.servers.splice(W,1);X=X.concat(K[0].listen)}),J.forEach((W,K)=>{this.servers.push(W),Q.push(K)}),this.randomize&&Q.length>0){let W=this.currentServer,K=this.servers.filter((H)=>H!==W);(0,$61.shuffle)(K),this.servers=W?[W,...K]:K}return{added:Q,deleted:X}}}NW$.Servers=tK0});var oK0=f((OW$)=>{Object.defineProperty(OW$,"__esModule",{value:!0});OW$.QueuedIteratorImpl=void 0;var J61=EH(),LW$=$3();class DW${inflight;processed;received;noIterator;iterClosed;done;signal;yields;filtered;pendingFiltered;ctx;_data;err;time;profile;yielding;didBreak;constructor(){this.inflight=0,this.filtered=0,this.pendingFiltered=0,this.processed=0,this.received=0,this.noIterator=!1,this.done=!1,this.signal=(0,J61.deferred)(),this.yields=[],this.iterClosed=(0,J61.deferred)(),this.time=0,this.yielding=!1,this.didBreak=!1,this.profile=!1}[Symbol.asyncIterator](){return this.iterate()}push($){if(this.done)return;if(this.didBreak){if(typeof $==="function"){let Z=$;try{Z()}catch(Q){}}return}if(typeof $==="function")this.pendingFiltered++;this.yields.push($),this.signal.resolve()}async*iterate(){if(this.noIterator)throw new LW$.InvalidOperationError("iterator cannot be used when a callback is registered");if(this.yielding)throw new LW$.InvalidOperationError("iterator is already yielding");this.yielding=!0;try{while(!0){if(this.yields.length===0)await this.signal;if(this.err)throw this.err;let $=this.yields;this.inflight=$.length,this.yields=[];for(let Z=0;Z<$.length;Z++){if(typeof $[Z]==="function"){this.pendingFiltered--;let X=$[Z];try{X()}catch(Y){throw Y}if(this.err)throw this.err;continue}this.processed++,this.inflight--;let Q=this.profile?Date.now():0;yield $[Z],this.time=this.profile?Date.now()-Q:0}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,J61.deferred)()}}finally{this.didBreak=!0,this.stop()}}stop($){if(this.done)return;this.err=$,this.done=!0,this.signal.resolve(),this.iterClosed.resolve($)}getProcessed(){return this.noIterator?this.received:this.processed}getPending(){return this.yields.length+this.inflight-this.pendingFiltered}getReceived(){return this.received-this.filtered}}OW$.QueuedIteratorImpl=DW$});var G61=f((zW$)=>{Object.defineProperty(zW$,"__esModule",{value:!0});zW$.MuxSubscription=void 0;var Bz4=oj(),wW$=$3();class EW${baseInbox;reqs;constructor(){this.reqs=new Map}size(){return this.reqs.size}init($){return this.baseInbox=`${(0,Bz4.createInbox)($)}.`,this.baseInbox}add($){if(!isNaN($.received))$.received=0;this.reqs.set($.token,$)}get($){return this.reqs.get($)}cancel($){this.reqs.delete($.token)}getToken($){let Z=$.subject||"";if(Z.indexOf(this.baseInbox)===0)return Z.substring(this.baseInbox.length);return null}all(){return Array.from(this.reqs.values())}handleError($,Z){if($)return this.all().forEach((Q)=>{Q.resolver(Z,{})}),!0;if(Z.operation==="publish"){let Q=this.all().find((X)=>{return X.requestSubject===Z.subject});if(Q)return Q.resolver(Z,{}),!0}return!1}dispatcher(){return($,Z)=>{let Q=this.getToken(Z);if(Q){let X=this.get(Q);if(X){if($===null)$=Z?.data?.length===0&&Z.headers?.code===503?new wW$.NoRespondersError(X.requestSubject):null;X.resolver($,Z)}}}}close(){let $=new wW$.RequestError("connection closed");this.reqs.forEach((Z)=>{Z.resolver($,{})})}}zW$.MuxSubscription=EW$});var W61=f((AW$)=>{Object.defineProperty(AW$,"__esModule",{value:!0});AW$.Heartbeat=void 0;var Lz4=EH();class TW${ph;interval;maxOut;timer;pendings;constructor($,Z,Q){this.ph=$,this.interval=Z,this.maxOut=Q,this.pendings=[]}start(){this.cancel(),this._schedule()}cancel($){if(this.timer)clearTimeout(this.timer),this.timer=void 0;if(this._reset(),$)this.ph.disconnect()}_schedule(){this.timer=setTimeout(()=>{if(this.ph.dispatchStatus({type:"ping",pendingPings:this.pendings.length+1}),this.pendings.length===this.maxOut){this.cancel(!0);return}let $=(0,Lz4.deferred)();this.ph.flush($).then(()=>{this._reset()}).catch(()=>{this.cancel()}),this.pendings.push($),this._schedule()},this.interval)}_reset(){this.pendings=this.pendings.filter(($)=>{return $.resolve(),!1})}}AW$.Heartbeat=TW$});var F61=f((VW$)=>{Object.defineProperty(VW$,"__esModule",{value:!0});VW$.DenoBuffer=VW$.MAX_SIZE=VW$.AssertionError=void 0;VW$.assert=MW$;VW$.concat=IW$;VW$.append=Oz4;VW$.readAll=jz4;VW$.writeAll=wz4;var Dz4=eG();class K61 extends Error{constructor($){super($);this.name="AssertionError"}}VW$.AssertionError=K61;function MW$($,Z="Assertion failed."){if(!$)throw new K61(Z)}var qW$=32768;VW$.MAX_SIZE=4294967294;function aK0($,Z,Q=0){let X=Z.byteLength-Q;if($.byteLength>X)$=$.subarray(0,X);return Z.set($,Q),$.byteLength}function IW$($,Z){if($===void 0&&Z===void 0)return new Uint8Array(0);if($===void 0)return Z;if(Z===void 0)return $;let Q=new Uint8Array($.length+Z.length);return Q.set($,0),Q.set(Z,$.length),Q}function Oz4($,Z){return IW$($,Uint8Array.of(Z))}class H61{_buf;_off;constructor($){if(this._off=0,$==null){this._buf=new Uint8Array(0);return}this._buf=new Uint8Array($)}bytes($={copy:!0}){if($.copy===!1)return this._buf.subarray(this._off);return this._buf.slice(this._off)}empty(){return this._buf.byteLength<=this._off}get length(){return this._buf.byteLength-this._off}get capacity(){return this._buf.buffer.byteLength}truncate($){if($===0){this.reset();return}if($<0||$>this.length)throw Error("bytes.Buffer: truncation out of range");this._reslice(this._off+$)}reset(){this._reslice(0),this._off=0}_tryGrowByReslice($){let Z=this._buf.byteLength;if($<=this.capacity-Z)return this._reslice(Z+$),Z;return-1}_reslice($){MW$($<=this._buf.buffer.byteLength),this._buf=new Uint8Array(this._buf.buffer,0,$)}readByte(){let $=new Uint8Array(1);if(this.read($))return $[0];return null}read($){if(this.empty()){if(this.reset(),$.byteLength===0)return 0;return null}let Z=aK0(this._buf.subarray(this._off),$);return this._off+=Z,Z}writeByte($){return this.write(Uint8Array.of($))}writeString($){return this.write(Dz4.TE.encode($))}write($){let Z=this._grow($.byteLength);return aK0($,this._buf,Z)}_grow($){let Z=this.length;if(Z===0&&this._off!==0)this.reset();let Q=this._tryGrowByReslice($);if(Q>=0)return Q;let X=this.capacity;if($<=Math.floor(X/2)-Z)aK0(this._buf.subarray(this._off),this._buf);else if(X+$>VW$.MAX_SIZE)throw Error("The buffer cannot be grown beyond the maximum size.");else{let Y=new Uint8Array(Math.min(2*X+$,VW$.MAX_SIZE));aK0(this._buf.subarray(this._off),Y),this._buf=Y}return this._off=0,this._reslice(Math.min(Z+$,VW$.MAX_SIZE)),Z}grow($){if($<0)throw Error("Buffer._grow: negative count");let Z=this._grow($);this._reslice(Z)}readFrom($){let Z=0,Q=new Uint8Array(qW$);while(!0){let X=this.capacity-this.length<qW$,Y=X?Q:new Uint8Array(this._buf.buffer,this.length),J=$.read(Y);if(J===null)return Z;if(X)this.write(Y.subarray(0,J));else this._reslice(this.length+J);Z+=J}}}VW$.DenoBuffer=H61;function jz4($){let Z=new H61;return Z.readFrom($),Z.bytes()}function wz4($,Z){let Q=0;while(Q<Z.length)Q+=$.write(Z.subarray(Q))}});var B61=f((vW$)=>{Object.defineProperty(vW$,"__esModule",{value:!0});vW$.cc=vW$.State=vW$.Parser=vW$.Kind=void 0;vW$.describe=qz4;var U61=F61(),N61=eG();vW$.Kind={OK:0,ERR:1,MSG:2,INFO:3,PING:4,PONG:5};function qz4($){let Z,Q="";switch($.kind){case vW$.Kind.MSG:Z="MSG";break;case vW$.Kind.OK:Z="OK";break;case vW$.Kind.ERR:Z="ERR",Q=N61.TD.decode($.data);break;case vW$.Kind.PING:Z="PING";break;case vW$.Kind.PONG:Z="PONG";break;case vW$.Kind.INFO:Z="INFO",Q=N61.TD.decode($.data)}return`${Z}: ${Q}`}function CW$(){let $={};return $.sid=-1,$.hdr=-1,$.size=-1,$}var SW$=48,Mz4=57,Ic=67108864;class _W${dispatcher;state;as;drop;hdr;ma;argBuf;msgBuf;constructor($){this.dispatcher=$,this.state=vW$.State.OP_START,this.as=0,this.drop=0,this.hdr=0}parse($){let Z;for(Z=0;Z<$.length;Z++){let Q=$[Z];switch(this.state){case vW$.State.OP_START:switch(Q){case vW$.cc.M:case vW$.cc.m:this.state=vW$.State.OP_M,this.hdr=-1,this.ma=CW$();break;case vW$.cc.H:case vW$.cc.h:this.state=vW$.State.OP_H,this.hdr=0,this.ma=CW$();break;case vW$.cc.P:case vW$.cc.p:this.state=vW$.State.OP_P;break;case vW$.cc.PLUS:this.state=vW$.State.OP_PLUS;break;case vW$.cc.MINUS:this.state=vW$.State.OP_MINUS;break;case vW$.cc.I:case vW$.cc.i:this.state=vW$.State.OP_I;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_H:switch(Q){case vW$.cc.M:case vW$.cc.m:this.state=vW$.State.OP_M;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_M:switch(Q){case vW$.cc.S:case vW$.cc.s:this.state=vW$.State.OP_MS;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_MS:switch(Q){case vW$.cc.G:case vW$.cc.g:this.state=vW$.State.OP_MSG;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_MSG:switch(Q){case vW$.cc.SPACE:case vW$.cc.TAB:this.state=vW$.State.OP_MSG_SPC;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_MSG_SPC:switch(Q){case vW$.cc.SPACE:case vW$.cc.TAB:continue;default:this.state=vW$.State.MSG_ARG,this.as=Z}break;case vW$.State.MSG_ARG:switch(Q){case vW$.cc.CR:this.drop=1;break;case vW$.cc.NL:{let X=this.argBuf?this.argBuf.bytes():$.subarray(this.as,Z-this.drop);this.processMsgArgs(X),this.drop=0,this.as=Z+1,this.state=vW$.State.MSG_PAYLOAD,Z=this.as+this.ma.size-1;break}default:if(this.argBuf)this.argBuf.writeByte(Q)}break;case vW$.State.MSG_PAYLOAD:if(this.msgBuf)if(this.msgBuf.length>=this.ma.size){let X=this.msgBuf.bytes({copy:!1});this.dispatcher.push({kind:vW$.Kind.MSG,msg:this.ma,data:X}),this.argBuf=void 0,this.msgBuf=void 0,this.state=vW$.State.MSG_END}else{let X=this.ma.size-this.msgBuf.length,Y=$.length-Z;if(Y<X)X=Y;if(X>0)this.msgBuf.write($.subarray(Z,Z+X)),Z=Z+X-1;else this.msgBuf.writeByte(Q)}else if(Z-this.as>=this.ma.size)this.dispatcher.push({kind:vW$.Kind.MSG,msg:this.ma,data:$.subarray(this.as,Z)}),this.argBuf=void 0,this.msgBuf=void 0,this.state=vW$.State.MSG_END;break;case vW$.State.MSG_END:switch(Q){case vW$.cc.NL:this.drop=0,this.as=Z+1,this.state=vW$.State.OP_START;break;default:continue}break;case vW$.State.OP_PLUS:switch(Q){case vW$.cc.O:case vW$.cc.o:this.state=vW$.State.OP_PLUS_O;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_PLUS_O:switch(Q){case vW$.cc.K:case vW$.cc.k:this.state=vW$.State.OP_PLUS_OK;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_PLUS_OK:switch(Q){case vW$.cc.NL:this.dispatcher.push({kind:vW$.Kind.OK}),this.drop=0,this.state=vW$.State.OP_START;break}break;case vW$.State.OP_MINUS:switch(Q){case vW$.cc.E:case vW$.cc.e:this.state=vW$.State.OP_MINUS_E;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_MINUS_E:switch(Q){case vW$.cc.R:case vW$.cc.r:this.state=vW$.State.OP_MINUS_ER;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_MINUS_ER:switch(Q){case vW$.cc.R:case vW$.cc.r:this.state=vW$.State.OP_MINUS_ERR;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_MINUS_ERR:switch(Q){case vW$.cc.SPACE:case vW$.cc.TAB:this.state=vW$.State.OP_MINUS_ERR_SPC;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_MINUS_ERR_SPC:switch(Q){case vW$.cc.SPACE:case vW$.cc.TAB:continue;default:this.state=vW$.State.MINUS_ERR_ARG,this.as=Z}break;case vW$.State.MINUS_ERR_ARG:switch(Q){case vW$.cc.CR:this.drop=1;break;case vW$.cc.NL:{let X;if(this.argBuf)X=this.argBuf.bytes(),this.argBuf=void 0;else X=$.subarray(this.as,Z-this.drop);this.dispatcher.push({kind:vW$.Kind.ERR,data:X}),this.drop=0,this.as=Z+1,this.state=vW$.State.OP_START;break}default:if(this.argBuf)this.argBuf.write(Uint8Array.of(Q))}break;case vW$.State.OP_P:switch(Q){case vW$.cc.I:case vW$.cc.i:this.state=vW$.State.OP_PI;break;case vW$.cc.O:case vW$.cc.o:this.state=vW$.State.OP_PO;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_PO:switch(Q){case vW$.cc.N:case vW$.cc.n:this.state=vW$.State.OP_PON;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_PON:switch(Q){case vW$.cc.G:case vW$.cc.g:this.state=vW$.State.OP_PONG;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_PONG:switch(Q){case vW$.cc.NL:this.dispatcher.push({kind:vW$.Kind.PONG}),this.drop=0,this.state=vW$.State.OP_START;break}break;case vW$.State.OP_PI:switch(Q){case vW$.cc.N:case vW$.cc.n:this.state=vW$.State.OP_PIN;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_PIN:switch(Q){case vW$.cc.G:case vW$.cc.g:this.state=vW$.State.OP_PING;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_PING:switch(Q){case vW$.cc.NL:this.dispatcher.push({kind:vW$.Kind.PING}),this.drop=0,this.state=vW$.State.OP_START;break}break;case vW$.State.OP_I:switch(Q){case vW$.cc.N:case vW$.cc.n:this.state=vW$.State.OP_IN;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_IN:switch(Q){case vW$.cc.F:case vW$.cc.f:this.state=vW$.State.OP_INF;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_INF:switch(Q){case vW$.cc.O:case vW$.cc.o:this.state=vW$.State.OP_INFO;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_INFO:switch(Q){case vW$.cc.SPACE:case vW$.cc.TAB:this.state=vW$.State.OP_INFO_SPC;break;default:throw this.fail($.subarray(Z))}break;case vW$.State.OP_INFO_SPC:switch(Q){case vW$.cc.SPACE:case vW$.cc.TAB:continue;default:this.state=vW$.State.INFO_ARG,this.as=Z}break;case vW$.State.INFO_ARG:switch(Q){case vW$.cc.CR:this.drop=1;break;case vW$.cc.NL:{let X;if(this.argBuf)X=this.argBuf.bytes(),this.argBuf=void 0;else X=$.subarray(this.as,Z-this.drop);this.dispatcher.push({kind:vW$.Kind.INFO,data:X}),this.drop=0,this.as=Z+1,this.state=vW$.State.OP_START;break}default:if(this.argBuf)this.argBuf.writeByte(Q)}break;default:throw this.fail($.subarray(Z))}}if((this.state===vW$.State.MSG_ARG||this.state===vW$.State.MINUS_ERR_ARG||this.state===vW$.State.INFO_ARG)&&!this.argBuf)this.argBuf=new U61.DenoBuffer($.subarray(this.as,Z-this.drop));if(this.state===vW$.State.MSG_PAYLOAD&&!this.msgBuf){if(!this.argBuf)this.cloneMsgArg();this.msgBuf=new U61.DenoBuffer($.subarray(this.as))}}cloneMsgArg(){let $=this.ma.subject.length,Z=this.ma.reply?this.ma.reply.length:0,Q=new Uint8Array($+Z);if(Q.set(this.ma.subject),this.ma.reply)Q.set(this.ma.reply,$);if(this.argBuf=new U61.DenoBuffer(Q),this.ma.subject=Q.subarray(0,$),this.ma.reply)this.ma.reply=Q.subarray($)}processMsgArgs($){if(this.hdr>=0)return this.processHeaderMsgArgs($);let Z=[],Q=-1;for(let X=0;X<$.length;X++)switch($[X]){case vW$.cc.SPACE:case vW$.cc.TAB:case vW$.cc.CR:case vW$.cc.NL:if(Q>=0)Z.push($.subarray(Q,X)),Q=-1;break;default:if(Q<0)Q=X}if(Q>=0)Z.push($.subarray(Q));switch(Z.length){case 3:this.ma.subject=Z[0],this.ma.sid=this.protoParseInt(Z[1]),this.ma.reply=void 0,this.ma.size=this.protoParseInt(Z[2],Ic);break;case 4:this.ma.subject=Z[0],this.ma.sid=this.protoParseInt(Z[1]),this.ma.reply=Z[2],this.ma.size=this.protoParseInt(Z[3],Ic);break;default:throw this.fail($,"processMsgArgs Parse Error")}if(this.ma.sid<0)throw this.fail($,"processMsgArgs Bad or Missing Sid Error");if(this.ma.size<0)throw this.fail($,"processMsgArgs Bad or Missing Size Error")}fail($,Z=""){if(!Z)Z=`parse error [${this.state}]`;else Z=`${Z} [${this.state}]`;return Error(`${Z}: ${N61.TD.decode($)}`)}processHeaderMsgArgs($){let Z=[],Q=-1;for(let X=0;X<$.length;X++)switch($[X]){case vW$.cc.SPACE:case vW$.cc.TAB:case vW$.cc.CR:case vW$.cc.NL:if(Q>=0)Z.push($.subarray(Q,X)),Q=-1;break;default:if(Q<0)Q=X}if(Q>=0)Z.push($.subarray(Q));switch(Z.length){case 4:this.ma.subject=Z[0],this.ma.sid=this.protoParseInt(Z[1]),this.ma.reply=void 0,this.ma.hdr=this.protoParseInt(Z[2],Ic),this.ma.size=this.protoParseInt(Z[3],Ic);break;case 5:this.ma.subject=Z[0],this.ma.sid=this.protoParseInt(Z[1]),this.ma.reply=Z[2],this.ma.hdr=this.protoParseInt(Z[3],Ic),this.ma.size=this.protoParseInt(Z[4],Ic);break;default:throw this.fail($,"processHeaderMsgArgs Parse Error")}if(this.ma.sid<0)throw this.fail($,"processHeaderMsgArgs Bad or Missing Sid Error");if(this.ma.hdr<0||this.ma.hdr>this.ma.size)throw this.fail($,"processHeaderMsgArgs Bad or Missing Header Size Error");if(this.ma.size<0)throw this.fail($,"processHeaderMsgArgs Bad or Missing Size Error")}protoParseInt($,Z){if($.length===0||$.length>15)return-1;let Q=0;for(let X=0;X<$.length;X++){if($[X]<SW$||$[X]>Mz4)return-1;Q=Q*10+($[X]-SW$)}return Z!==void 0&&Q>Z?-1:Q}}vW$.Parser=_W$;vW$.State={OP_START:0,OP_PLUS:1,OP_PLUS_O:2,OP_PLUS_OK:3,OP_MINUS:4,OP_MINUS_E:5,OP_MINUS_ER:6,OP_MINUS_ERR:7,OP_MINUS_ERR_SPC:8,MINUS_ERR_ARG:9,OP_M:10,OP_MS:11,OP_MSG:12,OP_MSG_SPC:13,MSG_ARG:14,MSG_PAYLOAD:15,MSG_END:16,OP_H:17,OP_P:18,OP_PI:19,OP_PIN:20,OP_PING:21,OP_PO:22,OP_PON:23,OP_PONG:24,OP_I:25,OP_IN:26,OP_INF:27,OP_INFO:28,OP_INFO_SPC:29,INFO_ARG:30};vW$.cc={CR:13,E:69,e:101,F:70,f:102,G:71,g:103,H:72,h:104,I:73,i:105,K:75,k:107,M:77,m:109,MINUS:45,N:78,n:110,NL:10,O:79,o:111,P:80,p:112,PLUS:43,R:82,r:114,S:83,s:115,SPACE:32,TAB:9}});var eK0=f((fW$)=>{Object.defineProperty(fW$,"__esModule",{value:!0});fW$.MsgHdrsImpl=void 0;fW$.canonicalMIMEHeaderKey=D61;fW$.headers=kz4;var xW$=eG(),zH=oj(),sK0=$3();function D61($){let F=!0,U=Array($.length);for(let N=0;N<$.length;N++){let B=$.charCodeAt(N);if(B===58||B<33||B>126)throw sK0.InvalidArgumentError.format("header",`'${$[N]}' is not a valid character in a header name`);if(F&&97<=B&&B<=122)B-=32;else if(!F&&65<=B&&B<=90)B+=32;U[N]=B,F=B==45}return String.fromCharCode(...U)}function kz4($=0,Z=""){if($===0&&Z!=="")throw sK0.InvalidArgumentError.format("code","is required");else if($>0&&Z==="")throw sK0.InvalidArgumentError.format("description","is required");return new Vc($,Z)}var L61="NATS/1.0";class Vc{_code;headers;_description;constructor($=0,Z=""){this._code=$,this._description=Z,this.headers=new Map}[Symbol.iterator](){return this.headers.entries()}size(){return this.headers.size}equals($){if($&&this.headers.size===$.headers.size&&this._code===$._code){for(let[Z,Q]of this.headers){let X=$.values(Z);if(Q.length!==X.length)return!1;let Y=[...Q].sort(),J=[...X].sort();for(let G=0;G<Y.length;G++)if(Y[G]!==J[G])return!1}return!0}return!1}static decode($){let Z=new Vc,X=xW$.TD.decode($).split(`\r
2200
2200
  `),Y=X[0];if(Y!==L61){let J=Y.replace(L61,"").trim();if(J.length>0){if(Z._code=parseInt(J,10),isNaN(Z._code))Z._code=0;let G=Z._code.toString();J=J.replace(G,""),Z._description=J.trim()}}if(X.length>=1)X.slice(1).map((J)=>{if(J){let G=J.indexOf(":");if(G>-1){let W=J.slice(0,G),K=J.slice(G+1).trim();Z.append(W,K)}}});return Z}toString(){if(this.headers.size===0&&this._code===0)return"";let $=L61;if(this._code>0&&this._description!=="")$+=` ${this._code} ${this._description}`;for(let[Z,Q]of this.headers)for(let X=0;X<Q.length;X++)$=`${$}\r
2201
2201
  ${Z}: ${Q[X]}`;return`${$}\r
@@ -3344,7 +3344,7 @@ Caused by: ${Z.stack}`}};Ip=class Ip extends QY{constructor($,Z){super($,Z);this
3344
3344
  `).filter((Z)=>!/^Co-authored-by:\s/i.test(Z)).join(`
3345
3345
  `).trimEnd()}function DE6($){let Z=$.userName.trim(),Q=$.userEmail?.trim();if(Q)return`Co-authored-by: ${Z} <${Q}>`;return`Co-authored-by: ${Z}`}function QB1($,Z){let Q=cp(Z);if(!Q)return $;let X=Vo$($),Y=DE6(Q);if(X.includes(Y))return X;let J=X.trimEnd();return J.length>0?`${J}
3346
3346
 
3347
- ${Y}`:Y}var Io$,LE6;var XB1=L(()=>{Io$=/[\r\n<>]/,LE6=/^[^\s@<>]+@[^\s@<>]+\.[^\s@<>]+$/});var hC0=L(()=>{$8();XB1()});function OE6($){if($ instanceof TypeError)return!0;if($ instanceof Error&&!($ instanceof DOMException)&&typeof $.code==="string")return!0;if($ instanceof DOMException&&$.name==="AbortError")return!0;return!1}async function YB1($,Z,Q,X){try{return await j8(async()=>{let J=await fetch($,{...Z,signal:AbortSignal.timeout(X)});return{status:J.status,ok:J.ok,body:await J.text()}},{maxAttempts:3,minTimeout:50,maxTimeout:500,multiplier:2,jitter:0.5,isRetriable:OE6})}catch(Y){let J=Y instanceof Error?Y.message:String(Y);throw Error(`[SANDBOX_UNREACHABLE] sandbox daemon ${Q} request failed: ${J}`,{cause:Y})}}async function uC0($){try{let Z=await fetch(`${$}/health`,{signal:AbortSignal.timeout(jE6)});if(!Z.ok){try{await Z.text()}catch{}return null}let Q=await Z.json();if(typeof Q==="object"&&Q!==null&&typeof Q.bootId==="string"&&typeof Q.ready==="boolean"&&Q.setup&&typeof Q.setup.running==="boolean"&&typeof Q.setup.done==="boolean")return Q;return null}catch{return null}}async function GB1($){for(let Z=0;Z<ko$;Z++){if(await uC0($)!==null)return;let Q=(Math.random()*2-1)*wE6;await $$(Co$+Q)}throw Error(`sandbox daemon at ${$} did not respond on /health within ${ko$*Co$/1000}s`)}async function mN($,Z,Q,X,Y){return EE6($,Z,"POST",Q,X,Y)}async function EE6($,Z,Q,X,Y,J){let G={...X};if(Y&&Y.rotateToken!==void 0)G.auth=Y;let W=await YB1(`${$}/_sandbox/config`,{method:Q,headers:{"Content-Type":"application/json",Authorization:`Bearer ${Z}`},body:JSON.stringify(G)},"/_sandbox/config",J?.timeoutMs??JB1);if(!W.ok)throw new PF(W.status,W.body);return _o$(W.body,"/_sandbox/config")}async function So$($,Z,Q){let X=await YB1(`${$}/_sandbox/setup/${Q}`,{method:"POST",headers:{Authorization:`Bearer ${Z}`}},`/_sandbox/setup/${Q}`,JB1);if(!X.ok)throw Error(`sandbox daemon /_sandbox/setup/${Q} returned ${X.status}: ${X.body}`)}async function x60($,Z,Q){let X=await YB1(`${$}/_sandbox/orgfs-config`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${Z}`},body:Q},"/_sandbox/orgfs-config",JB1);if(!X.ok)throw Error(`sandbox daemon /_sandbox/orgfs-config returned ${X.status}: ${X.body}`);return _o$(X.body,"/_sandbox/orgfs-config")}function _o$($,Z){try{return JSON.parse($)}catch(Q){throw Error(`sandbox daemon ${Z} returned a malformed JSON body: ${$.slice(0,200)}`,{cause:Q})}}async function lC0($,Z,Q,X){let Y=new Headers(X.headers);for(let W of zE6)Y.delete(W);Y.set("authorization",`Bearer ${Z}`);let J=X.method!=="GET"&&X.method!=="HEAD",G=`${$}${Q.startsWith("/")?Q:`/${Q}`}`;return fetch(G,{method:X.method,headers:Y,body:J?X.body:void 0,redirect:"manual",signal:X.signal,duplex:J?"half":void 0})}var PF,jE6=500,JB1=30000,ko$=25,Co$=200,wE6=50,zE6;var zg=L(()=>{hC0();$8();PF=class PF extends Error{status;constructor($,Z){super(`sandbox daemon /_sandbox/config returned ${$}: ${Z}`);this.status=$;this.name="ConfigRequestError"}};zE6=["cookie","host","connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","accept-encoding","content-length"]});class cC0{counted=new Set;markCounted($){this.counted.add($)}consume($){return this.counted.delete($)}}class Pg{map=new Map;async run($,Z){let Q=this.map.get($);if(Q)return Q;let X=Z();this.map.set($,X);try{return await X}finally{this.map.delete($)}}}function mC0($,Z,Q){if(!$)return Q(null);if(!$.withLock)return Q($);return $.withLock(Z,Q)}function f60($){if(!$.orgId||!$.virtualMcpId||!$.branch)throw Error("composeSandboxRef: orgId, virtualMcpId and branch are all required for agent refs");return`agent:${$.orgId}:${$.virtualMcpId}:${$.branch}`}function vo$($){if(!$.startsWith("agent:"))return"";let Z=$.split(":");return Z.length>=4?Z.slice(3).join(":"):""}import{hash as PE6}from"crypto";function TE6($,Z=16){return PE6("sha256",zc$($),"hex").slice(0,Z)}function d3($){let Z=TE6($),Q=AE6(vo$($.projectRef));return Q?`${Q}-${Z}`:`s-${Z}`}function AE6($){if(!$)return"";let Z=$.split("/").pop()??"",Q="",X=!1;for(let Y of Z.toLowerCase()){let J=Y.charCodeAt(0),G=J>=97&&J<=122,W=J>=48&&J<=57;if(!G&&!W){X||=Q.length>0;continue}if(X){if(Q.length+1>=xo$)break;Q+="-",X=!1}if(Q+=Y,Q.length===xo$)break}return Q}var xo$=24;var fo$=L(()=>{QU1()});function dC0($,Z){let Q=$.replace(/\/+$/,"");if(Q.includes("{handle}"))return`${Q.replace("{handle}",Z)}/`;try{let X=new URL(Q);return X.hostname=`${Z}.${X.hostname}`,`${X.toString()}/`}catch{return`${Q}/${Z}/`}}function mp($){let Z=$.repo,Q=Z?{repository:{cloneUrl:Z.cloneUrl,repoName:Z.displayName??RE6(Z.cloneUrl),...Z.branch?{branch:Z.branch}:{},submoduleCredentials:Z.submoduleCredentials??[]},repositories:($.extraRepos??[]).filter((K)=>!!K.directoryName).map((K)=>({cloneUrl:K.cloneUrl,repoName:K.directoryName,...K.branch?{branch:K.branch}:{},submoduleCredentials:K.submoduleCredentials??[]})),...Z.userName.trim()||Z.userEmail.trim()?{identity:{userName:Z.userName,userEmail:Z.userEmail}}:{}}:void 0,X=$.tenant,Y=cp({userName:X?.userName,userEmail:X?.userEmail})??void 0,J=$.packageManager?{name:$.packageManager.name,...$.packageManager.path?{path:$.packageManager.path}:{}}:void 0,G=J?{packageManager:J,runtime:$.runtime,...$.port!==void 0?{port:$.port}:{}}:void 0,W=X?.orgId;if(!Q&&!G&&!Y&&$.cloneOnly===void 0&&!W)return null;return{...Q?{git:Q}:{},...Y?{operator:Y}:{},...W?{orgId:W}:{},...$.cloneOnly!==void 0?{cloneOnly:$.cloneOnly}:{},...G?{application:G}:{}}}function RE6($){try{let Z=new URL($);return Z.pathname.replace(/^\/+/,"").replace(/\.git$/,"")||Z.hostname}catch{return $}}var bo$=L(()=>{XB1()});function qE6($){try{return new URL($).username.length>0}catch{return!1}}function b60($){let Z=$.repo?.cloneUrl;if(!Z||!qE6(Z))return null;return{git:{repository:{cloneUrl:Z}}}}var dp=L(()=>{fo$();bo$()});async function*ho$($){let Z=$.now??(()=>Date.now()),Q=Z(),X=$.schedulingTimeoutMs??IE6,Y={pod:{},sandbox:{},events:{hasPulling:!1,hasPulled:!1},startedAt:Q},J=[],G=null,W=!1,K=(E)=>{if(W)return;if(G){let z=G;G=null,z(E)}else J.push(E)},H=()=>{if(J.length>0)return Promise.resolve(J.shift());if(W)return Promise.resolve(null);return new Promise((E)=>{G=E})},F=()=>{if(W)return;if(W=!0,G){let E=G;G=null,E(null)}},U=new AbortController,N=()=>{U.abort(),F()};if($.signal)if($.signal.aborted)U.abort(),F();else $.signal.addEventListener("abort",N,{once:!0});let B=Math.max(0,X-(Z()-Q)),D=setTimeout(()=>K("tick"),B+100),O,j=new Promise((E)=>{O=E}),w=Promise.allSettled([kE6($.kc,$.namespace,$.claimName,U.signal,Y,K,Z,O),SE6($.kc,$.namespace,$.claimName,U.signal,Y,K),_E6($.kc,$.namespace,$.claimName,j,U.signal,Y,K,Z)]);try{let E=null,z=-1,A=yo$(Y,X,Z);if(E=KB1(A),!WB1(A))z=go$(A);if(yield A,WB1(A))return;while(!W){if(await H()===null)break;let T=yo$(Y,X,Z);if(WB1(T)){let S=KB1(T);if(S!==E)E=S,yield T;return}let q=go$(T);if(q<z)continue;let b=KB1(T);if(b!==E)E=b,z=q,yield T}}finally{if(clearTimeout(D),U.abort(),$.signal)$.signal.removeEventListener("abort",N);F(),await w.catch(()=>{})}}async function uo$($,Z=VE6){let Q=new AbortController,X="claiming",Y,J=()=>{clearTimeout(Y),Y=setTimeout(()=>Q.abort(),Z)};try{J();for await(let G of $(Q.signal)){if(G.kind==="ready")return;if(G.kind==="failed")throw new QY(G.message);X=G.kind,J()}}finally{clearTimeout(Y),Q.abort()}throw new Ip(`Sandbox did not become ready: no progress for ${Math.round(Z/1000)}s while ${X}`)}function yo$($,Z,Q){let{pod:X,sandbox:Y,events:J,startedAt:G}=$;if(Y.ready)return{kind:"ready"};let W=X.containerWaitingReason;if(W==="ImagePullBackOff"||W==="ErrImagePull")return{kind:"failed",reason:"image-pull-backoff",message:"Sandbox image failed to download. The cluster may be missing pull credentials or the image tag may not exist."};if(W==="CrashLoopBackOff")return{kind:"failed",reason:"crash-loop-backoff",message:"Sandbox crashed during startup and is now in CrashLoopBackOff. Check pod logs."};if(!X.scheduled&&J.lastFailedSchedulingAt!==void 0&&Q()-G>Z)return{kind:"failed",reason:"scheduling-timeout",message:J.failedSchedulingMessage??`Pod could not be scheduled within ${Math.round(Z/1000)}s.`};if(X.containerRunning&&!X.containerReady)return{kind:"warming-daemon",since:G};if(J.hasPulling&&!J.hasPulled)return{kind:"pulling-image",since:G};if(W==="ContainerCreating"||W==="PodInitializing"||X.scheduled&&!X.containerRunning)return{kind:"starting-container",since:G};if(X.scheduledFalseReason==="Unschedulable"||J.lastFailedSchedulingAt!==void 0&&!X.scheduled)return{kind:"waiting-for-capacity",since:G,message:J.failedSchedulingMessage??X.scheduledFalseMessage,nodeClaim:J.nominatedNodeClaim};return{kind:"claiming",since:G}}function WB1($){return $.kind==="ready"||$.kind==="failed"}function go$($){switch($.kind){case"claiming":return 0;case"waiting-for-capacity":return 1;case"pulling-image":return 2;case"starting-container":return 3;case"warming-daemon":return 4;case"ready":case"failed":return 99}}function KB1($){switch($.kind){case"claiming":case"pulling-image":case"starting-container":case"warming-daemon":return $.kind;case"waiting-for-capacity":return`waiting-for-capacity:${$.message??""}:${$.nodeClaim??""}`;case"ready":return"ready";case"failed":return`failed:${$.reason}:${$.message}`}}async function kE6($,Z,Q,X,Y,J,G,W){let K=`/api/v1/namespaces/${encodeURIComponent(Z)}/pods?watch=true&labelSelector=${encodeURIComponent(`${ME6}=${Q}`)}`;return iC0({kc:$,path:K,signal:X,label:`pod/${Q}`,onEvent:(H)=>{if(H.type!=="ADDED"&&H.type!=="MODIFIED")return;let F=H.object;if(F.metadata?.name)W(F.metadata.name);CE6(F,Y,G),J("pod")}})}function CE6($,Z,Q){let Y=($.status?.conditions??[]).find((G)=>G.type==="PodScheduled");if(Y?.status==="True")Z.pod.scheduled=!0,Z.pod.scheduledFalseReason=void 0,Z.pod.scheduledFalseMessage=void 0;else if(Y?.status==="False")Z.pod.scheduled=!1,Z.pod.scheduledFalseReason=Y.reason,Z.pod.scheduledFalseMessage=Y.message;let J=($.status?.containerStatuses??[]).find((G)=>G.name===Y7.MAIN_CONTAINER_NAME);if(J)Z.pod.containerWaitingReason=J.state?.waiting?.reason,Z.pod.containerRunning=!!J.state?.running,Z.pod.containerReady=J.ready===!0}async function SE6($,Z,Q,X,Y,J){let G=`/apis/${Y7.CLAIM_API_GROUP}/${Y7.CLAIM_API_VERSION}/namespaces/${encodeURIComponent(Z)}/${Y7.CLAIM_PLURAL}?watch=true&fieldSelector=${encodeURIComponent(`metadata.name=${Q}`)}`;return iC0({kc:$,path:G,signal:X,label:`sandboxclaim/${Q}`,onEvent:(W)=>{if(W.type!=="ADDED"&&W.type!=="MODIFIED")return;let H=W.object.status?.conditions?.find((F)=>F.type==="Ready");if(!H)return;if(H.status==="True")Y.sandbox.ready=!0,Y.sandbox.notReadyReason=void 0,Y.sandbox.notReadyMessage=void 0;else Y.sandbox.ready=!1,Y.sandbox.notReadyReason=H.reason,Y.sandbox.notReadyMessage=H.message;J("sandbox")}})}async function _E6($,Z,Q,X,Y,J,G,W){let K=await Promise.race([X,new Promise((F)=>{if(Y.aborted){F(Q);return}Y.addEventListener("abort",()=>F(Q),{once:!0})})]);if(Y.aborted)return;let H=`/api/v1/namespaces/${encodeURIComponent(Z)}/events?watch=true&fieldSelector=${encodeURIComponent(`involvedObject.name=${K},involvedObject.kind=Pod`)}`;return iC0({kc:$,path:H,signal:Y,label:`events/${Q}`,onEvent:(F)=>{if(F.type!=="ADDED"&&F.type!=="MODIFIED")return;let U=F.object,N=U.reason;if(!N)return;switch(N){case"Pulling":J.events.hasPulling=!0;break;case"Pulled":J.events.hasPulling=!0,J.events.hasPulled=!0;break;case"FailedScheduling":J.events.lastFailedSchedulingAt=W(),J.events.failedSchedulingMessage=U.message;break;case"Nominated":{let B=U.message?.match(/nodeclaim\/([\w-]+)/);if(B)J.events.nominatedNodeClaim=B[1];break}default:return}G("event")}})}async function lo$($){let{kc:Z,namespace:Q,labelSelector:X,signal:Y,onDelete:J}=$,G=`/apis/${Y7.CLAIM_API_GROUP}/${Y7.CLAIM_API_VERSION}/namespaces/${encodeURIComponent(Q)}/${Y7.CLAIM_PLURAL}?watch=true&labelSelector=${encodeURIComponent(X)}`;return iC0({kc:Z,path:G,signal:Y,label:"sandboxclaim-reaper",onEvent:(W)=>{if(W.type!=="DELETED")return;let K=W.object.metadata?.name;if(K)J(K)}})}async function iC0($){let{kc:Z,path:Q,signal:X,label:Y,onEvent:J}=$,G=0;while(!X.aborted){try{let K=await AK(Z,{method:"GET",path:Q,signal:X,headers:{accept:"application/json"},stream:!0});if(!K.ok||!K.body){try{await K.body?.cancel()}catch{}if(K.status===401||K.status===403){console.warn(`[lifecycle-watcher] ${Y} stopped: watch denied (${K.status} ${K.statusText}). `+"The kubeconfig in use cannot watch SandboxClaims \u2014 if you are running locally, "+"this provider should not be active (check STUDIO_AGENT_SANDBOX_ENABLED).");return}throw Error(`watch handshake failed: ${K.status} ${K.statusText}`)}G=0;for await(let H of sc$(K.body)){if(X.aborted)return;try{J(H)}catch(F){console.warn(`[lifecycle-watcher] ${Y} onEvent threw: ${F instanceof Error?F.message:String(F)}`)}}}catch(K){if(X.aborted)return;let H=K instanceof Error?K.message:String(K);console.warn(`[lifecycle-watcher] ${Y} watch ended: ${H}`)}if(X.aborted)return;let W=M7(5000,250,G,2,0);G+=1,await $$(W,{signal:X}).catch(()=>{})}}var ME6="studio.decocms.com/sandbox-handle",IE6=300000,VE6=600000;var co$=L(()=>{$8();N60();Tj0()});import{createHash as vE6}from"crypto";import{z as WJ}from"zod";function dN($){let Z;try{Z=new URL($.trim())}catch{return null}if(Z.protocol!=="https:"||Z.search||Z.hash)return null;let Q=Z.pathname.replace(/\/+$/,"").replace(/\.git$/,"").replace(/\/+$/,"");return Q?`https://${Z.host.toLowerCase()}${Q}`:null}function y60($){return dN($)?.toLowerCase()??null}function gE6($){let Z=new Set;for(let Q of $){let X=`${y60(Q.repoUrl)??Q.repoUrl}#${Q.branch}`;if(Z.has(X))return Q;Z.add(X)}return null}function mo$($){return $.reduce((Z,Q)=>Z+Q.replicas,0)}function io$($,Z){if(Z.warmPoolName)return Z.warmPoolName;let Q=vE6("sha256").update(`${Z.repoUrl}#${Z.branch}`).digest("hex").slice(0,8);return`${$}-${Q}`}function po$($){return Math.max(0,$.size-mo$($.repos))}function ip($){return $.flatMap((Z)=>Z.repos.map((Q)=>({pool:Z,repo:Q,warmPoolName:io$(Z.name,Q)})))}function hE6($,Z){return oo$(void 0,$,!0,Z)}function no$($,{templateName:Z}){let Q=hE6(Z,$.image),X=(Y,J)=>({apiVersion:`${Y7.CLAIM_API_GROUP}/${Y7.CLAIM_API_VERSION}`,kind:"SandboxWarmPool",metadata:{name:Y,labels:{[uE6]:$.name}},spec:{replicas:J,updateStrategy:{type:"OnReplenish"},sandboxTemplateRef:{name:Q}}});return[...$.repos.map((Y)=>X(io$($.name,Y),Y.replicas)),X($.name,po$($))]}function nC0($){return $.tenant?.orgId}function FB1($,Z){if(!Z.tenant)return null;let Q=$.filter((J)=>J.tenant===Z.tenant&&J.image===Z.image),X=Z.cloneUrl?y60(Z.cloneUrl):null;if(X){let J=ip(Q).filter((W)=>y60(W.repo.repoUrl)===X),G=J.find((W)=>W.repo.branch===Z.branch)??J[0];if(G)return G}let Y=Q.find((J)=>po$(J)>0);return Y?{pool:Y,repo:null,warmPoolName:Y.name}:null}function to$($,Z,Q){return $?.warmPoolName??(Z?Q:"none")}function oo$($,Z,Q=!1,X){let Y=X&&X!=="default"?`-${X}`:"";return`${Z}${Y}${$==="harness-run"||Q?"-medium":""}`}async function UB1($){let Z=oo$($.purpose,$.templateName,$.tenantPool,$.sandboxImage);if(Z===$.templateName)return{name:Z,probes:$.probes};let Q=$.probes[Z]??null,X=Q!==null&&$.now-Q.checkedAt<$.ttlMs?Q:{checkedAt:$.now,present:await $.exists(Z)},Y={...$.probes,[Z]:X};if(X.present)return{name:Z,probes:Y};if(Q?.present!==!1)$.onAbsent?.(Z);if($.sandboxImage&&$.sandboxImage!=="default")return UB1({...$,sandboxImage:void 0,probes:Y});return{name:$.templateName,probes:Y}}function NB1($,Z,Q){let X=y60(Z);if(!X)return[];let Y=Q.replace(/^refs\/heads\//,"");return ip($).filter(({repo:J})=>y60(J.repoUrl)===X&&J.branch===Y)}class BB1{source;dirty=new Set;pods=new Map;known=new Map;constructor($){this.source=$}pools(){return this.source()}resolve($){return FB1(this.pools(),$)}markDirty($,Z){let Q=NB1(this.pools(),$,Z).map((X)=>X.warmPoolName);for(let X of Q)this.dirty.add(X);return Q}takeDirty($){return this.dirty.delete($)}pod($){return this.pods.get($)}setPod($,Z){this.pods.set($,Z)}retainPods($,Z){for(let[Q,X]of this.pods)if(X.pool===$&&!Z.has(Q))this.pods.delete(Q)}retain($){let Z=new Map($.map((X)=>[X.warmPoolName,X])),Q=[...this.known.values()].filter((X)=>!Z.has(X.warmPoolName));for(let X of this.dirty)if(!Z.has(X))this.dirty.delete(X);for(let[X,Y]of this.pods)if(!Z.has(Y.pool))this.pods.delete(X);return this.known=Z,Q}}var xE6=54,fE6,bE6=2048,yE6,g60,pC0,HB1,do$,uE6="studio.decocms.com/tenant-pool";var h60=L(()=>{a4();N60();fE6=/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/;yE6=WJ.object({runtime:WJ.enum(["node","bun","deno"]).default("node"),packageManager:WJ.enum(["npm","pnpm","yarn","bun","deno"]).optional(),packageManagerPath:WJ.string().optional(),devPort:WJ.number().int().positive().optional()}).default({runtime:"node"}),g60=WJ.object({repoUrl:WJ.string().max(bE6).transform(($,Z)=>{let Q=dN($);if(Q)return Q;return Z.addIssue({code:"custom",message:"repoUrl must be an https clone URL"}),WJ.NEVER}),branch:WJ.string().min(1).default("main"),workload:yE6,replicas:WJ.number().int().min(1)});pC0=class pC0 extends Error{poolName;size;allocated;constructor($,Z,Q){super(`pool ${$}: repos take ${Q} replicas, more than its size ${Z}`);this.poolName=$;this.size=Z;this.allocated=Q;this.name="TenantPoolCapacityError"}};HB1=WJ.object({name:WJ.string().max(xE6).regex(fE6,"pool name must be a DNS label (lowercase alphanumeric and '-')"),tenant:WJ.string().min(1).max(512),size:WJ.number().int().min(1),image:TN.default("default")}),do$=HB1.extend({repos:WJ.array(g60).default([])}).superRefine(($,Z)=>{let Q=gE6($.repos);if(Q)Z.addIssue({code:"custom",path:["repos"],message:`duplicate repo allocation ${Q.repoUrl}#${Q.branch}`});let X=mo$($.repos);if(X>$.size)Z.addIssue({code:"custom",path:["repos"],message:new pC0($.name,$.size,X).message})})});async function ao$($,Z,Q){let X=new Map;for(let Y of $){let J=Z(Y);if(!J)continue;let G=X.get(J);if(G)G.push(Y);else X.set(J,[Y])}await Promise.allSettled([...X.values()].map(async(Y)=>{for(let J of Y)await Q(J).catch(()=>{})}))}function lE6($){try{let Z=new URL($);if(Z.hostname.toLowerCase()!=="github.com")return null;let[Q,X]=Z.pathname.replace(/^\/+/,"").split("/"),Y=X?.replace(/\.git$/,"");return Q&&Y?`${Q}/${Y}`.toLowerCase():null}catch{return null}}function ro$($){if($.repositoryId)return{repositoryId:$.repositoryId};let Z=$.connectionId?lE6($.cloneUrl):null;return $.connectionId&&Z?{connectionId:$.connectionId,repo:Z}:null}var so$=L(()=>{h60()});async function pp($,Z,Q,X){let Y=(G)=>lC0(G.url,G.token,Z,Q),J=!(Q.body instanceof ReadableStream);try{let G=await Y($);if(G.status!==401||!J)return G;let W=await X.unauthorized();if(!W)return G;return await G.body?.cancel().catch(()=>{}),await Y(W)}catch(G){if(!J)throw G;let W=await X.unreachable();if(!W)throw G;return Y(W)}}var tC0=L(()=>{zg()});function Za$($,Z){return new Response(JSON.stringify(Z),{status:$,headers:{"content-type":"application/json","access-control-allow-origin":"*"}})}function eo$($){let Z=new Headers;for(let[Q,X]of $.headers.entries())if(!mE6.includes(Q.toLowerCase()))Z.set(Q,X);return new Response($.body,{status:$.status,statusText:$.statusText,headers:Z})}function $a$($,Z){let Q=Za$($,{error:Z});return Q.headers.set("x-sandbox-preview-not-ready","1"),Q}async function tp($,Z,Q){let X=await Z.base();if(!X)return $a$(404,"sandbox not found");let Y=new URL($.url);if((Y.pathname==="/_sandbox"||Y.pathname.startsWith("/_sandbox/"))&&$.method!=="GET")return Za$(404,{error:"not found"});let G=(F)=>`${F}${Y.pathname}${Y.search}`,W=new Headers($.headers);for(let F of cE6)W.delete(F);let K=$.method!=="GET"&&$.method!=="HEAD",H={method:$.method,headers:W,body:K?$.body:void 0,redirect:"manual",signal:$.signal,duplex:K?"half":void 0};try{return eo$(await fetch(G(X),H))}catch(F){let U=`${X}${Y.pathname}`;if(console.warn(`[${Q}] preview fetch to ${U} failed: ${F instanceof Error?F.message:String(F)}`),Z.invalidate(),$.method==="GET"||$.method==="HEAD"){let N=await Z.retryBase();if(N)try{return eo$(await fetch(G(N),H))}catch(B){console.warn(`[${Q}] preview fetch retry to ${U} failed: ${B instanceof Error?B.message:String(B)}`)}}return $a$(502,"sandbox daemon unreachable")}}var np="x-sandbox-preview-not-ready",cE6,mE6;var oC0=L(()=>{cE6=["cookie","host","connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","accept-encoding","content-length","upgrade"],mE6=["connection","keep-alive","transfer-encoding","content-encoding","content-length"]});import{createHash as dE6,randomBytes as iE6,randomUUID as Qa$}from"crypto";import*as Ha$ from"net";import{PassThrough as pE6}from"stream";function Xa$($){if($ instanceof Error)return $.message;if($&&typeof $==="object"){let Z=$;if(Z.error instanceof Error)return Z.error.message;if(typeof Z.message==="string"&&Z.message)return Z.message}return String($)}function Ga$($){return{pool:$.warmPoolName,org:$.pool.tenant}}class zB1{records=new Map;inflight=new Pg;activeGauge=new cC0;stateStore;previewUrlPattern;kubeConfig;capacityProbe;portForward;namespace;sandboxTemplateName;envName;tokenGenerator;idleTtlMs;metrics;previewGateway;sentinelToken;mintCloneUrl;mintPoolCloneUrl;mintOrgFsConfig;forwardPort;daemonAddress;persistCredentials;tenantPools;tenantPoolRefreshMs;templateProbes={};closed=!1;claimWatchAbort=new AbortController;constructor($={}){this.stateStore=$.stateStore??null,this.previewUrlPattern=$.previewUrlPattern??null,this.kubeConfig=$.kubeConfig??Jz6(),this.portForward=new uN1(this.kubeConfig),this.namespace=$.namespace??nE6,this.sandboxTemplateName=$.sandboxTemplateName??tE6,this.envName=Fz6($.envName),this.tokenGenerator=$.tokenGenerator??(()=>iE6(aE6).toString("hex")),this.idleTtlMs=$.idleTtlMs??sE6,this.metrics=$.meter?Yz6($.meter):null,this.previewGateway=$.previewGateway&&$.previewUrlPattern?{...$.previewGateway}:null;let Z=$.sentinelToken?.trim()??"";this.sentinelToken=Z.length>0?Z:null,this.mintCloneUrl=$.mintCloneUrl,this.mintPoolCloneUrl=$.mintPoolCloneUrl,this.mintOrgFsConfig=$.mintOrgFsConfig,this.forwardPort=$.forwardPort,this.daemonAddress=$.daemonAddress??"forward",this.persistCredentials=$.persistCredentials??!0;let Q=$.tenantPools;if(this.tenantPools=this.sentinelToken===null?null:new BB1(typeof Q==="function"?Q:()=>Q??[]),this.sentinelToken===null&&(typeof Q==="function"||(Q?.length??0)>0))console.warn(`[${V6}] tenant pools configured without a sentinel token \u2014 ignoring them (warm-pool mode is off)`);this.tenantPoolRefreshMs=$.tenantPoolRefreshMs??$z6,this.startClaimReaper(),this.startCredentialRefresher(),this.startTenantPoolReconciler()}startClaimReaper(){let $=["app.kubernetes.io/managed-by=studio","app.kubernetes.io/name=studio-sandbox",...this.envName?[`${KJ.env}=${this.envName}`]:[]].join(",");lo$({kc:this.kubeConfig,namespace:this.namespace,labelSelector:$,signal:this.claimWatchAbort.signal,onDelete:(Z)=>this.invalidateRecord(Z)})}async ensure($,Z={}){let Q=d3($);if(Q.startsWith("s-"))throw Error(`ensure: projectRef has no slug source: ${$.projectRef}`);return this.inflight.run(Q,()=>mC0(this.stateStore,$,(X)=>this.ensureLocked($,Q,Z,X)))}async delete($){let Z=await this.getRecord($);if(this.records.delete($),Z)this.dropRecord(Z);if(await this.deleteHttpRouteIfManaged($).catch((Q)=>{console.warn(`[${V6}] HTTPRoute delete failed for ${$}: ${Q instanceof Error?Q.message:String(Q)}`)}),await pR(this.kubeConfig,this.namespace,$),this.stateStore)if(Z)await this.stateStore.delete(Z.id);else await this.stateStore.deleteByHandle($)}lastTermination($){return mc$(this.kubeConfig,this.namespace,KJ.sandboxHandle,$,Y7.MAIN_CONTAINER_NAME)}async alive($){return await hD(this.kubeConfig,this.namespace,$)!==void 0}watchClaimLifecycle($,Z){return ho$({kc:this.kubeConfig,namespace:this.namespace,claimName:$,signal:Z})}hasSchedulableCapacity(){return this.capacityProbe??=$m$(this.kubeConfig,this.namespace),this.capacityProbe()}async getPreviewUrl($){let Z=await this.getRecord($);if(!Z)return null;return this.composePreviewUrl(Z)}async proxyDaemonRequest($,Z,Q){let X=await this.getRecord($);if(!X&&this.previewUrlPattern&&this.stateStore){let K=await this.stateStore.getByHandle($),H=K?.state,F=H?.token;if(K&&F){let N=`http://${H?.adoptedSandboxName??$}.${this.namespace}.svc.cluster.local:${iN}`;try{let B=await lC0(N,F,Z,Q);if(B.status!==404)return B;try{await B.body?.cancel()}catch{}}catch{}}}if(!X)X=await this.resurrectByHandle($);if(!X)return new Response(JSON.stringify({error:"sandbox not found"}),{status:404,headers:{"content-type":"application/json"}});let Y=X,J=performance.now(),G=0,W=(K)=>{return Y=K,{url:K.daemonUrl,token:K.token}};try{let K=await pp(W(X),Z,Q,{unauthorized:async()=>{this.invalidateRecord($);let H=await this.getRecord($).catch(()=>null)??await this.resurrectByHandle($).catch(()=>null);return H?W(H):null},unreachable:async()=>{this.invalidateRecord($);let H=await this.resurrectByHandle($)??await this.getRecord($).catch(()=>null);return H?W(H):null}});return G=K.status,K}finally{this.recordProxyDuration("daemon",G,Y,performance.now()-J)}}async adoptLiveClaim($,Z){if(this.records.has(Z))return!0;let Q=await hD(this.kubeConfig,this.namespace,Z).catch(()=>{return});if(!Q||Q.metadata?.deletionTimestamp)return!1;return await this.inflight.run(Z,async()=>{let Y=this.records.get(Z);if(Y)return this.toSandbox(Y);let J=await this.adopt($,Z,Q);if(!J)throw Error(`cannot adopt live claim ${Z}`);return mC0(this.stateStore,$,(G)=>this.finish(J,G,!0,!0,"adopt"))}).catch(()=>null)!=null}async resolvePreviewUpstreamUrl($){if(this.previewUrlPattern)return`http://${await this.resolveServiceNameForHandle($)}.${this.namespace}.svc.cluster.local:${iN}`;let Z=await this.getRecord($);if(Z)return Z.daemonUrl;let Q=await this.resurrectByHandle($);return Q?Q.daemonUrl:null}async daemonEndpoint($){let Z=await this.getRecord($)??await this.resurrectByHandle($);if(!Z)return null;return{url:this.daemonAddress==="service"?`http://${Z.adoptedSandboxName}.${this.namespace}.svc.cluster.local:${iN}`:Z.daemonUrl,token:Z.token}}listSandboxes(){return[...this.records.values()].map(($)=>{let Z=$.ensureOpts,Q=Z?.tenant;return{handle:$.handle,tenant:Q?{orgId:Q.orgId,userId:Q.userId}:null,repos:[Z?.repo,...Z?.extraRepos??[]].filter((X)=>X!==void 0).map(ro$).filter((X)=>X!==null),orgFs:Boolean(Z?.orgFsConfigJson)||$.orgFsRedacted===!0}})}async resolveServiceNameForHandle($){let Z=this.records.get($);if(Z)return Z.adoptedSandboxName;if(this.stateStore){let X=(await this.stateStore.getByHandle($).catch(()=>null))?.state?.adoptedSandboxName;if(X)return X}return $}async proxyPreviewRequest($,Z){let Q=performance.now(),X=this.records.get($)??null,Y=0;try{let J=await tp(Z,{base:()=>this.resolvePreviewUpstreamUrl($),invalidate:()=>this.invalidateRecord($),retryBase:async()=>{return await this.resurrectByHandle($).catch(()=>null)?this.resolvePreviewUpstreamUrl($):null}},V6);return Y=J.status,J}finally{this.recordProxyDuration("preview",Y,X,performance.now()-Q,$)}}async ensureLocked($,Z,Q,X){if(Q.image)console.warn(`[${V6}] opts.image ignored (template ${this.sandboxTemplateName} pins image): got ${Q.image}`);if(X){let G=await X.get($);if(G){let W=await this.rehydrate($,Z,G);if(W)return await this.refreshDaemonGitCredential(W,Q),await this.relayOrgFsConfig(W.daemonUrl,W.token,Q.orgFsConfigJson),this.finish(W,X,!1,!0,"resume");await X.delete($)}}let Y=await hD(this.kubeConfig,this.namespace,Z).catch(()=>{return});if(Y)if(Y.metadata?.deletionTimestamp)await D60(this.kubeConfig,this.namespace,Z).catch((G)=>{console.warn(`[${V6}] wait for terminating claim ${Z} failed: ${G instanceof Error?G.message:String(G)}`)});else if(!LB1(Y)){let G=await this.join($,Z,Q,Y).catch((W)=>{return console.warn(`[${V6}] join of starting claim ${Z} failed, recreating: ${W instanceof Error?W.message:String(W)}`),null});if(G)return this.finish(G,X,!0,!0,"adopt");await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),await D60(this.kubeConfig,this.namespace,Z).catch((W)=>{console.warn(`[${V6}] wait for deleted claim ${Z} failed: ${W instanceof Error?W.message:String(W)}`)})}else{let G=await this.adopt($,Z,Y).catch((W)=>{return console.warn(`[${V6}] adopt ${Z} failed, recreating: ${W instanceof Error?W.message:String(W)}`),null});if(G)return await this.refreshDaemonGitCredential(G,Q),await this.relayOrgFsConfig(G.daemonUrl,G.token,Q.orgFsConfigJson),this.finish(G,X,!0,!0,"adopt");await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),await D60(this.kubeConfig,this.namespace,Z).catch((W)=>{console.warn(`[${V6}] wait for deleted claim ${Z} failed: ${W instanceof Error?W.message:String(W)}`)})}let J=await this.provision($,Z,Q);return this.finish(J,X,!0,!1,"fresh")}async finish($,Z,Q,X,Y){let J=this.records.get($.handle),G=J!==void 0;if(J&&J.daemonForward!==$.daemonForward)this.closeForwarder(J.daemonForward);if(this.records.set($.handle,$),Q)await this.persist(Z,$);if(X)await Pj0(this.kubeConfig,this.namespace,$.handle,this.computeShutdownTime()).catch((W)=>console.warn(`[${V6}] TTL refresh failed for ${$.handle}: ${W instanceof Error?W.message:String(W)}`));if(this.metrics){let W=jB1($.tenant);if(this.metrics.ensureOutcome.add(1,{...W,outcome:Y}),!G)this.metrics.active.add(1,W),this.activeGauge.markCounted($.handle)}return this.toSandbox($)}buildEnvMap($,Z){let Q={},X=[];for(let[Y,J]of Object.entries($.env??{}))if(rE6.has(Y))X.push(Y);else Q[Y]=J;if(X.length>0)console.warn(`[${V6}] opts.env keys overlap reserved bootstrap names and were dropped: ${X.join(",")}`);return{...Q,DAEMON_TOKEN:Z.token,DAEMON_BOOT_ID:Z.daemonBootId,APP_ROOT:Z.workdir,PROXY_PORT:String(iN)}}async resolveTemplateName($,Z,Q){let{name:X,probes:Y}=await UB1({purpose:$,tenantPool:Z,...Q?{sandboxImage:Q}:{},templateName:this.sandboxTemplateName,probes:this.templateProbes,now:Date.now(),ttlMs:oE6,exists:(J)=>hc$(this.kubeConfig,this.namespace,J),onAbsent:(J)=>console.warn(`[${V6}] SandboxTemplate ${J} not found (or not readable) \u2014 this claim falls back to a template without that suffix. Upgrade the sandbox-env chart to the version that renders it.`)});return this.templateProbes=Y,X}buildClaim($,Z,Q,X,Y){let J=this.sentinelToken!==null,G=J?[]:Object.entries(this.buildEnvMap(Z,Q)).sort(([H],[F])=>H<F?-1:H>F?1:0).map(([H,F])=>({name:H,value:F})),W=Bz6(Z),K=Object.keys(W).length>0;return{apiVersion:`${Y7.CLAIM_API_GROUP}/${Y7.CLAIM_API_VERSION}`,kind:"SandboxClaim",metadata:{name:$,namespace:this.namespace,labels:{"app.kubernetes.io/name":"studio-sandbox","app.kubernetes.io/managed-by":"studio",...this.envName?{[KJ.env]:this.envName}:{},...OB1(Z.tenant)},...K?{annotations:W}:{}},spec:{sandboxTemplateRef:{name:Y},additionalPodMetadata:{labels:OB1(Z.tenant,{[KJ.role]:"claimed",[KJ.sandboxHandle]:$,...this.envName?{[KJ.env]:this.envName}:{}}),...K?{annotations:W}:{}},env:G,warmpool:to$(X,J,Y),lifecycle:{shutdownPolicy:"Delete",shutdownTime:this.computeShutdownTime()}}}}async provision($,Z,Q){let X=this.tokenGenerator(),Y=Qa$(),J=aC0,G=this.claimTenantPoolBinding(Q),W=this.buildClaim(Z,Q,{token:X,daemonBootId:Y,workdir:J},G,await this.resolveTemplateName(Q.purpose,G!==null,Q.sandboxImage));try{await WU1(this.kubeConfig,this.namespace,W)}catch(K){if(K instanceof U60)await D60(this.kubeConfig,this.namespace,Z),await WU1(this.kubeConfig,this.namespace,W);else throw K}return this.bind($,Z,Q,G,{token:X,daemonBootId:Y,workdir:J})}claimTenantPoolBinding($){return this.tenantPools?.resolve({tenant:nC0($),image:$.sandboxImage??"default",cloneUrl:$.repo?.cloneUrl,branch:$.repo?.branch})??null}async bind($,Z,Q,X,{token:Y,daemonBootId:J,workdir:G}){let W;try{W=await uc$(this.kubeConfig,this.namespace,Z),await uo$((B)=>this.watchClaimLifecycle(Z,B))}catch(B){throw await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),B}try{await this.ensureServicePortForAdoptedSandbox(W),await this.ensureHttpRouteForHandle(Z,W,Q.tenant??null)}catch(B){throw await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),B}let K=await this.openForwarder(W,iN,Z),H=`http://127.0.0.1:${K.localPort}`,F=X?.repo!=null&&W!==Z,U=this.workloadConfigPayload(Q,F),N=J;try{if(await GB1(H),this.sentinelToken!==null){let B=await uC0(H);if(B)N=B.bootId;try{await mN(H,this.sentinelToken,U??{},{rotateToken:Y})}catch(D){if(D instanceof PF&&D.status===401)console.warn(`[${V6}] sentinel rejected by adopted pod (handle=${Z}, sandbox=${W}): pod belongs to another claim; tearing down and reprovisioning`);throw D}}else if(U)await mN(H,Y,U);await this.relayOrgFsConfig(H,Y,Q.orgFsConfigJson)}catch(B){throw this.closeForwarder(K),await this.deleteHttpRouteIfManaged(Z).catch(()=>{}),await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),B}return{id:$,handle:Z,adoptedSandboxName:W,token:Y,workdir:G,daemonUrl:H,daemonForward:K,workload:Q.workload??null,daemonBootId:N,tenant:Q.tenant??null,tenantPoolPodBound:F,ensureOpts:Ez6(Q)}}workloadConfigPayload($,Z){return mp({runtime:$?.workload?.runtime??"node",packageManager:$?.workload?.packageManager?{name:$.workload.packageManager,...$.workload.packageManagerPath?{path:$.workload.packageManagerPath}:{}}:null,repo:$?.repo??null,extraRepos:$?.extraRepos??[],port:$?.workload?.devPort??Ya$,tenant:$?.tenant??void 0,...$?{cloneOnly:$.cloneOnly===!0&&!Z}:{}})}async relayOrgFsConfig($,Z,Q){if(!Q)return;await x60($,Z,Q).catch((X)=>console.warn("[org-fs] sidecar config relay failed",X))}async refreshDaemonGitCredential($,Z){let Q=b60(Z);if(!Q)return;try{await mN($.daemonUrl,$.token,Q)}catch(X){console.warn(`[${V6}] git credential refresh failed for ${$.handle}: ${X instanceof Error?X.message:String(X)}`)}}async withFreshCloneUrl($,Z={}){if(!this.mintCloneUrl)return $;try{let Q=await this.mintCloneUrl($,Z);if(!Q)return $;let{credentialExpiresAt:X,...Y}=$;return{...Y,cloneUrl:Q}}catch(Q){return console.warn(`[${V6}] clone credential re-mint failed: ${Q instanceof Error?Q.message:String(Q)}`),$}}async withFreshCredentials($,Z=!1){return{...$,...$.repo?{repo:await this.withFreshCloneUrl($.repo,{tenant:$.tenant})}:{},...$.orgFsConfigJson||Z?{orgFsConfigJson:await jz6($,this.mintOrgFsConfig)}:{}}}startCredentialRefresher(){if(!this.mintCloneUrl)return;let{signal:$}=this.claimWatchAbort;(async()=>{while(!$.aborted){if(await $$(Zz6,{signal:$}).catch(()=>{}),$.aborted)break;try{await this.refreshAllGitCredentials()}catch(Z){console.warn(`[${V6}] periodic credential refresh failed: ${Z instanceof Error?Z.message:String(Z)}`)}}})()}startTenantPoolReconciler(){let $=this.tenantPools;if(!$)return;let{signal:Z}=this.claimWatchAbort;(async()=>{while(!Z.aborted){try{await this.reconcileTenantPools($)}catch(Q){console.warn(`[${V6}] tenant pool reconcile failed: ${Q instanceof Error?Q.message:String(Q)}`)}await $$(eE6,{signal:Z}).catch(()=>{})}})()}listTenantPools(){return this.tenantPools?.pools()??[]}markTenantPoolsDirty($,Z){return Promise.resolve(this.tenantPools?.markDirty($,Z)??[])}async reconcileTenantPools($){let Z=ip($.pools());for(let Q of $.retain(Z))this.recordPoolGone(Q);for(let Q of Z){let X=Q.warmPoolName,Y=await lc$(this.kubeConfig,this.namespace,X);if(Y===null){console.warn(`[${V6}] tenant pool ${X}: no SandboxWarmPool (or no selector yet) in ${this.namespace}`);continue}let J=$.takeDirty(X),G=Y.filter((W)=>!W.labels[KJ.sandboxHandle]);$.retainPods(X,new Set(Y.map((W)=>W.uid)));for(let W of G){if(this.claimWatchAbort.signal.aborted)return;await this.warmPoolPod($,Q,W,J)}this.recordPoolDepth($,Q,Y,G)}}recordPoolGone($){let Z=Ga$($);for(let Q of["ready","bound","pending","failed"])this.metrics?.poolPods.record(0,{...Z,state:Q})}recordPoolDepth($,Z,Q,X){let Y=this.metrics?.poolPods;if(!Y)return;let J=0,G=0;for(let K of X){let H=$.pod(K.uid);if(!H)continue;if(H.failures>=rC0)G++;else if(H.lastConfigAt>0)J++}let W=Ga$(Z);Y.record(J,{...W,state:"ready"}),Y.record(Q.length-X.length,{...W,state:"bound"}),Y.record(X.length-J-G,{...W,state:"pending"}),Y.record(G,{...W,state:"failed"})}async warmPoolPod($,Z,Q,X){let Y=Z.warmPoolName,{workload:J}=Z.repo,G=$.pod(Q.uid);if(G&&G.failures>=rC0){if(Date.now()-G.lastFailureAt<Ja$)return;$.setPod(Q.uid,{...G,failures:0})}let W=X||G!==void 0&&Date.now()-G.lastConfigAt>=this.tenantPoolRefreshMs;if(G&&!W)return;let K=await this.allocationCloneUrl(Z);if(!K){this.recordPoolFailure($,Q,Y,"clone credential mint failed");return}let H={cloneUrl:K,branch:Z.repo.branch,userName:"",userEmail:""},F=await this.openForwarder(Q.name,iN,Q.name).catch(()=>null);if(!F){this.recordPoolFailure($,Q,Y,"port-forward failed");return}let U=`http://127.0.0.1:${F.localPort}`;try{await GB1(U);let N=this.sentinelToken;if(!N)return;if(!await this.isPoolPodUnbound(Q))return;let B=mp({runtime:J.runtime,packageManager:J.packageManager?{name:J.packageManager,...J.packageManagerPath?{path:J.packageManagerPath}:{}}:null,repo:H,port:J.devPort??Ya$})??{},{transition:D}=await mN(U,N,B);if(W&&D!=="bootstrap"&&await this.isPoolPodUnbound(Q))await So$(U,N,"clone");$.setPod(Q.uid,{pool:Y,lastConfigAt:Date.now(),lastFailureAt:0,failures:0}),console.log(`[${V6}] tenant pool ${Y}: warmed ${Q.name} (${D})`)}catch(N){this.recordPoolFailure($,Q,Y,N instanceof Error?N.message:String(N))}finally{this.closeForwarder(F)}}async allocationCloneUrl({pool:$,repo:Z}){if(!this.mintPoolCloneUrl)return`${Z.repoUrl}.git`;try{return await this.mintPoolCloneUrl({tenant:$.tenant,repoUrl:Z.repoUrl,branch:Z.branch})}catch(Q){return console.warn(`[${V6}] tenant pool clone credential mint failed: ${Q instanceof Error?Q.message:String(Q)}`),null}}isPoolPodUnbound($){return cc$(this.kubeConfig,this.namespace,$.name,KJ.sandboxHandle)}recordPoolFailure($,Z,Q,X){let Y=$.pod(Z.uid),J=(Y?.failures??0)+1;$.setPod(Z.uid,{pool:Q,lastConfigAt:Y?.lastConfigAt??0,lastFailureAt:Date.now(),failures:J});let G=J>=rC0?` \u2014 backing off ${Ja$/60000}min`:"";console.warn(`[${V6}] tenant pool ${Q}: warming ${Z.name} failed (${J}/${rC0})${G}: ${X}`)}async refreshAllGitCredentials(){await ao$(this.records.values(),($)=>$.ensureOpts?.repo?.connectionId,async($)=>{if(this.claimWatchAbort.signal.aborted)return;let Z=$.ensureOpts?.repo;if(!Z)return;try{let Q=await this.withFreshCloneUrl(Z,{bufferMs:Qz6,tenant:$.ensureOpts?.tenant});await this.refreshDaemonGitCredential($,{...$.ensureOpts,repo:Q}),$.ensureOpts={...$.ensureOpts,repo:Q}}catch(Q){throw console.warn(`[${V6}] git credential refresh failed for ${$.handle}: ${Q instanceof Error?Q.message:String(Q)}`),Q}})}async rebootstrapDaemon($,Z,Q){if(this.sentinelToken===null)return!1;let X=this.workloadConfigPayload(Q,!1)??{};try{return await mN($,this.sentinelToken,X,{rotateToken:Z}),await this.relayOrgFsConfig($,Z,Q?.orgFsConfigJson),!0}catch(Y){if(Y instanceof PF&&Y.status===401)try{return await mN($,Z,X,{rotateToken:Z}),await this.relayOrgFsConfig($,Z,Q?.orgFsConfigJson),!0}catch(J){return console.warn(`[${V6}] re-bootstrap retry with claim token failed: ${J instanceof Error?J.message:String(J)}`),!1}return console.warn(`[${V6}] re-bootstrap failed: ${Y instanceof Error?Y.message:String(Y)}`),!1}}async ensureServicePortForAdoptedSandbox($){if(!this.previewGateway||!this.previewUrlPattern)return;await rc$(this.kubeConfig,this.namespace,$,{name:"daemon",port:iN,targetPort:iN})}async ensureHttpRouteForHandle($,Z,Q){if(!this.previewGateway||!this.previewUrlPattern)return;let X=zz6(this.previewUrlPattern,$);if(!X)throw new QY(`Unable to derive preview hostname for ${$} from pattern: ${this.previewUrlPattern}`);let Y={apiVersion:`${HU1.API_GROUP}/${HU1.API_VERSION}`,kind:"HTTPRoute",metadata:{name:$,namespace:this.namespace,labels:OB1(Q??void 0,{[KJ.role]:"claimed",[KJ.sandboxHandle]:$,"app.kubernetes.io/name":"studio-sandbox","app.kubernetes.io/managed-by":"studio",...this.envName?{[KJ.env]:this.envName}:{}})},spec:{parentRefs:[{kind:"Gateway",group:"gateway.networking.k8s.io",name:this.previewGateway.name,namespace:this.previewGateway.namespace}],hostnames:[X],rules:[{backendRefs:[{group:"",kind:"Service",name:Z,port:iN}]}]}};await tc$(this.kubeConfig,this.namespace,Y)}async deleteHttpRouteIfManaged($){if(!this.previewGateway)return;await oc$(this.kubeConfig,this.namespace,$)}async rehydrate($,Z,Q){let X=Q.state;if(!X.adoptedSandboxName&&!X.podName||!X.token)return null;let Y=await hD(this.kubeConfig,this.namespace,Z).catch(()=>{return});if(!Y||!LB1(Y))return null;let J=Y.status?.sandbox?.name??X.adoptedSandboxName??X.podName??Z,G=await this.openAndProbeDaemon(J,Z);if(!G)return null;if(X.daemonBootId&&X.daemonBootId!==G.bootId){if(this.sentinelToken!==null){let W=X.ensureOpts?await this.withFreshCredentials(X.ensureOpts,X.orgFsRedacted===!0):null;if(!await this.rebootstrapDaemon(G.daemonUrl,X.token,W))return this.closeForwarder(G.daemonForward),null}else console.warn(`[${V6}] daemon restart detected (handle=${Z}): stored bootId=${X.daemonBootId} live bootId=${G.bootId}`);await this.stateStore?.put($,{handle:Z,state:{...X,daemonBootId:G.bootId}}).catch((W)=>console.warn(`[${V6}] bootId persist failed for ${Z}: ${W instanceof Error?W.message:String(W)}`))}return{id:$,handle:Z,adoptedSandboxName:J,tenantPoolPodBound:!1,token:X.token,workdir:X.workdir??aC0,daemonUrl:G.daemonUrl,daemonForward:G.daemonForward,workload:X.workload??null,daemonBootId:G.bootId,tenant:X.tenant??null,ensureOpts:X.ensureOpts??null,orgFsRedacted:X.orgFsRedacted===!0}}join($,Z,Q,X){let Y=this.sentinelToken!==null,J=Y?this.tokenGenerator():DB1(X,"DAEMON_TOKEN"),G=Y?Qa$():DB1(X,"DAEMON_BOOT_ID");if(!J||!G)throw new QY(`claim ${Z} carries no daemon token`);return this.bind($,Z,Q,this.claimTenantPoolBinding(Q),{token:J,daemonBootId:G,workdir:aC0})}async adopt($,Z,Q){if(!LB1(Q))return null;let X=Q.status?.sandbox?.name??Z;if(this.sentinelToken!==null)return null;let Y=DB1(Q,"DAEMON_TOKEN");if(!Y)return null;let J=await this.openAndProbeDaemon(X,Z);if(!J)return null;let G=Lz6(Q);if(this.previewGateway)await this.ensureServicePortForAdoptedSandbox(X).catch((W)=>{console.warn(`[${V6}] Service port backfill failed for ${Z}: ${W instanceof Error?W.message:String(W)}`)}),await this.ensureHttpRouteForHandle(Z,X,G).catch((W)=>{console.warn(`[${V6}] HTTPRoute backfill failed for ${Z}: ${W instanceof Error?W.message:String(W)}`)});return{id:$,handle:Z,adoptedSandboxName:X,tenantPoolPodBound:!1,token:Y,workdir:aC0,daemonUrl:J.daemonUrl,daemonForward:J.daemonForward,workload:null,daemonBootId:J.bootId,tenant:G,ensureOpts:null}}async openAndProbeDaemon($,Z){let Q=await this.openForwarder($,iN,Z).catch(()=>null);if(!Q)return null;let X=`http://127.0.0.1:${Q.localPort}`,Y=await uC0(X);if(!Y)return this.closeForwarder(Q),null;return{daemonForward:Q,daemonUrl:X,bootId:Y.bootId}}async getRecord($){let Z=this.records.get($);if(Z)return Z;if(!this.stateStore)return null;let Q=await this.stateStore.getByHandle($);if(!Q)return null;let X=await this.rehydrate(Q.id,$,Q);if(X)this.records.set($,X);return X}async resurrectByHandle($){if(!this.stateStore)return null;let Z=await this.stateStore.getByHandle($);if(!Z)return null;let Q=Z.state,X=Q.ensureOpts;if(!X)return null;let Y=await this.withFreshCredentials(X,Q.orgFsRedacted===!0);if(d3(Z.id)!==$)return null;return await this.ensure(Z.id,Y),this.records.get($)??null}invalidateRecord($){let Z=this.records.get($);if(!Z)return;this.records.delete($),this.dropRecord(Z)}dropRecord($){if(this.closeForwarder($.daemonForward),this.metrics&&this.activeGauge.consume($.handle))this.metrics.active.add(-1,jB1($.tenant))}recordProxyDuration($,Z,Q,X,Y){if(!this.metrics)return;this.metrics.proxyDurationMs.record(X,{...jB1(Q?.tenant??null),source:$,sandbox_handle:Q?.handle??Y??"",status_code:Z||0})}composePreviewUrl($){if(this.previewUrlPattern)return dC0(this.previewUrlPattern,$.handle);return`http://127.0.0.1:${$.daemonForward.localPort}/`}toSandbox($){return{handle:$.handle,workdir:$.workdir,previewUrl:this.composePreviewUrl($),warmPoolAdopted:$.tenantPoolPodBound===!0,provider:"kubernetes"}}async persist($,Z){if(!$)return;let Q={adoptedSandboxName:Z.adoptedSandboxName,token:Z.token,workdir:Z.workdir,workload:Z.workload,daemonBootId:Z.daemonBootId,tenant:Z.tenant,...Z.ensureOpts?this.persistCredentials?{ensureOpts:Z.ensureOpts}:wz6(Z.ensureOpts,Z.orgFsRedacted===!0):{}};await $.put(Z.id,{handle:Z.handle,state:Q})}computeShutdownTime(){return new Date(Date.now()+this.idleTtlMs).toISOString()}async releaseAfter($,Z){let Q=await hD(this.kubeConfig,this.namespace,$);if(!Q)return;let X=Dz6(Q.spec?.lifecycle?.shutdownTime,new Date(Date.now()+Z));if(!X)return;await Pj0(this.kubeConfig,this.namespace,$,X).catch((Y)=>console.warn(`[${V6}] release failed for ${$}: ${Y instanceof Error?Y.message:String(Y)}`))}async renewTtl($){let Z=await hD(this.kubeConfig,this.namespace,$);if(!Z)return;let Q=Oz6(Z.spec?.lifecycle?.shutdownTime,new Date(Date.now()+this.idleTtlMs));if(!Q)return;await Pj0(this.kubeConfig,this.namespace,$,Q).catch((X)=>console.warn(`[${V6}] TTL renew failed for ${$}: ${X instanceof Error?X.message:String(X)}`))}openForwarder($,Z,Q=$){if(this.forwardPort)return this.forwardPort($,Z,Q);let X=Gz6(Q,Z);return new Promise((Y,J)=>{let G=(W,K)=>{let H=Ha$.createServer((F)=>this.handleForwardedConnection(F,$,Z,Q));H.once("error",(F)=>{if(F.code==="EADDRINUSE"&&K<Xz6){try{H.close()}catch{}let U=wB1+(W-wB1+1)%Fa$;G(U,K+1);return}J(F)}),H.listen(W,"127.0.0.1",()=>{let F=H.address();if(!F||typeof F==="string"){H.close(),J(Error("port-forward listener failed to bind"));return}let U=F.port;Y({localPort:U,close:()=>H.close((N)=>{if(N)console.warn(`[${V6}] port-forward close on :${U} errored: ${N.message}`)})})})};G(X,0)})}handleForwardedConnection($,Z,Q,X){let Y=new pE6,J=null,G=!1,W=()=>{if(G)return;if(G=!0,Y.destroy(),J)try{J.close()}catch{}if(!$.destroyed)$.destroy()};$.pipe(Y),$.on("error",W),$.on("close",W),this.portForward.portForward(this.namespace,Z,[Q],$,null,Y).then((K)=>{let H=typeof K==="function"?K():K;if(!H){W();return}if(J=H,J.on("close",W),J.on("error",(F)=>{console.warn(`[${V6}] port-forward to ${Z}:${Q} dropped mid-connection: ${Xa$(F)}`,JSON.stringify(EB1(F))),this.invalidateRecord(X),W()}),G)try{J.close()}catch{}}).catch((K)=>{console.warn(`[${V6}] port-forward to ${Z}:${Q} failed: ${Xa$(K)}`,JSON.stringify(EB1(K))),this.invalidateRecord(X),W()})}closeForwarder($){$.close()}close(){if(this.closed)return;this.closed=!0,this.claimWatchAbort.abort();for(let $ of this.records.values())this.dropRecord($);this.records.clear()}}function Yz6($){return{active:$.createUpDownCounter("studio.sandbox.active",{description:"Active sandbox count, by runner kind, owning org, and daemon impl. Cross-checks the cAdvisor-derived count from the cluster \u2014 divergence between the two indicates orphaned claims (studio deleted but K8s didn't reap) or unattributed pods.",unit:"{sandbox}"}),ensureOutcome:$.createCounter("studio.sandbox.ensure.outcome",{description:"Outcome of each ensure() call: fresh provision, resume from state-store after restart, or adopt of a cluster-side claim studio didn't know about. Cold-start ratio is the primary input for warm-pool sizing.",unit:"{call}"}),proxyDurationMs:$.createHistogram("studio.sandbox.proxy.duration_ms",{description:"Wall-clock latency of studio-mediated requests to the sandbox daemon: tool exec proxies (source=daemon) and preview iframe traffic (source=preview).",unit:"ms"}),poolPods:$.createGauge("studio.sandbox.pool.pods",{description:"Tenant warm pool depth by pool and state: ready (warmed and unbound \u2014 what a claim can actually bind instantly), bound (serving a user), pending (unbound, not yet warmed), failed (gave up after repeated bootstrap failures). Alert on sustained ready=0: a pool that is always empty is doing nothing while costing N pods.",unit:"{pod}"})}}function EB1($){let Z=[],Q=$;for(let X=0;X<5&&Q instanceof Error;X++){let Y=Q;if(Z.push({name:Y.name,message:Y.message,...Y.code!==void 0?{code:Y.code}:{},...Y.errno!==void 0?{errno:Y.errno}:{}}),Y.cause===Q)break;Q=Y.cause}if(Q!==void 0&&!(Q instanceof Error)&&Q!==null){let X=Q,Y=X.error instanceof Error?EB1(X.error).chain:void 0;Z.push({nonError:String(Q),...typeof X.type==="string"?{type:X.type}:{},...typeof X.message==="string"?{message:X.message}:{},...X.code!==void 0?{code:X.code}:{},...typeof X.reason==="string"?{reason:X.reason}:{},...Y?{error:Y}:{},...Y===void 0&&X.error!==void 0?{rawError:String(X.error)}:{},keys:Object.keys(X)})}return{chain:Z}}function Jz6(){let $=new TC0;return $.loadFromDefault(),$}function LB1($){return Boolean($.status?.conditions?.some((Z)=>Z.type==="Ready"&&Z.status==="True"))}function DB1($,Z){let Q=$.spec?.env;if(!Q)return null;for(let X of Q)if(X.name===Z&&X.value)return X.value;return null}function Gz6($,Z){let Q=dE6("sha256").update(`${$}:${Z}`).digest();return wB1+Q.readUInt32BE(0)%Fa$}function Wa$($){let Z=$.slice(0,Kz6);return Wz6.test(Z)?Z:""}function Fz6($){if($===void 0)return null;let Z=$.trim();if(Z==="")return null;if(!Hz6.test(Z))throw Error(`AgentSandboxProvider: envName=${JSON.stringify(Z)} is not a valid DNS-label-safe environment name (lowercase alphanumeric or '-', starts with a letter, ends alphanumeric, \u226432 chars). Studio sets this from STUDIO_ENV; check the studio chart's configMap.`);return Z}function OB1($,Z={}){let Q={...Z};if($){let X=Wa$($.orgId),Y=Wa$($.userId);if(X)Q[KJ.orgId]=X;if(Y)Q[KJ.userId]=Y}return Q}function Tg($){let Z="";for(let Q of $){let X=Q.codePointAt(0)??0;Z+=X<32||X===127?" ":Q}return Z.slice(0,Uz6)}function Nz6($){try{let Z=new URL($);return Z.username="",Z.password="",Z.toString()}catch{return""}}function Bz6($){let Z={},Q=$.tenant;if(Q?.orgSlug)Z[TF.orgSlug]=Tg(Q.orgSlug);if(Q?.orgName)Z[TF.orgName]=Tg(Q.orgName);if(Q?.userEmail)Z[TF.userEmail]=Tg(Q.userEmail);if(Q?.userName)Z[TF.userName]=Tg(Q.userName);let X=$.repo;if(X){if(X.displayName)Z[TF.gitRepo]=Tg(X.displayName);let Y=Nz6(X.cloneUrl);if(Y)Z[TF.gitRepoUrl]=Tg(Y);let J=$.branch??X.branch;if(J)Z[TF.gitBranch]=Tg(J)}return Z}function Lz6($){let Z=$.metadata?.labels;if(!Z)return null;let Q=Z[KJ.orgId],X=Z[KJ.userId];if(!Q||!X)return null;let Y=$.metadata?.annotations??{};return{orgId:Q,userId:X,orgSlug:Y[TF.orgSlug],orgName:Y[TF.orgName],userEmail:Y[TF.userEmail],userName:Y[TF.userName]}}function Dz6($,Z){if($){let Q=new Date($).getTime();if(Number.isFinite(Q)&&Q<=Z.getTime())return null}return Z.toISOString()}function Oz6($,Z){if($){let Q=new Date($).getTime();if(Number.isFinite(Q)&&Q>=Z.getTime())return null}return Z.toISOString()}function jB1($){return{org_id:$?.orgId??"",user_id:$?.userId??"",runner_kind:"agent-sandbox"}}async function jz6($,Z){if(!Z||!$.tenant)return $.orgFsConfigJson;try{return await Z($.tenant)??$.orgFsConfigJson}catch(Q){return console.warn(`[${V6}] org-fs credential re-mint failed: ${Q instanceof Error?Q.message:String(Q)}`),$.orgFsConfigJson}}function Ka$($){try{let Z=new URL($.cloneUrl);Z.username="",Z.password="";let{submoduleCredentials:Q,credentialExpiresAt:X,...Y}=$;return{...Y,cloneUrl:Z.toString()}}catch{return null}}function wz6($,Z){let{orgFsConfigJson:Q,repo:X,extraRepos:Y,...J}=$,G=J,W=X&&Ka$(X);if(W)G.repo=W;if(Y)G.extraRepos=Y.map(Ka$).filter((K)=>K!==null);return Q||Z?{ensureOpts:G,orgFsRedacted:!0}:{ensureOpts:G}}function Ez6($){let Z={};if($.branch)Z.branch=$.branch;if($.repo)Z.repo=$.repo;if($.workload)Z.workload=$.workload;if($.env&&Object.keys($.env).length>0)Z.env=$.env;if($.tenant)Z.tenant=$.tenant;if($.cloneOnly)Z.cloneOnly=!0;if($.purpose)Z.purpose=$.purpose;if($.sandboxImage)Z.sandboxImage=$.sandboxImage;if($.orgFsConfigJson)Z.orgFsConfigJson=$.orgFsConfigJson;return Object.keys(Z).length>0?Z:null}function zz6($,Z){try{return new URL(dC0($,Z)).hostname||null}catch{return null}}var V6="AgentSandboxProvider",nE6="agent-sandbox-system",tE6="studio-sandbox",oE6=300000,iN=9000,Ya$=3000,aC0="/app",aE6=32,rE6,sE6=900000,eE6=60000,$z6=1800000,rC0=3,Ja$=1800000,Zz6=900000,Qz6=1800000,wB1=40000,Fa$=1e4,Xz6=256,KJ,TF,Wz6,Kz6=63,Hz6,Uz6=253;var Ua$=L(()=>{$8();Zm$();Mo$();zg();dp();Tj0();N60();co$();h60();so$();tC0();oC0();rE6=new Set(["DAEMON_TOKEN","DAEMON_BOOT_ID","APP_ROOT","PROXY_PORT"]);KJ={role:"studio.decocms.com/role",sandboxHandle:"studio.decocms.com/sandbox-handle",orgId:"studio.decocms.com/org-id",userId:"studio.decocms.com/user-id",env:"studio.decocms.com/env"},TF={orgSlug:"studio.decocms.com/org-slug",orgName:"studio.decocms.com/org-name",userEmail:"studio.decocms.com/user-email",userName:"studio.decocms.com/user-name",gitRepo:"studio.decocms.com/git-repo",gitRepoUrl:"studio.decocms.com/git-repo-url",gitBranch:"studio.decocms.com/git-branch"},Wz6=/^([A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])?)?$/;Hz6=/^[a-z]([a-z0-9-]{0,30}[a-z0-9])?$/});var Na$={};G0(Na$,{tenantPoolSchema:()=>do$,tenantPoolRepoSchema:()=>g60,tenantPoolFieldsSchema:()=>HB1,tenantPoolAllocations:()=>ip,resolveTenantPoolBinding:()=>FB1,renderTenantPoolWarmPools:()=>no$,normalizeRepoUrl:()=>dN,allocationsMatchingPush:()=>NB1,TenantPoolCapacityError:()=>pC0,PREVIEW_NOT_READY_HEADER:()=>np,AgentSandboxProvider:()=>zB1});var u60=L(()=>{Ua$();h60()});import{z as Ag}from"zod";function sC0($){if(!$||$.trim()==="")return[];let Z=Ag.array(Pz6).parse(JSON.parse($)),Q=new Set;for(let X of Z){if(Q.has(X.name))throw Error(`tenant pools: duplicate pool name ${X.name}`);Q.add(X.name)}return Z}function Ba$($){let Z=dN(`https://github.com/${$.repo}`);if(!Z)throw Error(`tenant pools: bad repo ${$.repo}`);return Z}function La$($){return $.map((Z)=>({name:Z.name,tenant:Z.orgId,size:1,image:"default",repos:[{repoUrl:Ba$(Z),branch:Z.branch,workload:Z.workload,replicas:1,warmPoolName:Z.name}]}))}function PB1($,Z){let Q=dN(Z.repoUrl)?.toLowerCase(),X=$.find((J)=>J.orgId===Z.tenant&&J.branch===Z.branch&&Ba$(J).toLowerCase()===Q);if(!X)return null;let Y=`https://github.com/${X.repo}.git`;return X.connectionId?{cloneUrl:Y,connectionId:X.connectionId}:{cloneUrl:Y}}function Da$($,Z){return async(Q)=>{let X=PB1($,Q);if(!X)return null;return X.connectionId?Z(X):X.cloneUrl}}var Pz6;var eC0=L(()=>{u60();Pz6=Ag.object({name:Ag.string().max(63).regex(/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/,"pool name must be a DNS label (lowercase alphanumeric and '-')"),orgId:Ag.string().min(1),repo:Ag.string().regex(/^[^/\s]+\/[^/\s]+$/,"repo must be `owner/name`"),connectionId:Ag.string().min(1).optional(),branch:Ag.string().min(1).default("main"),workload:g60.shape.workload})});function MB1($,Z=Date.now()){if($===void 0)return;return $===null?Z+Tz6:$.getTime()}function qB1($){return JSON.stringify([$.orgId,$.userId])}function Oa$($,Z){let Q=dN(Z);return Q?JSON.stringify([$,Q.toLowerCase()]):null}function Rz6($,Z){return"repositoryId"in Z?$.repositoryOrgs.get(Z.repositoryId):$.connectionOrgs.get(Z.connectionId)}function ja$($){let{records:Z,now:Q}=$,X=new Map,Y=new Map,J=new Map,G=0;for(let W of $.pools)for(let{repoUrl:K,branch:H}of W.repos){let F=Oa$(W.tenant,K),U=PB1($.legacyPools??[],{tenant:W.tenant,repoUrl:K,branch:H});if(F&&U){if(U.connectionId)Y.set(F,{tenant:W.tenant,repoUrl:K,connectionId:U.connectionId,cloneUrl:U.cloneUrl});continue}let N=F?Z.orgRepositories.get(F):void 0;if(!F||!N){G++;continue}Y.set(F,{tenant:W.tenant,repoUrl:K,repositoryId:N})}for(let W of $.sandboxes){let K=W.tenant;if(!K)continue;let H=Z.members.get(qB1(K));if(H===void 0){G++;continue}for(let U of W.repos){if(Rz6(Z,U)!==K.orgId){G++;continue}let N="repositoryId"in U?{repositoryId:U.repositoryId}:{connectionId:U.connectionId,repo:U.repo.toLowerCase()},B={orgId:K.orgId,userId:K.userId};X.set(JSON.stringify([B,N]),{tenant:B,repo:N})}let F=W.orgFsConfigExpiresAt;if(W.orgFs&&(F===null||F-Q<Az6))J.set(qB1(K),{orgId:K.orgId,userId:K.userId,orgSlug:H})}return{clones:[...X.values()],poolClones:[...Y.values()],orgFs:[...J.values()],refused:G}}async function wa$($,Z,Q){let X=new Set,Y=new Set,J=new Set,G=new Set,W=new Set(Q.map((D)=>D.tenant)),K=new Set;for(let D of Q)for(let{repoUrl:O}of D.repos){let j=aX(O);if(j)K.add(j.path.toLowerCase())}for(let D of Z){if(D.tenant)X.add(D.tenant.orgId),Y.add(D.tenant.userId);for(let O of D.repos)if("repositoryId"in O)G.add(O.repositoryId);else J.add(O.connectionId)}let[H,F,U,N]=await Promise.all([X.size===0?[]:$.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.organizationId as orgId","member.userId as userId","organization.slug as slug"]).where("member.organizationId","in",[...X]).where("member.userId","in",[...Y]).execute(),J.size===0?[]:$.selectFrom("connections").select(["id","organization_id"]).where("id","in",[...J]).execute(),G.size===0?[]:$.selectFrom("repositories").select(["id","organization_id"]).where("id","in",[...G]).execute(),K.size===0?[]:$.selectFrom("repositories").select(["id","organization_id","provider","host","path"]).where("organization_id","in",[...W]).where((D)=>D(D.fn("lower",["path"]),"in",[...K])).execute()]),B=new Map;for(let D of N){let O=Oa$(D.organization_id,t80({provider:D.provider,host:D.host,path:D.path}));if(O&&!B.has(O))B.set(O,D.id)}return{members:new Map(H.map((D)=>[qB1(D),D.slug])),connectionOrgs:new Map(F.map((D)=>[D.id,D.organization_id])),repositoryOrgs:new Map(U.map((D)=>[D.id,D.organization_id])),orgRepositories:B}}function RB1($){return $ instanceof Error?$.message:String($)}async function Ea$($,Z,Q){let X=0;if($.clones.length>op||$.poolClones.length>op||$.orgFs.length>AB1)console.warn(`[sandbox-credential-push] ${$.clones.length} clone, ${$.poolClones.length} pool clone and ${$.orgFs.length} org-fs mints planned; minting the first ${op}, ${op} and ${AB1}`);let Y=await z9($.clones.slice(0,op),TB1,async(U)=>{let N="repositoryId"in U.repo?{cloneUrl:"",repositoryId:U.repo.repositoryId}:{cloneUrl:`https://github.com/${U.repo.repo}.git`,connectionId:U.repo.connectionId};try{let B=await Z.mintCloneUrl(N,{bufferMs:$S0});return B?{tenant:U.tenant,repo:U.repo,cloneUrl:B,expiresAt:Q.now+$S0}:null}catch(B){return X++,console.warn(`[sandbox-credential-push] clone mint failed: ${RB1(B)}`),null}}),J=await z9($.poolClones.slice(0,op),TB1,async(U)=>{try{let N=await Z.mintCloneUrl("repositoryId"in U?{cloneUrl:"",repositoryId:U.repositoryId}:{cloneUrl:U.cloneUrl,connectionId:U.connectionId},{bufferMs:$S0});return N?{tenant:U.tenant,repoUrl:U.repoUrl,cloneUrl:N,expiresAt:Q.now+$S0}:null}catch(N){return X++,console.warn(`[sandbox-credential-push] pool clone mint failed: ${RB1(N)}`),null}}),G=await z9($.orgFs.slice(0,AB1),TB1,async(U)=>{try{let N=await Z.mintOrgFsConfig(U);return N?{tenant:{orgId:U.orgId,userId:U.userId},orgFsConfigJson:N,expiresAt:Q.now+Q.orgFsLifetimeMs}:null}catch(N){return X++,console.warn(`[sandbox-credential-push] org-fs mint failed: ${RB1(N)}`),null}}),W=Y.filter((U)=>U!==null),K=J.filter((U)=>U!==null),H=G.filter((U)=>U!==null),F=[];for(let U=0;U<Math.max(W.length,K.length,H.length);U+=qz)F.push({cloneUrls:W.slice(U,U+qz),poolCloneUrls:K.slice(U,U+qz),orgFsConfigs:H.slice(U,U+qz)});return{batches:F,failed:X}}var $S0=2700000,ZS0,Tz6=86400000,Az6=86400000,TB1=8,op=2000,AB1=200;var QS0=L(()=>{JU1();u60();a4();$8();yD();eC0();ZS0=Dc$-3600000});var HJ;var l60=L(()=>{HJ=class HJ extends Error{code;status;path;constructor($,Z,Q){super(Z.message||`Freestyle API error: ${Z.code}`);this.name="FreestyleApiError",this.code=Z.code,this.status=$,this.path=Q,Object.setPrototypeOf(this,HJ.prototype)}}});function za$(){return typeof process<"u"&&Boolean(process.versions?.node)}var XS0=($,Z)=>globalThis.fetch($,Z);async function qz6(){if(!za$())return null;try{return await import("undici")}catch{return null}}async function Iz6(){let $=await qz6();if(!$)return null;let Z=new $.Agent({allowH2:!0,connections:Mz6});return(Q,X)=>$.fetch(Q,{...X,dispatcher:Z})}function Vz6($){return(typeof $==="string"?$:$ instanceof URL?$.href:$.url).startsWith("https:")}function Pa$(){let $,Z=()=>{return $??=Iz6().then((Q)=>Q??XS0).catch(()=>XS0),$};return(Q,X)=>Vz6(Q)?Z().then((Y)=>Y(Q,X)):XS0(Q,X)}var Mz6=4;var Ta$=()=>{};function xz6($){return new Promise((Z)=>setTimeout(Z,$))}function fz6($){if(!$)return"";let Z=new URLSearchParams;for(let[X,Y]of Object.entries($)){if(Y===void 0||Y===null)continue;Z.set(X,String(Y))}let Q=Z.toString();return Q?`?${Q}`:""}function n6($){return encodeURIComponent($)}class IB1{baseUrl;authenticationHeaders;fetchImpl;backgroundEligible;constructor($={}){if(this.baseUrl=($.baseUrl??vz6).replace(/\/+$/,""),!$.fetch&&!globalThis.fetch)throw Error("No fetch implementation available. Pass `fetch` in FreestyleOptions when running on a runtime without a global fetch.");if(this.fetchImpl=$.fetch??Pa$(),"identityAccessToken"in $&&$.identityAccessToken){this.authenticationHeaders={[kz6]:$.identityAccessToken},this.backgroundEligible=!1;return}if(this.backgroundEligible=!0,"stackAccessToken"in $&&$.stackAccessToken){this.authenticationHeaders={Authorization:`Bearer ${$.stackAccessToken}`,"X-Freestyle-Team-Id":$.teamId};return}let Z=$.apiKey??globalThis.process?.env?.FREESTYLE_API_KEY;if(!Z)throw Error("No Freestyle API key provided. Pass `apiKey` in FreestyleOptions or set FREESTYLE_API_KEY.");this.authenticationHeaders={Authorization:`Bearer ${Z}`}}authHeaders(){return{...this.authenticationHeaders}}url($,Z){return`${this.baseUrl}${$}${fz6(Z)}`}async fetch($,Z={}){let Q=new Headers(Z.headers);for(let[X,Y]of Object.entries(this.authHeaders()))if(!Q.has(X))Q.set(X,Y);return this.fetchImpl(this.absoluteUrl($),{...Z,headers:Q})}absoluteUrl($){return/^https?:\/\//i.test($)?$:`${this.baseUrl}${$}`}async request($,Z,{query:Q,body:X,rawBody:Y,signal:J}={}){let G={...this.authHeaders()};if(this.backgroundEligible)G[Aa$]=String(Sz6);let W;if(Y!==void 0)G["Content-Type"]="application/octet-stream",W=Y;else if(X!==void 0)G["Content-Type"]="application/json",W=JSON.stringify(X);let K=this.url(Z,Q),H=await this.fetchImpl(K,{method:$,headers:G,body:W,signal:J});if(this.backgroundEligible&&H.status===202)try{return await this.pollBackgroundRequest(H,Z)}catch(F){if($==="GET"&&F instanceof HJ&&F.code==="BACKGROUND_RESULT_UNSTORABLE"){delete G[Aa$];let U=await this.fetchImpl(K,{method:$,headers:G,body:W});return this.finalize(U,Z)}throw F}return this.finalize(H,Z)}async pollBackgroundRequest($,Z){let Q=await $.json().catch(()=>({})),X=$.headers.get(Cz6)??Q.requestId,Y=Q.resultUrl??(X?`/v5/background-requests/${n6(X)}`:void 0);if(!Y)throw new HJ($.status,{code:"BACKGROUND_PROTOCOL_ERROR",message:"202 Accepted carried no background request id"},Z);let J=0;for(;;){await xz6(_z6);let G;try{G=await this.fetch(Y,{method:"GET"}),J=0}catch(W){if(++J>=5)throw W;continue}if(G.status===202)continue;return this.finalize(G,Z)}}async finalize($,Z){if(!$.ok){let X;try{X=await $.json()}catch{X={code:"UNKNOWN_ERROR",message:await $.text().catch(()=>$.statusText)}}throw new HJ($.status,X,Z)}if($.status===204)return;let Q=await $.text();if(!Q)return;return JSON.parse(Q)}get($,Z){return this.request("GET",$,{query:Z})}post($,Z){return this.request("POST",$,{body:Z??{}})}patch($,Z){return this.request("PATCH",$,{body:Z??{}})}put($,Z){return this.request("PUT",$,{body:Z??{}})}putEmpty($){return this.request("PUT",$,{})}putBytes($,Z,Q,X){return this.request("PUT",$,{query:Q,rawBody:Z,signal:X})}async getBytes($,Z,Q={}){let X={...this.authHeaders()};if(Q.range)X.Range=Q.range;let Y=await this.fetchImpl(this.url($,Z),{method:"GET",headers:X,signal:Q.signal});if(!Y.ok){let J;try{J=await Y.json()}catch{J={code:"UNKNOWN_ERROR",message:await Y.text().catch(()=>Y.statusText)}}throw new HJ(Y.status,J,$)}return Y}delete($,Z){return this.request("DELETE",$,{query:Z})}}var kz6="x-freestyle-identity-access-token",Aa$="x-freestyle-background-after-secs",Cz6="x-freestyle-background-request-id",Sz6=5,_z6=2000,vz6="https://api.freestyle.sh";var qK=L(()=>{l60();Ta$()});class VB1{client;verifications;certificates;placeholder;constructor($){this.client=$,this.verifications=new Ra$($),this.certificates=new qa$($),this.placeholder=new Ma$($)}async list(){let{domains:$}=await this.client.get("/v5/domains");return $}}class Ra${client;constructor($){this.client=$}create($){return this.client.post("/v5/verifications",{domain:$})}async list($={}){let{verifications:Z}=await this.client.get("/v5/verifications",$);return Z}get($){return this.client.get(`/v5/verifications/${n6($)}`)}complete($){return this.client.putEmpty(`/v5/verifications/${n6($)}`)}delete($){return this.client.delete(`/v5/verifications/${n6($)}`)}}class qa${client;constructor($){this.client=$}async list(){let{certificates:$}=await this.client.get("/v5/certificates");return $}createWildcard($){return this.client.post("/v5/certificates/wildcard",{domain:$})}}class Ma${client;constructor($){this.client=$}async get(){try{return await this.client.get("/v5/domains/placeholder")}catch($){if($ instanceof HJ&&$.status===404)return null;throw $}}set($){return this.client.put("/v5/domains/placeholder",$)}delete(){return this.client.delete("/v5/domains/placeholder")}}var kB1=L(()=>{qK();l60()});function G5($,Z){throw new SB1($,Z)}function CB1($){return bz6.some((Z)=>$[Z]!==void 0)}function _B1($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function gz6($,Z){let Q=Z.lastIndexOf("/");if(Q<0)G5($,`${$} \`${Z}\` is not a CIDR: expected address/prefix, e.g. 203.0.113.0/24 or 2001:db8::/32`);let X=Z.slice(0,Q),Y=Z.slice(Q+1);if(!/^\d+$/.test(Y))G5($,`${$} \`${Z}\`: prefix length must be a number`);let J=Number(Y),G=X.includes(":"),W=G?128:32;if(J>W)G5($,`${$} \`${Z}\`: prefix length must be 0\u2013${W}`);if(!G&&!/^\d{1,3}(\.\d{1,3}){3}$/.test(X))G5($,`${$} \`${Z}\`: \`${X}\` is not an IP address`)}function Ca$($,Z){if(!_B1($))G5(Z,`${Z} must be an object`);for(let X of Object.keys($))if(!Ia$.includes(X))G5(`${Z}.${X}`,`${Z} has unknown field \`${X}\`. Expected one of: ${Ia$.join(", ")}`);let Q=$;for(let X of["vmId","vpcId","tunnelId","cidr"]){let Y=Q[X];if(Y!==void 0&&(typeof Y!=="string"||Y.length===0))G5(`${Z}.${X}`,`${Z}.${X} must be a non-empty string`)}if(Q.public!==void 0&&Q.public!==!0)G5(`${Z}.public`,`${Z}.public must be true when present: it declares the public Internet. Omit the field to match something else`);if(Q.public===!0){if(Q.vmId!==void 0)G5(`${Z}.public`,`${Z} cannot combine \`public: true\` with \`vmId\`: that would mean the VM only when reached over its public address, a distinction this API does not make yet. Use \`vmId\` alone to match the VM on any path, or \`public: true\` alone to match public addresses`);if(Q.vpcId!==void 0)G5(`${Z}.public`,`${Z} cannot combine \`public: true\` with \`vpcId\`: that would mean the network's members only when reached over their public addresses, a distinction this API does not make yet. Use \`vpcId\` alone or \`public: true\` alone`);if(Q.tunnelId!==void 0)G5(`${Z}.public`,`${Z} cannot combine \`public: true\` with \`tunnelId\`: traffic through a tunnel arrives over the tunnel, not over the public Internet. Use \`tunnelId\` alone`)}if(Q.cidr!==void 0)gz6(`${Z}.cidr`,Q.cidr);if(Q.protocol!==void 0&&!Va$.includes(Q.protocol))G5(`${Z}.protocol`,`${Z}.protocol must be one of: ${Va$.join(", ")} (got \`${String(Q.protocol)}\`)`);if(Q.port!==void 0){if(!Number.isInteger(Q.port)||Q.port<1||Q.port>65535)G5(`${Z}.port`,`${Z}.port must be an integer between 1 and 65535`);if(Q.protocol===void 0)G5(`${Z}.protocol`,`${Z}.port ${Q.port} requires ${Z}.protocol: set it to "tcp" or "udp" so the rule opens one transport rather than both`);if(!yz6.includes(Q.protocol))G5(`${Z}.port`,`${Z}.protocol "${Q.protocol}" has no ports; remove ${Z}.port ${Q.port}`)}}function va$($,Z){if(!_B1($))G5(Z||"rule",`${Z||"rule"} must be an object`);for(let X of Object.keys($))if(!Sa$.includes(X))G5(`${Z}${X}`,`Unknown field \`${X}\`. Expected one of: ${Sa$.join(", ")}`);let Q=$;if(Q.action===void 0)G5(`${Z}action`,`${Z}action is required. Write \`action: "allow"\` \u2014 every rule states what it does rather than defaulting to it`);if(Q.action!=="allow")G5(`${Z}action`,`${Z}action must be "allow" (got \`${String(Q.action)}\`). Only allow rules exist today`);if(Q.description!==void 0){if(typeof Q.description!=="string")G5(`${Z}description`,"description must be a string");if(Q.description.length>ka$)G5(`${Z}description`,`description is too long (${Q.description.length} characters, maximum ${ka$})`)}if(Q.source===void 0)G5(`${Z}source`,`${Z}source is required`);if(Q.destination===void 0)G5(`${Z}destination`,`${Z}destination is required`);return Ca$(Q.source,`${Z}source`),Ca$(Q.destination,`${Z}destination`),Q}function hz6($){let Z=va$($,"");for(let Q of["source","destination"]){let X=Z[Q];if(CB1(X))continue;let Y=[X.port!==void 0?`port ${X.port}`:void 0,X.protocol!==void 0?`protocol ${X.protocol}`:void 0].filter(Boolean).join(", ");G5(Q,Y?`${Q} only narrows traffic (${Y}) without saying what it is. Add \`vmId\`, \`vpcId\`, \`tunnelId\`, \`cidr\`, or \`public: true\`. Leaving it out to mean "this VM" only works inside vms.create`:`${Q} is empty. A matcher must say what the traffic is: \`vmId\`, \`vpcId\`, \`tunnelId\`, \`cidr\`, or \`public: true\` for the public Internet`)}return Z}function YS0($,Z="VM"){if($===void 0||$===null)G5("firewall",`firewall is required on a ${Z} create. A ${Z} gets nothing implicitly, so state what it may reach \u2014 \`{ rules: [] }\` if the answer is nothing`);if(!_B1($))G5("firewall","firewall must be an object with a `rules` array");for(let X of Object.keys($))if(X!=="rules")G5(`firewall.${X}`,`firewall has unknown field \`${X}\`. Expected: rules`);let Q=$.rules;if(!Array.isArray(Q))G5("firewall.rules","firewall.rules must be an array");return Q.forEach((X,Y)=>{let J=`firewall.rules[${Y}].`,G=va$(X,J),W=CB1(G.source),K=CB1(G.destination);if(!W&&!K&&Z!=="network")G5(`firewall.rules[${Y}]`,`firewall.rules[${Y}]: both source and destination refer to the ${Z} being created, which allows nothing. Give one of them a \`vmId\`, \`vpcId\`, \`tunnelId\`, \`cidr\`, or \`public: true\``);if(W&&K)G5(`firewall.rules[${Y}]`,`firewall.rules[${Y}]: neither end refers to the ${Z} being created. Leave one endpoint's identity unset so it means this ${Z}, or create the rule with firewall.rules.create instead`)}),$}function _a$($){return`/v5/firewall/rules/${n6($)}`}class xa${client;constructor($){this.client=$}async create($){let Z=hz6($);return this.client.post("/v5/firewall/rules",Z)}list($={}){return this.client.get("/v5/firewall/rules",$)}get($){return this.client.get(_a$($))}delete($){return this.client.delete(_a$($))}}class vB1{client;rules;constructor($){this.client=$,this.rules=new xa$($)}evaluate($){return this.client.post("/v5/firewall/evaluate",$)}}var SB1,Ia$,bz6,Va$,yz6,ka$=1024,Sa$;var c60=L(()=>{qK();SB1=class SB1 extends Error{path;constructor($,Z){super(Z);this.name="FirewallRuleValidationError",this.path=$,Object.setPrototypeOf(this,SB1.prototype)}};Ia$=["vmId","vpcId","tunnelId","cidr","public","port","protocol"],bz6=["vmId","vpcId","tunnelId","cidr","public"],Va$=["tcp","udp","icmp"],yz6=["tcp","udp"];Sa$=["action","source","destination","description"]});function xB1($){return`/v5/identities/${n6($)}`}class fa${client;basePath;constructor($,Z){this.client=$,this.basePath=Z}create(){return this.client.post(`${this.basePath}/tokens`)}list(){return this.client.get(`${this.basePath}/tokens`)}revoke($){return this.client.delete(`${this.basePath}/tokens/${n6($)}`)}}class ba${client;basePath;constructor($,Z){this.client=$,this.basePath=Z}list(){return this.client.get(`${this.basePath}/permissions/vm`)}grant($){return this.client.post(`${this.basePath}/permissions/vm`,$)}get($){return this.client.get(`${this.basePath}/permissions/vm/${n6($)}`)}update($,Z){return this.client.patch(`${this.basePath}/permissions/vm/${n6($)}`,{allowedLinuxUsers:Z})}revoke($){return this.client.delete(`${this.basePath}/permissions/vm/${n6($)}`)}}class fB1{id;tokens;permissions;client;basePath;constructor($,Z){this.client=$,this.id=Z,this.basePath=xB1(Z),this.tokens=new fa$($,this.basePath),this.permissions={vm:new ba$($,this.basePath)}}data(){return this.client.get(this.basePath)}delete(){return this.client.delete(this.basePath)}}class bB1{client;constructor($){this.client=$}async create($={}){let Z=await this.client.post("/v5/identities",$);return{identity:new fB1(this.client,Z.id),identityId:Z.id,data:Z}}list($={}){return this.client.get("/v5/identities",$)}get($){return this.client.get(xB1($))}ref($){return new fB1(this.client,$)}delete($){return this.client.delete(xB1($))}}var yB1=L(()=>{qK()});function b1($,Z){throw new lB1($,Z)}function j7($,Z){throw new cB1($,Z)}function m60($){return uz6.some((Z)=>$[Z]!==void 0)}function tz6($){return!m60($)&&$.port===void 0}function JY($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function aa$($,Z,Q){if(typeof $!=="string"||!dz6.test($))j7(Z,`${Z} must be a valid HTTP header name`);let X=$.toLowerCase();if(nz6.has(X)||X.startsWith("x-forwarded-")||X.startsWith("x-freestyle-")||Q&&(X==="cookie"||X==="set-cookie"))j7(Z,`${Z} may not use reserved header \`${$}\``)}function oz6($,Z){if(!Array.isArray($))j7(Z,`${Z} must be an array of header names`);if($.length>ma$)j7(Z,`${Z} may contain at most ${ma$} names`);let Q=new Set;$.forEach((X,Y)=>{aa$(X,`${Z}[${Y}]`,!0);let J=X.toLowerCase();if(Q.has(J))j7(`${Z}[${Y}]`,`${Z} contains duplicate header \`${X}\``);Q.add(J)})}function ia$($){if(!JY($))j7("forwardAuth","forwardAuth must be an object");for(let X of Object.keys($))if(!ha$.includes(X))j7(X,`Unknown field \`${X}\`. Expected one of: ${ha$.join(", ")}`);let Z=$;if(typeof Z.url!=="string"||Z.url.length===0||Z.url.length>iz6)j7("url","url is required and must be an absolute HTTPS URL");let Q;try{Q=new URL(Z.url)}catch{j7("url","url must be an absolute HTTPS URL")}if(Q.protocol!=="https:"||Q.hostname.length===0||Q.username.length>0||Q.password.length>0||Q.hash.length>0||Q.port==="0")j7("url","url must be an absolute HTTPS URL");if(Z.headers!==void 0){if(!JY(Z.headers))j7("headers","headers must be an object of header name to value");let X=Object.entries(Z.headers);if(X.length>la$)j7("headers",`headers may contain at most ${la$} entries`);let Y=0,J=new Set;for(let[G,W]of X){aa$(G,`headers.${G}`,!1);let K=G.toLowerCase();if(J.has(K))j7(`headers.${G}`,`headers contains duplicate header \`${G}\``);if(J.add(K),typeof W!=="string"||/[\0\r\n]/.test(W))j7(`headers.${G}`,`headers.${G} must be a string`);Y+=G.length+W.length}if(Y>ca$)j7("headers",`headers may contain at most ${ca$} bytes`)}if(Z.timeoutMs!==void 0&&(!Number.isInteger(Z.timeoutMs)||Z.timeoutMs<100||Z.timeoutMs>5000))j7("timeoutMs","timeoutMs must be an integer between 100 and 5000");if(Z.protectedCookies!==void 0){if(!Array.isArray(Z.protectedCookies))j7("protectedCookies","protectedCookies must be an array of cookie names");if(Z.protectedCookies.length>da$)j7("protectedCookies",`protectedCookies may contain at most ${da$} names`);let X=new Set;Z.protectedCookies.forEach((Y,J)=>{if(typeof Y!=="string"||Y.length>pz6||!mz6.test(Y))j7(`protectedCookies[${J}]`,`protectedCookies[${J}] must be a valid HTTP cookie name`);if(X.has(Y))j7(`protectedCookies[${J}]`,`protectedCookies contains duplicate cookie \`${Y}\``);X.add(Y)})}if(Z.authResponseHeaders!==void 0)oz6(Z.authResponseHeaders,"authResponseHeaders");return Z}function az6($,Z){if(!JY($))b1(Z,`${Z} must be an object with an \`id\``);for(let X of Object.keys($))if(!ua$.includes(X))b1(`${Z}.${X}`,`${Z} has unknown field \`${X}\`. Expected: ${ua$.join(", ")}`);let Q=$.id;if(typeof Q!=="string"||Q.length===0)b1(`${Z}.id`,`${Z}.id is required and must be a non-empty string`)}function uB1($){if(typeof $!=="string")b1("domain","domain is required and must be a string");if($==="*")return;let Z=$.startsWith("*.")?$.slice(2):$;if(Z.length===0||Z.length>lz6)b1("domain",`domain \`${$}\` is not a hostname`);let Q=Z.split(".");if(Q.length<2)b1("domain",`domain \`${$}\` must have at least two labels, e.g. acme.com`);for(let X of Q){if(X.length===0||X.length>cz6)b1("domain",`domain \`${$}\` has an empty or over-long label`);if(!/^[a-z0-9-]+$/.test(X))b1("domain",`domain \`${$}\`: labels are lowercase letters, digits, and hyphens (a \`*.\` prefix is the only wildcard)`);if(X.startsWith("-")||X.endsWith("-"))b1("domain",`domain \`${$}\`: a label cannot start or end with a hyphen`)}}function rz6($){if(typeof $!=="string")b1("domain","domain is required and must be a string");let Z=$.lastIndexOf("@");if(Z===-1){uB1($);return}let Q=$.slice(0,Z),X=$.slice(Z+1);if(Q.length===0||Q.length>64)b1("domain",`mail route \`${$}\`: the part before \`@\` must be 1-64 characters`);if(Q.startsWith(".")||Q.endsWith(".")||Q.includes(".."))b1("domain",`mail route \`${$}\`: the part before \`@\` cannot start or end with a dot, or contain \`..\``);for(let Y of Q)if(!/[a-zA-Z0-9]/.test(Y)&&!pa$.includes(Y))b1("domain",`mail route \`${$}\`: the part before \`@\` may use letters, digits, dots, and \`${pa$.slice(0,-1)}\` (quoted mailboxes are not supported)`);if(X==="*")b1("domain",`mail route \`${$}\`: \`*\` is not a mail domain \u2014 name the domain the mailbox lives at`);uB1(X)}function na$($,Z){if(!JY($))b1(Z,`${Z} must be an object`);for(let X of Object.keys($))if(!ya$.includes(X))b1(`${Z}.${X}`,`${Z} has unknown field \`${X}\`. Expected one of: ${ya$.join(", ")}`);let Q=$;for(let X of["vmId","vpcId","host"]){let Y=Q[X];if(Y!==void 0&&(typeof Y!=="string"||Y.length===0))b1(`${Z}.${X}`,`${Z}.${X} must be a non-empty string`)}if(Q.public!==void 0&&Q.public!==!0)b1(`${Z}.public`,`${Z}.public must be true when present. Omit the field to match something else`);if(Z==="source"){if(Q.host!==void 0)b1("source.host","source.host is not allowed: a source is who opens the session, not where it lands. Put `host` on the destination");if(Q.port!==void 0)b1("source.port","source.port is not allowed: a source is who opens the session, not where it lands. Put `port` on the destination");if(Q.public===!0&&(Q.vmId!==void 0||Q.vpcId!==void 0))b1("source.public","source cannot combine `public: true` with `vmId` or `vpcId`: use one alone. `public` is every client on the Internet; `vmId`/`vpcId` is a specific dialer")}else{if(Q.vpcId!==void 0)b1("destination.vpcId","destination.vpcId is not allowed: a session lands in one place, not on a whole network. Name a `vmId`, a `host`, or `public: true` for the domain's own origin. A whole network may be a source");if([Q.vmId!==void 0,Q.host!==void 0,Q.public===!0].filter(Boolean).length>1)b1("destination","destination names more than one landing: give exactly one of `vmId`, `host`, or `public: true`");if((Q.vmId!==void 0||Q.host!==void 0)&&Q.port===void 0)b1("destination.port",`destination.port is required with ${Q.vmId!==void 0?"`vmId`":"`host`"}: say which port the session lands on`)}if(Q.port!==void 0){if(!Number.isInteger(Q.port)||Q.port<1||Q.port>65535)b1(`${Z}.port`,`${Z}.port must be an integer between 1 and 65535`)}}function sz6($){if("postgres"in $)return"postgres";if("smtp"in $)return"smtp";if("socks5"in $)return"socks5";return"http"}function ez6($,Z){function Q(W,K,H){if(!JY(W)||Object.keys(W).some((F)=>!K.includes(F)))b1(H,`${H} must contain only ${K.join(", ")}`)}if(Q($,["region","credentials","scope"],Z),typeof $.region!=="string"||!/^[a-z0-9-]{1,63}$/.test($.region))b1(`${Z}.region`,"invalid s3.region");Q($.credentials,["accessKeyId","secretAccessKey","sessionToken"],`${Z}.credentials`);for(let W of["accessKeyId","secretAccessKey","sessionToken"]){let K=$.credentials[W];if(W==="sessionToken"&&K===void 0)continue;if(typeof K!=="string"||!/^[\x21-\x7e]{1,16384}$/.test(K))b1(`${Z}.credentials.${W}`,"invalid s3 credentials")}if(!/^[a-zA-Z0-9]+$/.test($.credentials.accessKeyId))b1(`${Z}.credentials.accessKeyId`,"invalid s3 access key id");Q($.scope,["bucket","prefix","operations"],`${Z}.scope`);let{bucket:X,prefix:Y,operations:J}=$.scope;if(typeof X!=="string"||!/^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/.test(X)||X.includes(".."))b1(`${Z}.scope.bucket`,"invalid s3.scope.bucket");if(typeof Y!=="string"||Buffer.byteLength(Y,"utf8")>1024||/[\x00-\x1f\x7f-\x9f]/u.test(Y))b1(`${Z}.scope.prefix`,"invalid s3.scope.prefix");let G=["GetObject","HeadObject","PutObject","DeleteObject","ListObjectsV2","CreateMultipartUpload","UploadPart","ListParts","CompleteMultipartUpload","AbortMultipartUpload","ListMultipartUploads"];if(!Array.isArray(J)||J.length===0||J.length>G.length||J.some((W)=>!G.includes(W))||new Set(J).size!==J.length)b1(`${Z}.scope.operations`,"s3.scope.operations must be a nonempty list of distinct supported operations")}function $P6($,Z){if(!JY($))b1(Z,`${Z} must be an object: \`{ headers: { \u2026 } }\`, \`{ postgres: { \u2026 } }\`, \`{ smtp: { \u2026 } }\` or \`{ socks5: { \u2026 } }\``);let Q=Object.keys($);if(Q.length!==1||!["headers","jsonPatch","postgres","smtp","socks5","s3"].includes(Q[0]??""))b1(Z,`${Z} must have exactly one of \`headers\`, \`jsonPatch\`, \`postgres\`, \`smtp\`, \`socks5\` or \`s3\` (got: ${Q.length===0?"nothing":Q.join(", ")})`);if(Q[0]==="s3"){ez6($.s3,`${Z}.s3`);return}if(Q[0]==="jsonPatch"){let X=$.jsonPatch;if(!Array.isArray(X)||X.length>128)b1(Z,`${Z}.jsonPatch must be an array of at most 128 operations`);let Y=(W)=>typeof W==="string"&&(W===""||W.startsWith("/"))&&!/~(?:[^01]|$)/u.test(W),J=(W,K=new Set,H=0)=>{if(H>64)return!1;if(W===null||typeof W==="string"||typeof W==="boolean")return!0;if(typeof W==="number")return Number.isFinite(W);if(typeof W!=="object"||K.has(W))return!1;K.add(W);let F=(Array.isArray(W)?Array.from(W):JY(W)?Object.values(W):[void 0]).every((U)=>J(U,K,H+1));return K.delete(W),F};for(let[W,K]of X.entries()){if(!JY(K)||!["add","remove","replace","move","copy","test"].includes(String(K.op))||!Y(K.path))b1(Z,`${Z}.jsonPatch[${W}] requires a standard op and valid JSON Pointer path`);if(["move","copy"].includes(K.op)&&!Y(K.from))b1(Z,`${Z}.jsonPatch[${W}].from must be a JSON Pointer`);if(["add","replace","test"].includes(K.op)&&(!Object.hasOwn(K,"value")||!J(K.value)))b1(Z,`${Z}.jsonPatch[${W}].value must be a JSON value (null is allowed)`)}let G;try{G=JSON.stringify(X)}catch{b1(Z,"jsonPatch must be JSON serializable")}if(Buffer.byteLength(G,"utf8")>65536)b1(Z,"jsonPatch exceeds 64 KiB");return}if(Q[0]==="socks5"){let X=$.socks5;if(!JY(X))b1(`${Z}.socks5`,`${Z}.socks5 must be an object with \`username\` and \`password\``);for(let Y of Object.keys(X))if(!["username","password"].includes(Y))b1(`${Z}.socks5.${Y}`,`${Z}.socks5 has unknown field \`${Y}\`. Expected: username, password`);for(let Y of["username","password"])if(typeof X[Y]!=="string"||X[Y].length===0)b1(`${Z}.socks5.${Y}`,`${Z}.socks5.${Y} is required and must be a non-empty string`);return}if(Q[0]==="smtp"){let X=$.smtp;if(!JY(X))b1(`${Z}.smtp`,`${Z}.smtp must be an object with \`username\` and \`password\``);for(let Y of Object.keys(X))if(!["username","password"].includes(Y))b1(`${Z}.smtp.${Y}`,`${Z}.smtp has unknown field \`${Y}\`. Expected: username, password`);for(let Y of["username","password"])if(typeof X[Y]!=="string"||X[Y].length===0)b1(`${Z}.smtp.${Y}`,`${Z}.smtp.${Y} is required and must be a non-empty string`);return}if(Q[0]==="headers"){let X=$.headers;if(!JY(X))b1(`${Z}.headers`,`${Z}.headers must be an object of header name to value`);for(let[Y,J]of Object.entries(X))if(typeof J!=="string")b1(`${Z}.headers.${Y}`,`${Z}.headers.${Y} must be a string`)}else{let X=$.postgres;if(!JY(X))b1(`${Z}.postgres`,`${Z}.postgres must be an object with \`username\` and \`password\``);for(let J of Object.keys(X))if(!["username","password","database"].includes(J))b1(`${Z}.postgres.${J}`,`${Z}.postgres has unknown field \`${J}\`. Expected: username, password, database`);let Y=X;for(let J of["username","password"])if(typeof Y[J]!=="string"||Y[J].length===0)b1(`${Z}.postgres.${J}`,`${Z}.postgres.${J} is required and must be a non-empty string`);if(Y.database!==void 0&&typeof Y.database!=="string")b1(`${Z}.postgres.database`,`${Z}.postgres.database must be a string`)}}function ZP6($,Z){let Q=$;return Z.forEach((X,Y)=>{let J=sz6(X);if(Q===void 0)Q=J;else if(Q!==J)b1(`transform[${Y}]`,`transform requires protocol \`${J}\` but the rule is \`${Q}\`; a rule terminates one protocol`)}),Q??"http"}function QP6($,Z){if(!JY($)||Object.keys($).some((Q)=>Q!=="method"&&Q!=="path"))b1(Z,`${Z} must be an object containing only method and path`);if($.method!==void 0&&(!Array.isArray($.method)||$.method.some((Q)=>typeof Q!=="string"||Q.length===0||/[^!#$%&'*+.^_`|~0-9A-Za-z-]/.test(Q))))b1(`${Z}.method`,`${Z}.method must be an array of HTTP method tokens`);if($.path!==void 0){let Q=$.path;if(!JY(Q)||Object.keys(Q).length!==1||typeof Q.exact!=="string"||!Q.exact.startsWith("/")||/[\s?#]/.test(Q.exact))b1(`${Z}.path`,`${Z}.path must contain exact: an absolute path without a query or fragment`)}}function ra$($,Z){if(!JY($))b1(Z||"rule",`${Z||"rule"} must be an object`);for(let H of Object.keys($))if(!ta$.includes(H))b1(`${Z}${H}`,`Unknown field \`${H}\`. Expected one of: ${ta$.join(", ")}`);let Q=$;if(Q.action===void 0)b1(`${Z}action`,`${Z}action is required. Write \`action: "allow"\` \u2014 every rule states what it does rather than defaulting to it`);if(Q.action!=="allow")b1(`${Z}action`,`${Z}action must be "allow" (got \`${String(Q.action)}\`). Only allow rules exist today`);if(Q.protocol!==void 0&&!ga$.includes(Q.protocol))b1(`${Z}protocol`,`${Z}protocol must be one of: ${ga$.join(", ")} (got \`${String(Q.protocol)}\`)`);let X=Q.source??{},Y=Q.destination??{};na$(X,"source"),na$(Y,"destination");let J=Q.transform??[];if(!Array.isArray(J))b1(`${Z}transform`,`${Z}transform must be an array`);J.forEach((H,F)=>$P6(H,`${Z}transform[${F}]`));let G=ZP6(Q.protocol,J);if(Q.match!==void 0){if(QP6(Q.match,`${Z}match`),G!=="http"||X.public===!0||!(Y.public===!0||Y.host!==void 0))b1(`${Z}match`,"match requires HTTP egress from a VM or VPC to a public origin or host")}if(J.some((H)=>("s3"in H))){if(J.length!==1||Q.match!==void 0||X.public===!0||!(Y.public===!0||Y.host!==void 0)||Q.domain.includes("*"))b1(`${Z}transform`,"s3 requires a sole transform on HTTP egress to a concrete origin, without match")}let W=J.filter((H)=>("jsonPatch"in H));if(W.length>1)b1(`${Z}transform`,"a rule may carry only one jsonPatch transform");if(W.length&&(X.public===!0||!(Y.public===!0||Y.host!==void 0)))b1(`${Z}transform`,"jsonPatch requires HTTP egress from a VM or VPC to a public origin or host");if(Q.forwardAuth!==void 0){az6(Q.forwardAuth,`${Z}forwardAuth`);let H=Y.vmId!==void 0||!m60(Y)&&Y.port!==void 0;if(G!=="http"||X.public!==!0||!H||Q.domain==="*")b1(`${Z}forwardAuth`,`${Z}forwardAuth is only supported on HTTP public ingress: \`{ public: true } -> { vmId, port }\``)}if(G==="smtp")rz6(Q.domain);else uB1(Q.domain);if((X.vmId!==void 0||X.vpcId!==void 0)&&Y.vmId!==void 0&&J.length>0)b1(`${Z}transform`,"a VM-to-VM rule cannot carry a transform yet \u2014 remove it (only public ingress/egress rules run transforms)");if(G==="tcp"){let H=Y.public===!0||Y.host!==void 0,F=X.vmId!==void 0||X.vpcId!==void 0;if(H||F)b1(`${Z}protocol`,"a `tcp` rule is public ingress only \u2014 `{ public: true } -> { vmId, port }`. The edge splices the session without terminating it, so outbound there is nothing to broker (an outbound allow is a firewall rule, and injecting into one needs `http` or `postgres`) and inward there is no certificate to answer the source with. Give the source `public: true`, or drop `protocol` to be served as HTTPS")}else if(G==="imap"||G==="imaps"){let H=Y.public===!0||Y.host!==void 0,F=X.vmId!==void 0||X.vpcId!==void 0;if(H||F)b1(`${Z}protocol`,`an \`${G}\` rule is public ingress only \u2014 \`{ public: true } -> { vmId, port }\`. The 993 front serves mail clients reaching a VM's IMAP server; outbound there is nothing to broker (an outbound allow is a firewall rule) and inward there is no certificate to answer the source with`)}else if(G==="socks5"){let H=Y.public===!0||Y.host!==void 0;if(X.public===!0||!H)b1(`${Z}protocol`,'a `socks5` rule is egress only \u2014 `{ vmId } -> { host: "gate.provider.com", port: 1080 }`. The front exists so a guest can open sessions through a proxy whose credentials it never holds; inbound there is nothing to serve, and publishing one would be an open proxy on a platform address');if(Y.host===void 0)b1(`${Z}destination`,"a `socks5` rule has to name the proxy it goes through: give the destination a `host` and the `port` the provider listens on. `{ public: true }` on its own asks the edge to be the proxy, which would let the guest out on our address rather than through yours")}else if(G==="postgres"){let H=J.some((U)=>U!==null&&typeof U==="object"&&("postgres"in U)),F=Y.public===!0||Y.host!==void 0;if(H&&!F)b1(`${Z}transform`,"a `postgres` transform belongs on an egress rule: the edge spends a credential the guest never holds, so pointing it at your own VM would hand every client a logged-in session. Give the destination `public: true` or a `host`, or drop the transform")}else if(G==="smtp"){let H=J.some((U)=>U!==null&&typeof U==="object"&&("smtp"in U)),F=Y.public===!0||Y.host!==void 0;if(H&&!F)b1(`${Z}transform`,"an `smtp` transform belongs on an egress rule: the edge spends a credential the guest never holds, so pointing it at your own VM would turn it into an open relay. Give the destination `public: true` or a `host`, or drop the transform");if(typeof Q.domain==="string"&&Q.domain.includes("@")&&X.public!==!0)b1(`${Z}domain`,`\`${Q.domain}\` names a mailbox, which only makes sense on a rule that receives mail. An egress or VM-to-VM rule names the host the guest submits through \u2014 drop the part before \`@\``)}return{...Q,source:X,destination:Y}}function XP6($,Z){if($==="source")return tz6(Z)?"source is empty. Say who opens the session: `vmId`, `vpcId`, or `public: true`":"source only narrows the session without saying who opens it. Add `vmId`, `vpcId`, or `public: true`";return"destination is empty. Say where the session lands: `vmId` + `port`, `host` + `port`, or `public: true` for the domain's own origin"}function oa$($){let Z=ra$($,"");for(let Q of["source","destination"]){let X=Z[Q];if(!m60(X))b1(Q,XP6(Q,X))}if(Z.source.public===!0&&Z.destination.public===!0)b1("destination","a rule from the public Internet to the domain's own origin allows nothing the world cannot already do. Did you mean a `vmId` destination (ingress) or a `vmId` source (egress)?");return Z}function sa$($){if(!JY($))b1("tls","tls must be an object with a `rules` array");for(let Q of Object.keys($))if(Q!=="rules")b1(`tls.${Q}`,`tls has unknown field \`${Q}\`. Expected: rules`);let Z=$.rules;if(!Array.isArray(Z))b1("tls.rules","tls.rules must be an array");return Z.forEach((Q,X)=>{let Y=`tls.rules[${X}].`,J=ra$(Q,Y),G=m60(J.source),W=m60(J.destination);if(!G&&!W)b1(`tls.rules[${X}]`,`tls.rules[${X}]: both source and destination refer to the VM being created, which allows nothing. Give one of them a \`vmId\`, \`vpcId\`, or \`public: true\``);if(G&&W)b1(`tls.rules[${X}]`,`tls.rules[${X}]: neither end refers to the VM being created. Leave one endpoint's identity unset so it means this VM, or create the rule with tls.rules.create instead`);if(!W&&J.destination.port===void 0)b1(`tls.rules[${X}].destination.port`,`tls.rules[${X}]: destination.port is required: say which port on this VM the session lands on`)}),$}function gB1($){return`/v5/tls/${n6($)}`}function hB1($){return`/v5/tls/forward-auth/${n6($)}`}class ea${client;constructor($){this.client=$}list(){return this.client.get("/v5/tls/forward-auth")}async create($){let Z=ia$($);return this.client.post("/v5/tls/forward-auth",Z)}get($){return this.client.get(hB1($))}async update($,Z){let Q=ia$(Z);return this.client.put(hB1($),Q)}delete($){return this.client.delete(hB1($))}}class $r${client;constructor($){this.client=$}async create($){let Z=oa$($);return this.client.post("/v5/tls",Z)}list($={}){return this.client.get("/v5/tls",$)}get($){return this.client.get(gB1($))}async update($,Z){let Q=oa$(Z);return this.client.put(gB1($),Q)}delete($){return this.client.delete(gB1($))}}class mB1{client;rules;forwardAuth;constructor($){this.client=$,this.rules=new $r$($),this.forwardAuth=new ea$($)}}var lB1,cB1,ya$,uz6,ga$,lz6=253,cz6=63,ha$,ua$,mz6,dz6,iz6=2048,la$=32,ca$=16384,ma$=32,da$=32,pz6=128,nz6,pa$="!#$%&'*+-/=?^_`{|}~.",ta$;var JS0=L(()=>{qK();lB1=class lB1 extends Error{path;constructor($,Z){super(Z);this.name="TlsRuleValidationError",this.path=$,Object.setPrototypeOf(this,lB1.prototype)}};cB1=class cB1 extends Error{path;constructor($,Z){super(Z);this.name="TlsForwardAuthValidationError",this.path=$,Object.setPrototypeOf(this,cB1.prototype)}};ya$=["vmId","vpcId","public","host","port"],uz6=["vmId","vpcId","public","host"],ga$=["tcp","http","postgres","minecraft","smtp","imap","imaps","socks5"],ha$=["url","headers","timeoutMs","protectedCookies","authResponseHeaders"],ua$=["id"],mz6=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,dz6=/^[0-9A-Za-z-]+$/,nz6=new Set(["host","content-length","connection","keep-alive","proxy-authenticate","proxy-authorization","proxy-connection","te","trailer","transfer-encoding","upgrade"]);ta$=["action","domain","protocol","source","destination","transform","match","forwardAuth"]});function ap($){return`/v5/tunnels/${n6($)}`}function Rg($){return $.tunnelId??=$.id,$}class dB1{client;constructor($){this.client=$}list(){return this.client.get("/v5/tunnels").then(($)=>{return $.tunnels.forEach(Rg),$})}create($={}){return this.client.post("/v5/tunnels",$).then(Rg)}get($){return this.client.get(ap($)).then(Rg)}update($,Z){return this.client.patch(ap($),Z).then(Rg)}rotateKey($,Z={}){return this.client.post(`${ap($)}/rotate-key`,Z).then(Rg)}delete($){return this.client.delete(ap($))}attachVpc($,Z,Q={}){return this.client.post(`${ap($)}/vpcs/${n6(Z)}`,Q).then(Rg)}detachVpc($,Z){return this.client.delete(`${ap($)}/vpcs/${n6(Z)}`).then(Rg)}}var iB1=L(()=>{qK()});class pB1{client;basePath;constructor($,Z){this.client=$,this.basePath=Z}async readFile($,Z={}){let Q=await this.openRead($,Z);return new Uint8Array(await Q.arrayBuffer())}async readTextFile($,Z={}){return await(await this.openRead($,Z)).text()}async readFileStream($,Z={}){let Q=await this.openRead($,Z);if(!Q.body)throw Error(`no response body reading ${$}`);return Q.body}async writeFile($,Z,Q={}){let X=typeof Z==="string"?new TextEncoder().encode(Z):Z,Y=X instanceof Uint8Array?X.byteLength:X.size;if(Y>YP6)return this.uploadInChunks($,X,Y,Q);let J=X instanceof Uint8Array?X:new Uint8Array(await X.arrayBuffer());await this.client.putBytes(`${this.basePath}/fs/write`,J,{path:$,mode:Q.mode,sha256:await Zr$(J)},Q.signal),Q.onProgress?.({completedBytes:Y,totalBytes:Y})}writeTextFile($,Z,Q={}){return this.writeFile($,Z,Q)}async readDir($){let{entries:Z}=await this.client.get(`${this.basePath}/fs/dir`,{path:$});return Z}async mkdir($){await this.client.post(`${this.basePath}/fs/mkdir`,{path:$})}async remove($){await this.client.delete(`${this.basePath}/fs/remove`,{path:$})}async exists($){let{exists:Z}=await this.client.get(`${this.basePath}/fs/exists`,{path:$});return Z}stat($){return this.client.get(`${this.basePath}/fs/stat`,{path:$})}openRead($,Z){let{offset:Q,length:X}=Z,Y;if(Q!==void 0||X!==void 0){let J=Q??0;Y=X===void 0?`bytes=${J}-`:`bytes=${J}-${J+X-1}`}return this.client.getBytes(`${this.basePath}/fs/read`,{path:$},{range:Y,signal:Z.signal})}async uploadInChunks($,Z,Q,X){let Y=X.chunkSize??JP6,J=X.maxAttempts??GP6,G=Z instanceof Uint8Array?await Zr$(Z):void 0,W=await this.client.post(`${this.basePath}/fs/uploads`,{path:$,size:Q,sha256:G,mode:X.mode}),K=`${this.basePath}/fs/uploads/${W.uploadId}`;try{let H=W.receivedBytes;while(H<Q){let F=Math.min(H+Y,Q),U=Z instanceof Uint8Array?Z.subarray(H,F):Z.slice(H,F);H=(await this.putChunkWithRetry(K,U,H,J,X.signal)).receivedBytes,X.onProgress?.({completedBytes:Math.min(H,Q),totalBytes:Q})}await this.client.post(`${K}/commit`)}catch(H){throw await this.client.delete(K).catch(()=>{}),H}}async putChunkWithRetry($,Z,Q,X,Y){let J;for(let G=1;G<=X;G++){Y?.throwIfAborted?.();try{return await this.client.putBytes($,Z,{offset:Q},Y)}catch(W){if(J=W,!(!(W instanceof HJ)||W.status>=500||W.status===408||W.status===409||W.status===429)||Y?.aborted||G===X)throw W;await WP6(Math.min(500*2**(G-1),8000));let H=await this.client.get($).catch(()=>{return});if(H&&H.receivedBytes>Q)return H}}throw J}}async function Zr$($){let Z=globalThis.crypto?.subtle;if(!Z)return;let Q=await Z.digest("SHA-256",$);return Array.from(new Uint8Array(Q),(X)=>X.toString(16).padStart(2,"0")).join("")}function WP6($){return new Promise((Z)=>setTimeout(Z,$))}var YP6=8388608,JP6=16777216,GP6=5;var nB1=L(()=>{l60()});function KP6(){return typeof process<"u"&&Boolean(process.versions?.node)}async function Qr$($,Z){if(KP6()){let X;try{X=await import("ws")}catch{throw Error("PTY sessions need the `ws` package in Node. Install it with `npm install ws`.")}return new X.default($,{headers:Z})}let Q=globalThis.WebSocket;if(!Q)throw Error("PTY sessions need a WebSocket client; no global WebSocket is available in this environment.");return new Q($)}function d60($,Z,Q){if($.on){$.on(Z,Q);return}$.addEventListener?.(Z,Q)}function FP6($,Z){if($&&typeof $==="object"&&"data"in $){let Q=$.data;if(typeof Q==="string")return{text:Q};if(Q instanceof ArrayBuffer)return{binary:new Uint8Array(Q)};return{}}if($ instanceof Uint8Array)return Z?{binary:$}:{text:HP6.decode($)};if(typeof $==="string")return{text:$};return{}}class tB1{_sessionId;_slug;_created=!1;socket;constructor($,Z,Q={}){this.socket=$,this._sessionId=Z,d60($,"message",(X,Y)=>{let{text:J,binary:G}=FP6(X,Y);if(G){Q.onData?.(G);return}if(!J)return;let W;try{W=JSON.parse(J)}catch{return}if(W.type==="exited")Q.onExit?.(W.exitCode);else if(W.type==="error")Q.onError?.(Error(W.message));else if(W.type==="sessionInfo")this._sessionId=W.sessionId,this._slug=W.slug,this._created=W.created??!0,Q.onSessionInfo?.(W.sessionId)}),d60($,"close",(X)=>{let Y=X;Q.onClose?.({wasClean:Y?.wasClean??!0,code:Y?.code??1000,reason:Y?.reason??""})}),d60($,"error",(X)=>Q.onError?.(X))}write($){this.socket.send(typeof $==="string"?new TextEncoder().encode($):$)}resize($){this.sendControl({type:"resize",cols:$.cols,rows:$.rows})}signal($){this.sendControl({type:"signal",signal:$})}sendControl($){this.socket.send(JSON.stringify($))}detach(){this.socket.close()}get sessionId(){return this._sessionId}get slug(){return this._slug}get created(){return this._created}get readyState(){return this.socket.readyState}}function UP6($){return new Promise((Z,Q)=>{if($.readyState===1){Z();return}d60($,"open",()=>Z()),d60($,"error",(X)=>Q(X))})}class oB1{client;basePath;constructor($,Z){this.client=$,this.basePath=Z}async open($={}){let{exec:Z,cols:Q,rows:X,linuxUser:Y,slug:J,replaceOnExit:G,onData:W,onExit:K,onClose:H,onError:F}=$,U={};if(Z!==void 0)U.exec=Z;if(Q!==void 0)U.cols=Q;if(X!==void 0)U.rows=X;if(Y!==void 0)U.linuxUser=Y;if(J!==void 0)U.slug=J;if(G!==void 0)U.replaceOnExit=String(G);let N=Xr$(this.client,`${this.basePath}/pty`,U),B=this.client.authHeaders(),D=await Qr$(N,B);return new Promise((O,j)=>{let w=!1,E=new tB1(D,-1,{onData:W,onExit:K,onClose:(z)=>{if(!w)w=!0,j(Error("connection closed before sessionInfo"));H?.(z)},onError:(z)=>{if(!w)w=!0,j(z);F?.(z)},onSessionInfo:()=>{w=!0,O(E)}})})}async attach($){let{session:Z,linuxUser:Q,onData:X,onExit:Y,onClose:J,onError:G}=$,W=Xr$(this.client,`${this.basePath}/pty/sessions/${n6(String(Z))}`,{...Q!==void 0?{linuxUser:Q}:{}}),K=this.client.authHeaders(),H=await Qr$(W,K),F=new tB1(H,typeof Z==="number"?Z:-1,{onData:X,onExit:Y,onClose:J,onError:G});return await UP6(H),F}list($={}){return this.client.get(`${this.basePath}/pty/sessions`,$)}close($,Z={}){return this.client.delete(`${this.basePath}/pty/sessions/${n6(String($))}`,Z)}}class aB1{pty;linuxUser;constructor($,Z){this.pty=$,this.linuxUser=Z}open($={}){return this.pty.open({...$,linuxUser:this.linuxUser})}attach($){return this.pty.attach({...$,linuxUser:this.linuxUser})}list(){return this.pty.list({linuxUser:this.linuxUser})}close($){return this.pty.close($,{linuxUser:this.linuxUser})}}function Xr$($,Z,Q){return $.url(Z,Q).replace(/^http/,"ws")}var HP6;var rB1=L(()=>{qK();HP6=new TextDecoder});class sB1{client;constructor($){this.client=$}list($={}){return this.client.get("/v5/snapshots",$)}get($){return this.client.get(`/v5/snapshots/${n6($)}`)}update($,Z){return this.client.patch(`/v5/snapshots/${n6($)}`,Z)}delete($){return this.client.delete(`/v5/snapshots/${n6($)}`)}}var eB1=L(()=>{qK()});var Yr$=()=>{};function $L1($){return`/v5/vms/${n6($)}`}class ZL1{id;fs;pty;client;basePath;constructor($,Z){this.client=$,this.id=Z,this.basePath=$L1(Z),this.fs=new pB1($,this.basePath),this.pty=new oB1($,this.basePath)}data(){return this.client.get(this.basePath)}firewallRules(){return this.client.get("/v5/firewall/rules",{vmId:this.id})}update($){return this.client.patch(this.basePath,$)}start(){return this.client.post(`${this.basePath}/start`)}pause(){return this.client.post(`${this.basePath}/pause`)}resize($){return this.client.post(`${this.basePath}/resize`,$)}delete(){return this.client.delete(this.basePath)}exec($){let Z=typeof $==="string"?{command:$}:$;return this.client.post(`${this.basePath}/exec-await`,Z)}linuxUser($){return new Jr$(this,$)}snapshot($={}){return this.client.post(`${this.basePath}/snapshot`,$)}}class Jr${vm;linuxUser;pty;constructor($,Z){this.vm=$,this.linuxUser=Z,this.pty=new aB1($.pty,Z)}exec($){let Z=typeof $==="string"?{command:$}:$;return this.vm.exec({...Z,linuxUser:this.linuxUser})}}class QL1{client;snapshots;constructor($){this.client=$,this.snapshots=new sB1($)}async create($){if(YS0($.firewall,"VM"),$.tls!==void 0)sa$($.tls);let Z=await this.client.post("/v5/vms",$);return{vm:new ZL1(this.client,Z.id),vmId:Z.id,data:Z,firewallRules:Z.firewallRules??[],tlsRules:Z.tlsRules??[]}}list($={}){return this.client.get("/v5/vms",$)}get($){return this.client.get($L1($))}ref($){return new ZL1(this.client,$)}delete($){return this.client.delete($L1($))}}var XL1=L(()=>{c60();JS0();qK();nB1();rB1();eB1();Yr$();nB1();rB1();eB1()});function YL1($){return`/v5/vpcs/${n6($)}`}class Gr${client;basePath;constructor($,Z){this.client=$,this.basePath=Z}list(){return this.client.get(`${this.basePath}/tunnels`)}}class JL1{id;tunnels;client;basePath;constructor($,Z){this.client=$,this.id=Z,this.basePath=YL1(Z),this.tunnels=new Gr$($,this.basePath)}data(){return this.client.get(this.basePath)}update($){return this.client.patch(this.basePath,$)}delete(){return this.client.delete(this.basePath)}}class GL1{client;constructor($){this.client=$}list(){return this.client.get("/v5/vpcs")}async create($={}){if($.firewall!==void 0)YS0($.firewall,"network");let Z=await this.client.post("/v5/vpcs",$);return{vpc:new JL1(this.client,Z.id),vpcId:Z.id,data:Z,firewallRules:Z.firewallRules??[]}}get($){return this.client.get(YL1($))}ref($){return new JL1(this.client,$)}delete($){return this.client.delete(YL1($))}}var WL1=L(()=>{c60();qK()});class GS0{client;vms;vpc;tunnels;firewall;tls;domains;identities;constructor($={}){this.client=new IB1($),this.vms=new QL1(this.client),this.vpc=new GL1(this.client),this.tunnels=new dB1(this.client),this.firewall=new vB1(this.client),this.tls=new mB1(this.client),this.domains=new VB1(this.client),this.identities=new bB1(this.client)}fetch($,Z){return this.client.fetch($,Z)}}var Wr$=L(()=>{qK();kB1();c60();yB1();JS0();iB1();XL1();WL1();qK();l60();XL1();WL1();iB1();kB1();c60();JS0();yB1()});var Hr$;var Kr$=L(()=>{Hr$={name:"@decocms/sandbox",version:"1.82.0",private:!0,type:"module",description:"Sandbox runtime for isolated Studio tool execution",scripts:{check:"tsc --noEmit",test:"bun test",build:"bun run build:typegen && bun run build:harness-runner","build:typegen":"mkdir -p dist && bun run --cwd=../typegen build && bun --cwd=../typegen pm pack --filename $PWD/dist/typegen.tgz --quiet","build:harness-runner":"mkdir -p dist && bun --cwd=../harness-runner pm pack --filename $PWD/dist/harness-runner.tgz --quiet"},exports:{"./shared":"./shared.ts","./provider":"./server/provider/index.ts","./provider/agent-sandbox":"./server/provider/agent-sandbox/index.ts","./provider/postgres-state-store":"./server/provider/postgres-state-store.ts","./provider/freestyle":"./server/provider/freestyle.ts","./provider/remote":"./server/provider/remote.ts","./provider/router":"./server/provider/router.ts","./provider/sandbox-api":"./server/provider/sandbox-api.ts","./provider/sandbox-server":"./server/provider/sandbox-server.ts","./daemon-client":"./server/daemon-client.ts","./org-fs":"./org-fs.ts","./dispatch":"./dispatch/index.ts","./dispatch/*":"./dispatch/*.ts","./proxy/http":"./proxy/http.ts","./proxy/websocket":"./proxy/websocket.ts"},dependencies:{"@decocms/shared":"workspace:*","@kubernetes/client-node":"^1.4.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0",freestyle:"0.2.16",zod:"4.3.6"},devDependencies:{"@types/bun":"latest",postgres:"^3.4.5",typescript:"^7.0.2"}}});function WS0($){let Z=$?.createHistogram("studio.sandbox.proxy.duration_ms",{description:"Wall-clock latency of studio-mediated requests to the sandbox daemon: tool exec proxies (source=daemon) and preview iframe traffic (source=preview).",unit:"ms"});return async(Q,X)=>{if(!Z)return X();let Y=performance.now(),J=(G)=>Z.record(performance.now()-Y,{runner_kind:Q,source:"daemon",status_code:G});try{let G=await X();return J(G.status),G}catch(G){throw J(0),G}}}var pD;var KS0=L(()=>{pD={kubernetes:"agent-sandbox",freestyle:"freestyle"}});var wr$={};G0(wr$,{FreestyleSandboxProvider:()=>jr$});import{createHash as BP6,randomBytes as LP6}from"crypto";class jr${freestyle;lookupClient;image;sidecarImage;idleTimeoutSeconds;autoDeleteSeconds;domainSuffix;timeDaemonRequest;inflight=new Pg;snapshotInflight=new Pg;lookups=new Map;releaseTimers=new Map;constructor($){this.freestyle=$.client??new GS0({apiKey:$.apiKey}),this.lookupClient=$.client??new GS0({apiKey:$.apiKey,fetch:Object.assign((Z,Q)=>fetch(Z,{...Q,signal:Q?.signal?AbortSignal.any([Q.signal,AbortSignal.timeout(Lr$)]):AbortSignal.timeout(Lr$)}),{preconnect:fetch.preconnect})}),this.image=$.image??`ghcr.io/decocms/studio/studio-sandbox-go:${Hr$.version}`,this.sidecarImage=$.orgFsSidecarImage??OP6,this.idleTimeoutSeconds=$.idleTimeoutSeconds??300,this.autoDeleteSeconds=$.autoDeleteSeconds??86400,this.domainSuffix=$.domainSuffix??"style.dev",this.timeDaemonRequest=WS0($.meter)}async owns($){return await this.find($)!==null}daemonUrl($){return`https://${$}.${this.domainSuffix}`}async find($,Z={}){let Q=this.lookups.get($);if(!Z.refresh&&Q&&Date.now()-Q.at<(Q.found?TP6:AP6))return Q.found;let X=null;try{let Y=await this.lookupClient.vms.get($),J=Y.metadata[Nr$];if(J)X={vm:this.freestyle.vms.ref(Y.id),daemon:{url:this.daemonUrl($),token:J}}}catch(Y){if(!(Y instanceof HJ&&Y.status===404))throw Y}return this.remember($,X),X}remember($,Z){if(this.lookups.delete($),this.lookups.size>=RP6){let Q=this.lookups.keys().next();if(!Q.done)this.lookups.delete(Q.value)}this.lookups.set($,{found:Z,at:Date.now()})}baseSnapshot(){let{image:$,sidecarImage:Z}=this,Q=`studio-sandbox-${BP6("sha256").update(`${$}
3347
+ ${Y}`:Y}var Io$,LE6;var XB1=L(()=>{Io$=/[\r\n<>]/,LE6=/^[^\s@<>]+@[^\s@<>]+\.[^\s@<>]+$/});var hC0=L(()=>{$8();XB1()});function OE6($){if($ instanceof TypeError)return!0;if($ instanceof Error&&!($ instanceof DOMException)&&typeof $.code==="string")return!0;if($ instanceof DOMException&&$.name==="AbortError")return!0;return!1}async function YB1($,Z,Q,X){try{return await j8(async()=>{let J=await fetch($,{...Z,signal:AbortSignal.timeout(X)});return{status:J.status,ok:J.ok,body:await J.text()}},{maxAttempts:3,minTimeout:50,maxTimeout:500,multiplier:2,jitter:0.5,isRetriable:OE6})}catch(Y){let J=Y instanceof Error?Y.message:String(Y);throw Error(`[SANDBOX_UNREACHABLE] sandbox daemon ${Q} request failed: ${J}`,{cause:Y})}}async function uC0($){try{let Z=await fetch(`${$}/health`,{signal:AbortSignal.timeout(jE6)});if(!Z.ok){try{await Z.text()}catch{}return null}let Q=await Z.json();if(typeof Q==="object"&&Q!==null&&typeof Q.bootId==="string"&&typeof Q.ready==="boolean"&&Q.setup&&typeof Q.setup.running==="boolean"&&typeof Q.setup.done==="boolean")return Q;return null}catch{return null}}async function GB1($){for(let Z=0;Z<ko$;Z++){if(await uC0($)!==null)return;let Q=(Math.random()*2-1)*wE6;await $$(Co$+Q)}throw Error(`sandbox daemon at ${$} did not respond on /health within ${ko$*Co$/1000}s`)}async function mN($,Z,Q,X,Y){return EE6($,Z,"POST",Q,X,Y)}async function EE6($,Z,Q,X,Y,J){let G={...X};if(Y&&Y.rotateToken!==void 0)G.auth=Y;let W=await YB1(`${$}/_sandbox/config`,{method:Q,headers:{"Content-Type":"application/json",Authorization:`Bearer ${Z}`},body:JSON.stringify(G)},"/_sandbox/config",J?.timeoutMs??JB1);if(!W.ok)throw new PF(W.status,W.body);return _o$(W.body,"/_sandbox/config")}async function So$($,Z,Q){let X=await YB1(`${$}/_sandbox/setup/${Q}`,{method:"POST",headers:{Authorization:`Bearer ${Z}`}},`/_sandbox/setup/${Q}`,JB1);if(!X.ok)throw Error(`sandbox daemon /_sandbox/setup/${Q} returned ${X.status}: ${X.body}`)}async function x60($,Z,Q){let X=await YB1(`${$}/_sandbox/orgfs-config`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${Z}`},body:Q},"/_sandbox/orgfs-config",JB1);if(!X.ok)throw Error(`sandbox daemon /_sandbox/orgfs-config returned ${X.status}: ${X.body}`);return _o$(X.body,"/_sandbox/orgfs-config")}function _o$($,Z){try{return JSON.parse($)}catch(Q){throw Error(`sandbox daemon ${Z} returned a malformed JSON body: ${$.slice(0,200)}`,{cause:Q})}}async function lC0($,Z,Q,X){let Y=new Headers(X.headers);for(let W of zE6)Y.delete(W);Y.set("authorization",`Bearer ${Z}`);let J=X.method!=="GET"&&X.method!=="HEAD",G=`${$}${Q.startsWith("/")?Q:`/${Q}`}`;return fetch(G,{method:X.method,headers:Y,body:J?X.body:void 0,redirect:"manual",signal:X.signal,duplex:J?"half":void 0})}var PF,jE6=500,JB1=30000,ko$=25,Co$=200,wE6=50,zE6;var zg=L(()=>{hC0();$8();PF=class PF extends Error{status;constructor($,Z){super(`sandbox daemon /_sandbox/config returned ${$}: ${Z}`);this.status=$;this.name="ConfigRequestError"}};zE6=["cookie","host","connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","accept-encoding","content-length"]});class cC0{counted=new Set;markCounted($){this.counted.add($)}consume($){return this.counted.delete($)}}class Pg{map=new Map;async run($,Z){let Q=this.map.get($);if(Q)return Q;let X=Z();this.map.set($,X);try{return await X}finally{this.map.delete($)}}}function mC0($,Z,Q){if(!$)return Q(null);if(!$.withLock)return Q($);return $.withLock(Z,Q)}function f60($){if(!$.orgId||!$.virtualMcpId||!$.branch)throw Error("composeSandboxRef: orgId, virtualMcpId and branch are all required for agent refs");return`agent:${$.orgId}:${$.virtualMcpId}:${$.branch}`}function vo$($){if(!$.startsWith("agent:"))return"";let Z=$.split(":");return Z.length>=4?Z.slice(3).join(":"):""}import{hash as PE6}from"crypto";function TE6($,Z=16){return PE6("sha256",zc$($),"hex").slice(0,Z)}function d3($){let Z=TE6($),Q=AE6(vo$($.projectRef));return Q?`${Q}-${Z}`:`s-${Z}`}function AE6($){if(!$)return"";let Z=$.split("/").pop()??"",Q="",X=!1;for(let Y of Z.toLowerCase()){let J=Y.charCodeAt(0),G=J>=97&&J<=122,W=J>=48&&J<=57;if(!G&&!W){X||=Q.length>0;continue}if(X){if(Q.length+1>=xo$)break;Q+="-",X=!1}if(Q+=Y,Q.length===xo$)break}return Q}var xo$=24;var fo$=L(()=>{QU1()});function dC0($,Z){let Q=$.replace(/\/+$/,"");if(Q.includes("{handle}"))return`${Q.replace("{handle}",Z)}/`;try{let X=new URL(Q);return X.hostname=`${Z}.${X.hostname}`,`${X.toString()}/`}catch{return`${Q}/${Z}/`}}function mp($){let Z=$.repo,Q=Z?{repository:{cloneUrl:Z.cloneUrl,repoName:Z.displayName??RE6(Z.cloneUrl),...Z.branch?{branch:Z.branch}:{},submoduleCredentials:Z.submoduleCredentials??[]},repositories:($.extraRepos??[]).filter((K)=>!!K.directoryName).map((K)=>({cloneUrl:K.cloneUrl,repoName:K.directoryName,...K.branch?{branch:K.branch}:{},submoduleCredentials:K.submoduleCredentials??[]})),...Z.userName.trim()||Z.userEmail.trim()?{identity:{userName:Z.userName,userEmail:Z.userEmail}}:{}}:void 0,X=$.tenant,Y=cp({userName:X?.userName,userEmail:X?.userEmail})??void 0,J=$.packageManager?{name:$.packageManager.name,...$.packageManager.path?{path:$.packageManager.path}:{}}:void 0,G=J?{packageManager:J,runtime:$.runtime,...$.port!==void 0?{port:$.port}:{}}:void 0,W=X?.orgId;if(!Q&&!G&&!Y&&$.cloneOnly===void 0&&!W)return null;return{...Q?{git:Q}:{},...Y?{operator:Y}:{},...W?{orgId:W}:{},...$.cloneOnly!==void 0?{cloneOnly:$.cloneOnly}:{},...G?{application:G}:{}}}function RE6($){try{let Z=new URL($);return Z.pathname.replace(/^\/+/,"").replace(/\.git$/,"")||Z.hostname}catch{return $}}var bo$=L(()=>{XB1()});function qE6($){try{return new URL($).username.length>0}catch{return!1}}function b60($){let Z=$.repo?.cloneUrl;if(!Z||!qE6(Z))return null;return{git:{repository:{cloneUrl:Z}}}}var dp=L(()=>{fo$();bo$()});async function*ho$($){let Z=$.now??(()=>Date.now()),Q=Z(),X=$.schedulingTimeoutMs??IE6,Y={pod:{},sandbox:{},events:{hasPulling:!1,hasPulled:!1},startedAt:Q},J=[],G=null,W=!1,K=(E)=>{if(W)return;if(G){let z=G;G=null,z(E)}else J.push(E)},H=()=>{if(J.length>0)return Promise.resolve(J.shift());if(W)return Promise.resolve(null);return new Promise((E)=>{G=E})},F=()=>{if(W)return;if(W=!0,G){let E=G;G=null,E(null)}},U=new AbortController,N=()=>{U.abort(),F()};if($.signal)if($.signal.aborted)U.abort(),F();else $.signal.addEventListener("abort",N,{once:!0});let B=Math.max(0,X-(Z()-Q)),D=setTimeout(()=>K("tick"),B+100),O,j=new Promise((E)=>{O=E}),w=Promise.allSettled([kE6($.kc,$.namespace,$.claimName,U.signal,Y,K,Z,O),SE6($.kc,$.namespace,$.claimName,U.signal,Y,K),_E6($.kc,$.namespace,$.claimName,j,U.signal,Y,K,Z)]);try{let E=null,z=-1,A=yo$(Y,X,Z);if(E=KB1(A),!WB1(A))z=go$(A);if(yield A,WB1(A))return;while(!W){if(await H()===null)break;let T=yo$(Y,X,Z);if(WB1(T)){let S=KB1(T);if(S!==E)E=S,yield T;return}let q=go$(T);if(q<z)continue;let b=KB1(T);if(b!==E)E=b,z=q,yield T}}finally{if(clearTimeout(D),U.abort(),$.signal)$.signal.removeEventListener("abort",N);F(),await w.catch(()=>{})}}async function uo$($,Z=VE6){let Q=new AbortController,X="claiming",Y,J=()=>{clearTimeout(Y),Y=setTimeout(()=>Q.abort(),Z)};try{J();for await(let G of $(Q.signal)){if(G.kind==="ready")return;if(G.kind==="failed")throw new QY(G.message);X=G.kind,J()}}finally{clearTimeout(Y),Q.abort()}throw new Ip(`Sandbox did not become ready: no progress for ${Math.round(Z/1000)}s while ${X}`)}function yo$($,Z,Q){let{pod:X,sandbox:Y,events:J,startedAt:G}=$;if(Y.ready)return{kind:"ready"};let W=X.containerWaitingReason;if(W==="ImagePullBackOff"||W==="ErrImagePull")return{kind:"failed",reason:"image-pull-backoff",message:"Sandbox image failed to download. The cluster may be missing pull credentials or the image tag may not exist."};if(W==="CrashLoopBackOff")return{kind:"failed",reason:"crash-loop-backoff",message:"Sandbox crashed during startup and is now in CrashLoopBackOff. Check pod logs."};if(!X.scheduled&&J.lastFailedSchedulingAt!==void 0&&Q()-G>Z)return{kind:"failed",reason:"scheduling-timeout",message:J.failedSchedulingMessage??`Pod could not be scheduled within ${Math.round(Z/1000)}s.`};if(X.containerRunning&&!X.containerReady)return{kind:"warming-daemon",since:G};if(J.hasPulling&&!J.hasPulled)return{kind:"pulling-image",since:G};if(W==="ContainerCreating"||W==="PodInitializing"||X.scheduled&&!X.containerRunning)return{kind:"starting-container",since:G};if(X.scheduledFalseReason==="Unschedulable"||J.lastFailedSchedulingAt!==void 0&&!X.scheduled)return{kind:"waiting-for-capacity",since:G,message:J.failedSchedulingMessage??X.scheduledFalseMessage,nodeClaim:J.nominatedNodeClaim};return{kind:"claiming",since:G}}function WB1($){return $.kind==="ready"||$.kind==="failed"}function go$($){switch($.kind){case"claiming":return 0;case"waiting-for-capacity":return 1;case"pulling-image":return 2;case"starting-container":return 3;case"warming-daemon":return 4;case"ready":case"failed":return 99}}function KB1($){switch($.kind){case"claiming":case"pulling-image":case"starting-container":case"warming-daemon":return $.kind;case"waiting-for-capacity":return`waiting-for-capacity:${$.message??""}:${$.nodeClaim??""}`;case"ready":return"ready";case"failed":return`failed:${$.reason}:${$.message}`}}async function kE6($,Z,Q,X,Y,J,G,W){let K=`/api/v1/namespaces/${encodeURIComponent(Z)}/pods?watch=true&labelSelector=${encodeURIComponent(`${ME6}=${Q}`)}`;return iC0({kc:$,path:K,signal:X,label:`pod/${Q}`,onEvent:(H)=>{if(H.type!=="ADDED"&&H.type!=="MODIFIED")return;let F=H.object;if(F.metadata?.name)W(F.metadata.name);CE6(F,Y,G),J("pod")}})}function CE6($,Z,Q){let Y=($.status?.conditions??[]).find((G)=>G.type==="PodScheduled");if(Y?.status==="True")Z.pod.scheduled=!0,Z.pod.scheduledFalseReason=void 0,Z.pod.scheduledFalseMessage=void 0;else if(Y?.status==="False")Z.pod.scheduled=!1,Z.pod.scheduledFalseReason=Y.reason,Z.pod.scheduledFalseMessage=Y.message;let J=($.status?.containerStatuses??[]).find((G)=>G.name===Y7.MAIN_CONTAINER_NAME);if(J)Z.pod.containerWaitingReason=J.state?.waiting?.reason,Z.pod.containerRunning=!!J.state?.running,Z.pod.containerReady=J.ready===!0}async function SE6($,Z,Q,X,Y,J){let G=`/apis/${Y7.CLAIM_API_GROUP}/${Y7.CLAIM_API_VERSION}/namespaces/${encodeURIComponent(Z)}/${Y7.CLAIM_PLURAL}?watch=true&fieldSelector=${encodeURIComponent(`metadata.name=${Q}`)}`;return iC0({kc:$,path:G,signal:X,label:`sandboxclaim/${Q}`,onEvent:(W)=>{if(W.type!=="ADDED"&&W.type!=="MODIFIED")return;let H=W.object.status?.conditions?.find((F)=>F.type==="Ready");if(!H)return;if(H.status==="True")Y.sandbox.ready=!0,Y.sandbox.notReadyReason=void 0,Y.sandbox.notReadyMessage=void 0;else Y.sandbox.ready=!1,Y.sandbox.notReadyReason=H.reason,Y.sandbox.notReadyMessage=H.message;J("sandbox")}})}async function _E6($,Z,Q,X,Y,J,G,W){let K=await Promise.race([X,new Promise((F)=>{if(Y.aborted){F(Q);return}Y.addEventListener("abort",()=>F(Q),{once:!0})})]);if(Y.aborted)return;let H=`/api/v1/namespaces/${encodeURIComponent(Z)}/events?watch=true&fieldSelector=${encodeURIComponent(`involvedObject.name=${K},involvedObject.kind=Pod`)}`;return iC0({kc:$,path:H,signal:Y,label:`events/${Q}`,onEvent:(F)=>{if(F.type!=="ADDED"&&F.type!=="MODIFIED")return;let U=F.object,N=U.reason;if(!N)return;switch(N){case"Pulling":J.events.hasPulling=!0;break;case"Pulled":J.events.hasPulling=!0,J.events.hasPulled=!0;break;case"FailedScheduling":J.events.lastFailedSchedulingAt=W(),J.events.failedSchedulingMessage=U.message;break;case"Nominated":{let B=U.message?.match(/nodeclaim\/([\w-]+)/);if(B)J.events.nominatedNodeClaim=B[1];break}default:return}G("event")}})}async function lo$($){let{kc:Z,namespace:Q,labelSelector:X,signal:Y,onDelete:J}=$,G=`/apis/${Y7.CLAIM_API_GROUP}/${Y7.CLAIM_API_VERSION}/namespaces/${encodeURIComponent(Q)}/${Y7.CLAIM_PLURAL}?watch=true&labelSelector=${encodeURIComponent(X)}`;return iC0({kc:Z,path:G,signal:Y,label:"sandboxclaim-reaper",onEvent:(W)=>{if(W.type!=="DELETED")return;let K=W.object.metadata?.name;if(K)J(K)}})}async function iC0($){let{kc:Z,path:Q,signal:X,label:Y,onEvent:J}=$,G=0;while(!X.aborted){try{let K=await AK(Z,{method:"GET",path:Q,signal:X,headers:{accept:"application/json"},stream:!0});if(!K.ok||!K.body){try{await K.body?.cancel()}catch{}if(K.status===401||K.status===403){console.warn(`[lifecycle-watcher] ${Y} stopped: watch denied (${K.status} ${K.statusText}). `+"The kubeconfig in use cannot watch SandboxClaims \u2014 if you are running locally, "+"this provider should not be active (check STUDIO_AGENT_SANDBOX_ENABLED).");return}throw Error(`watch handshake failed: ${K.status} ${K.statusText}`)}G=0;for await(let H of sc$(K.body)){if(X.aborted)return;try{J(H)}catch(F){console.warn(`[lifecycle-watcher] ${Y} onEvent threw: ${F instanceof Error?F.message:String(F)}`)}}}catch(K){if(X.aborted)return;let H=K instanceof Error?K.message:String(K);console.warn(`[lifecycle-watcher] ${Y} watch ended: ${H}`)}if(X.aborted)return;let W=M7(5000,250,G,2,0);G+=1,await $$(W,{signal:X}).catch(()=>{})}}var ME6="studio.decocms.com/sandbox-handle",IE6=300000,VE6=600000;var co$=L(()=>{$8();N60();Tj0()});import{createHash as vE6}from"crypto";import{z as WJ}from"zod";function dN($){let Z;try{Z=new URL($.trim())}catch{return null}if(Z.protocol!=="https:"||Z.search||Z.hash)return null;let Q=Z.pathname.replace(/\/+$/,"").replace(/\.git$/,"").replace(/\/+$/,"");return Q?`https://${Z.host.toLowerCase()}${Q}`:null}function y60($){return dN($)?.toLowerCase()??null}function gE6($){let Z=new Set;for(let Q of $){let X=`${y60(Q.repoUrl)??Q.repoUrl}#${Q.branch}`;if(Z.has(X))return Q;Z.add(X)}return null}function mo$($){return $.reduce((Z,Q)=>Z+Q.replicas,0)}function io$($,Z){if(Z.warmPoolName)return Z.warmPoolName;let Q=vE6("sha256").update(`${Z.repoUrl}#${Z.branch}`).digest("hex").slice(0,8);return`${$}-${Q}`}function po$($){return Math.max(0,$.size-mo$($.repos))}function ip($){return $.flatMap((Z)=>Z.repos.map((Q)=>({pool:Z,repo:Q,warmPoolName:io$(Z.name,Q)})))}function hE6($,Z){return oo$(void 0,$,!0,Z)}function no$($,{templateName:Z}){let Q=hE6(Z,$.image),X=(Y,J)=>({apiVersion:`${Y7.CLAIM_API_GROUP}/${Y7.CLAIM_API_VERSION}`,kind:"SandboxWarmPool",metadata:{name:Y,labels:{[uE6]:$.name}},spec:{replicas:J,updateStrategy:{type:"OnReplenish"},sandboxTemplateRef:{name:Q}}});return[...$.repos.map((Y)=>X(io$($.name,Y),Y.replicas)),X($.name,po$($))]}function nC0($){return $.tenant?.orgId}function FB1($,Z){if(!Z.tenant)return null;let Q=$.filter((J)=>J.tenant===Z.tenant&&J.image===Z.image),X=Z.cloneUrl?y60(Z.cloneUrl):null;if(X){let J=ip(Q).filter((W)=>y60(W.repo.repoUrl)===X),G=J.find((W)=>W.repo.branch===Z.branch)??J[0];if(G)return G}let Y=Q.find((J)=>po$(J)>0);return Y?{pool:Y,repo:null,warmPoolName:Y.name}:null}function to$($,Z,Q){return $?.warmPoolName??(Z?Q:"none")}function oo$($,Z,Q=!1,X){let Y=X&&X!=="default"?`-${X}`:"";return`${Z}${Y}${$==="harness-run"||Q?"-medium":""}`}async function UB1($){let Z=oo$($.purpose,$.templateName,$.tenantPool,$.sandboxImage);if(Z===$.templateName)return{name:Z,probes:$.probes};let Q=$.probes[Z]??null,X=Q!==null&&$.now-Q.checkedAt<$.ttlMs?Q:{checkedAt:$.now,present:await $.exists(Z)},Y={...$.probes,[Z]:X};if(X.present)return{name:Z,probes:Y};if(Q?.present!==!1)$.onAbsent?.(Z);if($.sandboxImage&&$.sandboxImage!=="default")return UB1({...$,sandboxImage:void 0,probes:Y});return{name:$.templateName,probes:Y}}function NB1($,Z,Q){let X=y60(Z);if(!X)return[];let Y=Q.replace(/^refs\/heads\//,"");return ip($).filter(({repo:J})=>y60(J.repoUrl)===X&&J.branch===Y)}class BB1{source;dirty=new Set;pods=new Map;known=new Map;constructor($){this.source=$}pools(){return this.source()}resolve($){return FB1(this.pools(),$)}markDirty($,Z){let Q=NB1(this.pools(),$,Z).map((X)=>X.warmPoolName);for(let X of Q)this.dirty.add(X);return Q}takeDirty($){return this.dirty.delete($)}pod($){return this.pods.get($)}setPod($,Z){this.pods.set($,Z)}retainPods($,Z){for(let[Q,X]of this.pods)if(X.pool===$&&!Z.has(Q))this.pods.delete(Q)}retain($){let Z=new Map($.map((X)=>[X.warmPoolName,X])),Q=[...this.known.values()].filter((X)=>!Z.has(X.warmPoolName));for(let X of this.dirty)if(!Z.has(X))this.dirty.delete(X);for(let[X,Y]of this.pods)if(!Z.has(Y.pool))this.pods.delete(X);return this.known=Z,Q}}var xE6=54,fE6,bE6=2048,yE6,g60,pC0,HB1,do$,uE6="studio.decocms.com/tenant-pool";var h60=L(()=>{a4();N60();fE6=/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/;yE6=WJ.object({runtime:WJ.enum(["node","bun","deno"]).default("node"),packageManager:WJ.enum(["npm","pnpm","yarn","bun","deno"]).optional(),packageManagerPath:WJ.string().optional(),devPort:WJ.number().int().positive().optional()}).default({runtime:"node"}),g60=WJ.object({repoUrl:WJ.string().max(bE6).transform(($,Z)=>{let Q=dN($);if(Q)return Q;return Z.addIssue({code:"custom",message:"repoUrl must be an https clone URL"}),WJ.NEVER}),branch:WJ.string().min(1).default("main"),workload:yE6,replicas:WJ.number().int().min(1)});pC0=class pC0 extends Error{poolName;size;allocated;constructor($,Z,Q){super(`pool ${$}: repos take ${Q} replicas, more than its size ${Z}`);this.poolName=$;this.size=Z;this.allocated=Q;this.name="TenantPoolCapacityError"}};HB1=WJ.object({name:WJ.string().max(xE6).regex(fE6,"pool name must be a DNS label (lowercase alphanumeric and '-')"),tenant:WJ.string().min(1).max(512),size:WJ.number().int().min(1),image:TN.default("default")}),do$=HB1.extend({repos:WJ.array(g60).default([])}).superRefine(($,Z)=>{let Q=gE6($.repos);if(Q)Z.addIssue({code:"custom",path:["repos"],message:`duplicate repo allocation ${Q.repoUrl}#${Q.branch}`});let X=mo$($.repos);if(X>$.size)Z.addIssue({code:"custom",path:["repos"],message:new pC0($.name,$.size,X).message})})});async function ao$($,Z,Q){let X=new Map;for(let Y of $){let J=Z(Y);if(!J)continue;let G=X.get(J);if(G)G.push(Y);else X.set(J,[Y])}await Promise.allSettled([...X.values()].map(async(Y)=>{for(let J of Y)await Q(J).catch(()=>{})}))}function lE6($){try{let Z=new URL($);if(Z.hostname.toLowerCase()!=="github.com")return null;let[Q,X]=Z.pathname.replace(/^\/+/,"").split("/"),Y=X?.replace(/\.git$/,"");return Q&&Y?`${Q}/${Y}`.toLowerCase():null}catch{return null}}function ro$($){if($.repositoryId)return{repositoryId:$.repositoryId};let Z=$.connectionId?lE6($.cloneUrl):null;return $.connectionId&&Z?{connectionId:$.connectionId,repo:Z}:null}var so$=L(()=>{h60()});async function pp($,Z,Q,X){let Y=(G)=>lC0(G.url,G.token,Z,Q),J=!(Q.body instanceof ReadableStream);try{let G=await Y($);if(G.status!==401||!J)return G;let W=await X.unauthorized();if(!W)return G;return await G.body?.cancel().catch(()=>{}),await Y(W)}catch(G){if(!J)throw G;let W=await X.unreachable();if(!W)throw G;return Y(W)}}var tC0=L(()=>{zg()});function Za$($,Z){return new Response(JSON.stringify(Z),{status:$,headers:{"content-type":"application/json","access-control-allow-origin":"*"}})}function eo$($){let Z=new Headers;for(let[Q,X]of $.headers.entries())if(!mE6.includes(Q.toLowerCase()))Z.set(Q,X);return new Response($.body,{status:$.status,statusText:$.statusText,headers:Z})}function $a$($,Z){let Q=Za$($,{error:Z});return Q.headers.set("x-sandbox-preview-not-ready","1"),Q}async function tp($,Z,Q){let X=await Z.base();if(!X)return $a$(404,"sandbox not found");let Y=new URL($.url);if((Y.pathname==="/_sandbox"||Y.pathname.startsWith("/_sandbox/"))&&$.method!=="GET")return Za$(404,{error:"not found"});let G=(F)=>`${F}${Y.pathname}${Y.search}`,W=new Headers($.headers);for(let F of cE6)W.delete(F);let K=$.method!=="GET"&&$.method!=="HEAD",H={method:$.method,headers:W,body:K?$.body:void 0,redirect:"manual",signal:$.signal,duplex:K?"half":void 0};try{return eo$(await fetch(G(X),H))}catch(F){let U=`${X}${Y.pathname}`;if(console.warn(`[${Q}] preview fetch to ${U} failed: ${F instanceof Error?F.message:String(F)}`),Z.invalidate(),$.method==="GET"||$.method==="HEAD"){let N=await Z.retryBase();if(N)try{return eo$(await fetch(G(N),H))}catch(B){console.warn(`[${Q}] preview fetch retry to ${U} failed: ${B instanceof Error?B.message:String(B)}`)}}return $a$(502,"sandbox daemon unreachable")}}var np="x-sandbox-preview-not-ready",cE6,mE6;var oC0=L(()=>{cE6=["cookie","host","connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","accept-encoding","content-length","upgrade"],mE6=["connection","keep-alive","transfer-encoding","content-encoding","content-length"]});import{createHash as dE6,randomBytes as iE6,randomUUID as Qa$}from"crypto";import*as Ha$ from"net";import{PassThrough as pE6}from"stream";function Xa$($){if($ instanceof Error)return $.message;if($&&typeof $==="object"){let Z=$;if(Z.error instanceof Error)return Z.error.message;if(typeof Z.message==="string"&&Z.message)return Z.message}return String($)}function Ga$($){return{pool:$.warmPoolName,org:$.pool.tenant}}class zB1{records=new Map;inflight=new Pg;activeGauge=new cC0;stateStore;previewUrlPattern;kubeConfig;capacityProbe;portForward;namespace;sandboxTemplateName;envName;tokenGenerator;idleTtlMs;metrics;previewGateway;sentinelToken;mintCloneUrl;mintPoolCloneUrl;mintOrgFsConfig;forwardPort;daemonAddress;persistCredentials;tenantPools;tenantPoolRefreshMs;templateProbes={};closed=!1;claimWatchAbort=new AbortController;constructor($={}){this.stateStore=$.stateStore??null,this.previewUrlPattern=$.previewUrlPattern??null,this.kubeConfig=$.kubeConfig??Jz6(),this.portForward=new uN1(this.kubeConfig),this.namespace=$.namespace??nE6,this.sandboxTemplateName=$.sandboxTemplateName??tE6,this.envName=Fz6($.envName),this.tokenGenerator=$.tokenGenerator??(()=>iE6(aE6).toString("hex")),this.idleTtlMs=$.idleTtlMs??sE6,this.metrics=$.meter?Yz6($.meter):null,this.previewGateway=$.previewGateway&&$.previewUrlPattern?{...$.previewGateway}:null;let Z=$.sentinelToken?.trim()??"";this.sentinelToken=Z.length>0?Z:null,this.mintCloneUrl=$.mintCloneUrl,this.mintPoolCloneUrl=$.mintPoolCloneUrl,this.mintOrgFsConfig=$.mintOrgFsConfig,this.forwardPort=$.forwardPort,this.daemonAddress=$.daemonAddress??"forward",this.persistCredentials=$.persistCredentials??!0;let Q=$.tenantPools;if(this.tenantPools=this.sentinelToken===null?null:new BB1(typeof Q==="function"?Q:()=>Q??[]),this.sentinelToken===null&&(typeof Q==="function"||(Q?.length??0)>0))console.warn(`[${V6}] tenant pools configured without a sentinel token \u2014 ignoring them (warm-pool mode is off)`);this.tenantPoolRefreshMs=$.tenantPoolRefreshMs??$z6,this.startClaimReaper(),this.startCredentialRefresher(),this.startTenantPoolReconciler()}startClaimReaper(){let $=["app.kubernetes.io/managed-by=studio","app.kubernetes.io/name=studio-sandbox",...this.envName?[`${KJ.env}=${this.envName}`]:[]].join(",");lo$({kc:this.kubeConfig,namespace:this.namespace,labelSelector:$,signal:this.claimWatchAbort.signal,onDelete:(Z)=>this.invalidateRecord(Z)})}async ensure($,Z={}){let Q=d3($);if(Q.startsWith("s-"))throw Error(`ensure: projectRef has no slug source: ${$.projectRef}`);return this.inflight.run(Q,()=>mC0(this.stateStore,$,(X)=>this.ensureLocked($,Q,Z,X)))}async delete($){let Z=await this.getRecord($);if(this.records.delete($),Z)this.dropRecord(Z);if(await this.deleteHttpRouteIfManaged($).catch((Q)=>{console.warn(`[${V6}] HTTPRoute delete failed for ${$}: ${Q instanceof Error?Q.message:String(Q)}`)}),await pR(this.kubeConfig,this.namespace,$),this.stateStore)if(Z)await this.stateStore.delete(Z.id);else await this.stateStore.deleteByHandle($)}lastTermination($){return mc$(this.kubeConfig,this.namespace,KJ.sandboxHandle,$,Y7.MAIN_CONTAINER_NAME)}async alive($){return await hD(this.kubeConfig,this.namespace,$)!==void 0}watchClaimLifecycle($,Z){return ho$({kc:this.kubeConfig,namespace:this.namespace,claimName:$,signal:Z})}hasSchedulableCapacity(){return this.capacityProbe??=$m$(this.kubeConfig,this.namespace),this.capacityProbe()}async getPreviewUrl($){let Z=await this.getRecord($);if(!Z)return null;return this.composePreviewUrl(Z)}async proxyDaemonRequest($,Z,Q){let X=await this.getRecord($);if(!X&&this.previewUrlPattern&&this.stateStore){let K=await this.stateStore.getByHandle($),H=K?.state,F=H?.token;if(K&&F){let N=`http://${H?.adoptedSandboxName??$}.${this.namespace}.svc.cluster.local:${iN}`;try{let B=await lC0(N,F,Z,Q);if(B.status!==404)return B;try{await B.body?.cancel()}catch{}}catch{}}}if(!X)X=await this.resurrectByHandle($);if(!X)return new Response(JSON.stringify({error:"sandbox not found"}),{status:404,headers:{"content-type":"application/json"}});let Y=X,J=performance.now(),G=0,W=(K)=>{return Y=K,{url:K.daemonUrl,token:K.token}};try{let K=await pp(W(X),Z,Q,{unauthorized:async()=>{this.invalidateRecord($);let H=await this.getRecord($).catch(()=>null)??await this.resurrectByHandle($).catch(()=>null);return H?W(H):null},unreachable:async()=>{this.invalidateRecord($);let H=await this.resurrectByHandle($)??await this.getRecord($).catch(()=>null);return H?W(H):null}});return G=K.status,K}finally{this.recordProxyDuration("daemon",G,Y,performance.now()-J)}}async adoptLiveClaim($,Z){if(this.records.has(Z))return!0;let Q=await hD(this.kubeConfig,this.namespace,Z).catch(()=>{return});if(!Q||Q.metadata?.deletionTimestamp)return!1;return await this.inflight.run(Z,async()=>{let Y=this.records.get(Z);if(Y)return this.toSandbox(Y);let J=await this.adopt($,Z,Q);if(!J)throw Error(`cannot adopt live claim ${Z}`);return mC0(this.stateStore,$,(G)=>this.finish(J,G,!0,!0,"adopt"))}).catch(()=>null)!=null}async resolvePreviewUpstreamUrl($){if(this.previewUrlPattern)return`http://${await this.resolveServiceNameForHandle($)}.${this.namespace}.svc.cluster.local:${iN}`;let Z=await this.getRecord($);if(Z)return Z.daemonUrl;let Q=await this.resurrectByHandle($);return Q?Q.daemonUrl:null}async daemonEndpoint($){let Z=await this.getRecord($)??await this.resurrectByHandle($);if(!Z)return null;return{url:this.daemonAddress==="service"?`http://${Z.adoptedSandboxName}.${this.namespace}.svc.cluster.local:${iN}`:Z.daemonUrl,token:Z.token}}listSandboxes(){return[...this.records.values()].map(($)=>{let Z=$.ensureOpts,Q=Z?.tenant;return{handle:$.handle,tenant:Q?{orgId:Q.orgId,userId:Q.userId}:null,repos:[Z?.repo,...Z?.extraRepos??[]].filter((X)=>X!==void 0).map(ro$).filter((X)=>X!==null),orgFs:Boolean(Z?.orgFsConfigJson)||$.orgFsRedacted===!0}})}async resolveServiceNameForHandle($){let Z=this.records.get($);if(Z)return Z.adoptedSandboxName;if(this.stateStore){let X=(await this.stateStore.getByHandle($).catch(()=>null))?.state?.adoptedSandboxName;if(X)return X}return $}async proxyPreviewRequest($,Z){let Q=performance.now(),X=this.records.get($)??null,Y=0;try{let J=await tp(Z,{base:()=>this.resolvePreviewUpstreamUrl($),invalidate:()=>this.invalidateRecord($),retryBase:async()=>{return await this.resurrectByHandle($).catch(()=>null)?this.resolvePreviewUpstreamUrl($):null}},V6);return Y=J.status,J}finally{this.recordProxyDuration("preview",Y,X,performance.now()-Q,$)}}async ensureLocked($,Z,Q,X){if(Q.image)console.warn(`[${V6}] opts.image ignored (template ${this.sandboxTemplateName} pins image): got ${Q.image}`);if(X){let G=await X.get($);if(G){let W=await this.rehydrate($,Z,G);if(W)return await this.refreshDaemonGitCredential(W,Q),await this.relayOrgFsConfig(W.daemonUrl,W.token,Q.orgFsConfigJson),this.finish(W,X,!1,!0,"resume");await X.delete($)}}let Y=await hD(this.kubeConfig,this.namespace,Z).catch(()=>{return});if(Y)if(Y.metadata?.deletionTimestamp)await D60(this.kubeConfig,this.namespace,Z).catch((G)=>{console.warn(`[${V6}] wait for terminating claim ${Z} failed: ${G instanceof Error?G.message:String(G)}`)});else if(!LB1(Y)){let G=await this.join($,Z,Q,Y).catch((W)=>{return console.warn(`[${V6}] join of starting claim ${Z} failed, recreating: ${W instanceof Error?W.message:String(W)}`),null});if(G)return this.finish(G,X,!0,!0,"adopt");await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),await D60(this.kubeConfig,this.namespace,Z).catch((W)=>{console.warn(`[${V6}] wait for deleted claim ${Z} failed: ${W instanceof Error?W.message:String(W)}`)})}else{let G=await this.adopt($,Z,Y).catch((W)=>{return console.warn(`[${V6}] adopt ${Z} failed, recreating: ${W instanceof Error?W.message:String(W)}`),null});if(G)return await this.refreshDaemonGitCredential(G,Q),await this.relayOrgFsConfig(G.daemonUrl,G.token,Q.orgFsConfigJson),this.finish(G,X,!0,!0,"adopt");await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),await D60(this.kubeConfig,this.namespace,Z).catch((W)=>{console.warn(`[${V6}] wait for deleted claim ${Z} failed: ${W instanceof Error?W.message:String(W)}`)})}let J=await this.provision($,Z,Q);return this.finish(J,X,!0,!1,"fresh")}async finish($,Z,Q,X,Y){let J=this.records.get($.handle),G=J!==void 0;if(J&&J.daemonForward!==$.daemonForward)this.closeForwarder(J.daemonForward);if(this.records.set($.handle,$),Q)await this.persist(Z,$);if(X)await Pj0(this.kubeConfig,this.namespace,$.handle,this.computeShutdownTime()).catch((W)=>console.warn(`[${V6}] TTL refresh failed for ${$.handle}: ${W instanceof Error?W.message:String(W)}`));if(this.metrics){let W=jB1($.tenant);if(this.metrics.ensureOutcome.add(1,{...W,outcome:Y}),!G)this.metrics.active.add(1,W),this.activeGauge.markCounted($.handle)}return this.toSandbox($)}buildEnvMap($,Z){let Q={},X=[];for(let[Y,J]of Object.entries($.env??{}))if(rE6.has(Y))X.push(Y);else Q[Y]=J;if(X.length>0)console.warn(`[${V6}] opts.env keys overlap reserved bootstrap names and were dropped: ${X.join(",")}`);return{...Q,DAEMON_TOKEN:Z.token,DAEMON_BOOT_ID:Z.daemonBootId,APP_ROOT:Z.workdir,PROXY_PORT:String(iN)}}async resolveTemplateName($,Z,Q){let{name:X,probes:Y}=await UB1({purpose:$,tenantPool:Z,...Q?{sandboxImage:Q}:{},templateName:this.sandboxTemplateName,probes:this.templateProbes,now:Date.now(),ttlMs:oE6,exists:(J)=>hc$(this.kubeConfig,this.namespace,J),onAbsent:(J)=>console.warn(`[${V6}] SandboxTemplate ${J} not found (or not readable) \u2014 this claim falls back to a template without that suffix. Upgrade the sandbox-env chart to the version that renders it.`)});return this.templateProbes=Y,X}buildClaim($,Z,Q,X,Y){let J=this.sentinelToken!==null,G=J?[]:Object.entries(this.buildEnvMap(Z,Q)).sort(([H],[F])=>H<F?-1:H>F?1:0).map(([H,F])=>({name:H,value:F})),W=Bz6(Z),K=Object.keys(W).length>0;return{apiVersion:`${Y7.CLAIM_API_GROUP}/${Y7.CLAIM_API_VERSION}`,kind:"SandboxClaim",metadata:{name:$,namespace:this.namespace,labels:{"app.kubernetes.io/name":"studio-sandbox","app.kubernetes.io/managed-by":"studio",...this.envName?{[KJ.env]:this.envName}:{},...OB1(Z.tenant)},...K?{annotations:W}:{}},spec:{sandboxTemplateRef:{name:Y},additionalPodMetadata:{labels:OB1(Z.tenant,{[KJ.role]:"claimed",[KJ.sandboxHandle]:$,...this.envName?{[KJ.env]:this.envName}:{}}),...K?{annotations:W}:{}},env:G,warmpool:to$(X,J,Y),lifecycle:{shutdownPolicy:"Delete",shutdownTime:this.computeShutdownTime()}}}}async provision($,Z,Q){let X=this.tokenGenerator(),Y=Qa$(),J=aC0,G=this.claimTenantPoolBinding(Q),W=this.buildClaim(Z,Q,{token:X,daemonBootId:Y,workdir:J},G,await this.resolveTemplateName(Q.purpose,G!==null,Q.sandboxImage));try{await WU1(this.kubeConfig,this.namespace,W)}catch(K){if(K instanceof U60)await D60(this.kubeConfig,this.namespace,Z),await WU1(this.kubeConfig,this.namespace,W);else throw K}return this.bind($,Z,Q,G,{token:X,daemonBootId:Y,workdir:J})}claimTenantPoolBinding($){return this.tenantPools?.resolve({tenant:nC0($),image:$.sandboxImage??"default",cloneUrl:$.repo?.cloneUrl,branch:$.repo?.branch})??null}async bind($,Z,Q,X,{token:Y,daemonBootId:J,workdir:G}){let W;try{W=await uc$(this.kubeConfig,this.namespace,Z),await uo$((B)=>this.watchClaimLifecycle(Z,B))}catch(B){throw await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),B}try{await this.ensureServicePortForAdoptedSandbox(W),await this.ensureHttpRouteForHandle(Z,W,Q.tenant??null)}catch(B){throw await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),B}let K=await this.openForwarder(W,iN,Z),H=`http://127.0.0.1:${K.localPort}`,F=X?.repo!=null&&W!==Z,U=this.workloadConfigPayload(Q,F),N=J;try{if(await GB1(H),this.sentinelToken!==null){let B=await uC0(H);if(B)N=B.bootId;try{await mN(H,this.sentinelToken,U??{},{rotateToken:Y})}catch(D){if(D instanceof PF&&D.status===401)console.warn(`[${V6}] sentinel rejected by adopted pod (handle=${Z}, sandbox=${W}): pod belongs to another claim; tearing down and reprovisioning`);throw D}}else if(U)await mN(H,Y,U);await this.relayOrgFsConfig(H,Y,Q.orgFsConfigJson)}catch(B){throw this.closeForwarder(K),await this.deleteHttpRouteIfManaged(Z).catch(()=>{}),await pR(this.kubeConfig,this.namespace,Z).catch(()=>{}),B}return{id:$,handle:Z,adoptedSandboxName:W,token:Y,workdir:G,daemonUrl:H,daemonForward:K,workload:Q.workload??null,daemonBootId:N,tenant:Q.tenant??null,tenantPoolPodBound:F,ensureOpts:Ez6(Q)}}workloadConfigPayload($,Z){return mp({runtime:$?.workload?.runtime??"node",packageManager:$?.workload?.packageManager?{name:$.workload.packageManager,...$.workload.packageManagerPath?{path:$.workload.packageManagerPath}:{}}:null,repo:$?.repo??null,extraRepos:$?.extraRepos??[],port:$?.workload?.devPort??Ya$,tenant:$?.tenant??void 0,...$?{cloneOnly:$.cloneOnly===!0&&!Z}:{}})}async relayOrgFsConfig($,Z,Q){if(!Q)return;await x60($,Z,Q).catch((X)=>console.warn("[org-fs] sidecar config relay failed",X))}async refreshDaemonGitCredential($,Z){let Q=b60(Z);if(!Q)return;try{await mN($.daemonUrl,$.token,Q)}catch(X){console.warn(`[${V6}] git credential refresh failed for ${$.handle}: ${X instanceof Error?X.message:String(X)}`)}}async withFreshCloneUrl($,Z={}){if(!this.mintCloneUrl)return $;try{let Q=await this.mintCloneUrl($,Z);if(!Q)return $;let{credentialExpiresAt:X,...Y}=$;return{...Y,cloneUrl:Q}}catch(Q){return console.warn(`[${V6}] clone credential re-mint failed: ${Q instanceof Error?Q.message:String(Q)}`),$}}async withFreshCredentials($,Z=!1){return{...$,...$.repo?{repo:await this.withFreshCloneUrl($.repo,{tenant:$.tenant})}:{},...$.orgFsConfigJson||Z?{orgFsConfigJson:await jz6($,this.mintOrgFsConfig)}:{}}}startCredentialRefresher(){if(!this.mintCloneUrl)return;let{signal:$}=this.claimWatchAbort;(async()=>{while(!$.aborted){if(await $$(Zz6,{signal:$}).catch(()=>{}),$.aborted)break;try{await this.refreshAllGitCredentials()}catch(Z){console.warn(`[${V6}] periodic credential refresh failed: ${Z instanceof Error?Z.message:String(Z)}`)}}})()}startTenantPoolReconciler(){let $=this.tenantPools;if(!$)return;let{signal:Z}=this.claimWatchAbort;(async()=>{while(!Z.aborted){try{await this.reconcileTenantPools($)}catch(Q){console.warn(`[${V6}] tenant pool reconcile failed: ${Q instanceof Error?Q.message:String(Q)}`)}await $$(eE6,{signal:Z}).catch(()=>{})}})()}listTenantPools(){return this.tenantPools?.pools()??[]}markTenantPoolsDirty($,Z){return Promise.resolve(this.tenantPools?.markDirty($,Z)??[])}async reconcileTenantPools($){let Z=ip($.pools());for(let Q of $.retain(Z))this.recordPoolGone(Q);for(let Q of Z){let X=Q.warmPoolName,Y=await lc$(this.kubeConfig,this.namespace,X);if(Y===null){console.warn(`[${V6}] tenant pool ${X}: no SandboxWarmPool (or no selector yet) in ${this.namespace}`);continue}let J=$.takeDirty(X),G=Y.filter((W)=>!W.labels[KJ.sandboxHandle]);$.retainPods(X,new Set(Y.map((W)=>W.uid)));for(let W of G){if(this.claimWatchAbort.signal.aborted)return;await this.warmPoolPod($,Q,W,J)}this.recordPoolDepth($,Q,Y,G)}}recordPoolGone($){let Z=Ga$($);for(let Q of["ready","bound","pending","failed"])this.metrics?.poolPods.record(0,{...Z,state:Q})}recordPoolDepth($,Z,Q,X){let Y=this.metrics?.poolPods;if(!Y)return;let J=0,G=0;for(let K of X){let H=$.pod(K.uid);if(!H)continue;if(H.failures>=rC0)G++;else if(H.lastConfigAt>0)J++}let W=Ga$(Z);Y.record(J,{...W,state:"ready"}),Y.record(Q.length-X.length,{...W,state:"bound"}),Y.record(X.length-J-G,{...W,state:"pending"}),Y.record(G,{...W,state:"failed"})}async warmPoolPod($,Z,Q,X){let Y=Z.warmPoolName,{workload:J}=Z.repo,G=$.pod(Q.uid);if(G&&G.failures>=rC0){if(Date.now()-G.lastFailureAt<Ja$)return;$.setPod(Q.uid,{...G,failures:0})}let W=X||G!==void 0&&Date.now()-G.lastConfigAt>=this.tenantPoolRefreshMs;if(G&&!W)return;let K=await this.allocationCloneUrl(Z);if(!K){this.recordPoolFailure($,Q,Y,"clone credential mint failed");return}let H={cloneUrl:K,branch:Z.repo.branch,userName:"",userEmail:""},F=await this.openForwarder(Q.name,iN,Q.name).catch(()=>null);if(!F){this.recordPoolFailure($,Q,Y,"port-forward failed");return}let U=`http://127.0.0.1:${F.localPort}`;try{await GB1(U);let N=this.sentinelToken;if(!N)return;if(!await this.isPoolPodUnbound(Q))return;let B=mp({runtime:J.runtime,packageManager:J.packageManager?{name:J.packageManager,...J.packageManagerPath?{path:J.packageManagerPath}:{}}:null,repo:H,port:J.devPort??Ya$})??{},{transition:D}=await mN(U,N,B);if(W&&D!=="bootstrap"&&await this.isPoolPodUnbound(Q))await So$(U,N,"clone");$.setPod(Q.uid,{pool:Y,lastConfigAt:Date.now(),lastFailureAt:0,failures:0}),console.log(`[${V6}] tenant pool ${Y}: warmed ${Q.name} (${D})`)}catch(N){this.recordPoolFailure($,Q,Y,N instanceof Error?N.message:String(N))}finally{this.closeForwarder(F)}}async allocationCloneUrl({pool:$,repo:Z}){if(!this.mintPoolCloneUrl)return`${Z.repoUrl}.git`;try{return await this.mintPoolCloneUrl({tenant:$.tenant,repoUrl:Z.repoUrl,branch:Z.branch})}catch(Q){return console.warn(`[${V6}] tenant pool clone credential mint failed: ${Q instanceof Error?Q.message:String(Q)}`),null}}isPoolPodUnbound($){return cc$(this.kubeConfig,this.namespace,$.name,KJ.sandboxHandle)}recordPoolFailure($,Z,Q,X){let Y=$.pod(Z.uid),J=(Y?.failures??0)+1;$.setPod(Z.uid,{pool:Q,lastConfigAt:Y?.lastConfigAt??0,lastFailureAt:Date.now(),failures:J});let G=J>=rC0?` \u2014 backing off ${Ja$/60000}min`:"";console.warn(`[${V6}] tenant pool ${Q}: warming ${Z.name} failed (${J}/${rC0})${G}: ${X}`)}async refreshAllGitCredentials(){await ao$(this.records.values(),($)=>$.ensureOpts?.repo?.connectionId,async($)=>{if(this.claimWatchAbort.signal.aborted)return;let Z=$.ensureOpts?.repo;if(!Z)return;try{let Q=await this.withFreshCloneUrl(Z,{bufferMs:Qz6,tenant:$.ensureOpts?.tenant});await this.refreshDaemonGitCredential($,{...$.ensureOpts,repo:Q}),$.ensureOpts={...$.ensureOpts,repo:Q}}catch(Q){throw console.warn(`[${V6}] git credential refresh failed for ${$.handle}: ${Q instanceof Error?Q.message:String(Q)}`),Q}})}async rebootstrapDaemon($,Z,Q){if(this.sentinelToken===null)return!1;let X=this.workloadConfigPayload(Q,!1)??{};try{return await mN($,this.sentinelToken,X,{rotateToken:Z}),await this.relayOrgFsConfig($,Z,Q?.orgFsConfigJson),!0}catch(Y){if(Y instanceof PF&&Y.status===401)try{return await mN($,Z,X,{rotateToken:Z}),await this.relayOrgFsConfig($,Z,Q?.orgFsConfigJson),!0}catch(J){return console.warn(`[${V6}] re-bootstrap retry with claim token failed: ${J instanceof Error?J.message:String(J)}`),!1}return console.warn(`[${V6}] re-bootstrap failed: ${Y instanceof Error?Y.message:String(Y)}`),!1}}async ensureServicePortForAdoptedSandbox($){if(!this.previewGateway||!this.previewUrlPattern)return;await rc$(this.kubeConfig,this.namespace,$,{name:"daemon",port:iN,targetPort:iN})}async ensureHttpRouteForHandle($,Z,Q){if(!this.previewGateway||!this.previewUrlPattern)return;let X=zz6(this.previewUrlPattern,$);if(!X)throw new QY(`Unable to derive preview hostname for ${$} from pattern: ${this.previewUrlPattern}`);let Y={apiVersion:`${HU1.API_GROUP}/${HU1.API_VERSION}`,kind:"HTTPRoute",metadata:{name:$,namespace:this.namespace,labels:OB1(Q??void 0,{[KJ.role]:"claimed",[KJ.sandboxHandle]:$,"app.kubernetes.io/name":"studio-sandbox","app.kubernetes.io/managed-by":"studio",...this.envName?{[KJ.env]:this.envName}:{}})},spec:{parentRefs:[{kind:"Gateway",group:"gateway.networking.k8s.io",name:this.previewGateway.name,namespace:this.previewGateway.namespace}],hostnames:[X],rules:[{backendRefs:[{group:"",kind:"Service",name:Z,port:iN}]}]}};await tc$(this.kubeConfig,this.namespace,Y)}async deleteHttpRouteIfManaged($){if(!this.previewGateway)return;await oc$(this.kubeConfig,this.namespace,$)}async rehydrate($,Z,Q){let X=Q.state;if(!X.adoptedSandboxName&&!X.podName||!X.token)return null;let Y=await hD(this.kubeConfig,this.namespace,Z).catch(()=>{return});if(!Y||!LB1(Y))return null;let J=Y.status?.sandbox?.name??X.adoptedSandboxName??X.podName??Z,G=await this.openAndProbeDaemon(J,Z);if(!G)return null;if(X.daemonBootId&&X.daemonBootId!==G.bootId){if(this.sentinelToken!==null){let W=X.ensureOpts?await this.withFreshCredentials(X.ensureOpts,X.orgFsRedacted===!0):null;if(!await this.rebootstrapDaemon(G.daemonUrl,X.token,W))return this.closeForwarder(G.daemonForward),null}else console.warn(`[${V6}] daemon restart detected (handle=${Z}): stored bootId=${X.daemonBootId} live bootId=${G.bootId}`);await this.stateStore?.put($,{handle:Z,state:{...X,daemonBootId:G.bootId}}).catch((W)=>console.warn(`[${V6}] bootId persist failed for ${Z}: ${W instanceof Error?W.message:String(W)}`))}return{id:$,handle:Z,adoptedSandboxName:J,tenantPoolPodBound:!1,token:X.token,workdir:X.workdir??aC0,daemonUrl:G.daemonUrl,daemonForward:G.daemonForward,workload:X.workload??null,daemonBootId:G.bootId,tenant:X.tenant??null,ensureOpts:X.ensureOpts??null,orgFsRedacted:X.orgFsRedacted===!0}}join($,Z,Q,X){let Y=this.sentinelToken!==null,J=Y?this.tokenGenerator():DB1(X,"DAEMON_TOKEN"),G=Y?Qa$():DB1(X,"DAEMON_BOOT_ID");if(!J||!G)throw new QY(`claim ${Z} carries no daemon token`);return this.bind($,Z,Q,this.claimTenantPoolBinding(Q),{token:J,daemonBootId:G,workdir:aC0})}async adopt($,Z,Q){if(!LB1(Q))return null;let X=Q.status?.sandbox?.name??Z;if(this.sentinelToken!==null)return null;let Y=DB1(Q,"DAEMON_TOKEN");if(!Y)return null;let J=await this.openAndProbeDaemon(X,Z);if(!J)return null;let G=Lz6(Q);if(this.previewGateway)await this.ensureServicePortForAdoptedSandbox(X).catch((W)=>{console.warn(`[${V6}] Service port backfill failed for ${Z}: ${W instanceof Error?W.message:String(W)}`)}),await this.ensureHttpRouteForHandle(Z,X,G).catch((W)=>{console.warn(`[${V6}] HTTPRoute backfill failed for ${Z}: ${W instanceof Error?W.message:String(W)}`)});return{id:$,handle:Z,adoptedSandboxName:X,tenantPoolPodBound:!1,token:Y,workdir:aC0,daemonUrl:J.daemonUrl,daemonForward:J.daemonForward,workload:null,daemonBootId:J.bootId,tenant:G,ensureOpts:null}}async openAndProbeDaemon($,Z){let Q=await this.openForwarder($,iN,Z).catch(()=>null);if(!Q)return null;let X=`http://127.0.0.1:${Q.localPort}`,Y=await uC0(X);if(!Y)return this.closeForwarder(Q),null;return{daemonForward:Q,daemonUrl:X,bootId:Y.bootId}}async getRecord($){let Z=this.records.get($);if(Z)return Z;if(!this.stateStore)return null;let Q=await this.stateStore.getByHandle($);if(!Q)return null;let X=await this.rehydrate(Q.id,$,Q);if(X)this.records.set($,X);return X}async resurrectByHandle($){if(!this.stateStore)return null;let Z=await this.stateStore.getByHandle($);if(!Z)return null;let Q=Z.state,X=Q.ensureOpts;if(!X)return null;let Y=await this.withFreshCredentials(X,Q.orgFsRedacted===!0);if(d3(Z.id)!==$)return null;return await this.ensure(Z.id,Y),this.records.get($)??null}invalidateRecord($){let Z=this.records.get($);if(!Z)return;this.records.delete($),this.dropRecord(Z)}dropRecord($){if(this.closeForwarder($.daemonForward),this.metrics&&this.activeGauge.consume($.handle))this.metrics.active.add(-1,jB1($.tenant))}recordProxyDuration($,Z,Q,X,Y){if(!this.metrics)return;this.metrics.proxyDurationMs.record(X,{...jB1(Q?.tenant??null),source:$,sandbox_handle:Q?.handle??Y??"",status_code:Z||0})}composePreviewUrl($){if(this.previewUrlPattern)return dC0(this.previewUrlPattern,$.handle);return`http://127.0.0.1:${$.daemonForward.localPort}/`}toSandbox($){return{handle:$.handle,workdir:$.workdir,previewUrl:this.composePreviewUrl($),warmPoolAdopted:$.tenantPoolPodBound===!0,provider:"kubernetes"}}async persist($,Z){if(!$)return;let Q={adoptedSandboxName:Z.adoptedSandboxName,token:Z.token,workdir:Z.workdir,workload:Z.workload,daemonBootId:Z.daemonBootId,tenant:Z.tenant,...Z.ensureOpts?this.persistCredentials?{ensureOpts:Z.ensureOpts}:wz6(Z.ensureOpts,Z.orgFsRedacted===!0):{}};await $.put(Z.id,{handle:Z.handle,state:Q})}computeShutdownTime(){return new Date(Date.now()+this.idleTtlMs).toISOString()}async releaseAfter($,Z){let Q=await hD(this.kubeConfig,this.namespace,$);if(!Q)return;let X=Dz6(Q.spec?.lifecycle?.shutdownTime,new Date(Date.now()+Z));if(!X)return;await Pj0(this.kubeConfig,this.namespace,$,X).catch((Y)=>console.warn(`[${V6}] release failed for ${$}: ${Y instanceof Error?Y.message:String(Y)}`))}async renewTtl($){let Z=await hD(this.kubeConfig,this.namespace,$);if(!Z)return;let Q=Oz6(Z.spec?.lifecycle?.shutdownTime,new Date(Date.now()+this.idleTtlMs));if(!Q)return;await Pj0(this.kubeConfig,this.namespace,$,Q).catch((X)=>console.warn(`[${V6}] TTL renew failed for ${$}: ${X instanceof Error?X.message:String(X)}`))}openForwarder($,Z,Q=$){if(this.forwardPort)return this.forwardPort($,Z,Q);let X=Gz6(Q,Z);return new Promise((Y,J)=>{let G=(W,K)=>{let H=Ha$.createServer((F)=>this.handleForwardedConnection(F,$,Z,Q));H.once("error",(F)=>{if(F.code==="EADDRINUSE"&&K<Xz6){try{H.close()}catch{}let U=wB1+(W-wB1+1)%Fa$;G(U,K+1);return}J(F)}),H.listen(W,"127.0.0.1",()=>{let F=H.address();if(!F||typeof F==="string"){H.close(),J(Error("port-forward listener failed to bind"));return}let U=F.port;Y({localPort:U,close:()=>H.close((N)=>{if(N)console.warn(`[${V6}] port-forward close on :${U} errored: ${N.message}`)})})})};G(X,0)})}handleForwardedConnection($,Z,Q,X){let Y=new pE6,J=null,G=!1,W=()=>{if(G)return;if(G=!0,Y.destroy(),J)try{J.close()}catch{}if(!$.destroyed)$.destroy()};$.pipe(Y),$.on("error",W),$.on("close",W),this.portForward.portForward(this.namespace,Z,[Q],$,null,Y).then((K)=>{let H=typeof K==="function"?K():K;if(!H){W();return}if(J=H,J.on("close",W),J.on("error",(F)=>{console.warn(`[${V6}] port-forward to ${Z}:${Q} dropped mid-connection: ${Xa$(F)}`,JSON.stringify(EB1(F))),this.invalidateRecord(X),W()}),G)try{J.close()}catch{}}).catch((K)=>{console.warn(`[${V6}] port-forward to ${Z}:${Q} failed: ${Xa$(K)}`,JSON.stringify(EB1(K))),this.invalidateRecord(X),W()})}closeForwarder($){$.close()}close(){if(this.closed)return;this.closed=!0,this.claimWatchAbort.abort();for(let $ of this.records.values())this.dropRecord($);this.records.clear()}}function Yz6($){return{active:$.createUpDownCounter("studio.sandbox.active",{description:"Active sandbox count, by runner kind, owning org, and daemon impl. Cross-checks the cAdvisor-derived count from the cluster \u2014 divergence between the two indicates orphaned claims (studio deleted but K8s didn't reap) or unattributed pods.",unit:"{sandbox}"}),ensureOutcome:$.createCounter("studio.sandbox.ensure.outcome",{description:"Outcome of each ensure() call: fresh provision, resume from state-store after restart, or adopt of a cluster-side claim studio didn't know about. Cold-start ratio is the primary input for warm-pool sizing.",unit:"{call}"}),proxyDurationMs:$.createHistogram("studio.sandbox.proxy.duration_ms",{description:"Wall-clock latency of studio-mediated requests to the sandbox daemon: tool exec proxies (source=daemon) and preview iframe traffic (source=preview).",unit:"ms"}),poolPods:$.createGauge("studio.sandbox.pool.pods",{description:"Tenant warm pool depth by pool and state: ready (warmed and unbound \u2014 what a claim can actually bind instantly), bound (serving a user), pending (unbound, not yet warmed), failed (gave up after repeated bootstrap failures). Alert on sustained ready=0: a pool that is always empty is doing nothing while costing N pods.",unit:"{pod}"})}}function EB1($){let Z=[],Q=$;for(let X=0;X<5&&Q instanceof Error;X++){let Y=Q;if(Z.push({name:Y.name,message:Y.message,...Y.code!==void 0?{code:Y.code}:{},...Y.errno!==void 0?{errno:Y.errno}:{}}),Y.cause===Q)break;Q=Y.cause}if(Q!==void 0&&!(Q instanceof Error)&&Q!==null){let X=Q,Y=X.error instanceof Error?EB1(X.error).chain:void 0;Z.push({nonError:String(Q),...typeof X.type==="string"?{type:X.type}:{},...typeof X.message==="string"?{message:X.message}:{},...X.code!==void 0?{code:X.code}:{},...typeof X.reason==="string"?{reason:X.reason}:{},...Y?{error:Y}:{},...Y===void 0&&X.error!==void 0?{rawError:String(X.error)}:{},keys:Object.keys(X)})}return{chain:Z}}function Jz6(){let $=new TC0;return $.loadFromDefault(),$}function LB1($){return Boolean($.status?.conditions?.some((Z)=>Z.type==="Ready"&&Z.status==="True"))}function DB1($,Z){let Q=$.spec?.env;if(!Q)return null;for(let X of Q)if(X.name===Z&&X.value)return X.value;return null}function Gz6($,Z){let Q=dE6("sha256").update(`${$}:${Z}`).digest();return wB1+Q.readUInt32BE(0)%Fa$}function Wa$($){let Z=$.slice(0,Kz6);return Wz6.test(Z)?Z:""}function Fz6($){if($===void 0)return null;let Z=$.trim();if(Z==="")return null;if(!Hz6.test(Z))throw Error(`AgentSandboxProvider: envName=${JSON.stringify(Z)} is not a valid DNS-label-safe environment name (lowercase alphanumeric or '-', starts with a letter, ends alphanumeric, \u226432 chars). Studio sets this from STUDIO_ENV; check the studio chart's configMap.`);return Z}function OB1($,Z={}){let Q={...Z};if($){let X=Wa$($.orgId),Y=Wa$($.userId);if(X)Q[KJ.orgId]=X;if(Y)Q[KJ.userId]=Y}return Q}function Tg($){let Z="";for(let Q of $){let X=Q.codePointAt(0)??0;Z+=X<32||X===127?" ":Q}return Z.slice(0,Uz6)}function Nz6($){try{let Z=new URL($);return Z.username="",Z.password="",Z.toString()}catch{return""}}function Bz6($){let Z={},Q=$.tenant;if(Q?.orgSlug)Z[TF.orgSlug]=Tg(Q.orgSlug);if(Q?.orgName)Z[TF.orgName]=Tg(Q.orgName);if(Q?.userEmail)Z[TF.userEmail]=Tg(Q.userEmail);if(Q?.userName)Z[TF.userName]=Tg(Q.userName);let X=$.repo;if(X){if(X.displayName)Z[TF.gitRepo]=Tg(X.displayName);let Y=Nz6(X.cloneUrl);if(Y)Z[TF.gitRepoUrl]=Tg(Y);let J=$.branch??X.branch;if(J)Z[TF.gitBranch]=Tg(J)}return Z}function Lz6($){let Z=$.metadata?.labels;if(!Z)return null;let Q=Z[KJ.orgId],X=Z[KJ.userId];if(!Q||!X)return null;let Y=$.metadata?.annotations??{};return{orgId:Q,userId:X,orgSlug:Y[TF.orgSlug],orgName:Y[TF.orgName],userEmail:Y[TF.userEmail],userName:Y[TF.userName]}}function Dz6($,Z){if($){let Q=new Date($).getTime();if(Number.isFinite(Q)&&Q<=Z.getTime())return null}return Z.toISOString()}function Oz6($,Z){if($){let Q=new Date($).getTime();if(Number.isFinite(Q)&&Q>=Z.getTime())return null}return Z.toISOString()}function jB1($){return{org_id:$?.orgId??"",user_id:$?.userId??"",runner_kind:"agent-sandbox"}}async function jz6($,Z){if(!Z||!$.tenant)return $.orgFsConfigJson;try{return await Z($.tenant)??$.orgFsConfigJson}catch(Q){return console.warn(`[${V6}] org-fs credential re-mint failed: ${Q instanceof Error?Q.message:String(Q)}`),$.orgFsConfigJson}}function Ka$($){try{let Z=new URL($.cloneUrl);Z.username="",Z.password="";let{submoduleCredentials:Q,credentialExpiresAt:X,...Y}=$;return{...Y,cloneUrl:Z.toString()}}catch{return null}}function wz6($,Z){let{orgFsConfigJson:Q,repo:X,extraRepos:Y,...J}=$,G=J,W=X&&Ka$(X);if(W)G.repo=W;if(Y)G.extraRepos=Y.map(Ka$).filter((K)=>K!==null);return Q||Z?{ensureOpts:G,orgFsRedacted:!0}:{ensureOpts:G}}function Ez6($){let Z={};if($.branch)Z.branch=$.branch;if($.repo)Z.repo=$.repo;if($.workload)Z.workload=$.workload;if($.env&&Object.keys($.env).length>0)Z.env=$.env;if($.tenant)Z.tenant=$.tenant;if($.cloneOnly)Z.cloneOnly=!0;if($.purpose)Z.purpose=$.purpose;if($.sandboxImage)Z.sandboxImage=$.sandboxImage;if($.orgFsConfigJson)Z.orgFsConfigJson=$.orgFsConfigJson;return Object.keys(Z).length>0?Z:null}function zz6($,Z){try{return new URL(dC0($,Z)).hostname||null}catch{return null}}var V6="AgentSandboxProvider",nE6="agent-sandbox-system",tE6="studio-sandbox",oE6=300000,iN=9000,Ya$=3000,aC0="/app",aE6=32,rE6,sE6=900000,eE6=60000,$z6=1800000,rC0=3,Ja$=1800000,Zz6=900000,Qz6=1800000,wB1=40000,Fa$=1e4,Xz6=256,KJ,TF,Wz6,Kz6=63,Hz6,Uz6=253;var Ua$=L(()=>{$8();Zm$();Mo$();zg();dp();Tj0();N60();co$();h60();so$();tC0();oC0();rE6=new Set(["DAEMON_TOKEN","DAEMON_BOOT_ID","APP_ROOT","PROXY_PORT"]);KJ={role:"studio.decocms.com/role",sandboxHandle:"studio.decocms.com/sandbox-handle",orgId:"studio.decocms.com/org-id",userId:"studio.decocms.com/user-id",env:"studio.decocms.com/env"},TF={orgSlug:"studio.decocms.com/org-slug",orgName:"studio.decocms.com/org-name",userEmail:"studio.decocms.com/user-email",userName:"studio.decocms.com/user-name",gitRepo:"studio.decocms.com/git-repo",gitRepoUrl:"studio.decocms.com/git-repo-url",gitBranch:"studio.decocms.com/git-branch"},Wz6=/^([A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])?)?$/;Hz6=/^[a-z]([a-z0-9-]{0,30}[a-z0-9])?$/});var Na$={};G0(Na$,{tenantPoolSchema:()=>do$,tenantPoolRepoSchema:()=>g60,tenantPoolFieldsSchema:()=>HB1,tenantPoolAllocations:()=>ip,resolveTenantPoolBinding:()=>FB1,renderTenantPoolWarmPools:()=>no$,normalizeRepoUrl:()=>dN,allocationsMatchingPush:()=>NB1,TenantPoolCapacityError:()=>pC0,PREVIEW_NOT_READY_HEADER:()=>np,AgentSandboxProvider:()=>zB1});var u60=L(()=>{Ua$();h60()});import{z as Ag}from"zod";function sC0($){if(!$||$.trim()==="")return[];let Z=Ag.array(Pz6).parse(JSON.parse($)),Q=new Set;for(let X of Z){if(Q.has(X.name))throw Error(`tenant pools: duplicate pool name ${X.name}`);Q.add(X.name)}return Z}function Ba$($){let Z=dN(`https://github.com/${$.repo}`);if(!Z)throw Error(`tenant pools: bad repo ${$.repo}`);return Z}function La$($){return $.map((Z)=>({name:Z.name,tenant:Z.orgId,size:1,image:"default",repos:[{repoUrl:Ba$(Z),branch:Z.branch,workload:Z.workload,replicas:1,warmPoolName:Z.name}]}))}function PB1($,Z){let Q=dN(Z.repoUrl)?.toLowerCase(),X=$.find((J)=>J.orgId===Z.tenant&&J.branch===Z.branch&&Ba$(J).toLowerCase()===Q);if(!X)return null;let Y=`https://github.com/${X.repo}.git`;return X.connectionId?{cloneUrl:Y,connectionId:X.connectionId}:{cloneUrl:Y}}function Da$($,Z){return async(Q)=>{let X=PB1($,Q);if(!X)return null;return X.connectionId?Z(X):X.cloneUrl}}var Pz6;var eC0=L(()=>{u60();Pz6=Ag.object({name:Ag.string().max(63).regex(/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/,"pool name must be a DNS label (lowercase alphanumeric and '-')"),orgId:Ag.string().min(1),repo:Ag.string().regex(/^[^/\s]+\/[^/\s]+$/,"repo must be `owner/name`"),connectionId:Ag.string().min(1).optional(),branch:Ag.string().min(1).default("main"),workload:g60.shape.workload})});function MB1($,Z=Date.now()){if($===void 0)return;return $===null?Z+Tz6:$.getTime()}function qB1($){return JSON.stringify([$.orgId,$.userId])}function Oa$($,Z){let Q=dN(Z);return Q?JSON.stringify([$,Q.toLowerCase()]):null}function Rz6($,Z){return"repositoryId"in Z?$.repositoryOrgs.get(Z.repositoryId):$.connectionOrgs.get(Z.connectionId)}function ja$($){let{records:Z,now:Q}=$,X=new Map,Y=new Map,J=new Map,G=0;for(let W of $.pools)for(let{repoUrl:K,branch:H}of W.repos){let F=Oa$(W.tenant,K),U=PB1($.legacyPools??[],{tenant:W.tenant,repoUrl:K,branch:H});if(F&&U){if(U.connectionId)Y.set(F,{tenant:W.tenant,repoUrl:K,connectionId:U.connectionId,cloneUrl:U.cloneUrl});continue}let N=F?Z.orgRepositories.get(F):void 0;if(!F||!N){G++;continue}Y.set(F,{tenant:W.tenant,repoUrl:K,repositoryId:N})}for(let W of $.sandboxes){let K=W.tenant;if(!K)continue;let H=Z.members.get(qB1(K));if(H===void 0){G++;continue}for(let U of W.repos){if(Rz6(Z,U)!==K.orgId){G++;continue}let N="repositoryId"in U?{repositoryId:U.repositoryId}:{connectionId:U.connectionId,repo:U.repo.toLowerCase()},B={orgId:K.orgId,userId:K.userId};X.set(JSON.stringify([B,N]),{tenant:B,repo:N})}let F=W.orgFsConfigExpiresAt;if(W.orgFs&&(F===null||F-Q<Az6))J.set(qB1(K),{orgId:K.orgId,userId:K.userId,orgSlug:H})}return{clones:[...X.values()],poolClones:[...Y.values()],orgFs:[...J.values()],refused:G}}async function wa$($,Z,Q){let X=new Set,Y=new Set,J=new Set,G=new Set,W=new Set(Q.map((D)=>D.tenant)),K=new Set;for(let D of Q)for(let{repoUrl:O}of D.repos){let j=aX(O);if(j)K.add(j.path.toLowerCase())}for(let D of Z){if(D.tenant)X.add(D.tenant.orgId),Y.add(D.tenant.userId);for(let O of D.repos)if("repositoryId"in O)G.add(O.repositoryId);else J.add(O.connectionId)}let[H,F,U,N]=await Promise.all([X.size===0?[]:$.selectFrom("member").innerJoin("organization","organization.id","member.organizationId").select(["member.organizationId as orgId","member.userId as userId","organization.slug as slug"]).where("member.organizationId","in",[...X]).where("member.userId","in",[...Y]).execute(),J.size===0?[]:$.selectFrom("connections").select(["id","organization_id"]).where("id","in",[...J]).execute(),G.size===0?[]:$.selectFrom("repositories").select(["id","organization_id"]).where("id","in",[...G]).execute(),K.size===0?[]:$.selectFrom("repositories").select(["id","organization_id","provider","host","path"]).where("organization_id","in",[...W]).where((D)=>D(D.fn("lower",["path"]),"in",[...K])).execute()]),B=new Map;for(let D of N){let O=Oa$(D.organization_id,t80({provider:D.provider,host:D.host,path:D.path}));if(O&&!B.has(O))B.set(O,D.id)}return{members:new Map(H.map((D)=>[qB1(D),D.slug])),connectionOrgs:new Map(F.map((D)=>[D.id,D.organization_id])),repositoryOrgs:new Map(U.map((D)=>[D.id,D.organization_id])),orgRepositories:B}}function RB1($){return $ instanceof Error?$.message:String($)}async function Ea$($,Z,Q){let X=0;if($.clones.length>op||$.poolClones.length>op||$.orgFs.length>AB1)console.warn(`[sandbox-credential-push] ${$.clones.length} clone, ${$.poolClones.length} pool clone and ${$.orgFs.length} org-fs mints planned; minting the first ${op}, ${op} and ${AB1}`);let Y=await z9($.clones.slice(0,op),TB1,async(U)=>{let N="repositoryId"in U.repo?{cloneUrl:"",repositoryId:U.repo.repositoryId}:{cloneUrl:`https://github.com/${U.repo.repo}.git`,connectionId:U.repo.connectionId};try{let B=await Z.mintCloneUrl(N,{bufferMs:$S0});return B?{tenant:U.tenant,repo:U.repo,cloneUrl:B,expiresAt:Q.now+$S0}:null}catch(B){return X++,console.warn(`[sandbox-credential-push] clone mint failed: ${RB1(B)}`),null}}),J=await z9($.poolClones.slice(0,op),TB1,async(U)=>{try{let N=await Z.mintCloneUrl("repositoryId"in U?{cloneUrl:"",repositoryId:U.repositoryId}:{cloneUrl:U.cloneUrl,connectionId:U.connectionId},{bufferMs:$S0});return N?{tenant:U.tenant,repoUrl:U.repoUrl,cloneUrl:N,expiresAt:Q.now+$S0}:null}catch(N){return X++,console.warn(`[sandbox-credential-push] pool clone mint failed: ${RB1(N)}`),null}}),G=await z9($.orgFs.slice(0,AB1),TB1,async(U)=>{try{let N=await Z.mintOrgFsConfig(U);return N?{tenant:{orgId:U.orgId,userId:U.userId},orgFsConfigJson:N,expiresAt:Q.now+Q.orgFsLifetimeMs}:null}catch(N){return X++,console.warn(`[sandbox-credential-push] org-fs mint failed: ${RB1(N)}`),null}}),W=Y.filter((U)=>U!==null),K=J.filter((U)=>U!==null),H=G.filter((U)=>U!==null),F=[];for(let U=0;U<Math.max(W.length,K.length,H.length);U+=qz)F.push({cloneUrls:W.slice(U,U+qz),poolCloneUrls:K.slice(U,U+qz),orgFsConfigs:H.slice(U,U+qz)});return{batches:F,failed:X}}var $S0=2700000,ZS0,Tz6=86400000,Az6=86400000,TB1=8,op=2000,AB1=200;var QS0=L(()=>{JU1();u60();a4();$8();yD();eC0();ZS0=Dc$-3600000});var HJ;var l60=L(()=>{HJ=class HJ extends Error{code;status;path;constructor($,Z,Q){super(Z.message||`Freestyle API error: ${Z.code}`);this.name="FreestyleApiError",this.code=Z.code,this.status=$,this.path=Q,Object.setPrototypeOf(this,HJ.prototype)}}});function za$(){return typeof process<"u"&&Boolean(process.versions?.node)}var XS0=($,Z)=>globalThis.fetch($,Z);async function qz6(){if(!za$())return null;try{return await import("undici")}catch{return null}}async function Iz6(){let $=await qz6();if(!$)return null;let Z=new $.Agent({allowH2:!0,connections:Mz6});return(Q,X)=>$.fetch(Q,{...X,dispatcher:Z})}function Vz6($){return(typeof $==="string"?$:$ instanceof URL?$.href:$.url).startsWith("https:")}function Pa$(){let $,Z=()=>{return $??=Iz6().then((Q)=>Q??XS0).catch(()=>XS0),$};return(Q,X)=>Vz6(Q)?Z().then((Y)=>Y(Q,X)):XS0(Q,X)}var Mz6=4;var Ta$=()=>{};function xz6($){return new Promise((Z)=>setTimeout(Z,$))}function fz6($){if(!$)return"";let Z=new URLSearchParams;for(let[X,Y]of Object.entries($)){if(Y===void 0||Y===null)continue;Z.set(X,String(Y))}let Q=Z.toString();return Q?`?${Q}`:""}function n6($){return encodeURIComponent($)}class IB1{baseUrl;authenticationHeaders;fetchImpl;backgroundEligible;constructor($={}){if(this.baseUrl=($.baseUrl??vz6).replace(/\/+$/,""),!$.fetch&&!globalThis.fetch)throw Error("No fetch implementation available. Pass `fetch` in FreestyleOptions when running on a runtime without a global fetch.");if(this.fetchImpl=$.fetch??Pa$(),"identityAccessToken"in $&&$.identityAccessToken){this.authenticationHeaders={[kz6]:$.identityAccessToken},this.backgroundEligible=!1;return}if(this.backgroundEligible=!0,"stackAccessToken"in $&&$.stackAccessToken){this.authenticationHeaders={Authorization:`Bearer ${$.stackAccessToken}`,"X-Freestyle-Team-Id":$.teamId};return}let Z=$.apiKey??globalThis.process?.env?.FREESTYLE_API_KEY;if(!Z)throw Error("No Freestyle API key provided. Pass `apiKey` in FreestyleOptions or set FREESTYLE_API_KEY.");this.authenticationHeaders={Authorization:`Bearer ${Z}`}}authHeaders(){return{...this.authenticationHeaders}}url($,Z){return`${this.baseUrl}${$}${fz6(Z)}`}async fetch($,Z={}){let Q=new Headers(Z.headers);for(let[X,Y]of Object.entries(this.authHeaders()))if(!Q.has(X))Q.set(X,Y);return this.fetchImpl(this.absoluteUrl($),{...Z,headers:Q})}absoluteUrl($){return/^https?:\/\//i.test($)?$:`${this.baseUrl}${$}`}async request($,Z,{query:Q,body:X,rawBody:Y,signal:J}={}){let G={...this.authHeaders()};if(this.backgroundEligible)G[Aa$]=String(Sz6);let W;if(Y!==void 0)G["Content-Type"]="application/octet-stream",W=Y;else if(X!==void 0)G["Content-Type"]="application/json",W=JSON.stringify(X);let K=this.url(Z,Q),H=await this.fetchImpl(K,{method:$,headers:G,body:W,signal:J});if(this.backgroundEligible&&H.status===202)try{return await this.pollBackgroundRequest(H,Z)}catch(F){if($==="GET"&&F instanceof HJ&&F.code==="BACKGROUND_RESULT_UNSTORABLE"){delete G[Aa$];let U=await this.fetchImpl(K,{method:$,headers:G,body:W});return this.finalize(U,Z)}throw F}return this.finalize(H,Z)}async pollBackgroundRequest($,Z){let Q=await $.json().catch(()=>({})),X=$.headers.get(Cz6)??Q.requestId,Y=Q.resultUrl??(X?`/v5/background-requests/${n6(X)}`:void 0);if(!Y)throw new HJ($.status,{code:"BACKGROUND_PROTOCOL_ERROR",message:"202 Accepted carried no background request id"},Z);let J=0;for(;;){await xz6(_z6);let G;try{G=await this.fetch(Y,{method:"GET"}),J=0}catch(W){if(++J>=5)throw W;continue}if(G.status===202)continue;return this.finalize(G,Z)}}async finalize($,Z){if(!$.ok){let X;try{X=await $.json()}catch{X={code:"UNKNOWN_ERROR",message:await $.text().catch(()=>$.statusText)}}throw new HJ($.status,X,Z)}if($.status===204)return;let Q=await $.text();if(!Q)return;return JSON.parse(Q)}get($,Z){return this.request("GET",$,{query:Z})}post($,Z){return this.request("POST",$,{body:Z??{}})}patch($,Z){return this.request("PATCH",$,{body:Z??{}})}put($,Z){return this.request("PUT",$,{body:Z??{}})}putEmpty($){return this.request("PUT",$,{})}putBytes($,Z,Q,X){return this.request("PUT",$,{query:Q,rawBody:Z,signal:X})}async getBytes($,Z,Q={}){let X={...this.authHeaders()};if(Q.range)X.Range=Q.range;let Y=await this.fetchImpl(this.url($,Z),{method:"GET",headers:X,signal:Q.signal});if(!Y.ok){let J;try{J=await Y.json()}catch{J={code:"UNKNOWN_ERROR",message:await Y.text().catch(()=>Y.statusText)}}throw new HJ(Y.status,J,$)}return Y}delete($,Z){return this.request("DELETE",$,{query:Z})}}var kz6="x-freestyle-identity-access-token",Aa$="x-freestyle-background-after-secs",Cz6="x-freestyle-background-request-id",Sz6=5,_z6=2000,vz6="https://api.freestyle.sh";var qK=L(()=>{l60();Ta$()});class VB1{client;verifications;certificates;placeholder;constructor($){this.client=$,this.verifications=new Ra$($),this.certificates=new qa$($),this.placeholder=new Ma$($)}async list(){let{domains:$}=await this.client.get("/v5/domains");return $}}class Ra${client;constructor($){this.client=$}create($){return this.client.post("/v5/verifications",{domain:$})}async list($={}){let{verifications:Z}=await this.client.get("/v5/verifications",$);return Z}get($){return this.client.get(`/v5/verifications/${n6($)}`)}complete($){return this.client.putEmpty(`/v5/verifications/${n6($)}`)}delete($){return this.client.delete(`/v5/verifications/${n6($)}`)}}class qa${client;constructor($){this.client=$}async list(){let{certificates:$}=await this.client.get("/v5/certificates");return $}createWildcard($){return this.client.post("/v5/certificates/wildcard",{domain:$})}}class Ma${client;constructor($){this.client=$}async get(){try{return await this.client.get("/v5/domains/placeholder")}catch($){if($ instanceof HJ&&$.status===404)return null;throw $}}set($){return this.client.put("/v5/domains/placeholder",$)}delete(){return this.client.delete("/v5/domains/placeholder")}}var kB1=L(()=>{qK();l60()});function G5($,Z){throw new SB1($,Z)}function CB1($){return bz6.some((Z)=>$[Z]!==void 0)}function _B1($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function gz6($,Z){let Q=Z.lastIndexOf("/");if(Q<0)G5($,`${$} \`${Z}\` is not a CIDR: expected address/prefix, e.g. 203.0.113.0/24 or 2001:db8::/32`);let X=Z.slice(0,Q),Y=Z.slice(Q+1);if(!/^\d+$/.test(Y))G5($,`${$} \`${Z}\`: prefix length must be a number`);let J=Number(Y),G=X.includes(":"),W=G?128:32;if(J>W)G5($,`${$} \`${Z}\`: prefix length must be 0\u2013${W}`);if(!G&&!/^\d{1,3}(\.\d{1,3}){3}$/.test(X))G5($,`${$} \`${Z}\`: \`${X}\` is not an IP address`)}function Ca$($,Z){if(!_B1($))G5(Z,`${Z} must be an object`);for(let X of Object.keys($))if(!Ia$.includes(X))G5(`${Z}.${X}`,`${Z} has unknown field \`${X}\`. Expected one of: ${Ia$.join(", ")}`);let Q=$;for(let X of["vmId","vpcId","tunnelId","cidr"]){let Y=Q[X];if(Y!==void 0&&(typeof Y!=="string"||Y.length===0))G5(`${Z}.${X}`,`${Z}.${X} must be a non-empty string`)}if(Q.public!==void 0&&Q.public!==!0)G5(`${Z}.public`,`${Z}.public must be true when present: it declares the public Internet. Omit the field to match something else`);if(Q.public===!0){if(Q.vmId!==void 0)G5(`${Z}.public`,`${Z} cannot combine \`public: true\` with \`vmId\`: that would mean the VM only when reached over its public address, a distinction this API does not make yet. Use \`vmId\` alone to match the VM on any path, or \`public: true\` alone to match public addresses`);if(Q.vpcId!==void 0)G5(`${Z}.public`,`${Z} cannot combine \`public: true\` with \`vpcId\`: that would mean the network's members only when reached over their public addresses, a distinction this API does not make yet. Use \`vpcId\` alone or \`public: true\` alone`);if(Q.tunnelId!==void 0)G5(`${Z}.public`,`${Z} cannot combine \`public: true\` with \`tunnelId\`: traffic through a tunnel arrives over the tunnel, not over the public Internet. Use \`tunnelId\` alone`)}if(Q.cidr!==void 0)gz6(`${Z}.cidr`,Q.cidr);if(Q.protocol!==void 0&&!Va$.includes(Q.protocol))G5(`${Z}.protocol`,`${Z}.protocol must be one of: ${Va$.join(", ")} (got \`${String(Q.protocol)}\`)`);if(Q.port!==void 0){if(!Number.isInteger(Q.port)||Q.port<1||Q.port>65535)G5(`${Z}.port`,`${Z}.port must be an integer between 1 and 65535`);if(Q.protocol===void 0)G5(`${Z}.protocol`,`${Z}.port ${Q.port} requires ${Z}.protocol: set it to "tcp" or "udp" so the rule opens one transport rather than both`);if(!yz6.includes(Q.protocol))G5(`${Z}.port`,`${Z}.protocol "${Q.protocol}" has no ports; remove ${Z}.port ${Q.port}`)}}function va$($,Z){if(!_B1($))G5(Z||"rule",`${Z||"rule"} must be an object`);for(let X of Object.keys($))if(!Sa$.includes(X))G5(`${Z}${X}`,`Unknown field \`${X}\`. Expected one of: ${Sa$.join(", ")}`);let Q=$;if(Q.action===void 0)G5(`${Z}action`,`${Z}action is required. Write \`action: "allow"\` \u2014 every rule states what it does rather than defaulting to it`);if(Q.action!=="allow")G5(`${Z}action`,`${Z}action must be "allow" (got \`${String(Q.action)}\`). Only allow rules exist today`);if(Q.description!==void 0){if(typeof Q.description!=="string")G5(`${Z}description`,"description must be a string");if(Q.description.length>ka$)G5(`${Z}description`,`description is too long (${Q.description.length} characters, maximum ${ka$})`)}if(Q.source===void 0)G5(`${Z}source`,`${Z}source is required`);if(Q.destination===void 0)G5(`${Z}destination`,`${Z}destination is required`);return Ca$(Q.source,`${Z}source`),Ca$(Q.destination,`${Z}destination`),Q}function hz6($){let Z=va$($,"");for(let Q of["source","destination"]){let X=Z[Q];if(CB1(X))continue;let Y=[X.port!==void 0?`port ${X.port}`:void 0,X.protocol!==void 0?`protocol ${X.protocol}`:void 0].filter(Boolean).join(", ");G5(Q,Y?`${Q} only narrows traffic (${Y}) without saying what it is. Add \`vmId\`, \`vpcId\`, \`tunnelId\`, \`cidr\`, or \`public: true\`. Leaving it out to mean "this VM" only works inside vms.create`:`${Q} is empty. A matcher must say what the traffic is: \`vmId\`, \`vpcId\`, \`tunnelId\`, \`cidr\`, or \`public: true\` for the public Internet`)}return Z}function YS0($,Z="VM"){if($===void 0||$===null)G5("firewall",`firewall is required on a ${Z} create. A ${Z} gets nothing implicitly, so state what it may reach \u2014 \`{ rules: [] }\` if the answer is nothing`);if(!_B1($))G5("firewall","firewall must be an object with a `rules` array");for(let X of Object.keys($))if(X!=="rules")G5(`firewall.${X}`,`firewall has unknown field \`${X}\`. Expected: rules`);let Q=$.rules;if(!Array.isArray(Q))G5("firewall.rules","firewall.rules must be an array");return Q.forEach((X,Y)=>{let J=`firewall.rules[${Y}].`,G=va$(X,J),W=CB1(G.source),K=CB1(G.destination);if(!W&&!K&&Z!=="network")G5(`firewall.rules[${Y}]`,`firewall.rules[${Y}]: both source and destination refer to the ${Z} being created, which allows nothing. Give one of them a \`vmId\`, \`vpcId\`, \`tunnelId\`, \`cidr\`, or \`public: true\``);if(W&&K)G5(`firewall.rules[${Y}]`,`firewall.rules[${Y}]: neither end refers to the ${Z} being created. Leave one endpoint's identity unset so it means this ${Z}, or create the rule with firewall.rules.create instead`)}),$}function _a$($){return`/v5/firewall/rules/${n6($)}`}class xa${client;constructor($){this.client=$}async create($){let Z=hz6($);return this.client.post("/v5/firewall/rules",Z)}list($={}){return this.client.get("/v5/firewall/rules",$)}get($){return this.client.get(_a$($))}delete($){return this.client.delete(_a$($))}}class vB1{client;rules;constructor($){this.client=$,this.rules=new xa$($)}evaluate($){return this.client.post("/v5/firewall/evaluate",$)}}var SB1,Ia$,bz6,Va$,yz6,ka$=1024,Sa$;var c60=L(()=>{qK();SB1=class SB1 extends Error{path;constructor($,Z){super(Z);this.name="FirewallRuleValidationError",this.path=$,Object.setPrototypeOf(this,SB1.prototype)}};Ia$=["vmId","vpcId","tunnelId","cidr","public","port","protocol"],bz6=["vmId","vpcId","tunnelId","cidr","public"],Va$=["tcp","udp","icmp"],yz6=["tcp","udp"];Sa$=["action","source","destination","description"]});function xB1($){return`/v5/identities/${n6($)}`}class fa${client;basePath;constructor($,Z){this.client=$,this.basePath=Z}create(){return this.client.post(`${this.basePath}/tokens`)}list(){return this.client.get(`${this.basePath}/tokens`)}revoke($){return this.client.delete(`${this.basePath}/tokens/${n6($)}`)}}class ba${client;basePath;constructor($,Z){this.client=$,this.basePath=Z}list(){return this.client.get(`${this.basePath}/permissions/vm`)}grant($){return this.client.post(`${this.basePath}/permissions/vm`,$)}get($){return this.client.get(`${this.basePath}/permissions/vm/${n6($)}`)}update($,Z){return this.client.patch(`${this.basePath}/permissions/vm/${n6($)}`,{allowedLinuxUsers:Z})}revoke($){return this.client.delete(`${this.basePath}/permissions/vm/${n6($)}`)}}class fB1{id;tokens;permissions;client;basePath;constructor($,Z){this.client=$,this.id=Z,this.basePath=xB1(Z),this.tokens=new fa$($,this.basePath),this.permissions={vm:new ba$($,this.basePath)}}data(){return this.client.get(this.basePath)}delete(){return this.client.delete(this.basePath)}}class bB1{client;constructor($){this.client=$}async create($={}){let Z=await this.client.post("/v5/identities",$);return{identity:new fB1(this.client,Z.id),identityId:Z.id,data:Z}}list($={}){return this.client.get("/v5/identities",$)}get($){return this.client.get(xB1($))}ref($){return new fB1(this.client,$)}delete($){return this.client.delete(xB1($))}}var yB1=L(()=>{qK()});function b1($,Z){throw new lB1($,Z)}function j7($,Z){throw new cB1($,Z)}function m60($){return uz6.some((Z)=>$[Z]!==void 0)}function tz6($){return!m60($)&&$.port===void 0}function JY($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function aa$($,Z,Q){if(typeof $!=="string"||!dz6.test($))j7(Z,`${Z} must be a valid HTTP header name`);let X=$.toLowerCase();if(nz6.has(X)||X.startsWith("x-forwarded-")||X.startsWith("x-freestyle-")||Q&&(X==="cookie"||X==="set-cookie"))j7(Z,`${Z} may not use reserved header \`${$}\``)}function oz6($,Z){if(!Array.isArray($))j7(Z,`${Z} must be an array of header names`);if($.length>ma$)j7(Z,`${Z} may contain at most ${ma$} names`);let Q=new Set;$.forEach((X,Y)=>{aa$(X,`${Z}[${Y}]`,!0);let J=X.toLowerCase();if(Q.has(J))j7(`${Z}[${Y}]`,`${Z} contains duplicate header \`${X}\``);Q.add(J)})}function ia$($){if(!JY($))j7("forwardAuth","forwardAuth must be an object");for(let X of Object.keys($))if(!ha$.includes(X))j7(X,`Unknown field \`${X}\`. Expected one of: ${ha$.join(", ")}`);let Z=$;if(typeof Z.url!=="string"||Z.url.length===0||Z.url.length>iz6)j7("url","url is required and must be an absolute HTTPS URL");let Q;try{Q=new URL(Z.url)}catch{j7("url","url must be an absolute HTTPS URL")}if(Q.protocol!=="https:"||Q.hostname.length===0||Q.username.length>0||Q.password.length>0||Q.hash.length>0||Q.port==="0")j7("url","url must be an absolute HTTPS URL");if(Z.headers!==void 0){if(!JY(Z.headers))j7("headers","headers must be an object of header name to value");let X=Object.entries(Z.headers);if(X.length>la$)j7("headers",`headers may contain at most ${la$} entries`);let Y=0,J=new Set;for(let[G,W]of X){aa$(G,`headers.${G}`,!1);let K=G.toLowerCase();if(J.has(K))j7(`headers.${G}`,`headers contains duplicate header \`${G}\``);if(J.add(K),typeof W!=="string"||/[\0\r\n]/.test(W))j7(`headers.${G}`,`headers.${G} must be a string`);Y+=G.length+W.length}if(Y>ca$)j7("headers",`headers may contain at most ${ca$} bytes`)}if(Z.timeoutMs!==void 0&&(!Number.isInteger(Z.timeoutMs)||Z.timeoutMs<100||Z.timeoutMs>5000))j7("timeoutMs","timeoutMs must be an integer between 100 and 5000");if(Z.protectedCookies!==void 0){if(!Array.isArray(Z.protectedCookies))j7("protectedCookies","protectedCookies must be an array of cookie names");if(Z.protectedCookies.length>da$)j7("protectedCookies",`protectedCookies may contain at most ${da$} names`);let X=new Set;Z.protectedCookies.forEach((Y,J)=>{if(typeof Y!=="string"||Y.length>pz6||!mz6.test(Y))j7(`protectedCookies[${J}]`,`protectedCookies[${J}] must be a valid HTTP cookie name`);if(X.has(Y))j7(`protectedCookies[${J}]`,`protectedCookies contains duplicate cookie \`${Y}\``);X.add(Y)})}if(Z.authResponseHeaders!==void 0)oz6(Z.authResponseHeaders,"authResponseHeaders");return Z}function az6($,Z){if(!JY($))b1(Z,`${Z} must be an object with an \`id\``);for(let X of Object.keys($))if(!ua$.includes(X))b1(`${Z}.${X}`,`${Z} has unknown field \`${X}\`. Expected: ${ua$.join(", ")}`);let Q=$.id;if(typeof Q!=="string"||Q.length===0)b1(`${Z}.id`,`${Z}.id is required and must be a non-empty string`)}function uB1($){if(typeof $!=="string")b1("domain","domain is required and must be a string");if($==="*")return;let Z=$.startsWith("*.")?$.slice(2):$;if(Z.length===0||Z.length>lz6)b1("domain",`domain \`${$}\` is not a hostname`);let Q=Z.split(".");if(Q.length<2)b1("domain",`domain \`${$}\` must have at least two labels, e.g. acme.com`);for(let X of Q){if(X.length===0||X.length>cz6)b1("domain",`domain \`${$}\` has an empty or over-long label`);if(!/^[a-z0-9-]+$/.test(X))b1("domain",`domain \`${$}\`: labels are lowercase letters, digits, and hyphens (a \`*.\` prefix is the only wildcard)`);if(X.startsWith("-")||X.endsWith("-"))b1("domain",`domain \`${$}\`: a label cannot start or end with a hyphen`)}}function rz6($){if(typeof $!=="string")b1("domain","domain is required and must be a string");let Z=$.lastIndexOf("@");if(Z===-1){uB1($);return}let Q=$.slice(0,Z),X=$.slice(Z+1);if(Q.length===0||Q.length>64)b1("domain",`mail route \`${$}\`: the part before \`@\` must be 1-64 characters`);if(Q.startsWith(".")||Q.endsWith(".")||Q.includes(".."))b1("domain",`mail route \`${$}\`: the part before \`@\` cannot start or end with a dot, or contain \`..\``);for(let Y of Q)if(!/[a-zA-Z0-9]/.test(Y)&&!pa$.includes(Y))b1("domain",`mail route \`${$}\`: the part before \`@\` may use letters, digits, dots, and \`${pa$.slice(0,-1)}\` (quoted mailboxes are not supported)`);if(X==="*")b1("domain",`mail route \`${$}\`: \`*\` is not a mail domain \u2014 name the domain the mailbox lives at`);uB1(X)}function na$($,Z){if(!JY($))b1(Z,`${Z} must be an object`);for(let X of Object.keys($))if(!ya$.includes(X))b1(`${Z}.${X}`,`${Z} has unknown field \`${X}\`. Expected one of: ${ya$.join(", ")}`);let Q=$;for(let X of["vmId","vpcId","host"]){let Y=Q[X];if(Y!==void 0&&(typeof Y!=="string"||Y.length===0))b1(`${Z}.${X}`,`${Z}.${X} must be a non-empty string`)}if(Q.public!==void 0&&Q.public!==!0)b1(`${Z}.public`,`${Z}.public must be true when present. Omit the field to match something else`);if(Z==="source"){if(Q.host!==void 0)b1("source.host","source.host is not allowed: a source is who opens the session, not where it lands. Put `host` on the destination");if(Q.port!==void 0)b1("source.port","source.port is not allowed: a source is who opens the session, not where it lands. Put `port` on the destination");if(Q.public===!0&&(Q.vmId!==void 0||Q.vpcId!==void 0))b1("source.public","source cannot combine `public: true` with `vmId` or `vpcId`: use one alone. `public` is every client on the Internet; `vmId`/`vpcId` is a specific dialer")}else{if(Q.vpcId!==void 0)b1("destination.vpcId","destination.vpcId is not allowed: a session lands in one place, not on a whole network. Name a `vmId`, a `host`, or `public: true` for the domain's own origin. A whole network may be a source");if([Q.vmId!==void 0,Q.host!==void 0,Q.public===!0].filter(Boolean).length>1)b1("destination","destination names more than one landing: give exactly one of `vmId`, `host`, or `public: true`");if((Q.vmId!==void 0||Q.host!==void 0)&&Q.port===void 0)b1("destination.port",`destination.port is required with ${Q.vmId!==void 0?"`vmId`":"`host`"}: say which port the session lands on`)}if(Q.port!==void 0){if(!Number.isInteger(Q.port)||Q.port<1||Q.port>65535)b1(`${Z}.port`,`${Z}.port must be an integer between 1 and 65535`)}}function sz6($){if("postgres"in $)return"postgres";if("smtp"in $)return"smtp";if("socks5"in $)return"socks5";return"http"}function ez6($,Z){function Q(W,K,H){if(!JY(W)||Object.keys(W).some((F)=>!K.includes(F)))b1(H,`${H} must contain only ${K.join(", ")}`)}if(Q($,["region","credentials","scope"],Z),typeof $.region!=="string"||!/^[a-z0-9-]{1,63}$/.test($.region))b1(`${Z}.region`,"invalid s3.region");Q($.credentials,["accessKeyId","secretAccessKey","sessionToken"],`${Z}.credentials`);for(let W of["accessKeyId","secretAccessKey","sessionToken"]){let K=$.credentials[W];if(W==="sessionToken"&&K===void 0)continue;if(typeof K!=="string"||!/^[\x21-\x7e]{1,16384}$/.test(K))b1(`${Z}.credentials.${W}`,"invalid s3 credentials")}if(!/^[a-zA-Z0-9]+$/.test($.credentials.accessKeyId))b1(`${Z}.credentials.accessKeyId`,"invalid s3 access key id");Q($.scope,["bucket","prefix","operations"],`${Z}.scope`);let{bucket:X,prefix:Y,operations:J}=$.scope;if(typeof X!=="string"||!/^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/.test(X)||X.includes(".."))b1(`${Z}.scope.bucket`,"invalid s3.scope.bucket");if(typeof Y!=="string"||Buffer.byteLength(Y,"utf8")>1024||/[\x00-\x1f\x7f-\x9f]/u.test(Y))b1(`${Z}.scope.prefix`,"invalid s3.scope.prefix");let G=["GetObject","HeadObject","PutObject","DeleteObject","ListObjectsV2","CreateMultipartUpload","UploadPart","ListParts","CompleteMultipartUpload","AbortMultipartUpload","ListMultipartUploads"];if(!Array.isArray(J)||J.length===0||J.length>G.length||J.some((W)=>!G.includes(W))||new Set(J).size!==J.length)b1(`${Z}.scope.operations`,"s3.scope.operations must be a nonempty list of distinct supported operations")}function $P6($,Z){if(!JY($))b1(Z,`${Z} must be an object: \`{ headers: { \u2026 } }\`, \`{ postgres: { \u2026 } }\`, \`{ smtp: { \u2026 } }\` or \`{ socks5: { \u2026 } }\``);let Q=Object.keys($);if(Q.length!==1||!["headers","jsonPatch","postgres","smtp","socks5","s3"].includes(Q[0]??""))b1(Z,`${Z} must have exactly one of \`headers\`, \`jsonPatch\`, \`postgres\`, \`smtp\`, \`socks5\` or \`s3\` (got: ${Q.length===0?"nothing":Q.join(", ")})`);if(Q[0]==="s3"){ez6($.s3,`${Z}.s3`);return}if(Q[0]==="jsonPatch"){let X=$.jsonPatch;if(!Array.isArray(X)||X.length>128)b1(Z,`${Z}.jsonPatch must be an array of at most 128 operations`);let Y=(W)=>typeof W==="string"&&(W===""||W.startsWith("/"))&&!/~(?:[^01]|$)/u.test(W),J=(W,K=new Set,H=0)=>{if(H>64)return!1;if(W===null||typeof W==="string"||typeof W==="boolean")return!0;if(typeof W==="number")return Number.isFinite(W);if(typeof W!=="object"||K.has(W))return!1;K.add(W);let F=(Array.isArray(W)?Array.from(W):JY(W)?Object.values(W):[void 0]).every((U)=>J(U,K,H+1));return K.delete(W),F};for(let[W,K]of X.entries()){if(!JY(K)||!["add","remove","replace","move","copy","test"].includes(String(K.op))||!Y(K.path))b1(Z,`${Z}.jsonPatch[${W}] requires a standard op and valid JSON Pointer path`);if(["move","copy"].includes(K.op)&&!Y(K.from))b1(Z,`${Z}.jsonPatch[${W}].from must be a JSON Pointer`);if(["add","replace","test"].includes(K.op)&&(!Object.hasOwn(K,"value")||!J(K.value)))b1(Z,`${Z}.jsonPatch[${W}].value must be a JSON value (null is allowed)`)}let G;try{G=JSON.stringify(X)}catch{b1(Z,"jsonPatch must be JSON serializable")}if(Buffer.byteLength(G,"utf8")>65536)b1(Z,"jsonPatch exceeds 64 KiB");return}if(Q[0]==="socks5"){let X=$.socks5;if(!JY(X))b1(`${Z}.socks5`,`${Z}.socks5 must be an object with \`username\` and \`password\``);for(let Y of Object.keys(X))if(!["username","password"].includes(Y))b1(`${Z}.socks5.${Y}`,`${Z}.socks5 has unknown field \`${Y}\`. Expected: username, password`);for(let Y of["username","password"])if(typeof X[Y]!=="string"||X[Y].length===0)b1(`${Z}.socks5.${Y}`,`${Z}.socks5.${Y} is required and must be a non-empty string`);return}if(Q[0]==="smtp"){let X=$.smtp;if(!JY(X))b1(`${Z}.smtp`,`${Z}.smtp must be an object with \`username\` and \`password\``);for(let Y of Object.keys(X))if(!["username","password"].includes(Y))b1(`${Z}.smtp.${Y}`,`${Z}.smtp has unknown field \`${Y}\`. Expected: username, password`);for(let Y of["username","password"])if(typeof X[Y]!=="string"||X[Y].length===0)b1(`${Z}.smtp.${Y}`,`${Z}.smtp.${Y} is required and must be a non-empty string`);return}if(Q[0]==="headers"){let X=$.headers;if(!JY(X))b1(`${Z}.headers`,`${Z}.headers must be an object of header name to value`);for(let[Y,J]of Object.entries(X))if(typeof J!=="string")b1(`${Z}.headers.${Y}`,`${Z}.headers.${Y} must be a string`)}else{let X=$.postgres;if(!JY(X))b1(`${Z}.postgres`,`${Z}.postgres must be an object with \`username\` and \`password\``);for(let J of Object.keys(X))if(!["username","password","database"].includes(J))b1(`${Z}.postgres.${J}`,`${Z}.postgres has unknown field \`${J}\`. Expected: username, password, database`);let Y=X;for(let J of["username","password"])if(typeof Y[J]!=="string"||Y[J].length===0)b1(`${Z}.postgres.${J}`,`${Z}.postgres.${J} is required and must be a non-empty string`);if(Y.database!==void 0&&typeof Y.database!=="string")b1(`${Z}.postgres.database`,`${Z}.postgres.database must be a string`)}}function ZP6($,Z){let Q=$;return Z.forEach((X,Y)=>{let J=sz6(X);if(Q===void 0)Q=J;else if(Q!==J)b1(`transform[${Y}]`,`transform requires protocol \`${J}\` but the rule is \`${Q}\`; a rule terminates one protocol`)}),Q??"http"}function QP6($,Z){if(!JY($)||Object.keys($).some((Q)=>Q!=="method"&&Q!=="path"))b1(Z,`${Z} must be an object containing only method and path`);if($.method!==void 0&&(!Array.isArray($.method)||$.method.some((Q)=>typeof Q!=="string"||Q.length===0||/[^!#$%&'*+.^_`|~0-9A-Za-z-]/.test(Q))))b1(`${Z}.method`,`${Z}.method must be an array of HTTP method tokens`);if($.path!==void 0){let Q=$.path;if(!JY(Q)||Object.keys(Q).length!==1||typeof Q.exact!=="string"||!Q.exact.startsWith("/")||/[\s?#]/.test(Q.exact))b1(`${Z}.path`,`${Z}.path must contain exact: an absolute path without a query or fragment`)}}function ra$($,Z){if(!JY($))b1(Z||"rule",`${Z||"rule"} must be an object`);for(let H of Object.keys($))if(!ta$.includes(H))b1(`${Z}${H}`,`Unknown field \`${H}\`. Expected one of: ${ta$.join(", ")}`);let Q=$;if(Q.action===void 0)b1(`${Z}action`,`${Z}action is required. Write \`action: "allow"\` \u2014 every rule states what it does rather than defaulting to it`);if(Q.action!=="allow")b1(`${Z}action`,`${Z}action must be "allow" (got \`${String(Q.action)}\`). Only allow rules exist today`);if(Q.protocol!==void 0&&!ga$.includes(Q.protocol))b1(`${Z}protocol`,`${Z}protocol must be one of: ${ga$.join(", ")} (got \`${String(Q.protocol)}\`)`);let X=Q.source??{},Y=Q.destination??{};na$(X,"source"),na$(Y,"destination");let J=Q.transform??[];if(!Array.isArray(J))b1(`${Z}transform`,`${Z}transform must be an array`);J.forEach((H,F)=>$P6(H,`${Z}transform[${F}]`));let G=ZP6(Q.protocol,J);if(Q.match!==void 0){if(QP6(Q.match,`${Z}match`),G!=="http"||X.public===!0||!(Y.public===!0||Y.host!==void 0))b1(`${Z}match`,"match requires HTTP egress from a VM or VPC to a public origin or host")}if(J.some((H)=>("s3"in H))){if(J.length!==1||Q.match!==void 0||X.public===!0||!(Y.public===!0||Y.host!==void 0)||Q.domain.includes("*"))b1(`${Z}transform`,"s3 requires a sole transform on HTTP egress to a concrete origin, without match")}let W=J.filter((H)=>("jsonPatch"in H));if(W.length>1)b1(`${Z}transform`,"a rule may carry only one jsonPatch transform");if(W.length&&(X.public===!0||!(Y.public===!0||Y.host!==void 0)))b1(`${Z}transform`,"jsonPatch requires HTTP egress from a VM or VPC to a public origin or host");if(Q.forwardAuth!==void 0){az6(Q.forwardAuth,`${Z}forwardAuth`);let H=Y.vmId!==void 0||!m60(Y)&&Y.port!==void 0;if(G!=="http"||X.public!==!0||!H||Q.domain==="*")b1(`${Z}forwardAuth`,`${Z}forwardAuth is only supported on HTTP public ingress: \`{ public: true } -> { vmId, port }\``)}if(G==="smtp")rz6(Q.domain);else uB1(Q.domain);if((X.vmId!==void 0||X.vpcId!==void 0)&&Y.vmId!==void 0&&J.length>0)b1(`${Z}transform`,"a VM-to-VM rule cannot carry a transform yet \u2014 remove it (only public ingress/egress rules run transforms)");if(G==="tcp"){let H=Y.public===!0||Y.host!==void 0,F=X.vmId!==void 0||X.vpcId!==void 0;if(H||F)b1(`${Z}protocol`,"a `tcp` rule is public ingress only \u2014 `{ public: true } -> { vmId, port }`. The edge splices the session without terminating it, so outbound there is nothing to broker (an outbound allow is a firewall rule, and injecting into one needs `http` or `postgres`) and inward there is no certificate to answer the source with. Give the source `public: true`, or drop `protocol` to be served as HTTPS")}else if(G==="imap"||G==="imaps"){let H=Y.public===!0||Y.host!==void 0,F=X.vmId!==void 0||X.vpcId!==void 0;if(H||F)b1(`${Z}protocol`,`an \`${G}\` rule is public ingress only \u2014 \`{ public: true } -> { vmId, port }\`. The 993 front serves mail clients reaching a VM's IMAP server; outbound there is nothing to broker (an outbound allow is a firewall rule) and inward there is no certificate to answer the source with`)}else if(G==="socks5"){let H=Y.public===!0||Y.host!==void 0;if(X.public===!0||!H)b1(`${Z}protocol`,'a `socks5` rule is egress only \u2014 `{ vmId } -> { host: "gate.provider.com", port: 1080 }`. The front exists so a guest can open sessions through a proxy whose credentials it never holds; inbound there is nothing to serve, and publishing one would be an open proxy on a platform address');if(Y.host===void 0)b1(`${Z}destination`,"a `socks5` rule has to name the proxy it goes through: give the destination a `host` and the `port` the provider listens on. `{ public: true }` on its own asks the edge to be the proxy, which would let the guest out on our address rather than through yours")}else if(G==="postgres"){let H=J.some((U)=>U!==null&&typeof U==="object"&&("postgres"in U)),F=Y.public===!0||Y.host!==void 0;if(H&&!F)b1(`${Z}transform`,"a `postgres` transform belongs on an egress rule: the edge spends a credential the guest never holds, so pointing it at your own VM would hand every client a logged-in session. Give the destination `public: true` or a `host`, or drop the transform")}else if(G==="smtp"){let H=J.some((U)=>U!==null&&typeof U==="object"&&("smtp"in U)),F=Y.public===!0||Y.host!==void 0;if(H&&!F)b1(`${Z}transform`,"an `smtp` transform belongs on an egress rule: the edge spends a credential the guest never holds, so pointing it at your own VM would turn it into an open relay. Give the destination `public: true` or a `host`, or drop the transform");if(typeof Q.domain==="string"&&Q.domain.includes("@")&&X.public!==!0)b1(`${Z}domain`,`\`${Q.domain}\` names a mailbox, which only makes sense on a rule that receives mail. An egress or VM-to-VM rule names the host the guest submits through \u2014 drop the part before \`@\``)}return{...Q,source:X,destination:Y}}function XP6($,Z){if($==="source")return tz6(Z)?"source is empty. Say who opens the session: `vmId`, `vpcId`, or `public: true`":"source only narrows the session without saying who opens it. Add `vmId`, `vpcId`, or `public: true`";return"destination is empty. Say where the session lands: `vmId` + `port`, `host` + `port`, or `public: true` for the domain's own origin"}function oa$($){let Z=ra$($,"");for(let Q of["source","destination"]){let X=Z[Q];if(!m60(X))b1(Q,XP6(Q,X))}if(Z.source.public===!0&&Z.destination.public===!0)b1("destination","a rule from the public Internet to the domain's own origin allows nothing the world cannot already do. Did you mean a `vmId` destination (ingress) or a `vmId` source (egress)?");return Z}function sa$($){if(!JY($))b1("tls","tls must be an object with a `rules` array");for(let Q of Object.keys($))if(Q!=="rules")b1(`tls.${Q}`,`tls has unknown field \`${Q}\`. Expected: rules`);let Z=$.rules;if(!Array.isArray(Z))b1("tls.rules","tls.rules must be an array");return Z.forEach((Q,X)=>{let Y=`tls.rules[${X}].`,J=ra$(Q,Y),G=m60(J.source),W=m60(J.destination);if(!G&&!W)b1(`tls.rules[${X}]`,`tls.rules[${X}]: both source and destination refer to the VM being created, which allows nothing. Give one of them a \`vmId\`, \`vpcId\`, or \`public: true\``);if(G&&W)b1(`tls.rules[${X}]`,`tls.rules[${X}]: neither end refers to the VM being created. Leave one endpoint's identity unset so it means this VM, or create the rule with tls.rules.create instead`);if(!W&&J.destination.port===void 0)b1(`tls.rules[${X}].destination.port`,`tls.rules[${X}]: destination.port is required: say which port on this VM the session lands on`)}),$}function gB1($){return`/v5/tls/${n6($)}`}function hB1($){return`/v5/tls/forward-auth/${n6($)}`}class ea${client;constructor($){this.client=$}list(){return this.client.get("/v5/tls/forward-auth")}async create($){let Z=ia$($);return this.client.post("/v5/tls/forward-auth",Z)}get($){return this.client.get(hB1($))}async update($,Z){let Q=ia$(Z);return this.client.put(hB1($),Q)}delete($){return this.client.delete(hB1($))}}class $r${client;constructor($){this.client=$}async create($){let Z=oa$($);return this.client.post("/v5/tls",Z)}list($={}){return this.client.get("/v5/tls",$)}get($){return this.client.get(gB1($))}async update($,Z){let Q=oa$(Z);return this.client.put(gB1($),Q)}delete($){return this.client.delete(gB1($))}}class mB1{client;rules;forwardAuth;constructor($){this.client=$,this.rules=new $r$($),this.forwardAuth=new ea$($)}}var lB1,cB1,ya$,uz6,ga$,lz6=253,cz6=63,ha$,ua$,mz6,dz6,iz6=2048,la$=32,ca$=16384,ma$=32,da$=32,pz6=128,nz6,pa$="!#$%&'*+-/=?^_`{|}~.",ta$;var JS0=L(()=>{qK();lB1=class lB1 extends Error{path;constructor($,Z){super(Z);this.name="TlsRuleValidationError",this.path=$,Object.setPrototypeOf(this,lB1.prototype)}};cB1=class cB1 extends Error{path;constructor($,Z){super(Z);this.name="TlsForwardAuthValidationError",this.path=$,Object.setPrototypeOf(this,cB1.prototype)}};ya$=["vmId","vpcId","public","host","port"],uz6=["vmId","vpcId","public","host"],ga$=["tcp","http","postgres","minecraft","smtp","imap","imaps","socks5"],ha$=["url","headers","timeoutMs","protectedCookies","authResponseHeaders"],ua$=["id"],mz6=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,dz6=/^[0-9A-Za-z-]+$/,nz6=new Set(["host","content-length","connection","keep-alive","proxy-authenticate","proxy-authorization","proxy-connection","te","trailer","transfer-encoding","upgrade"]);ta$=["action","domain","protocol","source","destination","transform","match","forwardAuth"]});function ap($){return`/v5/tunnels/${n6($)}`}function Rg($){return $.tunnelId??=$.id,$}class dB1{client;constructor($){this.client=$}list(){return this.client.get("/v5/tunnels").then(($)=>{return $.tunnels.forEach(Rg),$})}create($={}){return this.client.post("/v5/tunnels",$).then(Rg)}get($){return this.client.get(ap($)).then(Rg)}update($,Z){return this.client.patch(ap($),Z).then(Rg)}rotateKey($,Z={}){return this.client.post(`${ap($)}/rotate-key`,Z).then(Rg)}delete($){return this.client.delete(ap($))}attachVpc($,Z,Q={}){return this.client.post(`${ap($)}/vpcs/${n6(Z)}`,Q).then(Rg)}detachVpc($,Z){return this.client.delete(`${ap($)}/vpcs/${n6(Z)}`).then(Rg)}}var iB1=L(()=>{qK()});class pB1{client;basePath;constructor($,Z){this.client=$,this.basePath=Z}async readFile($,Z={}){let Q=await this.openRead($,Z);return new Uint8Array(await Q.arrayBuffer())}async readTextFile($,Z={}){return await(await this.openRead($,Z)).text()}async readFileStream($,Z={}){let Q=await this.openRead($,Z);if(!Q.body)throw Error(`no response body reading ${$}`);return Q.body}async writeFile($,Z,Q={}){let X=typeof Z==="string"?new TextEncoder().encode(Z):Z,Y=X instanceof Uint8Array?X.byteLength:X.size;if(Y>YP6)return this.uploadInChunks($,X,Y,Q);let J=X instanceof Uint8Array?X:new Uint8Array(await X.arrayBuffer());await this.client.putBytes(`${this.basePath}/fs/write`,J,{path:$,mode:Q.mode,sha256:await Zr$(J)},Q.signal),Q.onProgress?.({completedBytes:Y,totalBytes:Y})}writeTextFile($,Z,Q={}){return this.writeFile($,Z,Q)}async readDir($){let{entries:Z}=await this.client.get(`${this.basePath}/fs/dir`,{path:$});return Z}async mkdir($){await this.client.post(`${this.basePath}/fs/mkdir`,{path:$})}async remove($){await this.client.delete(`${this.basePath}/fs/remove`,{path:$})}async exists($){let{exists:Z}=await this.client.get(`${this.basePath}/fs/exists`,{path:$});return Z}stat($){return this.client.get(`${this.basePath}/fs/stat`,{path:$})}openRead($,Z){let{offset:Q,length:X}=Z,Y;if(Q!==void 0||X!==void 0){let J=Q??0;Y=X===void 0?`bytes=${J}-`:`bytes=${J}-${J+X-1}`}return this.client.getBytes(`${this.basePath}/fs/read`,{path:$},{range:Y,signal:Z.signal})}async uploadInChunks($,Z,Q,X){let Y=X.chunkSize??JP6,J=X.maxAttempts??GP6,G=Z instanceof Uint8Array?await Zr$(Z):void 0,W=await this.client.post(`${this.basePath}/fs/uploads`,{path:$,size:Q,sha256:G,mode:X.mode}),K=`${this.basePath}/fs/uploads/${W.uploadId}`;try{let H=W.receivedBytes;while(H<Q){let F=Math.min(H+Y,Q),U=Z instanceof Uint8Array?Z.subarray(H,F):Z.slice(H,F);H=(await this.putChunkWithRetry(K,U,H,J,X.signal)).receivedBytes,X.onProgress?.({completedBytes:Math.min(H,Q),totalBytes:Q})}await this.client.post(`${K}/commit`)}catch(H){throw await this.client.delete(K).catch(()=>{}),H}}async putChunkWithRetry($,Z,Q,X,Y){let J;for(let G=1;G<=X;G++){Y?.throwIfAborted?.();try{return await this.client.putBytes($,Z,{offset:Q},Y)}catch(W){if(J=W,!(!(W instanceof HJ)||W.status>=500||W.status===408||W.status===409||W.status===429)||Y?.aborted||G===X)throw W;await WP6(Math.min(500*2**(G-1),8000));let H=await this.client.get($).catch(()=>{return});if(H&&H.receivedBytes>Q)return H}}throw J}}async function Zr$($){let Z=globalThis.crypto?.subtle;if(!Z)return;let Q=await Z.digest("SHA-256",$);return Array.from(new Uint8Array(Q),(X)=>X.toString(16).padStart(2,"0")).join("")}function WP6($){return new Promise((Z)=>setTimeout(Z,$))}var YP6=8388608,JP6=16777216,GP6=5;var nB1=L(()=>{l60()});function KP6(){return typeof process<"u"&&Boolean(process.versions?.node)}async function Qr$($,Z){if(KP6()){let X;try{X=await import("ws")}catch{throw Error("PTY sessions need the `ws` package in Node. Install it with `npm install ws`.")}return new X.default($,{headers:Z})}let Q=globalThis.WebSocket;if(!Q)throw Error("PTY sessions need a WebSocket client; no global WebSocket is available in this environment.");return new Q($)}function d60($,Z,Q){if($.on){$.on(Z,Q);return}$.addEventListener?.(Z,Q)}function FP6($,Z){if($&&typeof $==="object"&&"data"in $){let Q=$.data;if(typeof Q==="string")return{text:Q};if(Q instanceof ArrayBuffer)return{binary:new Uint8Array(Q)};return{}}if($ instanceof Uint8Array)return Z?{binary:$}:{text:HP6.decode($)};if(typeof $==="string")return{text:$};return{}}class tB1{_sessionId;_slug;_created=!1;socket;constructor($,Z,Q={}){this.socket=$,this._sessionId=Z,d60($,"message",(X,Y)=>{let{text:J,binary:G}=FP6(X,Y);if(G){Q.onData?.(G);return}if(!J)return;let W;try{W=JSON.parse(J)}catch{return}if(W.type==="exited")Q.onExit?.(W.exitCode);else if(W.type==="error")Q.onError?.(Error(W.message));else if(W.type==="sessionInfo")this._sessionId=W.sessionId,this._slug=W.slug,this._created=W.created??!0,Q.onSessionInfo?.(W.sessionId)}),d60($,"close",(X)=>{let Y=X;Q.onClose?.({wasClean:Y?.wasClean??!0,code:Y?.code??1000,reason:Y?.reason??""})}),d60($,"error",(X)=>Q.onError?.(X))}write($){this.socket.send(typeof $==="string"?new TextEncoder().encode($):$)}resize($){this.sendControl({type:"resize",cols:$.cols,rows:$.rows})}signal($){this.sendControl({type:"signal",signal:$})}sendControl($){this.socket.send(JSON.stringify($))}detach(){this.socket.close()}get sessionId(){return this._sessionId}get slug(){return this._slug}get created(){return this._created}get readyState(){return this.socket.readyState}}function UP6($){return new Promise((Z,Q)=>{if($.readyState===1){Z();return}d60($,"open",()=>Z()),d60($,"error",(X)=>Q(X))})}class oB1{client;basePath;constructor($,Z){this.client=$,this.basePath=Z}async open($={}){let{exec:Z,cols:Q,rows:X,linuxUser:Y,slug:J,replaceOnExit:G,onData:W,onExit:K,onClose:H,onError:F}=$,U={};if(Z!==void 0)U.exec=Z;if(Q!==void 0)U.cols=Q;if(X!==void 0)U.rows=X;if(Y!==void 0)U.linuxUser=Y;if(J!==void 0)U.slug=J;if(G!==void 0)U.replaceOnExit=String(G);let N=Xr$(this.client,`${this.basePath}/pty`,U),B=this.client.authHeaders(),D=await Qr$(N,B);return new Promise((O,j)=>{let w=!1,E=new tB1(D,-1,{onData:W,onExit:K,onClose:(z)=>{if(!w)w=!0,j(Error("connection closed before sessionInfo"));H?.(z)},onError:(z)=>{if(!w)w=!0,j(z);F?.(z)},onSessionInfo:()=>{w=!0,O(E)}})})}async attach($){let{session:Z,linuxUser:Q,onData:X,onExit:Y,onClose:J,onError:G}=$,W=Xr$(this.client,`${this.basePath}/pty/sessions/${n6(String(Z))}`,{...Q!==void 0?{linuxUser:Q}:{}}),K=this.client.authHeaders(),H=await Qr$(W,K),F=new tB1(H,typeof Z==="number"?Z:-1,{onData:X,onExit:Y,onClose:J,onError:G});return await UP6(H),F}list($={}){return this.client.get(`${this.basePath}/pty/sessions`,$)}close($,Z={}){return this.client.delete(`${this.basePath}/pty/sessions/${n6(String($))}`,Z)}}class aB1{pty;linuxUser;constructor($,Z){this.pty=$,this.linuxUser=Z}open($={}){return this.pty.open({...$,linuxUser:this.linuxUser})}attach($){return this.pty.attach({...$,linuxUser:this.linuxUser})}list(){return this.pty.list({linuxUser:this.linuxUser})}close($){return this.pty.close($,{linuxUser:this.linuxUser})}}function Xr$($,Z,Q){return $.url(Z,Q).replace(/^http/,"ws")}var HP6;var rB1=L(()=>{qK();HP6=new TextDecoder});class sB1{client;constructor($){this.client=$}list($={}){return this.client.get("/v5/snapshots",$)}get($){return this.client.get(`/v5/snapshots/${n6($)}`)}update($,Z){return this.client.patch(`/v5/snapshots/${n6($)}`,Z)}delete($){return this.client.delete(`/v5/snapshots/${n6($)}`)}}var eB1=L(()=>{qK()});var Yr$=()=>{};function $L1($){return`/v5/vms/${n6($)}`}class ZL1{id;fs;pty;client;basePath;constructor($,Z){this.client=$,this.id=Z,this.basePath=$L1(Z),this.fs=new pB1($,this.basePath),this.pty=new oB1($,this.basePath)}data(){return this.client.get(this.basePath)}firewallRules(){return this.client.get("/v5/firewall/rules",{vmId:this.id})}update($){return this.client.patch(this.basePath,$)}start(){return this.client.post(`${this.basePath}/start`)}pause(){return this.client.post(`${this.basePath}/pause`)}resize($){return this.client.post(`${this.basePath}/resize`,$)}delete(){return this.client.delete(this.basePath)}exec($){let Z=typeof $==="string"?{command:$}:$;return this.client.post(`${this.basePath}/exec-await`,Z)}linuxUser($){return new Jr$(this,$)}snapshot($={}){return this.client.post(`${this.basePath}/snapshot`,$)}}class Jr${vm;linuxUser;pty;constructor($,Z){this.vm=$,this.linuxUser=Z,this.pty=new aB1($.pty,Z)}exec($){let Z=typeof $==="string"?{command:$}:$;return this.vm.exec({...Z,linuxUser:this.linuxUser})}}class QL1{client;snapshots;constructor($){this.client=$,this.snapshots=new sB1($)}async create($){if(YS0($.firewall,"VM"),$.tls!==void 0)sa$($.tls);let Z=await this.client.post("/v5/vms",$);return{vm:new ZL1(this.client,Z.id),vmId:Z.id,data:Z,firewallRules:Z.firewallRules??[],tlsRules:Z.tlsRules??[]}}list($={}){return this.client.get("/v5/vms",$)}get($){return this.client.get($L1($))}ref($){return new ZL1(this.client,$)}delete($){return this.client.delete($L1($))}}var XL1=L(()=>{c60();JS0();qK();nB1();rB1();eB1();Yr$();nB1();rB1();eB1()});function YL1($){return`/v5/vpcs/${n6($)}`}class Gr${client;basePath;constructor($,Z){this.client=$,this.basePath=Z}list(){return this.client.get(`${this.basePath}/tunnels`)}}class JL1{id;tunnels;client;basePath;constructor($,Z){this.client=$,this.id=Z,this.basePath=YL1(Z),this.tunnels=new Gr$($,this.basePath)}data(){return this.client.get(this.basePath)}update($){return this.client.patch(this.basePath,$)}delete(){return this.client.delete(this.basePath)}}class GL1{client;constructor($){this.client=$}list(){return this.client.get("/v5/vpcs")}async create($={}){if($.firewall!==void 0)YS0($.firewall,"network");let Z=await this.client.post("/v5/vpcs",$);return{vpc:new JL1(this.client,Z.id),vpcId:Z.id,data:Z,firewallRules:Z.firewallRules??[]}}get($){return this.client.get(YL1($))}ref($){return new JL1(this.client,$)}delete($){return this.client.delete(YL1($))}}var WL1=L(()=>{c60();qK()});class GS0{client;vms;vpc;tunnels;firewall;tls;domains;identities;constructor($={}){this.client=new IB1($),this.vms=new QL1(this.client),this.vpc=new GL1(this.client),this.tunnels=new dB1(this.client),this.firewall=new vB1(this.client),this.tls=new mB1(this.client),this.domains=new VB1(this.client),this.identities=new bB1(this.client)}fetch($,Z){return this.client.fetch($,Z)}}var Wr$=L(()=>{qK();kB1();c60();yB1();JS0();iB1();XL1();WL1();qK();l60();XL1();WL1();iB1();kB1();c60();JS0();yB1()});var Hr$;var Kr$=L(()=>{Hr$={name:"@decocms/sandbox",version:"1.82.1",private:!0,type:"module",description:"Sandbox runtime for isolated Studio tool execution",scripts:{check:"tsc --noEmit",test:"bun test",build:"bun run build:typegen && bun run build:harness-runner","build:typegen":"mkdir -p dist && bun run --cwd=../typegen build && bun --cwd=../typegen pm pack --filename $PWD/dist/typegen.tgz --quiet","build:harness-runner":"mkdir -p dist && bun --cwd=../harness-runner pm pack --filename $PWD/dist/harness-runner.tgz --quiet"},exports:{"./shared":"./shared.ts","./provider":"./server/provider/index.ts","./provider/agent-sandbox":"./server/provider/agent-sandbox/index.ts","./provider/postgres-state-store":"./server/provider/postgres-state-store.ts","./provider/freestyle":"./server/provider/freestyle.ts","./provider/remote":"./server/provider/remote.ts","./provider/router":"./server/provider/router.ts","./provider/sandbox-api":"./server/provider/sandbox-api.ts","./provider/sandbox-server":"./server/provider/sandbox-server.ts","./daemon-client":"./server/daemon-client.ts","./org-fs":"./org-fs.ts","./dispatch":"./dispatch/index.ts","./dispatch/*":"./dispatch/*.ts","./proxy/http":"./proxy/http.ts","./proxy/websocket":"./proxy/websocket.ts"},dependencies:{"@decocms/shared":"workspace:*","@kubernetes/client-node":"^1.4.0","@modelcontextprotocol/sdk":"1.29.0","@opentelemetry/api":"^1.9.0",freestyle:"0.2.16",zod:"4.3.6"},devDependencies:{"@types/bun":"latest",postgres:"^3.4.5",typescript:"^7.0.2"}}});function WS0($){let Z=$?.createHistogram("studio.sandbox.proxy.duration_ms",{description:"Wall-clock latency of studio-mediated requests to the sandbox daemon: tool exec proxies (source=daemon) and preview iframe traffic (source=preview).",unit:"ms"});return async(Q,X)=>{if(!Z)return X();let Y=performance.now(),J=(G)=>Z.record(performance.now()-Y,{runner_kind:Q,source:"daemon",status_code:G});try{let G=await X();return J(G.status),G}catch(G){throw J(0),G}}}var pD;var KS0=L(()=>{pD={kubernetes:"agent-sandbox",freestyle:"freestyle"}});var wr$={};G0(wr$,{FreestyleSandboxProvider:()=>jr$});import{createHash as BP6,randomBytes as LP6}from"crypto";class jr${freestyle;lookupClient;image;sidecarImage;idleTimeoutSeconds;autoDeleteSeconds;domainSuffix;timeDaemonRequest;inflight=new Pg;snapshotInflight=new Pg;lookups=new Map;releaseTimers=new Map;constructor($){this.freestyle=$.client??new GS0({apiKey:$.apiKey}),this.lookupClient=$.client??new GS0({apiKey:$.apiKey,fetch:Object.assign((Z,Q)=>fetch(Z,{...Q,signal:Q?.signal?AbortSignal.any([Q.signal,AbortSignal.timeout(Lr$)]):AbortSignal.timeout(Lr$)}),{preconnect:fetch.preconnect})}),this.image=$.image??`ghcr.io/decocms/studio/studio-sandbox-go:${Hr$.version}`,this.sidecarImage=$.orgFsSidecarImage??OP6,this.idleTimeoutSeconds=$.idleTimeoutSeconds??300,this.autoDeleteSeconds=$.autoDeleteSeconds??86400,this.domainSuffix=$.domainSuffix??"style.dev",this.timeDaemonRequest=WS0($.meter)}async owns($){return await this.find($)!==null}daemonUrl($){return`https://${$}.${this.domainSuffix}`}async find($,Z={}){let Q=this.lookups.get($);if(!Z.refresh&&Q&&Date.now()-Q.at<(Q.found?TP6:AP6))return Q.found;let X=null;try{let Y=await this.lookupClient.vms.get($),J=Y.metadata[Nr$];if(J)X={vm:this.freestyle.vms.ref(Y.id),daemon:{url:this.daemonUrl($),token:J}}}catch(Y){if(!(Y instanceof HJ&&Y.status===404))throw Y}return this.remember($,X),X}remember($,Z){if(this.lookups.delete($),this.lookups.size>=RP6){let Q=this.lookups.keys().next();if(!Q.done)this.lookups.delete(Q.value)}this.lookups.set($,{found:Z,at:Date.now()})}baseSnapshot(){let{image:$,sidecarImage:Z}=this,Q=`studio-sandbox-${BP6("sha256").update(`${$}
3348
3348
  ${Z}`).digest("hex").slice(0,16)}`;return this.snapshotInflight.run(Q,async()=>{if(await this.snapshotExists(Q))return Q;console.log(`[${qg}] building base snapshot ${Q} for ${$}`);let{vm:X}=await this.freestyle.vms.create({ttlSeconds:1800,firewall:{rules:[{action:"allow",source:{},destination:{public:!0}}]}});try{await this.run(X,`docker pull -q ${rp($)} && docker pull -q ${rp(Z)}`,{timeoutMs:KL1}),await X.snapshot({slug:Q})}catch(Y){if(!await this.snapshotExists(Q))throw Y}finally{await X.delete().catch(()=>{})}return Q})}async snapshotExists($){try{return await this.freestyle.vms.snapshots.get($),!0}catch(Z){if(Z instanceof HJ&&Z.status===404)return!1;throw Z}}async run($,Z,Q={}){let X=await $.exec({command:Z,...Q});if(X.statusCode!==0)throw Error(`${Z.split(" ",2).join(" ")} failed (${X.statusCode??"timeout"}): ${(X.stderr||X.stdout||"").slice(-500)}`);return X.stdout??""}async ensure($,Z={}){let Q=d3($);if(Q.startsWith("s-"))throw Error(`ensure: projectRef has no slug source: ${$.projectRef}`);return this.inflight.run(Q,async()=>{this.cancelRelease(Q);let X=await this.find(Q,{refresh:!0});if(X)await this.resume(X,Z);else await this.create(Q,Z);return{handle:Q,workdir:i60,previewUrl:this.daemonUrl(Q),warmPoolAdopted:!1,provider:"freestyle"}})}async resume($,Z){let{state:Q}=await $.vm.data();if(Q!=="running")await $.vm.start();if(await this.waitForDaemon($.daemon.url),Z.orgFsConfigJson)await x60($.daemon.url,$.daemon.token,Z.orgFsConfigJson).catch((Y)=>console.warn(`[${qg}] org-fs relay failed`,Y));let X=b60(Z);if(X)await mN($.daemon.url,$.daemon.token,X).catch((Y)=>console.warn(`[${qg}] git credential refresh failed: ${Or$(Y)}`))}async create($,Z){let Q=await this.baseSnapshot(),X=LP6(24).toString("hex"),{vm:Y}=await this.createVm({snapshotId:Q,slug:$,idleTimeoutSeconds:this.idleTimeoutSeconds,metadata:{[Nr$]:X,...Z.tenant?{[wP6]:Z.tenant.orgId,[EP6]:Z.tenant.userId}:{}},firewall:{rules:[{action:"allow",source:{},destination:{public:!0}}]},tls:{rules:[{action:"allow",domain:`${$}.${this.domainSuffix}`,source:{public:!0},destination:{port:HS0}}]}}),J={url:this.daemonUrl($),token:X};try{let G={...Z.env,DAEMON_TOKEN:X,DAEMON_BOOT_ID:crypto.randomUUID(),APP_ROOT:i60,PROXY_PORT:String(HS0),ORGFS_SIDECAR_CONFIG_PATH:`${FS0}/config.json`,ORGFS_SIDECAR_STATUS_PATH:`${FS0}/status.json`},W=Object.keys(G).map((K)=>`-e ${rp(K)}`).join(" ");if(await this.run(Y,`sudo sh -c ${rp(jP6)} && docker run -d --name ${Ur$} --restart=always --privileged --device /dev/fuse -e APP_ROOT=${i60} -e ORGFS_FEED_IDLE_MS=60000 -v ${bz}:${i60}/org:rshared -v ${sp}:${FS0} ${rp(this.sidecarImage)}`,{timeoutMs:KL1}),await this.run(Y,`docker run -d --name ${Fr$} --restart=always -p ${HS0}:${HS0} -v ${bz}:${i60}/org:rslave -v ${sp}:${FS0} ${W} ${rp(this.image)}`,{env:G,timeoutMs:KL1}),await this.waitForDaemon(J.url),await mN(J.url,X,this.configPayload(Z)??{}),Z.orgFsConfigJson)await x60(J.url,X,Z.orgFsConfigJson).catch((K)=>console.warn(`[${qg}] org-fs relay failed`,K))}catch(G){throw await Y.delete().catch(()=>{}),this.lookups.delete($),G}this.remember($,{vm:Y,daemon:J})}async createVm($){try{return await this.freestyle.vms.create({...$,autoDeleteSeconds:this.autoDeleteSeconds})}catch(Z){if(!(Z instanceof HJ&&Z.status===400))throw Z;return console.warn(`[${qg}] autoDeleteSeconds=${this.autoDeleteSeconds} refused (${Z.message}); creating with the plan's cap`),this.freestyle.vms.create($)}}configPayload($){return mp({runtime:$.workload?.runtime??"node",packageManager:$.workload?.packageManager?{name:$.workload.packageManager,...$.workload.packageManagerPath?{path:$.workload.packageManagerPath}:{}}:null,repo:$.repo??null,extraRepos:$.extraRepos??[],port:$.workload?.devPort??DP6,tenant:$.tenant,cloneOnly:$.cloneOnly===!0})}async waitForDaemon($){let Z=Date.now()+Br$;while(Date.now()<Z){if(await Dr$($))return;await $$(zP6)}throw Error(`sandbox daemon at ${$} did not answer /health within ${Br$/1000}s`)}async delete($){this.cancelRelease($);let Z=await this.find($,{refresh:!0});if(this.lookups.delete($),!Z)return;await Z.vm.exec({command:`docker stop -t 30 ${Fr$}; docker stop -t 10 ${Ur$}`,timeoutMs:60000}).catch(()=>{}),await Z.vm.delete()}async lastTermination($){return null}async alive($){return await this.find($,{refresh:!0})!==null}async*watchClaimLifecycle($,Z){let Q=Date.now();yield{kind:"claiming",since:Q};let X=!1;while(!Z?.aborted){let Y=await this.find($,{refresh:!0}).catch(()=>null);if(Y){if(!X)X=!0,yield{kind:"warming-daemon",since:Date.now()};if(await Dr$(Y.daemon.url)){yield{kind:"ready"};return}}if(Date.now()-Q>qP6){yield{kind:"failed",reason:Y?"crash-loop-backoff":"claim-never-created",message:Y?"the sandbox VM exists but its daemon never answered":"no sandbox VM was created"};return}await $$(1000)}}async hasSchedulableCapacity(){return!0}async getPreviewUrl($){return await this.find($)?this.daemonUrl($):null}async proxyDaemonRequest($,Z,Q){let X=await this.find($);if(!X)return Response.json({error:"sandbox not found"},{status:404});let Y=async()=>(await this.find($,{refresh:!0}))?.daemon??null;return this.timeDaemonRequest(pD.freestyle,()=>pp(X.daemon,Z,Q,{unauthorized:async()=>{let J=await Y();return J&&J.token!==X.daemon.token?J:null},unreachable:Y}))}async daemonEndpoint($){return(await this.find($))?.daemon??null}async adoptLiveClaim($,Z){return await this.find(Z,{refresh:!0})!==null}async resolvePreviewUpstreamUrl($){return(await this.find($))?.daemon.url??null}proxyPreviewRequest($,Z){return tp(Z,{base:()=>this.resolvePreviewUpstreamUrl($).catch(()=>null),invalidate:()=>this.lookups.delete($),retryBase:()=>this.find($,{refresh:!0}).then((Q)=>Q?.daemon.url??null).catch(()=>null)},qg)}async markTenantPoolsDirty($,Z){return[]}async releaseAfter($,Z){this.cancelRelease($);let Q=setTimeout(()=>{this.releaseTimers.delete($),this.find($).then((X)=>X?.vm.pause()).catch((X)=>console.warn(`[${qg}] pause ${$} failed: ${Or$(X)}`))},Z);Q.unref?.(),this.releaseTimers.set($,Q)}async renewTtl($){this.cancelRelease($)}cancelRelease($){let Z=this.releaseTimers.get($);if(Z)clearTimeout(Z);this.releaseTimers.delete($)}close(){for(let $ of this.releaseTimers.values())clearTimeout($);this.releaseTimers.clear(),this.lookups.clear()}}async function Dr$($){try{let Z=await fetch(`${$}/health`,{signal:AbortSignal.timeout(PP6)});return await Z.body?.cancel(),Z.ok}catch{return!1}}function rp($){return`'${$.replaceAll("'","'\\''")}'`}function Or$($){return $ instanceof Error?$.message:String($)}var qg="FreestyleSandboxProvider",HS0=9000,i60="/app",DP6=3000,Fr$="sandbox",Ur$="orgfs",OP6="ghcr.io/decocms/studio/orgfs-sidecar:0.2.0",bz="/srv/sandbox/org",sp="/srv/sandbox/orgfs-ctl",FS0="/run/orgfs",jP6,Nr$="studio-daemon-token",wP6="studio-org-id",EP6="studio-user-id",Br$=120000,zP6=500,PP6=5000,KL1=300000,TP6=300000,AP6=1e4,RP6=5000,qP6=300000,Lr$=3000;var Er$=L(()=>{Wr$();$8();Kr$();zg();dp();tC0();oC0();KS0();jP6=[`mkdir -p ${bz} ${sp}`,`grep -q ' ${bz} ' /etc/fstab || printf '%s\\n' '${bz} ${bz} none bind,rshared 0 0' 'tmpfs ${sp} tmpfs uid=1000,gid=1000,mode=0755,size=1m 0 0' >> /etc/fstab`,`mountpoint -q ${bz} || mount ${bz}`,`mountpoint -q ${sp} || mount ${sp}`].join(" && ")});function p60($,Z){if($ instanceof Error)Object.assign($,{["sandboxProvider"]:Z});return $}function HL1($){for(let Z=$,Q=0;Z instanceof Error&&Q<5;Q++){let X=Z.sandboxProvider;if(X==="kubernetes"||X==="freestyle")return X;Z=Z.cause}return}var FL1={};G0(FL1,{handleShare:()=>zr$,SandboxProviderRouter:()=>Pr$});import{createHash as MP6}from"crypto";function zr$($){let Z=MP6("sha256").update($).digest("hex").slice(0,8);return Number.parseInt(Z,16)/4294967296}function kP6($){return $ instanceof PF}class Pr${providers;picked=new Map;strays=new Map;freestyleShare;constructor($,Z={}){this.providers=$;if(!$.kubernetes&&!$.freestyle)throw Error("SandboxProviderRouter needs at least one provider");this.freestyleShare=Math.min(1,Math.max(0,Z.freestyleShare??0))}get($){let Z=this.providers[$];if(!Z)throw Error(`sandbox provider ${$} is not configured`);return Z}remember($,Z){if(this.picked.delete($),this.picked.size>=IP6){let Q=this.picked.keys().next();if(!Q.done)this.picked.delete(Q.value)}this.picked.set($,Z)}async providerOf($){let{kubernetes:Z,freestyle:Q}=this.providers;if(!Q)return"kubernetes";if(!Z)return"freestyle";let X=this.picked.get($);if(X)return X;return await Q.owns($).catch(()=>!1)?"freestyle":"kubernetes"}async owner($){return this.get(await this.providerOf($))}async place($,Z){let{kubernetes:Q,freestyle:X}=this.providers,Y=Z.sandboxImage??"default";if(Y!=="default"){if(!Q)throw Error(`sandbox image ${Y} needs the kubernetes provider`);return{kind:"kubernetes",reason:X?"image":void 0}}if(!Q)return{kind:"freestyle"};if(!X)return{kind:"kubernetes"};let J=this.strays.get($);if(J)this.retire(J,$);if(J!=="kubernetes"&&await Q.alive($).catch(()=>!1))return{kind:"kubernetes",reason:"existing"};let G=J==="freestyle"?!1:await X.owns($).catch(()=>null);if(G)return{kind:"freestyle",reason:"existing"};if(G===null)return{kind:"kubernetes",reason:"freestyle-unavailable"};if(Z.provider)return{kind:Z.provider,reason:"requested"};if(this.hasWarmPool(Z,Y))return{kind:"kubernetes",reason:"warm-pool"};if(zr$($)<this.freestyleShare)return{kind:"freestyle",reason:"split"};return await Q.hasSchedulableCapacity().catch(()=>!1)?{kind:"kubernetes",reason:"split"}:{kind:"freestyle",reason:"capacity"}}hasWarmPool($,Z){let Q=nC0($);if(!Q)return!1;return(this.providers.kubernetes?.listTenantPools?.()??[]).some((Y)=>Y.tenant===Q&&Y.image===Z)}async ensure($,Z={}){let{provider:Q,...X}=Z,Y=d3($),J=await this.place(Y,Z);if(this.remember(Y,J.kind),this.strays.get(Y)===J.kind)this.strays.delete(Y);let G;try{let H=await this.get(J.kind).ensure($,X);return J.reason?{...H,placement:{reason:J.reason}}:H}catch(H){G=p60(H,J.kind)}let W=VP6(J.kind);if(!J.reason||J.reason==="image"||kP6(G))throw G;console.warn(`[SandboxProviderRouter] ensure ${Y} failed on ${J.kind}, trying ${W}:`,G instanceof Error?G.message:String(G)),this.remember(Y,W);let K;try{K=await this.get(W).ensure($,X)}catch(H){throw this.picked.delete(Y),p60(H,W)}if(J.reason==="existing")this.retire(J.kind,Y);return{...K,placement:{reason:"fallback",fallbackFrom:J.kind}}}retire($,Z){this.strays.set(Z,$),j8(async()=>{if(this.strays.get(Z)===$)await this.get($).delete(Z)},{maxAttempts:3}).then(()=>{if(this.strays.get(Z)===$)this.strays.delete(Z)}).catch((Q)=>console.warn(`[SandboxProviderRouter] delete of ${$} sandbox ${Z} after fallback failed:`,Q instanceof Error?Q.message:String(Q)))}async delete($){let Z=this.strays.get($);this.strays.delete($),await Promise.all([(await this.owner($)).delete($),Z&&this.get(Z).delete($).catch(()=>{})]),this.picked.delete($)}async lastTermination($){return(await this.owner($)).lastTermination($)}async alive($){return(await this.owner($)).alive($)}async*watchClaimLifecycle($,Z){yield*(await this.owner($)).watchClaimLifecycle($,Z)}async hasSchedulableCapacity(){let{kubernetes:$,freestyle:Z}=this.providers;if(!$||Z)return!0;return $.hasSchedulableCapacity()}async getPreviewUrl($){return(await this.owner($)).getPreviewUrl($)}async proxyDaemonRequest($,Z,Q){return(await this.owner($)).proxyDaemonRequest($,Z,Q)}async adoptLiveClaim($,Z){return(await this.owner(Z)).adoptLiveClaim($,Z)}async resolvePreviewUpstreamUrl($){return(await this.owner($)).resolvePreviewUpstreamUrl($)}async proxyPreviewRequest($,Z){return(await this.owner($)).proxyPreviewRequest($,Z)}async markTenantPoolsDirty($,Z){return await this.providers.kubernetes?.markTenantPoolsDirty($,Z)??[]}async releaseAfter($,Z){await(await this.owner($)).releaseAfter($,Z)}async renewTtl($){await(await this.owner($)).renewTtl($)}async daemonEndpoint($){let Z=this.providers[await this.providerOf($)];if(!Z?.daemonEndpoint)throw Error("sandbox provider has no daemon endpoint to serve");return Z.daemonEndpoint($)}listSandboxes(){return this.providers.kubernetes?.listSandboxes?.()??[]}listTenantPools(){return this.providers.kubernetes?.listTenantPools?.()??[]}close(){this.providers.kubernetes?.close(),this.providers.freestyle?.close(),this.picked.clear(),this.strays.clear()}}var IP6=5000,VP6=($)=>$==="kubernetes"?"freestyle":"kubernetes";var UL1=L(()=>{$8();zg();h60();dp()});var NL1={};G0(NL1,{toClaimPhase:()=>Vr$,SandboxHostError:()=>Mg,RemoteSandboxProvider:()=>Ir$});function $n($){return $ instanceof Error?$.message:String($)}function bP6($){if(!Array.isArray($))return"";let Z=$[0];return typeof Z==="object"&&Z!==null&&"text"in Z&&typeof Z.text==="string"?Z.text:""}function yP6($){return $ instanceof tL&&$.code===503}function gP6($,Z){let Q=null;try{Q=JSON.parse(Z)}catch{}let X=Sc$.safeParse(Q);if(!X.success)return new Mg(`${$} failed: ${Z.slice(0,300)}`);let Y=X.data.code==="bootstrap-rejected"?new PF(X.data.status??502,X.data.error):new Mg(`${$}: ${X.data.error}`);return X.data.provider?p60(Y,X.data.provider):Y}function BS0($){return{kind:"failed",reason:"unknown",message:$}}function Ar$($){return $.kind==="ready"||$.kind==="failed"}function Rr$($){return M7(Mr$,qr$,$,2,0.5)}function US0(...$){let Z=$.filter((Q)=>Q!==void 0);return Z.length>1?AbortSignal.any(Z):Z[0]}class Ir${baseUrl;token;credentialLifetimeMs;stallMs;timeDaemonRequest;closed=new AbortController;connecting=null;sandboxes=new Map;capacity=null;capacityInFlight=null;constructor($){this.baseUrl=$.baseUrl.replace(/\/$/,""),this.token=$.token,this.credentialLifetimeMs=$.credentialLifetimeMs,this.stallMs=$.stallMs??4*Rc$,this.timeDaemonRequest=WS0($.meter)}headers(){return{authorization:`Bearer ${this.token}`}}client(){return this.connecting??=(async()=>{let $=new U7({name:"studio",version:"1.0.0"}),Z=new mU(new URL(`${this.baseUrl}/mcp`),{requestInit:{headers:this.headers()},fetch:(Q,X)=>fetch(Q,{...X,timeout:!1})});return await $.connect(Z,{timeout:Tr$}),$})().catch(($)=>{throw this.connecting=null,$}),this.connecting}async call($,Z,Q,X={}){let{timeoutMs:Y=Tr$,signal:J}=X,G;try{G=await j8(async()=>(await this.client()).callTool({name:$,arguments:{...Z}},void 0,{timeout:Y??CP6,signal:J}),{maxAttempts:SP6,minTimeout:qr$,maxTimeout:Mr$,jitter:_P6,isRetriable:yP6,signal:J})}catch(K){if(J?.aborted)throw J.reason;throw K instanceof S5?K.cause:K}if(G.isError)throw gP6($,bP6(G.content));let W=Q.safeParse(G.structuredContent);if(!W.success)throw new Mg(`${$} returned a malformed result: ${W.error.message}`);return W.data}async whileHostAlive($,Z,Q){let X=new AbortController,Y=new AbortController;this.hostStall($,US0(X.signal,Q,this.closed.signal)??X.signal).then((J)=>{if(J)Y.abort(J)});try{return await Z(US0(Y.signal,Q,this.closed.signal)??Y.signal)}finally{X.abort()}}cached($){let Z=this.sandboxes.get($);if(!Z)return null;if(Date.now()-Z.at>xP6)return this.sandboxes.delete($),null;return Z}remember($,Z,Q,X){if(this.sandboxes.delete($),!Z)return;if(this.sandboxes.size>=fP6){let Y=this.sandboxes.keys().next();if(!Y.done)this.sandboxes.delete(Y.value)}this.sandboxes.set($,{daemon:Z,previewUrl:Q,provider:X,at:Date.now()})}async status($,Z={}){let Q=(Y,J)=>this.call(gD.status,{handle:$,resurrect:Z.resurrect??!1},Vc$,{signal:Y,timeoutMs:J}),X=Z.resurrect?await this.whileHostAlive($,(Y)=>Q(Y,null),Z.signal):await Q(Z.signal);return this.remember($,X.daemon,X.previewUrl,X.provider),X}async daemonFor($,Z={}){if(!Z.refresh){let Q=this.cached($);if(Q)return Q.daemon}return(await this.status($,{resurrect:!0,signal:Z.signal})).daemon}async ensure($,Z={}){let{image:Q,...X}=Z,Y=d3($),J=this.credentialLifetimeMs,G=Date.now(),W=await this.whileHostAlive(Y,(K)=>this.call(gD.ensure,{id:$,opts:X,...J&&{credentialsValidUntil:{orgFsConfig:G+J.orgFsConfig}}},Ic$,{timeoutMs:null,signal:K}));if(W.handle!==Y)throw new Mg(`host answered ensure with ${W.handle}, expected ${Y}`);return this.remember(W.handle,W.daemon,W.previewUrl,W.provider),{handle:W.handle,workdir:W.workdir,previewUrl:W.previewUrl,warmPoolAdopted:W.warmPoolAdopted,provider:W.provider,...W.placement&&{placement:W.placement}}}async delete($){this.sandboxes.delete($),await this.call(gD.delete,{handle:$},YU1)}async alive($){return(await this.status($)).alive}async getPreviewUrl($){let Z=this.cached($);if(Z)return Z.previewUrl;return(await this.status($)).previewUrl}async lastTermination($){return(await this.status($)).lastTermination}async lifetime($,Z){try{await this.call(gD.lifetime,$,YU1)}catch(Q){console.warn(`[${ep}] ${Z} failed: ${$n(Q)}`)}}renewTtl($){return this.lifetime({handle:$},`TTL renew for ${$}`)}releaseAfter($,Z){return this.lifetime({handle:$,graceMs:Math.max(0,Math.round(Z))},`release of ${$}`)}hasSchedulableCapacity(){let $=this.capacity;if($&&Date.now()-$.at<vP6)return Promise.resolve($.value);return this.capacityInFlight??=this.readCapacity().finally(()=>{this.capacityInFlight=null}),this.capacityInFlight}async readCapacity(){let $=!0;try{$=(await this.call(gD.capacity,{},kc$)).schedulable}catch(Z){console.warn(`[${ep}] capacity probe failed: ${$n(Z)}`)}return this.capacity={value:$,at:Date.now()},$}async adoptLiveClaim($,Z){let Q=await this.status(Z).catch(()=>null);return Boolean(Q?.daemon)}async markTenantPoolsDirty($,Z){try{return(await this.call(gD.tenantPoolsPush,{repoUrl:$,ref:Z},Cc$)).pools}catch(Q){return console.warn(`[${ep}] tenant pool push for ${$}@${Z} failed: ${$n(Q)}`),[]}}list(){return this.call(gD.list,{},fc$)}pushCredentials($){return this.call(gD.credentialsPush,$,xc$)}close(){this.closed.abort(),this.sandboxes.clear();let $=this.connecting;this.connecting=null,$?.then((Z)=>Z.close()).catch(()=>{})}async proxyDaemonRequest($,Z,Q){let X=Q.signal,Y=await this.daemonFor($,{signal:X});if(!Y)return new Response(JSON.stringify({error:"sandbox not found"}),{status:404,headers:{"content-type":"application/json"}});let J=this.sandboxes.get($)?.provider??"kubernetes";return this.timeDaemonRequest(pD[J],()=>pp(Y,Z,Q,{unauthorized:async()=>{let G=await this.daemonFor($,{refresh:!0,signal:X}).catch(()=>null);return G&&(G.token!==Y.token||G.url!==Y.url)?G:null},unreachable:()=>this.daemonFor($,{refresh:!0,signal:X})}))}async resolvePreviewUpstreamUrl($,Z){return(await this.daemonFor($,{signal:Z}))?.url??null}proxyPreviewRequest($,Z){let Q=Z.signal;return tp(Z,{base:()=>this.resolvePreviewUpstreamUrl($,Q).catch((X)=>{return console.warn(`[${ep}] preview upstream for ${$} failed: ${$n(X)}`),null}),invalidate:()=>this.sandboxes.delete($),retryBase:()=>this.daemonFor($,{refresh:!0,signal:Q}).then((X)=>X?.url??null).catch(()=>null)},ep)}async*watchOnce($,Z){let Q=new URL(`${this.baseUrl}${Ac$}`);Q.searchParams.set("handle",$);let X=new AbortController,Y,J=this.stallMs/2,G=()=>{clearTimeout(Y),Y=setTimeout(()=>X.abort(Error(`host sent nothing for ${J/1000}s`)),J)};G();try{let W=await fetch(Q,{headers:{...this.headers(),accept:"text/event-stream"},signal:US0(X.signal,Z),timeout:!1});if(!W.ok||!W.body){await W.body?.cancel().catch(()=>{});let F=`watch answered ${W.status}`;throw W.status>=400&&W.status<500?new NS0(F):Error(F)}G();let K=new TextDecoder,H="";for await(let F of W.body){G(),H+=K.decode(F,{stream:!0});let U=H.indexOf(`
3349
3349
 
3350
3350
  `);while(U!==-1){let N=H.slice(0,U);H=H.slice(U+2),U=H.indexOf(`