@synergenius/flow-weaver-pack-weaver 0.8.1

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 (459) hide show
  1. package/LICENSE +204 -0
  2. package/README.md +167 -0
  3. package/dist/bot/agent-provider.d.ts +34 -0
  4. package/dist/bot/agent-provider.d.ts.map +1 -0
  5. package/dist/bot/agent-provider.js +218 -0
  6. package/dist/bot/agent-provider.js.map +1 -0
  7. package/dist/bot/ai-client.d.ts +15 -0
  8. package/dist/bot/ai-client.d.ts.map +1 -0
  9. package/dist/bot/ai-client.js +128 -0
  10. package/dist/bot/ai-client.js.map +1 -0
  11. package/dist/bot/approvals.d.ts +22 -0
  12. package/dist/bot/approvals.d.ts.map +1 -0
  13. package/dist/bot/approvals.js +187 -0
  14. package/dist/bot/approvals.js.map +1 -0
  15. package/dist/bot/audit-logger.d.ts +5 -0
  16. package/dist/bot/audit-logger.d.ts.map +1 -0
  17. package/dist/bot/audit-logger.js +42 -0
  18. package/dist/bot/audit-logger.js.map +1 -0
  19. package/dist/bot/audit-store.d.ts +13 -0
  20. package/dist/bot/audit-store.d.ts.map +1 -0
  21. package/dist/bot/audit-store.js +59 -0
  22. package/dist/bot/audit-store.js.map +1 -0
  23. package/dist/bot/bot-agent-channel.d.ts +46 -0
  24. package/dist/bot/bot-agent-channel.d.ts.map +1 -0
  25. package/dist/bot/bot-agent-channel.js +58 -0
  26. package/dist/bot/bot-agent-channel.js.map +1 -0
  27. package/dist/bot/cli-provider.d.ts +29 -0
  28. package/dist/bot/cli-provider.d.ts.map +1 -0
  29. package/dist/bot/cli-provider.js +132 -0
  30. package/dist/bot/cli-provider.js.map +1 -0
  31. package/dist/bot/cli-stream-parser.d.ts +11 -0
  32. package/dist/bot/cli-stream-parser.d.ts.map +1 -0
  33. package/dist/bot/cli-stream-parser.js +53 -0
  34. package/dist/bot/cli-stream-parser.js.map +1 -0
  35. package/dist/bot/cost-store.d.ts +18 -0
  36. package/dist/bot/cost-store.d.ts.map +1 -0
  37. package/dist/bot/cost-store.js +81 -0
  38. package/dist/bot/cost-store.js.map +1 -0
  39. package/dist/bot/cost-tracker.d.ts +18 -0
  40. package/dist/bot/cost-tracker.d.ts.map +1 -0
  41. package/dist/bot/cost-tracker.js +60 -0
  42. package/dist/bot/cost-tracker.js.map +1 -0
  43. package/dist/bot/cron-parser.d.ts +5 -0
  44. package/dist/bot/cron-parser.d.ts.map +1 -0
  45. package/dist/bot/cron-parser.js +141 -0
  46. package/dist/bot/cron-parser.js.map +1 -0
  47. package/dist/bot/cron-scheduler.d.ts +12 -0
  48. package/dist/bot/cron-scheduler.d.ts.map +1 -0
  49. package/dist/bot/cron-scheduler.js +43 -0
  50. package/dist/bot/cron-scheduler.js.map +1 -0
  51. package/dist/bot/dashboard.d.ts +34 -0
  52. package/dist/bot/dashboard.d.ts.map +1 -0
  53. package/dist/bot/dashboard.js +602 -0
  54. package/dist/bot/dashboard.js.map +1 -0
  55. package/dist/bot/design-checker.d.ts +24 -0
  56. package/dist/bot/design-checker.d.ts.map +1 -0
  57. package/dist/bot/design-checker.js +269 -0
  58. package/dist/bot/design-checker.js.map +1 -0
  59. package/dist/bot/file-lock.d.ts +7 -0
  60. package/dist/bot/file-lock.d.ts.map +1 -0
  61. package/dist/bot/file-lock.js +64 -0
  62. package/dist/bot/file-lock.js.map +1 -0
  63. package/dist/bot/file-validator.d.ts +10 -0
  64. package/dist/bot/file-validator.d.ts.map +1 -0
  65. package/dist/bot/file-validator.js +27 -0
  66. package/dist/bot/file-validator.js.map +1 -0
  67. package/dist/bot/file-watcher.d.ts +24 -0
  68. package/dist/bot/file-watcher.d.ts.map +1 -0
  69. package/dist/bot/file-watcher.js +98 -0
  70. package/dist/bot/file-watcher.js.map +1 -0
  71. package/dist/bot/fw-api.d.ts +8 -0
  72. package/dist/bot/fw-api.d.ts.map +1 -0
  73. package/dist/bot/fw-api.js +12 -0
  74. package/dist/bot/fw-api.js.map +1 -0
  75. package/dist/bot/genesis-prompt-context.d.ts +31 -0
  76. package/dist/bot/genesis-prompt-context.d.ts.map +1 -0
  77. package/dist/bot/genesis-prompt-context.js +121 -0
  78. package/dist/bot/genesis-prompt-context.js.map +1 -0
  79. package/dist/bot/genesis-store.d.ts +28 -0
  80. package/dist/bot/genesis-store.d.ts.map +1 -0
  81. package/dist/bot/genesis-store.js +154 -0
  82. package/dist/bot/genesis-store.js.map +1 -0
  83. package/dist/bot/index.d.ts +38 -0
  84. package/dist/bot/index.d.ts.map +1 -0
  85. package/dist/bot/index.js +37 -0
  86. package/dist/bot/index.js.map +1 -0
  87. package/dist/bot/notifications.d.ts +20 -0
  88. package/dist/bot/notifications.d.ts.map +1 -0
  89. package/dist/bot/notifications.js +215 -0
  90. package/dist/bot/notifications.js.map +1 -0
  91. package/dist/bot/pipeline-runner.d.ts +22 -0
  92. package/dist/bot/pipeline-runner.d.ts.map +1 -0
  93. package/dist/bot/pipeline-runner.js +263 -0
  94. package/dist/bot/pipeline-runner.js.map +1 -0
  95. package/dist/bot/provider-registry.d.ts +26 -0
  96. package/dist/bot/provider-registry.d.ts.map +1 -0
  97. package/dist/bot/provider-registry.js +175 -0
  98. package/dist/bot/provider-registry.js.map +1 -0
  99. package/dist/bot/run-store.d.ts +25 -0
  100. package/dist/bot/run-store.d.ts.map +1 -0
  101. package/dist/bot/run-store.js +156 -0
  102. package/dist/bot/run-store.js.map +1 -0
  103. package/dist/bot/runner.d.ts +13 -0
  104. package/dist/bot/runner.d.ts.map +1 -0
  105. package/dist/bot/runner.js +244 -0
  106. package/dist/bot/runner.js.map +1 -0
  107. package/dist/bot/session-state.d.ts +19 -0
  108. package/dist/bot/session-state.d.ts.map +1 -0
  109. package/dist/bot/session-state.js +65 -0
  110. package/dist/bot/session-state.js.map +1 -0
  111. package/dist/bot/steering.d.ts +13 -0
  112. package/dist/bot/steering.d.ts.map +1 -0
  113. package/dist/bot/steering.js +40 -0
  114. package/dist/bot/steering.js.map +1 -0
  115. package/dist/bot/step-executor.d.ts +10 -0
  116. package/dist/bot/step-executor.d.ts.map +1 -0
  117. package/dist/bot/step-executor.js +30 -0
  118. package/dist/bot/step-executor.js.map +1 -0
  119. package/dist/bot/system-prompt.d.ts +19 -0
  120. package/dist/bot/system-prompt.d.ts.map +1 -0
  121. package/dist/bot/system-prompt.js +222 -0
  122. package/dist/bot/system-prompt.js.map +1 -0
  123. package/dist/bot/task-queue.d.ts +26 -0
  124. package/dist/bot/task-queue.d.ts.map +1 -0
  125. package/dist/bot/task-queue.js +98 -0
  126. package/dist/bot/task-queue.js.map +1 -0
  127. package/dist/bot/types.d.ts +478 -0
  128. package/dist/bot/types.d.ts.map +1 -0
  129. package/dist/bot/types.js +2 -0
  130. package/dist/bot/types.js.map +1 -0
  131. package/dist/bot/utils.d.ts +2 -0
  132. package/dist/bot/utils.d.ts.map +1 -0
  133. package/dist/bot/utils.js +20 -0
  134. package/dist/bot/utils.js.map +1 -0
  135. package/dist/bot/watch-daemon.d.ts +19 -0
  136. package/dist/bot/watch-daemon.d.ts.map +1 -0
  137. package/dist/bot/watch-daemon.js +178 -0
  138. package/dist/bot/watch-daemon.js.map +1 -0
  139. package/dist/bot/web-approval.d.ts +19 -0
  140. package/dist/bot/web-approval.d.ts.map +1 -0
  141. package/dist/bot/web-approval.js +207 -0
  142. package/dist/bot/web-approval.js.map +1 -0
  143. package/dist/cli-bridge.d.ts +2 -0
  144. package/dist/cli-bridge.d.ts.map +1 -0
  145. package/dist/cli-bridge.js +30 -0
  146. package/dist/cli-bridge.js.map +1 -0
  147. package/dist/cli-handlers.d.ts +79 -0
  148. package/dist/cli-handlers.d.ts.map +1 -0
  149. package/dist/cli-handlers.js +1335 -0
  150. package/dist/cli-handlers.js.map +1 -0
  151. package/dist/cli.d.ts +3 -0
  152. package/dist/cli.d.ts.map +1 -0
  153. package/dist/cli.js +749 -0
  154. package/dist/cli.js.map +1 -0
  155. package/dist/docs/docs/weaver-config.md +135 -0
  156. package/dist/docs/weaver-config.md +141 -0
  157. package/dist/index.d.ts +30 -0
  158. package/dist/index.d.ts.map +1 -0
  159. package/dist/index.js +37 -0
  160. package/dist/index.js.map +1 -0
  161. package/dist/mcp-tools.d.ts +13 -0
  162. package/dist/mcp-tools.d.ts.map +1 -0
  163. package/dist/mcp-tools.js +197 -0
  164. package/dist/mcp-tools.js.map +1 -0
  165. package/dist/node-types/abort-task.d.ts +15 -0
  166. package/dist/node-types/abort-task.d.ts.map +1 -0
  167. package/dist/node-types/abort-task.js +28 -0
  168. package/dist/node-types/abort-task.js.map +1 -0
  169. package/dist/node-types/approval-gate.d.ts +18 -0
  170. package/dist/node-types/approval-gate.d.ts.map +1 -0
  171. package/dist/node-types/approval-gate.js +80 -0
  172. package/dist/node-types/approval-gate.js.map +1 -0
  173. package/dist/node-types/bot-report.d.ts +20 -0
  174. package/dist/node-types/bot-report.d.ts.map +1 -0
  175. package/dist/node-types/bot-report.js +67 -0
  176. package/dist/node-types/bot-report.js.map +1 -0
  177. package/dist/node-types/build-context.d.ts +16 -0
  178. package/dist/node-types/build-context.d.ts.map +1 -0
  179. package/dist/node-types/build-context.js +64 -0
  180. package/dist/node-types/build-context.js.map +1 -0
  181. package/dist/node-types/detect-provider.d.ts +17 -0
  182. package/dist/node-types/detect-provider.d.ts.map +1 -0
  183. package/dist/node-types/detect-provider.js +71 -0
  184. package/dist/node-types/detect-provider.js.map +1 -0
  185. package/dist/node-types/exec-validate-retry.d.ts +17 -0
  186. package/dist/node-types/exec-validate-retry.d.ts.map +1 -0
  187. package/dist/node-types/exec-validate-retry.js +147 -0
  188. package/dist/node-types/exec-validate-retry.js.map +1 -0
  189. package/dist/node-types/execute-plan.d.ts +26 -0
  190. package/dist/node-types/execute-plan.d.ts.map +1 -0
  191. package/dist/node-types/execute-plan.js +120 -0
  192. package/dist/node-types/execute-plan.js.map +1 -0
  193. package/dist/node-types/execute-target.d.ts +16 -0
  194. package/dist/node-types/execute-target.d.ts.map +1 -0
  195. package/dist/node-types/execute-target.js +238 -0
  196. package/dist/node-types/execute-target.js.map +1 -0
  197. package/dist/node-types/fix-errors.d.ts +24 -0
  198. package/dist/node-types/fix-errors.d.ts.map +1 -0
  199. package/dist/node-types/fix-errors.js +49 -0
  200. package/dist/node-types/fix-errors.js.map +1 -0
  201. package/dist/node-types/genesis-apply-retry.d.ts +27 -0
  202. package/dist/node-types/genesis-apply-retry.d.ts.map +1 -0
  203. package/dist/node-types/genesis-apply-retry.js +97 -0
  204. package/dist/node-types/genesis-apply-retry.js.map +1 -0
  205. package/dist/node-types/genesis-apply.d.ts +29 -0
  206. package/dist/node-types/genesis-apply.d.ts.map +1 -0
  207. package/dist/node-types/genesis-apply.js +76 -0
  208. package/dist/node-types/genesis-apply.js.map +1 -0
  209. package/dist/node-types/genesis-approve.d.ts +19 -0
  210. package/dist/node-types/genesis-approve.d.ts.map +1 -0
  211. package/dist/node-types/genesis-approve.js +59 -0
  212. package/dist/node-types/genesis-approve.js.map +1 -0
  213. package/dist/node-types/genesis-check-stabilize.d.ts +16 -0
  214. package/dist/node-types/genesis-check-stabilize.d.ts.map +1 -0
  215. package/dist/node-types/genesis-check-stabilize.js +32 -0
  216. package/dist/node-types/genesis-check-stabilize.js.map +1 -0
  217. package/dist/node-types/genesis-check-threshold.d.ts +15 -0
  218. package/dist/node-types/genesis-check-threshold.d.ts.map +1 -0
  219. package/dist/node-types/genesis-check-threshold.js +29 -0
  220. package/dist/node-types/genesis-check-threshold.js.map +1 -0
  221. package/dist/node-types/genesis-commit.d.ts +17 -0
  222. package/dist/node-types/genesis-commit.d.ts.map +1 -0
  223. package/dist/node-types/genesis-commit.js +59 -0
  224. package/dist/node-types/genesis-commit.js.map +1 -0
  225. package/dist/node-types/genesis-compile-validate.d.ts +26 -0
  226. package/dist/node-types/genesis-compile-validate.d.ts.map +1 -0
  227. package/dist/node-types/genesis-compile-validate.js +60 -0
  228. package/dist/node-types/genesis-compile-validate.js.map +1 -0
  229. package/dist/node-types/genesis-diff-fingerprint.d.ts +15 -0
  230. package/dist/node-types/genesis-diff-fingerprint.d.ts.map +1 -0
  231. package/dist/node-types/genesis-diff-fingerprint.js +59 -0
  232. package/dist/node-types/genesis-diff-fingerprint.js.map +1 -0
  233. package/dist/node-types/genesis-diff-workflow.d.ts +15 -0
  234. package/dist/node-types/genesis-diff-workflow.d.ts.map +1 -0
  235. package/dist/node-types/genesis-diff-workflow.js +67 -0
  236. package/dist/node-types/genesis-diff-workflow.js.map +1 -0
  237. package/dist/node-types/genesis-escrow-grace.d.ts +15 -0
  238. package/dist/node-types/genesis-escrow-grace.d.ts.map +1 -0
  239. package/dist/node-types/genesis-escrow-grace.js +52 -0
  240. package/dist/node-types/genesis-escrow-grace.js.map +1 -0
  241. package/dist/node-types/genesis-escrow-migrate.d.ts +21 -0
  242. package/dist/node-types/genesis-escrow-migrate.d.ts.map +1 -0
  243. package/dist/node-types/genesis-escrow-migrate.js +116 -0
  244. package/dist/node-types/genesis-escrow-migrate.js.map +1 -0
  245. package/dist/node-types/genesis-escrow-recover.d.ts +15 -0
  246. package/dist/node-types/genesis-escrow-recover.d.ts.map +1 -0
  247. package/dist/node-types/genesis-escrow-recover.js +90 -0
  248. package/dist/node-types/genesis-escrow-recover.js.map +1 -0
  249. package/dist/node-types/genesis-escrow-stage.d.ts +17 -0
  250. package/dist/node-types/genesis-escrow-stage.d.ts.map +1 -0
  251. package/dist/node-types/genesis-escrow-stage.js +86 -0
  252. package/dist/node-types/genesis-escrow-stage.js.map +1 -0
  253. package/dist/node-types/genesis-escrow-validate.d.ts +17 -0
  254. package/dist/node-types/genesis-escrow-validate.d.ts.map +1 -0
  255. package/dist/node-types/genesis-escrow-validate.js +110 -0
  256. package/dist/node-types/genesis-escrow-validate.js.map +1 -0
  257. package/dist/node-types/genesis-load-config.d.ts +17 -0
  258. package/dist/node-types/genesis-load-config.d.ts.map +1 -0
  259. package/dist/node-types/genesis-load-config.js +36 -0
  260. package/dist/node-types/genesis-load-config.js.map +1 -0
  261. package/dist/node-types/genesis-observe.d.ts +18 -0
  262. package/dist/node-types/genesis-observe.d.ts.map +1 -0
  263. package/dist/node-types/genesis-observe.js +103 -0
  264. package/dist/node-types/genesis-observe.js.map +1 -0
  265. package/dist/node-types/genesis-propose.d.ts +17 -0
  266. package/dist/node-types/genesis-propose.d.ts.map +1 -0
  267. package/dist/node-types/genesis-propose.js +69 -0
  268. package/dist/node-types/genesis-propose.js.map +1 -0
  269. package/dist/node-types/genesis-report.d.ts +20 -0
  270. package/dist/node-types/genesis-report.d.ts.map +1 -0
  271. package/dist/node-types/genesis-report.js +87 -0
  272. package/dist/node-types/genesis-report.js.map +1 -0
  273. package/dist/node-types/genesis-snapshot.d.ts +15 -0
  274. package/dist/node-types/genesis-snapshot.d.ts.map +1 -0
  275. package/dist/node-types/genesis-snapshot.js +26 -0
  276. package/dist/node-types/genesis-snapshot.js.map +1 -0
  277. package/dist/node-types/genesis-try-apply.d.ts +18 -0
  278. package/dist/node-types/genesis-try-apply.d.ts.map +1 -0
  279. package/dist/node-types/genesis-try-apply.js +142 -0
  280. package/dist/node-types/genesis-try-apply.js.map +1 -0
  281. package/dist/node-types/genesis-update-history.d.ts +15 -0
  282. package/dist/node-types/genesis-update-history.d.ts.map +1 -0
  283. package/dist/node-types/genesis-update-history.js +70 -0
  284. package/dist/node-types/genesis-update-history.js.map +1 -0
  285. package/dist/node-types/genesis-validate-proposal.d.ts +16 -0
  286. package/dist/node-types/genesis-validate-proposal.d.ts.map +1 -0
  287. package/dist/node-types/genesis-validate-proposal.js +109 -0
  288. package/dist/node-types/genesis-validate-proposal.js.map +1 -0
  289. package/dist/node-types/git-ops.d.ts +15 -0
  290. package/dist/node-types/git-ops.d.ts.map +1 -0
  291. package/dist/node-types/git-ops.js +69 -0
  292. package/dist/node-types/git-ops.js.map +1 -0
  293. package/dist/node-types/index.d.ts +37 -0
  294. package/dist/node-types/index.d.ts.map +1 -0
  295. package/dist/node-types/index.js +37 -0
  296. package/dist/node-types/index.js.map +1 -0
  297. package/dist/node-types/load-config.d.ts +17 -0
  298. package/dist/node-types/load-config.d.ts.map +1 -0
  299. package/dist/node-types/load-config.js +27 -0
  300. package/dist/node-types/load-config.js.map +1 -0
  301. package/dist/node-types/plan-task.d.ts +17 -0
  302. package/dist/node-types/plan-task.d.ts.map +1 -0
  303. package/dist/node-types/plan-task.js +55 -0
  304. package/dist/node-types/plan-task.js.map +1 -0
  305. package/dist/node-types/read-workflow.d.ts +15 -0
  306. package/dist/node-types/read-workflow.d.ts.map +1 -0
  307. package/dist/node-types/read-workflow.js +60 -0
  308. package/dist/node-types/read-workflow.js.map +1 -0
  309. package/dist/node-types/receive-task.d.ts +20 -0
  310. package/dist/node-types/receive-task.d.ts.map +1 -0
  311. package/dist/node-types/receive-task.js +69 -0
  312. package/dist/node-types/receive-task.js.map +1 -0
  313. package/dist/node-types/report.d.ts +14 -0
  314. package/dist/node-types/report.d.ts.map +1 -0
  315. package/dist/node-types/report.js +25 -0
  316. package/dist/node-types/report.js.map +1 -0
  317. package/dist/node-types/resolve-target.d.ts +16 -0
  318. package/dist/node-types/resolve-target.d.ts.map +1 -0
  319. package/dist/node-types/resolve-target.js +67 -0
  320. package/dist/node-types/resolve-target.js.map +1 -0
  321. package/dist/node-types/route-task.d.ts +14 -0
  322. package/dist/node-types/route-task.d.ts.map +1 -0
  323. package/dist/node-types/route-task.js +22 -0
  324. package/dist/node-types/route-task.js.map +1 -0
  325. package/dist/node-types/send-notify.d.ts +14 -0
  326. package/dist/node-types/send-notify.d.ts.map +1 -0
  327. package/dist/node-types/send-notify.js +71 -0
  328. package/dist/node-types/send-notify.js.map +1 -0
  329. package/dist/node-types/validate-result.d.ts +24 -0
  330. package/dist/node-types/validate-result.d.ts.map +1 -0
  331. package/dist/node-types/validate-result.js +38 -0
  332. package/dist/node-types/validate-result.js.map +1 -0
  333. package/dist/templates/index.d.ts +5 -0
  334. package/dist/templates/index.d.ts.map +1 -0
  335. package/dist/templates/index.js +4 -0
  336. package/dist/templates/index.js.map +1 -0
  337. package/dist/templates/weaver-bot-template.d.ts +11 -0
  338. package/dist/templates/weaver-bot-template.d.ts.map +1 -0
  339. package/dist/templates/weaver-bot-template.js +99 -0
  340. package/dist/templates/weaver-bot-template.js.map +1 -0
  341. package/dist/templates/weaver-template.d.ts +11 -0
  342. package/dist/templates/weaver-template.d.ts.map +1 -0
  343. package/dist/templates/weaver-template.js +53 -0
  344. package/dist/templates/weaver-template.js.map +1 -0
  345. package/dist/workflows/genesis-task.d.ts +62 -0
  346. package/dist/workflows/genesis-task.d.ts.map +1 -0
  347. package/dist/workflows/genesis-task.js +64 -0
  348. package/dist/workflows/genesis-task.js.map +1 -0
  349. package/dist/workflows/index.d.ts +4 -0
  350. package/dist/workflows/index.d.ts.map +1 -0
  351. package/dist/workflows/index.js +4 -0
  352. package/dist/workflows/index.js.map +1 -0
  353. package/dist/workflows/weaver-bot-batch.d.ts +49 -0
  354. package/dist/workflows/weaver-bot-batch.d.ts.map +1 -0
  355. package/dist/workflows/weaver-bot-batch.js +49 -0
  356. package/dist/workflows/weaver-bot-batch.js.map +1 -0
  357. package/dist/workflows/weaver-bot-session.d.ts +65 -0
  358. package/dist/workflows/weaver-bot-session.d.ts.map +1 -0
  359. package/dist/workflows/weaver-bot-session.js +68 -0
  360. package/dist/workflows/weaver-bot-session.js.map +1 -0
  361. package/dist/workflows/weaver-bot.d.ts +61 -0
  362. package/dist/workflows/weaver-bot.d.ts.map +1 -0
  363. package/dist/workflows/weaver-bot.js +61 -0
  364. package/dist/workflows/weaver-bot.js.map +1 -0
  365. package/dist/workflows/weaver.d.ts +24 -0
  366. package/dist/workflows/weaver.d.ts.map +1 -0
  367. package/dist/workflows/weaver.js +28 -0
  368. package/dist/workflows/weaver.js.map +1 -0
  369. package/flowweaver.manifest.json +1001 -0
  370. package/package.json +78 -0
  371. package/src/bot/agent-provider.ts +273 -0
  372. package/src/bot/ai-client.ts +153 -0
  373. package/src/bot/approvals.ts +273 -0
  374. package/src/bot/audit-logger.ts +45 -0
  375. package/src/bot/audit-store.ts +69 -0
  376. package/src/bot/bot-agent-channel.ts +99 -0
  377. package/src/bot/cli-provider.ts +169 -0
  378. package/src/bot/cli-stream-parser.ts +59 -0
  379. package/src/bot/cost-store.ts +92 -0
  380. package/src/bot/cost-tracker.ts +72 -0
  381. package/src/bot/cron-parser.ts +153 -0
  382. package/src/bot/cron-scheduler.ts +48 -0
  383. package/src/bot/dashboard.ts +658 -0
  384. package/src/bot/design-checker.ts +327 -0
  385. package/src/bot/file-lock.ts +73 -0
  386. package/src/bot/file-validator.ts +41 -0
  387. package/src/bot/file-watcher.ts +103 -0
  388. package/src/bot/fw-api.ts +18 -0
  389. package/src/bot/genesis-prompt-context.ts +135 -0
  390. package/src/bot/genesis-store.ts +180 -0
  391. package/src/bot/index.ts +127 -0
  392. package/src/bot/notifications.ts +263 -0
  393. package/src/bot/pipeline-runner.ts +324 -0
  394. package/src/bot/provider-registry.ts +236 -0
  395. package/src/bot/run-store.ts +169 -0
  396. package/src/bot/runner.ts +311 -0
  397. package/src/bot/session-state.ts +73 -0
  398. package/src/bot/steering.ts +44 -0
  399. package/src/bot/step-executor.ts +34 -0
  400. package/src/bot/system-prompt.ts +280 -0
  401. package/src/bot/task-queue.ts +111 -0
  402. package/src/bot/types.ts +571 -0
  403. package/src/bot/utils.ts +17 -0
  404. package/src/bot/watch-daemon.ts +203 -0
  405. package/src/bot/web-approval.ts +240 -0
  406. package/src/cli-bridge.ts +41 -0
  407. package/src/cli-handlers.ts +1445 -0
  408. package/src/docs/weaver-config.md +135 -0
  409. package/src/index.ts +177 -0
  410. package/src/mcp-tools.ts +274 -0
  411. package/src/node-types/abort-task.ts +31 -0
  412. package/src/node-types/approval-gate.ts +95 -0
  413. package/src/node-types/bot-report.ts +82 -0
  414. package/src/node-types/build-context.ts +65 -0
  415. package/src/node-types/detect-provider.ts +77 -0
  416. package/src/node-types/exec-validate-retry.ts +170 -0
  417. package/src/node-types/execute-plan.ts +130 -0
  418. package/src/node-types/execute-target.ts +256 -0
  419. package/src/node-types/fix-errors.ts +63 -0
  420. package/src/node-types/genesis-apply-retry.ts +133 -0
  421. package/src/node-types/genesis-apply.ts +96 -0
  422. package/src/node-types/genesis-approve.ts +73 -0
  423. package/src/node-types/genesis-check-stabilize.ts +37 -0
  424. package/src/node-types/genesis-check-threshold.ts +34 -0
  425. package/src/node-types/genesis-commit.ts +71 -0
  426. package/src/node-types/genesis-compile-validate.ts +77 -0
  427. package/src/node-types/genesis-diff-fingerprint.ts +67 -0
  428. package/src/node-types/genesis-diff-workflow.ts +71 -0
  429. package/src/node-types/genesis-escrow-grace.ts +62 -0
  430. package/src/node-types/genesis-escrow-migrate.ts +138 -0
  431. package/src/node-types/genesis-escrow-recover.ts +99 -0
  432. package/src/node-types/genesis-escrow-stage.ts +104 -0
  433. package/src/node-types/genesis-escrow-validate.ts +120 -0
  434. package/src/node-types/genesis-load-config.ts +44 -0
  435. package/src/node-types/genesis-observe.ts +119 -0
  436. package/src/node-types/genesis-propose.ts +86 -0
  437. package/src/node-types/genesis-report.ts +95 -0
  438. package/src/node-types/genesis-snapshot.ts +30 -0
  439. package/src/node-types/genesis-try-apply.ts +165 -0
  440. package/src/node-types/genesis-update-history.ts +72 -0
  441. package/src/node-types/genesis-validate-proposal.ts +124 -0
  442. package/src/node-types/git-ops.ts +72 -0
  443. package/src/node-types/index.ts +36 -0
  444. package/src/node-types/load-config.ts +27 -0
  445. package/src/node-types/plan-task.ts +66 -0
  446. package/src/node-types/read-workflow.ts +68 -0
  447. package/src/node-types/receive-task.ts +92 -0
  448. package/src/node-types/report.ts +25 -0
  449. package/src/node-types/resolve-target.ts +64 -0
  450. package/src/node-types/route-task.ts +25 -0
  451. package/src/node-types/send-notify.ts +75 -0
  452. package/src/node-types/validate-result.ts +49 -0
  453. package/src/templates/index.ts +5 -0
  454. package/src/templates/weaver-bot-template.ts +106 -0
  455. package/src/workflows/genesis-task.ts +91 -0
  456. package/src/workflows/index.ts +3 -0
  457. package/src/workflows/weaver-bot-batch.ts +65 -0
  458. package/src/workflows/weaver-bot.ts +79 -0
  459. package/templates.js +1 -0
@@ -0,0 +1,34 @@
1
+ import type { GenesisConfig, GenesisProposal, GenesisImpactLevel, GenesisContext } from '../bot/types.js';
2
+
3
+ const IMPACT_ORDER: Record<GenesisImpactLevel, number> = {
4
+ COSMETIC: 0,
5
+ MINOR: 1,
6
+ BREAKING: 2,
7
+ CRITICAL: 3,
8
+ };
9
+
10
+ /**
11
+ * Compares the proposal's impact level against the configured approval
12
+ * threshold to decide if human approval is required.
13
+ *
14
+ * @flowWeaver nodeType
15
+ * @expression
16
+ * @label Genesis Check Threshold
17
+ * @input ctx [order:0] - Genesis context (JSON)
18
+ * @output ctx [order:0] - Genesis context with approvalRequired (JSON)
19
+ * @output onFailure [hidden]
20
+ */
21
+ export function genesisCheckThreshold(ctx: string): { ctx: string } {
22
+ const context = JSON.parse(ctx) as GenesisContext;
23
+ const config = JSON.parse(context.genesisConfigJson) as GenesisConfig;
24
+ const proposal = JSON.parse(context.proposalJson!) as GenesisProposal;
25
+
26
+ const proposalLevel = IMPACT_ORDER[proposal.impactLevel] ?? 0;
27
+ const thresholdLevel = IMPACT_ORDER[config.approvalThreshold] ?? 0;
28
+ const approvalRequired = proposalLevel >= thresholdLevel;
29
+
30
+ console.log(`\x1b[36m→ Impact ${proposal.impactLevel} vs threshold ${config.approvalThreshold}: approval ${approvalRequired ? 'required' : 'not required'}\x1b[0m`);
31
+
32
+ context.approvalRequired = approvalRequired;
33
+ return { ctx: JSON.stringify(context) };
34
+ }
@@ -0,0 +1,71 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { execFileSync } from 'node:child_process';
4
+ import type { GenesisConfig, GenesisContext } from '../bot/types.js';
5
+ import { GenesisStore } from '../bot/genesis-store.js';
6
+
7
+ /**
8
+ * Commits the modified workflow to git if approved, or restores from
9
+ * the snapshot if rejected. Commit messages are prefixed with "genesis:".
10
+ *
11
+ * @flowWeaver nodeType
12
+ * @label Genesis Commit
13
+ * @input ctx [order:0] - Genesis context (JSON)
14
+ * @output ctx [order:0] - Genesis context with commitResultJson (JSON)
15
+ * @output onSuccess [order:-2] - On Success
16
+ * @output onFailure [order:-1] [hidden] - On Failure
17
+ */
18
+ export async function genesisCommit(
19
+ execute: boolean,
20
+ ctx: string,
21
+ ): Promise<{
22
+ onSuccess: boolean; onFailure: boolean;
23
+ ctx: string;
24
+ }> {
25
+ const context = JSON.parse(ctx) as GenesisContext;
26
+
27
+ if (!execute) {
28
+ context.commitResultJson = JSON.stringify({ committed: false, reason: 'dry run' });
29
+ return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
30
+ }
31
+
32
+ const { env } = context;
33
+ const config = JSON.parse(context.genesisConfigJson) as GenesisConfig;
34
+ const targetPath = path.resolve(env.projectDir, config.targetWorkflow);
35
+
36
+ if (!context.approved) {
37
+ // Restore from snapshot
38
+ const store = new GenesisStore(env.projectDir);
39
+ const snapshot = store.loadSnapshot(context.snapshotPath!);
40
+ if (snapshot) {
41
+ fs.writeFileSync(targetPath, snapshot, 'utf-8');
42
+ console.log('\x1b[33m→ Restored from snapshot (not approved)\x1b[0m');
43
+ }
44
+ context.commitResultJson = JSON.stringify({ committed: false, reason: 'not approved' });
45
+ return { onSuccess: false, onFailure: true, ctx: JSON.stringify(context) };
46
+ }
47
+
48
+ try {
49
+ execFileSync('git', ['add', targetPath], {
50
+ cwd: env.projectDir,
51
+ encoding: 'utf-8',
52
+ stdio: ['pipe', 'pipe', 'pipe'],
53
+ });
54
+
55
+ const message = `genesis: evolve ${path.basename(config.targetWorkflow)}`;
56
+ execFileSync('git', ['commit', '-m', message], {
57
+ cwd: env.projectDir,
58
+ encoding: 'utf-8',
59
+ stdio: ['pipe', 'pipe', 'pipe'],
60
+ });
61
+
62
+ console.log(`\x1b[32m→ Committed: ${message}\x1b[0m`);
63
+ context.commitResultJson = JSON.stringify({ committed: true, message });
64
+ return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
65
+ } catch (err: unknown) {
66
+ const msg = err instanceof Error ? err.message : String(err);
67
+ console.error(`\x1b[31m→ Commit failed: ${msg}\x1b[0m`);
68
+ context.commitResultJson = JSON.stringify({ committed: false, reason: msg });
69
+ return { onSuccess: false, onFailure: true, ctx: JSON.stringify(context) };
70
+ }
71
+ }
@@ -0,0 +1,77 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { execFileSync } from 'node:child_process';
4
+ import type { WeaverEnv, GenesisConfig } from '../bot/types.js';
5
+ import { GenesisStore } from '../bot/genesis-store.js';
6
+
7
+ /**
8
+ * Runs flow-weaver validate and compile on the target workflow after
9
+ * operations have been applied. On failure, restores from the snapshot
10
+ * and fires the failure path.
11
+ *
12
+ * @flowWeaver nodeType
13
+ * @label Genesis Compile & Validate
14
+ * @input env [order:0] - Weaver environment bundle
15
+ * @input genesisConfigJson [order:1] - Genesis configuration (JSON)
16
+ * @input snapshotPath [order:2] - Path to the pre-apply snapshot
17
+ * @input applyResultJson [order:3] - Apply result (JSON)
18
+ * @output env [order:0] - Weaver environment bundle (pass-through)
19
+ * @output genesisConfigJson [order:1] - Genesis configuration (pass-through)
20
+ * @output snapshotPath [order:2] - Path to the snapshot (pass-through)
21
+ * @output onSuccess [order:-2] - On Success
22
+ * @output onFailure [order:-1] - On Failure
23
+ */
24
+ export async function genesisCompileValidate(
25
+ execute: boolean,
26
+ env: WeaverEnv,
27
+ genesisConfigJson: string,
28
+ snapshotPath: string,
29
+ applyResultJson: string,
30
+ ): Promise<{
31
+ onSuccess: boolean; onFailure: boolean;
32
+ env: WeaverEnv;
33
+ genesisConfigJson: string;
34
+ snapshotPath: string;
35
+ }> {
36
+ if (!execute) {
37
+ return { onSuccess: true, onFailure: false, env, genesisConfigJson, snapshotPath };
38
+ }
39
+
40
+ const config = JSON.parse(genesisConfigJson) as GenesisConfig;
41
+ const targetPath = path.resolve(env.projectDir, config.targetWorkflow);
42
+
43
+ try {
44
+ // Validate
45
+ execFileSync('flow-weaver', ['validate', targetPath], {
46
+ cwd: env.projectDir,
47
+ encoding: 'utf-8',
48
+ stdio: ['pipe', 'pipe', 'pipe'],
49
+ timeout: 30_000,
50
+ });
51
+ console.log('\x1b[32m→ Validation passed\x1b[0m');
52
+
53
+ // Compile
54
+ execFileSync('flow-weaver', ['compile', targetPath], {
55
+ cwd: env.projectDir,
56
+ encoding: 'utf-8',
57
+ stdio: ['pipe', 'pipe', 'pipe'],
58
+ timeout: 60_000,
59
+ });
60
+ console.log('\x1b[32m→ Compilation passed\x1b[0m');
61
+
62
+ return { onSuccess: true, onFailure: false, env, genesisConfigJson, snapshotPath };
63
+ } catch (err: unknown) {
64
+ const msg = err instanceof Error ? err.message : String(err);
65
+ console.error(`\x1b[31m→ Compile/validate failed: ${msg}\x1b[0m`);
66
+
67
+ // Restore from snapshot
68
+ const store = new GenesisStore(env.projectDir);
69
+ const snapshot = store.loadSnapshot(snapshotPath);
70
+ if (snapshot) {
71
+ fs.writeFileSync(targetPath, snapshot, 'utf-8');
72
+ console.log('\x1b[33m→ Restored from snapshot\x1b[0m');
73
+ }
74
+
75
+ return { onSuccess: false, onFailure: true, env, genesisConfigJson, snapshotPath };
76
+ }
77
+ }
@@ -0,0 +1,67 @@
1
+ import type { GenesisFingerprint, GenesisContext } from '../bot/types.js';
2
+ import { GenesisStore } from '../bot/genesis-store.js';
3
+
4
+ /**
5
+ * Compares the current project fingerprint against the last saved one,
6
+ * producing a diff summary of file and state changes.
7
+ *
8
+ * @flowWeaver nodeType
9
+ * @expression
10
+ * @label Genesis Diff Fingerprint
11
+ * @input ctx [order:0] - Genesis context (JSON)
12
+ * @output ctx [order:0] - Genesis context with diffJson (JSON)
13
+ * @output onFailure [hidden]
14
+ */
15
+ export function genesisDiffFingerprint(ctx: string): { ctx: string } {
16
+ const context = JSON.parse(ctx) as GenesisContext;
17
+ const { env } = context;
18
+ const store = new GenesisStore(env.projectDir);
19
+ const current = JSON.parse(context.fingerprintJson!) as GenesisFingerprint;
20
+ const last = store.getLastFingerprint();
21
+
22
+ const addedFiles: string[] = [];
23
+ const removedFiles: string[] = [];
24
+ const modifiedFiles: string[] = [];
25
+ let gitChanged = false;
26
+ let workflowsChanged = false;
27
+
28
+ if (!last) {
29
+ const diff = {
30
+ addedFiles: Object.keys(current.files),
31
+ removedFiles: [],
32
+ modifiedFiles: [],
33
+ gitChanged: true,
34
+ workflowsChanged: true,
35
+ };
36
+ context.diffJson = JSON.stringify(diff);
37
+ return { ctx: JSON.stringify(context) };
38
+ }
39
+
40
+ for (const [file, hash] of Object.entries(current.files)) {
41
+ if (!(file in last.files)) {
42
+ addedFiles.push(file);
43
+ } else if (last.files[file] !== hash) {
44
+ modifiedFiles.push(file);
45
+ }
46
+ }
47
+ for (const file of Object.keys(last.files)) {
48
+ if (!(file in current.files)) {
49
+ removedFiles.push(file);
50
+ }
51
+ }
52
+
53
+ gitChanged = current.gitBranch !== last.gitBranch || current.gitCommit !== last.gitCommit;
54
+
55
+ const currentWfs = [...current.existingWorkflows].sort().join(',');
56
+ const lastWfs = [...last.existingWorkflows].sort().join(',');
57
+ workflowsChanged = currentWfs !== lastWfs || current.workflowHash !== last.workflowHash;
58
+
59
+ const diff = { addedFiles, removedFiles, modifiedFiles, gitChanged, workflowsChanged };
60
+ const hasChanges = addedFiles.length > 0 || removedFiles.length > 0 ||
61
+ modifiedFiles.length > 0 || gitChanged || workflowsChanged;
62
+
63
+ console.log(`\x1b[36m→ Diff: +${addedFiles.length} -${removedFiles.length} ~${modifiedFiles.length}, git=${gitChanged}, wf=${workflowsChanged}\x1b[0m`);
64
+
65
+ context.diffJson = JSON.stringify(diff);
66
+ return { ctx: JSON.stringify(context) };
67
+ }
@@ -0,0 +1,71 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { execFileSync } from 'node:child_process';
4
+ import type { GenesisConfig, GenesisContext } from '../bot/types.js';
5
+
6
+ /**
7
+ * Runs flow-weaver diff between the snapshot and the current target
8
+ * workflow to produce a human-readable diff of workflow changes.
9
+ *
10
+ * @flowWeaver nodeType
11
+ * @expression
12
+ * @label Genesis Diff Workflow
13
+ * @input ctx [order:0] - Genesis context (JSON)
14
+ * @output ctx [order:0] - Genesis context with workflowDiffJson (JSON)
15
+ * @output onFailure [hidden]
16
+ */
17
+ export function genesisDiffWorkflow(ctx: string): { ctx: string } {
18
+ const context = JSON.parse(ctx) as GenesisContext;
19
+ const config = JSON.parse(context.genesisConfigJson) as GenesisConfig;
20
+ const targetPath = path.resolve(context.env.projectDir, config.targetWorkflow);
21
+
22
+ let diffOutput = '';
23
+
24
+ // Try semantic diff via flow-weaver first
25
+ try {
26
+ diffOutput = execFileSync('flow-weaver', ['diff', context.snapshotPath!, targetPath], {
27
+ cwd: context.env.projectDir,
28
+ encoding: 'utf-8',
29
+ stdio: ['pipe', 'pipe', 'pipe'],
30
+ timeout: 30_000,
31
+ }).trim();
32
+ } catch (err: unknown) {
33
+ if (err && typeof err === 'object' && 'stdout' in err) {
34
+ diffOutput = String((err as { stdout: string }).stdout).trim();
35
+ }
36
+ }
37
+
38
+ // Fallback to basic text diff if semantic diff failed
39
+ if (!diffOutput && context.snapshotPath) {
40
+ try {
41
+ const snapshotContent = fs.readFileSync(context.snapshotPath, 'utf-8');
42
+ const currentContent = fs.readFileSync(targetPath, 'utf-8');
43
+
44
+ if (snapshotContent === currentContent) {
45
+ diffOutput = '(no changes)';
46
+ } else {
47
+ diffOutput = execFileSync('git', ['diff', '--no-index', '--no-color', context.snapshotPath, targetPath], {
48
+ cwd: context.env.projectDir,
49
+ encoding: 'utf-8',
50
+ stdio: ['pipe', 'pipe', 'pipe'],
51
+ timeout: 10_000,
52
+ }).trim();
53
+ }
54
+ } catch (err: unknown) {
55
+ // git diff exits 1 when files differ (that's normal)
56
+ if (err && typeof err === 'object' && 'stdout' in err) {
57
+ const stdout = String((err as { stdout: string }).stdout).trim();
58
+ if (stdout) diffOutput = stdout;
59
+ }
60
+ }
61
+ }
62
+
63
+ if (!diffOutput) {
64
+ diffOutput = '(diff unavailable)';
65
+ }
66
+
67
+ console.log(`\x1b[36m→ Workflow diff: ${diffOutput.split('\n').length} lines\x1b[0m`);
68
+
69
+ context.workflowDiffJson = JSON.stringify({ diff: diffOutput });
70
+ return { ctx: JSON.stringify(context) };
71
+ }
@@ -0,0 +1,62 @@
1
+ import * as path from 'node:path';
2
+ import type { GenesisContext, GenesisConfig } from '../bot/types.js';
3
+ import { GenesisStore } from '../bot/genesis-store.js';
4
+ import { rollbackFromBackup } from './genesis-escrow-migrate.js';
5
+
6
+ /**
7
+ * Handles escrow grace period tracking at the end of each cycle.
8
+ * Decrements grace on success, triggers rollback on failure, and
9
+ * clears escrow once the grace period completes.
10
+ *
11
+ * @flowWeaver nodeType
12
+ * @expression
13
+ * @label Genesis Escrow Grace
14
+ * @input ctx [order:0] - Genesis context (JSON)
15
+ * @output ctx [order:0] - Genesis context (JSON)
16
+ */
17
+ export function genesisEscrowGrace(ctx: string): { ctx: string } {
18
+ const context = JSON.parse(ctx) as GenesisContext;
19
+ const { env } = context;
20
+ const config = JSON.parse(context.genesisConfigJson) as GenesisConfig;
21
+
22
+ if (!config.selfEvolve) {
23
+ return { ctx: JSON.stringify(context) };
24
+ }
25
+
26
+ const store = new GenesisStore(env.projectDir);
27
+ const token = store.loadEscrowToken();
28
+
29
+ if (!token || token.phase !== 'migrated' || token.graceRemaining <= 0) {
30
+ return { ctx: JSON.stringify(context) };
31
+ }
32
+
33
+ const packRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', '..');
34
+
35
+ // Cycle failed during grace: rollback
36
+ if (context.error) {
37
+ rollbackFromBackup(store, token, packRoot, `Grace cycle failed: ${context.error}`);
38
+ return { ctx: JSON.stringify(context) };
39
+ }
40
+
41
+ // Cycle succeeded: decrement grace
42
+ token.graceRemaining--;
43
+ token.graceCycleIds.push(context.cycleId);
44
+ store.saveEscrowToken(token);
45
+
46
+ console.log(`\x1b[36m→ Grace period: ${token.graceRemaining} cycle(s) remaining\x1b[0m`);
47
+
48
+ if (token.graceRemaining <= 0) {
49
+ store.appendSelfMigration({
50
+ migrationId: token.migrationId,
51
+ cycleId: token.cycleId,
52
+ timestamp: new Date().toISOString(),
53
+ affectedFiles: token.affectedFiles,
54
+ outcome: 'grace-cleared',
55
+ graceCompleted: true,
56
+ });
57
+ store.clearEscrow();
58
+ console.log('\x1b[32m→ Grace period complete, self-modification accepted\x1b[0m');
59
+ }
60
+
61
+ return { ctx: JSON.stringify(context) };
62
+ }
@@ -0,0 +1,138 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import type { GenesisContext, EscrowToken } from '../bot/types.js';
4
+ import { GenesisStore } from '../bot/genesis-store.js';
5
+ import { withFileLock } from '../bot/file-lock.js';
6
+
7
+ /**
8
+ * Copies staged files to their actual pack locations, completing the
9
+ * self-modification migration. Uses a file lock to prevent concurrent access.
10
+ *
11
+ * @flowWeaver nodeType
12
+ * @label Genesis Escrow Migrate
13
+ * @input ctx [order:0] - Genesis context (JSON)
14
+ * @output ctx [order:0] - Genesis context with migration result (JSON)
15
+ * @output onSuccess [order:-2] - On Success
16
+ * @output onFailure [order:-1] [hidden] - On Failure
17
+ */
18
+ export async function genesisEscrowMigrate(
19
+ execute: boolean,
20
+ ctx: string,
21
+ ): Promise<{
22
+ onSuccess: boolean; onFailure: boolean;
23
+ ctx: string;
24
+ }> {
25
+ const context = JSON.parse(ctx) as GenesisContext;
26
+ const { env } = context;
27
+ const store = new GenesisStore(env.projectDir);
28
+ const token = store.loadEscrowToken();
29
+
30
+ if (!execute) {
31
+ context.escrowResultJson = JSON.stringify({ migrated: false, reason: 'dry run' });
32
+ return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
33
+ }
34
+
35
+ if (!token || token.phase !== 'validated') {
36
+ // No validated escrow: pass through (not an error, just nothing to migrate)
37
+ return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
38
+ }
39
+
40
+ const packRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', '..');
41
+ const lockPath = path.join(env.projectDir, '.genesis', 'escrow', 'migrate');
42
+
43
+ try {
44
+ await withFileLock(lockPath, () => {
45
+ // Re-read token inside lock to confirm state
46
+ const lockedToken = store.loadEscrowToken();
47
+ if (!lockedToken || lockedToken.phase !== 'validated') {
48
+ throw new Error('Token state changed during lock acquisition');
49
+ }
50
+
51
+ lockedToken.phase = 'migrating';
52
+ store.saveEscrowToken(lockedToken);
53
+
54
+ // Copy each staged file to actual location
55
+ for (const relFile of lockedToken.affectedFiles) {
56
+ const stagedPath = store.getEscrowStagedPath(relFile);
57
+ const destPath = path.resolve(packRoot, relFile);
58
+
59
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
60
+ fs.copyFileSync(stagedPath, destPath);
61
+ }
62
+
63
+ lockedToken.phase = 'migrated';
64
+ lockedToken.migratedAt = new Date().toISOString();
65
+ store.saveEscrowToken(lockedToken);
66
+ });
67
+
68
+ console.log(`\x1b[32m→ Escrow migration complete: ${token.affectedFiles.length} file(s) swapped\x1b[0m`);
69
+ context.escrowResultJson = JSON.stringify({
70
+ migrated: true,
71
+ migrationId: token.migrationId,
72
+ files: token.affectedFiles,
73
+ });
74
+ return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
75
+ } catch (err: unknown) {
76
+ const msg = err instanceof Error ? err.message : String(err);
77
+ console.error(`\x1b[31m→ Escrow migration failed: ${msg}\x1b[0m`);
78
+
79
+ // Attempt rollback
80
+ rollbackFromBackup(store, token, packRoot, `Migration failed: ${msg}`);
81
+
82
+ context.error = `Escrow migration failed: ${msg}`;
83
+ return { onSuccess: false, onFailure: true, ctx: JSON.stringify(context) };
84
+ }
85
+ }
86
+
87
+ /** Restore all affected files from backup, or delete newly-created files. */
88
+ export function rollbackFromBackup(
89
+ store: GenesisStore,
90
+ token: EscrowToken,
91
+ packRoot: string,
92
+ reason: string,
93
+ ): void {
94
+ for (const relFile of token.affectedFiles) {
95
+ const backupPath = store.getEscrowBackupPath(relFile);
96
+ const destPath = path.resolve(packRoot, relFile);
97
+
98
+ if (fs.existsSync(backupPath)) {
99
+ // Verify backup integrity
100
+ try {
101
+ const actualHash = GenesisStore.hashFile(backupPath);
102
+ const expectedHash = token.backupFileHashes[relFile];
103
+ if (expectedHash && actualHash !== expectedHash) {
104
+ console.error(`\x1b[31m→ Backup integrity check failed for ${relFile}\x1b[0m`);
105
+ continue;
106
+ }
107
+ } catch {
108
+ console.error(`\x1b[31m→ Cannot read backup for ${relFile}\x1b[0m`);
109
+ continue;
110
+ }
111
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
112
+ fs.copyFileSync(backupPath, destPath);
113
+ } else if (fs.existsSync(destPath) && !token.backupFileHashes[relFile]) {
114
+ // File was newly created during migration (no backup), remove it
115
+ try { fs.unlinkSync(destPath); } catch { /* ignore */ }
116
+ }
117
+ }
118
+
119
+ // Update token
120
+ const fullToken = store.loadEscrowToken();
121
+ if (fullToken) {
122
+ fullToken.phase = 'rolled-back';
123
+ fullToken.rollbackReason = reason;
124
+ store.saveEscrowToken(fullToken);
125
+ }
126
+
127
+ store.appendSelfMigration({
128
+ migrationId: token.migrationId,
129
+ cycleId: token.cycleId,
130
+ timestamp: new Date().toISOString(),
131
+ affectedFiles: token.affectedFiles,
132
+ outcome: 'rolled-back',
133
+ graceCompleted: false,
134
+ rollbackReason: reason,
135
+ });
136
+
137
+ console.log(`\x1b[33m→ Rolled back migration ${token.migrationId}: ${reason}\x1b[0m`);
138
+ }
@@ -0,0 +1,99 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import type { GenesisContext, GenesisConfig } from '../bot/types.js';
4
+ import { GenesisStore } from '../bot/genesis-store.js';
5
+ import { rollbackFromBackup } from './genesis-escrow-migrate.js';
6
+
7
+ /**
8
+ * Checks for interrupted escrow migrations (crash recovery) and sets
9
+ * grace-period context flags for downstream nodes. Runs early in the
10
+ * workflow so propose and other nodes can see the escrow state.
11
+ *
12
+ * @flowWeaver nodeType
13
+ * @expression
14
+ * @label Genesis Escrow Recover
15
+ * @input ctx [order:0] - Genesis context (JSON)
16
+ * @output ctx [order:0] - Genesis context with escrow state flags (JSON)
17
+ */
18
+ export function genesisEscrowRecover(ctx: string): { ctx: string } {
19
+ const context = JSON.parse(ctx) as GenesisContext;
20
+ const { env } = context;
21
+ const config = JSON.parse(context.genesisConfigJson) as GenesisConfig;
22
+
23
+ if (!config.selfEvolve) {
24
+ context.escrowGraceLocked = false;
25
+ return { ctx: JSON.stringify(context) };
26
+ }
27
+
28
+ const store = new GenesisStore(env.projectDir);
29
+
30
+ // Check if max failures exceeded (disables self-evolution for this cycle)
31
+ const maxFailures = config.selfEvolveMaxFailures ?? 3;
32
+ const failureCount = store.getSelfFailureCount();
33
+ if (failureCount >= maxFailures) {
34
+ console.log(`\x1b[33m→ Self-evolution disabled: ${failureCount} consecutive failures (max ${maxFailures})\x1b[0m`);
35
+ context.escrowGraceLocked = true;
36
+ context.escrowGraceRemaining = 0;
37
+ return { ctx: JSON.stringify(context) };
38
+ }
39
+
40
+ const token = store.loadEscrowToken();
41
+
42
+ if (!token) {
43
+ context.escrowGraceLocked = false;
44
+ return { ctx: JSON.stringify(context) };
45
+ }
46
+
47
+ const packRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', '..');
48
+
49
+ // Crash recovery: process died mid-swap
50
+ if (token.phase === 'migrating') {
51
+ console.log('\x1b[33m→ Detected interrupted migration, checking file integrity...\x1b[0m');
52
+
53
+ let needsRollback = false;
54
+ for (const relFile of token.affectedFiles) {
55
+ const absFile = path.resolve(packRoot, relFile);
56
+ if (!fs.existsSync(absFile)) {
57
+ needsRollback = true;
58
+ break;
59
+ }
60
+ const currentHash = GenesisStore.hashFile(absFile);
61
+ const stagedHash = token.stagedFileHashes[relFile];
62
+ const backupHash = token.backupFileHashes[relFile];
63
+ if (currentHash !== stagedHash && currentHash !== backupHash) {
64
+ needsRollback = true;
65
+ break;
66
+ }
67
+ }
68
+
69
+ if (needsRollback) {
70
+ console.log('\x1b[33m→ Inconsistent state, rolling back...\x1b[0m');
71
+ rollbackFromBackup(store, token, packRoot, 'Crash recovery: inconsistent file state');
72
+ } else {
73
+ // Check if all files match staged (migration was actually complete)
74
+ const allStaged = token.affectedFiles.every(f => {
75
+ const absFile = path.resolve(packRoot, f);
76
+ return fs.existsSync(absFile) && GenesisStore.hashFile(absFile) === token.stagedFileHashes[f];
77
+ });
78
+ if (allStaged) {
79
+ token.phase = 'migrated';
80
+ token.migratedAt = new Date().toISOString();
81
+ store.saveEscrowToken(token);
82
+ console.log('\x1b[32m→ Migration was complete, advancing to grace period\x1b[0m');
83
+ } else {
84
+ rollbackFromBackup(store, token, packRoot, 'Crash recovery: partial migration');
85
+ }
86
+ }
87
+ }
88
+
89
+ // Set grace state for downstream nodes
90
+ const current = store.loadEscrowToken();
91
+ if (current && current.phase === 'migrated' && current.graceRemaining > 0) {
92
+ context.escrowGraceLocked = true;
93
+ context.escrowGraceRemaining = current.graceRemaining;
94
+ } else {
95
+ context.escrowGraceLocked = false;
96
+ }
97
+
98
+ return { ctx: JSON.stringify(context) };
99
+ }