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

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
@@ -0,0 +1,186 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
3
+ import type * as Effect from "effect/Effect";
4
+ import type { App } from "./App.ts";
5
+ import type { Image } from "./Image.ts";
6
+ import type { ErrorOf } from "./internal.ts";
7
+ import type { Sandbox } from "./Sandbox.ts";
8
+ import type { createPersistentSandbox, createSandbox, listSandboxes, PersistentSandboxCreateOptions, PersistentSandboxHandle, restoreSandbox, SandboxCreateOptions, SandboxHandle, sandboxFromName, SandboxOpError } from "./SandboxClient.ts";
9
+ export type { ExecOptions, PersistentSandboxCreateOptions, PersistentSandboxHandle, ExecResult, HeaderReplacement, SandboxCreateOptions, SandboxFileEntry, SandboxHandle, SandboxTunnel, } from "./SandboxClient.ts";
10
+ /** A sandbox as `list` reports it. */
11
+ export interface SandboxSummary {
12
+ readonly sandboxId: string;
13
+ readonly name: string | undefined;
14
+ readonly createdAt: number | undefined;
15
+ readonly tags: Record<string, string>;
16
+ }
17
+ /** Sandbox cost for one combination of tag values. */
18
+ export interface SandboxUsageGroup {
19
+ /** The grouped tags' values. */
20
+ readonly tags: Record<string, string>;
21
+ /** Total cost in USD. */
22
+ readonly cost: number;
23
+ /** Cost by resource (`cpu`, `memory`, `gpu`, ...). */
24
+ readonly costByResource: Record<string, number>;
25
+ }
26
+ /** Create and find sandboxes in one App. Every handle method calls Modal. */
27
+ export interface SandboxesClient {
28
+ /** The App sandboxes are created in. */
29
+ readonly appId: Effect.Effect<string>;
30
+ /** Create a sandbox. Modal's own sandbox parameters; the bound image is the default `image`. */
31
+ create(options?: SandboxCreateOptions): Effect.Effect<SandboxHandle, ErrorOf<typeof createSandbox>, RuntimeContext>;
32
+ /** A running sandbox by name, or `undefined`. */
33
+ fromName(name: string): Effect.Effect<SandboxHandle | undefined, ErrorOf<typeof sandboxFromName>, RuntimeContext>;
34
+ /** A sandbox by id. */
35
+ fromId(sandboxId: string): Effect.Effect<SandboxHandle>;
36
+ /** Running sandboxes of the App, optionally filtered by tags. */
37
+ list(options?: {
38
+ readonly tags?: Record<string, string>;
39
+ readonly includeFinished?: boolean;
40
+ }): Effect.Effect<ReadonlyArray<SandboxSummary>, ErrorOf<typeof listSandboxes>, RuntimeContext>;
41
+ /**
42
+ * Create a persistent sandbox: one box whose filesystem outlives its
43
+ * sessions. Each session runs up to an hour and pauses after five idle
44
+ * minutes; `session()` resumes it from where it stopped.
45
+ */
46
+ createPersistent(options?: PersistentSandboxCreateOptions): Effect.Effect<PersistentSandboxHandle, ErrorOf<typeof createPersistentSandbox>, RuntimeContext>;
47
+ /** A persistent sandbox by id (a `Modal.PersistentSandbox`, or one `createPersistent` made). */
48
+ persistent(box: string | {
49
+ readonly persistentSandboxId: string;
50
+ }): Effect.Effect<PersistentSandboxHandle>;
51
+ /**
52
+ * What the App's sandboxes cost over a time range, grouped by tag values
53
+ * (`groupByTags: ["user"]` gives one group per user). Modal reports
54
+ * whole hours: `since` rounds down and `until` (default now) up to the
55
+ * hour.
56
+ */
57
+ usage(query: {
58
+ readonly since: Date | string | number;
59
+ readonly until?: Date | string | number;
60
+ readonly groupByTags?: ReadonlyArray<string>;
61
+ readonly tags?: Record<string, string>;
62
+ }): Effect.Effect<ReadonlyArray<SandboxUsageGroup>, SandboxOpError<"usage">, RuntimeContext>;
63
+ /** Start a new sandbox from a memory snapshot (`handle.snapshotMemory()`). */
64
+ restore(snapshot: {
65
+ readonly snapshotId: string;
66
+ }, options?: {
67
+ readonly name?: string;
68
+ }): Effect.Effect<SandboxHandle, ErrorOf<typeof restoreSandbox> | SandboxOpError<"setTags">, RuntimeContext>;
69
+ }
70
+ /**
71
+ * Create and drive Modal Sandboxes from any runtime: a Worker, a Lambda, a
72
+ * Durable Object, or a script.
73
+ *
74
+ * Bind it to an App (sandboxes boot from the image you pass to `create`) or
75
+ * to an Image (it is the default image, and sandboxes go in the image's
76
+ * App). A sandbox lives at most 24 hours; to keep work across sandboxes, use
77
+ * a Volume, or snapshot it (`snapshotFilesystem`, `snapshotMemory`) and
78
+ * start the next one from the snapshot.
79
+ *
80
+ * Sandboxes are runtime objects: they aren't in Alchemy state. Stopping the
81
+ * App (destroying the `Modal.App` resource) terminates every sandbox in it.
82
+ *
83
+ * Objects created at run time are tagged with the stack, stage and binding
84
+ * (`alchemy::stack`, `alchemy::stage`, `alchemy::id`) and are not deleted when
85
+ * the stack is destroyed. List them by those tags to clean them up:
86
+ * `sandboxes.list({ tags: { "alchemy::stack": "my-app" } })`, or Modal's
87
+ * `SandboxList` with `tags`. Your own `tags` merge under the three. A
88
+ * persistent sandbox takes neither tags nor a name, so it carries no owner;
89
+ * it lives in the App.
90
+ *
91
+ * ### Create a sandbox per request
92
+ * **Example:** Run a command and terminate
93
+ * ```typescript
94
+ * import * as Cloudflare from "@alchemy.run/cloudflare";
95
+ * import * as Modal from "@alchemy.run/modal";
96
+ * import * as Effect from "effect/Effect";
97
+ * import * as HttpServerResponse from "effect/http/HttpServerResponse";
98
+ * import { Warm } from "./Coder.ts";
99
+ *
100
+ * export default class Api extends Cloudflare.Worker<Api>()(
101
+ * "Api",
102
+ * { main: import.meta.url },
103
+ * Effect.gen(function* () {
104
+ * const sandboxes = yield* Modal.CreateSandbox(Warm);
105
+ * return {
106
+ * fetch: Effect.gen(function* () {
107
+ * const sandbox = yield* Effect.acquireRelease(
108
+ * sandboxes.create({ timeout: "10 minutes" }),
109
+ * (sandbox) => Effect.ignore(sandbox.terminate()),
110
+ * );
111
+ * const test = yield* sandbox.exec(["pnpm", "test"], { cwd: "/work" });
112
+ * return yield* HttpServerResponse.json(test);
113
+ * }).pipe(Effect.scoped, Effect.orDie),
114
+ * };
115
+ * }).pipe(Effect.provide(Modal.CreateSandboxHttp)),
116
+ * ) {}
117
+ * ```
118
+ *
119
+ * ### One sandbox per session
120
+ * **Example:** Find it by name, else create it
121
+ * ```typescript
122
+ * const sandbox =
123
+ * (yield* sandboxes.fromName(`session-${user}`)) ??
124
+ * (yield* sandboxes.create({ name: `session-${user}`, idleTimeout: "10 minutes" }));
125
+ * ```
126
+ *
127
+ * ### Secrets the sandbox never sees
128
+ * **Example:** Inject an API key into outbound requests
129
+ * ```typescript
130
+ * // construction phase: read the Secret's id
131
+ * const openaiId = yield* (yield* OpenAI).secretId;
132
+ * // in a handler
133
+ * const openai = { secretId: yield* openaiId };
134
+ * const sandbox = yield* sandboxes.create({
135
+ * outboundPolicy: {
136
+ * routes: [
137
+ * {
138
+ * https: {
139
+ * domains: ["api.openai.com"],
140
+ * headerReplacements: [{ secret: openai, headers: { Authorization: "Bearer $OPENAI_API_KEY" } }],
141
+ * },
142
+ * },
143
+ * { any: { redirect: "block" } },
144
+ * ],
145
+ * },
146
+ * });
147
+ * ```
148
+ *
149
+ * ### A cloud identity, not a key
150
+ * **Example:** Assume an AWS role with the token Modal signs
151
+ * ```typescript
152
+ * const sandbox = yield* sandboxes.create({
153
+ * image: "amazon/aws-cli",
154
+ * includeOidcIdentityToken: true,
155
+ * });
156
+ * // MODAL_IDENTITY_TOKEN is an OIDC token from https://oidc.modal.com
157
+ * const role = yield* sandbox.exec(
158
+ * `aws sts assume-role-with-web-identity --role-arn ${roleArn} --role-session-name sandbox --web-identity-token "$MODAL_IDENTITY_TOKEN"`,
159
+ * );
160
+ * ```
161
+ *
162
+ * ### Persistent sandboxes
163
+ * **Example:** A box per user that keeps its files between sessions
164
+ * ```typescript
165
+ * const box = yield* sandboxes.createPersistent({ image: "node:22-bookworm" });
166
+ * const session = yield* box.session();
167
+ * yield* session.exec("echo hi >> /root/notes.txt");
168
+ * // later, from any request: resumes the box if it paused
169
+ * const again = yield* (yield* sandboxes.persistent(box.persistentSandboxId)).session();
170
+ * ```
171
+ *
172
+ * ### Snapshots
173
+ * **Example:** Save a warmed sandbox and boot the next one from it
174
+ * ```typescript
175
+ * yield* sandbox.exec(["pnpm", "install"], { cwd: "/work" });
176
+ * const image = yield* sandbox.snapshotFilesystem();
177
+ * const next = yield* sandboxes.create({ image });
178
+ * ```
179
+ *
180
+ * @binding
181
+ * @product Sandbox
182
+ */
183
+ export interface CreateSandbox extends Binding.Service<CreateSandbox, "Modal.CreateSandbox", (target: App | Image | Sandbox) => Effect.Effect<SandboxesClient>> {
184
+ }
185
+ export declare const CreateSandbox: CreateSandbox;
186
+ //# sourceMappingURL=CreateSandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSandbox.d.ts","sources":["../src/CreateSandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ export const CreateSandbox = Binding.Service("Modal.CreateSandbox");
3
+ //# sourceMappingURL=CreateSandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSandbox.js","sources":["../src/CreateSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAmO3C,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAgB,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Layer from "effect/Layer";
3
+ import { CreateSandbox, type SandboxesClient } from "./CreateSandbox.ts";
4
+ import { type RuntimeOwner } from "./RuntimeOwner.ts";
5
+ import { SandboxOps, type SandboxTarget } from "./SandboxClient.ts";
6
+ /** A sandboxes client over a target resolved per call. */
7
+ export declare const makeSandboxesClient: (target: Effect.Effect<SandboxTarget>, ops: SandboxOps, owner?: Effect.Effect<RuntimeOwner | undefined>) => SandboxesClient;
8
+ /**
9
+ * {@link CreateSandbox} over Modal's API. Grants the host's identity (a scoped
10
+ * `Modal.ServiceUser`) the `contributor` role on the App's environment.
11
+ *
12
+ * @layer
13
+ * @product Sandbox
14
+ * @provides Modal.CreateSandbox
15
+ */
16
+ export declare const CreateSandboxHttp: Layer.Layer<CreateSandbox, never, never>;
17
+ //# sourceMappingURL=CreateSandboxHttp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSandboxHttp.d.ts","sources":["../src/CreateSandboxHttp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAA0B,MAAM,oBAAoB,CAAC;AAGjG,OAAO,EAAE,KAAK,YAAY,EAA+B,MAAM,mBAAmB,CAAC;AAEnF,OAAO,EAML,UAAU,EAGV,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAQ5B,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,WACtB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,OAC/B,UAAU,UACR,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,KAC7C,eAyDD,CAAC;AAMH;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,0CAwD7B,CAAC"}
@@ -0,0 +1,117 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Layer from "effect/Layer";
3
+ import { makeModalBinding } from "./BindingHttp.js";
4
+ import { CreateSandbox } from "./CreateSandbox.js";
5
+ import { timestampOf } from "./internal.js";
6
+ import { RuntimeOwnerOf, runtimeTags } from "./RuntimeOwner.js";
7
+ import { createPersistentSandbox, createSandbox, listSandboxes, persistentSandboxHandle, restoreSandbox, SandboxOps, sandboxFromName, sandboxHandle, } from "./SandboxClient.js";
8
+ const HOUR_MS = 3_600_000;
9
+ /** A time rounded to an hour boundary, as Modal's usage query wants it. */
10
+ const hourOf = (value, round) => timestampOf(round(new Date(value).getTime() / HOUR_MS) * HOUR_MS);
11
+ /** A sandboxes client over a target resolved per call. */
12
+ export const makeSandboxesClient = (target, ops, owner = Effect.undefined) => ({
13
+ appId: Effect.map(target, (t) => t.appId),
14
+ create: (options) => Effect.flatMap(Effect.all([target, owner]), ([t, o]) => createSandbox(ops, t, {
15
+ ...options,
16
+ // The owner's tags win over a user tag of the same key.
17
+ tags: o === undefined ? options?.tags : { ...options?.tags, ...runtimeTags(o) },
18
+ })),
19
+ fromName: (name) => Effect.flatMap(target, (t) => sandboxFromName(ops, t, name)),
20
+ fromId: (sandboxId) => Effect.map(target, (t) => sandboxHandle(ops, sandboxId, t)),
21
+ list: (options) => Effect.flatMap(target, (t) => listSandboxes(ops, t, options)),
22
+ usage: (query) => Effect.gen(function* () {
23
+ const t = yield* target;
24
+ const groups = [];
25
+ let pageToken;
26
+ for (let page = 0; page < 100; page++) {
27
+ const response = yield* ops.usage({
28
+ appId: t.appId,
29
+ // Modal reports usage by whole hours.
30
+ since: hourOf(query.since, Math.floor),
31
+ until: query.until === undefined ? undefined : hourOf(query.until, Math.ceil),
32
+ groupByTags: query.groupByTags ? [...query.groupByTags] : undefined,
33
+ tags: query.tags,
34
+ pageToken,
35
+ });
36
+ for (const group of response.groups ?? []) {
37
+ groups.push({
38
+ tags: Object.fromEntries(Object.entries(group.tags ?? {}).map(([key, value]) => [key, value?.value ?? ""])),
39
+ cost: group.cost ?? 0,
40
+ costByResource: Object.fromEntries(Object.entries(group.costByResource ?? {}).map(([key, value]) => [key, value ?? 0])),
41
+ });
42
+ }
43
+ pageToken = response.nextPageToken || undefined;
44
+ if (pageToken === undefined)
45
+ break;
46
+ }
47
+ return groups;
48
+ }),
49
+ createPersistent: (options) => Effect.flatMap(target, (t) => createPersistentSandbox(ops, t, options)),
50
+ persistent: (box) => Effect.map(target, (t) => persistentSandboxHandle(ops, typeof box === "string" ? box : box.persistentSandboxId, t)),
51
+ restore: (snapshot, options) => Effect.gen(function* () {
52
+ const restored = yield* restoreSandbox(ops, yield* target, snapshot, options);
53
+ const o = yield* owner;
54
+ if (o !== undefined)
55
+ yield* restored.setTags(runtimeTags(o));
56
+ return restored;
57
+ }),
58
+ });
59
+ const isImage = (target) => target.Type === "Modal.Image";
60
+ const isProgram = (target) => target.Type === "Modal.Sandbox";
61
+ /**
62
+ * {@link CreateSandbox} over Modal's API. Grants the host's identity (a scoped
63
+ * `Modal.ServiceUser`) the `contributor` role on the App's environment.
64
+ *
65
+ * @layer
66
+ * @product Sandbox
67
+ * @provides Modal.CreateSandbox
68
+ */
69
+ export const CreateSandboxHttp = Layer.effect(CreateSandbox, makeModalBinding({
70
+ tag: "Modal.CreateSandbox",
71
+ operations: SandboxOps,
72
+ role: "contributor",
73
+ make: Effect.fn(function* (resource, ops) {
74
+ const owner = yield* RuntimeOwnerOf();
75
+ if (isProgram(resource)) {
76
+ const imageId = yield* resource.imageId;
77
+ const appId = yield* resource.appId;
78
+ const appName = yield* resource.appName;
79
+ const environment = yield* resource.environment;
80
+ const secretId = yield* resource.secretId;
81
+ const command = yield* resource.command;
82
+ const port = yield* resource.port;
83
+ const mounts = yield* resource.mounts;
84
+ const target = Effect.all({
85
+ imageId,
86
+ appId,
87
+ appName,
88
+ environment,
89
+ secretId,
90
+ command,
91
+ port,
92
+ mounts,
93
+ }).pipe(Effect.map((t) => ({
94
+ imageId: t.imageId,
95
+ appId: t.appId,
96
+ appName: t.appName,
97
+ environment: t.environment,
98
+ program: { secretId: t.secretId, command: t.command, port: t.port, mounts: t.mounts },
99
+ })));
100
+ return makeSandboxesClient(target, ops, owner);
101
+ }
102
+ if (isImage(resource)) {
103
+ const imageId = yield* resource.imageId;
104
+ const appId = yield* resource.appId;
105
+ const appName = yield* resource.appName;
106
+ const environment = yield* resource.environment;
107
+ const target = Effect.all({ imageId, appId, appName, environment }).pipe(Effect.map((t) => t));
108
+ return makeSandboxesClient(target, ops, owner);
109
+ }
110
+ const appId = yield* resource.appId;
111
+ const appName = yield* resource.name;
112
+ const environment = yield* resource.environment;
113
+ const target = Effect.all({ appId, appName, environment }).pipe(Effect.map((t) => t));
114
+ return makeSandboxesClient(target, ops, owner);
115
+ }),
116
+ }));
117
+ //# sourceMappingURL=CreateSandboxHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSandboxHttp.js","sources":["../src/CreateSandboxHttp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
3
+ import type * as Effect from "effect/Effect";
4
+ import type * as Redacted from "effect/Redacted";
5
+ import type { SecretsOps } from "./CreateSecretHttp.ts";
6
+ import type { Environment } from "./Environment.ts";
7
+ import type { ErrorOf, OpError } from "./internal.ts";
8
+ import type { lookupSecret, putSecret } from "./Secret.ts";
9
+ import type { SecretAttributes } from "./Secret.ts";
10
+ /** Write, find, list and delete secrets by name in one environment. */
11
+ export interface SecretsClientOf<R> {
12
+ /**
13
+ * Create or overwrite the secret named `name` with `env`. Returns its
14
+ * attributes, to pass as a sandbox `secrets` entry or in an outbound
15
+ * header replacement.
16
+ */
17
+ put(name: string, env: Record<string, string | Redacted.Redacted<string>>): Effect.Effect<SecretAttributes, ErrorOf<typeof putSecret>, R>;
18
+ /** The secret named `name` (its variable names, never its values), or `undefined`. */
19
+ get(name: string): Effect.Effect<SecretAttributes | undefined, ErrorOf<typeof lookupSecret>, R>;
20
+ /** Delete the secret named `name` (no-op when missing). */
21
+ delete(name: string): Effect.Effect<void, ErrorOf<typeof lookupSecret> | Exclude<OpError<SecretsOps, "delete">, {
22
+ readonly _tag: "SecretNotFound";
23
+ }>, R>;
24
+ /** Names of every secret in the environment. */
25
+ list(): Effect.Effect<ReadonlyArray<string>, OpError<SecretsOps, "list">, R>;
26
+ }
27
+ /** A SecretsClient whose calls run inside a deployed runtime. */
28
+ export type SecretsClient = SecretsClientOf<RuntimeContext>;
29
+ /**
30
+ * Store secrets by name at runtime, such as one per user, and hand them to
31
+ * that user's sandboxes. With an outbound header replacement the sandbox
32
+ * never sees the value: Modal adds it to matching requests on the way out.
33
+ *
34
+ * Bind it to a `Modal.Environment` to keep these runtime secrets in their
35
+ * own namespace. They aren't in Alchemy state: deleting the environment
36
+ * removes them.
37
+ *
38
+ * Objects created at run time are tagged with the stack, stage and binding
39
+ * (`alchemy::stack`, `alchemy::stage`, `alchemy::id`) and are not deleted when
40
+ * the stack is destroyed. A Modal secret has only a name, so the tags become
41
+ * its name prefix, `Modal.runtimePrefix({ stack, stage, id })`: list them
42
+ * with `modal secret list` and delete the ones whose name starts with it.
43
+ *
44
+ * ### A user's token, injected at egress
45
+ * **Example:** From a Cloudflare Worker
46
+ * ```typescript
47
+ * import * as Cloudflare from "@alchemy.run/cloudflare";
48
+ * import * as Modal from "@alchemy.run/modal";
49
+ * import * as Effect from "effect/Effect";
50
+ * import * as Layer from "effect/Layer";
51
+ * import { HttpServerRequest } from "effect/http/HttpServerRequest";
52
+ * import * as HttpServerResponse from "effect/http/HttpServerResponse";
53
+ * import { Agents, Coder } from "./Coder.ts";
54
+ *
55
+ * export default class Api extends Cloudflare.Worker<Api>()(
56
+ * "Api",
57
+ * { main: import.meta.url },
58
+ * Effect.gen(function* () {
59
+ * const secrets = yield* Modal.CreateSecret(Agents);
60
+ * const sandboxes = yield* Modal.CreateSandbox(Coder);
61
+ * return {
62
+ * fetch: Effect.gen(function* () {
63
+ * const request = yield* HttpServerRequest;
64
+ * const user = request.headers["x-user"] ?? "anonymous";
65
+ * const github = yield* secrets.put(`github-${user}`, {
66
+ * GITHUB_TOKEN: request.headers["x-github-token"] ?? "",
67
+ * });
68
+ * const sandbox = yield* sandboxes.create({
69
+ * outboundPolicy: {
70
+ * routes: [
71
+ * {
72
+ * https: {
73
+ * domains: ["api.github.com"],
74
+ * headerReplacements: [{ secret: github, headers: { Authorization: "Bearer $GITHUB_TOKEN" } }],
75
+ * },
76
+ * },
77
+ * { tls: { domains: ["github.com"] } },
78
+ * { any: { redirect: "block" } },
79
+ * ],
80
+ * },
81
+ * });
82
+ * return HttpServerResponse.text(sandbox.sandboxId);
83
+ * }).pipe(Effect.orDie),
84
+ * };
85
+ * }).pipe(Effect.provide(Layer.mergeAll(Modal.CreateSecretHttp, Modal.CreateSandboxHttp))),
86
+ * ) {}
87
+ * ```
88
+ *
89
+ * @binding
90
+ * @product Secret
91
+ */
92
+ export interface CreateSecret extends Binding.Service<CreateSecret, "Modal.CreateSecret", (environment?: Environment) => Effect.Effect<SecretsClient>> {
93
+ }
94
+ export declare const CreateSecret: CreateSecret;
95
+ //# sourceMappingURL=CreateSecret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSecret.d.ts","sources":["../src/CreateSecret.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,uEAAuE;AACvE,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC;;;;OAIG;IACH,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GACtD,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,sFAAsF;IACtF,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,GAAG,SAAS,EAAE,OAAO,CAAC,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,2DAA2D;IAC3D,MAAM,CACJ,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,CACd,IAAI,EACF,OAAO,CAAC,OAAO,YAAY,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC,EAC7E,CAAC,CACF,CAAC;IACF,gDAAgD;IAChD,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;CAC9E;AAED,iEAAiE;AACjE,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,MAAM,WAAW,YAAa,SAAQ,OAAO,CAAC,OAAO,CACnD,YAAY,EACZ,oBAAoB,EACpB,CAAC,WAAW,CAAC,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAC5D;CAAG;AAEJ,eAAO,MAAM,YAAY,cAAsD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ export const CreateSecret = Binding.Service("Modal.CreateSecret");
3
+ //# sourceMappingURL=CreateSecret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSecret.js","sources":["../src/CreateSecret.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AA4G3C,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAe,oBAAoB,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import * as secret from "@distilled.cloud/modal/secret";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import { CreateSecret, type SecretsClientOf } from "./CreateSecret.ts";
5
+ import { type RuntimeOwner } from "./RuntimeOwner.ts";
6
+ /** The operations the client calls, resolved by `ModalBindings.withCredentials`. */
7
+ export declare const SecretsOps: Effect.Effect<{
8
+ readonly getOrCreate: (input: secret.SecretGetOrCreateRequest) => Effect.Effect<secret.SecretGetOrCreateResponse, secret.SecretGetOrCreateError, never>;
9
+ readonly delete: (input: secret.DeleteSecretRequest) => Effect.Effect<secret.DeleteSecretResponse, secret.DeleteSecretError, never>;
10
+ readonly list: import("@distilled.cloud/core/api").PaginatedCall<secret.ListSecretRequest, secret.ListSecretResponse, secret.ListSecretError, never, secret.SecretListItem>;
11
+ }, never, import("./internal.ts").OperationServices>;
12
+ export type SecretsOps = Effect.Success<typeof SecretsOps>;
13
+ /** A secrets client over an environment name resolved per call. */
14
+ export declare const makeSecretsClient: (environment: Effect.Effect<string | undefined>, ops: SecretsOps, owner?: Effect.Effect<RuntimeOwner | undefined>) => SecretsClientOf<never>;
15
+ /**
16
+ * {@link CreateSecret} over Modal's API. Grants the host's identity (a scoped
17
+ * `Modal.ServiceUser`) the `contributor` role on the environment.
18
+ *
19
+ * @layer
20
+ * @product Secret
21
+ * @provides Modal.CreateSecret
22
+ */
23
+ export declare const CreateSecretHttp: Layer.Layer<CreateSecret, never, never>;
24
+ //# sourceMappingURL=CreateSecretHttp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSecretHttp.d.ts","sources":["../src/CreateSecretHttp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAa,KAAK,YAAY,EAA+B,MAAM,mBAAmB,CAAC;AAG9F,oFAAoF;AACpF,eAAO,MAAM,UAAU;;;;oDAIrB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,UAAU,CAAC,CAAC;AAE3D,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,gBACf,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,OACzC,UAAU,UACR,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,KAC7C,eAAe,CAAC,KAAK,CAmCtB,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,yCAa5B,CAAC"}
@@ -0,0 +1,60 @@
1
+ import * as secret from "@distilled.cloud/modal/secret";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import { makeOpenModalBinding } from "./BindingHttp.js";
5
+ import { CreateSecret } from "./CreateSecret.js";
6
+ import { environmentOf, listAll, operations } from "./internal.js";
7
+ import { ownedName, RuntimeOwnerOf, unownedName } from "./RuntimeOwner.js";
8
+ import { lookupSecret, putSecret } from "./Secret.js";
9
+ /** The operations the client calls, resolved by `ModalBindings.withCredentials`. */
10
+ export const SecretsOps = operations({
11
+ getOrCreate: secret.secretGetOrCreate,
12
+ delete: secret.deleteSecret,
13
+ list: secret.listSecret,
14
+ });
15
+ /** A secrets client over an environment name resolved per call. */
16
+ export const makeSecretsClient = (environment, ops, owner = Effect.undefined) => ({
17
+ put: (name, env) => Effect.flatMap(Effect.all([environment, owner]), ([e, stamp]) => putSecret(ops.getOrCreate, ownedName(stamp, name), e, env)),
18
+ get: (name) => Effect.flatMap(Effect.all([environment, owner]), ([e, stamp]) => lookupSecret(ops.getOrCreate, ownedName(stamp, name), e)),
19
+ delete: (name) => Effect.gen(function* () {
20
+ const env = yield* environment;
21
+ const found = yield* lookupSecret(ops.getOrCreate, ownedName(yield* owner, name), env);
22
+ if (!found)
23
+ return;
24
+ yield* ops
25
+ .delete({ secretId: found.secretId })
26
+ .pipe(Effect.catchTag("SecretNotFound", () => Effect.void));
27
+ }),
28
+ list: () => Effect.gen(function* () {
29
+ const env = yield* environment;
30
+ const stamp = yield* owner;
31
+ const items = yield* listAll((pagination) => ops
32
+ .list({ environmentName: environmentOf(env), pagination })
33
+ .pipe(Effect.map((response) => response.items ?? [])), (item) => item.createdAt);
34
+ return items.flatMap((item) => {
35
+ const name = item.label ?? item.metadata?.name;
36
+ const own = name ? unownedName(stamp, name) : undefined;
37
+ return own ? [own] : [];
38
+ });
39
+ }),
40
+ });
41
+ /**
42
+ * {@link CreateSecret} over Modal's API. Grants the host's identity (a scoped
43
+ * `Modal.ServiceUser`) the `contributor` role on the environment.
44
+ *
45
+ * @layer
46
+ * @product Secret
47
+ * @provides Modal.CreateSecret
48
+ */
49
+ export const CreateSecretHttp = Layer.effect(CreateSecret, makeOpenModalBinding({
50
+ tag: "Modal.CreateSecret",
51
+ operations: SecretsOps,
52
+ role: "contributor",
53
+ environmentOf: (environment) => environment?.name,
54
+ make: Effect.fn(function* (ops, environment) {
55
+ const name = environment ? yield* environment.name : Effect.undefined;
56
+ const owner = yield* RuntimeOwnerOf();
57
+ return makeSecretsClient(name, ops, owner);
58
+ }),
59
+ }));
60
+ //# sourceMappingURL=CreateSecretHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSecretHttp.js","sources":["../src/CreateSecretHttp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAwB,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,SAAS,EAAqB,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEtD,oFAAoF;AACpF,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC,iBAAiB;IACrC,MAAM,EAAE,MAAM,CAAC,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC,UAAU;CACxB,CAAC,CAAC;AAIH,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,WAA8C,EAC9C,GAAe,EACf,KAAK,GAA4C,MAAM,CAAC,SAAS,EACzC,EAAE,CAAC,CAAC;IAC5B,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CACjB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAC9D,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAC3D;IACH,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CACZ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAC9D,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CACzD;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACvF,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,KAAK,CAAC,CAAC,GAAG;aACP,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;aACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC;IACJ,IAAI,EAAE,GAAG,EAAE,CACT,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAC1B,CAAC,UAAU,EAAE,EAAE,CACb,GAAG;aACA,IAAI,CAAC,EAAE,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC;aACzD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EACzD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CACzB,CAAC;QACF,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxD,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;CACL,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAC1C,YAAY,EACZ,oBAAoB,CAAC;IACnB,GAAG,EAAE,oBAAoB;IACzB,UAAU,EAAE,UAAU;IACtB,IAAI,EAAE,aAAa;IACnB,aAAa,EAAE,CAAC,WAAyB,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI;IAC/D,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,WAAyB;QACvD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;QACtE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC;QACtC,OAAO,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC;CACH,CAAC,CACH,CAAC"}
@@ -0,0 +1,84 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
3
+ import type * as Effect from "effect/Effect";
4
+ import type { VolumesOps } from "./CreateVolumeHttp.ts";
5
+ import type { Environment } from "./Environment.ts";
6
+ import type { ErrorOf, OpError } from "./internal.ts";
7
+ import type { ensureVolume, lookupVolume } from "./Volume.ts";
8
+ import type { VolumeAttributes } from "./Volume.ts";
9
+ import type { ReadWriteVolumeClient } from "./VolumeClient.ts";
10
+ /** A volume created or found at runtime: its attributes plus a read-write client. */
11
+ export interface VolumeHandle extends ReadWriteVolumeClient {
12
+ readonly volumeId: Effect.Effect<string>;
13
+ readonly name: string;
14
+ /** The attributes, to pass where a `Modal.Volume` is accepted (e.g. sandbox mounts). */
15
+ readonly attributes: VolumeAttributes;
16
+ }
17
+ /** Get, create, list and delete volumes by name in one environment. */
18
+ export interface VolumesClientOf<R> {
19
+ /** The volume named `name`, created when missing (Modal's own get-or-create). */
20
+ getOrCreate(name: string): Effect.Effect<VolumeHandle, ErrorOf<typeof ensureVolume>, R>;
21
+ /** The volume named `name`, or `undefined`. */
22
+ get(name: string): Effect.Effect<VolumeHandle | undefined, ErrorOf<typeof lookupVolume>, R>;
23
+ /** Delete the volume named `name` (no-op when missing). */
24
+ delete(name: string): Effect.Effect<void, ErrorOf<typeof lookupVolume> | Exclude<OpError<VolumesOps, "delete">, {
25
+ readonly _tag: "VolumeNotFound";
26
+ }>, R>;
27
+ /** Names of every volume in the environment. */
28
+ list(): Effect.Effect<ReadonlyArray<string>, OpError<VolumesOps, "list">, R>;
29
+ }
30
+ /** A VolumesClient whose calls run inside a deployed runtime. */
31
+ export type VolumesClient = VolumesClientOf<RuntimeContext>;
32
+ /**
33
+ * Create volumes by name at runtime: one per user, session or task.
34
+ * Modal's native shape is get-or-create by name, so `getOrCreate` is
35
+ * idempotent and safe to call on every request.
36
+ *
37
+ * Bind it to a `Modal.Environment` to keep these runtime objects in their
38
+ * own namespace (or to nothing, for the workspace's default environment).
39
+ * They aren't in Alchemy state: deleting the environment removes them.
40
+ *
41
+ * Objects created at run time are tagged with the stack, stage and binding
42
+ * (`alchemy::stack`, `alchemy::stage`, `alchemy::id`) and are not deleted when
43
+ * the stack is destroyed. A Modal volume has only a name, so the tags become
44
+ * its name prefix, `Modal.runtimePrefix({ stack, stage, id })`: list them
45
+ * with `modal volume list` and delete the ones whose name starts with it.
46
+ *
47
+ * ### One volume per user
48
+ * **Example:** From a Cloudflare Worker
49
+ * ```typescript
50
+ * import * as Cloudflare from "@alchemy.run/cloudflare";
51
+ * import * as Modal from "@alchemy.run/modal";
52
+ * import * as Effect from "effect/Effect";
53
+ * import * as Layer from "effect/Layer";
54
+ * import { HttpServerRequest } from "effect/http/HttpServerRequest";
55
+ * import * as HttpServerResponse from "effect/http/HttpServerResponse";
56
+ * import { Agents, Coder } from "./Coder.ts";
57
+ *
58
+ * export default class Api extends Cloudflare.Worker<Api>()(
59
+ * "Api",
60
+ * { main: import.meta.url },
61
+ * Effect.gen(function* () {
62
+ * const volumes = yield* Modal.CreateVolume(Agents);
63
+ * const sandboxes = yield* Modal.CreateSandbox(Coder);
64
+ * return {
65
+ * fetch: Effect.gen(function* () {
66
+ * const request = yield* HttpServerRequest;
67
+ * const user = request.headers["x-user"] ?? "anonymous";
68
+ * const home = yield* volumes.getOrCreate(`user-${user}`);
69
+ * yield* home.writeFile("/notes.md", "hello");
70
+ * const sandbox = yield* sandboxes.create({ mounts: [{ volume: home, path: "/home/user" }] });
71
+ * return HttpServerResponse.text("ok");
72
+ * }).pipe(Effect.orDie),
73
+ * };
74
+ * }).pipe(Effect.provide(Layer.mergeAll(Modal.CreateVolumeHttp, Modal.CreateSandboxHttp))),
75
+ * ) {}
76
+ * ```
77
+ *
78
+ * @binding
79
+ * @product Volume
80
+ */
81
+ export interface CreateVolume extends Binding.Service<CreateVolume, "Modal.CreateVolume", (environment?: Environment) => Effect.Effect<VolumesClient>> {
82
+ }
83
+ export declare const CreateVolume: CreateVolume;
84
+ //# sourceMappingURL=CreateVolume.d.ts.map