@mclawnet/swarm 0.1.13 → 0.1.14

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 (320) hide show
  1. package/dist/__tests__/always-on-activity-reader.test.d.ts +2 -0
  2. package/dist/__tests__/always-on-activity-reader.test.d.ts.map +1 -0
  3. package/dist/__tests__/always-on-activity-reader.test.js +193 -0
  4. package/dist/__tests__/always-on-activity-reader.test.js.map +1 -0
  5. package/dist/__tests__/always-on-config.test.d.ts +2 -0
  6. package/dist/__tests__/always-on-config.test.d.ts.map +1 -0
  7. package/dist/__tests__/always-on-config.test.js +285 -0
  8. package/dist/__tests__/always-on-config.test.js.map +1 -0
  9. package/dist/__tests__/always-on-manager.test.d.ts +2 -0
  10. package/dist/__tests__/always-on-manager.test.d.ts.map +1 -0
  11. package/dist/__tests__/always-on-manager.test.js +797 -0
  12. package/dist/__tests__/always-on-manager.test.js.map +1 -0
  13. package/dist/__tests__/always-on-parity.test.d.ts +2 -0
  14. package/dist/__tests__/always-on-parity.test.d.ts.map +1 -0
  15. package/dist/__tests__/always-on-parity.test.js +20 -0
  16. package/dist/__tests__/always-on-parity.test.js.map +1 -0
  17. package/dist/__tests__/cascade-picker.test.d.ts +2 -0
  18. package/dist/__tests__/cascade-picker.test.d.ts.map +1 -0
  19. package/dist/__tests__/cascade-picker.test.js +122 -0
  20. package/dist/__tests__/cascade-picker.test.js.map +1 -0
  21. package/dist/__tests__/coordinator-shipment.test.d.ts +2 -0
  22. package/dist/__tests__/coordinator-shipment.test.d.ts.map +1 -0
  23. package/dist/__tests__/coordinator-shipment.test.js +280 -0
  24. package/dist/__tests__/coordinator-shipment.test.js.map +1 -0
  25. package/dist/__tests__/coordinator-workspace-recover.test.d.ts +2 -0
  26. package/dist/__tests__/coordinator-workspace-recover.test.d.ts.map +1 -0
  27. package/dist/__tests__/coordinator-workspace-recover.test.js +140 -0
  28. package/dist/__tests__/coordinator-workspace-recover.test.js.map +1 -0
  29. package/dist/__tests__/coordinator-workspace.test.d.ts +2 -0
  30. package/dist/__tests__/coordinator-workspace.test.d.ts.map +1 -0
  31. package/dist/__tests__/coordinator-workspace.test.js +135 -0
  32. package/dist/__tests__/coordinator-workspace.test.js.map +1 -0
  33. package/dist/__tests__/default-runner-epipe.test.d.ts +2 -0
  34. package/dist/__tests__/default-runner-epipe.test.d.ts.map +1 -0
  35. package/dist/__tests__/default-runner-epipe.test.js +43 -0
  36. package/dist/__tests__/default-runner-epipe.test.js.map +1 -0
  37. package/dist/__tests__/discovery-scheduler.test.d.ts +2 -0
  38. package/dist/__tests__/discovery-scheduler.test.d.ts.map +1 -0
  39. package/dist/__tests__/discovery-scheduler.test.js +367 -0
  40. package/dist/__tests__/discovery-scheduler.test.js.map +1 -0
  41. package/dist/__tests__/env-forward-e2e.test.d.ts +2 -0
  42. package/dist/__tests__/env-forward-e2e.test.d.ts.map +1 -0
  43. package/dist/__tests__/env-forward-e2e.test.js +57 -0
  44. package/dist/__tests__/env-forward-e2e.test.js.map +1 -0
  45. package/dist/__tests__/gh-pr-creator.test.d.ts +2 -0
  46. package/dist/__tests__/gh-pr-creator.test.d.ts.map +1 -0
  47. package/dist/__tests__/gh-pr-creator.test.js +107 -0
  48. package/dist/__tests__/gh-pr-creator.test.js.map +1 -0
  49. package/dist/__tests__/git-worktree-provider.test.d.ts +2 -0
  50. package/dist/__tests__/git-worktree-provider.test.d.ts.map +1 -0
  51. package/dist/__tests__/git-worktree-provider.test.js +98 -0
  52. package/dist/__tests__/git-worktree-provider.test.js.map +1 -0
  53. package/dist/__tests__/gitignore-check.test.d.ts +2 -0
  54. package/dist/__tests__/gitignore-check.test.d.ts.map +1 -0
  55. package/dist/__tests__/gitignore-check.test.js +39 -0
  56. package/dist/__tests__/gitignore-check.test.js.map +1 -0
  57. package/dist/__tests__/idea-research-source.test.d.ts +2 -0
  58. package/dist/__tests__/idea-research-source.test.d.ts.map +1 -0
  59. package/dist/__tests__/idea-research-source.test.js +425 -0
  60. package/dist/__tests__/idea-research-source.test.js.map +1 -0
  61. package/dist/__tests__/idea-todo-source.test.d.ts +2 -0
  62. package/dist/__tests__/idea-todo-source.test.d.ts.map +1 -0
  63. package/dist/__tests__/idea-todo-source.test.js +258 -0
  64. package/dist/__tests__/idea-todo-source.test.js.map +1 -0
  65. package/dist/__tests__/introspection-dedupe.test.d.ts +2 -0
  66. package/dist/__tests__/introspection-dedupe.test.d.ts.map +1 -0
  67. package/dist/__tests__/introspection-dedupe.test.js +484 -0
  68. package/dist/__tests__/introspection-dedupe.test.js.map +1 -0
  69. package/dist/__tests__/introspection-source.test.d.ts +2 -0
  70. package/dist/__tests__/introspection-source.test.d.ts.map +1 -0
  71. package/dist/__tests__/introspection-source.test.js +1051 -0
  72. package/dist/__tests__/introspection-source.test.js.map +1 -0
  73. package/dist/__tests__/migration-roles.test.js +1 -22
  74. package/dist/__tests__/migration-roles.test.js.map +1 -1
  75. package/dist/__tests__/reconcile-researching.test.d.ts +2 -0
  76. package/dist/__tests__/reconcile-researching.test.d.ts.map +1 -0
  77. package/dist/__tests__/reconcile-researching.test.js +224 -0
  78. package/dist/__tests__/reconcile-researching.test.js.map +1 -0
  79. package/dist/__tests__/role-loader-preamble-all.test.js +3 -1
  80. package/dist/__tests__/role-loader-preamble-all.test.js.map +1 -1
  81. package/dist/__tests__/role-loader.test.js +95 -0
  82. package/dist/__tests__/role-loader.test.js.map +1 -1
  83. package/dist/__tests__/role-prompt-no-legacy-protocol.test.js +3 -1
  84. package/dist/__tests__/role-prompt-no-legacy-protocol.test.js.map +1 -1
  85. package/dist/__tests__/secret-scrub.test.d.ts +2 -0
  86. package/dist/__tests__/secret-scrub.test.d.ts.map +1 -0
  87. package/dist/__tests__/secret-scrub.test.js +55 -0
  88. package/dist/__tests__/secret-scrub.test.js.map +1 -0
  89. package/dist/__tests__/shipment-actions.test.d.ts +2 -0
  90. package/dist/__tests__/shipment-actions.test.d.ts.map +1 -0
  91. package/dist/__tests__/shipment-actions.test.js +378 -0
  92. package/dist/__tests__/shipment-actions.test.js.map +1 -0
  93. package/dist/__tests__/shipment-persistence.test.d.ts +2 -0
  94. package/dist/__tests__/shipment-persistence.test.d.ts.map +1 -0
  95. package/dist/__tests__/shipment-persistence.test.js +120 -0
  96. package/dist/__tests__/shipment-persistence.test.js.map +1 -0
  97. package/dist/__tests__/shipment-pipeline.test.d.ts +2 -0
  98. package/dist/__tests__/shipment-pipeline.test.d.ts.map +1 -0
  99. package/dist/__tests__/shipment-pipeline.test.js +392 -0
  100. package/dist/__tests__/shipment-pipeline.test.js.map +1 -0
  101. package/dist/__tests__/shipment-report.test.d.ts +2 -0
  102. package/dist/__tests__/shipment-report.test.d.ts.map +1 -0
  103. package/dist/__tests__/shipment-report.test.js +78 -0
  104. package/dist/__tests__/shipment-report.test.js.map +1 -0
  105. package/dist/__tests__/shipment-stdin-integration.test.d.ts +2 -0
  106. package/dist/__tests__/shipment-stdin-integration.test.d.ts.map +1 -0
  107. package/dist/__tests__/shipment-stdin-integration.test.js +49 -0
  108. package/dist/__tests__/shipment-stdin-integration.test.js.map +1 -0
  109. package/dist/__tests__/shipment-type-parity.test.d.ts +2 -0
  110. package/dist/__tests__/shipment-type-parity.test.d.ts.map +1 -0
  111. package/dist/__tests__/shipment-type-parity.test.js +10 -0
  112. package/dist/__tests__/shipment-type-parity.test.js.map +1 -0
  113. package/dist/__tests__/snapshot-copy-provider.test.d.ts +2 -0
  114. package/dist/__tests__/snapshot-copy-provider.test.d.ts.map +1 -0
  115. package/dist/__tests__/snapshot-copy-provider.test.js +88 -0
  116. package/dist/__tests__/snapshot-copy-provider.test.js.map +1 -0
  117. package/dist/__tests__/swarm-coordinator-backend.test.js +153 -0
  118. package/dist/__tests__/swarm-coordinator-backend.test.js.map +1 -1
  119. package/dist/__tests__/swarm-coordinator-complete-intercept.test.d.ts +2 -0
  120. package/dist/__tests__/swarm-coordinator-complete-intercept.test.d.ts.map +1 -0
  121. package/dist/__tests__/swarm-coordinator-complete-intercept.test.js +111 -0
  122. package/dist/__tests__/swarm-coordinator-complete-intercept.test.js.map +1 -0
  123. package/dist/__tests__/task-store-source.test.d.ts +2 -0
  124. package/dist/__tests__/task-store-source.test.d.ts.map +1 -0
  125. package/dist/__tests__/task-store-source.test.js +56 -0
  126. package/dist/__tests__/task-store-source.test.js.map +1 -0
  127. package/dist/__tests__/transport-detect.test.d.ts +2 -0
  128. package/dist/__tests__/transport-detect.test.d.ts.map +1 -0
  129. package/dist/__tests__/transport-detect.test.js +92 -0
  130. package/dist/__tests__/transport-detect.test.js.map +1 -0
  131. package/dist/__tests__/workcycle-runner-cascade.test.d.ts +2 -0
  132. package/dist/__tests__/workcycle-runner-cascade.test.d.ts.map +1 -0
  133. package/dist/__tests__/workcycle-runner-cascade.test.js +203 -0
  134. package/dist/__tests__/workcycle-runner-cascade.test.js.map +1 -0
  135. package/dist/__tests__/workcycle-runner.test.d.ts +2 -0
  136. package/dist/__tests__/workcycle-runner.test.d.ts.map +1 -0
  137. package/dist/__tests__/workcycle-runner.test.js +369 -0
  138. package/dist/__tests__/workcycle-runner.test.js.map +1 -0
  139. package/dist/__tests__/workspace-diff.test.d.ts +2 -0
  140. package/dist/__tests__/workspace-diff.test.d.ts.map +1 -0
  141. package/dist/__tests__/workspace-diff.test.js +62 -0
  142. package/dist/__tests__/workspace-diff.test.js.map +1 -0
  143. package/dist/__tests__/workspace-manager.test.d.ts +2 -0
  144. package/dist/__tests__/workspace-manager.test.d.ts.map +1 -0
  145. package/dist/__tests__/workspace-manager.test.js +120 -0
  146. package/dist/__tests__/workspace-manager.test.js.map +1 -0
  147. package/dist/__tests__/workspace-types.test.d.ts +2 -0
  148. package/dist/__tests__/workspace-types.test.d.ts.map +1 -0
  149. package/dist/__tests__/workspace-types.test.js +37 -0
  150. package/dist/__tests__/workspace-types.test.js.map +1 -0
  151. package/dist/__tests__/worktree-gc.test.d.ts +2 -0
  152. package/dist/__tests__/worktree-gc.test.d.ts.map +1 -0
  153. package/dist/__tests__/worktree-gc.test.js +183 -0
  154. package/dist/__tests__/worktree-gc.test.js.map +1 -0
  155. package/dist/always-on/activity-reader.d.ts +27 -0
  156. package/dist/always-on/activity-reader.d.ts.map +1 -0
  157. package/dist/always-on/activity-reader.js +95 -0
  158. package/dist/always-on/activity-reader.js.map +1 -0
  159. package/dist/always-on/always-on-manager.d.ts +170 -0
  160. package/dist/always-on/always-on-manager.d.ts.map +1 -0
  161. package/dist/always-on/always-on-manager.js +538 -0
  162. package/dist/always-on/always-on-manager.js.map +1 -0
  163. package/dist/always-on/config.d.ts +141 -0
  164. package/dist/always-on/config.d.ts.map +1 -0
  165. package/dist/always-on/config.js +324 -0
  166. package/dist/always-on/config.js.map +1 -0
  167. package/dist/always-on/discovery-scheduler.d.ts +60 -0
  168. package/dist/always-on/discovery-scheduler.d.ts.map +1 -0
  169. package/dist/always-on/discovery-scheduler.js +287 -0
  170. package/dist/always-on/discovery-scheduler.js.map +1 -0
  171. package/dist/always-on/ideas-client.d.ts +23 -0
  172. package/dist/always-on/ideas-client.d.ts.map +1 -0
  173. package/dist/always-on/ideas-client.js +13 -0
  174. package/dist/always-on/ideas-client.js.map +1 -0
  175. package/dist/always-on/reconcile-researching.d.ts +42 -0
  176. package/dist/always-on/reconcile-researching.d.ts.map +1 -0
  177. package/dist/always-on/reconcile-researching.js +133 -0
  178. package/dist/always-on/reconcile-researching.js.map +1 -0
  179. package/dist/always-on/task-sources/cascade-picker.d.ts +42 -0
  180. package/dist/always-on/task-sources/cascade-picker.d.ts.map +1 -0
  181. package/dist/always-on/task-sources/cascade-picker.js +65 -0
  182. package/dist/always-on/task-sources/cascade-picker.js.map +1 -0
  183. package/dist/always-on/task-sources/idea-dedupe.d.ts +62 -0
  184. package/dist/always-on/task-sources/idea-dedupe.d.ts.map +1 -0
  185. package/dist/always-on/task-sources/idea-dedupe.js +130 -0
  186. package/dist/always-on/task-sources/idea-dedupe.js.map +1 -0
  187. package/dist/always-on/task-sources/idea-research-source.d.ts +46 -0
  188. package/dist/always-on/task-sources/idea-research-source.d.ts.map +1 -0
  189. package/dist/always-on/task-sources/idea-research-source.js +308 -0
  190. package/dist/always-on/task-sources/idea-research-source.js.map +1 -0
  191. package/dist/always-on/task-sources/idea-sort.d.ts +3 -0
  192. package/dist/always-on/task-sources/idea-sort.d.ts.map +1 -0
  193. package/dist/always-on/task-sources/idea-sort.js +25 -0
  194. package/dist/always-on/task-sources/idea-sort.js.map +1 -0
  195. package/dist/always-on/task-sources/idea-todo-source.d.ts +48 -0
  196. package/dist/always-on/task-sources/idea-todo-source.d.ts.map +1 -0
  197. package/dist/always-on/task-sources/idea-todo-source.js +226 -0
  198. package/dist/always-on/task-sources/idea-todo-source.js.map +1 -0
  199. package/dist/always-on/task-sources/introspection-source.d.ts +101 -0
  200. package/dist/always-on/task-sources/introspection-source.d.ts.map +1 -0
  201. package/dist/always-on/task-sources/introspection-source.js +695 -0
  202. package/dist/always-on/task-sources/introspection-source.js.map +1 -0
  203. package/dist/always-on/task-sources/task-store-source.d.ts +15 -0
  204. package/dist/always-on/task-sources/task-store-source.d.ts.map +1 -0
  205. package/dist/always-on/task-sources/task-store-source.js +59 -0
  206. package/dist/always-on/task-sources/task-store-source.js.map +1 -0
  207. package/dist/always-on/task-sources/types.d.ts +108 -0
  208. package/dist/always-on/task-sources/types.d.ts.map +1 -0
  209. package/dist/always-on/task-sources/types.js +13 -0
  210. package/dist/always-on/task-sources/types.js.map +1 -0
  211. package/dist/always-on/types.d.ts +76 -0
  212. package/dist/always-on/types.d.ts.map +1 -0
  213. package/dist/always-on/types.js +17 -0
  214. package/dist/always-on/types.js.map +1 -0
  215. package/dist/always-on/workcycle-runner.d.ts +115 -0
  216. package/dist/always-on/workcycle-runner.d.ts.map +1 -0
  217. package/dist/always-on/workcycle-runner.js +285 -0
  218. package/dist/always-on/workcycle-runner.js.map +1 -0
  219. package/dist/always-on/worktree-gc.d.ts +41 -0
  220. package/dist/always-on/worktree-gc.d.ts.map +1 -0
  221. package/dist/always-on/worktree-gc.js +167 -0
  222. package/dist/always-on/worktree-gc.js.map +1 -0
  223. package/dist/index.d.ts +26 -2
  224. package/dist/index.d.ts.map +1 -1
  225. package/dist/index.js +24 -1
  226. package/dist/index.js.map +1 -1
  227. package/dist/persistence.d.ts +37 -1
  228. package/dist/persistence.d.ts.map +1 -1
  229. package/dist/persistence.js +48 -0
  230. package/dist/persistence.js.map +1 -1
  231. package/dist/retrospective.d.ts.map +1 -1
  232. package/dist/retrospective.js +6 -0
  233. package/dist/retrospective.js.map +1 -1
  234. package/dist/roles/role-loader.d.ts +1 -1
  235. package/dist/roles/role-loader.d.ts.map +1 -1
  236. package/dist/roles/role-loader.js +18 -0
  237. package/dist/roles/role-loader.js.map +1 -1
  238. package/dist/roles/types.d.ts +12 -0
  239. package/dist/roles/types.d.ts.map +1 -1
  240. package/dist/shipment/gh-pr-creator.d.ts +28 -0
  241. package/dist/shipment/gh-pr-creator.d.ts.map +1 -0
  242. package/dist/shipment/gh-pr-creator.js +80 -0
  243. package/dist/shipment/gh-pr-creator.js.map +1 -0
  244. package/dist/shipment/report.d.ts +27 -0
  245. package/dist/shipment/report.d.ts.map +1 -0
  246. package/dist/shipment/report.js +41 -0
  247. package/dist/shipment/report.js.map +1 -0
  248. package/dist/shipment/secret-scrub.d.ts +12 -0
  249. package/dist/shipment/secret-scrub.d.ts.map +1 -0
  250. package/dist/shipment/secret-scrub.js +30 -0
  251. package/dist/shipment/secret-scrub.js.map +1 -0
  252. package/dist/shipment/shipment-actions.d.ts +85 -0
  253. package/dist/shipment/shipment-actions.d.ts.map +1 -0
  254. package/dist/shipment/shipment-actions.js +190 -0
  255. package/dist/shipment/shipment-actions.js.map +1 -0
  256. package/dist/shipment/shipment-pipeline.d.ts +48 -0
  257. package/dist/shipment/shipment-pipeline.d.ts.map +1 -0
  258. package/dist/shipment/shipment-pipeline.js +256 -0
  259. package/dist/shipment/shipment-pipeline.js.map +1 -0
  260. package/dist/shipment/transport-detect.d.ts +16 -0
  261. package/dist/shipment/transport-detect.d.ts.map +1 -0
  262. package/dist/shipment/transport-detect.js +54 -0
  263. package/dist/shipment/transport-detect.js.map +1 -0
  264. package/dist/shipment/workspace-diff.d.ts +39 -0
  265. package/dist/shipment/workspace-diff.d.ts.map +1 -0
  266. package/dist/shipment/workspace-diff.js +64 -0
  267. package/dist/shipment/workspace-diff.js.map +1 -0
  268. package/dist/swarm-coordinator.d.ts +20 -1
  269. package/dist/swarm-coordinator.d.ts.map +1 -1
  270. package/dist/swarm-coordinator.js +193 -10
  271. package/dist/swarm-coordinator.js.map +1 -1
  272. package/dist/types.d.ts +62 -0
  273. package/dist/types.d.ts.map +1 -1
  274. package/dist/workspace/git-worktree-provider.d.ts +11 -0
  275. package/dist/workspace/git-worktree-provider.d.ts.map +1 -0
  276. package/dist/workspace/git-worktree-provider.js +123 -0
  277. package/dist/workspace/git-worktree-provider.js.map +1 -0
  278. package/dist/workspace/gitignore-check.d.ts +10 -0
  279. package/dist/workspace/gitignore-check.d.ts.map +1 -0
  280. package/dist/workspace/gitignore-check.js +25 -0
  281. package/dist/workspace/gitignore-check.js.map +1 -0
  282. package/dist/workspace/index.d.ts +5 -0
  283. package/dist/workspace/index.d.ts.map +1 -0
  284. package/dist/workspace/index.js +5 -0
  285. package/dist/workspace/index.js.map +1 -0
  286. package/dist/workspace/snapshot-copy-provider.d.ts +11 -0
  287. package/dist/workspace/snapshot-copy-provider.d.ts.map +1 -0
  288. package/dist/workspace/snapshot-copy-provider.js +66 -0
  289. package/dist/workspace/snapshot-copy-provider.js.map +1 -0
  290. package/dist/workspace/types.d.ts +36 -0
  291. package/dist/workspace/types.d.ts.map +1 -0
  292. package/dist/workspace/types.js +2 -0
  293. package/dist/workspace/types.js.map +1 -0
  294. package/dist/workspace/workspace-manager.d.ts +30 -0
  295. package/dist/workspace/workspace-manager.d.ts.map +1 -0
  296. package/dist/workspace/workspace-manager.js +104 -0
  297. package/dist/workspace/workspace-manager.js.map +1 -0
  298. package/package.json +4 -4
  299. package/roles/queen.md +1 -0
  300. package/templates/introspection.md +64 -0
  301. package/templates/research-only.md +58 -0
  302. package/roles/preset-analyst-simons.md +0 -39
  303. package/roles/preset-architect-knuth.md +0 -39
  304. package/roles/preset-designer-norman.md +0 -39
  305. package/roles/preset-designer.md +0 -39
  306. package/roles/preset-dev-carmack.md +0 -39
  307. package/roles/preset-dev-gosling.md +0 -39
  308. package/roles/preset-developer.md +0 -52
  309. package/roles/preset-manager-grove.md +0 -39
  310. package/roles/preset-manager-musk.md +0 -39
  311. package/roles/preset-pm.md +0 -78
  312. package/roles/preset-researcher-feynman.md +0 -39
  313. package/roles/preset-reviewer.md +0 -46
  314. package/roles/preset-strategist-buffett.md +0 -39
  315. package/roles/preset-strategist-munger.md +0 -39
  316. package/roles/preset-strategist-sunzi.md +0 -39
  317. package/roles/preset-tester-beck.md +0 -40
  318. package/roles/preset-tester.md +0 -47
  319. package/roles/preset-writer-orwell.md +0 -39
  320. package/roles/preset-writer.md +0 -39
@@ -0,0 +1,285 @@
1
+ // WorkCycleRunner — M7.1 bridge between DiscoveryScheduler and the existing
2
+ // swarm/worktree/shipment pipeline.
3
+ //
4
+ // Responsibilities (kept deliberately small):
5
+ // 1. Pull the next task via an injected `pickNextTask` callback (TaskStore
6
+ // lives in the agent package; we stay decoupled via DI).
7
+ // 2. Create a single-cycle synthetic swarm via SwarmCoordinator.create with
8
+ // a stable `m7-cycle-<uuid>` swarmId prefix so the UI / persisted history
9
+ // can identify scheduler-spawned swarms later.
10
+ // 3. Wait for the swarm to reach a terminal state (or timeout) by polling
11
+ // coordinator.getSwarm().status.
12
+ // 4. Load the persisted ShipmentResult and return a structured
13
+ // WorkCycleResult to the caller (typically DiscoveryScheduler.onFire).
14
+ //
15
+ // Best-effort: every failure path is captured in the returned `error` field;
16
+ // run() never throws — a thrown runner would crash the DiscoveryScheduler tick
17
+ // loop, defeating the purpose of always-on.
18
+ import { randomUUID } from "node:crypto";
19
+ import { createLogger } from "@mclawnet/logger";
20
+ import { loadShipmentResult } from "../persistence.js";
21
+ /** Template the runner picks when TaskRef.cycleKind === "research" (M8.1). */
22
+ const RESEARCH_TEMPLATE_NAME = "research-only";
23
+ const DEFAULT_POLL_TIMEOUT_MS = 30 * 60 * 1000;
24
+ const DEFAULT_POLL_INTERVAL_MS = 5_000;
25
+ const DEFAULT_INITIAL_SETTLE_MS = 5_000;
26
+ const moduleLog = createLogger({ module: "swarm" });
27
+ /** Real-clock sleep. Replaced in tests via opts.sleep. */
28
+ function defaultSleep(ms) {
29
+ return new Promise((resolve) => setTimeout(resolve, ms));
30
+ }
31
+ export class WorkCycleRunner {
32
+ pickNextTask;
33
+ resolveTaskSource;
34
+ coordinator;
35
+ log;
36
+ pollTimeoutMs;
37
+ pollIntervalMs;
38
+ initialSettleMs;
39
+ sleep;
40
+ constructor(opts) {
41
+ this.pickNextTask = opts.pickNextTask;
42
+ if (opts.resolveTaskSource)
43
+ this.resolveTaskSource = opts.resolveTaskSource;
44
+ this.coordinator = opts.swarmCoordinator;
45
+ this.log = opts.log ?? moduleLog;
46
+ this.pollTimeoutMs = opts.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;
47
+ this.pollIntervalMs = opts.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
48
+ this.initialSettleMs = opts.initialSettleMs ?? DEFAULT_INITIAL_SETTLE_MS;
49
+ this.sleep = opts.sleep ?? defaultSleep;
50
+ }
51
+ /**
52
+ * Run one work cycle. Never throws — every failure is folded into the
53
+ * returned WorkCycleResult so DiscoveryScheduler.onFire can stay shape-
54
+ * stable across success and failure paths.
55
+ */
56
+ async run(input) {
57
+ const cycleId = randomUUID();
58
+ // Match the spec: prefix lets UI/persisted history identify scheduler-
59
+ // spawned swarms (vs. user-driven ones in M6.x flows).
60
+ const swarmId = `m7-cycle-${cycleId}`;
61
+ const startedAt = new Date().toISOString();
62
+ // 1. Pick a task — null means "nothing to do this cycle".
63
+ let task;
64
+ try {
65
+ task = await this.pickNextTask(input.projectRoot);
66
+ }
67
+ catch (err) {
68
+ const msg = err instanceof Error ? err.message : String(err);
69
+ this.log.warn({ err: msg, cycleId }, "pickNextTask threw — skipping cycle");
70
+ return {
71
+ cycleId,
72
+ swarmId,
73
+ taskRef: null,
74
+ status: "skipped",
75
+ error: `pickNextTask failed: ${msg}`,
76
+ startedAt,
77
+ endedAt: new Date().toISOString(),
78
+ };
79
+ }
80
+ if (!task) {
81
+ this.log.info({ cycleId, projectRoot: input.projectRoot }, "no task available — skipping cycle");
82
+ return {
83
+ cycleId,
84
+ swarmId,
85
+ taskRef: null,
86
+ status: "skipped",
87
+ error: "no task available",
88
+ startedAt,
89
+ endedAt: new Date().toISOString(),
90
+ };
91
+ }
92
+ // Resolve the source that produced this task so we can drive its
93
+ // onClaim / onSuccess / onFailure lifecycle. Null when the runner is
94
+ // running in legacy M7 single-source mode (no cascade picker injected).
95
+ const source = this.resolveTaskSource ? this.resolveTaskSource(task) : null;
96
+ // 2. Spawn the swarm.
97
+ // M8.1: research cycles override the default template so the worker
98
+ // operates under read-mostly + markdown-only constraints (see
99
+ // packages/@clawnet/swarm/templates/research-only.md). The override is
100
+ // task-driven, not config-driven — the same project can flip between
101
+ // execute (TaskStore / IdeaTodoSource) and research (IdeaResearchSource)
102
+ // cycles without an always-on.json edit.
103
+ const templateName = task.cycleKind === "research" ? RESEARCH_TEMPLATE_NAME : input.templateName ?? "minimal";
104
+ try {
105
+ await this.coordinator.create(swarmId, {
106
+ workDir: input.projectRoot,
107
+ templateName,
108
+ task: task.description ?? task.title,
109
+ kind: "always-on-cycle",
110
+ });
111
+ }
112
+ catch (err) {
113
+ const msg = err instanceof Error ? err.message : String(err);
114
+ this.log.warn({ err: msg, cycleId, swarmId }, "coordinator.create failed");
115
+ // Even though we never spawned, give the source a chance to clean up
116
+ // any optimistic state (it didn't claim yet, so onFailure is the right
117
+ // signal). Best-effort.
118
+ await this.invokeHook(source, "onFailure", task, swarmId, msg);
119
+ return {
120
+ cycleId,
121
+ swarmId,
122
+ taskRef: task,
123
+ status: "failed",
124
+ error: `coordinator.create failed: ${msg}`,
125
+ startedAt,
126
+ endedAt: new Date().toISOString(),
127
+ };
128
+ }
129
+ // Source has now "claimed" the task — let it record the in-flight state
130
+ // (IdeaTodoSource PATCHes the idea to researching + linkedSwarmTaskId).
131
+ await this.invokeHook(source, "onClaim", task, swarmId);
132
+ this.log.info({ cycleId, swarmId, taskId: task.id, taskTitle: task.title, source: source?.name ?? null }, "work cycle: swarm spawned, awaiting terminal state");
133
+ // 3. Wait for terminal state (polling). Best-effort — timeout cancels.
134
+ const waitResult = await this.waitForTerminal(swarmId);
135
+ // 4. Load shipment regardless of outcome — it's the artifact M6.2 UI uses
136
+ // and may exist even on failure (partial work). Best-effort.
137
+ let shipment;
138
+ try {
139
+ const loaded = loadShipmentResult(input.projectRoot, swarmId);
140
+ if (loaded)
141
+ shipment = loaded;
142
+ }
143
+ catch (err) {
144
+ this.log.warn({ err: err instanceof Error ? err.message : String(err), cycleId, swarmId }, "loadShipmentResult failed (best-effort)");
145
+ }
146
+ // 5. Drive source lifecycle hooks based on the terminal outcome. Per the
147
+ // M8.0 design contract: success = swarm completed AND shipment
148
+ // actually landed (strategy !== "skipped"); everything else is a
149
+ // failure path and the source should clean up (IdeaTodoSource
150
+ // reverts status=todo so the cycle can retry).
151
+ const hookKind = waitResult.status === "completed" && shipment && shipment.strategy !== "skipped"
152
+ ? "onSuccess"
153
+ : "onFailure";
154
+ const hookError = hookKind === "onFailure"
155
+ ? waitResult.error ?? shipment?.error ?? `shipment strategy=${shipment?.strategy ?? "none"}`
156
+ : undefined;
157
+ await this.invokeHook(source, hookKind, task, swarmId, hookError);
158
+ return {
159
+ cycleId,
160
+ swarmId,
161
+ taskRef: task,
162
+ status: waitResult.status,
163
+ ...(shipment ? { shipment } : {}),
164
+ ...(waitResult.error ? { error: waitResult.error } : {}),
165
+ startedAt,
166
+ endedAt: new Date().toISOString(),
167
+ };
168
+ }
169
+ /**
170
+ * Best-effort invocation of a source lifecycle hook. Swallows the source's
171
+ * exceptions so a misbehaving hook never crashes the runner — the cycle
172
+ * already reached its terminal state and the result is locked in.
173
+ */
174
+ async invokeHook(source, kind, taskRef, swarmId, error) {
175
+ if (!source)
176
+ return;
177
+ const fn = source[kind];
178
+ if (typeof fn !== "function")
179
+ return;
180
+ try {
181
+ if (kind === "onFailure") {
182
+ await source.onFailure(taskRef, swarmId, error);
183
+ }
184
+ else if (kind === "onSuccess") {
185
+ await source.onSuccess(taskRef, swarmId);
186
+ }
187
+ else {
188
+ await source.onClaim(taskRef, swarmId);
189
+ }
190
+ }
191
+ catch (err) {
192
+ this.log.warn({
193
+ err: err instanceof Error ? err.message : String(err),
194
+ source: source.name,
195
+ hook: kind,
196
+ swarmId,
197
+ taskId: taskRef.id,
198
+ }, "task-source hook threw (best-effort)");
199
+ }
200
+ }
201
+ /**
202
+ * Poll coordinator.getSwarm(swarmId) until the swarm enters a terminal
203
+ * state or the swarm is removed from the registry (cleanup already ran).
204
+ *
205
+ * Returns {status, error?} so the caller can build the full result.
206
+ * Status interpretation:
207
+ * - "completed" → swarm.status flipped to completed (we then call
208
+ * coordinator.complete to release resources if it's still in the map)
209
+ * - "failed" → swarm.status flipped to failed (we then call .fail)
210
+ * - "completed" (gone from map) → cleanup already happened externally;
211
+ * treat as completed without re-calling complete()
212
+ * - "failed" (timeout exceeded) → cancel via destroy and return failed
213
+ */
214
+ async waitForTerminal(swarmId) {
215
+ // Initial settle so we don't hammer the coordinator immediately after create.
216
+ if (this.initialSettleMs > 0) {
217
+ await this.sleep(this.initialSettleMs);
218
+ }
219
+ // PR-B D12 — no deadline. Loop until coordinator state turns terminal
220
+ // (completed/failed/cancelled) or paused (D14 → runner promotes to
221
+ // completed). pollTimeoutMs option kept for back-compat but unused;
222
+ // callers (always-on-manager) no longer pass it.
223
+ // eslint-disable-next-line no-constant-condition
224
+ while (true) {
225
+ const swarm = this.coordinator.getSwarm(swarmId);
226
+ if (!swarm) {
227
+ // Swarm was already cleaned up (e.g. complete() was called externally
228
+ // and runRetroAndCleanup removed it from the map). Treat as completed
229
+ // — the shipment.json on disk is the source of truth.
230
+ this.log.info({ swarmId }, "swarm no longer in registry — treating as completed");
231
+ return { status: "completed" };
232
+ }
233
+ if (swarm.status === "completed") {
234
+ // Best-effort: ensure cleanup runs so shipment writeback + memory sync
235
+ // happen. complete() is idempotent (no-op if not present).
236
+ try {
237
+ await this.coordinator.complete(swarmId);
238
+ }
239
+ catch (err) {
240
+ this.log.warn({ err: err instanceof Error ? err.message : String(err), swarmId }, "coordinator.complete failed (best-effort)");
241
+ }
242
+ return { status: "completed" };
243
+ }
244
+ if (swarm.status === "failed") {
245
+ try {
246
+ await this.coordinator.fail(swarmId);
247
+ }
248
+ catch (err) {
249
+ this.log.warn({ err: err instanceof Error ? err.message : String(err), swarmId }, "coordinator.fail failed (best-effort)");
250
+ }
251
+ return { status: "failed" };
252
+ }
253
+ if (swarm.status === "cancelled") {
254
+ // External cancel — treat as failed (the cycle didn't produce its
255
+ // intended outcome). No cleanup call needed; cancelled is terminal.
256
+ return { status: "failed", error: "swarm was cancelled externally" };
257
+ }
258
+ // PR-B D14 — paused = "queen stopped responding for ≥100 min". This
259
+ // is the coordinator's idle-fallback (startQueenCheck → swarm.status
260
+ // = paused) and it would otherwise sit forever holding CLI sessions
261
+ // + worktree disk. Runner promotes paused to completed so the full
262
+ // cleanup chain (runRetroAndCleanup → closeSession → workspace
263
+ // dispose → shipment of whatever progress was made) fires. Same
264
+ // spawner-owned pattern PR-A B2c added for IntrospectionSource,
265
+ // applied here at the runner layer for ordinary always-on cycles.
266
+ if (swarm.status === "paused") {
267
+ this.log.info({ swarmId }, "always-on cycle hit coordinator auto-pause — runner completing on swarm's behalf to release resources");
268
+ try {
269
+ await this.coordinator.complete(swarmId);
270
+ }
271
+ catch (err) {
272
+ this.log.warn({ err: err instanceof Error ? err.message : String(err), swarmId }, "coordinator.complete after auto-pause failed (best-effort)");
273
+ }
274
+ return { status: "completed" };
275
+ }
276
+ // PR-B D12 — no more pollTimeoutMs cap. There's no multi-cycle
277
+ // continuation mechanism, so cutting a cycle off at 30 min just
278
+ // burned tokens with zero accumulated progress. Long cycles run to
279
+ // queen-driven completion, with D14 (paused → complete) as the
280
+ // resource-leak guard.
281
+ await this.sleep(this.pollIntervalMs);
282
+ }
283
+ }
284
+ }
285
+ //# sourceMappingURL=workcycle-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workcycle-runner.js","sourceRoot":"","sources":["../../src/always-on/workcycle-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /** Default debug-window: keep failed-cycle worktrees for 24h before reaping. */
2
+ export declare const DEFAULT_WORKTREE_GC_AGE_MS: number;
3
+ export interface WorktreeGcOptions {
4
+ /** Project workDir (e.g. /Users/me/myproject). */
5
+ workDir: string;
6
+ /** ClawNet HOME used to resolve snapshot location. */
7
+ home: string;
8
+ /** Eligible-age cutoff. Default 24h. */
9
+ maxAgeMs?: number;
10
+ /** Clock override for tests. */
11
+ now?: () => Date;
12
+ /**
13
+ * Set false in tests to compute counts but NOT delete. Production always
14
+ * leaves this true (the default).
15
+ */
16
+ dryRun?: boolean;
17
+ }
18
+ export interface WorktreeGcResult {
19
+ /** Total `.worktrees/<dir>` entries observed. */
20
+ scanned: number;
21
+ /** Entries removed this pass. */
22
+ removed: number;
23
+ /** Entries retained (still active OR within debug window). */
24
+ retained: number;
25
+ /** Per-entry decisions for log spelunking. Limited to first 50 to bound log size. */
26
+ decisions: Array<{
27
+ name: string;
28
+ action: "removed" | "retained-active" | "retained-young";
29
+ ageMs: number;
30
+ }>;
31
+ }
32
+ /**
33
+ * Run one GC pass for one project's `.worktrees/`. Safe to call on every
34
+ * fired tick — when there's nothing to clean it's a cheap top-level
35
+ * readdir + per-entry stat pass (NO recursion into worktree contents).
36
+ *
37
+ * Errors at every layer are swallowed (logged via the returned result, not
38
+ * thrown) so a single bad worktree dir can't break the always-on tick loop.
39
+ */
40
+ export declare function gcWorktrees(opts: WorktreeGcOptions): WorktreeGcResult;
41
+ //# sourceMappingURL=worktree-gc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-gc.d.ts","sourceRoot":"","sources":["../../src/always-on/worktree-gc.ts"],"names":[],"mappings":"AAsDA,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,QAAsB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7G;AASD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,CAgErE"}
@@ -0,0 +1,167 @@
1
+ // PR-B Sub-PR-B4 — always-on worktree GC.
2
+ //
3
+ // Each fired always-on tick spawns a swarm that prepares a workspace
4
+ // (git worktree or, more commonly in practice, a snapshot-copy of the
5
+ // full repo) under `<projectRoot>/.worktrees/<swarmId>/`. SwarmCoordinator.
6
+ // destroy() / complete() / fail() dispose the workspace as part of
7
+ // runRetroAndCleanup, but **failures along that path leave directories
8
+ // behind**: pollTimeoutMs strands (removed in Sub-PR-B1), coordinator
9
+ // crashes, manual UI cancels mid-cleanup, sentinel files left when the
10
+ // SnapshotCopyProvider couldn't atomically delete.
11
+ //
12
+ // Over a 24h aggressive-mode run that's 144 ticks × ~few-hundred MB each.
13
+ // Real disk pressure shows up after a day or two of unattended running.
14
+ //
15
+ // GC strategy:
16
+ // - scan `<projectRoot>/.worktrees/`
17
+ // - for each entry, read mtime + check active-swarm membership
18
+ // - retain if: (a) is an active swarm in the coordinator-tracked snapshot
19
+ // set (recovery.json status ∉ completed/failed/cancelled), OR
20
+ // (b) mtime is younger than maxAgeMs (24h default — debug window)
21
+ // - otherwise: rm -rf
22
+ //
23
+ // PR-B follow-up — size telemetry removed.
24
+ // The original implementation reported {totalBytesBefore, totalBytesAfter}
25
+ // by walking every file under every worktree synchronously with
26
+ // readdirSync + statSync (`safeDirBytes`). In production a worktree is a
27
+ // full repo copy *including* node_modules — ~70k+ files. Across the
28
+ // average ~15 retained worktrees, one GC pass issued ~1M sync stat
29
+ // syscalls (>10 min wall clock), pegging the agent at 99% CPU and
30
+ // freezing the Node event loop. Symptoms: log goes silent, hub
31
+ // proxy_rpc 503 agent_timeout, InboxWatcher fs.watch never fires,
32
+ // queen-driven `swarm_complete_request` stays delivered=false until
33
+ // agent restart. Profile evidence: CPU samples showed `stat` / `readdir`
34
+ // dominating with `safeDirBytes` as the entry frame.
35
+ //
36
+ // The bytes were nice-to-have telemetry, not load-bearing for the reap
37
+ // decision. Deleted entirely — if a future use case needs size info it
38
+ // should use OS-native `du -sk` via spawnSync (kernel-side walk, 100×
39
+ // faster) or batch async readdir with explicit event-loop yields. NEVER
40
+ // reintroduce a synchronous recursive stat walk into the always-on tick
41
+ // path.
42
+ import { existsSync, readdirSync, readFileSync, rmSync, statSync, } from "node:fs";
43
+ import { join } from "node:path";
44
+ import { projectRoot as projRoot } from "@mclawnet/task";
45
+ /** Default debug-window: keep failed-cycle worktrees for 24h before reaping. */
46
+ export const DEFAULT_WORKTREE_GC_AGE_MS = 24 * 60 * 60 * 1000;
47
+ const EMPTY_RESULT = {
48
+ scanned: 0,
49
+ removed: 0,
50
+ retained: 0,
51
+ decisions: [],
52
+ };
53
+ /**
54
+ * Run one GC pass for one project's `.worktrees/`. Safe to call on every
55
+ * fired tick — when there's nothing to clean it's a cheap top-level
56
+ * readdir + per-entry stat pass (NO recursion into worktree contents).
57
+ *
58
+ * Errors at every layer are swallowed (logged via the returned result, not
59
+ * thrown) so a single bad worktree dir can't break the always-on tick loop.
60
+ */
61
+ export function gcWorktrees(opts) {
62
+ const maxAge = opts.maxAgeMs ?? DEFAULT_WORKTREE_GC_AGE_MS;
63
+ const now = (opts.now ?? (() => new Date())).call(null).getTime();
64
+ const dryRun = opts.dryRun ?? false;
65
+ const worktreesDir = join(opts.workDir, ".worktrees");
66
+ if (!existsSync(worktreesDir))
67
+ return { ...EMPTY_RESULT, decisions: [] };
68
+ const active = loadActiveSwarmIds(opts.workDir, opts.home);
69
+ let entries;
70
+ try {
71
+ entries = readdirSync(worktreesDir);
72
+ }
73
+ catch {
74
+ return { ...EMPTY_RESULT, decisions: [] };
75
+ }
76
+ const result = {
77
+ scanned: 0,
78
+ removed: 0,
79
+ retained: 0,
80
+ decisions: [],
81
+ };
82
+ for (const name of entries) {
83
+ const fp = join(worktreesDir, name);
84
+ let stat;
85
+ try {
86
+ stat = statSync(fp);
87
+ }
88
+ catch {
89
+ continue; // entry vanished between readdir and stat
90
+ }
91
+ if (!stat.isDirectory())
92
+ continue;
93
+ result.scanned += 1;
94
+ const ageMs = now - stat.mtimeMs;
95
+ if (active.has(name)) {
96
+ result.retained += 1;
97
+ pushDecision(result, name, "retained-active", ageMs);
98
+ continue;
99
+ }
100
+ if (ageMs < maxAge) {
101
+ result.retained += 1;
102
+ pushDecision(result, name, "retained-young", ageMs);
103
+ continue;
104
+ }
105
+ if (!dryRun) {
106
+ try {
107
+ rmSync(fp, { recursive: true, force: true });
108
+ }
109
+ catch {
110
+ // Best-effort: failed rm (perms, in-use file on Windows). Counts as
111
+ // retained — we tried, didn't succeed, dir still on disk.
112
+ result.retained += 1;
113
+ pushDecision(result, name, "retained-young", ageMs);
114
+ continue;
115
+ }
116
+ }
117
+ result.removed += 1;
118
+ pushDecision(result, name, "removed", ageMs);
119
+ }
120
+ return result;
121
+ }
122
+ function pushDecision(result, name, action, ageMs) {
123
+ if (result.decisions.length < 50) {
124
+ result.decisions.push({ name, action, ageMs });
125
+ }
126
+ }
127
+ /**
128
+ * Read this project's swarms snapshot dir and return the set of swarmIds
129
+ * whose recovery.json status is NOT terminal (still running / paused /
130
+ * creating). Those swarms' worktrees must NOT be GC'd even if they look
131
+ * old on disk — they're active state, just stalled.
132
+ */
133
+ function loadActiveSwarmIds(workDir, home) {
134
+ const swarmsDir = join(projRoot(workDir, home), "swarms");
135
+ if (!existsSync(swarmsDir))
136
+ return new Set();
137
+ const active = new Set();
138
+ let entries;
139
+ try {
140
+ entries = readdirSync(swarmsDir);
141
+ }
142
+ catch {
143
+ return active;
144
+ }
145
+ for (const swarmId of entries) {
146
+ const recoveryPath = join(swarmsDir, swarmId, "recovery.json");
147
+ if (!existsSync(recoveryPath))
148
+ continue;
149
+ try {
150
+ const raw = JSON.parse(readFileSync(recoveryPath, "utf-8"));
151
+ const status = raw.status;
152
+ // Treat "paused" as ACTIVE for GC purposes — Sub-PR-B1's D14 runner
153
+ // will promote it to complete on next tick and free its workspace
154
+ // through the normal dispose path. Reaping a paused worktree out
155
+ // from under D14 would lose any in-progress work.
156
+ const terminal = status === "completed" || status === "failed" || status === "cancelled";
157
+ if (!terminal)
158
+ active.add(swarmId);
159
+ }
160
+ catch {
161
+ // Unparseable snapshot — be conservative, treat as active.
162
+ active.add(swarmId);
163
+ }
164
+ }
165
+ return active;
166
+ }
167
+ //# sourceMappingURL=worktree-gc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-gc.js","sourceRoot":"","sources":["../../src/always-on/worktree-gc.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,15 @@
1
1
  export { SwarmCoordinator } from "./swarm-coordinator.js";
2
2
  export { initRoles, loadRole, listRoles, buildRolePrompt, parseRoleFile, listRolesWithSource, getRoleSource, getRoleRaw, saveRole, deleteRole, } from "./roles/role-loader.js";
3
3
  export type { RoleSource, RoleListItem } from "./roles/role-loader.js";
4
- export { saveSwarmSnapshot, loadSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, readMessageLog, listRecoverableSwarmIds, } from "./persistence.js";
4
+ export { saveSwarmSnapshot, loadSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, readMessageLog, listRecoverableSwarmIds, saveShipmentResult, loadShipmentResult, } from "./persistence.js";
5
5
  export type { SwarmSnapshot } from "./persistence.js";
6
+ export type { ShipmentResult } from "./shipment/shipment-pipeline.js";
7
+ export { applyShipment, mergeShipment, discardShipment, } from "./shipment/shipment-actions.js";
8
+ export type { ShipmentActionKind, ShipmentActionInput, ShipmentActionResult, } from "./shipment/shipment-actions.js";
6
9
  export { runRetrospective } from "./retrospective.js";
7
10
  export type { RetrospectiveResult, RoleEvaluation } from "./retrospective.js";
11
+ export { createDraftPR } from "./shipment/gh-pr-creator.js";
12
+ export type { CreateDraftPRInput, CreateDraftPRReturn, CreateDraftPROptions, CommandRunnerWithStdin, } from "./shipment/gh-pr-creator.js";
8
13
  export { listRecoverableSwarms, recoverSwarm } from "./recovery.js";
9
14
  export { InboxStore } from "./inbox-store.js";
10
15
  export type { InboxMessage } from "./inbox-store.js";
@@ -13,7 +18,24 @@ export { InboxRelay } from "./inbox-relay.js";
13
18
  export { InboxWatcher, type InboxRelayLike as InboxWatcherRelayLike } from "./inbox-watcher.js";
14
19
  export { WakeupScheduler, type WakeupRelayLike } from "./wakeup-scheduler.js";
15
20
  export { WatchManager, type WatchRegistration, type WatchManagerOptions } from "./watch-manager.js";
16
- export type { SessionAdapter, HubAdapter, SwarmInstance, RoleInstance, SwarmAction, SwarmMessage, SwarmCreateOptions, RouteEndpoint, SwarmStatus, PlanStatus, } from "./types.js";
21
+ export { DiscoveryScheduler } from "./always-on/discovery-scheduler.js";
22
+ export { DEFAULT_DAILY_BUDGET, DEFAULT_TICK_INTERVAL_MS, RECENT_TICKS_CAP, } from "./always-on/types.js";
23
+ export type { AlwaysOnMode, GateDecision, GateContext, Gate, TickRecord, DiscoverySchedulerOptions, DiscoverySchedulerSnapshot, } from "./always-on/types.js";
24
+ export { loadAlwaysOnConfig, saveAlwaysOnConfig, mergeAlwaysOnConfig, alwaysOnConfigPath, localYMD, DEFAULT_ALWAYS_ON_CONFIG, DEFAULT_ALWAYS_ON_TEMPLATE, DEFAULT_ALWAYS_ON_TASK_SOURCES, DEFAULT_INTROSPECTION_COOLDOWN_HOURS, resolveTaskSources, } from "./always-on/config.js";
25
+ export type { AlwaysOnConfig, AlwaysOnTaskSourcesConfig, AlwaysOnRuntimeState, AlwaysOnPersistedConfig, } from "./always-on/config.js";
26
+ export { AlwaysOnManager } from "./always-on/always-on-manager.js";
27
+ export type { AlwaysOnManagerOptions } from "./always-on/always-on-manager.js";
28
+ export { WorkCycleRunner } from "./always-on/workcycle-runner.js";
29
+ export type { WorkCycleInput, WorkCycleResult, WorkCycleRunnerOptions, TaskRef, Logger as WorkCycleRunnerLogger, } from "./always-on/workcycle-runner.js";
30
+ export type { TaskSource, TaskSourceKind, TaskRef as CascadeTaskRef } from "./always-on/task-sources/types.js";
31
+ export { createCascadePicker, type CascadePicker, type CascadePickResult, type CascadePickerLogger, } from "./always-on/task-sources/cascade-picker.js";
32
+ export { createTaskStoreSource, type TaskStoreSourceOptions, } from "./always-on/task-sources/task-store-source.js";
33
+ export { createIdeaTodoSource, markIdeaResearching, sortIdeasForPicking, type IdeaTodoSourceOptions, } from "./always-on/task-sources/idea-todo-source.js";
34
+ export { createIdeaResearchSource, sortIdeasForResearch, parseReportFrontmatter, normaliseConclusion, type IdeaResearchSourceOptions, } from "./always-on/task-sources/idea-research-source.js";
35
+ export { createIntrospectionSource, parseCandidatesOutput, buildIntrospectionTaskPrompt, INTROSPECTION_TEMPLATE_NAME, INTROSPECTION_SOURCE_TAG, INTROSPECTION_SOURCE_ROLE, INTROSPECTION_MAX_IDEAS, type IntrospectionSourceOptions, type IntrospectionCandidate, } from "./always-on/task-sources/introspection-source.js";
36
+ export { reconcileOrphanedResearching, type ReconcileOptions, type ReconcileReport, type ReconcileLogger, } from "./always-on/reconcile-researching.js";
37
+ export type { IdeasClient, IdeasListFilter, IdeasPatch, Idea, IdeaStatus, IdeaPriority, CreateIdeaInput, ResearchRef, ResearchKind, ResearchConclusion, } from "./always-on/ideas-client.js";
38
+ export type { SessionAdapter, HubAdapter, SwarmInstance, RoleInstance, SwarmAction, SwarmMessage, SwarmCreateOptions, RouteEndpoint, SwarmStatus, PlanStatus, SwarmKind, } from "./types.js";
17
39
  export type { RoleDefinition, DelegationMap, DelegationEntry } from "./roles/types.js";
18
40
  export { listTemplates, loadTemplate, listTemplatesWithSource, getTemplateSource, getTemplateRaw, saveTemplate, deleteTemplate, } from "./templates/template-loader.js";
19
41
  export type { TemplateDefinition, TemplateRoleSpec } from "./templates/types.js";
@@ -22,4 +44,6 @@ export { listProjectDirs, resolveWorkDir, loadProjectSummary, loadSwarmSummaries
22
44
  export type { TaskStatus, TaskCounts, ProjectSummary, SwarmSummary, } from "./projects-fs.js";
23
45
  export { PROJECT_FILE_WHITELIST, isWhitelistedRelPath, listProjectFiles, readProjectFile, writeProjectFile, ProjectFilesError, } from "./project-files.js";
24
46
  export type { ProjectFileRelPath, ProjectFileEntry, ProjectFileContent, } from "./project-files.js";
47
+ export { WorkspaceManager, GitWorktreeProvider, SnapshotCopyProvider, } from "./workspace/index.js";
48
+ export type { WorkspaceHandle, WorkspaceProvider, WorkspaceStrategy, WorkspacePrepareInput, } from "./workspace/index.js";
25
49
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EACrE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GACrE,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,IAAI,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEpG,YAAY,EACV,cAAc,EACd,UAAU,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,YAAY,EAClC,uBAAuB,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,GACzF,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvF,OAAO,EACL,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,8 +1,12 @@
1
1
  // @mclawnet/swarm — Swarm coordination, message routing, and role management
2
2
  export { SwarmCoordinator } from "./swarm-coordinator.js";
3
3
  export { initRoles, loadRole, listRoles, buildRolePrompt, parseRoleFile, listRolesWithSource, getRoleSource, getRoleRaw, saveRole, deleteRole, } from "./roles/role-loader.js";
4
- export { saveSwarmSnapshot, loadSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, readMessageLog, listRecoverableSwarmIds, } from "./persistence.js";
4
+ export { saveSwarmSnapshot, loadSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, readMessageLog, listRecoverableSwarmIds, saveShipmentResult, loadShipmentResult, } from "./persistence.js";
5
+ export { applyShipment, mergeShipment, discardShipment, } from "./shipment/shipment-actions.js";
5
6
  export { runRetrospective } from "./retrospective.js";
7
+ // PR-A: re-export gh-pr-creator so chat-session worktree ship can reuse the
8
+ // same git push + gh pr create logic without depending on SwarmInstance.
9
+ export { createDraftPR } from "./shipment/gh-pr-creator.js";
6
10
  export { listRecoverableSwarms, recoverSwarm } from "./recovery.js";
7
11
  export { InboxStore } from "./inbox-store.js";
8
12
  export { pickStrongestStatus } from "./plan-sync.js";
@@ -10,7 +14,26 @@ export { InboxRelay } from "./inbox-relay.js";
10
14
  export { InboxWatcher } from "./inbox-watcher.js";
11
15
  export { WakeupScheduler } from "./wakeup-scheduler.js";
12
16
  export { WatchManager } from "./watch-manager.js";
17
+ // M7.0 always-on primitive (no swarm wiring yet; M7.1 will wire onFire).
18
+ export { DiscoveryScheduler } from "./always-on/discovery-scheduler.js";
19
+ export { DEFAULT_DAILY_BUDGET, DEFAULT_TICK_INTERVAL_MS, RECENT_TICKS_CAP, } from "./always-on/types.js";
20
+ // M7.2 always-on per-project config persistence.
21
+ export { loadAlwaysOnConfig, saveAlwaysOnConfig, mergeAlwaysOnConfig, alwaysOnConfigPath, localYMD, DEFAULT_ALWAYS_ON_CONFIG, DEFAULT_ALWAYS_ON_TEMPLATE, DEFAULT_ALWAYS_ON_TASK_SOURCES, DEFAULT_INTROSPECTION_COOLDOWN_HOURS, resolveTaskSources, } from "./always-on/config.js";
22
+ // M7.3 per-project scheduler lifecycle owner.
23
+ export { AlwaysOnManager } from "./always-on/always-on-manager.js";
24
+ // M7.1 work-cycle runner — bridges DiscoveryScheduler.onFire to swarm spawn.
25
+ export { WorkCycleRunner } from "./always-on/workcycle-runner.js";
26
+ export { createCascadePicker, } from "./always-on/task-sources/cascade-picker.js";
27
+ export { createTaskStoreSource, } from "./always-on/task-sources/task-store-source.js";
28
+ export { createIdeaTodoSource, markIdeaResearching, sortIdeasForPicking, } from "./always-on/task-sources/idea-todo-source.js";
29
+ // M8.1 — research cycle task source.
30
+ export { createIdeaResearchSource, sortIdeasForResearch, parseReportFrontmatter, normaliseConclusion, } from "./always-on/task-sources/idea-research-source.js";
31
+ // M8.2 — queen self-introspection task source.
32
+ export { createIntrospectionSource, parseCandidatesOutput, buildIntrospectionTaskPrompt, INTROSPECTION_TEMPLATE_NAME, INTROSPECTION_SOURCE_TAG, INTROSPECTION_SOURCE_ROLE, INTROSPECTION_MAX_IDEAS, } from "./always-on/task-sources/introspection-source.js";
33
+ // M8 hotfix I6 — boot reconciliation for orphaned status=researching ideas.
34
+ export { reconcileOrphanedResearching, } from "./always-on/reconcile-researching.js";
13
35
  export { listTemplates, loadTemplate, listTemplatesWithSource, getTemplateSource, getTemplateRaw, saveTemplate, deleteTemplate, } from "./templates/template-loader.js";
14
36
  export { listProjectDirs, resolveWorkDir, loadProjectSummary, loadSwarmSummaries, listAllProjectSummaries, } from "./projects-fs.js";
15
37
  export { PROJECT_FILE_WHITELIST, isWhitelistedRelPath, listProjectFiles, readProjectFile, writeProjectFile, ProjectFilesError, } from "./project-files.js";
38
+ export { WorkspaceManager, GitWorktreeProvider, SnapshotCopyProvider, } from "./workspace/index.js";
16
39
  //# sourceMappingURL=index.js.map