@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
@@ -0,0 +1,53 @@
1
+ import type { VolumeGetFile2Error, VolumeListFiles2Error, VolumeRemoveFile2Error, VolumeCopyFiles2Error, VolumePutFiles2Error } from "@distilled.cloud/modal/volume";
2
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
3
+ import * as Effect from "effect/Effect";
4
+ import type { HttpClientError } from "effect/http/HttpClientError";
5
+ import { type VolumeFileEntry, type VolumeFileOps, type VolumeTransferError } from "./VolumeFiles.ts";
6
+ /** Errors reading a volume file: `VolumeFileNotFound` when the path is missing. */
7
+ export type ReadVolumeFileError = VolumeGetFile2Error | VolumeTransferError | HttpClientError;
8
+ /** Errors listing a volume directory. */
9
+ export type ListVolumeFilesError = VolumeListFiles2Error;
10
+ /** Errors removing or copying volume files. */
11
+ export type ChangeVolumeFilesError = VolumeRemoveFile2Error | VolumeCopyFiles2Error;
12
+ /** Errors writing a volume file. */
13
+ export type WriteVolumeFileError = VolumePutFiles2Error | VolumeTransferError | HttpClientError;
14
+ /** Read access to one volume's files. */
15
+ export interface ReadVolumeClient {
16
+ /** The volume's id. */
17
+ readonly volumeId: Effect.Effect<string>;
18
+ /** Read a file. */
19
+ readFile(path: string): Effect.Effect<Uint8Array, ReadVolumeFileError, RuntimeContext>;
20
+ /** Read a UTF-8 file. */
21
+ readFileString(path: string): Effect.Effect<string, ReadVolumeFileError, RuntimeContext>;
22
+ /** List a directory (`recursive` walks it). */
23
+ listFiles(path: string, options?: {
24
+ readonly recursive?: boolean;
25
+ }): Effect.Effect<ReadonlyArray<VolumeFileEntry>, ListVolumeFilesError, RuntimeContext>;
26
+ }
27
+ /** Write access to one volume's files. */
28
+ export interface WriteVolumeClient {
29
+ /** The volume's id. */
30
+ readonly volumeId: Effect.Effect<string>;
31
+ /** Write (create or replace) a file. */
32
+ writeFile(path: string, data: string | Uint8Array, options?: {
33
+ readonly mode?: number;
34
+ }): Effect.Effect<void, WriteVolumeFileError, RuntimeContext>;
35
+ /** Remove a file, or a directory with `recursive`. */
36
+ removeFile(path: string, options?: {
37
+ readonly recursive?: boolean;
38
+ }): Effect.Effect<void, ChangeVolumeFilesError, RuntimeContext>;
39
+ /** Copy files to `destination` inside the volume. */
40
+ copyFiles(sources: ReadonlyArray<string>, destination: string, options?: {
41
+ readonly recursive?: boolean;
42
+ }): Effect.Effect<void, ChangeVolumeFilesError, RuntimeContext>;
43
+ }
44
+ /** Read and write access to one volume's files. */
45
+ export interface ReadWriteVolumeClient extends ReadVolumeClient, WriteVolumeClient {
46
+ }
47
+ /** The read half of a volume client over `volumeId`. */
48
+ export declare const makeReadVolumeClient: (volumeId: Effect.Effect<string>, ops: VolumeFileOps) => ReadVolumeClient;
49
+ /** The write half of a volume client over `volumeId`. */
50
+ export declare const makeWriteVolumeClient: (volumeId: Effect.Effect<string>, ops: VolumeFileOps) => WriteVolumeClient;
51
+ /** A read-write volume client over `volumeId`. */
52
+ export declare const makeReadWriteVolumeClient: (volumeId: Effect.Effect<string>, ops: VolumeFileOps) => ReadWriteVolumeClient;
53
+ //# sourceMappingURL=VolumeClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeClient.d.ts","sources":["../src/VolumeClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { copyVolumeFiles, listVolumeFiles, readVolumeFile, removeVolumeFile, writeVolumeFile, } from "./VolumeFiles.js";
3
+ /** The read half of a volume client over `volumeId`. */
4
+ export const makeReadVolumeClient = (volumeId, ops) => ({
5
+ volumeId,
6
+ readFile: (path) => Effect.flatMap(volumeId, (id) => readVolumeFile(ops, id, path)),
7
+ readFileString: (path) => Effect.flatMap(volumeId, (id) => readVolumeFile(ops, id, path)).pipe(Effect.map((bytes) => new TextDecoder().decode(bytes))),
8
+ listFiles: (path, options) => Effect.flatMap(volumeId, (id) => listVolumeFiles(ops, id, path, options)),
9
+ });
10
+ /** The write half of a volume client over `volumeId`. */
11
+ export const makeWriteVolumeClient = (volumeId, ops) => ({
12
+ volumeId,
13
+ writeFile: (path, data, options) => Effect.flatMap(volumeId, (id) => writeVolumeFile(ops, id, path, data, options)),
14
+ removeFile: (path, options) => Effect.flatMap(volumeId, (id) => removeVolumeFile(ops, id, path, options)),
15
+ copyFiles: (sources, destination, options) => Effect.flatMap(volumeId, (id) => copyVolumeFiles(ops, id, sources, destination, options)),
16
+ });
17
+ /** A read-write volume client over `volumeId`. */
18
+ export const makeReadWriteVolumeClient = (volumeId, ops) => ({
19
+ ...makeReadVolumeClient(volumeId, ops),
20
+ ...makeWriteVolumeClient(volumeId, ops),
21
+ });
22
+ //# sourceMappingURL=VolumeClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeClient.js","sources":["../src/VolumeClient.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAIhB,MAAM,kBAAkB,CAAC;AAoD1B,wDAAwD;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAA+B,EAC/B,GAAkB,EACA,EAAE,CAAC,CAAC;IACtB,QAAQ;IACR,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACnF,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CACvB,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAClE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CACvD;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAC3B,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;CAC5E,CAAC,CAAC;AAEH,yDAAyD;AACzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAA+B,EAC/B,GAAkB,EACC,EAAE,CAAC,CAAC;IACvB,QAAQ;IACR,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CACjC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACjF,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAC5B,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,CAC3C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;CAC5F,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,QAA+B,EAC/B,GAAkB,EACK,EAAE,CAAC,CAAC;IAC3B,GAAG,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC;IACtC,GAAG,qBAAqB,CAAC,QAAQ,EAAE,GAAG,CAAC;CACxC,CAAC,CAAC"}
@@ -0,0 +1,94 @@
1
+ import * as volume from "@distilled.cloud/modal/volume";
2
+ import * as Effect from "effect/Effect";
3
+ import * as HttpClient from "effect/http/HttpClient";
4
+ declare const VolumeTransferError_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 & {
5
+ readonly _tag: "Modal.VolumeTransferError";
6
+ } & Readonly<A>;
7
+ /** A block upload or download to a URL Modal handed out failed. */
8
+ export declare class VolumeTransferError extends VolumeTransferError_base<{
9
+ readonly path: string;
10
+ readonly message: string;
11
+ }> {
12
+ }
13
+ /** One entry of a volume directory listing. */
14
+ export interface VolumeFileEntry {
15
+ /** Path relative to the volume root. */
16
+ readonly path: string;
17
+ readonly type: "file" | "directory" | "symlink" | "other";
18
+ /** Size in bytes (files). */
19
+ readonly size: number;
20
+ /** Modification time, seconds since the epoch. */
21
+ readonly mtime: number;
22
+ }
23
+ /** The operations a volume's files need, resolved by `ModalBindings.withCredentials`. */
24
+ export declare const VolumeFileOps: Effect.Effect<{
25
+ readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
26
+ readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
27
+ readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
28
+ readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
29
+ readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
30
+ readonly http: HttpClient.HttpClient;
31
+ }, never, import("./internal.ts").OperationServices>;
32
+ export type VolumeFileOps = Effect.Success<typeof VolumeFileOps>;
33
+ /**
34
+ * Read a file from a (v2) volume: Modal returns presigned URLs for the
35
+ * file's blocks, which are fetched and concatenated.
36
+ */
37
+ export declare const readVolumeFile: (ops: {
38
+ readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
39
+ readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
40
+ readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
41
+ readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
42
+ readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
43
+ readonly http: HttpClient.HttpClient;
44
+ }, volumeId: string, path: string) => Effect.Effect<Uint8Array<ArrayBuffer>, VolumeTransferError | volume.VolumeGetFile2Error, never>;
45
+ /** List a directory of a (v2) volume. */
46
+ export declare const listVolumeFiles: (ops: {
47
+ readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
48
+ readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
49
+ readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
50
+ readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
51
+ readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
52
+ readonly http: HttpClient.HttpClient;
53
+ }, volumeId: string, path: string, options?: {
54
+ readonly recursive?: boolean;
55
+ } | undefined) => Effect.Effect<VolumeFileEntry[], volume.VolumeListFiles2Error, never>;
56
+ /**
57
+ * Write a file to a (v2) volume: send each 8 MiB block's SHA-256, upload
58
+ * the blocks Modal reports missing to the URLs it returns, then commit with
59
+ * the upload responses.
60
+ */
61
+ export declare const writeVolumeFile: (ops: {
62
+ readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
63
+ readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
64
+ readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
65
+ readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
66
+ readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
67
+ readonly http: HttpClient.HttpClient;
68
+ }, volumeId: string, path: string, data: string | Uint8Array<ArrayBufferLike>, options?: {
69
+ readonly mode?: number;
70
+ } | undefined) => Effect.Effect<undefined, VolumeTransferError | volume.VolumePutFiles2Error, never>;
71
+ /** Remove a file (or, with `recursive`, a directory) from a (v2) volume. */
72
+ export declare const removeVolumeFile: (ops: {
73
+ readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
74
+ readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
75
+ readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
76
+ readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
77
+ readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
78
+ readonly http: HttpClient.HttpClient;
79
+ }, volumeId: string, path: string, options?: {
80
+ readonly recursive?: boolean;
81
+ } | undefined) => Effect.Effect<void, volume.VolumeRemoveFile2Error, never>;
82
+ /** Copy files inside a (v2) volume. */
83
+ export declare const copyVolumeFiles: (ops: {
84
+ readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
85
+ readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
86
+ readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
87
+ readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
88
+ readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
89
+ readonly http: HttpClient.HttpClient;
90
+ }, volumeId: string, sources: readonly string[], destination: string, options?: {
91
+ readonly recursive?: boolean;
92
+ } | undefined) => Effect.Effect<void, volume.VolumeCopyFiles2Error, never>;
93
+ export {};
94
+ //# sourceMappingURL=VolumeFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeFiles.d.ts","sources":["../src/VolumeFiles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAC;AAExD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;;;;AAIrD,mEAAmE;AACnE,qBAAa,mBAAoB,SAAQ,yBAA8C;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1D,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAID,yFAAyF;AACzF,eAAO,MAAM,aAAa;;;;;;;oDAOxB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,aAAa,CAAC,CAAC;AAcjE;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;qIAwBzB,CAAC;AAEH,yCAAyC;AACzC,eAAO,MAAM,eAAe;;;;;;;;yBAIM,OAAO;uFAevC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;oBAKC,MAAM;oGAsDjC,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB;;;;;;;;yBAIK,OAAO;2EAGvC,CAAC;AAEH,uCAAuC;AACvC,eAAO,MAAM,eAAe;;;;;;;;yBAKM,OAAO;0EAQvC,CAAC"}
@@ -0,0 +1,139 @@
1
+ import { createHash } from "node:crypto";
2
+ import * as volume from "@distilled.cloud/modal/volume";
3
+ import * as Data from "effect/Data";
4
+ import * as Effect from "effect/Effect";
5
+ import * as HttpClient from "effect/http/HttpClient";
6
+ import * as HttpClientRequest from "effect/http/HttpClientRequest";
7
+ import { operations } from "./internal.js";
8
+ /** A block upload or download to a URL Modal handed out failed. */
9
+ export class VolumeTransferError extends Data.TaggedError("Modal.VolumeTransferError") {
10
+ }
11
+ const BLOCK_SIZE = 8 * 1024 * 1024;
12
+ /** The operations a volume's files need, resolved by `ModalBindings.withCredentials`. */
13
+ export const VolumeFileOps = operations({
14
+ getFile: volume.volumeGetFile2,
15
+ listFiles: volume.volumeListFiles2,
16
+ putFiles: volume.volumePutFiles2,
17
+ removeFile: volume.volumeRemoveFile2,
18
+ copyFiles: volume.volumeCopyFiles2,
19
+ http: HttpClient.HttpClient,
20
+ });
21
+ const typeOf = (type) => type === "FILE"
22
+ ? "file"
23
+ : type === "DIRECTORY"
24
+ ? "directory"
25
+ : type === "SYMLINK"
26
+ ? "symlink"
27
+ : "other";
28
+ const toBytes = (data) => Effect.sync(() => (typeof data === "string" ? new TextEncoder().encode(data) : data));
29
+ /**
30
+ * Read a file from a (v2) volume: Modal returns presigned URLs for the
31
+ * file's blocks, which are fetched and concatenated.
32
+ */
33
+ export const readVolumeFile = Effect.fn(function* (ops, volumeId, path) {
34
+ const { getUrls, size } = yield* ops.getFile({ volumeId, path });
35
+ const total = Number(size ?? 0);
36
+ const out = new Uint8Array(total);
37
+ let offset = 0;
38
+ for (const url of getUrls ?? []) {
39
+ // A presigned block URL returned by VolumeGetFile2 (allowed raw HTTP).
40
+ const response = yield* ops.http.execute(HttpClientRequest.get(url));
41
+ if (response.status >= 300) {
42
+ return yield* new VolumeTransferError({
43
+ path,
44
+ message: `Downloading a block of ${path} failed with HTTP ${response.status}`,
45
+ });
46
+ }
47
+ const buffer = yield* response.arrayBuffer;
48
+ const block = new Uint8Array(buffer);
49
+ out.set(block.subarray(0, Math.max(0, total - offset)), offset);
50
+ offset += Math.min(block.length, BLOCK_SIZE);
51
+ }
52
+ return out;
53
+ });
54
+ /** List a directory of a (v2) volume. */
55
+ export const listVolumeFiles = Effect.fn(function* (ops, volumeId, path, options = {}) {
56
+ const { items } = yield* ops.listFiles({
57
+ volumeId,
58
+ path,
59
+ recursive: options.recursive ?? false,
60
+ });
61
+ return items.flatMap((batch) => (batch.entries ?? []).map((entry) => ({
62
+ path: entry.path ?? "",
63
+ type: typeOf(entry.type),
64
+ size: Number(entry.size ?? 0),
65
+ mtime: Number(entry.mtime ?? 0),
66
+ })));
67
+ });
68
+ /**
69
+ * Write a file to a (v2) volume: send each 8 MiB block's SHA-256, upload
70
+ * the blocks Modal reports missing to the URLs it returns, then commit with
71
+ * the upload responses.
72
+ */
73
+ export const writeVolumeFile = Effect.fn(function* (ops, volumeId, path, data, options = {}) {
74
+ const bytes = yield* toBytes(data);
75
+ const blocks = yield* Effect.sync(() => {
76
+ const out = [];
77
+ for (let offset = 0; offset === 0 || offset < bytes.length; offset += BLOCK_SIZE) {
78
+ const block = bytes.subarray(offset, offset + BLOCK_SIZE);
79
+ out.push({ data: block, sha256: createHash("sha256").update(block).digest("base64") });
80
+ if (bytes.length === 0)
81
+ break;
82
+ }
83
+ return out;
84
+ });
85
+ const putResponses = new Map();
86
+ for (let round = 0; round < 3; round++) {
87
+ const { missingBlocks } = yield* ops.putFiles({
88
+ volumeId,
89
+ files: [
90
+ {
91
+ path,
92
+ size: String(bytes.length),
93
+ mode: options.mode ?? 0o644,
94
+ blocks: blocks.map((block, index) => ({
95
+ contentsSha256: block.sha256,
96
+ putResponse: putResponses.get(index),
97
+ })),
98
+ },
99
+ ],
100
+ });
101
+ if (!missingBlocks || missingBlocks.length === 0)
102
+ return;
103
+ for (const missing of missingBlocks) {
104
+ const index = Number(missing.blockIndex ?? 0);
105
+ const block = blocks[index];
106
+ if (!block || !missing.putUrl)
107
+ continue;
108
+ // A presigned block URL returned by VolumePutFiles2 (allowed raw HTTP).
109
+ const response = yield* ops.http.execute(HttpClientRequest.put(missing.putUrl).pipe(HttpClientRequest.bodyUint8Array(block.data, "application/octet-stream")));
110
+ if (response.status >= 300) {
111
+ return yield* new VolumeTransferError({
112
+ path,
113
+ message: `Uploading block ${index} of ${path} failed with HTTP ${response.status}`,
114
+ });
115
+ }
116
+ const body = yield* response.arrayBuffer;
117
+ const encoded = yield* Effect.sync(() => Buffer.from(body).toString("base64"));
118
+ putResponses.set(index, encoded);
119
+ }
120
+ }
121
+ return yield* new VolumeTransferError({
122
+ path,
123
+ message: `Modal kept reporting blocks of ${path} missing after upload`,
124
+ });
125
+ });
126
+ /** Remove a file (or, with `recursive`, a directory) from a (v2) volume. */
127
+ export const removeVolumeFile = Effect.fn(function* (ops, volumeId, path, options = {}) {
128
+ yield* ops.removeFile({ volumeId, path, recursive: options.recursive ?? false });
129
+ });
130
+ /** Copy files inside a (v2) volume. */
131
+ export const copyVolumeFiles = Effect.fn(function* (ops, volumeId, sources, destination, options = {}) {
132
+ yield* ops.copyFiles({
133
+ volumeId,
134
+ srcPaths: [...sources],
135
+ dstPath: destination,
136
+ recursive: options.recursive ?? false,
137
+ });
138
+ });
139
+ //# sourceMappingURL=VolumeFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeFiles.js","sources":["../src/VolumeFiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import * as environment from "@distilled.cloud/modal/environment";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Redacted from "effect/Redacted";
6
+ import type { Providers } from "./Providers.ts";
7
+ declare const WebhookTokenUnexpectedResponse_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.WebhookTokenUnexpectedResponse";
9
+ } & Readonly<A>;
10
+ export declare class WebhookTokenUnexpectedResponse extends WebhookTokenUnexpectedResponse_base<{
11
+ readonly message: string;
12
+ }> {
13
+ }
14
+ export interface WebhookTokenProps {
15
+ /**
16
+ * Display name of the token. If omitted, one is generated from the stack,
17
+ * stage and logical ID. Changing it renames the token in place.
18
+ */
19
+ name?: string;
20
+ /**
21
+ * Limit the token to the environments in {@link environments}. Changing it
22
+ * replaces the token (and its secret).
23
+ * @default false
24
+ */
25
+ scoped?: boolean;
26
+ /**
27
+ * Environments a scoped token works in: environment IDs, or yielded
28
+ * `Modal.Environment`s. Ignored unless {@link scoped} is set.
29
+ */
30
+ environments?: Array<string | {
31
+ readonly environmentId: string;
32
+ }>;
33
+ }
34
+ export interface WebhookTokenAttributes {
35
+ /** Token ID (`wk-…`), sent as the `Modal-Key` header. */
36
+ tokenId: string;
37
+ /** Token secret (`ws-…`), sent as the `Modal-Secret` header. */
38
+ tokenSecret: Redacted.Redacted<string>;
39
+ /** Display name. */
40
+ name: string;
41
+ /** Whether the token is limited to {@link WebhookTokenProps.environments}. */
42
+ scoped: boolean;
43
+ /** Environment IDs a scoped token works in. */
44
+ environments: string[];
45
+ }
46
+ /**
47
+ * A Modal proxy auth token: the `Modal-Key` / `Modal-Secret` header pair
48
+ * that web endpoints and sandbox tunnels created with proxy authentication
49
+ * require. A scoped token works only in the environments it lists.
50
+ *
51
+ * Modal shows a token's secret once, at creation, so a token deleted outside
52
+ * Alchemy is recreated with a new secret on the next deploy. Tokens have no
53
+ * unique names, so they can't be adopted and aren't listed for
54
+ * `alchemy nuke`.
55
+ *
56
+ * ### Creating a token
57
+ * **Example:** A workspace-wide token
58
+ * ```typescript
59
+ * import * as Modal from "@alchemy.run/modal";
60
+ *
61
+ * export const Caller = Modal.WebhookToken("Caller", {});
62
+ * ```
63
+ *
64
+ * **Example:** A token scoped to one environment
65
+ * ```typescript
66
+ * import * as Modal from "@alchemy.run/modal";
67
+ *
68
+ * export const Agents = Modal.Environment("Agents", {});
69
+ * export const AgentsCaller = Modal.WebhookToken("AgentsCaller", {
70
+ * scoped: true,
71
+ * environments: [Agents],
72
+ * });
73
+ * ```
74
+ *
75
+ * ### Calling a protected endpoint
76
+ * **Example:** Send the header pair
77
+ * ```typescript
78
+ * const token = yield* AgentsCaller;
79
+ * const response = yield* HttpClient.get(url, {
80
+ * headers: {
81
+ * "Modal-Key": token.tokenId,
82
+ * "Modal-Secret": Redacted.value(token.tokenSecret),
83
+ * },
84
+ * });
85
+ * ```
86
+ *
87
+ * @resource
88
+ * @product WebhookToken
89
+ */
90
+ export declare const WebhookToken: import("alchemy/Resource").ResourceConstructor<WebhookToken, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<WebhookToken, never>, never, never> & {
91
+ Self: import("alchemy/Self").Self<WebhookToken>;
92
+ Provider: Provider.Provider<WebhookToken>;
93
+ Aliases: readonly string[] | undefined;
94
+ ref(id: string, options?: {
95
+ stage?: string;
96
+ stack?: string;
97
+ }): Effect.Effect<WebhookToken, never, never>;
98
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<WebhookTokenProps>) => Effect.Effect<WebhookToken, never, Providers>);
99
+ export type WebhookToken = Resource<"Modal.WebhookToken", WebhookTokenProps, WebhookTokenAttributes, never, Providers>;
100
+ export declare const WebhookTokenProvider: () => import("effect/Layer").Layer<Provider.Provider<WebhookToken>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | environment.ModalOpContext>;
101
+ export {};
102
+ //# sourceMappingURL=WebhookToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookToken.d.ts","sources":["../src/WebhookToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,oCAAoC,CAAC;AAGlE,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;;;;AAEhD,qBAAa,8BAA+B,SAAQ,oCAElD;IACA,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,MAAM,EAAE,OAAO,CAAC;IAChB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,YAAY;;;;;;;;6IAExB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,CACjC,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,EACL,SAAS,CACV,CAAC;AAEF,eAAO,MAAM,oBAAoB,wKA2H9B,CAAC"}
@@ -0,0 +1,176 @@
1
+ import * as environment from "@distilled.cloud/modal/environment";
2
+ import * as webhook from "@distilled.cloud/modal/webhook";
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 * as Redacted from "effect/Redacted";
9
+ import { objectName } from "./internal.js";
10
+ import { declarable } from "./internal/Declared.js";
11
+ export class WebhookTokenUnexpectedResponse extends Data.TaggedError("Modal.WebhookTokenUnexpectedResponse") {
12
+ }
13
+ /**
14
+ * A Modal proxy auth token: the `Modal-Key` / `Modal-Secret` header pair
15
+ * that web endpoints and sandbox tunnels created with proxy authentication
16
+ * require. A scoped token works only in the environments it lists.
17
+ *
18
+ * Modal shows a token's secret once, at creation, so a token deleted outside
19
+ * Alchemy is recreated with a new secret on the next deploy. Tokens have no
20
+ * unique names, so they can't be adopted and aren't listed for
21
+ * `alchemy nuke`.
22
+ *
23
+ * ### Creating a token
24
+ * **Example:** A workspace-wide token
25
+ * ```typescript
26
+ * import * as Modal from "@alchemy.run/modal";
27
+ *
28
+ * export const Caller = Modal.WebhookToken("Caller", {});
29
+ * ```
30
+ *
31
+ * **Example:** A token scoped to one environment
32
+ * ```typescript
33
+ * import * as Modal from "@alchemy.run/modal";
34
+ *
35
+ * export const Agents = Modal.Environment("Agents", {});
36
+ * export const AgentsCaller = Modal.WebhookToken("AgentsCaller", {
37
+ * scoped: true,
38
+ * environments: [Agents],
39
+ * });
40
+ * ```
41
+ *
42
+ * ### Calling a protected endpoint
43
+ * **Example:** Send the header pair
44
+ * ```typescript
45
+ * const token = yield* AgentsCaller;
46
+ * const response = yield* HttpClient.get(url, {
47
+ * headers: {
48
+ * "Modal-Key": token.tokenId,
49
+ * "Modal-Secret": Redacted.value(token.tokenSecret),
50
+ * },
51
+ * });
52
+ * ```
53
+ *
54
+ * @resource
55
+ * @product WebhookToken
56
+ */
57
+ export const WebhookToken = declarable()(Resource("Modal.WebhookToken"));
58
+ export const WebhookTokenProvider = () => Provider.effect(WebhookToken, Effect.gen(function* () {
59
+ const observe = Effect.fn(function* (tokenId) {
60
+ const { tokens } = yield* webhook.listWebhookToken({});
61
+ return (tokens ?? []).find((token) => token.tokenId === tokenId);
62
+ });
63
+ return {
64
+ stables: ["tokenId", "tokenSecret", "scoped"],
65
+ diff: Effect.fn(function* ({ news, olds }) {
66
+ if (!isResolved(news))
67
+ return undefined;
68
+ if ((news.scoped ?? false) !== (olds?.scoped ?? false)) {
69
+ return { action: "replace" };
70
+ }
71
+ return undefined;
72
+ }),
73
+ read: Effect.fn(function* ({ output }) {
74
+ if (output === undefined)
75
+ return undefined;
76
+ const found = yield* observe(output.tokenId);
77
+ if (!found)
78
+ return undefined;
79
+ return { ...output, name: found.name ?? output.name, scoped: found.scoped ?? false };
80
+ }),
81
+ reconcile: Effect.fn(function* ({ id, news, output, session }) {
82
+ const name = yield* objectName(id, news.name);
83
+ const scoped = news.scoped ?? false;
84
+ // Observe: only a token we created (its secret is in state) can be kept.
85
+ const found = output !== undefined ? yield* observe(output.tokenId) : undefined;
86
+ let current;
87
+ if (found && output) {
88
+ current = { ...output, name: found.name ?? output.name };
89
+ }
90
+ else {
91
+ // A token under our generated name that state doesn't hold is
92
+ // left from a create that failed before state was saved; its
93
+ // secret is lost, so replace it.
94
+ if (news.name === undefined) {
95
+ const { tokens } = yield* webhook.listWebhookToken({});
96
+ for (const stale of (tokens ?? []).filter((t) => t.name === name)) {
97
+ if (!stale.tokenId)
98
+ continue;
99
+ yield* webhook
100
+ .deleteWebhookToken({ tokenId: stale.tokenId })
101
+ .pipe(Effect.catchTag("WebhookTokenNotFound", () => Effect.void));
102
+ }
103
+ }
104
+ // Ensure
105
+ yield* session.note(`Creating webhook token ${name}...`);
106
+ const created = yield* webhook.createWebhookToken({ name, scoped });
107
+ if (!created.tokenId || created.tokenSecret === undefined) {
108
+ return yield* new WebhookTokenUnexpectedResponse({
109
+ message: `Modal returned no token for ${name}`,
110
+ });
111
+ }
112
+ current = {
113
+ tokenId: created.tokenId,
114
+ tokenSecret: Redacted.isRedacted(created.tokenSecret)
115
+ ? created.tokenSecret
116
+ : Redacted.make(created.tokenSecret),
117
+ name,
118
+ scoped,
119
+ environments: [],
120
+ };
121
+ }
122
+ // Sync the name.
123
+ if (current.name !== name) {
124
+ yield* webhook.updateWebhookToken({ tokenId: current.tokenId, name });
125
+ current = { ...current, name };
126
+ }
127
+ // Sync environments against the observed set.
128
+ if (scoped) {
129
+ // Modal doesn't serve `WebhookTokenEnvironmentList`, so read the
130
+ // token's environments from each environment's token list.
131
+ const { items } = yield* environment.listEnvironment({});
132
+ const observed = new Set();
133
+ for (const env of items ?? []) {
134
+ if (!env.environmentId || !env.name)
135
+ continue;
136
+ // An environment deleted since the list holds no tokens.
137
+ const { tokens } = yield* webhook
138
+ .webhookTokenListForEnvironment({ environmentName: env.name })
139
+ .pipe(Effect.catchTag("EnvironmentNotFound", () => Effect.succeed({ tokens: [] })));
140
+ if ((tokens ?? []).some((token) => token.tokenId === current.tokenId)) {
141
+ observed.add(env.environmentId);
142
+ }
143
+ }
144
+ const desired = new Set((news.environments ?? []).flatMap((env) => typeof env === "string"
145
+ ? [env]
146
+ : typeof env === "object" && env !== null && "environmentId" in env
147
+ ? [env.environmentId]
148
+ : []));
149
+ for (const environmentId of desired) {
150
+ if (!observed.has(environmentId)) {
151
+ yield* webhook.addWebhookTokenEnvironment({
152
+ tokenId: current.tokenId,
153
+ environmentId,
154
+ });
155
+ }
156
+ }
157
+ for (const environmentId of observed) {
158
+ if (!desired.has(environmentId)) {
159
+ yield* webhook.removeWebhookTokenEnvironment({
160
+ tokenId: current.tokenId,
161
+ environmentId,
162
+ });
163
+ }
164
+ }
165
+ current = { ...current, environments: [...desired] };
166
+ }
167
+ return current;
168
+ }),
169
+ delete: Effect.fn(function* ({ output }) {
170
+ yield* webhook
171
+ .deleteWebhookToken({ tokenId: output.tokenId })
172
+ .pipe(Effect.catchTag("WebhookTokenNotFound", () => Effect.void));
173
+ }),
174
+ };
175
+ }));
176
+ //# sourceMappingURL=WebhookToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookToken.js","sources":["../src/WebhookToken.ts"],"names":[],"mappings":"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"}