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/Plan.ts CHANGED
@@ -42,12 +42,17 @@ import {
42
42
  State,
43
43
  type CreatedResourceState,
44
44
  type CreatingResourceState,
45
+ isActionState,
46
+ type RanActionState,
45
47
  type ReplacedResourceState,
46
48
  type ReplacingResourceState,
47
49
  type ResourceState,
50
+ type ActionState,
48
51
  type UpdatedResourceState,
49
52
  type UpdatingReourceState,
50
53
  } from "./State/index.ts";
54
+ import { isAction, type ActionLike } from "./Action.ts";
55
+ import { hashInput } from "./Util/hash.ts";
51
56
  import { findCycleMembers } from "./Util/scc.ts";
52
57
 
53
58
  export type PlanError = never;
@@ -148,13 +153,66 @@ export interface Replace<
148
153
  | ReplacedResourceState;
149
154
  }
150
155
 
156
+ // ── Tasks ──────────────────────────────────────────────────────────────────
157
+ //
158
+ // Tasks live in the same FQN namespace as resources and participate in the
159
+ // same DAG (downstream/upstream edges, cycle detection). Their plan nodes
160
+ // have a different shape because they have no provider lifecycle.
161
+
162
+ export type ActionApply<T extends ActionLike = ActionLike> =
163
+ | ActionRun<T>
164
+ | ActionNoop<T>;
165
+
166
+ export interface ActionNodeBase<T extends ActionLike = ActionLike> {
167
+ readonly kind: "action";
168
+ def: T;
169
+ downstream: string[];
170
+ }
171
+
172
+ export interface ActionRun<
173
+ T extends ActionLike = ActionLike,
174
+ > extends ActionNodeBase<T> {
175
+ action: "run";
176
+ /** Input expression — resolved against tracker outputs during apply. */
177
+ input: T["Input"];
178
+ /** Previous state, if any. `undefined` on the first run. */
179
+ state: ActionState | undefined;
180
+ /** True when `--force` triggered the re-run regardless of input drift. */
181
+ forced: boolean;
182
+ }
183
+
184
+ export interface ActionNoop<
185
+ T extends ActionLike = ActionLike,
186
+ > extends ActionNodeBase<T> {
187
+ action: "noop";
188
+ state: RanActionState;
189
+ }
190
+
191
+ export interface ActionDelete<
192
+ T extends ActionLike = ActionLike,
193
+ > extends ActionNodeBase<T> {
194
+ action: "delete";
195
+ state: ActionState;
196
+ }
197
+
151
198
  export type Plan<Output = any> = {
152
199
  resources: {
153
200
  [id in string]: Apply<any>;
154
201
  };
202
+ /**
203
+ * Tasks scheduled for this apply. Keyed by FQN, same namespace as
204
+ * `resources` — Apply's scheduler merges both into a single DAG.
205
+ */
206
+ actions: {
207
+ [id in string]: ActionApply;
208
+ };
155
209
  deletions: {
156
210
  [id in string]?: Delete<ResourceLike>;
157
211
  };
212
+ /** Tasks whose state should be dropped (no body invoked on removal). */
213
+ actionDeletions: {
214
+ [id in string]?: ActionDelete;
215
+ };
158
216
  output: Output;
159
217
  /**
160
218
  * FQNs of resources that participate in a strongly-connected component
@@ -179,6 +237,7 @@ export const make = <A>(
179
237
  const state = yield* State;
180
238
 
181
239
  const resources = Object.values(stack.resources);
240
+ const actions = Object.values(stack.actions ?? {});
182
241
 
183
242
  // TODO(sam): rename terminology to Stack
184
243
  const stackName = stack.name;
@@ -215,6 +274,12 @@ export const make = <A>(
215
274
  resourceExpr: Output.ResourceExpr<any, any>,
216
275
  ): Effect.Effect<any> =>
217
276
  Effect.gen(function* () {
277
+ // Tasks share the ResourceExpr machinery but have no provider /
278
+ // stable-properties story at plan time. Leave the expression
279
+ // unsubstituted — Apply resolves it from the tracker at run time.
280
+ if (isAction(resourceExpr.src as any)) {
281
+ return resourceExpr;
282
+ }
218
283
  // @ts-expect-error
219
284
  return yield* (resolvedResources[resourceExpr.src.FQN] ??=
220
285
  yield* Effect.cached(
@@ -223,11 +288,16 @@ export const make = <A>(
223
288
 
224
289
  const provider = yield* findProviderByType(resource.Type);
225
290
  const props = yield* resolveInput(resource.Props);
226
- const oldState = yield* state.get({
291
+ const persisted = yield* state.get({
227
292
  stack: stackName,
228
293
  stage: stage,
229
294
  fqn: resource.FQN,
230
295
  });
296
+ const oldState: ResourceState | undefined = isActionState(
297
+ persisted,
298
+ )
299
+ ? undefined
300
+ : (persisted as ResourceState | undefined);
231
301
 
232
302
  if (!oldState || oldState.status === "creating") {
233
303
  return resourceExpr;
@@ -369,7 +439,7 @@ export const make = <A>(
369
439
  }),
370
440
  );
371
441
  }
372
- return refState.attr;
442
+ return (refState as any).attr ?? (refState as any).output;
373
443
  } else if (Output.isStackRefExpr(expr)) {
374
444
  const refStack = expr.stack;
375
445
  const refStage = expr.stage ?? stage;
@@ -409,16 +479,30 @@ export const make = <A>(
409
479
 
410
480
  // Build a set of FQNs for the new resources to detect orphans
411
481
  const newResourceFqns = new Set(resources.map((r) => r.FQN));
482
+ const newActionFqns = new Set(actions.map((t) => t.FQN));
483
+ // Unified set used wherever the DAG must include both kinds.
484
+ const newNodeFqns = new Set<string>([...newResourceFqns, ...newActionFqns]);
412
485
 
413
- // Map FQN -> list of upstream FQNs (resources this one depends on via props)
486
+ // Map FQN -> list of upstream FQNs (resources this one depends on via props).
487
+ // Tasks contribute upstream edges through their `Input` expression.
414
488
  const newUpstreamDependencies: {
415
489
  [fqn: string]: string[];
416
- } = Object.fromEntries(
417
- resources.map((resource) => [
418
- resource.FQN,
419
- Object.values(Output.upstreamAny(resource.Props)).map((r) => r.FQN),
420
- ]),
421
- );
490
+ } = Object.fromEntries([
491
+ ...resources.map(
492
+ (resource) =>
493
+ [
494
+ resource.FQN,
495
+ Object.values(Output.upstreamAny(resource.Props)).map((r) => r.FQN),
496
+ ] as const,
497
+ ),
498
+ ...actions.map(
499
+ (action) =>
500
+ [
501
+ action.FQN,
502
+ Object.values(Output.upstreamAny(action.Input)).map((r) => r.FQN),
503
+ ] as const,
504
+ ),
505
+ ]);
422
506
 
423
507
  // Map FQN -> list of upstream FQNs from bindings
424
508
  const bindingUpstreamDependencies: {
@@ -437,33 +521,44 @@ export const make = <A>(
437
521
  // tell whether any surviving resource still points at an orphan.
438
522
  const rawUpstreamDependencies: {
439
523
  [fqn: string]: string[];
440
- } = Object.fromEntries(
441
- resources.map((resource) => {
524
+ } = Object.fromEntries<string[]>([
525
+ ...resources.map((resource): [string, string[]] => {
442
526
  const fqn = resource.FQN;
443
527
  const propDeps = newUpstreamDependencies[fqn] ?? [];
444
528
  const bindDeps = bindingUpstreamDependencies[fqn] ?? [];
445
529
  return [fqn, [...new Set([...propDeps, ...bindDeps])]];
446
530
  }),
447
- );
531
+ // Actions have no bindings — their upstream is purely their input.
532
+ ...actions.map((action): [string, string[]] => {
533
+ const fqn = action.FQN;
534
+ return [fqn, newUpstreamDependencies[fqn] ?? []];
535
+ }),
536
+ ]);
448
537
 
449
- // Combined prop + binding upstream, filtered to resources in this graph for
450
- // scheduling and cycle detection.
538
+ // Combined prop + binding upstream, filtered to resources/tasks in this
539
+ // graph for scheduling and cycle detection.
451
540
  const allUpstreamDependencies: {
452
541
  [fqn: string]: string[];
453
- } = Object.fromEntries(
454
- resources.map((resource) => {
542
+ } = Object.fromEntries([
543
+ ...resources.map((resource) => {
455
544
  const fqn = resource.FQN;
456
545
  const deps = rawUpstreamDependencies[fqn] ?? [];
457
- return [fqn, deps.filter((dep) => newResourceFqns.has(dep))];
546
+ return [fqn, deps.filter((dep) => newNodeFqns.has(dep))] as const;
458
547
  }),
459
- );
548
+ ...actions.map((action) => {
549
+ const fqn = action.FQN;
550
+ const deps = newUpstreamDependencies[fqn] ?? [];
551
+ return [fqn, deps.filter((dep) => newNodeFqns.has(dep))] as const;
552
+ }),
553
+ ]);
460
554
 
461
555
  // Resources that participate in a cycle when both prop and binding
462
556
  // edges are considered. Used below to decide whether an acyclic
463
557
  // binding edge should also become a downstream edge.
464
558
  const combinedCycleMembers = findCycleMembers(allUpstreamDependencies);
465
559
 
466
- // Map FQN -> list of downstream FQNs (resources that depend on this one).
560
+ // Map FQN -> list of downstream FQNs (resources/actions that depend on
561
+ // this one).
467
562
  //
468
563
  // Prop edges always become downstream edges — they can't form cycles
469
564
  // (the resource graph is a DAG by construction once props are fully
@@ -481,37 +576,46 @@ export const make = <A>(
481
576
  // removed. Without the binding edge in `downstream`, the two delete
482
577
  // concurrently and the upstream delete fails with
483
578
  // `ServiceBindingConflict`.
484
- const newDownstreamDependencies: {
485
- [fqn: string]: string[];
486
- } = Object.fromEntries(
487
- resources.map((resource) => {
488
- const upFqn = resource.FQN;
489
- const downstream: string[] = [];
490
- for (const [downFqn, upstreams] of Object.entries(
491
- rawUpstreamDependencies,
492
- )) {
493
- if (downFqn === upFqn) continue;
494
- if (!upstreams.includes(upFqn)) continue;
495
- const isPropEdge = (newUpstreamDependencies[downFqn] ?? []).includes(
496
- upFqn,
497
- );
498
- if (isPropEdge) {
499
- downstream.push(downFqn);
500
- continue;
501
- }
502
- // Binding-only edge — exclude when both endpoints sit inside
503
- // the same SCC of the combined graph.
504
- if (
505
- combinedCycleMembers.has(upFqn) &&
506
- combinedCycleMembers.has(downFqn)
507
- ) {
508
- continue;
509
- }
579
+ //
580
+ // Actions don't have bindings, so for action upstreams we use only
581
+ // prop edges (which collapse to `newUpstreamDependencies` lookups).
582
+ const computeDownstream = (upFqn: string): string[] => {
583
+ const downstream: string[] = [];
584
+ for (const [downFqn, upstreams] of Object.entries(
585
+ rawUpstreamDependencies,
586
+ )) {
587
+ if (downFqn === upFqn) continue;
588
+ if (!upstreams.includes(upFqn)) continue;
589
+ const isPropEdge = (newUpstreamDependencies[downFqn] ?? []).includes(
590
+ upFqn,
591
+ );
592
+ if (isPropEdge) {
510
593
  downstream.push(downFqn);
594
+ continue;
511
595
  }
512
- return [upFqn, downstream];
513
- }),
514
- );
596
+ // Binding-only edge — exclude when both endpoints sit inside
597
+ // the same SCC of the combined graph.
598
+ if (
599
+ combinedCycleMembers.has(upFqn) &&
600
+ combinedCycleMembers.has(downFqn)
601
+ ) {
602
+ continue;
603
+ }
604
+ downstream.push(downFqn);
605
+ }
606
+ return downstream;
607
+ };
608
+
609
+ const newDownstreamDependencies: {
610
+ [fqn: string]: string[];
611
+ } = Object.fromEntries([
612
+ ...resources.map(
613
+ (resource) => [resource.FQN, computeDownstream(resource.FQN)] as const,
614
+ ),
615
+ ...actions.map(
616
+ (action) => [action.FQN, computeDownstream(action.FQN)] as const,
617
+ ),
618
+ ]);
515
619
 
516
620
  const resourceGraph = Object.fromEntries(
517
621
  (yield* Effect.all(
@@ -526,11 +630,17 @@ export const make = <A>(
526
630
  const newBindings: ResourceBinding[] = yield* resolveInput(
527
631
  stack.bindings[fqn] ?? [],
528
632
  );
529
- let oldState = yield* state.get({
633
+ const persisted = yield* state.get({
530
634
  stack: stackName,
531
635
  stage: stage,
532
636
  fqn,
533
637
  });
638
+ // A Task previously held this FQN. Treat as if there were no
639
+ // prior state — the Task's row will be reaped by `actionDeletions`
640
+ // below and the resource starts from scratch.
641
+ let oldState: ResourceState | undefined = isActionState(persisted)
642
+ ? undefined
643
+ : (persisted as ResourceState | undefined);
534
644
 
535
645
  // Engine-level adoption. When there is no prior state, always
536
646
  // consult `provider.read` (if implemented) so the engine — not
@@ -877,6 +987,71 @@ export const make = <A>(
877
987
  )).map((update) => [update.resource.FQN, update]),
878
988
  ) as Plan["resources"];
879
989
 
990
+ // ── Action plan nodes ────────────────────────────────────────────────
991
+ const actionGraph = Object.fromEntries(
992
+ (yield* Effect.all(
993
+ actions.map(
994
+ Effect.fn("plan.diff.action")(function* (action) {
995
+ const fqn = action.FQN;
996
+ const downstream = newDownstreamDependencies[fqn] ?? [];
997
+ const resolvedInput = yield* resolveInput(action.Input);
998
+ const inputHash = yield* hashInput(resolvedInput);
999
+ const oldState = yield* state.get({
1000
+ stack: stackName,
1001
+ stage,
1002
+ fqn,
1003
+ });
1004
+
1005
+ if (oldState && !isActionState(oldState)) {
1006
+ // FQN collision with a resource — surface as a fatal error so
1007
+ // the user resolves it before we touch anything.
1008
+ return [
1009
+ fqn,
1010
+ {
1011
+ kind: "action",
1012
+ action: "run",
1013
+ def: action,
1014
+ input: action.Input,
1015
+ state: undefined,
1016
+ downstream,
1017
+ forced: false,
1018
+ } satisfies ActionRun,
1019
+ ] as const;
1020
+ }
1021
+
1022
+ const prior = oldState as ActionState | undefined;
1023
+ const sameInput =
1024
+ prior?.status === "ran" && prior.inputHash === inputHash;
1025
+ if (sameInput && !options.force) {
1026
+ return [
1027
+ fqn,
1028
+ {
1029
+ kind: "action",
1030
+ action: "noop",
1031
+ def: action,
1032
+ state: prior as RanActionState,
1033
+ downstream,
1034
+ } satisfies ActionNoop,
1035
+ ] as const;
1036
+ }
1037
+ return [
1038
+ fqn,
1039
+ {
1040
+ kind: "action",
1041
+ action: "run",
1042
+ def: action,
1043
+ input: action.Input,
1044
+ state: prior,
1045
+ downstream,
1046
+ forced: !!options.force,
1047
+ } satisfies ActionRun,
1048
+ ] as const;
1049
+ }),
1050
+ ),
1051
+ { concurrency: "unbounded" },
1052
+ )) as ReadonlyArray<readonly [string, ActionApply]>,
1053
+ ) as Plan["actions"];
1054
+
880
1055
  // SCC membership of the combined upstream graph. Apply uses it to
881
1056
  // decide whether an update node must publish its prior attr early to
882
1057
  // break a cycle, or can simply wait for upstreams like a DAG node
@@ -944,18 +1119,61 @@ export const make = <A>(
944
1119
  }
945
1120
  }
946
1121
 
1122
+ // Task deletions: state rows previously written by tasks that no
1123
+ // longer appear in the stack. The body is NOT invoked — we just drop
1124
+ // the row.
1125
+ const actionDeletions: Plan["actionDeletions"] = Object.fromEntries(
1126
+ (yield* Effect.all(
1127
+ (yield* state.list({ stack: stackName, stage })).map(
1128
+ Effect.fn("plan.diff.actionDeletion")(function* (fqn) {
1129
+ if (newActionFqns.has(fqn) || newResourceFqns.has(fqn)) return;
1130
+ const persisted = yield* state.get({
1131
+ stack: stackName,
1132
+ stage,
1133
+ fqn,
1134
+ });
1135
+ if (!isActionState(persisted)) return;
1136
+ const { logicalId } = parseFqn(fqn);
1137
+ return [
1138
+ fqn,
1139
+ {
1140
+ kind: "action",
1141
+ action: "delete",
1142
+ state: persisted,
1143
+ downstream: persisted.downstream ?? [],
1144
+ def: {
1145
+ Kind: "action",
1146
+ Namespace: persisted.namespace,
1147
+ FQN: fqn,
1148
+ LogicalId: logicalId,
1149
+ Type: persisted.actionType,
1150
+ Input: persisted.input,
1151
+ Run: () => undefined as any,
1152
+ Output: undefined as any,
1153
+ } satisfies ActionLike,
1154
+ } satisfies ActionDelete,
1155
+ ] as const;
1156
+ }),
1157
+ ),
1158
+ { concurrency: "unbounded" },
1159
+ )).filter((v): v is NonNullable<typeof v> => !!v),
1160
+ );
1161
+
947
1162
  const deletions = Object.fromEntries(
948
1163
  (yield* Effect.all(
949
1164
  (yield* state.list({ stack: stackName, stage: stage })).map(
950
1165
  Effect.fn("plan.diff.deletion")(function* (fqn) {
951
- if (newResourceFqns.has(fqn)) {
1166
+ if (newResourceFqns.has(fqn) || newActionFqns.has(fqn)) {
952
1167
  return;
953
1168
  }
954
- const oldState = yield* state.get({
1169
+ const persisted = yield* state.get({
955
1170
  stack: stackName,
956
1171
  stage: stage,
957
1172
  fqn,
958
1173
  });
1174
+ // Tasks are routed through `actionDeletions` above.
1175
+ if (isActionState(persisted)) return;
1176
+ const oldState = persisted as ResourceState | undefined;
959
1177
  let attr: any = oldState?.attr;
960
1178
  if (oldState) {
961
1179
  const { logicalId } = parseFqn(fqn);
@@ -1025,7 +1243,9 @@ export const make = <A>(
1025
1243
 
1026
1244
  return {
1027
1245
  resources: resourceGraph,
1246
+ actions: actionGraph,
1028
1247
  deletions,
1248
+ actionDeletions,
1029
1249
  output: stack.output,
1030
1250
  cycleMembers,
1031
1251
  } satisfies Plan<A> as Plan<A>;
@@ -1125,7 +1345,10 @@ export const printPlan = (plan: Plan): string => {
1125
1345
  "╠════════════════════════════════════════════════════════════════╣",
1126
1346
  );
1127
1347
  lines.push(
1128
- "║ Legend: + create, ~ update, - delete, ± replace, = noop ║",
1348
+ "║ Legend: + create, ~ update, - delete, ± replace, = noop, ║",
1349
+ );
1350
+ lines.push(
1351
+ "║ λ run task, · skip task ║",
1129
1352
  );
1130
1353
  lines.push(
1131
1354
  "╚════════════════════════════════════════════════════════════════╝",
@@ -1154,6 +1377,28 @@ export const printPlan = (plan: Plan): string => {
1154
1377
  );
1155
1378
  lines.push("");
1156
1379
 
1380
+ // Print tasks section
1381
+ lines.push(
1382
+ "┌─ Tasks ────────────────────────────────────────────────────────┐",
1383
+ );
1384
+ const taskIds = Object.keys(plan.actions ?? {}).sort();
1385
+ for (const id of taskIds) {
1386
+ const node = plan.actions[id];
1387
+ const symbol = node.action === "run" ? "λ" : "·";
1388
+ const type = node.def.Type;
1389
+ const downstream = node.downstream.length
1390
+ ? ` → [${node.downstream.join(", ")}]`
1391
+ : "";
1392
+ lines.push(`│ [${symbol}] ${id} (${type})${downstream}`);
1393
+ }
1394
+ if (taskIds.length === 0) {
1395
+ lines.push("│ (none)");
1396
+ }
1397
+ lines.push(
1398
+ "└────────────────────────────────────────────────────────────────┘",
1399
+ );
1400
+ lines.push("");
1401
+
1157
1402
  // Print deletions section
1158
1403
  lines.push(
1159
1404
  "┌─ Deletions ────────────────────────────────────────────────────┐",
@@ -1167,7 +1412,12 @@ export const printPlan = (plan: Plan): string => {
1167
1412
  : "";
1168
1413
  lines.push(`│ [-] ${id} (${type})${downstream}`);
1169
1414
  }
1170
- if (deletionIds.length === 0) {
1415
+ const taskDeletionIds = Object.keys(plan.actionDeletions ?? {}).sort();
1416
+ for (const id of taskDeletionIds) {
1417
+ const node = plan.actionDeletions[id]!;
1418
+ lines.push(`│ [-] ${id} (${node.def.Type}) [action]`);
1419
+ }
1420
+ if (deletionIds.length === 0 && taskDeletionIds.length === 0) {
1171
1421
  lines.push("│ (none)");
1172
1422
  }
1173
1423
  lines.push(
package/src/Platform.ts CHANGED
@@ -270,7 +270,7 @@ export const Platform = <
270
270
  asEffect,
271
271
  // @ts-expect-error
272
272
  pipe: (...args: any[]) => asEffect().pipe(...args),
273
- [Symbol.iterator]: () => new SingleShotGen({ asEffect }),
273
+ [Symbol.iterator]: () => new SingleShotGen(asEffect()),
274
274
  },
275
275
  );
276
276
  } else {
@@ -289,18 +289,18 @@ export const Platform = <
289
289
  `Platform<${type}<${id}>>`,
290
290
  );
291
291
  static [Symbol.iterator](): Iterator<
292
- Effect.Yieldable<any, void, never, Self>,
292
+ Effect.Effect<void, never, Self>,
293
293
  Resource,
294
294
  void
295
295
  > {
296
- return new SingleShotGen(this) as any;
296
+ return new SingleShotGen(this.asEffect()) as any;
297
297
  }
298
298
  static asEffect() {
299
- return this.Self.asEffect();
299
+ return this.Self;
300
300
  }
301
301
  static pipe(...args: any[]) {
302
302
  // @ts-expect-error
303
- return pipe(this.asEffect(), ...args);
303
+ return pipe(this, ...args);
304
304
  }
305
305
  static of = (shape: any) => shape;
306
306
  static make = (impl: Impl) => {
@@ -375,7 +375,7 @@ export const Platform = <
375
375
  }),
376
376
  ),
377
377
  );
378
- const self = Self.asEffect() as any; // TODO(sam): why do we need to cast?
378
+ const self = Self as any; // TODO(sam): why do we need to cast?
379
379
 
380
380
  return Layer.provideMerge(
381
381
  Layer.mergeAll(
@@ -395,7 +395,7 @@ export const Platform = <
395
395
 
396
396
  const instance = Object.assign(constructor, resource, {
397
397
  Platform: Platform,
398
- asEffect: () => resource.Self.asEffect(),
398
+ asEffect: () => resource.Self,
399
399
  ...methods,
400
400
  }) as any;
401
401
  return instance;
package/src/Provider.ts CHANGED
@@ -16,7 +16,9 @@ import type {
16
16
  ResourceLike,
17
17
  } from "./Resource.ts";
18
18
 
19
- export interface Provider<R extends ResourceLike = ResourceLike> {
19
+ export interface Provider<
20
+ R extends ResourceLike = ResourceLike,
21
+ > extends Effect.Effect<ProviderService<R>, never, Provider<R>> {
20
22
  asEffect: () => Effect.Effect<ProviderService<R>, never, Provider<R>>;
21
23
  [Symbol.iterator]: () => Effect.EffectIterator<Provider<R>>;
22
24
  of: <
@@ -316,7 +318,7 @@ export const collection = <
316
318
  yield* Effect.all(
317
319
  resources.map((resource) =>
318
320
  "Provider" in resource
319
- ? resource.Provider.asEffect().pipe(
321
+ ? resource.Provider.pipe(
320
322
  Effect.map((provider) => [resource.Type, provider] as const),
321
323
  )
322
324
  : Effect.succeed([
@@ -372,7 +374,10 @@ export const tryFindProviderByType: {
372
374
  } = Effect.fnUntraced(function* <R extends ResourceLike>(
373
375
  resourceType: R["Type"],
374
376
  ) {
375
- const Tag = Provider<R>(resourceType) as Context.Service<Provider<R>, any>;
377
+ const Tag = Provider<R>(resourceType) as unknown as Context.Service<
378
+ Provider<R>,
379
+ any
380
+ >;
376
381
  const direct = yield* Effect.serviceOption(Tag);
377
382
  if (Option.isSome(direct)) {
378
383
  return direct;
package/src/Random.ts CHANGED
@@ -20,7 +20,7 @@ export type Random = Resource<
20
20
  >;
21
21
 
22
22
  export const makeRandom = (id: string, props?: RandomProps) =>
23
- Random(id, props).pipe(Effect.flatMap((rand) => rand.text.asEffect()));
23
+ Random(id, props).pipe(Effect.map((rand) => rand.text));
24
24
 
25
25
  /**
26
26
  * A deterministic-in-state random secret generator.
package/src/Resource.ts CHANGED
@@ -237,29 +237,6 @@ export function Resource<R extends ResourceLike>(
237
237
  [Symbol.toPrimitive](this: typeof target, hint: string) {
238
238
  return hint === "number" ? NaN : this.toString();
239
239
  },
240
- // TODO(sam): figure out a better way to log things in cloudflare, this breaks indentation and is bloated
241
- // [nodeInspect](
242
- // depth: number,
243
- // options: { depth?: number | null } & Record<string, unknown>,
244
- // inspect: (value: unknown, opts?: unknown) => string,
245
- // ) {
246
- // if (depth < 0) {
247
- // return target.toString();
248
- // }
249
- // const nextDepth =
250
- // options.depth == null ? null : Math.max(0, options.depth - 1);
251
- // return inspect(
252
- // {
253
- // Type: target.Type,
254
- // Namespace: target.Namespace,
255
- // FQN: target.FQN,
256
- // LogicalId: target.LogicalId,
257
- // Props: target.Props,
258
- // RemovalPolicy: target.RemovalPolicy,
259
- // },
260
- // { ...options, depth: nextDepth },
261
- // );
262
- // },
263
240
  };
264
241
 
265
242
  const Resource: R = (stack.resources[fqn] = new Proxy(target, {
@@ -285,10 +262,10 @@ export function Resource<R extends ResourceLike>(
285
262
 
286
263
  const Service = {
287
264
  [Symbol.iterator]() {
288
- return new SingleShotGen(this);
265
+ return new SingleShotGen(this.asEffect());
289
266
  },
290
267
  pipe() {
291
- return pipeArguments(this.asEffect(), arguments);
268
+ return pipeArguments(this, arguments);
292
269
  },
293
270
  asEffect() {
294
271
  return Effect.succeed((id: string, props: R["Props"]) =>