gate-evm-tools 1.0.27 → 1.0.31

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 (641) hide show
  1. package/README.md +16 -1
  2. package/bin/cli.js +3 -0
  3. package/bin/delivery.cjs +51 -0
  4. package/bin/manifest-bootstrap.js +4 -15
  5. package/bin/workflow.cjs +1 -1
  6. package/dist/commands/plan/file-store.d.ts.map +1 -0
  7. package/dist/commands/plan/generate-deployment.d.ts +48 -0
  8. package/dist/commands/plan/generate-deployment.d.ts.map +1 -0
  9. package/dist/commands/plan/generate-deployment.js +211 -0
  10. package/dist/commands/plan/generate-deployment.js.map +1 -0
  11. package/dist/commands/plan/helpers.d.ts.map +1 -0
  12. package/dist/commands/plan/index.d.ts +3 -0
  13. package/dist/commands/plan/index.d.ts.map +1 -0
  14. package/dist/commands/plan/index.js +88 -0
  15. package/dist/commands/plan/index.js.map +1 -0
  16. package/dist/commands/sync.js +1 -1
  17. package/dist/commands/sync.js.map +1 -1
  18. package/dist/core/BytecodeChecker.d.ts.map +1 -1
  19. package/dist/core/BytecodeChecker.js +27 -8
  20. package/dist/core/BytecodeChecker.js.map +1 -1
  21. package/dist/core/preparation/artifacts.d.ts +2 -0
  22. package/dist/core/preparation/artifacts.d.ts.map +1 -1
  23. package/dist/core/preparation/artifacts.js +9 -3
  24. package/dist/core/preparation/artifacts.js.map +1 -1
  25. package/dist/core/preparation/evm.d.ts +38 -2
  26. package/dist/core/preparation/evm.d.ts.map +1 -1
  27. package/dist/core/preparation/evm.js +104 -32
  28. package/dist/core/preparation/evm.js.map +1 -1
  29. package/dist/core/preparation/evmManifestSync.d.ts +63 -0
  30. package/dist/core/preparation/evmManifestSync.d.ts.map +1 -0
  31. package/dist/core/preparation/evmManifestSync.js +146 -0
  32. package/dist/core/preparation/evmManifestSync.js.map +1 -0
  33. package/dist/core/preparation/index.d.ts +40 -2
  34. package/dist/core/preparation/index.d.ts.map +1 -1
  35. package/dist/core/preparation/index.js +3 -3
  36. package/dist/core/preparation/index.js.map +1 -1
  37. package/dist/core/preparation/manifest.d.ts +15 -3
  38. package/dist/core/preparation/manifest.d.ts.map +1 -1
  39. package/dist/core/preparation/manifest.js +21 -26
  40. package/dist/core/preparation/manifest.js.map +1 -1
  41. package/dist/core/preparation/normalize.d.ts.map +1 -1
  42. package/dist/core/preparation/normalize.js +14 -9
  43. package/dist/core/preparation/normalize.js.map +1 -1
  44. package/dist/core/preparation/types.d.ts +7 -2
  45. package/dist/core/preparation/types.d.ts.map +1 -1
  46. package/dist/custody/hardhat-runtime.d.ts.map +1 -1
  47. package/dist/custody/hardhat-runtime.js +2 -0
  48. package/dist/custody/hardhat-runtime.js.map +1 -1
  49. package/dist/custody/hardhat.d.ts +1 -0
  50. package/dist/custody/hardhat.d.ts.map +1 -1
  51. package/dist/custody/hardhat.js +1 -0
  52. package/dist/custody/hardhat.js.map +1 -1
  53. package/dist/custody/index.d.ts +1 -0
  54. package/dist/custody/index.d.ts.map +1 -1
  55. package/dist/custody/index.js +1 -0
  56. package/dist/custody/index.js.map +1 -1
  57. package/dist/custody/provider-wait.d.ts +13 -0
  58. package/dist/custody/provider-wait.d.ts.map +1 -0
  59. package/dist/custody/provider-wait.js +78 -0
  60. package/dist/custody/provider-wait.js.map +1 -0
  61. package/dist/delivery/policy.d.ts +6 -0
  62. package/dist/delivery/policy.d.ts.map +1 -0
  63. package/dist/delivery/policy.js +24 -0
  64. package/dist/delivery/policy.js.map +1 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +5 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/sync/index.d.ts +15 -0
  69. package/dist/sync/index.d.ts.map +1 -1
  70. package/dist/sync/index.js +8 -0
  71. package/dist/sync/index.js.map +1 -1
  72. package/dist/workflow/index.d.ts +6 -1
  73. package/dist/workflow/index.d.ts.map +1 -1
  74. package/dist/workflow/index.js +4 -0
  75. package/dist/workflow/index.js.map +1 -1
  76. package/dist-cjs/core/BytecodeChecker.js +526 -0
  77. package/dist-cjs/core/BytecodeChecker.js.map +1 -0
  78. package/dist-cjs/core/legacyProxyArtifact.js +42 -0
  79. package/dist-cjs/core/legacyProxyArtifact.js.map +1 -0
  80. package/dist-cjs/core/preparation/artifacts.js +11 -4
  81. package/dist-cjs/core/preparation/artifacts.js.map +1 -1
  82. package/dist-cjs/core/preparation/evm.js +105 -32
  83. package/dist-cjs/core/preparation/evm.js.map +1 -1
  84. package/dist-cjs/core/preparation/evmManifestSync.js +155 -0
  85. package/dist-cjs/core/preparation/evmManifestSync.js.map +1 -0
  86. package/dist-cjs/core/preparation/index.js +3 -3
  87. package/dist-cjs/core/preparation/index.js.map +1 -1
  88. package/dist-cjs/core/preparation/manifest.js +23 -28
  89. package/dist-cjs/core/preparation/manifest.js.map +1 -1
  90. package/dist-cjs/core/preparation/normalize.js +14 -9
  91. package/dist-cjs/core/preparation/normalize.js.map +1 -1
  92. package/dist-cjs/custody/hardhat-runtime.js +2 -0
  93. package/dist-cjs/custody/hardhat-runtime.js.map +1 -1
  94. package/dist-cjs/custody/hardhat.js +3 -1
  95. package/dist-cjs/custody/hardhat.js.map +1 -1
  96. package/dist-cjs/custody/index.js +3 -1
  97. package/dist-cjs/custody/index.js.map +1 -1
  98. package/dist-cjs/custody/provider-wait.js +81 -0
  99. package/dist-cjs/custody/provider-wait.js.map +1 -0
  100. package/dist-cjs/delivery/policy.js +29 -0
  101. package/dist-cjs/delivery/policy.js.map +1 -0
  102. package/dist-cjs/sync/index.js +8 -0
  103. package/dist-cjs/sync/index.js.map +1 -1
  104. package/dist-cjs/workflow/index.js +12 -1
  105. package/dist-cjs/workflow/index.js.map +1 -1
  106. package/dist-runtime/config/hardhatAdapters.d.ts +2 -0
  107. package/dist-runtime/config/hardhatAdapters.js +8 -0
  108. package/dist-runtime/config/hardhatAdapters.js.map +1 -1
  109. package/dist-runtime/config/networks.d.ts +25 -1
  110. package/dist-runtime/config/networks.js +8 -2
  111. package/dist-runtime/config/networks.js.map +1 -1
  112. package/dist-runtime/config/openzeppelin.d.ts +2 -1
  113. package/dist-runtime/config/openzeppelin.js +2 -19
  114. package/dist-runtime/config/openzeppelin.js.map +1 -1
  115. package/dist-runtime/delivery/abi.d.ts +14 -0
  116. package/dist-runtime/delivery/abi.js +161 -0
  117. package/dist-runtime/delivery/abi.js.map +1 -0
  118. package/dist-runtime/delivery/aggregate-bootstrap.d.ts +12 -0
  119. package/dist-runtime/delivery/aggregate-bootstrap.js +40 -0
  120. package/dist-runtime/delivery/aggregate-bootstrap.js.map +1 -0
  121. package/dist-runtime/delivery/aggregate-channel.d.ts +28 -0
  122. package/dist-runtime/delivery/aggregate-channel.js +155 -0
  123. package/dist-runtime/delivery/aggregate-channel.js.map +1 -0
  124. package/dist-runtime/delivery/aggregate-inputs.d.ts +168 -0
  125. package/dist-runtime/delivery/aggregate-inputs.js +57 -0
  126. package/dist-runtime/delivery/aggregate-inputs.js.map +1 -0
  127. package/dist-runtime/delivery/aggregate-source.d.ts +25 -0
  128. package/dist-runtime/delivery/aggregate-source.js +79 -0
  129. package/dist-runtime/delivery/aggregate-source.js.map +1 -0
  130. package/dist-runtime/delivery/aggregate-worker.d.ts +1 -0
  131. package/dist-runtime/delivery/aggregate-worker.js +191 -0
  132. package/dist-runtime/delivery/aggregate-worker.js.map +1 -0
  133. package/dist-runtime/delivery/aggregate.d.ts +51 -0
  134. package/dist-runtime/delivery/aggregate.js +190 -0
  135. package/dist-runtime/delivery/aggregate.js.map +1 -0
  136. package/dist-runtime/delivery/bindings.d.ts +21 -0
  137. package/dist-runtime/delivery/bindings.js +53 -0
  138. package/dist-runtime/delivery/bindings.js.map +1 -0
  139. package/dist-runtime/delivery/check-code.d.ts +19 -0
  140. package/dist-runtime/delivery/check-code.js +63 -0
  141. package/dist-runtime/delivery/check-code.js.map +1 -0
  142. package/dist-runtime/delivery/closure-format.d.ts +77 -0
  143. package/dist-runtime/delivery/closure-format.js +225 -0
  144. package/dist-runtime/delivery/closure-format.js.map +1 -0
  145. package/dist-runtime/delivery/codec-pin.d.ts +2 -0
  146. package/dist-runtime/delivery/codec-pin.js +7 -0
  147. package/dist-runtime/delivery/codec-pin.js.map +1 -0
  148. package/dist-runtime/delivery/codec.d.ts +19 -0
  149. package/dist-runtime/delivery/codec.js +73 -0
  150. package/dist-runtime/delivery/codec.js.map +1 -0
  151. package/dist-runtime/delivery/compiler-dependency-pins.d.ts +7 -0
  152. package/dist-runtime/delivery/compiler-dependency-pins.js +1689 -0
  153. package/dist-runtime/delivery/compiler-dependency-pins.js.map +1 -0
  154. package/dist-runtime/delivery/compiler-files.d.ts +40 -0
  155. package/dist-runtime/delivery/compiler-files.js +220 -0
  156. package/dist-runtime/delivery/compiler-files.js.map +1 -0
  157. package/dist-runtime/delivery/compiler-io.d.ts +2 -0
  158. package/dist-runtime/delivery/compiler-io.js +13 -0
  159. package/dist-runtime/delivery/compiler-io.js.map +1 -0
  160. package/dist-runtime/delivery/compiler-pins.d.ts +10 -0
  161. package/dist-runtime/delivery/compiler-pins.js +147 -0
  162. package/dist-runtime/delivery/compiler-pins.js.map +1 -0
  163. package/dist-runtime/delivery/compiler.d.ts +188 -0
  164. package/dist-runtime/delivery/compiler.js +850 -0
  165. package/dist-runtime/delivery/compiler.js.map +1 -0
  166. package/dist-runtime/delivery/config.d.ts +48 -0
  167. package/dist-runtime/delivery/config.js +99 -0
  168. package/dist-runtime/delivery/config.js.map +1 -0
  169. package/dist-runtime/delivery/configuration-definition.d.ts +22 -0
  170. package/dist-runtime/delivery/configuration-definition.js +316 -0
  171. package/dist-runtime/delivery/configuration-definition.js.map +1 -0
  172. package/dist-runtime/delivery/configuration-hre.d.ts +17 -0
  173. package/dist-runtime/delivery/configuration-hre.js +198 -0
  174. package/dist-runtime/delivery/configuration-hre.js.map +1 -0
  175. package/dist-runtime/delivery/configuration-runtime.d.ts +36 -0
  176. package/dist-runtime/delivery/configuration-runtime.js +248 -0
  177. package/dist-runtime/delivery/configuration-runtime.js.map +1 -0
  178. package/dist-runtime/delivery/configuration.d.ts +35 -0
  179. package/dist-runtime/delivery/configuration.js +83 -0
  180. package/dist-runtime/delivery/configuration.js.map +1 -0
  181. package/dist-runtime/delivery/create2.d.ts +3 -0
  182. package/dist-runtime/delivery/create2.js +48 -0
  183. package/dist-runtime/delivery/create2.js.map +1 -0
  184. package/dist-runtime/delivery/custom-closure.d.ts +27 -0
  185. package/dist-runtime/delivery/custom-closure.js +818 -0
  186. package/dist-runtime/delivery/custom-closure.js.map +1 -0
  187. package/dist-runtime/delivery/custom-format.d.ts +35 -0
  188. package/dist-runtime/delivery/custom-format.js +383 -0
  189. package/dist-runtime/delivery/custom-format.js.map +1 -0
  190. package/dist-runtime/delivery/custom.d.ts +32 -0
  191. package/dist-runtime/delivery/custom.js +158 -0
  192. package/dist-runtime/delivery/custom.js.map +1 -0
  193. package/dist-runtime/delivery/data.d.ts +7 -0
  194. package/dist-runtime/delivery/data.js +86 -0
  195. package/dist-runtime/delivery/data.js.map +1 -0
  196. package/dist-runtime/delivery/development.d.ts +91 -0
  197. package/dist-runtime/delivery/development.js +395 -0
  198. package/dist-runtime/delivery/development.js.map +1 -0
  199. package/dist-runtime/delivery/engine.d.ts +9 -0
  200. package/dist-runtime/delivery/engine.js +23 -0
  201. package/dist-runtime/delivery/engine.js.map +1 -0
  202. package/dist-runtime/delivery/eoa-observation.d.ts +43 -0
  203. package/dist-runtime/delivery/eoa-observation.js +145 -0
  204. package/dist-runtime/delivery/eoa-observation.js.map +1 -0
  205. package/dist-runtime/delivery/eoa-signed.d.ts +2 -0
  206. package/dist-runtime/delivery/eoa-signed.js +74 -0
  207. package/dist-runtime/delivery/eoa-signed.js.map +1 -0
  208. package/dist-runtime/delivery/eoa.d.ts +81 -0
  209. package/dist-runtime/delivery/eoa.js +274 -0
  210. package/dist-runtime/delivery/eoa.js.map +1 -0
  211. package/dist-runtime/delivery/execution-db.d.ts +20 -0
  212. package/dist-runtime/delivery/execution-db.js +153 -0
  213. package/dist-runtime/delivery/execution-db.js.map +1 -0
  214. package/dist-runtime/delivery/execution-files.d.ts +9 -0
  215. package/dist-runtime/delivery/execution-files.js +138 -0
  216. package/dist-runtime/delivery/execution-files.js.map +1 -0
  217. package/dist-runtime/delivery/execution-model.d.ts +56 -0
  218. package/dist-runtime/delivery/execution-model.js +66 -0
  219. package/dist-runtime/delivery/execution-model.js.map +1 -0
  220. package/dist-runtime/delivery/execution-store.d.ts +48 -0
  221. package/dist-runtime/delivery/execution-store.js +361 -0
  222. package/dist-runtime/delivery/execution-store.js.map +1 -0
  223. package/dist-runtime/delivery/existing-code.d.ts +37 -0
  224. package/dist-runtime/delivery/existing-code.js +75 -0
  225. package/dist-runtime/delivery/existing-code.js.map +1 -0
  226. package/dist-runtime/delivery/export.d.ts +51 -0
  227. package/dist-runtime/delivery/export.js +69 -0
  228. package/dist-runtime/delivery/export.js.map +1 -0
  229. package/dist-runtime/delivery/forkAudit.d.ts +119 -0
  230. package/dist-runtime/delivery/forkAudit.js +473 -0
  231. package/dist-runtime/delivery/forkAudit.js.map +1 -0
  232. package/dist-runtime/delivery/hardhat.d.ts +3 -0
  233. package/dist-runtime/delivery/hardhat.js +45 -0
  234. package/dist-runtime/delivery/hardhat.js.map +1 -0
  235. package/dist-runtime/delivery/history-registration.d.ts +2 -0
  236. package/dist-runtime/delivery/history-registration.js +17 -0
  237. package/dist-runtime/delivery/history-registration.js.map +1 -0
  238. package/dist-runtime/delivery/identities.d.ts +22 -0
  239. package/dist-runtime/delivery/identities.js +97 -0
  240. package/dist-runtime/delivery/identities.js.map +1 -0
  241. package/dist-runtime/delivery/input-files.d.ts +5 -0
  242. package/dist-runtime/delivery/input-files.js +70 -0
  243. package/dist-runtime/delivery/input-files.js.map +1 -0
  244. package/dist-runtime/delivery/inputs.d.ts +62 -0
  245. package/dist-runtime/delivery/inputs.js +187 -0
  246. package/dist-runtime/delivery/inputs.js.map +1 -0
  247. package/dist-runtime/delivery/journal.d.ts +35 -0
  248. package/dist-runtime/delivery/journal.js +270 -0
  249. package/dist-runtime/delivery/journal.js.map +1 -0
  250. package/dist-runtime/delivery/manifest.d.ts +14 -0
  251. package/dist-runtime/delivery/manifest.js +68 -0
  252. package/dist-runtime/delivery/manifest.js.map +1 -0
  253. package/dist-runtime/delivery/materialization.d.ts +20 -0
  254. package/dist-runtime/delivery/materialization.js +138 -0
  255. package/dist-runtime/delivery/materialization.js.map +1 -0
  256. package/dist-runtime/delivery/observations.d.ts +31 -0
  257. package/dist-runtime/delivery/observations.js +38 -0
  258. package/dist-runtime/delivery/observations.js.map +1 -0
  259. package/dist-runtime/delivery/parameters.d.ts +53 -0
  260. package/dist-runtime/delivery/parameters.js +257 -0
  261. package/dist-runtime/delivery/parameters.js.map +1 -0
  262. package/dist-runtime/delivery/pending.d.ts +70 -0
  263. package/dist-runtime/delivery/pending.js +99 -0
  264. package/dist-runtime/delivery/pending.js.map +1 -0
  265. package/dist-runtime/delivery/plan.d.ts +50 -0
  266. package/dist-runtime/delivery/plan.js +209 -0
  267. package/dist-runtime/delivery/plan.js.map +1 -0
  268. package/dist-runtime/delivery/planning.d.ts +81 -0
  269. package/dist-runtime/delivery/planning.js +302 -0
  270. package/dist-runtime/delivery/planning.js.map +1 -0
  271. package/dist-runtime/delivery/policy.d.ts +4 -0
  272. package/dist-runtime/delivery/policy.js +9 -0
  273. package/dist-runtime/delivery/policy.js.map +1 -0
  274. package/dist-runtime/delivery/preparation.d.ts +6 -0
  275. package/dist-runtime/delivery/preparation.js +158 -0
  276. package/dist-runtime/delivery/preparation.js.map +1 -0
  277. package/dist-runtime/delivery/production-environment.d.ts +2 -0
  278. package/dist-runtime/delivery/production-environment.js +12 -0
  279. package/dist-runtime/delivery/production-environment.js.map +1 -0
  280. package/dist-runtime/delivery/production-finalization.d.ts +86 -0
  281. package/dist-runtime/delivery/production-finalization.js +278 -0
  282. package/dist-runtime/delivery/production-finalization.js.map +1 -0
  283. package/dist-runtime/delivery/production.d.ts +461 -0
  284. package/dist-runtime/delivery/production.js +396 -0
  285. package/dist-runtime/delivery/production.js.map +1 -0
  286. package/dist-runtime/delivery/project-files.d.ts +8 -0
  287. package/dist-runtime/delivery/project-files.js +82 -0
  288. package/dist-runtime/delivery/project-files.js.map +1 -0
  289. package/dist-runtime/delivery/project.d.ts +15 -0
  290. package/dist-runtime/delivery/project.js +157 -0
  291. package/dist-runtime/delivery/project.js.map +1 -0
  292. package/dist-runtime/delivery/protocol.d.ts +49 -0
  293. package/dist-runtime/delivery/protocol.js +112 -0
  294. package/dist-runtime/delivery/protocol.js.map +1 -0
  295. package/dist-runtime/delivery/references.d.ts +19 -0
  296. package/dist-runtime/delivery/references.js +84 -0
  297. package/dist-runtime/delivery/references.js.map +1 -0
  298. package/dist-runtime/delivery/release-graph.d.ts +93 -0
  299. package/dist-runtime/delivery/release-graph.js +106 -0
  300. package/dist-runtime/delivery/release-graph.js.map +1 -0
  301. package/dist-runtime/delivery/release-history-capture.d.ts +7 -0
  302. package/dist-runtime/delivery/release-history-capture.js +76 -0
  303. package/dist-runtime/delivery/release-history-capture.js.map +1 -0
  304. package/dist-runtime/delivery/release-history.d.ts +43 -0
  305. package/dist-runtime/delivery/release-history.js +246 -0
  306. package/dist-runtime/delivery/release-history.js.map +1 -0
  307. package/dist-runtime/delivery/release.d.ts +172 -0
  308. package/dist-runtime/delivery/release.js +209 -0
  309. package/dist-runtime/delivery/release.js.map +1 -0
  310. package/dist-runtime/delivery/safe-manifest.d.ts +9 -0
  311. package/dist-runtime/delivery/safe-manifest.js +13 -0
  312. package/dist-runtime/delivery/safe-manifest.js.map +1 -0
  313. package/dist-runtime/delivery/safe-observation.d.ts +30 -0
  314. package/dist-runtime/delivery/safe-observation.js +487 -0
  315. package/dist-runtime/delivery/safe-observation.js.map +1 -0
  316. package/dist-runtime/delivery/safe-prepare.d.ts +13 -0
  317. package/dist-runtime/delivery/safe-prepare.js +81 -0
  318. package/dist-runtime/delivery/safe-prepare.js.map +1 -0
  319. package/dist-runtime/delivery/safe.d.ts +91 -0
  320. package/dist-runtime/delivery/safe.js +243 -0
  321. package/dist-runtime/delivery/safe.js.map +1 -0
  322. package/dist-runtime/delivery/same-fork-baseline.d.ts +8 -0
  323. package/dist-runtime/delivery/same-fork-baseline.js +20 -0
  324. package/dist-runtime/delivery/same-fork-baseline.js.map +1 -0
  325. package/dist-runtime/delivery/setup.d.ts +31 -0
  326. package/dist-runtime/delivery/setup.js +215 -0
  327. package/dist-runtime/delivery/setup.js.map +1 -0
  328. package/dist-runtime/delivery/source.d.ts +41 -0
  329. package/dist-runtime/delivery/source.js +137 -0
  330. package/dist-runtime/delivery/source.js.map +1 -0
  331. package/dist-runtime/delivery/target-fields.d.ts +2 -0
  332. package/dist-runtime/delivery/target-fields.js +11 -0
  333. package/dist-runtime/delivery/target-fields.js.map +1 -0
  334. package/dist-runtime/delivery/validation.d.ts +9 -0
  335. package/dist-runtime/delivery/validation.js +150 -0
  336. package/dist-runtime/delivery/validation.js.map +1 -0
  337. package/dist-runtime/delivery/verification.d.ts +16 -0
  338. package/dist-runtime/delivery/verification.js +65 -0
  339. package/dist-runtime/delivery/verification.js.map +1 -0
  340. package/dist-runtime/migrate.js +1 -0
  341. package/dist-runtime/migrate.js.map +1 -1
  342. package/dist-runtime/miner/binary.d.ts +2 -0
  343. package/dist-runtime/miner/binary.js +54 -0
  344. package/dist-runtime/miner/binary.js.map +1 -0
  345. package/dist-runtime/miner/cli.d.ts +1 -0
  346. package/dist-runtime/miner/cli.js +131 -0
  347. package/dist-runtime/miner/cli.js.map +1 -0
  348. package/dist-runtime/miner/index.d.ts +5 -0
  349. package/dist-runtime/miner/index.js +13 -0
  350. package/dist-runtime/miner/index.js.map +1 -0
  351. package/dist-runtime/miner/request.d.ts +7 -0
  352. package/dist-runtime/miner/request.js +73 -0
  353. package/dist-runtime/miner/request.js.map +1 -0
  354. package/dist-runtime/miner/runner.d.ts +2 -0
  355. package/dist-runtime/miner/runner.js +131 -0
  356. package/dist-runtime/miner/runner.js.map +1 -0
  357. package/dist-runtime/miner/types.d.ts +89 -0
  358. package/dist-runtime/miner/types.js +3 -0
  359. package/dist-runtime/miner/types.js.map +1 -0
  360. package/dist-runtime/miner/verify.d.ts +2 -0
  361. package/dist-runtime/miner/verify.js +75 -0
  362. package/dist-runtime/miner/verify.js.map +1 -0
  363. package/dist-runtime/runtime-identity.json +2 -2
  364. package/dist-runtime/vendor/plan-codec/index.cjs +820 -0
  365. package/dist-runtime/vendor/plan-codec/index.d.cts +32 -0
  366. package/dist-runtime/vendor/plan-codec/provenance.json +24 -0
  367. package/dist-runtime/workflow/engine.d.ts +14 -0
  368. package/dist-runtime/workflow/engine.js +160 -0
  369. package/dist-runtime/workflow/engine.js.map +1 -0
  370. package/dist-runtime/workflow/lib/authority.d.ts +6 -3
  371. package/dist-runtime/workflow/lib/authority.js.map +1 -1
  372. package/dist-runtime/workflow/lib/calls.d.ts +1 -1
  373. package/dist-runtime/workflow/lib/calls.js +43 -34
  374. package/dist-runtime/workflow/lib/calls.js.map +1 -1
  375. package/dist-runtime/workflow/lib/canonicalData.d.ts +8 -0
  376. package/dist-runtime/workflow/lib/canonicalData.js +68 -0
  377. package/dist-runtime/workflow/lib/canonicalData.js.map +1 -0
  378. package/dist-runtime/workflow/lib/config.d.ts +3 -1
  379. package/dist-runtime/workflow/lib/config.js.map +1 -1
  380. package/dist-runtime/workflow/lib/context.d.ts +76 -0
  381. package/dist-runtime/workflow/lib/context.js +3 -0
  382. package/dist-runtime/workflow/lib/context.js.map +1 -0
  383. package/dist-runtime/workflow/lib/controlledMulticallAbi.d.ts +2 -0
  384. package/dist-runtime/workflow/lib/controlledMulticallAbi.js +10 -0
  385. package/dist-runtime/workflow/lib/controlledMulticallAbi.js.map +1 -0
  386. package/dist-runtime/workflow/lib/create2.d.ts +1 -1
  387. package/dist-runtime/workflow/lib/create2.js +9 -12
  388. package/dist-runtime/workflow/lib/create2.js.map +1 -1
  389. package/dist-runtime/workflow/lib/deployments.d.ts +5 -5
  390. package/dist-runtime/workflow/lib/deployments.js +5 -13
  391. package/dist-runtime/workflow/lib/deployments.js.map +1 -1
  392. package/dist-runtime/workflow/lib/evidencePorts.d.ts +55 -0
  393. package/dist-runtime/workflow/lib/evidencePorts.js +3 -0
  394. package/dist-runtime/workflow/lib/evidencePorts.js.map +1 -0
  395. package/dist-runtime/workflow/lib/executionPlan.d.ts +4 -42
  396. package/dist-runtime/workflow/lib/executionPlan.js +15 -210
  397. package/dist-runtime/workflow/lib/executionPlan.js.map +1 -1
  398. package/dist-runtime/workflow/lib/gateTool.d.ts +6 -2
  399. package/dist-runtime/workflow/lib/gateTool.js +20 -10
  400. package/dist-runtime/workflow/lib/gateTool.js.map +1 -1
  401. package/dist-runtime/workflow/lib/gateToolSync.d.ts +1 -1
  402. package/dist-runtime/workflow/lib/gateToolSync.js +3 -2
  403. package/dist-runtime/workflow/lib/gateToolSync.js.map +1 -1
  404. package/dist-runtime/workflow/lib/operationNames.d.ts +3 -0
  405. package/dist-runtime/workflow/lib/operationNames.js +34 -0
  406. package/dist-runtime/workflow/lib/operationNames.js.map +1 -0
  407. package/dist-runtime/workflow/lib/parameters.d.ts +1 -1
  408. package/dist-runtime/workflow/lib/parameters.js +9 -24
  409. package/dist-runtime/workflow/lib/parameters.js.map +1 -1
  410. package/dist-runtime/workflow/lib/pendingDeploymentReuse.js +18 -52
  411. package/dist-runtime/workflow/lib/pendingDeploymentReuse.js.map +1 -1
  412. package/dist-runtime/workflow/lib/pendingUupsBinding.d.ts +42 -0
  413. package/dist-runtime/workflow/lib/pendingUupsBinding.js +39 -0
  414. package/dist-runtime/workflow/lib/pendingUupsBinding.js.map +1 -0
  415. package/dist-runtime/workflow/lib/plan.d.ts +55 -0
  416. package/dist-runtime/workflow/lib/plan.js +324 -0
  417. package/dist-runtime/workflow/lib/plan.js.map +1 -0
  418. package/dist-runtime/workflow/lib/planCli.d.ts +14 -0
  419. package/dist-runtime/workflow/lib/planCli.js +279 -0
  420. package/dist-runtime/workflow/lib/planCli.js.map +1 -0
  421. package/dist-runtime/workflow/lib/preparationEvidence.d.ts +4 -0
  422. package/dist-runtime/workflow/lib/preparationEvidence.js +19 -0
  423. package/dist-runtime/workflow/lib/preparationEvidence.js.map +1 -0
  424. package/dist-runtime/workflow/lib/proxy.d.ts +3 -2
  425. package/dist-runtime/workflow/lib/proxy.js +3 -4
  426. package/dist-runtime/workflow/lib/proxy.js.map +1 -1
  427. package/dist-runtime/workflow/lib/runtime.d.ts +6 -0
  428. package/dist-runtime/workflow/lib/runtime.js +48 -0
  429. package/dist-runtime/workflow/lib/runtime.js.map +1 -0
  430. package/dist-runtime/workflow/lib/signer.d.ts +3 -2
  431. package/dist-runtime/workflow/lib/signer.js +18 -18
  432. package/dist-runtime/workflow/lib/signer.js.map +1 -1
  433. package/dist-runtime/workflow/lib/simulation.d.ts +13 -6
  434. package/dist-runtime/workflow/lib/simulation.js +39 -31
  435. package/dist-runtime/workflow/lib/simulation.js.map +1 -1
  436. package/dist-runtime/workflow/lib/state.js +3 -3
  437. package/dist-runtime/workflow/lib/state.js.map +1 -1
  438. package/dist-runtime/workflow/lib/staticValidation.d.ts +28 -0
  439. package/dist-runtime/workflow/lib/staticValidation.js +54 -10
  440. package/dist-runtime/workflow/lib/staticValidation.js.map +1 -1
  441. package/dist-runtime/workflow/lib/transactionPlanner.d.ts +62 -0
  442. package/dist-runtime/workflow/lib/transactionPlanner.js +258 -0
  443. package/dist-runtime/workflow/lib/transactionPlanner.js.map +1 -0
  444. package/dist-runtime/workflow/lib/typedValue.d.ts +3 -0
  445. package/dist-runtime/workflow/lib/typedValue.js +76 -0
  446. package/dist-runtime/workflow/lib/typedValue.js.map +1 -0
  447. package/dist-runtime/workflow/lib/validation.d.ts +23 -0
  448. package/dist-runtime/workflow/lib/validation.js +15 -0
  449. package/dist-runtime/workflow/lib/validation.js.map +1 -0
  450. package/dist-runtime/workflow/planAdd.d.ts +1 -0
  451. package/dist-runtime/workflow/planAdd.js +11 -0
  452. package/dist-runtime/workflow/planAdd.js.map +1 -0
  453. package/dist-runtime/workflow/planRead.d.ts +1 -0
  454. package/dist-runtime/workflow/planRead.js +11 -0
  455. package/dist-runtime/workflow/planRead.js.map +1 -0
  456. package/dist-runtime/workflow/planStatus.d.ts +1 -0
  457. package/dist-runtime/workflow/planStatus.js +11 -0
  458. package/dist-runtime/workflow/planStatus.js.map +1 -0
  459. package/dist-runtime/workflow/planWrite.d.ts +1 -0
  460. package/dist-runtime/workflow/planWrite.js +11 -0
  461. package/dist-runtime/workflow/planWrite.js.map +1 -0
  462. package/dist-runtime/workflow/run.d.ts +1 -40
  463. package/dist-runtime/workflow/run.js +68 -136
  464. package/dist-runtime/workflow/run.js.map +1 -1
  465. package/dist-runtime/workflow/staticValidate.js +8 -3
  466. package/dist-runtime/workflow/staticValidate.js.map +1 -1
  467. package/dist-runtime/workflow/steps/call.d.ts +1 -1
  468. package/dist-runtime/workflow/steps/check.d.ts +1 -1
  469. package/dist-runtime/workflow/steps/custom.d.ts +1 -1
  470. package/dist-runtime/workflow/steps/deploy.d.ts +1 -1
  471. package/dist-runtime/workflow/steps/deploy.js +58 -55
  472. package/dist-runtime/workflow/steps/deploy.js.map +1 -1
  473. package/dist-runtime/workflow/steps/upgrade.d.ts +1 -1
  474. package/dist-runtime/workflow/steps/upgrade.js +63 -41
  475. package/dist-runtime/workflow/steps/upgrade.js.map +1 -1
  476. package/dist-runtime/workflow/steps/view.d.ts +1 -1
  477. package/docs/compiler-qualification.md +32 -0
  478. package/docs/configuration-runtime-observation.md +29 -0
  479. package/docs/create2-miner.md +100 -0
  480. package/docs/delivery-aggregate.md +27 -0
  481. package/docs/delivery-custom-input-closure.md +51 -0
  482. package/docs/delivery-development.md +32 -0
  483. package/docs/delivery-eoa.md +46 -0
  484. package/docs/delivery-evm-manifest.md +20 -0
  485. package/docs/delivery-execution-store.md +33 -0
  486. package/docs/delivery-inputs.md +46 -0
  487. package/docs/delivery-parameters.md +65 -0
  488. package/docs/delivery-planning.md +140 -0
  489. package/docs/delivery-release.md +65 -0
  490. package/docs/delivery-safe.md +72 -0
  491. package/docs/delivery-setup.md +146 -0
  492. package/docs/delivery-source.md +67 -0
  493. package/docs/direct-package-acceptance.md +20 -0
  494. package/docs/external-infrastructure-acceptance.md +33 -0
  495. package/docs/network-runtime-acceptance.md +18 -0
  496. package/docs/plans/2026-09-09-workflow-extraction.md +16 -0
  497. package/docs/superpowers/plans/2026-07-22-manifest-bootstrap-transaction.md +50 -0
  498. package/docs/superpowers/plans/2026-07-22-manifest-review-remediation.md +49 -0
  499. package/docs/superpowers/plans/2026-08-17-custody-hardhat-signers.md +227 -0
  500. package/docs/superpowers/plans/2026-09-09-remove-template-infrastructure-contracts.md +11 -0
  501. package/docs/superpowers/plans/2026-09-24-scheme-aware-static-validation.md +193 -0
  502. package/docs/superpowers/plans/2026-10-28-create2-miner.md +82 -0
  503. package/docs/workflow-reference.md +1181 -0
  504. package/docs/workflow-runtime-acceptance.md +17 -0
  505. package/docs/workflow-runtime.md +56 -0
  506. package/package.json +134 -9
  507. package/resources/create2/LICENSE +21 -0
  508. package/resources/create2/README.md +9 -0
  509. package/resources/create2/darwin-arm64/smartflow_miner +0 -0
  510. package/resources/create2/darwin-x64/smartflow_miner +0 -0
  511. package/resources/create2/manifest.json +27 -0
  512. package/runtime/config/hardhatAdapters.ts +8 -0
  513. package/runtime/config/networks.ts +20 -11
  514. package/runtime/config/openzeppelin.ts +3 -21
  515. package/runtime/delivery/abi.ts +225 -0
  516. package/runtime/delivery/aggregate-bootstrap.ts +29 -0
  517. package/runtime/delivery/aggregate-channel.ts +85 -0
  518. package/runtime/delivery/aggregate-inputs.ts +39 -0
  519. package/runtime/delivery/aggregate-source.ts +53 -0
  520. package/runtime/delivery/aggregate-worker.ts +133 -0
  521. package/runtime/delivery/aggregate.ts +139 -0
  522. package/runtime/delivery/bindings.ts +37 -0
  523. package/runtime/delivery/check-code.ts +38 -0
  524. package/runtime/delivery/closure-format.ts +350 -0
  525. package/runtime/delivery/codec-pin.ts +3 -0
  526. package/runtime/delivery/codec.ts +50 -0
  527. package/runtime/delivery/compiler-dependency-pins.ts +1685 -0
  528. package/runtime/delivery/compiler-files.ts +179 -0
  529. package/runtime/delivery/compiler-io.ts +10 -0
  530. package/runtime/delivery/compiler-pins.ts +143 -0
  531. package/runtime/delivery/compiler.ts +700 -0
  532. package/runtime/delivery/config.ts +93 -0
  533. package/runtime/delivery/configuration-definition.ts +133 -0
  534. package/runtime/delivery/configuration-hre.ts +130 -0
  535. package/runtime/delivery/configuration-runtime.ts +163 -0
  536. package/runtime/delivery/configuration.ts +64 -0
  537. package/runtime/delivery/create2.ts +57 -0
  538. package/runtime/delivery/custom-closure.ts +993 -0
  539. package/runtime/delivery/custom-format.ts +464 -0
  540. package/runtime/delivery/custom.ts +219 -0
  541. package/runtime/delivery/data.ts +94 -0
  542. package/runtime/delivery/development.ts +262 -0
  543. package/runtime/delivery/engine.ts +29 -0
  544. package/runtime/delivery/eoa-observation.ts +106 -0
  545. package/runtime/delivery/eoa-signed.ts +55 -0
  546. package/runtime/delivery/eoa.ts +288 -0
  547. package/runtime/delivery/execution-db.ts +131 -0
  548. package/runtime/delivery/execution-files.ts +135 -0
  549. package/runtime/delivery/execution-model.ts +102 -0
  550. package/runtime/delivery/execution-store.ts +411 -0
  551. package/runtime/delivery/existing-code.ts +44 -0
  552. package/runtime/delivery/export.ts +99 -0
  553. package/runtime/delivery/forkAudit.ts +620 -0
  554. package/runtime/delivery/hardhat.ts +38 -0
  555. package/runtime/delivery/history-registration.ts +10 -0
  556. package/runtime/delivery/identities.ts +132 -0
  557. package/runtime/delivery/input-files.ts +46 -0
  558. package/runtime/delivery/inputs.ts +197 -0
  559. package/runtime/delivery/journal.ts +201 -0
  560. package/runtime/delivery/manifest.ts +54 -0
  561. package/runtime/delivery/materialization.ts +53 -0
  562. package/runtime/delivery/observations.ts +60 -0
  563. package/runtime/delivery/parameters.ts +349 -0
  564. package/runtime/delivery/pending.ts +98 -0
  565. package/runtime/delivery/plan.ts +337 -0
  566. package/runtime/delivery/planning.ts +397 -0
  567. package/runtime/delivery/policy.ts +9 -0
  568. package/runtime/delivery/preparation.ts +224 -0
  569. package/runtime/delivery/production-environment.ts +6 -0
  570. package/runtime/delivery/production-finalization.ts +172 -0
  571. package/runtime/delivery/production.ts +375 -0
  572. package/runtime/delivery/project-files.ts +58 -0
  573. package/runtime/delivery/project.ts +117 -0
  574. package/runtime/delivery/protocol.ts +94 -0
  575. package/runtime/delivery/references.ts +106 -0
  576. package/runtime/delivery/release-graph.ts +49 -0
  577. package/runtime/delivery/release-history-capture.ts +32 -0
  578. package/runtime/delivery/release-history.ts +120 -0
  579. package/runtime/delivery/release.ts +128 -0
  580. package/runtime/delivery/safe-manifest.ts +11 -0
  581. package/runtime/delivery/safe-observation.ts +626 -0
  582. package/runtime/delivery/safe-prepare.ts +101 -0
  583. package/runtime/delivery/safe.ts +344 -0
  584. package/runtime/delivery/same-fork-baseline.ts +16 -0
  585. package/runtime/delivery/setup.ts +172 -0
  586. package/runtime/delivery/source.ts +130 -0
  587. package/runtime/delivery/target-fields.ts +7 -0
  588. package/runtime/delivery/validation.ts +247 -0
  589. package/runtime/delivery/verification.ts +47 -0
  590. package/runtime/migrate.ts +1 -0
  591. package/runtime/miner/binary.ts +41 -0
  592. package/runtime/miner/cli.ts +87 -0
  593. package/runtime/miner/index.ts +5 -0
  594. package/runtime/miner/request.ts +54 -0
  595. package/runtime/miner/runner.ts +90 -0
  596. package/runtime/miner/types.ts +71 -0
  597. package/runtime/miner/verify.ts +61 -0
  598. package/runtime/vendor/plan-codec/index.cjs +820 -0
  599. package/runtime/vendor/plan-codec/index.d.cts +32 -0
  600. package/runtime/vendor/plan-codec/provenance.json +24 -0
  601. package/runtime/workflow/engine.ts +174 -0
  602. package/runtime/workflow/lib/authority.ts +3 -3
  603. package/runtime/workflow/lib/calls.ts +46 -37
  604. package/runtime/workflow/lib/canonicalData.ts +45 -0
  605. package/runtime/workflow/lib/config.ts +1 -1
  606. package/runtime/workflow/lib/context.ts +76 -0
  607. package/runtime/workflow/lib/controlledMulticallAbi.ts +6 -0
  608. package/runtime/workflow/lib/create2.ts +10 -12
  609. package/runtime/workflow/lib/deployments.ts +6 -14
  610. package/runtime/workflow/lib/evidencePorts.ts +20 -0
  611. package/runtime/workflow/lib/executionPlan.ts +17 -268
  612. package/runtime/workflow/lib/gateTool.ts +20 -8
  613. package/runtime/workflow/lib/gateToolSync.ts +3 -3
  614. package/runtime/workflow/lib/operationNames.ts +32 -0
  615. package/runtime/workflow/lib/parameters.ts +7 -23
  616. package/runtime/workflow/lib/pendingDeploymentReuse.ts +4 -56
  617. package/runtime/workflow/lib/pendingUupsBinding.ts +43 -0
  618. package/runtime/workflow/lib/plan.ts +334 -0
  619. package/runtime/workflow/lib/planCli.ts +279 -0
  620. package/runtime/workflow/lib/preparationEvidence.ts +14 -0
  621. package/runtime/workflow/lib/proxy.ts +5 -3
  622. package/runtime/workflow/lib/runtime.ts +46 -0
  623. package/runtime/workflow/lib/signer.ts +8 -5
  624. package/runtime/workflow/lib/simulation.ts +41 -17
  625. package/runtime/workflow/lib/state.ts +3 -3
  626. package/runtime/workflow/lib/staticValidation.ts +92 -11
  627. package/runtime/workflow/lib/transactionPlanner.ts +314 -0
  628. package/runtime/workflow/lib/typedValue.ts +46 -0
  629. package/runtime/workflow/lib/validation.ts +50 -0
  630. package/runtime/workflow/planAdd.ts +8 -0
  631. package/runtime/workflow/planRead.ts +8 -0
  632. package/runtime/workflow/planStatus.ts +8 -0
  633. package/runtime/workflow/planWrite.ts +8 -0
  634. package/runtime/workflow/run.ts +41 -174
  635. package/runtime/workflow/staticValidate.ts +8 -3
  636. package/runtime/workflow/steps/call.ts +1 -1
  637. package/runtime/workflow/steps/check.ts +1 -1
  638. package/runtime/workflow/steps/custom.ts +1 -1
  639. package/runtime/workflow/steps/deploy.ts +59 -59
  640. package/runtime/workflow/steps/upgrade.ts +71 -47
  641. package/runtime/workflow/steps/view.ts +1 -1
@@ -0,0 +1,279 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import {
4
+ PLAN_FILE,
5
+ assertPortableInput,
6
+ emptyPlan,
7
+ parsePlan,
8
+ planSummary,
9
+ readPlanFile,
10
+ renderPlan,
11
+ type Plan,
12
+ type PlanSection,
13
+ type PlanTask,
14
+ } from "./plan";
15
+
16
+ /**
17
+ * `plan-read` / `plan-write` / `plan-add`.
18
+ *
19
+ * The three exist so the plan never has to be hand-written. In a document that
20
+ * two runtimes both produce and consume, the fields most likely to be wrong are
21
+ * exactly the mechanical ones -- revision accounting, the section headings, the
22
+ * block syntax, the forbidden-field rules -- and those are the ones a command
23
+ * can own outright. The LLM's job is the objective and the acceptance criteria;
24
+ * the file's shape is not its job.
25
+ */
26
+
27
+ const parseArgs = (argv: string[]): Map<string, string> => {
28
+ const values = new Map<string, string>();
29
+ for (let index = 0; index < argv.length; index += 1) {
30
+ const item = argv[index];
31
+ if (!item.startsWith("--")) continue;
32
+ const equalAt = item.indexOf("=");
33
+ const key = item.slice(2, equalAt > 2 ? equalAt : undefined);
34
+ const next = argv[index + 1];
35
+ // A trailing flag with no value is a switch, not a malformed option.
36
+ if (equalAt < 0 && (!next || next.startsWith("--"))) {
37
+ values.set(key, "true");
38
+ continue;
39
+ }
40
+ const value = equalAt > 2 ? item.slice(equalAt + 1) : next;
41
+ if (!value || value.startsWith("--")) throw new Error(`--${key} requires a value`);
42
+ if (values.has(key)) throw new Error(`--${key} may be provided only once`);
43
+ values.set(key, value.trim());
44
+ if (equalAt < 0) index += 1;
45
+ }
46
+ return values;
47
+ };
48
+
49
+ const readJsonInput = (values: Map<string, string>, root: string): unknown => {
50
+ const inline = values.get("input");
51
+ const file = values.get("inputFile");
52
+ if (inline && file) throw new Error("--input and --inputFile are mutually exclusive");
53
+ if (file) {
54
+ const absolute = path.isAbsolute(file) ? file : path.join(root, file);
55
+ if (!fs.existsSync(absolute)) throw new Error(`--inputFile not found: ${file}`);
56
+ return JSON.parse(fs.readFileSync(absolute, "utf8"));
57
+ }
58
+ if (inline) return JSON.parse(inline);
59
+ throw new Error("--input or --inputFile is required");
60
+ };
61
+
62
+ const asRecord = (value: unknown, label: string): Record<string, unknown> => {
63
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
64
+ throw new Error(`${label} must be a JSON object`);
65
+ }
66
+ return value as Record<string, unknown>;
67
+ };
68
+
69
+ const parseSections = (value: unknown): Record<PlanSection, "enabled" | "disabled"> => {
70
+ const record = value === undefined ? {} : asRecord(value, "sections");
71
+ const read = (key: PlanSection, fallback: "enabled" | "disabled") => {
72
+ const raw = record[key] ?? fallback;
73
+ if (raw !== "enabled" && raw !== "disabled") {
74
+ throw new Error(`sections.${key} must be "enabled" or "disabled"`);
75
+ }
76
+ return raw;
77
+ };
78
+ return {
79
+ development: read("development", "enabled"),
80
+ audit: read("audit", "enabled"),
81
+ deployment: read("deployment", "enabled"),
82
+ };
83
+ };
84
+
85
+ /** A task from the caller, without the fields the writer owns. */
86
+ const toTask = (value: unknown, where: string): PlanTask => {
87
+ const record = asRecord(value, where);
88
+ return {
89
+ planKey: String(record.planKey ?? ""),
90
+ title: String(record.title ?? ""),
91
+ objective: String(record.objective ?? ""),
92
+ acceptance: Array.isArray(record.acceptance) ? record.acceptance.map(String) : [],
93
+ dependsOn: Array.isArray(record.dependsOn) ? record.dependsOn.map(String) : [],
94
+ status: (record.status ?? "pending") as PlanTask["status"],
95
+ ...(record.scope !== undefined ? { scope: asRecord(record.scope, `${where}.scope`) } : {}),
96
+ ...(record.parameters !== undefined
97
+ ? { parameters: (() => {
98
+ if (!Array.isArray(record.parameters)) throw new Error(`${where}.parameters must be an array`);
99
+ return record.parameters;
100
+ })() }
101
+ : {}),
102
+ ...(record.expectedArtifacts !== undefined
103
+ ? { expectedArtifacts: (record.expectedArtifacts as unknown[]).map(String) }
104
+ : {}),
105
+ ...(record.allowedChanges !== undefined
106
+ ? { allowedChanges: (record.allowedChanges as unknown[]).map(String) }
107
+ : {}),
108
+ };
109
+ };
110
+
111
+ const sectionOf = (value: unknown): PlanSection => {
112
+ const section = String(value ?? "development");
113
+ if (section !== "development" && section !== "audit" && section !== "deployment") {
114
+ throw new Error(`--section must be development, audit or deployment (got "${section}")`);
115
+ }
116
+ return section;
117
+ };
118
+
119
+ export const runPlanReadCli = (argv: string[], root: string = process.cwd()): Record<string, unknown> => {
120
+ const values = parseArgs(argv);
121
+ const plan = readPlanFile(root, values.get("path") || PLAN_FILE);
122
+ return values.has("full")
123
+ ? { ...planSummary(plan), plan: renderPlan(plan) }
124
+ : planSummary(plan);
125
+ };
126
+
127
+ /**
128
+ * Replace the plan. `revision` is not taken from the caller: the writer owns it,
129
+ * because it is the one number every consumer depends on and the one easiest to
130
+ * get wrong by hand. It advances only when the execution contract changes.
131
+ */
132
+ export const runPlanWriteCli = (argv: string[], root: string = process.cwd()): Record<string, unknown> => {
133
+ const values = parseArgs(argv);
134
+ const input = asRecord(readJsonInput(values, root), "--input");
135
+ assertPortableInput(input, "--input");
136
+ const relative = values.get("path") || PLAN_FILE;
137
+ const sections = parseSections(input.sections);
138
+ const tasksInput = input.tasks;
139
+ const tasks: Record<PlanSection, PlanTask[]> = { development: [], audit: [], deployment: [] };
140
+ if (tasksInput !== undefined) {
141
+ const record = asRecord(tasksInput, "tasks");
142
+ for (const section of ["development", "audit", "deployment"] as const) {
143
+ const list = record[section];
144
+ if (list === undefined) continue;
145
+ if (!Array.isArray(list)) throw new Error(`tasks.${section} must be an array`);
146
+ tasks[section] = list.map((item, index) => toTask(item, `tasks.${section}[${index}]`));
147
+ }
148
+ }
149
+
150
+ const existing = fs.existsSync(path.join(root, relative)) ? readPlanFile(root, relative) : undefined;
151
+
152
+ const previousContracts = existing
153
+ ? new Map((["development", "audit", "deployment"] as const)
154
+ .flatMap((section) => existing.tasks[section])
155
+ .map((task) => [task.planKey, contractOf(task)]))
156
+ : new Map<string, string>();
157
+ const nextAll = (["development", "audit", "deployment"] as const).flatMap((section) => tasks[section]);
158
+ let revision = existing ? existing.revision : 1;
159
+ if (existing) {
160
+ const changed = nextAll.length !== previousContracts.size
161
+ || nextAll.some((task) => previousContracts.get(task.planKey) !== contractOf(task))
162
+ || JSON.stringify(existing.sections) !== JSON.stringify(sections);
163
+ if (changed) revision = existing.revision + 1;
164
+ }
165
+
166
+ const plan: Plan = {
167
+ schema: "gateflow-plan/v1",
168
+ taskId: String(input.taskId ?? existing?.taskId ?? ""),
169
+ revision,
170
+ title: String(input.title ?? existing?.title ?? ""),
171
+ sections,
172
+ updatedAt: new Date().toISOString(),
173
+ tasks,
174
+ };
175
+ // The writer is the one place the document is produced, so the whole plan is
176
+ // validated on the way out -- same checks an import would run.
177
+ const text = renderPlan(plan);
178
+ const validated = parsePlan(text);
179
+ fs.mkdirSync(path.dirname(path.join(root, relative)), { recursive: true });
180
+ fs.writeFileSync(path.join(root, relative), text);
181
+
182
+ const added = nextAll.filter((task) => !previousContracts.has(task.planKey)).map((task) => task.planKey);
183
+ const removed = [...previousContracts.keys()].filter((key) => !nextAll.some((task) => task.planKey === key));
184
+ return {
185
+ ...planSummary(validated),
186
+ path: relative,
187
+ revisionBumped: !existing || revision !== existing.revision,
188
+ added,
189
+ // Reported, never silently applied: dropping a task from the file makes it
190
+ // look like it never existed to the other entry point.
191
+ removed,
192
+ ...(removed.length > 0
193
+ ? { warning: `tasks were dropped from the plan: ${removed.join(", ")}. Cancelling (status=cancelled) is usually what you want instead.` }
194
+ : {}),
195
+ };
196
+ };
197
+
198
+ /** Append one task, advancing the revision. The common case, so it gets a verb. */
199
+ export const runPlanAddCli = (argv: string[], root: string = process.cwd()): Record<string, unknown> => {
200
+ const values = parseArgs(argv);
201
+ const input = asRecord(readJsonInput(values, root), "--input");
202
+ assertPortableInput(input, "--input");
203
+ const relative = values.get("path") || PLAN_FILE;
204
+ const plan = readPlanFile(root, relative);
205
+ const section = sectionOf(input.section);
206
+ const task = toTask(input.task ?? input, "task");
207
+ if (plan.sections[section] === "disabled") {
208
+ throw new Error(`section "${section}" is disabled; enable it before adding tasks`);
209
+ }
210
+ const existingKeys = (["development", "audit", "deployment"] as const)
211
+ .flatMap((item) => plan.tasks[item])
212
+ .map((item) => item.planKey);
213
+ if (existingKeys.includes(task.planKey)) {
214
+ throw new Error(`planKey "${task.planKey}" already exists; plan keys are stable identities, not labels`);
215
+ }
216
+ const next: Plan = {
217
+ ...plan,
218
+ revision: plan.revision + 1,
219
+ updatedAt: new Date().toISOString(),
220
+ tasks: { ...plan.tasks, [section]: [...plan.tasks[section], task] },
221
+ };
222
+ const text = renderPlan(next);
223
+ parsePlan(text);
224
+ fs.writeFileSync(path.join(root, relative), text);
225
+ return { ...planSummary(next), path: relative, section, added: task.planKey };
226
+ };
227
+
228
+ export const contractOf = (task: PlanTask): string => JSON.stringify({
229
+ objective: task.objective,
230
+ acceptance: task.acceptance,
231
+ dependsOn: task.dependsOn,
232
+ scope: task.scope ?? null,
233
+ parameters: task.parameters ?? null,
234
+ expectedArtifacts: task.expectedArtifacts ?? null,
235
+ allowedChanges: task.allowedChanges ?? null,
236
+ });
237
+
238
+ /**
239
+ * Status moves the protocol allows. Progress is not a contract change, so it
240
+ * never advances the revision -- otherwise every completed task would look
241
+ * like a re-plan to the other entry point.
242
+ */
243
+ const STATUS_MOVES: Record<PlanTask["status"], readonly PlanTask["status"][]> = {
244
+ pending: ["ready", "running", "cancelled"],
245
+ ready: ["running", "cancelled"],
246
+ running: ["completed", "failed"],
247
+ failed: ["ready", "running", "cancelled"],
248
+ completed: ["pending"],
249
+ cancelled: [],
250
+ };
251
+
252
+ /** Move one task's status: `--task <planKey> --to <status>`. */
253
+ export const runPlanStatusCli = (argv: string[], root: string = process.cwd()): Record<string, unknown> => {
254
+ const values = parseArgs(argv);
255
+ const relative = values.get("path") || PLAN_FILE;
256
+ const planKey = values.get("task");
257
+ const to = values.get("to") as PlanTask["status"] | undefined;
258
+ if (!planKey) throw new Error("--task <planKey> is required");
259
+ if (!to || !(to in STATUS_MOVES)) throw new Error(`--to must be one of ${Object.keys(STATUS_MOVES).join(", ")}`);
260
+ const plan = readPlanFile(root, relative);
261
+ const all = (["development", "audit", "deployment"] as const).flatMap((section) => plan.tasks[section]);
262
+ const task = all.find((item) => item.planKey === planKey);
263
+ if (!task) throw new Error(`task "${planKey}" not found`);
264
+ const from = task.status;
265
+ if (from === to) return { ...planSummary(plan), path: relative, planKey, from, to, changed: false };
266
+ if (!STATUS_MOVES[from].includes(to)) throw new Error(`task "${planKey}" cannot move from ${from} to ${to}`);
267
+ if (to === "running") {
268
+ const blocked = task.dependsOn.filter((key) => all.find((item) => item.planKey === key)?.status !== "completed");
269
+ if (blocked.length > 0) throw new Error(`task "${planKey}" depends on unfinished task(s): ${blocked.join(", ")}`);
270
+ }
271
+ task.status = to;
272
+ const next: Plan = { ...plan, updatedAt: new Date().toISOString() };
273
+ const text = renderPlan(next);
274
+ parsePlan(text);
275
+ fs.writeFileSync(path.join(root, relative), text);
276
+ return { ...planSummary(next), path: relative, planKey, from, to, changed: true };
277
+ };
278
+
279
+ export { emptyPlan };
@@ -0,0 +1,14 @@
1
+ import path from 'node:path';
2
+ import type { WorkflowContext } from './context';
3
+ import type { DeploymentChange } from './deploymentRecords';
4
+ import type { PreparedGateToolWorkflow } from './gateTool';
5
+ export function recordPreparedDeployment(context: WorkflowContext, change: DeploymentChange, prepared: PreparedGateToolWorkflow, derivedKeys: string[]): void {
6
+ if (!context.preparations) return;
7
+ const ref = (file: string) => path.isAbsolute(file) ? path.relative(context.root, file).split(path.sep).join('/') : file;
8
+ const planPath = ref(prepared.planPath);
9
+ // Step structs use optional undefined properties; immutable journal input is explicit JSON data.
10
+ const clean = Object.fromEntries(Object.entries(change).filter(([, value]) => value !== undefined));
11
+ clean.gateTool = { outputPath: planPath, data: prepared.plan };
12
+ context.preparations.prepare({ stepId: change.stepId, change: clean as unknown as DeploymentChange,
13
+ prepared: { ...prepared, requestPath: ref(prepared.requestPath), planPath }, derivedKeys });
14
+ }
@@ -1,5 +1,5 @@
1
1
  import { keccak256, toUtf8Bytes } from "ethers";
2
- import { ethers } from "../../projectHardhat";
2
+ import type { Provider } from "ethers";
3
3
  import {
4
4
  getERC1967Admin,
5
5
  getERC1967Implementation,
@@ -31,9 +31,10 @@ export const deriveImplementationSalt = (
31
31
  );
32
32
 
33
33
  export const getImplementationAddress = async (
34
+ provider: Pick<Provider, "getStorage">,
34
35
  proxyAddress: string,
35
36
  ): Promise<string> => {
36
- const implementation = await getERC1967Implementation(ethers.provider, proxyAddress);
37
+ const implementation = await getERC1967Implementation(provider, proxyAddress);
37
38
  if (!implementation) {
38
39
  throw new Error(`Proxy ${proxyAddress} has no ERC-1967 implementation`);
39
40
  }
@@ -41,5 +42,6 @@ export const getImplementationAddress = async (
41
42
  };
42
43
 
43
44
  export const getProxyAdminAddress = async (
45
+ provider: Pick<Provider, "getStorage">,
44
46
  proxyAddress: string,
45
- ): Promise<string | undefined> => getERC1967Admin(ethers.provider, proxyAddress);
47
+ ): Promise<string | undefined> => getERC1967Admin(provider, proxyAddress);
@@ -0,0 +1,46 @@
1
+ import type { Signer } from "ethers";
2
+ import type { WorkflowHre, WorkflowRuntime } from "./context";
3
+
4
+ export const assertLocalForkHre = (hre: WorkflowHre): void => {
5
+ if (hre.network.name !== "hardhat" && hre.network.name !== "zkFork") {
6
+ throw new Error("Simulation requires an explicit local fork network");
7
+ }
8
+ const url = (hre.network.config as { url?: string }).url;
9
+ if (url !== undefined) {
10
+ let parsed: URL;
11
+ try { parsed = new URL(url); } catch { throw new Error("Local fork RPC must use a loopback URL"); }
12
+ if (
13
+ parsed.protocol !== "http:"
14
+ || !["127.0.0.1", "localhost", "[::1]"].includes(parsed.hostname)
15
+ || parsed.username || parsed.password
16
+ ) {
17
+ throw new Error("Local fork RPC must use a loopback URL");
18
+ }
19
+ }
20
+ };
21
+
22
+ export const assertLocalForkRuntime = (runtime: WorkflowRuntime): void => {
23
+ if (!runtime?.hre || !runtime.localFork) {
24
+ throw new Error("Simulation requires an explicit local fork capability");
25
+ }
26
+ assertLocalForkHre(runtime.hre);
27
+ if (runtime.localFork.provider !== runtime.hre.network.provider) {
28
+ throw new Error("Simulation local fork capability does not match the runtime provider");
29
+ }
30
+ };
31
+
32
+ export const assertLocalForkSigner = (runtime: WorkflowRuntime, signer: Signer): void => {
33
+ if (signer.provider !== runtime.hre.ethers.provider) {
34
+ throw new Error("Simulation signer must be connected to the explicit local fork provider");
35
+ }
36
+ };
37
+
38
+ export const impersonateLocalForkSigner = async (
39
+ runtime: WorkflowRuntime,
40
+ address: string,
41
+ ): Promise<Signer> => {
42
+ assertLocalForkRuntime(runtime);
43
+ const signer = await runtime.localFork!.impersonate(address);
44
+ assertLocalForkSigner(runtime, signer);
45
+ return signer;
46
+ };
@@ -6,7 +6,8 @@ import {
6
6
  createZkSyncSigner,
7
7
  resolveWalletCredential,
8
8
  } from "gate-evm-tools/custody";
9
- import { ethers, network } from "../../projectHardhat";
9
+ import type { WorkflowHre } from "./context";
10
+ import { assertLocalForkHre } from "./runtime";
10
11
  import { assertExecutionSignerAddress } from "./signerIdentity";
11
12
  import type { WorkflowMode } from "./simulation";
12
13
 
@@ -47,11 +48,11 @@ export const resolveSimulationSignerAddress = (options: WorkflowSignerOptions):
47
48
  };
48
49
 
49
50
  export const impersonateWorkflowSimulationSigner = async (
51
+ hre: WorkflowHre,
50
52
  signerAddress: string,
51
53
  ): Promise<Signer> => {
52
- if (network.name !== "hardhat" && network.name !== "zkFork") {
53
- throw new Error("Simulation signer impersonation requires a local fork network");
54
- }
54
+ assertLocalForkHre(hre);
55
+ const { ethers, network } = hre;
55
56
  await network.provider.request({
56
57
  method: "hardhat_impersonateAccount",
57
58
  params: [signerAddress],
@@ -70,11 +71,13 @@ export const impersonateWorkflowSimulationSigner = async (
70
71
  };
71
72
 
72
73
  export const resolveWorkflowSigner = async (
74
+ hre: WorkflowHre,
73
75
  mode: WorkflowMode,
74
76
  options: WorkflowSignerOptions = {},
75
77
  ): Promise<Signer> => {
78
+ const { ethers, network } = hre;
76
79
  if (mode === "simulate") {
77
- return impersonateWorkflowSimulationSigner(resolveSimulationSignerAddress(options));
80
+ return impersonateWorkflowSimulationSigner(hre, resolveSimulationSignerAddress(options));
78
81
  }
79
82
 
80
83
  const executionCredential = mode === "execute"
@@ -1,5 +1,8 @@
1
1
  import { isAddress } from "ethers";
2
- import { config as hardhatConfig, ethers, network } from "../../projectHardhat";
2
+ import type { Provider } from "ethers";
3
+ import type { WorkflowHre } from "./context";
4
+ import { assertLocalForkHre } from "./runtime";
5
+ import { isAllowedSourceRpcMethod } from "./sourceRpcPolicy";
3
6
  import {
4
7
  CapturedChainSnapshotV1,
5
8
  ForkSnapshotV1,
@@ -15,6 +18,7 @@ export type WorkflowMode = "execute" | "simulate" | "verify";
15
18
 
16
19
  export interface SimulationFork {
17
20
  snapshot?: ForkSnapshotV1;
21
+ sourceRpcUrl?: string;
18
22
  }
19
23
 
20
24
  type WithoutVersion<T> = T extends unknown ? Omit<T, "version"> : never;
@@ -43,8 +47,8 @@ export const resolveWorkflowMode = (
43
47
  return mode;
44
48
  };
45
49
 
46
- const sourceProxyUrl = (): string => {
47
- const value = process.env.GATE_SIMULATION_SOURCE_RPC_URL?.trim();
50
+ const sourceProxyUrl = (sourceRpcUrl: string | undefined): string => {
51
+ const value = sourceRpcUrl?.trim();
48
52
  if (!value) throw new Error("Simulation source-chain proxy URL is missing");
49
53
  let parsed: URL;
50
54
  try {
@@ -72,6 +76,7 @@ const rpcRequest = async <T>(
72
76
  method: string,
73
77
  params: unknown[],
74
78
  ): Promise<T> => {
79
+ if (!isAllowedSourceRpcMethod(method)) throw new Error(`Source RPC method is not read-only: ${method}`);
75
80
  let response: Response;
76
81
  try {
77
82
  response = await fetch(url, {
@@ -148,6 +153,7 @@ const requiredInfrastructureAddress = (
148
153
  };
149
154
 
150
155
  export const assertCurrentStateInfrastructure = async (
156
+ provider: Pick<Provider, "getCode" | "getStorage">,
151
157
  targetId: string,
152
158
  target: SimulationInfrastructureTarget,
153
159
  snapshot: CapturedChainSnapshotV1 | undefined,
@@ -174,7 +180,7 @@ export const assertCurrentStateInfrastructure = async (
174
180
  },
175
181
  ];
176
182
  const code = await Promise.all(infrastructure.map((entry) => (
177
- ethers.provider.getCode(entry.address, snapshot.blockNumber)
183
+ provider.getCode(entry.address, snapshot.blockNumber)
178
184
  )));
179
185
  for (const [index, entry] of infrastructure.entries()) {
180
186
  if (!code[index] || code[index] === "0x") {
@@ -186,19 +192,21 @@ export const assertCurrentStateInfrastructure = async (
186
192
  };
187
193
 
188
194
  export const assertSimulationSourceInfrastructure = async (
195
+ provider: Pick<Provider, "getCode" | "getStorage">,
189
196
  targetId: string,
190
197
  target: SimulationInfrastructureTarget,
191
198
  simulation: SimulationFork,
192
- ): Promise<void> => assertCurrentStateInfrastructure(targetId, target, simulation.snapshot);
199
+ ): Promise<void> => assertCurrentStateInfrastructure(provider, targetId, target, simulation.snapshot);
193
200
 
194
201
  export const assertCurrentStateUupsSourceState = async (
202
+ provider: Pick<Provider, "getCode" | "getStorage">,
195
203
  snapshot: CapturedChainSnapshotV1 | undefined,
196
204
  proxy: string,
197
205
  ): Promise<void> => {
198
206
  if (!snapshot) return;
199
207
  const [proxyCode, oldImplementation] = await Promise.all([
200
- ethers.provider.getCode(proxy, snapshot.blockNumber),
201
- getERC1967Implementation(ethers.provider, proxy, snapshot.blockNumber),
208
+ provider.getCode(proxy, snapshot.blockNumber),
209
+ getERC1967Implementation(provider, proxy, snapshot.blockNumber),
202
210
  ]);
203
211
  if (!proxyCode || proxyCode === "0x") {
204
212
  throw new Error(
@@ -210,7 +218,7 @@ export const assertCurrentStateUupsSourceState = async (
210
218
  `UUPS proxy ${proxy} has no implementation at captured block ${snapshot.blockNumber}`,
211
219
  );
212
220
  }
213
- const implementationCode = await ethers.provider.getCode(
221
+ const implementationCode = await provider.getCode(
214
222
  oldImplementation,
215
223
  snapshot.blockNumber,
216
224
  );
@@ -222,18 +230,22 @@ export const assertCurrentStateUupsSourceState = async (
222
230
  };
223
231
 
224
232
  export const assertSimulationUupsSourceState = async (
233
+ provider: Pick<Provider, "getCode" | "getStorage">,
225
234
  simulation: SimulationFork,
226
235
  proxy: string,
227
- ): Promise<void> => assertCurrentStateUupsSourceState(simulation.snapshot, proxy);
236
+ ): Promise<void> => assertCurrentStateUupsSourceState(provider, simulation.snapshot, proxy);
228
237
 
229
238
  export const verifySimulationForkSnapshot = async (
239
+ hre: WorkflowHre,
230
240
  simulation: SimulationFork,
231
241
  ): Promise<void> => {
242
+ assertLocalForkHre(hre);
243
+ const { network } = hre;
232
244
  const snapshot = simulation.snapshot;
233
245
  if (!snapshot) return;
234
246
  const [sourceBlock, localBlock, sourceZkSyncBlockDetails] = await Promise.all([
235
247
  rpcRequest<unknown>(
236
- sourceProxyUrl(),
248
+ sourceProxyUrl(simulation.sourceRpcUrl),
237
249
  "eth_getBlockByNumber",
238
250
  [blockTag(snapshot.blockNumber), false],
239
251
  ),
@@ -243,7 +255,7 @@ export const verifySimulationForkSnapshot = async (
243
255
  }),
244
256
  snapshot.runner.kind === "anvil-zksync"
245
257
  ? rpcRequest<unknown>(
246
- sourceProxyUrl(),
258
+ sourceProxyUrl(simulation.sourceRpcUrl),
247
259
  "zks_getBlockDetails",
248
260
  [snapshot.blockNumber],
249
261
  )
@@ -307,7 +319,19 @@ export const simulationForkEvidence = (
307
319
  };
308
320
  };
309
321
 
310
- export const setupSimulationFork = async (targetId: string): Promise<SimulationFork> => {
322
+ export interface SimulationForkOptions {
323
+ snapshotJson?: string;
324
+ sourceRpcUrl?: string;
325
+ }
326
+
327
+ // Legacy/launcher helper. The shared step engine never resets or launches a fork.
328
+ export const setupSimulationFork = async (
329
+ hre: WorkflowHre,
330
+ targetId: string,
331
+ options: SimulationForkOptions,
332
+ ): Promise<SimulationFork> => {
333
+ assertLocalForkHre(hre);
334
+ const { config: hardhatConfig, network } = hre;
311
335
  const targetNetwork = (
312
336
  hardhatConfig.networks as Record<string, { zksync?: boolean }>
313
337
  )[targetId];
@@ -321,7 +345,7 @@ export const setupSimulationFork = async (targetId: string): Promise<SimulationF
321
345
  );
322
346
  }
323
347
  const snapshot = parseForkSnapshotJson(
324
- process.env.GATE_SIMULATION_FORK_SNAPSHOT_JSON,
348
+ options.snapshotJson,
325
349
  targetId,
326
350
  );
327
351
  if (
@@ -353,7 +377,7 @@ export const setupSimulationFork = async (targetId: string): Promise<SimulationF
353
377
  );
354
378
  }
355
379
  assertBlockHash(forkBlock, snapshot, "Local EraVM");
356
- return { snapshot };
380
+ return { snapshot, sourceRpcUrl: sourceProxyUrl(options.sourceRpcUrl) };
357
381
  }
358
382
  if (network.name !== "hardhat") {
359
383
  throw new Error("Simulation mode must run with --network hardhat");
@@ -362,13 +386,13 @@ export const setupSimulationFork = async (targetId: string): Promise<SimulationF
362
386
  return {};
363
387
  }
364
388
  const snapshot = parseForkSnapshotJson(
365
- process.env.GATE_SIMULATION_FORK_SNAPSHOT_JSON,
389
+ options.snapshotJson,
366
390
  targetId,
367
391
  );
368
392
  if (snapshot.runner.kind !== "hardhat") {
369
393
  throw new Error(`EVM target "${targetId}" requires a Hardhat fork snapshot`);
370
394
  }
371
- const forkRpcUrl = sourceProxyUrl();
395
+ const forkRpcUrl = sourceProxyUrl(options.sourceRpcUrl);
372
396
  const sourceBlock = await rpcRequest<unknown>(
373
397
  forkRpcUrl,
374
398
  "eth_getBlockByNumber",
@@ -411,5 +435,5 @@ export const setupSimulationFork = async (targetId: string): Promise<SimulationF
411
435
  params: ["0x1"],
412
436
  });
413
437
 
414
- return { snapshot };
438
+ return { snapshot, sourceRpcUrl: sourceProxyUrl(options.sourceRpcUrl) };
415
439
  };
@@ -1,5 +1,5 @@
1
1
  export class WorkflowState {
2
- private readonly values: Record<string, unknown> = {};
2
+ private readonly values: Record<string, unknown> = Object.create(null);
3
3
 
4
4
  set(key: string, value: unknown): void {
5
5
  this.values[key] = value;
@@ -10,7 +10,7 @@ export class WorkflowState {
10
10
  let current: unknown = this.values;
11
11
 
12
12
  for (const part of parts) {
13
- if (typeof current !== "object" || current === null || !(part in current)) {
13
+ if (typeof current !== "object" || current === null || !Object.hasOwn(current, part)) {
14
14
  throw new Error(`State reference not found: state.${pathExpression}`);
15
15
  }
16
16
  current = (current as Record<string, unknown>)[part];
@@ -20,6 +20,6 @@ export class WorkflowState {
20
20
  }
21
21
 
22
22
  snapshot(): Record<string, unknown> {
23
- return { ...this.values };
23
+ return Object.assign(Object.create(null), this.values);
24
24
  }
25
25
  }