alchemy 2.0.0-beta.37 → 2.0.0-beta.39

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 (640) hide show
  1. package/bin/exec.js +488 -69
  2. package/bin/exec.js.map +1 -1
  3. package/lib/AWS/AutoScaling/LaunchTemplate.d.ts +1 -1
  4. package/lib/AWS/CloudWatch/common.d.ts +1 -1
  5. package/lib/AWS/Credentials.d.ts.map +1 -1
  6. package/lib/AWS/Credentials.js +1 -2
  7. package/lib/AWS/Credentials.js.map +1 -1
  8. package/lib/AWS/DynamoDB/Stream.d.ts.map +1 -1
  9. package/lib/AWS/DynamoDB/Stream.js +1 -1
  10. package/lib/AWS/DynamoDB/Stream.js.map +1 -1
  11. package/lib/AWS/EC2/Instance.d.ts +1 -1
  12. package/lib/AWS/EC2/hosted.d.ts +1 -1
  13. package/lib/AWS/EC2/hosted.d.ts.map +1 -1
  14. package/lib/AWS/EC2/hosted.js +3 -5
  15. package/lib/AWS/EC2/hosted.js.map +1 -1
  16. package/lib/AWS/ECS/Task.d.ts +1 -1
  17. package/lib/AWS/ECS/Task.d.ts.map +1 -1
  18. package/lib/AWS/ECS/Task.js +3 -5
  19. package/lib/AWS/ECS/Task.js.map +1 -1
  20. package/lib/AWS/Endpoint.d.ts.map +1 -1
  21. package/lib/AWS/Endpoint.js +1 -2
  22. package/lib/AWS/Endpoint.js.map +1 -1
  23. package/lib/AWS/Environment.d.ts +2 -2
  24. package/lib/AWS/EventBridge/EventSource.d.ts.map +1 -1
  25. package/lib/AWS/EventBridge/EventSource.js +1 -1
  26. package/lib/AWS/EventBridge/EventSource.js.map +1 -1
  27. package/lib/AWS/Kinesis/StreamEventSource.d.ts.map +1 -1
  28. package/lib/AWS/Kinesis/StreamEventSource.js +1 -1
  29. package/lib/AWS/Kinesis/StreamEventSource.js.map +1 -1
  30. package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
  31. package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
  32. package/lib/AWS/Lambda/Function.d.ts +1 -1
  33. package/lib/AWS/Lambda/Function.d.ts.map +1 -1
  34. package/lib/AWS/Lambda/Function.js +7 -11
  35. package/lib/AWS/Lambda/Function.js.map +1 -1
  36. package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
  37. package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
  38. package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
  39. package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
  40. package/lib/AWS/Organizations/common.d.ts +1 -1
  41. package/lib/AWS/Providers.d.ts.map +1 -1
  42. package/lib/AWS/Providers.js +21 -3
  43. package/lib/AWS/Providers.js.map +1 -1
  44. package/lib/AWS/Region.d.ts +1 -1
  45. package/lib/AWS/Region.d.ts.map +1 -1
  46. package/lib/AWS/Region.js +2 -3
  47. package/lib/AWS/Region.js.map +1 -1
  48. package/lib/AWS/S3/Bucket.d.ts.map +1 -1
  49. package/lib/AWS/S3/Bucket.js +5 -2
  50. package/lib/AWS/S3/Bucket.js.map +1 -1
  51. package/lib/AWS/S3/BucketNotifications.d.ts.map +1 -1
  52. package/lib/AWS/S3/BucketNotifications.js +1 -1
  53. package/lib/AWS/S3/BucketNotifications.js.map +1 -1
  54. package/lib/AWS/SNS/TopicEventSource.d.ts.map +1 -1
  55. package/lib/AWS/SNS/TopicEventSource.js +1 -1
  56. package/lib/AWS/SNS/TopicEventSource.js.map +1 -1
  57. package/lib/AWS/SQS/Queue.d.ts.map +1 -1
  58. package/lib/AWS/SQS/Queue.js +23 -5
  59. package/lib/AWS/SQS/Queue.js.map +1 -1
  60. package/lib/Action.d.ts +77 -0
  61. package/lib/Action.d.ts.map +1 -0
  62. package/lib/Action.js +89 -0
  63. package/lib/Action.js.map +1 -0
  64. package/lib/AlchemyContext.d.ts +1 -1
  65. package/lib/Apply.d.ts.map +1 -1
  66. package/lib/Apply.js +222 -3
  67. package/lib/Apply.js.map +1 -1
  68. package/lib/Artifacts.d.ts +1 -1
  69. package/lib/Artifacts.d.ts.map +1 -1
  70. package/lib/Artifacts.js +1 -1
  71. package/lib/Artifacts.js.map +1 -1
  72. package/lib/Auth/AuthProvider.js +1 -1
  73. package/lib/Auth/AuthProvider.js.map +1 -1
  74. package/lib/Auth/Env.d.ts.map +1 -1
  75. package/lib/Auth/Env.js +4 -12
  76. package/lib/Auth/Env.js.map +1 -1
  77. package/lib/Binding.d.ts.map +1 -1
  78. package/lib/Binding.js +5 -5
  79. package/lib/Binding.js.map +1 -1
  80. package/lib/Build/Command.d.ts +1 -1
  81. package/lib/Build/Memo.d.ts +1 -1
  82. package/lib/Bundle/Docker.d.ts +3 -3
  83. package/lib/Bundle/Docker.js +1 -1
  84. package/lib/Bundle/Docker.js.map +1 -1
  85. package/lib/Bundle/TempRoot.d.ts +3 -3
  86. package/lib/Cli/Event.d.ts +1 -1
  87. package/lib/Cli/Event.d.ts.map +1 -1
  88. package/lib/Cli/NamespaceTree.d.ts +11 -5
  89. package/lib/Cli/NamespaceTree.d.ts.map +1 -1
  90. package/lib/Cli/NamespaceTree.js +28 -1
  91. package/lib/Cli/NamespaceTree.js.map +1 -1
  92. package/lib/Cli/commands/_shared.d.ts +1 -1
  93. package/lib/Cli/commands/_shared.js +2 -2
  94. package/lib/Cli/commands/_shared.js.map +1 -1
  95. package/lib/Cli/commands/aws.d.ts +1 -1
  96. package/lib/Cli/commands/cloudflare.d.ts +2 -2
  97. package/lib/Cli/commands/cloudflare.d.ts.map +1 -1
  98. package/lib/Cli/commands/deploy.d.ts +9 -9
  99. package/lib/Cli/commands/deploy.js +1 -1
  100. package/lib/Cli/commands/deploy.js.map +1 -1
  101. package/lib/Cli/commands/login.d.ts +1 -1
  102. package/lib/Cli/commands/logs.d.ts +1 -1
  103. package/lib/Cli/commands/logs.js.map +1 -1
  104. package/lib/Cli/commands/profile.d.ts +1 -3
  105. package/lib/Cli/commands/profile.d.ts.map +1 -1
  106. package/lib/Cli/commands/state.d.ts +1 -1
  107. package/lib/Cli/commands/state.d.ts.map +1 -1
  108. package/lib/Cli/commands/tail.d.ts +1 -1
  109. package/lib/Cli/commands/tail.js.map +1 -1
  110. package/lib/Cli/tui/components/Plan.d.ts.map +1 -1
  111. package/lib/Cli/tui/components/Plan.js +27 -13
  112. package/lib/Cli/tui/components/Plan.js.map +1 -1
  113. package/lib/Cli/tui/components/PlanProgress.d.ts +8 -1
  114. package/lib/Cli/tui/components/PlanProgress.d.ts.map +1 -1
  115. package/lib/Cli/tui/components/PlanProgress.js +95 -16
  116. package/lib/Cli/tui/components/PlanProgress.js.map +1 -1
  117. package/lib/Cloudflare/Access.js +0 -1
  118. package/lib/Cloudflare/Access.js.map +1 -1
  119. package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDatasetBinding.js +1 -1
  120. package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDatasetBinding.js.map +1 -1
  121. package/lib/Cloudflare/Artifacts/ArtifactsBinding.js +1 -1
  122. package/lib/Cloudflare/Artifacts/ArtifactsBinding.js.map +1 -1
  123. package/lib/Cloudflare/CloudflareEnvironment.d.ts +1 -1
  124. package/lib/Cloudflare/Container/Container.js +0 -1
  125. package/lib/Cloudflare/Container/Container.js.map +1 -1
  126. package/lib/Cloudflare/Container/ContainerApplication.d.ts +1 -1
  127. package/lib/Cloudflare/Container/ContainerApplication.d.ts.map +1 -1
  128. package/lib/Cloudflare/Container/ContainerApplication.js +4 -6
  129. package/lib/Cloudflare/Container/ContainerApplication.js.map +1 -1
  130. package/lib/Cloudflare/Container/ContainerBinding.js +2 -2
  131. package/lib/Cloudflare/Container/ContainerBinding.js.map +1 -1
  132. package/lib/Cloudflare/D1/D1Database.d.ts +1 -1
  133. package/lib/Cloudflare/D1/D1SqlFile.d.ts +2 -2
  134. package/lib/Cloudflare/Email/EmailAddress.d.ts +45 -0
  135. package/lib/Cloudflare/Email/EmailAddress.d.ts.map +1 -0
  136. package/lib/Cloudflare/Email/EmailAddress.js +99 -0
  137. package/lib/Cloudflare/Email/EmailAddress.js.map +1 -0
  138. package/lib/Cloudflare/Email/EmailRouting.d.ts +42 -0
  139. package/lib/Cloudflare/Email/EmailRouting.d.ts.map +1 -0
  140. package/lib/Cloudflare/Email/EmailRouting.js +89 -0
  141. package/lib/Cloudflare/Email/EmailRouting.js.map +1 -0
  142. package/lib/Cloudflare/Email/EmailRule.d.ts +80 -0
  143. package/lib/Cloudflare/Email/EmailRule.d.ts.map +1 -0
  144. package/lib/Cloudflare/Email/EmailRule.js +110 -0
  145. package/lib/Cloudflare/Email/EmailRule.js.map +1 -0
  146. package/lib/Cloudflare/Email/SendEmail.d.ts +74 -0
  147. package/lib/Cloudflare/Email/SendEmail.d.ts.map +1 -0
  148. package/lib/Cloudflare/Email/SendEmail.js +19 -0
  149. package/lib/Cloudflare/Email/SendEmail.js.map +1 -0
  150. package/lib/Cloudflare/Email/SendEmailBinding.d.ts +64 -0
  151. package/lib/Cloudflare/Email/SendEmailBinding.d.ts.map +1 -0
  152. package/lib/Cloudflare/Email/SendEmailBinding.js +54 -0
  153. package/lib/Cloudflare/Email/SendEmailBinding.js.map +1 -0
  154. package/lib/Cloudflare/Email/index.d.ts +6 -0
  155. package/lib/Cloudflare/Email/index.d.ts.map +1 -0
  156. package/lib/Cloudflare/Email/index.js +6 -0
  157. package/lib/Cloudflare/Email/index.js.map +1 -0
  158. package/lib/Cloudflare/Hyperdrive/Hyperdrive.d.ts +1 -1
  159. package/lib/Cloudflare/Images/ImagesBinding.js +1 -1
  160. package/lib/Cloudflare/Images/ImagesBinding.js.map +1 -1
  161. package/lib/Cloudflare/KV/KVNamespaceBinding.js +1 -1
  162. package/lib/Cloudflare/KV/KVNamespaceBinding.js.map +1 -1
  163. package/lib/Cloudflare/Local/Sidecar.d.ts +1 -1
  164. package/lib/Cloudflare/Local/SidecarHandlers.d.ts +1 -1
  165. package/lib/Cloudflare/Local/SidecarServer.js +1 -1
  166. package/lib/Cloudflare/Local/SidecarServer.js.map +1 -1
  167. package/lib/Cloudflare/Providers.d.ts.map +1 -1
  168. package/lib/Cloudflare/Providers.js +6 -1
  169. package/lib/Cloudflare/Providers.js.map +1 -1
  170. package/lib/Cloudflare/Queue/QueueBinding.js +1 -1
  171. package/lib/Cloudflare/Queue/QueueBinding.js.map +1 -1
  172. package/lib/Cloudflare/R2/R2BucketBinding.js +1 -1
  173. package/lib/Cloudflare/R2/R2BucketBinding.js.map +1 -1
  174. package/lib/Cloudflare/SecretsStore/SecretBinding.js +1 -1
  175. package/lib/Cloudflare/SecretsStore/SecretBinding.js.map +1 -1
  176. package/lib/Cloudflare/StateStore/Api.d.ts +1 -1
  177. package/lib/Cloudflare/StateStore/State.d.ts +2 -2
  178. package/lib/Cloudflare/Workers/Assets.d.ts +2 -2
  179. package/lib/Cloudflare/Workers/Assets.d.ts.map +1 -1
  180. package/lib/Cloudflare/Workers/Assets.js +5 -4
  181. package/lib/Cloudflare/Workers/Assets.js.map +1 -1
  182. package/lib/Cloudflare/Workers/HttpServer.d.ts.map +1 -1
  183. package/lib/Cloudflare/Workers/HttpServer.js +25 -3
  184. package/lib/Cloudflare/Workers/HttpServer.js.map +1 -1
  185. package/lib/Cloudflare/Workers/InferEnv.d.ts +1 -1
  186. package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
  187. package/lib/Cloudflare/Workers/Worker.d.ts +4 -3
  188. package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
  189. package/lib/Cloudflare/Workers/Worker.js +67 -32
  190. package/lib/Cloudflare/Workers/Worker.js.map +1 -1
  191. package/lib/Cloudflare/Workers/WorkerBundle.d.ts +1 -1
  192. package/lib/Cloudflare/Workers/WorkerBundle.d.ts.map +1 -1
  193. package/lib/Cloudflare/Workers/WorkerBundle.js +4 -6
  194. package/lib/Cloudflare/Workers/WorkerBundle.js.map +1 -1
  195. package/lib/Cloudflare/Workers/WorkerName.d.ts +1 -1
  196. package/lib/Cloudflare/Workers/Workflow.js +2 -2
  197. package/lib/Cloudflare/Workers/Workflow.js.map +1 -1
  198. package/lib/Cloudflare/index.d.ts +1 -0
  199. package/lib/Cloudflare/index.d.ts.map +1 -1
  200. package/lib/Cloudflare/index.js +1 -0
  201. package/lib/Cloudflare/index.js.map +1 -1
  202. package/lib/Construct.d.ts +3 -3
  203. package/lib/Construct.d.ts.map +1 -1
  204. package/lib/Construct.js.map +1 -1
  205. package/lib/Deploy.d.ts +1 -1
  206. package/lib/Destroy.d.ts +1 -1
  207. package/lib/Destroy.d.ts.map +1 -1
  208. package/lib/Destroy.js +1 -0
  209. package/lib/Destroy.js.map +1 -1
  210. package/lib/Drizzle/Providers.d.ts +1 -1
  211. package/lib/Drizzle/Schema.d.ts +1 -1
  212. package/lib/GitHub/Providers.d.ts +1 -1
  213. package/lib/Http.d.ts +1 -1
  214. package/lib/Http.d.ts.map +1 -1
  215. package/lib/Http.js +1 -1
  216. package/lib/Http.js.map +1 -1
  217. package/lib/Namespace.d.ts.map +1 -1
  218. package/lib/Namespace.js +3 -4
  219. package/lib/Namespace.js.map +1 -1
  220. package/lib/Neon/Branch.d.ts +2 -2
  221. package/lib/Neon/Branch.d.ts.map +1 -1
  222. package/lib/Neon/Branch.js +59 -27
  223. package/lib/Neon/Branch.js.map +1 -1
  224. package/lib/Neon/Credentials.d.ts +2 -2
  225. package/lib/Neon/Credentials.d.ts.map +1 -1
  226. package/lib/Neon/Credentials.js +2 -2
  227. package/lib/Neon/Credentials.js.map +1 -1
  228. package/lib/Neon/NeonEnvironment.d.ts +1 -1
  229. package/lib/Neon/Project.d.ts +25 -1
  230. package/lib/Neon/Project.d.ts.map +1 -1
  231. package/lib/Neon/Project.js +121 -42
  232. package/lib/Neon/Project.js.map +1 -1
  233. package/lib/Neon/Providers.d.ts +1 -1
  234. package/lib/Neon/SqlFile.d.ts +2 -2
  235. package/lib/Output.d.ts +3 -4
  236. package/lib/Output.d.ts.map +1 -1
  237. package/lib/Output.js +7 -4
  238. package/lib/Output.js.map +1 -1
  239. package/lib/PhysicalName.d.ts +1 -1
  240. package/lib/Plan.d.ts +36 -1
  241. package/lib/Plan.d.ts.map +1 -1
  242. package/lib/Plan.js +197 -31
  243. package/lib/Plan.js.map +1 -1
  244. package/lib/Platform.js +6 -6
  245. package/lib/Platform.js.map +1 -1
  246. package/lib/Provider.d.ts +1 -1
  247. package/lib/Provider.d.ts.map +1 -1
  248. package/lib/Provider.js +1 -1
  249. package/lib/Provider.js.map +1 -1
  250. package/lib/Random.d.ts +1 -1
  251. package/lib/Random.d.ts.map +1 -1
  252. package/lib/Random.js +1 -1
  253. package/lib/Random.js.map +1 -1
  254. package/lib/Resource.d.ts.map +1 -1
  255. package/lib/Resource.js +2 -25
  256. package/lib/Resource.js.map +1 -1
  257. package/lib/Runtime.d.ts +24 -0
  258. package/lib/Runtime.d.ts.map +1 -0
  259. package/lib/Runtime.js +31 -0
  260. package/lib/Runtime.js.map +1 -0
  261. package/lib/Secret.js +1 -1
  262. package/lib/Secret.js.map +1 -1
  263. package/lib/Sidecar/RpcClient.d.ts +1 -1
  264. package/lib/Sidecar/RpcPaths.d.ts +1 -1
  265. package/lib/Sidecar/RpcServer.d.ts +1 -1
  266. package/lib/Sidecar/RpcServices.d.ts +1 -1
  267. package/lib/Stack.d.ts +7 -2
  268. package/lib/Stack.d.ts.map +1 -1
  269. package/lib/Stack.js +4 -4
  270. package/lib/Stack.js.map +1 -1
  271. package/lib/State/ActionState.d.ts +48 -0
  272. package/lib/State/ActionState.d.ts.map +1 -0
  273. package/lib/State/ActionState.js +1 -0
  274. package/lib/State/ActionState.js.map +1 -0
  275. package/lib/State/HttpStateStore.d.ts.map +1 -1
  276. package/lib/State/HttpStateStore.js +1 -1
  277. package/lib/State/HttpStateStore.js.map +1 -1
  278. package/lib/State/InMemoryState.d.ts.map +1 -1
  279. package/lib/State/InMemoryState.js.map +1 -1
  280. package/lib/State/LocalState.d.ts +2 -2
  281. package/lib/State/ResourceState.d.ts +5 -0
  282. package/lib/State/ResourceState.d.ts.map +1 -1
  283. package/lib/State/State.d.ts +10 -2
  284. package/lib/State/State.d.ts.map +1 -1
  285. package/lib/State/State.js +2 -0
  286. package/lib/State/State.js.map +1 -1
  287. package/lib/State/index.d.ts +1 -0
  288. package/lib/State/index.d.ts.map +1 -1
  289. package/lib/State/index.js +1 -0
  290. package/lib/State/index.js.map +1 -1
  291. package/lib/Test/Core.d.ts +2 -2
  292. package/lib/Test/Core.d.ts.map +1 -1
  293. package/lib/Test/Core.js +4 -1
  294. package/lib/Test/Core.js.map +1 -1
  295. package/lib/Util/FileLogger.d.ts +1 -1
  296. package/lib/Util/effect.js +4 -4
  297. package/lib/Util/effect.js.map +1 -1
  298. package/lib/Util/exec.d.ts.map +1 -0
  299. package/lib/Util/exec.js.map +1 -0
  300. package/lib/Util/hash.d.ts +8 -0
  301. package/lib/Util/hash.d.ts.map +1 -0
  302. package/lib/Util/hash.js +11 -0
  303. package/lib/Util/hash.js.map +1 -0
  304. package/lib/Util/ignore.d.ts +40 -0
  305. package/lib/Util/ignore.d.ts.map +1 -0
  306. package/lib/Util/ignore.js +591 -0
  307. package/lib/Util/ignore.js.map +1 -0
  308. package/lib/index.d.ts +1 -0
  309. package/lib/index.d.ts.map +1 -1
  310. package/lib/index.js +1 -0
  311. package/lib/index.js.map +1 -1
  312. package/lib/tsconfig.test.tsbuildinfo +1 -1
  313. package/package.json +22 -28
  314. package/src/AWS/Credentials.ts +1 -2
  315. package/src/AWS/DynamoDB/Stream.ts +1 -4
  316. package/src/AWS/EC2/hosted.ts +14 -16
  317. package/src/AWS/ECS/Task.ts +14 -16
  318. package/src/AWS/Endpoint.ts +2 -5
  319. package/src/AWS/EventBridge/EventSource.ts +1 -4
  320. package/src/AWS/Kinesis/StreamEventSource.ts +1 -4
  321. package/src/AWS/Lambda/Function.ts +31 -35
  322. package/src/AWS/Providers.ts +22 -3
  323. package/src/AWS/Region.ts +2 -3
  324. package/src/AWS/S3/Bucket.ts +7 -2
  325. package/src/AWS/S3/BucketNotifications.ts +1 -4
  326. package/src/AWS/SNS/TopicEventSource.ts +1 -4
  327. package/src/AWS/SQS/Queue.ts +40 -6
  328. package/src/Action.ts +280 -0
  329. package/src/Apply.ts +351 -23
  330. package/src/Artifacts.ts +2 -4
  331. package/src/Auth/AuthProvider.ts +1 -1
  332. package/src/Auth/Env.ts +12 -20
  333. package/src/Binding.ts +5 -9
  334. package/src/Bundle/Docker.ts +1 -1
  335. package/src/Cli/Event.ts +4 -0
  336. package/src/Cli/NamespaceTree.ts +52 -5
  337. package/src/Cli/commands/_shared.ts +2 -2
  338. package/src/Cli/commands/deploy.ts +1 -1
  339. package/src/Cli/commands/logs.ts +4 -4
  340. package/src/Cli/commands/tail.ts +4 -4
  341. package/src/Cli/tui/components/Plan.tsx +65 -17
  342. package/src/Cli/tui/components/PlanProgress.tsx +142 -32
  343. package/src/Cloudflare/Access.ts +1 -1
  344. package/src/Cloudflare/AnalyticsEngine/AnalyticsEngineDatasetBinding.ts +1 -1
  345. package/src/Cloudflare/Artifacts/ArtifactsBinding.ts +1 -1
  346. package/src/Cloudflare/Container/Container.ts +1 -1
  347. package/src/Cloudflare/Container/ContainerApplication.ts +4 -6
  348. package/src/Cloudflare/Container/ContainerBinding.ts +2 -2
  349. package/src/Cloudflare/Email/EmailAddress.ts +155 -0
  350. package/src/Cloudflare/Email/EmailRouting.ts +138 -0
  351. package/src/Cloudflare/Email/EmailRule.ts +210 -0
  352. package/src/Cloudflare/Email/SendEmail.ts +95 -0
  353. package/src/Cloudflare/Email/SendEmailBinding.ts +124 -0
  354. package/src/Cloudflare/Email/index.ts +5 -0
  355. package/src/Cloudflare/Images/ImagesBinding.ts +1 -1
  356. package/src/Cloudflare/KV/KVNamespaceBinding.ts +1 -1
  357. package/src/Cloudflare/Local/SidecarServer.ts +1 -1
  358. package/src/Cloudflare/Providers.ts +9 -0
  359. package/src/Cloudflare/Queue/QueueBinding.ts +1 -1
  360. package/src/Cloudflare/R2/R2BucketBinding.ts +1 -1
  361. package/src/Cloudflare/SecretsStore/SecretBinding.ts +1 -1
  362. package/src/Cloudflare/Workers/Assets.ts +5 -6
  363. package/src/Cloudflare/Workers/HttpServer.ts +37 -5
  364. package/src/Cloudflare/Workers/InferEnv.ts +15 -11
  365. package/src/Cloudflare/Workers/Worker.ts +78 -36
  366. package/src/Cloudflare/Workers/WorkerBundle.ts +4 -6
  367. package/src/Cloudflare/Workers/Workflow.ts +2 -2
  368. package/src/Cloudflare/index.ts +1 -0
  369. package/src/Construct.ts +3 -7
  370. package/src/Destroy.ts +1 -0
  371. package/src/Http.ts +1 -1
  372. package/src/Namespace.ts +4 -4
  373. package/src/Neon/Branch.ts +93 -59
  374. package/src/Neon/Credentials.ts +2 -2
  375. package/src/Neon/Project.ts +193 -64
  376. package/src/Output.ts +9 -7
  377. package/src/Plan.ts +303 -53
  378. package/src/Platform.ts +7 -7
  379. package/src/Provider.ts +8 -3
  380. package/src/Random.ts +1 -1
  381. package/src/Resource.ts +2 -25
  382. package/src/Runtime.ts +38 -0
  383. package/src/Secret.ts +1 -1
  384. package/src/Stack.ts +10 -6
  385. package/src/State/ActionState.ts +51 -0
  386. package/src/State/HttpStateStore.ts +6 -2
  387. package/src/State/InMemoryState.ts +3 -3
  388. package/src/State/ResourceState.ts +5 -0
  389. package/src/State/State.ts +17 -2
  390. package/src/State/index.ts +1 -0
  391. package/src/Test/Core.ts +4 -3
  392. package/src/Util/effect.ts +4 -4
  393. package/src/Util/hash.ts +14 -0
  394. package/src/Util/ignore.ts +815 -0
  395. package/src/index.ts +6 -0
  396. package/lib/Agent/Agent.d.ts +0 -9
  397. package/lib/Agent/Agent.d.ts.map +0 -1
  398. package/lib/Agent/Agent.js +0 -10
  399. package/lib/Agent/Agent.js.map +0 -1
  400. package/lib/Agent/Aspect.d.ts +0 -51
  401. package/lib/Agent/Aspect.d.ts.map +0 -1
  402. package/lib/Agent/Aspect.js +0 -45
  403. package/lib/Agent/Aspect.js.map +0 -1
  404. package/lib/Agent/AspectGraph.d.ts +0 -45
  405. package/lib/Agent/AspectGraph.d.ts.map +0 -1
  406. package/lib/Agent/AspectGraph.js +0 -39
  407. package/lib/Agent/AspectGraph.js.map +0 -1
  408. package/lib/Agent/ContextPlugin.d.ts +0 -8
  409. package/lib/Agent/ContextPlugin.d.ts.map +0 -1
  410. package/lib/Agent/ContextPlugin.js +0 -3
  411. package/lib/Agent/ContextPlugin.js.map +0 -1
  412. package/lib/Agent/Plugin.d.ts +0 -18
  413. package/lib/Agent/Plugin.d.ts.map +0 -1
  414. package/lib/Agent/Plugin.js +0 -8
  415. package/lib/Agent/Plugin.js.map +0 -1
  416. package/lib/Agent/chat/channel.d.ts +0 -9
  417. package/lib/Agent/chat/channel.d.ts.map +0 -1
  418. package/lib/Agent/chat/channel.js +0 -10
  419. package/lib/Agent/chat/channel.js.map +0 -1
  420. package/lib/Agent/chat/event.d.ts +0 -32
  421. package/lib/Agent/chat/event.d.ts.map +0 -1
  422. package/lib/Agent/chat/event.js +0 -32
  423. package/lib/Agent/chat/event.js.map +0 -1
  424. package/lib/Agent/chat/message.d.ts +0 -22
  425. package/lib/Agent/chat/message.d.ts.map +0 -1
  426. package/lib/Agent/chat/message.js +0 -31
  427. package/lib/Agent/chat/message.js.map +0 -1
  428. package/lib/Agent/chat/service.d.ts +0 -102
  429. package/lib/Agent/chat/service.d.ts.map +0 -1
  430. package/lib/Agent/chat/service.js +0 -79
  431. package/lib/Agent/chat/service.js.map +0 -1
  432. package/lib/Agent/chat/thread.d.ts +0 -13
  433. package/lib/Agent/chat/thread.d.ts.map +0 -1
  434. package/lib/Agent/chat/thread.js +0 -16
  435. package/lib/Agent/chat/thread.js.map +0 -1
  436. package/lib/Agent/coding/bash.d.ts +0 -36
  437. package/lib/Agent/coding/bash.d.ts.map +0 -1
  438. package/lib/Agent/coding/bash.js +0 -170
  439. package/lib/Agent/coding/bash.js.map +0 -1
  440. package/lib/Agent/coding/edit.d.ts +0 -31
  441. package/lib/Agent/coding/edit.d.ts.map +0 -1
  442. package/lib/Agent/coding/edit.js +0 -90
  443. package/lib/Agent/coding/edit.js.map +0 -1
  444. package/lib/Agent/coding/glob.d.ts +0 -23
  445. package/lib/Agent/coding/glob.d.ts.map +0 -1
  446. package/lib/Agent/coding/glob.js +0 -78
  447. package/lib/Agent/coding/glob.js.map +0 -1
  448. package/lib/Agent/coding/grep.d.ts +0 -26
  449. package/lib/Agent/coding/grep.d.ts.map +0 -1
  450. package/lib/Agent/coding/grep.js +0 -105
  451. package/lib/Agent/coding/grep.js.map +0 -1
  452. package/lib/Agent/coding/index.d.ts +0 -8
  453. package/lib/Agent/coding/index.d.ts.map +0 -1
  454. package/lib/Agent/coding/index.js +0 -8
  455. package/lib/Agent/coding/index.js.map +0 -1
  456. package/lib/Agent/coding/read.d.ts +0 -27
  457. package/lib/Agent/coding/read.d.ts.map +0 -1
  458. package/lib/Agent/coding/read.js +0 -89
  459. package/lib/Agent/coding/read.js.map +0 -1
  460. package/lib/Agent/coding/readlints.d.ts +0 -19
  461. package/lib/Agent/coding/readlints.d.ts.map +0 -1
  462. package/lib/Agent/coding/readlints.js +0 -53
  463. package/lib/Agent/coding/readlints.js.map +0 -1
  464. package/lib/Agent/coding/write.d.ts +0 -22
  465. package/lib/Agent/coding/write.d.ts.map +0 -1
  466. package/lib/Agent/coding/write.js +0 -53
  467. package/lib/Agent/coding/write.js.map +0 -1
  468. package/lib/Agent/fs/file.d.ts +0 -12
  469. package/lib/Agent/fs/file.d.ts.map +0 -1
  470. package/lib/Agent/fs/file.js +0 -8
  471. package/lib/Agent/fs/file.js.map +0 -1
  472. package/lib/Agent/fs/folder.d.ts +0 -5
  473. package/lib/Agent/fs/folder.d.ts.map +0 -1
  474. package/lib/Agent/fs/folder.js +0 -3
  475. package/lib/Agent/fs/folder.js.map +0 -1
  476. package/lib/Agent/index.d.ts +0 -9
  477. package/lib/Agent/index.d.ts.map +0 -1
  478. package/lib/Agent/index.js +0 -9
  479. package/lib/Agent/index.js.map +0 -1
  480. package/lib/Agent/llm/error.d.ts +0 -208
  481. package/lib/Agent/llm/error.d.ts.map +0 -1
  482. package/lib/Agent/llm/error.js +0 -209
  483. package/lib/Agent/llm/error.js.map +0 -1
  484. package/lib/Agent/llm/index.d.ts +0 -5
  485. package/lib/Agent/llm/index.d.ts.map +0 -1
  486. package/lib/Agent/llm/index.js +0 -5
  487. package/lib/Agent/llm/index.js.map +0 -1
  488. package/lib/Agent/llm/llm.d.ts +0 -32
  489. package/lib/Agent/llm/llm.d.ts.map +0 -1
  490. package/lib/Agent/llm/llm.js +0 -74
  491. package/lib/Agent/llm/llm.js.map +0 -1
  492. package/lib/Agent/llm/stream-collectors.d.ts +0 -46
  493. package/lib/Agent/llm/stream-collectors.d.ts.map +0 -1
  494. package/lib/Agent/llm/stream-collectors.js +0 -33
  495. package/lib/Agent/llm/stream-collectors.js.map +0 -1
  496. package/lib/Agent/llm/stream-text-part.d.ts +0 -5
  497. package/lib/Agent/llm/stream-text-part.d.ts.map +0 -1
  498. package/lib/Agent/llm/stream-text-part.js +0 -4
  499. package/lib/Agent/llm/stream-text-part.js.map +0 -1
  500. package/lib/Agent/lsp/client.d.ts +0 -122
  501. package/lib/Agent/lsp/client.d.ts.map +0 -1
  502. package/lib/Agent/lsp/client.js +0 -180
  503. package/lib/Agent/lsp/client.js.map +0 -1
  504. package/lib/Agent/lsp/diagnostics.d.ts +0 -16
  505. package/lib/Agent/lsp/diagnostics.d.ts.map +0 -1
  506. package/lib/Agent/lsp/diagnostics.js +0 -48
  507. package/lib/Agent/lsp/diagnostics.js.map +0 -1
  508. package/lib/Agent/lsp/jsonrpc.d.ts +0 -90
  509. package/lib/Agent/lsp/jsonrpc.d.ts.map +0 -1
  510. package/lib/Agent/lsp/jsonrpc.js +0 -178
  511. package/lib/Agent/lsp/jsonrpc.js.map +0 -1
  512. package/lib/Agent/lsp/manager.d.ts +0 -38
  513. package/lib/Agent/lsp/manager.d.ts.map +0 -1
  514. package/lib/Agent/lsp/manager.js +0 -98
  515. package/lib/Agent/lsp/manager.js.map +0 -1
  516. package/lib/Agent/lsp/servers.d.ts +0 -28
  517. package/lib/Agent/lsp/servers.d.ts.map +0 -1
  518. package/lib/Agent/lsp/servers.js +0 -21
  519. package/lib/Agent/lsp/servers.js.map +0 -1
  520. package/lib/Agent/process/driver.d.ts +0 -10
  521. package/lib/Agent/process/driver.d.ts.map +0 -1
  522. package/lib/Agent/process/driver.js +0 -153
  523. package/lib/Agent/process/driver.js.map +0 -1
  524. package/lib/Agent/process/issue-service.d.ts +0 -44
  525. package/lib/Agent/process/issue-service.d.ts.map +0 -1
  526. package/lib/Agent/process/issue-service.js +0 -28
  527. package/lib/Agent/process/issue-service.js.map +0 -1
  528. package/lib/Agent/process/issue-tools.d.ts +0 -28
  529. package/lib/Agent/process/issue-tools.d.ts.map +0 -1
  530. package/lib/Agent/process/issue-tools.js +0 -28
  531. package/lib/Agent/process/issue-tools.js.map +0 -1
  532. package/lib/Agent/process/issue.d.ts +0 -16
  533. package/lib/Agent/process/issue.d.ts.map +0 -1
  534. package/lib/Agent/process/issue.js +0 -17
  535. package/lib/Agent/process/issue.js.map +0 -1
  536. package/lib/Agent/process/organization.d.ts +0 -4
  537. package/lib/Agent/process/organization.d.ts.map +0 -1
  538. package/lib/Agent/process/organization.js +0 -3
  539. package/lib/Agent/process/organization.js.map +0 -1
  540. package/lib/Agent/process/process.d.ts +0 -5
  541. package/lib/Agent/process/process.d.ts.map +0 -1
  542. package/lib/Agent/process/process.js +0 -3
  543. package/lib/Agent/process/process.js.map +0 -1
  544. package/lib/Agent/process/reply.d.ts +0 -16
  545. package/lib/Agent/process/reply.d.ts.map +0 -1
  546. package/lib/Agent/process/reply.js +0 -18
  547. package/lib/Agent/process/reply.js.map +0 -1
  548. package/lib/Agent/process/task.d.ts +0 -25
  549. package/lib/Agent/process/task.d.ts.map +0 -1
  550. package/lib/Agent/process/task.js +0 -26
  551. package/lib/Agent/process/task.js.map +0 -1
  552. package/lib/Agent/tool/index.d.ts +0 -4
  553. package/lib/Agent/tool/index.d.ts.map +0 -1
  554. package/lib/Agent/tool/index.js +0 -4
  555. package/lib/Agent/tool/index.js.map +0 -1
  556. package/lib/Agent/tool/parameter.d.ts +0 -12
  557. package/lib/Agent/tool/parameter.d.ts.map +0 -1
  558. package/lib/Agent/tool/parameter.js +0 -6
  559. package/lib/Agent/tool/parameter.js.map +0 -1
  560. package/lib/Agent/tool/result.d.ts +0 -17
  561. package/lib/Agent/tool/result.d.ts.map +0 -1
  562. package/lib/Agent/tool/result.js +0 -6
  563. package/lib/Agent/tool/result.js.map +0 -1
  564. package/lib/Agent/tool/tool.d.ts +0 -32
  565. package/lib/Agent/tool/tool.d.ts.map +0 -1
  566. package/lib/Agent/tool/tool.js +0 -16
  567. package/lib/Agent/tool/tool.js.map +0 -1
  568. package/lib/Agent/util/command-validator.d.ts +0 -12
  569. package/lib/Agent/util/command-validator.d.ts.map +0 -1
  570. package/lib/Agent/util/command-validator.js +0 -74
  571. package/lib/Agent/util/command-validator.js.map +0 -1
  572. package/lib/Agent/util/exec.d.ts.map +0 -1
  573. package/lib/Agent/util/exec.js.map +0 -1
  574. package/lib/Agent/util/parser.d.ts +0 -5
  575. package/lib/Agent/util/parser.d.ts.map +0 -1
  576. package/lib/Agent/util/parser.js +0 -41
  577. package/lib/Agent/util/parser.js.map +0 -1
  578. package/lib/Agent/util/replace.d.ts +0 -38
  579. package/lib/Agent/util/replace.d.ts.map +0 -1
  580. package/lib/Agent/util/replace.js +0 -458
  581. package/lib/Agent/util/replace.js.map +0 -1
  582. package/lib/Agent/util/ripgrep.d.ts +0 -109
  583. package/lib/Agent/util/ripgrep.d.ts.map +0 -1
  584. package/lib/Agent/util/ripgrep.js +0 -221
  585. package/lib/Agent/util/ripgrep.js.map +0 -1
  586. package/lib/Neon/api.d.ts +0 -258
  587. package/lib/Neon/api.d.ts.map +0 -1
  588. package/lib/Neon/api.js +0 -215
  589. package/lib/Neon/api.js.map +0 -1
  590. package/src/Agent/Agent.ts +0 -26
  591. package/src/Agent/Aspect.ts +0 -173
  592. package/src/Agent/AspectGraph.ts +0 -98
  593. package/src/Agent/ContextPlugin.ts +0 -18
  594. package/src/Agent/Plugin.ts +0 -29
  595. package/src/Agent/chat/channel.ts +0 -26
  596. package/src/Agent/chat/event.ts +0 -43
  597. package/src/Agent/chat/message.ts +0 -35
  598. package/src/Agent/chat/service.ts +0 -133
  599. package/src/Agent/chat/thread.ts +0 -17
  600. package/src/Agent/coding/bash.ts +0 -197
  601. package/src/Agent/coding/edit.ts +0 -152
  602. package/src/Agent/coding/glob.ts +0 -96
  603. package/src/Agent/coding/grep.ts +0 -143
  604. package/src/Agent/coding/index.ts +0 -7
  605. package/src/Agent/coding/read.ts +0 -119
  606. package/src/Agent/coding/readlints.ts +0 -78
  607. package/src/Agent/coding/write.ts +0 -79
  608. package/src/Agent/fs/file.ts +0 -22
  609. package/src/Agent/fs/folder.ts +0 -16
  610. package/src/Agent/index.ts +0 -9
  611. package/src/Agent/llm/error.ts +0 -330
  612. package/src/Agent/llm/index.ts +0 -4
  613. package/src/Agent/llm/llm.ts +0 -131
  614. package/src/Agent/llm/stream-collectors.ts +0 -58
  615. package/src/Agent/llm/stream-text-part.ts +0 -7
  616. package/src/Agent/lsp/client.ts +0 -293
  617. package/src/Agent/lsp/diagnostics.ts +0 -64
  618. package/src/Agent/lsp/jsonrpc.ts +0 -317
  619. package/src/Agent/lsp/manager.ts +0 -213
  620. package/src/Agent/lsp/servers.ts +0 -37
  621. package/src/Agent/process/driver.ts +0 -168
  622. package/src/Agent/process/issue-service.ts +0 -48
  623. package/src/Agent/process/issue-tools.ts +0 -33
  624. package/src/Agent/process/issue.ts +0 -22
  625. package/src/Agent/process/organization.ts +0 -16
  626. package/src/Agent/process/process.ts +0 -16
  627. package/src/Agent/process/reply.ts +0 -21
  628. package/src/Agent/process/task.ts +0 -34
  629. package/src/Agent/tool/index.ts +0 -3
  630. package/src/Agent/tool/parameter.ts +0 -35
  631. package/src/Agent/tool/result.ts +0 -51
  632. package/src/Agent/tool/tool.ts +0 -74
  633. package/src/Agent/util/command-validator.ts +0 -98
  634. package/src/Agent/util/parser.ts +0 -39
  635. package/src/Agent/util/replace.ts +0 -559
  636. package/src/Agent/util/ripgrep.ts +0 -256
  637. package/src/Neon/api.ts +0 -579
  638. /package/lib/{Agent/util → Util}/exec.d.ts +0 -0
  639. /package/lib/{Agent/util → Util}/exec.js +0 -0
  640. /package/src/{Agent/util → Util}/exec.ts +0 -0
package/src/Apply.ts CHANGED
@@ -21,7 +21,13 @@ import { toFqn } from "./FQN.ts";
21
21
  import type { Input } from "./Input.ts";
22
22
  import { generateInstanceId, InstanceId } from "./InstanceId.ts";
23
23
  import * as Output from "./Output.ts";
24
- import { type Apply, type Delete, type Plan } from "./Plan.ts";
24
+ import {
25
+ type Apply,
26
+ type Delete,
27
+ type Plan,
28
+ type ActionApply,
29
+ type ActionDelete,
30
+ } from "./Plan.ts";
25
31
  import { findProviderByType } from "./Provider.ts";
26
32
  import type { ResourceBinding } from "./Resource.ts";
27
33
  import { Stack } from "./Stack.ts";
@@ -31,14 +37,19 @@ import {
31
37
  type CreatedResourceState,
32
38
  type CreatingResourceState,
33
39
  type DeletingResourceState,
40
+ type PersistedState,
41
+ type RanActionState,
34
42
  type ReplacedResourceState,
35
43
  type ReplacingResourceState,
36
44
  type ResourceState,
45
+ type RunningActionState,
46
+ type ActionState,
37
47
  type UpdatedResourceState,
38
48
  type UpdatingReourceState,
39
49
  State,
40
50
  StateStoreError,
41
51
  } from "./State/index.ts";
52
+ import { hashInput } from "./Util/hash.ts";
42
53
 
43
54
  export type ApplyEffect<
44
55
  P extends Plan,
@@ -139,7 +150,7 @@ export const apply = <P extends Plan>(
139
150
  {
140
151
  id: string;
141
152
  type: string;
142
- status: Extract<ApplyStatus, "created" | "updated">;
153
+ status: Extract<ApplyStatus, "created" | "updated" | "ran" | "skipped">;
143
154
  }
144
155
  >();
145
156
 
@@ -218,12 +229,12 @@ const executePlan = Effect.fnUntraced(function* (
218
229
  {
219
230
  id: string;
220
231
  type: string;
221
- status: Extract<ApplyStatus, "created" | "updated">;
232
+ status: Extract<ApplyStatus, "created" | "updated" | "ran" | "skipped">;
222
233
  }
223
234
  >,
224
235
  session: PlanStatusSession,
225
236
  state: {
226
- set: <V extends ResourceState>(req: {
237
+ set: <V extends PersistedState>(req: {
227
238
  stack: string;
228
239
  stage: string;
229
240
  fqn: string;
@@ -233,9 +244,29 @@ const executePlan = Effect.fnUntraced(function* (
233
244
  stackName: string,
234
245
  stage: string,
235
246
  ) {
247
+ // Resources and tasks share the same FQN namespace and DAG, so the
248
+ // scheduler tracks them together. Each entry gets a single Deferred that
249
+ // signals "my output is available in `tracker`."
250
+ const allNodes: Record<string, Apply | ActionApply> = {
251
+ ...plan.resources,
252
+ ...plan.actions,
253
+ };
254
+
236
255
  const ready = Object.fromEntries(
237
256
  yield* Effect.all(
238
- Object.keys(plan.resources).map((fqn) =>
257
+ Object.keys(allNodes).map((fqn) =>
258
+ Effect.map(Deferred.make<void>(), (d) => [fqn, d] as const),
259
+ ),
260
+ ),
261
+ ) as Record<string, Deferred.Deferred<void>>;
262
+
263
+ // `readyStable` fires only when a node has reached its TERMINAL output —
264
+ // resources after `reconcile`, tasks after the body completes. Resource
265
+ // precreate stubs do NOT signal `readyStable`, so any consumer that
266
+ // requires stable inputs (e.g. Tasks) waits past the precreate phase.
267
+ const readyStable = Object.fromEntries(
268
+ yield* Effect.all(
269
+ Object.keys(allNodes).map((fqn) =>
239
270
  Effect.map(Deferred.make<void>(), (d) => [fqn, d] as const),
240
271
  ),
241
272
  ),
@@ -254,25 +285,50 @@ const executePlan = Effect.fnUntraced(function* (
254
285
  { concurrency: "unbounded" },
255
286
  );
256
287
 
288
+ const waitForStableDeps = (fqns: string[]) =>
289
+ Effect.all(
290
+ fqns
291
+ .filter((fqn) => fqn in readyStable)
292
+ .map((fqn) => Deferred.await(readyStable[fqn])),
293
+ { concurrency: "unbounded" },
294
+ );
295
+
257
296
  const failures: LifecycleFailure[] = [];
258
297
 
259
298
  yield* Effect.all(
260
- Object.entries(plan.resources).map(([fqn, node]) =>
261
- executeNode(
262
- fqn,
263
- node,
264
- tracker,
265
- ready,
266
- terminalStatuses,
267
- session,
268
- state,
269
- stackName,
270
- stage,
271
- getOutputs,
272
- waitForDeps,
273
- failures,
274
- plan.cycleMembers.has(fqn),
275
- ),
299
+ Object.entries(allNodes).map(([fqn, node]) =>
300
+ (node as ActionApply).kind === "action"
301
+ ? executeActionNode(
302
+ fqn,
303
+ node as ActionApply,
304
+ tracker,
305
+ ready,
306
+ readyStable,
307
+ terminalStatuses,
308
+ session,
309
+ state,
310
+ stackName,
311
+ stage,
312
+ getOutputs,
313
+ waitForStableDeps,
314
+ failures,
315
+ )
316
+ : executeNode(
317
+ fqn,
318
+ node as Apply,
319
+ tracker,
320
+ ready,
321
+ readyStable,
322
+ terminalStatuses as any,
323
+ session,
324
+ state,
325
+ stackName,
326
+ stage,
327
+ getOutputs,
328
+ waitForDeps,
329
+ failures,
330
+ plan.cycleMembers.has(fqn),
331
+ ),
276
332
  ),
277
333
  { concurrency: "unbounded" },
278
334
  );
@@ -297,6 +353,7 @@ const executeNode = (
297
353
  node: Apply,
298
354
  tracker: Record<string, ResourceTracker>,
299
355
  ready: Record<string, Deferred.Deferred<void>>,
356
+ readyStable: Record<string, Deferred.Deferred<void>>,
300
357
  terminalStatuses: Map<
301
358
  string,
302
359
  {
@@ -357,6 +414,10 @@ const executeNode = (
357
414
  });
358
415
 
359
416
  const signalReady = Deferred.succeed(ready[fqn], void 0);
417
+ // Signal only after reconcile completes — never during precreate. Tasks
418
+ // (and any other consumer that calls `waitForStableDeps`) block on this
419
+ // so they observe the resource's final attrs rather than a stub.
420
+ const signalReadyStable = Deferred.succeed(readyStable[fqn], void 0);
360
421
 
361
422
  const storeAndSignal = (t: ResourceTracker) =>
362
423
  Effect.gen(function* () {
@@ -367,6 +428,8 @@ const executeNode = (
367
428
  // ── noop ──
368
429
 
369
430
  if (node.action === "noop") {
431
+ // No work to do — the persisted attr is already stable.
432
+ yield* signalReadyStable;
370
433
  yield* storeAndSignal({
371
434
  output: node.state.attr,
372
435
  props: node.state.props,
@@ -570,6 +633,7 @@ const executeNode = (
570
633
  instanceId,
571
634
  };
572
635
  yield* signalReady;
636
+ yield* signalReadyStable;
573
637
 
574
638
  yield* markTerminal("created");
575
639
  return;
@@ -701,6 +765,7 @@ const executeNode = (
701
765
  // the deferred has already been resolved by the early `storeAndSignal`
702
766
  // above and `signalReady` is a no-op the second time.
703
767
  yield* signalReady;
768
+ yield* signalReadyStable;
704
769
 
705
770
  yield* markTerminal("updated");
706
771
  return;
@@ -718,6 +783,7 @@ const executeNode = (
718
783
  instanceId,
719
784
  };
720
785
  yield* signalReady;
786
+ yield* signalReadyStable;
721
787
  yield* markTerminal("created");
722
788
  return;
723
789
  }
@@ -864,6 +930,7 @@ const executeNode = (
864
930
  instanceId,
865
931
  };
866
932
  yield* signalReady;
933
+ yield* signalReadyStable;
867
934
 
868
935
  // Keep progress anchored to the live replacement while GC drains the
869
936
  // previous generation(s) in the background.
@@ -889,6 +956,10 @@ const executeNode = (
889
956
  cause,
890
957
  });
891
958
  yield* Deferred.failCause(ready[fqn], cause as Cause.Cause<never>);
959
+ yield* Deferred.failCause(
960
+ readyStable[fqn],
961
+ cause as Cause.Cause<never>,
962
+ );
892
963
  yield* session.emit({
893
964
  kind: "status-change",
894
965
  id: node.resource.LogicalId,
@@ -907,6 +978,168 @@ const executeNode = (
907
978
  }),
908
979
  ) as Effect.Effect<void, never, never>;
909
980
 
981
+ // ── Task execution ─────────────────────────────────────────────────────────
982
+ //
983
+ // Tasks slot into the same scheduler as resources. They have no provider
984
+ // lifecycle — just a single Effect that runs when inputs change (or when
985
+ // `--force` is set). The output value is written to `tracker[fqn].output`
986
+ // so downstream Output evaluation works identically to resource attrs.
987
+
988
+ const executeActionNode = (
989
+ fqn: string,
990
+ node: ActionApply,
991
+ tracker: Record<string, ResourceTracker>,
992
+ ready: Record<string, Deferred.Deferred<void>>,
993
+ readyStable: Record<string, Deferred.Deferred<void>>,
994
+ terminalStatuses: Map<
995
+ string,
996
+ {
997
+ id: string;
998
+ type: string;
999
+ status: Extract<ApplyStatus, "created" | "updated" | "ran" | "skipped">;
1000
+ }
1001
+ >,
1002
+ session: PlanStatusSession,
1003
+ state: {
1004
+ set: <V extends PersistedState>(req: {
1005
+ stack: string;
1006
+ stage: string;
1007
+ fqn: string;
1008
+ value: V;
1009
+ }) => Effect.Effect<V, StateStoreError, never>;
1010
+ },
1011
+ stackName: string,
1012
+ stage: string,
1013
+ getOutputs: () => Record<string, any>,
1014
+ waitForDeps: (fqns: string[]) => Effect.Effect<void[], never, never>,
1015
+ failures: LifecycleFailure[],
1016
+ ): Effect.Effect<void, never, any> =>
1017
+ Effect.gen(function* () {
1018
+ const task = node.def;
1019
+ const logicalId = task.LogicalId;
1020
+ const namespace = task.Namespace;
1021
+
1022
+ const commit = <S extends ActionState>(value: Omit<S, "namespace">) =>
1023
+ state.set({
1024
+ stack: stackName,
1025
+ stage,
1026
+ fqn,
1027
+ value: { ...value, namespace } as S,
1028
+ });
1029
+
1030
+ const report = (status: ApplyStatus) =>
1031
+ session.emit({
1032
+ kind: "status-change",
1033
+ id: logicalId,
1034
+ type: task.Type,
1035
+ status,
1036
+ });
1037
+
1038
+ const signalReady = Deferred.succeed(ready[fqn], void 0);
1039
+ const signalReadyStable = Deferred.succeed(readyStable[fqn], void 0);
1040
+
1041
+ if (node.action === "noop") {
1042
+ tracker[fqn] = {
1043
+ output: node.state.output,
1044
+ props: { __input: node.state.input },
1045
+ bindings: [],
1046
+ instanceId: fqn,
1047
+ };
1048
+ yield* signalReady;
1049
+ yield* signalReadyStable;
1050
+ terminalStatuses.set(fqn, {
1051
+ id: logicalId,
1052
+ type: task.Type,
1053
+ status: "skipped",
1054
+ });
1055
+ return;
1056
+ }
1057
+
1058
+ // ── run ──
1059
+ // Wait for stable (post-reconcile) upstream attrs — not precreate stubs.
1060
+ // This is `waitForStableDeps` at the call site, passed in as the
1061
+ // `waitForDeps` parameter here.
1062
+ yield* waitForDeps(
1063
+ Object.keys(Output.resolveUpstream(node.input)).filter(
1064
+ (f) => f in readyStable,
1065
+ ),
1066
+ );
1067
+
1068
+ const outputs = getOutputs();
1069
+ const resolvedInput = (yield* Output.evaluate(node.input, outputs)) as any;
1070
+ const inputHashValue = yield* hashInput(resolvedInput);
1071
+
1072
+ yield* commit<RunningActionState>({
1073
+ kind: "action",
1074
+ status: "running",
1075
+ fqn,
1076
+ logicalId,
1077
+ actionType: task.Type,
1078
+ inputHash: inputHashValue,
1079
+ input: resolvedInput,
1080
+ downstream: node.downstream,
1081
+ });
1082
+ yield* report("running");
1083
+
1084
+ const result = yield* task.Run(resolvedInput);
1085
+
1086
+ yield* commit<RanActionState>({
1087
+ kind: "action",
1088
+ status: "ran",
1089
+ fqn,
1090
+ logicalId,
1091
+ actionType: task.Type,
1092
+ inputHash: inputHashValue,
1093
+ input: resolvedInput,
1094
+ output: result,
1095
+ downstream: node.downstream,
1096
+ });
1097
+
1098
+ tracker[fqn] = {
1099
+ output: result,
1100
+ props: { __input: resolvedInput },
1101
+ bindings: [],
1102
+ instanceId: fqn,
1103
+ };
1104
+ yield* signalReady;
1105
+ yield* signalReadyStable;
1106
+ terminalStatuses.set(fqn, {
1107
+ id: logicalId,
1108
+ type: task.Type,
1109
+ status: "ran",
1110
+ });
1111
+ }).pipe(
1112
+ Effect.catchCause((cause) =>
1113
+ Effect.gen(function* () {
1114
+ failures.push({
1115
+ fqn,
1116
+ logicalId: node.def.LogicalId,
1117
+ type: node.def.Type,
1118
+ cause,
1119
+ });
1120
+ yield* Deferred.failCause(ready[fqn], cause as Cause.Cause<never>);
1121
+ yield* Deferred.failCause(
1122
+ readyStable[fqn],
1123
+ cause as Cause.Cause<never>,
1124
+ );
1125
+ yield* session.emit({
1126
+ kind: "status-change",
1127
+ id: node.def.LogicalId,
1128
+ type: node.def.Type,
1129
+ status: "fail",
1130
+ });
1131
+ }),
1132
+ ),
1133
+ Effect.withSpan("apply.action", {
1134
+ attributes: {
1135
+ "alchemy.action.fqn": fqn,
1136
+ "alchemy.action.type": node.def.Type,
1137
+ "alchemy.action.logical_id": node.def.LogicalId,
1138
+ "alchemy.action.verb": node.action,
1139
+ },
1140
+ }),
1141
+ ) as Effect.Effect<void, never, any>;
1142
+
910
1143
  // ── Phase 3: imperative convergence loop ───────────────────────────────────
911
1144
  //
912
1145
  // After the initial concurrent pass, some resources may have been created
@@ -924,12 +1157,12 @@ const converge = Effect.fnUntraced(function* (
924
1157
  {
925
1158
  id: string;
926
1159
  type: string;
927
- status: Extract<ApplyStatus, "created" | "updated">;
1160
+ status: Extract<ApplyStatus, "created" | "updated" | "ran" | "skipped">;
928
1161
  }
929
1162
  >,
930
1163
  session: PlanStatusSession,
931
1164
  state: {
932
- set: <V extends ResourceState>(req: {
1165
+ set: <V extends PersistedState>(req: {
933
1166
  stack: string;
934
1167
  stage: string;
935
1168
  fqn: string;
@@ -1034,6 +1267,75 @@ const converge = Effect.fnUntraced(function* (
1034
1267
  });
1035
1268
  }
1036
1269
 
1270
+ // Tasks: re-run when their resolved input drifts vs. the value they
1271
+ // last applied with (e.g. an upstream resource produced new attrs in
1272
+ // this pass). Skipped (noop) tasks are not re-checked here — their
1273
+ // recorded inputHash is authoritative until the next plan.
1274
+ for (const [fqn, node] of Object.entries(plan.actions)) {
1275
+ if (node.action !== "run") continue;
1276
+ if (!tracker[fqn]) continue;
1277
+
1278
+ const outputs = Object.fromEntries(
1279
+ Object.entries(tracker).map(([k, t]) => [k, t.output]),
1280
+ );
1281
+ const newInput = (yield* Output.evaluate(node.input, outputs)) as any;
1282
+ const newHash = yield* hashInput(newInput);
1283
+ const oldInput = tracker[fqn].props?.__input;
1284
+ const oldHash = yield* hashInput(oldInput);
1285
+ if (newHash === oldHash) continue;
1286
+
1287
+ anyUpdated = true;
1288
+
1289
+ yield* state.set({
1290
+ stack: stackName,
1291
+ stage,
1292
+ fqn,
1293
+ value: {
1294
+ kind: "action",
1295
+ status: "running",
1296
+ fqn,
1297
+ logicalId: node.def.LogicalId,
1298
+ namespace: node.def.Namespace,
1299
+ actionType: node.def.Type,
1300
+ inputHash: newHash,
1301
+ input: newInput,
1302
+ downstream: node.downstream,
1303
+ } satisfies RunningActionState,
1304
+ });
1305
+
1306
+ const result = yield* node.def.Run(newInput);
1307
+
1308
+ yield* state.set({
1309
+ stack: stackName,
1310
+ stage,
1311
+ fqn,
1312
+ value: {
1313
+ kind: "action",
1314
+ status: "ran",
1315
+ fqn,
1316
+ logicalId: node.def.LogicalId,
1317
+ namespace: node.def.Namespace,
1318
+ actionType: node.def.Type,
1319
+ inputHash: newHash,
1320
+ input: newInput,
1321
+ output: result,
1322
+ downstream: node.downstream,
1323
+ } satisfies RanActionState,
1324
+ });
1325
+
1326
+ tracker[fqn] = {
1327
+ output: result,
1328
+ props: { __input: newInput },
1329
+ bindings: [],
1330
+ instanceId: fqn,
1331
+ };
1332
+ terminalStatuses.set(fqn, {
1333
+ id: node.def.LogicalId,
1334
+ type: node.def.Type,
1335
+ status: "ran",
1336
+ });
1337
+ }
1338
+
1037
1339
  if (!anyUpdated) break;
1038
1340
  }
1039
1341
  });
@@ -1049,6 +1351,32 @@ const collectGarbage = Effect.fnUntraced(function* (
1049
1351
  const stackName = stack.name;
1050
1352
  const stage = yield* Stage;
1051
1353
 
1354
+ // Task deletions are pure state drops — no body is invoked. Run them in
1355
+ // parallel before resource GC; tasks never have provider-side dependencies
1356
+ // to wait on.
1357
+ yield* Effect.all(
1358
+ Object.entries(plan.actionDeletions ?? {}).map(([fqn, node]) =>
1359
+ node === undefined
1360
+ ? Effect.void
1361
+ : Effect.gen(function* () {
1362
+ yield* session.emit({
1363
+ kind: "status-change",
1364
+ id: node.def.LogicalId,
1365
+ type: node.def.Type,
1366
+ status: "deleting",
1367
+ });
1368
+ yield* state.delete({ stack: stackName, stage, fqn });
1369
+ yield* session.emit({
1370
+ kind: "status-change",
1371
+ id: node.def.LogicalId,
1372
+ type: node.def.Type,
1373
+ status: "deleted",
1374
+ });
1375
+ }),
1376
+ ),
1377
+ { concurrency: "unbounded" },
1378
+ );
1379
+
1052
1380
  const deleteGraph = Effect.fnUntraced(function* (
1053
1381
  deletionGraph: Record<string, Delete | ReplacedResourceState | undefined>,
1054
1382
  ) {
package/src/Artifacts.ts CHANGED
@@ -78,7 +78,7 @@ const getOrCreateBag = (
78
78
  export const makeScopedArtifacts = (
79
79
  store: Map<string, ArtifactBag>,
80
80
  fqn: string,
81
- ): typeof Artifacts.Service => {
81
+ ): Artifacts["Service"] => {
82
82
  const bag = getOrCreateBag(store, fqn);
83
83
  return {
84
84
  get: <T>(key: string) => Effect.sync(() => bag.get(key) as T | undefined),
@@ -98,9 +98,7 @@ export const scopedArtifacts = (
98
98
  ): Layer.Layer<Artifacts, never, ArtifactStore> =>
99
99
  Layer.effect(
100
100
  Artifacts,
101
- ArtifactStore.asEffect().pipe(
102
- Effect.map((store) => makeScopedArtifacts(store, fqn)),
103
- ),
101
+ ArtifactStore.useSync((store) => makeScopedArtifacts(store, fqn)),
104
102
  );
105
103
 
106
104
  /**
@@ -220,7 +220,7 @@ export const getAuthProvider = <
220
220
  >(
221
221
  name: string,
222
222
  ): Effect.Effect<AuthProvider<Config, Credentials>, AuthError, AuthProviders> =>
223
- Effect.flatMap(AuthProviders.asEffect(), (registry) =>
223
+ AuthProviders.use((registry) =>
224
224
  registry[name] == null
225
225
  ? Effect.fail(
226
226
  new AuthError({
package/src/Auth/Env.ts CHANGED
@@ -4,32 +4,24 @@ import * as Clank from "../Util/Clank.ts";
4
4
  import { AuthError } from "./AuthProvider.ts";
5
5
 
6
6
  export const getEnv = (key: string) =>
7
- Config.string(key)
8
- .asEffect()
9
- .pipe(Effect.orElseSucceed(() => undefined));
7
+ Config.string(key).pipe(Effect.orElseSucceed(() => undefined));
10
8
 
11
9
  export const getEnvRequired = (key: string) =>
12
- Config.string(key)
13
- .asEffect()
14
- .pipe(
15
- Effect.catch(() =>
16
- Effect.fail(new AuthError({ message: `Missing required env: ${key}` })),
17
- ),
18
- );
10
+ Config.string(key).pipe(
11
+ Effect.catch(() =>
12
+ Effect.fail(new AuthError({ message: `Missing required env: ${key}` })),
13
+ ),
14
+ );
19
15
 
20
16
  export const getEnvRedacted = (key: string) =>
21
- Config.redacted(key)
22
- .asEffect()
23
- .pipe(Effect.orElseSucceed(() => undefined));
17
+ Config.redacted(key).pipe(Effect.orElseSucceed(() => undefined));
24
18
 
25
19
  export const getEnvRedactedRequired = (key: string) =>
26
- Config.redacted(key)
27
- .asEffect()
28
- .pipe(
29
- Effect.catch(() =>
30
- Effect.fail(new AuthError({ message: `Missing required env: ${key}` })),
31
- ),
32
- );
20
+ Config.redacted(key).pipe(
21
+ Effect.catch(() =>
22
+ Effect.fail(new AuthError({ message: `Missing required env: ${key}` })),
23
+ ),
24
+ );
33
25
 
34
26
  export const retryOnce = <A, R>(
35
27
  self: Effect.Effect<A, Clank.PromptCancelled, R>,
package/src/Binding.ts CHANGED
@@ -141,7 +141,7 @@ export const Policy =
141
141
  Effect.flatMap((service) =>
142
142
  service
143
143
  ? Effect.succeed(service)
144
- : Effect.all([CurrentStack, ALCHEMY_PHASE.asEffect()]).pipe(
144
+ : Effect.all([CurrentStack, ALCHEMY_PHASE]).pipe(
145
145
  Effect.flatMap(([stack, phase]) =>
146
146
  stack && phase === "plan"
147
147
  ? Effect.die(
@@ -154,7 +154,7 @@ export const Policy =
154
154
  );
155
155
 
156
156
  const asEffect = () =>
157
- Effect.all([Self.asEffect(), Service]).pipe(
157
+ Effect.all([Self, Service]).pipe(
158
158
  Effect.map(
159
159
  ([resource, fn]) =>
160
160
  (...args: any[]) =>
@@ -174,7 +174,7 @@ export const Policy =
174
174
  // @ts-expect-error
175
175
  return Object.assign(self, {
176
176
  [Symbol.iterator]() {
177
- return new SingleShotGen(this);
177
+ return new SingleShotGen(asEffect());
178
178
  },
179
179
  asEffect,
180
180
  bind: (...args: any[]) =>
@@ -190,9 +190,7 @@ export const Policy =
190
190
  self,
191
191
  // @ts-expect-error
192
192
  (...args: Parameters<Shape>) =>
193
- Self.asEffect().pipe(
194
- Effect.flatMap((self) => fn(self as ResourceLike, ...args)),
195
- ),
193
+ Self.use((self) => fn(self as ResourceLike, ...args)),
196
194
  ),
197
195
  effect: (
198
196
  fn: Effect.Effect<
@@ -209,9 +207,7 @@ export const Policy =
209
207
  fn,
210
208
  (fn) =>
211
209
  (...args: Parameters<Shape>) =>
212
- Effect.flatMap(Self.asEffect(), (self) =>
213
- fn(self as ResourceLike, ...args),
214
- ),
210
+ Self.use((self) => fn(self as ResourceLike, ...args)),
215
211
  ),
216
212
  ),
217
213
  },
@@ -3,7 +3,7 @@ import * as Effect from "effect/Effect";
3
3
  import * as FileSystem from "effect/FileSystem";
4
4
  import * as Path from "effect/Path";
5
5
  import { ChildProcess } from "effect/unstable/process";
6
- import { exec } from "../Agent/util/exec.ts";
6
+ import { exec } from "../Util/exec.ts";
7
7
 
8
8
  export class DockerCommandError extends Data.TaggedError("DockerCommandError")<{
9
9
  readonly command: string;
package/src/Cli/Event.ts CHANGED
@@ -12,6 +12,10 @@ export type ApplyStatus =
12
12
  | "deleted"
13
13
  | "replacing"
14
14
  | "replaced"
15
+ // Task lifecycle (see {@link Task})
16
+ | "running"
17
+ | "ran"
18
+ | "skipped"
15
19
  | "fail";
16
20
 
17
21
  export type ApplyEvent = AnnotateEvent | StatusChangeEvent;