@alchemy.run/modal 0.0.0 → 2.0.0-beta.86

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 (499) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +96 -4
  3. package/lib/App.d.ts +143 -0
  4. package/lib/App.d.ts.map +1 -0
  5. package/lib/App.js +198 -0
  6. package/lib/App.js.map +1 -0
  7. package/lib/AuthProvider.d.ts +53 -0
  8. package/lib/AuthProvider.d.ts.map +1 -0
  9. package/lib/AuthProvider.js +209 -0
  10. package/lib/AuthProvider.js.map +1 -0
  11. package/lib/BindingHttp.d.ts +56 -0
  12. package/lib/BindingHttp.d.ts.map +1 -0
  13. package/lib/BindingHttp.js +50 -0
  14. package/lib/BindingHttp.js.map +1 -0
  15. package/lib/Blob.d.ts +34 -0
  16. package/lib/Blob.d.ts.map +1 -0
  17. package/lib/Blob.js +59 -0
  18. package/lib/Blob.js.map +1 -0
  19. package/lib/Bootstrap.d.ts +8 -0
  20. package/lib/Bootstrap.d.ts.map +1 -0
  21. package/lib/Bootstrap.js +26 -0
  22. package/lib/Bootstrap.js.map +1 -0
  23. package/lib/Cbor.d.ts +10 -0
  24. package/lib/Cbor.d.ts.map +1 -0
  25. package/lib/Cbor.js +177 -0
  26. package/lib/Cbor.js.map +1 -0
  27. package/lib/ConnectSandbox.d.ts +64 -0
  28. package/lib/ConnectSandbox.d.ts.map +1 -0
  29. package/lib/ConnectSandbox.js +33 -0
  30. package/lib/ConnectSandbox.js.map +1 -0
  31. package/lib/Container.d.ts +124 -0
  32. package/lib/Container.d.ts.map +1 -0
  33. package/lib/Container.js +1 -0
  34. package/lib/Container.js.map +1 -0
  35. package/lib/Contributions.d.ts +7 -0
  36. package/lib/Contributions.d.ts.map +1 -0
  37. package/lib/Contributions.js +6 -0
  38. package/lib/Contributions.js.map +1 -0
  39. package/lib/CreateDict.d.ts +83 -0
  40. package/lib/CreateDict.d.ts.map +1 -0
  41. package/lib/CreateDict.js +3 -0
  42. package/lib/CreateDict.js.map +1 -0
  43. package/lib/CreateDictHttp.d.ts +33 -0
  44. package/lib/CreateDictHttp.d.ts.map +1 -0
  45. package/lib/CreateDictHttp.js +67 -0
  46. package/lib/CreateDictHttp.js.map +1 -0
  47. package/lib/CreateImage.d.ts +98 -0
  48. package/lib/CreateImage.d.ts.map +1 -0
  49. package/lib/CreateImage.js +3 -0
  50. package/lib/CreateImage.js.map +1 -0
  51. package/lib/CreateImageHttp.d.ts +51 -0
  52. package/lib/CreateImageHttp.d.ts.map +1 -0
  53. package/lib/CreateImageHttp.js +87 -0
  54. package/lib/CreateImageHttp.js.map +1 -0
  55. package/lib/CreateQueue.d.ts +83 -0
  56. package/lib/CreateQueue.d.ts.map +1 -0
  57. package/lib/CreateQueue.js +3 -0
  58. package/lib/CreateQueue.js.map +1 -0
  59. package/lib/CreateQueueHttp.d.ts +31 -0
  60. package/lib/CreateQueueHttp.d.ts.map +1 -0
  61. package/lib/CreateQueueHttp.js +67 -0
  62. package/lib/CreateQueueHttp.js.map +1 -0
  63. package/lib/CreateSandbox.d.ts +186 -0
  64. package/lib/CreateSandbox.d.ts.map +1 -0
  65. package/lib/CreateSandbox.js +3 -0
  66. package/lib/CreateSandbox.js.map +1 -0
  67. package/lib/CreateSandboxHttp.d.ts +17 -0
  68. package/lib/CreateSandboxHttp.d.ts.map +1 -0
  69. package/lib/CreateSandboxHttp.js +117 -0
  70. package/lib/CreateSandboxHttp.js.map +1 -0
  71. package/lib/CreateSecret.d.ts +95 -0
  72. package/lib/CreateSecret.d.ts.map +1 -0
  73. package/lib/CreateSecret.js +3 -0
  74. package/lib/CreateSecret.js.map +1 -0
  75. package/lib/CreateSecretHttp.d.ts +24 -0
  76. package/lib/CreateSecretHttp.d.ts.map +1 -0
  77. package/lib/CreateSecretHttp.js +60 -0
  78. package/lib/CreateSecretHttp.js.map +1 -0
  79. package/lib/CreateVolume.d.ts +84 -0
  80. package/lib/CreateVolume.d.ts.map +1 -0
  81. package/lib/CreateVolume.js +3 -0
  82. package/lib/CreateVolume.js.map +1 -0
  83. package/lib/CreateVolumeHttp.d.ts +32 -0
  84. package/lib/CreateVolumeHttp.d.ts.map +1 -0
  85. package/lib/CreateVolumeHttp.js +69 -0
  86. package/lib/CreateVolumeHttp.js.map +1 -0
  87. package/lib/Credentials.d.ts +32 -0
  88. package/lib/Credentials.d.ts.map +1 -0
  89. package/lib/Credentials.js +44 -0
  90. package/lib/Credentials.js.map +1 -0
  91. package/lib/Dict.d.ts +147 -0
  92. package/lib/Dict.d.ts.map +1 -0
  93. package/lib/Dict.js +175 -0
  94. package/lib/Dict.js.map +1 -0
  95. package/lib/DictClient.d.ts +55 -0
  96. package/lib/DictClient.d.ts.map +1 -0
  97. package/lib/DictClient.js +89 -0
  98. package/lib/DictClient.js.map +1 -0
  99. package/lib/Domain.d.ts +86 -0
  100. package/lib/Domain.d.ts.map +1 -0
  101. package/lib/Domain.js +113 -0
  102. package/lib/Domain.js.map +1 -0
  103. package/lib/Endpoint.d.ts +181 -0
  104. package/lib/Endpoint.d.ts.map +1 -0
  105. package/lib/Endpoint.js +283 -0
  106. package/lib/Endpoint.js.map +1 -0
  107. package/lib/Environment.d.ts +174 -0
  108. package/lib/Environment.d.ts.map +1 -0
  109. package/lib/Environment.js +244 -0
  110. package/lib/Environment.js.map +1 -0
  111. package/lib/FetchServer.d.ts +105 -0
  112. package/lib/FetchServer.d.ts.map +1 -0
  113. package/lib/FetchServer.js +3 -0
  114. package/lib/FetchServer.js.map +1 -0
  115. package/lib/FetchServerHttp.d.ts +21 -0
  116. package/lib/FetchServerHttp.d.ts.map +1 -0
  117. package/lib/FetchServerHttp.js +84 -0
  118. package/lib/FetchServerHttp.js.map +1 -0
  119. package/lib/Function.d.ts +236 -0
  120. package/lib/Function.d.ts.map +1 -0
  121. package/lib/Function.js +273 -0
  122. package/lib/Function.js.map +1 -0
  123. package/lib/FunctionAutoscaler.d.ts +99 -0
  124. package/lib/FunctionAutoscaler.d.ts.map +1 -0
  125. package/lib/FunctionAutoscaler.js +136 -0
  126. package/lib/FunctionAutoscaler.js.map +1 -0
  127. package/lib/FunctionTarget.d.ts +61 -0
  128. package/lib/FunctionTarget.d.ts.map +1 -0
  129. package/lib/FunctionTarget.js +136 -0
  130. package/lib/FunctionTarget.js.map +1 -0
  131. package/lib/Image.d.ts +159 -0
  132. package/lib/Image.d.ts.map +1 -0
  133. package/lib/Image.js +203 -0
  134. package/lib/Image.js.map +1 -0
  135. package/lib/ImageBuild.d.ts +108 -0
  136. package/lib/ImageBuild.d.ts.map +1 -0
  137. package/lib/ImageBuild.js +157 -0
  138. package/lib/ImageBuild.js.map +1 -0
  139. package/lib/ImagePlan.d.ts +31 -0
  140. package/lib/ImagePlan.d.ts.map +1 -0
  141. package/lib/ImagePlan.js +70 -0
  142. package/lib/ImagePlan.js.map +1 -0
  143. package/lib/InferEnv.d.ts +26 -0
  144. package/lib/InferEnv.d.ts.map +1 -0
  145. package/lib/InferEnv.js +1 -0
  146. package/lib/InferEnv.js.map +1 -0
  147. package/lib/InvokeFunction.d.ts +186 -0
  148. package/lib/InvokeFunction.d.ts.map +1 -0
  149. package/lib/InvokeFunction.js +10 -0
  150. package/lib/InvokeFunction.js.map +1 -0
  151. package/lib/InvokeFunctionHttp.d.ts +39 -0
  152. package/lib/InvokeFunctionHttp.d.ts.map +1 -0
  153. package/lib/InvokeFunctionHttp.js +210 -0
  154. package/lib/InvokeFunctionHttp.js.map +1 -0
  155. package/lib/ModalBindings.d.ts +138 -0
  156. package/lib/ModalBindings.d.ts.map +1 -0
  157. package/lib/ModalBindings.js +223 -0
  158. package/lib/ModalBindings.js.map +1 -0
  159. package/lib/MountBucket.d.ts +80 -0
  160. package/lib/MountBucket.d.ts.map +1 -0
  161. package/lib/MountBucket.js +44 -0
  162. package/lib/MountBucket.js.map +1 -0
  163. package/lib/MountVolume.d.ts +77 -0
  164. package/lib/MountVolume.d.ts.map +1 -0
  165. package/lib/MountVolume.js +41 -0
  166. package/lib/MountVolume.js.map +1 -0
  167. package/lib/Mounts.d.ts +134 -0
  168. package/lib/Mounts.d.ts.map +1 -0
  169. package/lib/Mounts.js +87 -0
  170. package/lib/Mounts.js.map +1 -0
  171. package/lib/PersistentSandbox.d.ts +75 -0
  172. package/lib/PersistentSandbox.d.ts.map +1 -0
  173. package/lib/PersistentSandbox.js +93 -0
  174. package/lib/PersistentSandbox.js.map +1 -0
  175. package/lib/Providers.d.ts +23 -0
  176. package/lib/Providers.d.ts.map +1 -0
  177. package/lib/Providers.js +64 -0
  178. package/lib/Providers.js.map +1 -0
  179. package/lib/Proxy.d.ts +94 -0
  180. package/lib/Proxy.d.ts.map +1 -0
  181. package/lib/Proxy.js +132 -0
  182. package/lib/Proxy.js.map +1 -0
  183. package/lib/Queue.d.ts +147 -0
  184. package/lib/Queue.d.ts.map +1 -0
  185. package/lib/Queue.js +177 -0
  186. package/lib/Queue.js.map +1 -0
  187. package/lib/QueueClient.d.ts +64 -0
  188. package/lib/QueueClient.d.ts.map +1 -0
  189. package/lib/QueueClient.js +73 -0
  190. package/lib/QueueClient.js.map +1 -0
  191. package/lib/ReadApp.d.ts +85 -0
  192. package/lib/ReadApp.d.ts.map +1 -0
  193. package/lib/ReadApp.js +3 -0
  194. package/lib/ReadApp.js.map +1 -0
  195. package/lib/ReadAppHttp.d.ts +26 -0
  196. package/lib/ReadAppHttp.d.ts.map +1 -0
  197. package/lib/ReadAppHttp.js +106 -0
  198. package/lib/ReadAppHttp.js.map +1 -0
  199. package/lib/ReadDict.d.ts +39 -0
  200. package/lib/ReadDict.d.ts.map +1 -0
  201. package/lib/ReadDict.js +3 -0
  202. package/lib/ReadDict.js.map +1 -0
  203. package/lib/ReadDictHttp.d.ts +12 -0
  204. package/lib/ReadDictHttp.d.ts.map +1 -0
  205. package/lib/ReadDictHttp.js +23 -0
  206. package/lib/ReadDictHttp.js.map +1 -0
  207. package/lib/ReadFunction.d.ts +73 -0
  208. package/lib/ReadFunction.d.ts.map +1 -0
  209. package/lib/ReadFunction.js +3 -0
  210. package/lib/ReadFunction.js.map +1 -0
  211. package/lib/ReadFunctionHttp.d.ts +25 -0
  212. package/lib/ReadFunctionHttp.d.ts.map +1 -0
  213. package/lib/ReadFunctionHttp.js +63 -0
  214. package/lib/ReadFunctionHttp.js.map +1 -0
  215. package/lib/ReadQueue.d.ts +39 -0
  216. package/lib/ReadQueue.d.ts.map +1 -0
  217. package/lib/ReadQueue.js +3 -0
  218. package/lib/ReadQueue.js.map +1 -0
  219. package/lib/ReadQueueHttp.d.ts +12 -0
  220. package/lib/ReadQueueHttp.d.ts.map +1 -0
  221. package/lib/ReadQueueHttp.js +23 -0
  222. package/lib/ReadQueueHttp.js.map +1 -0
  223. package/lib/ReadServer.d.ts +72 -0
  224. package/lib/ReadServer.d.ts.map +1 -0
  225. package/lib/ReadServer.js +3 -0
  226. package/lib/ReadServer.js.map +1 -0
  227. package/lib/ReadServerHttp.d.ts +25 -0
  228. package/lib/ReadServerHttp.d.ts.map +1 -0
  229. package/lib/ReadServerHttp.js +70 -0
  230. package/lib/ReadServerHttp.js.map +1 -0
  231. package/lib/ReadVolume.d.ts +40 -0
  232. package/lib/ReadVolume.d.ts.map +1 -0
  233. package/lib/ReadVolume.js +3 -0
  234. package/lib/ReadVolume.js.map +1 -0
  235. package/lib/ReadVolumeHttp.d.ts +12 -0
  236. package/lib/ReadVolumeHttp.d.ts.map +1 -0
  237. package/lib/ReadVolumeHttp.js +24 -0
  238. package/lib/ReadVolumeHttp.js.map +1 -0
  239. package/lib/ReadWriteDict.d.ts +39 -0
  240. package/lib/ReadWriteDict.d.ts.map +1 -0
  241. package/lib/ReadWriteDict.js +3 -0
  242. package/lib/ReadWriteDict.js.map +1 -0
  243. package/lib/ReadWriteDictHttp.d.ts +12 -0
  244. package/lib/ReadWriteDictHttp.d.ts.map +1 -0
  245. package/lib/ReadWriteDictHttp.js +23 -0
  246. package/lib/ReadWriteDictHttp.js.map +1 -0
  247. package/lib/ReadWriteQueue.d.ts +40 -0
  248. package/lib/ReadWriteQueue.d.ts.map +1 -0
  249. package/lib/ReadWriteQueue.js +3 -0
  250. package/lib/ReadWriteQueue.js.map +1 -0
  251. package/lib/ReadWriteQueueHttp.d.ts +12 -0
  252. package/lib/ReadWriteQueueHttp.d.ts.map +1 -0
  253. package/lib/ReadWriteQueueHttp.js +23 -0
  254. package/lib/ReadWriteQueueHttp.js.map +1 -0
  255. package/lib/ReadWriteVolume.d.ts +40 -0
  256. package/lib/ReadWriteVolume.d.ts.map +1 -0
  257. package/lib/ReadWriteVolume.js +3 -0
  258. package/lib/ReadWriteVolume.js.map +1 -0
  259. package/lib/ReadWriteVolumeHttp.d.ts +12 -0
  260. package/lib/ReadWriteVolumeHttp.d.ts.map +1 -0
  261. package/lib/ReadWriteVolumeHttp.js +24 -0
  262. package/lib/ReadWriteVolumeHttp.js.map +1 -0
  263. package/lib/RuntimeOwner.d.ts +39 -0
  264. package/lib/RuntimeOwner.d.ts.map +1 -0
  265. package/lib/RuntimeOwner.js +85 -0
  266. package/lib/RuntimeOwner.js.map +1 -0
  267. package/lib/Sandbox.d.ts +215 -0
  268. package/lib/Sandbox.d.ts.map +1 -0
  269. package/lib/Sandbox.js +278 -0
  270. package/lib/Sandbox.js.map +1 -0
  271. package/lib/SandboxClient.d.ts +748 -0
  272. package/lib/SandboxClient.d.ts.map +1 -0
  273. package/lib/SandboxClient.js +710 -0
  274. package/lib/SandboxClient.js.map +1 -0
  275. package/lib/ScaleFunction.d.ts +54 -0
  276. package/lib/ScaleFunction.d.ts.map +1 -0
  277. package/lib/ScaleFunction.js +3 -0
  278. package/lib/ScaleFunction.js.map +1 -0
  279. package/lib/ScaleFunctionHttp.d.ts +21 -0
  280. package/lib/ScaleFunctionHttp.d.ts.map +1 -0
  281. package/lib/ScaleFunctionHttp.js +39 -0
  282. package/lib/ScaleFunctionHttp.js.map +1 -0
  283. package/lib/Secret.d.ts +170 -0
  284. package/lib/Secret.d.ts.map +1 -0
  285. package/lib/Secret.js +196 -0
  286. package/lib/Secret.js.map +1 -0
  287. package/lib/Server.d.ts +155 -0
  288. package/lib/Server.d.ts.map +1 -0
  289. package/lib/Server.js +184 -0
  290. package/lib/Server.js.map +1 -0
  291. package/lib/ServiceUser.d.ts +139 -0
  292. package/lib/ServiceUser.d.ts.map +1 -0
  293. package/lib/ServiceUser.js +210 -0
  294. package/lib/ServiceUser.js.map +1 -0
  295. package/lib/Volume.d.ts +170 -0
  296. package/lib/Volume.d.ts.map +1 -0
  297. package/lib/Volume.js +220 -0
  298. package/lib/Volume.js.map +1 -0
  299. package/lib/VolumeClient.d.ts +53 -0
  300. package/lib/VolumeClient.d.ts.map +1 -0
  301. package/lib/VolumeClient.js +22 -0
  302. package/lib/VolumeClient.js.map +1 -0
  303. package/lib/VolumeFiles.d.ts +94 -0
  304. package/lib/VolumeFiles.d.ts.map +1 -0
  305. package/lib/VolumeFiles.js +139 -0
  306. package/lib/VolumeFiles.js.map +1 -0
  307. package/lib/WebhookToken.d.ts +102 -0
  308. package/lib/WebhookToken.d.ts.map +1 -0
  309. package/lib/WebhookToken.js +176 -0
  310. package/lib/WebhookToken.js.map +1 -0
  311. package/lib/WorkspaceSettings.d.ts +70 -0
  312. package/lib/WorkspaceSettings.d.ts.map +1 -0
  313. package/lib/WorkspaceSettings.js +105 -0
  314. package/lib/WorkspaceSettings.js.map +1 -0
  315. package/lib/WriteApp.d.ts +38 -0
  316. package/lib/WriteApp.d.ts.map +1 -0
  317. package/lib/WriteApp.js +3 -0
  318. package/lib/WriteApp.js.map +1 -0
  319. package/lib/WriteAppHttp.d.ts +23 -0
  320. package/lib/WriteAppHttp.d.ts.map +1 -0
  321. package/lib/WriteAppHttp.js +36 -0
  322. package/lib/WriteAppHttp.js.map +1 -0
  323. package/lib/WriteDict.d.ts +39 -0
  324. package/lib/WriteDict.d.ts.map +1 -0
  325. package/lib/WriteDict.js +3 -0
  326. package/lib/WriteDict.js.map +1 -0
  327. package/lib/WriteDictHttp.d.ts +12 -0
  328. package/lib/WriteDictHttp.d.ts.map +1 -0
  329. package/lib/WriteDictHttp.js +23 -0
  330. package/lib/WriteDictHttp.js.map +1 -0
  331. package/lib/WriteQueue.d.ts +39 -0
  332. package/lib/WriteQueue.d.ts.map +1 -0
  333. package/lib/WriteQueue.js +3 -0
  334. package/lib/WriteQueue.js.map +1 -0
  335. package/lib/WriteQueueHttp.d.ts +12 -0
  336. package/lib/WriteQueueHttp.d.ts.map +1 -0
  337. package/lib/WriteQueueHttp.js +23 -0
  338. package/lib/WriteQueueHttp.js.map +1 -0
  339. package/lib/WriteSecret.d.ts +53 -0
  340. package/lib/WriteSecret.d.ts.map +1 -0
  341. package/lib/WriteSecret.js +3 -0
  342. package/lib/WriteSecret.js.map +1 -0
  343. package/lib/WriteSecretHttp.d.ts +23 -0
  344. package/lib/WriteSecretHttp.d.ts.map +1 -0
  345. package/lib/WriteSecretHttp.js +44 -0
  346. package/lib/WriteSecretHttp.js.map +1 -0
  347. package/lib/WriteVolume.d.ts +39 -0
  348. package/lib/WriteVolume.d.ts.map +1 -0
  349. package/lib/WriteVolume.js +3 -0
  350. package/lib/WriteVolume.js.map +1 -0
  351. package/lib/WriteVolumeHttp.d.ts +12 -0
  352. package/lib/WriteVolumeHttp.d.ts.map +1 -0
  353. package/lib/WriteVolumeHttp.js +24 -0
  354. package/lib/WriteVolumeHttp.js.map +1 -0
  355. package/lib/index.d.ts +80 -0
  356. package/lib/index.d.ts.map +1 -0
  357. package/lib/index.js +78 -0
  358. package/lib/index.js.map +1 -0
  359. package/lib/internal/Declared.d.ts +29 -0
  360. package/lib/internal/Declared.d.ts.map +1 -0
  361. package/lib/internal/Declared.js +31 -0
  362. package/lib/internal/Declared.js.map +1 -0
  363. package/lib/internal/Deploy.d.ts +110 -0
  364. package/lib/internal/Deploy.d.ts.map +1 -0
  365. package/lib/internal/Deploy.js +230 -0
  366. package/lib/internal/Deploy.js.map +1 -0
  367. package/lib/internal/Entrypoint.d.ts +52 -0
  368. package/lib/internal/Entrypoint.d.ts.map +1 -0
  369. package/lib/internal/Entrypoint.js +193 -0
  370. package/lib/internal/Entrypoint.js.map +1 -0
  371. package/lib/internal/Rpc.d.ts +17 -0
  372. package/lib/internal/Rpc.d.ts.map +1 -0
  373. package/lib/internal/Rpc.js +49 -0
  374. package/lib/internal/Rpc.js.map +1 -0
  375. package/lib/internal/RpcAuth.d.ts +41 -0
  376. package/lib/internal/RpcAuth.d.ts.map +1 -0
  377. package/lib/internal/RpcAuth.js +100 -0
  378. package/lib/internal/RpcAuth.js.map +1 -0
  379. package/lib/internal/Runtime.d.ts +127 -0
  380. package/lib/internal/Runtime.d.ts.map +1 -0
  381. package/lib/internal/Runtime.js +246 -0
  382. package/lib/internal/Runtime.js.map +1 -0
  383. package/lib/internal/Tags.d.ts +19 -0
  384. package/lib/internal/Tags.d.ts.map +1 -0
  385. package/lib/internal/Tags.js +33 -0
  386. package/lib/internal/Tags.js.map +1 -0
  387. package/lib/internal/TcpConnect.d.ts +12 -0
  388. package/lib/internal/TcpConnect.d.ts.map +1 -0
  389. package/lib/internal/TcpConnect.js +46 -0
  390. package/lib/internal/TcpConnect.js.map +1 -0
  391. package/lib/internal/Transport.d.ts +13 -0
  392. package/lib/internal/Transport.d.ts.map +1 -0
  393. package/lib/internal/Transport.js +16 -0
  394. package/lib/internal/Transport.js.map +1 -0
  395. package/lib/internal.d.ts +71 -0
  396. package/lib/internal.d.ts.map +1 -0
  397. package/lib/internal.js +102 -0
  398. package/lib/internal.js.map +1 -0
  399. package/package.json +59 -3
  400. package/src/App.ts +262 -0
  401. package/src/AuthProvider.ts +295 -0
  402. package/src/BindingHttp.ts +112 -0
  403. package/src/Blob.ts +71 -0
  404. package/src/Bootstrap.ts +52 -0
  405. package/src/Cbor.ts +158 -0
  406. package/src/ConnectSandbox.ts +99 -0
  407. package/src/Container.ts +121 -0
  408. package/src/Contributions.ts +9 -0
  409. package/src/CreateDict.ts +95 -0
  410. package/src/CreateDictHttp.ts +91 -0
  411. package/src/CreateImage.ts +105 -0
  412. package/src/CreateImageHttp.ts +117 -0
  413. package/src/CreateQueue.ts +95 -0
  414. package/src/CreateQueueHttp.ts +91 -0
  415. package/src/CreateSandbox.ts +228 -0
  416. package/src/CreateSandboxHttp.ts +160 -0
  417. package/src/CreateSecret.ts +109 -0
  418. package/src/CreateSecretHttp.ts +83 -0
  419. package/src/CreateVolume.ts +96 -0
  420. package/src/CreateVolumeHttp.ts +93 -0
  421. package/src/Credentials.ts +74 -0
  422. package/src/Dict.ts +245 -0
  423. package/src/DictClient.ts +166 -0
  424. package/src/Domain.ts +147 -0
  425. package/src/Endpoint.ts +406 -0
  426. package/src/Environment.ts +373 -0
  427. package/src/FetchServer.ts +126 -0
  428. package/src/FetchServerHttp.ts +110 -0
  429. package/src/Function.ts +397 -0
  430. package/src/FunctionAutoscaler.ts +210 -0
  431. package/src/FunctionTarget.ts +181 -0
  432. package/src/Image.ts +281 -0
  433. package/src/ImageBuild.ts +228 -0
  434. package/src/ImagePlan.ts +78 -0
  435. package/src/InferEnv.ts +27 -0
  436. package/src/InvokeFunction.ts +211 -0
  437. package/src/InvokeFunctionHttp.ts +316 -0
  438. package/src/ModalBindings.ts +310 -0
  439. package/src/MountBucket.ts +137 -0
  440. package/src/MountVolume.ts +113 -0
  441. package/src/Mounts.ts +230 -0
  442. package/src/PersistentSandbox.ts +142 -0
  443. package/src/Providers.ts +100 -0
  444. package/src/Proxy.ts +191 -0
  445. package/src/Queue.ts +258 -0
  446. package/src/QueueClient.ts +149 -0
  447. package/src/ReadApp.ts +101 -0
  448. package/src/ReadAppHttp.ts +142 -0
  449. package/src/ReadDict.ts +44 -0
  450. package/src/ReadDictHttp.ts +27 -0
  451. package/src/ReadFunction.ts +107 -0
  452. package/src/ReadFunctionHttp.ts +91 -0
  453. package/src/ReadQueue.ts +44 -0
  454. package/src/ReadQueueHttp.ts +27 -0
  455. package/src/ReadServer.ts +98 -0
  456. package/src/ReadServerHttp.ts +101 -0
  457. package/src/ReadVolume.ts +45 -0
  458. package/src/ReadVolumeHttp.ts +28 -0
  459. package/src/ReadWriteDict.ts +44 -0
  460. package/src/ReadWriteDictHttp.ts +27 -0
  461. package/src/ReadWriteQueue.ts +45 -0
  462. package/src/ReadWriteQueueHttp.ts +27 -0
  463. package/src/ReadWriteVolume.ts +45 -0
  464. package/src/ReadWriteVolumeHttp.ts +28 -0
  465. package/src/RuntimeOwner.ts +111 -0
  466. package/src/Sandbox.ts +402 -0
  467. package/src/SandboxClient.ts +1404 -0
  468. package/src/ScaleFunction.ts +70 -0
  469. package/src/ScaleFunctionHttp.ts +54 -0
  470. package/src/Secret.ts +296 -0
  471. package/src/Server.ts +285 -0
  472. package/src/ServiceUser.ts +295 -0
  473. package/src/Volume.ts +320 -0
  474. package/src/VolumeClient.ts +108 -0
  475. package/src/VolumeFiles.ts +194 -0
  476. package/src/WebhookToken.ts +230 -0
  477. package/src/WorkspaceSettings.ts +160 -0
  478. package/src/WriteApp.ts +43 -0
  479. package/src/WriteAppHttp.ts +51 -0
  480. package/src/WriteDict.ts +44 -0
  481. package/src/WriteDictHttp.ts +27 -0
  482. package/src/WriteQueue.ts +44 -0
  483. package/src/WriteQueueHttp.ts +27 -0
  484. package/src/WriteSecret.ts +60 -0
  485. package/src/WriteSecretHttp.ts +56 -0
  486. package/src/WriteVolume.ts +44 -0
  487. package/src/WriteVolumeHttp.ts +28 -0
  488. package/src/globals.d.ts +2 -0
  489. package/src/index.ts +85 -0
  490. package/src/internal/Declared.ts +80 -0
  491. package/src/internal/Deploy.ts +309 -0
  492. package/src/internal/Entrypoint.ts +198 -0
  493. package/src/internal/Rpc.ts +59 -0
  494. package/src/internal/RpcAuth.ts +132 -0
  495. package/src/internal/Runtime.ts +386 -0
  496. package/src/internal/Tags.ts +44 -0
  497. package/src/internal/TcpConnect.ts +78 -0
  498. package/src/internal/Transport.ts +25 -0
  499. package/src/internal.ts +147 -0
package/lib/Mounts.js ADDED
@@ -0,0 +1,87 @@
1
+ import { checkMountSupport, collectMountCapabilities } from "alchemy/Mount";
2
+ import * as Output from "alchemy/Output";
3
+ import * as Data from "effect/Data";
4
+ import * as Effect from "effect/Effect";
5
+ /** A mount entry referenced a resource that isn't bound into this runtime. */
6
+ export class MountNotBound extends Data.TaggedError("Modal.MountNotBound") {
7
+ }
8
+ const BUCKET_TYPE = { s3: "S3", r2: "R2", gcp: "GCP" };
9
+ /** Cloudflare R2's S3 endpoint for an account (and jurisdiction). */
10
+ export const r2Endpoint = (accountId, jurisdiction) => `https://${accountId}${jurisdiction && jurisdiction !== "default" ? `.${jurisdiction}` : ""}.r2.cloudflarestorage.com`;
11
+ const value = (input, path) => Output.isOutput(input)
12
+ ? Effect.fail(new MountNotBound({
13
+ path,
14
+ message: `The mount at ${path} references a declared resource; bind it with Modal.MountVolume or Modal.MountBucket`,
15
+ }))
16
+ : Effect.isEffect(input)
17
+ ? input
18
+ : Effect.succeed(input);
19
+ const field = (record, key) => typeof record === "object" && record !== null
20
+ ? record[key]
21
+ : undefined;
22
+ /**
23
+ * Modal's `volumeMounts` and `cloudBucketMounts` for mount entries whose
24
+ * resources are resolved: attributes at reconcile, handles or `Mount<Noun>`
25
+ * references at runtime.
26
+ */
27
+ export const modalMountsOf = (mounts) => Effect.gen(function* () {
28
+ const volumeMounts = [];
29
+ const cloudBucketMounts = [];
30
+ for (const mount of mounts ?? []) {
31
+ if ("volume" in mount) {
32
+ const volumeId = yield* value(field(mount.volume, "volumeId"), mount.path);
33
+ volumeMounts.push({
34
+ mountPath: mount.path,
35
+ volumeId,
36
+ readOnly: mount.readOnly,
37
+ subPath: mount.subPath,
38
+ allowBackgroundCommits: true,
39
+ });
40
+ continue;
41
+ }
42
+ const bucket = mount.bucket;
43
+ const bucketName = typeof bucket === "string"
44
+ ? bucket
45
+ : yield* value(field(bucket, "bucketName"), mount.path);
46
+ const accountId = field(bucket, "accountId");
47
+ const isR2 = typeof accountId === "string";
48
+ const endpointUrl = mount.endpointUrl ??
49
+ (isR2
50
+ ? r2Endpoint(accountId, field(bucket, "jurisdiction"))
51
+ : yield* value(field(bucket, "endpointUrl"), mount.path));
52
+ const type = mount.type ?? field(bucket, "type") ?? (isR2 ? "r2" : undefined);
53
+ const secretId = mount.secret
54
+ ? yield* value(field(mount.secret, "secretId"), mount.path)
55
+ : undefined;
56
+ cloudBucketMounts.push({
57
+ mountPath: mount.path,
58
+ bucketName,
59
+ bucketType: type ? BUCKET_TYPE[type] : undefined,
60
+ bucketEndpointUrl: endpointUrl,
61
+ credentialsSecretId: secretId,
62
+ keyPrefix: mount.keyPrefix,
63
+ readOnly: mount.readOnly,
64
+ oidcAuthRoleArn: mount.oidcAuthRoleArn,
65
+ });
66
+ }
67
+ return { volumeMounts, cloudBucketMounts };
68
+ });
69
+ const isCapability = (entry) => "install" in entry && "id" in entry;
70
+ /** The volume and bucket entries a host's bindings contributed, in binding order. */
71
+ export const boundMounts = (bindings) => bindings.flatMap((binding) => (binding.data.mounts ?? []).filter((entry) => !isCapability(entry)));
72
+ /** The mount clients other providers' bindings asked the host's image to install. */
73
+ export const boundCapabilities = (bindings) => collectMountCapabilities(bindings.map((binding) => ({
74
+ data: { mounts: (binding.data.mounts ?? []).filter(isCapability) },
75
+ })));
76
+ /**
77
+ * What a Modal container provides to mount clients. Modal runs containers
78
+ * under gVisor without `CAP_SYS_ADMIN`: `/dev/fuse` exists, but `mount`
79
+ * fails with permission denied, for FUSE and NFS alike.
80
+ */
81
+ export const MODAL_MOUNT_SUPPORT = { fuse: false, nfs: false };
82
+ /** Fail when a mount client needs what a Modal container can't provide. */
83
+ export const checkModalMounts = (host, capabilities) => {
84
+ const unsupported = checkMountSupport(host, capabilities, MODAL_MOUNT_SUPPORT, "Mount Modal volumes and cloud buckets with Modal.MountVolume and Modal.MountBucket instead.");
85
+ return unsupported === undefined ? Effect.void : Effect.fail(unsupported);
86
+ };
87
+ //# sourceMappingURL=Mounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mounts.js","sources":["../src/Mounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import * as Provider from "alchemy/Provider";
2
+ import { Resource } from "alchemy/Resource";
3
+ import * as Effect from "effect/Effect";
4
+ import type { Mount } from "./Mounts.ts";
5
+ import type { Providers } from "./Providers.ts";
6
+ import { type PersistentSandboxCreateOptions } from "./SandboxClient.ts";
7
+ export interface PersistentSandboxProps extends Omit<PersistentSandboxCreateOptions, "mounts"> {
8
+ /**
9
+ * Volumes and cloud buckets mounted into every session:
10
+ * `[{ volume: Home, path: "/home/user" }]`. Changing them replaces the box.
11
+ */
12
+ mounts?: Mount[];
13
+ /** The App the box runs in (`Modal.App`). Changing it replaces the box. */
14
+ app: {
15
+ readonly appId: string;
16
+ readonly name?: string;
17
+ readonly environment?: unknown;
18
+ };
19
+ }
20
+ export interface PersistentSandboxAttributes {
21
+ /** Persistent sandbox ID; pass it (or this resource) to `sandboxes.persistent(...)`. */
22
+ persistentSandboxId: string;
23
+ /** The App the box runs in. */
24
+ appId: string;
25
+ /** Name of that App. */
26
+ appName: string | undefined;
27
+ /** Environment of that App. */
28
+ environment: string | undefined;
29
+ }
30
+ /**
31
+ * A Modal persistent sandbox: one box whose filesystem outlives its
32
+ * sessions. Each session is a regular sandbox that runs up to an hour and
33
+ * pauses after five idle minutes; the next `session()` resumes it from the
34
+ * last session's filesystem. Use it for a long-lived workspace, such as a
35
+ * shared dev box or an agent's home, that the Stack owns.
36
+ *
37
+ * Modal's persistent sandboxes are experimental: they don't take a name,
38
+ * GPUs, `env`, tags or memory snapshots yet. Changing any prop replaces the
39
+ * box (and its files).
40
+ *
41
+ * ### Creating a box
42
+ * **Example:** A dev box on a warm base image
43
+ * ```typescript
44
+ * import * as Modal from "@alchemy.run/modal";
45
+ * import { Coder, Warm } from "./Coder.ts";
46
+ *
47
+ * export const DevBox = Modal.PersistentSandbox("DevBox", { app: Coder, image: Warm, workdir: "/work" });
48
+ * ```
49
+ *
50
+ * ### Using it at runtime
51
+ * **Example:** Resume it from a Worker
52
+ * ```typescript
53
+ * // construction phase
54
+ * const sandboxes = yield* Modal.CreateSandbox(Coder);
55
+ * const devBoxId = yield* (yield* DevBox).persistentSandboxId;
56
+ * // in fetch:
57
+ * const session = yield* (yield* sandboxes.persistent(yield* devBoxId)).session();
58
+ * const result = yield* session.exec(["git", "status"]);
59
+ * ```
60
+ *
61
+ * @resource
62
+ * @product Sandbox
63
+ */
64
+ export declare const PersistentSandbox: import("alchemy/Resource").ResourceConstructor<PersistentSandbox, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<PersistentSandbox, never>, never, never> & {
65
+ Self: import("alchemy/Self").Self<PersistentSandbox>;
66
+ Provider: Provider.Provider<PersistentSandbox>;
67
+ Aliases: readonly string[] | undefined;
68
+ ref(id: string, options?: {
69
+ stage?: string;
70
+ stack?: string;
71
+ }): Effect.Effect<PersistentSandbox, never, never>;
72
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<PersistentSandboxProps>) => Effect.Effect<PersistentSandbox, never, Providers>);
73
+ export type PersistentSandbox = Resource<"Modal.PersistentSandbox", PersistentSandboxProps, PersistentSandboxAttributes, never, Providers>;
74
+ export declare const PersistentSandboxProvider: () => import("effect/Layer").Layer<Provider.Provider<PersistentSandbox>, never, import("@distilled.cloud/modal/Credentials").Credentials | import("effect/http/HttpClient").HttpClient>;
75
+ //# sourceMappingURL=PersistentSandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersistentSandbox.d.ts","sources":["../src/PersistentSandbox.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAIL,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,8BAA8B,EAAE,QAAQ,CAAC;IAC5F;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,2EAA2E;IAC3E,GAAG,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACzF;AAED,MAAM,WAAW,2BAA2B;IAC1C,wFAAwF;IACxF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,+BAA+B;IAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;uJAE7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CACtC,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,KAAK,EACL,SAAS,CACV,CAAC;AAQF,eAAO,MAAM,yBAAyB,yLAoDnC,CAAC"}
@@ -0,0 +1,93 @@
1
+ import * as persistent from "@distilled.cloud/modal/persistent";
2
+ import { deepEqual, isResolved } from "alchemy/Diff";
3
+ import * as Provider from "alchemy/Provider";
4
+ import { Resource } from "alchemy/Resource";
5
+ import * as Effect from "effect/Effect";
6
+ import { envNameOf } from "./internal.js";
7
+ import { declarable } from "./internal/Declared.js";
8
+ import { createPersistentSandbox, persistentSandboxHandle, SandboxOps, } from "./SandboxClient.js";
9
+ /**
10
+ * A Modal persistent sandbox: one box whose filesystem outlives its
11
+ * sessions. Each session is a regular sandbox that runs up to an hour and
12
+ * pauses after five idle minutes; the next `session()` resumes it from the
13
+ * last session's filesystem. Use it for a long-lived workspace, such as a
14
+ * shared dev box or an agent's home, that the Stack owns.
15
+ *
16
+ * Modal's persistent sandboxes are experimental: they don't take a name,
17
+ * GPUs, `env`, tags or memory snapshots yet. Changing any prop replaces the
18
+ * box (and its files).
19
+ *
20
+ * ### Creating a box
21
+ * **Example:** A dev box on a warm base image
22
+ * ```typescript
23
+ * import * as Modal from "@alchemy.run/modal";
24
+ * import { Coder, Warm } from "./Coder.ts";
25
+ *
26
+ * export const DevBox = Modal.PersistentSandbox("DevBox", { app: Coder, image: Warm, workdir: "/work" });
27
+ * ```
28
+ *
29
+ * ### Using it at runtime
30
+ * **Example:** Resume it from a Worker
31
+ * ```typescript
32
+ * // construction phase
33
+ * const sandboxes = yield* Modal.CreateSandbox(Coder);
34
+ * const devBoxId = yield* (yield* DevBox).persistentSandboxId;
35
+ * // in fetch:
36
+ * const session = yield* (yield* sandboxes.persistent(yield* devBoxId)).session();
37
+ * const result = yield* session.exec(["git", "status"]);
38
+ * ```
39
+ *
40
+ * @resource
41
+ * @product Sandbox
42
+ */
43
+ export const PersistentSandbox = declarable()(Resource("Modal.PersistentSandbox"));
44
+ const appOf = (value) => ({
45
+ appId: value.appId,
46
+ appName: value.name,
47
+ environment: envNameOf(value.environment),
48
+ });
49
+ export const PersistentSandboxProvider = () => Provider.effect(PersistentSandbox, Effect.gen(function* () {
50
+ return {
51
+ stables: ["persistentSandboxId", "appId"],
52
+ diff: Effect.fn(function* ({ news, olds }) {
53
+ if (!isResolved(news) || olds === undefined)
54
+ return undefined;
55
+ // Modal can't change a persistent sandbox's definition.
56
+ return deepEqual(news, olds) ? undefined : { action: "replace" };
57
+ }),
58
+ read: Effect.fn(function* ({ output }) {
59
+ if (output === undefined)
60
+ return undefined;
61
+ const found = yield* persistent
62
+ .getPersistentSandbox({ persistentSandboxId: output.persistentSandboxId })
63
+ .pipe(Effect.catchTag("PersistentSandboxNotFound", () => Effect.undefined));
64
+ return found?.persistentSandboxId ? output : undefined;
65
+ }),
66
+ reconcile: Effect.fn(function* ({ news, output, session }) {
67
+ const app = appOf(news.app);
68
+ // Observe: the box still exists.
69
+ if (output !== undefined) {
70
+ const found = yield* persistent
71
+ .getPersistentSandbox({ persistentSandboxId: output.persistentSandboxId })
72
+ .pipe(Effect.catchTag("PersistentSandboxNotFound", () => Effect.undefined));
73
+ if (found?.persistentSandboxId)
74
+ return output;
75
+ }
76
+ // Ensure.
77
+ yield* session.note("Creating persistent sandbox...");
78
+ const { app: _app, ...options } = news;
79
+ // Resolved by the engine: every mount's resource is attributes by now.
80
+ const handle = yield* createPersistentSandbox(yield* SandboxOps, app, options);
81
+ return {
82
+ persistentSandboxId: handle.persistentSandboxId,
83
+ appId: app.appId,
84
+ appName: app.appName,
85
+ environment: app.environment,
86
+ };
87
+ }),
88
+ delete: Effect.fn(function* ({ output }) {
89
+ yield* persistentSandboxHandle(yield* SandboxOps, output.persistentSandboxId, output).terminate();
90
+ }),
91
+ };
92
+ }));
93
+ //# sourceMappingURL=PersistentSandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersistentSandbox.js","sources":["../src/PersistentSandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import * as Provider from "alchemy/Provider";
2
+ import * as Layer from "effect/Layer";
3
+ import * as Credentials from "./Credentials.ts";
4
+ declare const Providers_base: Provider.ProviderCollection<Providers, "Modal">;
5
+ /**
6
+ * Service tag bundling every Modal provider + auth + credentials. Use
7
+ * `Modal.providers()` to materialize the full layer.
8
+ */
9
+ export declare class Providers extends Providers_base {
10
+ }
11
+ export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
12
+ /**
13
+ * Every Modal resource provider, the Modal AuthProvider registration (so
14
+ * `alchemy profile edit` can configure it), and credential resolution.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * Alchemy.Stack("App", { providers: Modal.providers() }, ...)
19
+ * ```
20
+ */
21
+ export declare const providers: () => Layer.Layer<Credentials.Credentials | import("alchemy/Auth/Credentials").CredentialsStore | import("effect/http/HttpClient").HttpClient | import("alchemy/Auth/Profile").ProfileStore | Providers, never, import("alchemy/Auth/Registry").AuthProviders | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/crypto/SecureRandom").SecureRandom | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage>;
22
+ export {};
23
+ //# sourceMappingURL=Providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Providers.d.ts","sources":["../src/Providers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;;AAmBhD;;;GAGG;AACH,qBAAa,SAAU,SAAQ,cAAiD;CAAG;AAEnF,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AAEhF;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,6fAuDnB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { CredentialsStoreLive } from "alchemy/Auth/Credentials";
2
+ import { ProfileStoreLive } from "alchemy/Auth/Profile";
3
+ import * as Provider from "alchemy/Provider";
4
+ import { Random, RandomProvider } from "alchemy/Random";
5
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
6
+ import * as Layer from "effect/Layer";
7
+ import { App, AppProvider } from "./App.js";
8
+ import { ModalAuth } from "./AuthProvider.js";
9
+ import * as Credentials from "./Credentials.js";
10
+ import { Dict, DictProvider } from "./Dict.js";
11
+ import { Domain, DomainProvider } from "./Domain.js";
12
+ import { Endpoint, EndpointProvider } from "./Endpoint.js";
13
+ import { Environment, EnvironmentProvider } from "./Environment.js";
14
+ import { Function, FunctionProvider } from "./Function.js";
15
+ import { FunctionAutoscaler, FunctionAutoscalerProvider } from "./FunctionAutoscaler.js";
16
+ import { Image, ImageProvider } from "./Image.js";
17
+ import { PersistentSandbox, PersistentSandboxProvider } from "./PersistentSandbox.js";
18
+ import { Proxy, ProxyProvider } from "./Proxy.js";
19
+ import { Queue, QueueProvider } from "./Queue.js";
20
+ import { Sandbox, SandboxProvider } from "./Sandbox.js";
21
+ import { Secret, SecretProvider } from "./Secret.js";
22
+ import { Server, ServerProvider } from "./Server.js";
23
+ import { ServiceUser, ServiceUserProvider } from "./ServiceUser.js";
24
+ import { Volume, VolumeProvider } from "./Volume.js";
25
+ import { WebhookToken, WebhookTokenProvider } from "./WebhookToken.js";
26
+ import { WorkspaceSettings, WorkspaceSettingsProvider } from "./WorkspaceSettings.js";
27
+ /**
28
+ * Service tag bundling every Modal provider + auth + credentials. Use
29
+ * `Modal.providers()` to materialize the full layer.
30
+ */
31
+ export class Providers extends Provider.ProviderCollection()("Modal") {
32
+ }
33
+ /**
34
+ * Every Modal resource provider, the Modal AuthProvider registration (so
35
+ * `alchemy profile edit` can configure it), and credential resolution.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * Alchemy.Stack("App", { providers: Modal.providers() }, ...)
40
+ * ```
41
+ */
42
+ export const providers = () => Layer.effect(Providers, Provider.collection([
43
+ App,
44
+ Dict,
45
+ Domain,
46
+ Endpoint,
47
+ Environment,
48
+ Function,
49
+ FunctionAutoscaler,
50
+ Image,
51
+ PersistentSandbox,
52
+ Proxy,
53
+ Queue,
54
+ // Each RPC binding mints its caller's key (`Modal.InvokeFunction`, `Modal.FetchServer`).
55
+ Random,
56
+ Sandbox,
57
+ Secret,
58
+ Server,
59
+ ServiceUser,
60
+ Volume,
61
+ WebhookToken,
62
+ WorkspaceSettings,
63
+ ])).pipe(Layer.provide(Layer.mergeAll(AppProvider(), DictProvider(), DomainProvider(), EndpointProvider(), EnvironmentProvider(), FunctionProvider(), FunctionAutoscalerProvider(), ImageProvider(), PersistentSandboxProvider(), ProxyProvider(), QueueProvider(), RandomProvider(), SandboxProvider(), SecretProvider(), ServerProvider(), ServiceUserProvider(), VolumeProvider(), WebhookTokenProvider(), WorkspaceSettingsProvider())), Layer.provideMerge(Credentials.fromAuthProvider()), Layer.provideMerge(FetchHttpClient.layer), Layer.provideMerge(ModalAuth), Layer.provideMerge(ProfileStoreLive), Layer.provideMerge(CredentialsStoreLive), Layer.orDie);
64
+ //# sourceMappingURL=Providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Providers.js","sources":["../src/Providers.ts"],"names":[],"mappings":"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"}
package/lib/Proxy.d.ts ADDED
@@ -0,0 +1,94 @@
1
+ import * as proxy from "@distilled.cloud/modal/proxy";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Effect from "effect/Effect";
5
+ import { type EnvironmentInput } from "./internal.ts";
6
+ import type { Providers } from "./Providers.ts";
7
+ declare const ProxyUnexpectedResponse_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
8
+ readonly _tag: "Modal.ProxyUnexpectedResponse";
9
+ } & Readonly<A>;
10
+ export declare class ProxyUnexpectedResponse extends ProxyUnexpectedResponse_base<{
11
+ readonly message: string;
12
+ }> {
13
+ }
14
+ export interface ProxyProps {
15
+ /**
16
+ * Proxy name, unique per environment. If omitted, a unique name is
17
+ * generated from the stack, stage and logical ID. Changing it replaces the
18
+ * proxy.
19
+ */
20
+ name?: string;
21
+ /**
22
+ * Environment the proxy lives in. Changing it replaces the proxy.
23
+ * @default the workspace's default environment
24
+ */
25
+ environment?: EnvironmentInput;
26
+ /**
27
+ * Region the proxy's IPs come from (e.g. `us-east-1`). Changing it
28
+ * replaces the proxy.
29
+ */
30
+ region?: string;
31
+ /**
32
+ * Number of static egress IPs. Traffic through the proxy leaves from one
33
+ * of them.
34
+ * @default 1
35
+ */
36
+ ips?: number;
37
+ }
38
+ export interface ProxyAttributes {
39
+ /** Proxy ID (`pr-…`). */
40
+ proxyId: string;
41
+ /** Proxy name. */
42
+ name: string;
43
+ /** Environment name, or `undefined` for the workspace default. */
44
+ environment: string | undefined;
45
+ /** Region of the proxy's IPs. */
46
+ region: string | undefined;
47
+ /** The static egress IPs, for allowlists on the systems a sandbox calls. */
48
+ ips: string[];
49
+ }
50
+ /**
51
+ * A Modal Proxy: static egress IPs for Sandboxes and Functions. Traffic from
52
+ * a sandbox created with `proxy` leaves from these IPs, so a database or API
53
+ * can allowlist them.
54
+ *
55
+ * Proxies are a Modal Team plan feature. Modal proxies have no tags;
56
+ * ownership is inferred from Alchemy state.
57
+ *
58
+ * ### Creating a Proxy
59
+ * **Example:** One static IP
60
+ * ```typescript
61
+ * import * as Modal from "@alchemy.run/modal";
62
+ *
63
+ * export const Egress = Modal.Proxy("Egress", {});
64
+ * ```
65
+ *
66
+ * **Example:** Two IPs in a region
67
+ * ```typescript
68
+ * import * as Modal from "@alchemy.run/modal";
69
+ *
70
+ * export const Egress = Modal.Proxy("Egress", { region: "us-east-1", ips: 2 });
71
+ * ```
72
+ *
73
+ * ### Routing a Sandbox through it
74
+ * **Example:** Pass the proxy when creating a sandbox
75
+ * ```typescript
76
+ * const sandbox = yield* sandboxes.create({ proxy: egress });
77
+ * ```
78
+ *
79
+ * @resource
80
+ * @product Proxy
81
+ */
82
+ export declare const Proxy: import("alchemy/Resource").ResourceConstructor<Proxy, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<Proxy, never>, never, never> & {
83
+ Self: import("alchemy/Self").Self<Proxy>;
84
+ Provider: Provider.Provider<Proxy>;
85
+ Aliases: readonly string[] | undefined;
86
+ ref(id: string, options?: {
87
+ stage?: string;
88
+ stack?: string;
89
+ }): Effect.Effect<Proxy, never, never>;
90
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<ProxyProps>) => Effect.Effect<Proxy, never, Providers>);
91
+ export type Proxy = Resource<"Modal.Proxy", ProxyProps, ProxyAttributes, never, Providers>;
92
+ export declare const ProxyProvider: () => import("effect/Layer").Layer<Provider.Provider<Proxy>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | proxy.ModalOpContext>;
93
+ export {};
94
+ //# sourceMappingURL=Proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Proxy.d.ts","sources":["../src/Proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAC;AAGtD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,KAAK,gBAAgB,EAKtB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;;;;AAEhD,qBAAa,uBAAwB,SAAQ,6BAAkD;IAC7F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,iCAAiC;IACjC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,4EAA4E;IAC5E,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,KAAK;;;;;;;;+HAAsD,CAAC;AAEzE,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAU3F,eAAO,MAAM,aAAa,2JAuFvB,CAAC"}
package/lib/Proxy.js ADDED
@@ -0,0 +1,132 @@
1
+ import * as proxy from "@distilled.cloud/modal/proxy";
2
+ import { Unowned } from "alchemy/AdoptPolicy";
3
+ import { isResolved } from "alchemy/Diff";
4
+ import * as Provider from "alchemy/Provider";
5
+ import { Resource } from "alchemy/Resource";
6
+ import * as Data from "effect/Data";
7
+ import * as Effect from "effect/Effect";
8
+ import { envNameOf, environmentOf, isGeneratedName, objectName, } from "./internal.js";
9
+ import { declarable } from "./internal/Declared.js";
10
+ export class ProxyUnexpectedResponse extends Data.TaggedError("Modal.ProxyUnexpectedResponse") {
11
+ }
12
+ /**
13
+ * A Modal Proxy: static egress IPs for Sandboxes and Functions. Traffic from
14
+ * a sandbox created with `proxy` leaves from these IPs, so a database or API
15
+ * can allowlist them.
16
+ *
17
+ * Proxies are a Modal Team plan feature. Modal proxies have no tags;
18
+ * ownership is inferred from Alchemy state.
19
+ *
20
+ * ### Creating a Proxy
21
+ * **Example:** One static IP
22
+ * ```typescript
23
+ * import * as Modal from "@alchemy.run/modal";
24
+ *
25
+ * export const Egress = Modal.Proxy("Egress", {});
26
+ * ```
27
+ *
28
+ * **Example:** Two IPs in a region
29
+ * ```typescript
30
+ * import * as Modal from "@alchemy.run/modal";
31
+ *
32
+ * export const Egress = Modal.Proxy("Egress", { region: "us-east-1", ips: 2 });
33
+ * ```
34
+ *
35
+ * ### Routing a Sandbox through it
36
+ * **Example:** Pass the proxy when creating a sandbox
37
+ * ```typescript
38
+ * const sandbox = yield* sandboxes.create({ proxy: egress });
39
+ * ```
40
+ *
41
+ * @resource
42
+ * @product Proxy
43
+ */
44
+ export const Proxy = declarable()(Resource("Modal.Proxy"));
45
+ const toAttrs = (p, env) => ({
46
+ proxyId: p.proxyId ?? "",
47
+ name: p.name ?? "",
48
+ environment: env,
49
+ region: p.region || undefined,
50
+ ips: (p.proxyIps ?? []).flatMap((ip) => (ip.proxyIp ? [ip.proxyIp] : [])),
51
+ });
52
+ export const ProxyProvider = () => Provider.effect(Proxy, Effect.gen(function* () {
53
+ const observe = Effect.fn(function* (name, env) {
54
+ const found = yield* proxy
55
+ .getProxy({ name, environmentName: environmentOf(env) })
56
+ .pipe(Effect.catchTag("ProxyNotFound", () => Effect.undefined));
57
+ return found?.proxy?.proxyId ? found.proxy : undefined;
58
+ });
59
+ return {
60
+ stables: ["proxyId", "name", "environment", "region"],
61
+ diff: Effect.fn(function* ({ id, news, olds, output }) {
62
+ if (!isResolved(news))
63
+ return undefined;
64
+ if (envNameOf(news.environment) !== envNameOf(olds?.environment))
65
+ return { action: "replace" };
66
+ if (news.region !== olds?.region)
67
+ return { action: "replace" };
68
+ const name = yield* objectName(id, news.name);
69
+ if (output !== undefined && name !== output.name)
70
+ return { action: "replace" };
71
+ return undefined;
72
+ }),
73
+ read: Effect.fn(function* ({ id, olds, output }) {
74
+ const name = output?.name ?? (yield* objectName(id, olds?.name));
75
+ const env = output?.environment ?? envNameOf(olds?.environment);
76
+ const found = yield* observe(name, env);
77
+ if (!found)
78
+ return undefined;
79
+ const attrs = toAttrs(found, env);
80
+ return output !== undefined || olds?.name === undefined ? attrs : Unowned(attrs);
81
+ }),
82
+ reconcile: Effect.fn(function* ({ id, news, output, session }) {
83
+ const name = output?.name ?? (yield* objectName(id, news.name));
84
+ // Observe
85
+ let current = yield* observe(name, envNameOf(news.environment));
86
+ // Ensure
87
+ if (!current) {
88
+ yield* session.note(`Creating proxy ${name}...`);
89
+ const created = yield* proxy
90
+ .createProxy({
91
+ name,
92
+ environmentName: environmentOf(envNameOf(news.environment)),
93
+ region: news.region,
94
+ })
95
+ .pipe(Effect.map((response) => response.proxy), Effect.catchTag("ProxyAlreadyExists", () => observe(name, envNameOf(news.environment))));
96
+ if (!created?.proxyId) {
97
+ return yield* new ProxyUnexpectedResponse({
98
+ message: `Modal returned no proxy for ${name}`,
99
+ });
100
+ }
101
+ current = created;
102
+ }
103
+ // Sync the IP count against the observed IPs.
104
+ const desired = news.ips ?? 1;
105
+ const observed = (current.proxyIps ?? []).flatMap((ip) => ip.proxyIp ? [ip.proxyIp] : []);
106
+ for (let i = observed.length; i < desired; i++) {
107
+ yield* session.note(`Adding an IP to proxy ${name}...`);
108
+ yield* proxy.proxyAddIp({ proxyId: current.proxyId });
109
+ }
110
+ for (const ip of observed.slice(desired)) {
111
+ yield* session.note(`Removing IP ${ip} from proxy ${name}...`);
112
+ yield* proxy
113
+ .proxyRemoveIp({ proxyIp: ip })
114
+ .pipe(Effect.catchTag("ProxyNotFound", () => Effect.void));
115
+ }
116
+ const final = (yield* observe(name, envNameOf(news.environment))) ?? current;
117
+ return toAttrs(final, envNameOf(news.environment));
118
+ }),
119
+ delete: Effect.fn(function* ({ output }) {
120
+ yield* proxy
121
+ .deleteProxy({ proxyId: output.proxyId })
122
+ .pipe(Effect.catchTag("ProxyNotFound", () => Effect.void));
123
+ }),
124
+ list: Effect.fn(function* () {
125
+ const { proxies } = yield* proxy.listProxy({});
126
+ return (proxies ?? [])
127
+ .filter((p) => p.proxyId && isGeneratedName(p.name))
128
+ .map((p) => toAttrs(p, p.environmentName || undefined));
129
+ }),
130
+ };
131
+ }));
132
+ //# sourceMappingURL=Proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Proxy.js","sources":["../src/Proxy.ts"],"names":[],"mappings":"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"}