@shapeshift-labs/frontier-swarm-codex 0.5.116 → 0.5.118

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 (387) hide show
  1. package/README.md +59 -3
  2. package/dist/apply.js +1 -1
  3. package/dist/apply.js.map +1 -1
  4. package/dist/calibration-feedback.d.ts.map +1 -1
  5. package/dist/calibration-feedback.js +57 -2
  6. package/dist/calibration-feedback.js.map +1 -1
  7. package/dist/cleanup.js +1 -0
  8. package/dist/cleanup.js.map +1 -1
  9. package/dist/cli-args.d.ts +72 -0
  10. package/dist/cli-args.d.ts.map +1 -0
  11. package/dist/cli-args.js +296 -0
  12. package/dist/cli-args.js.map +1 -0
  13. package/dist/cli-help.d.ts.map +1 -1
  14. package/dist/cli-help.js +14 -0
  15. package/dist/cli-help.js.map +1 -1
  16. package/dist/cli.js +58 -183
  17. package/dist/cli.js.map +1 -1
  18. package/dist/codex-adaptive-feedback.d.ts.map +1 -1
  19. package/dist/codex-adaptive-feedback.js +98 -3
  20. package/dist/codex-adaptive-feedback.js.map +1 -1
  21. package/dist/codex-executor.d.ts.map +1 -1
  22. package/dist/codex-executor.js +30 -3
  23. package/dist/codex-executor.js.map +1 -1
  24. package/dist/codex-prompt.d.ts.map +1 -1
  25. package/dist/codex-prompt.js +58 -0
  26. package/dist/codex-prompt.js.map +1 -1
  27. package/dist/codex-run-metadata.d.ts +34 -0
  28. package/dist/codex-run-metadata.d.ts.map +1 -0
  29. package/dist/codex-run-metadata.js +29 -0
  30. package/dist/codex-run-metadata.js.map +1 -0
  31. package/dist/codex-run-swarm.d.ts +4 -0
  32. package/dist/codex-run-swarm.d.ts.map +1 -0
  33. package/dist/codex-run-swarm.js +69 -0
  34. package/dist/codex-run-swarm.js.map +1 -0
  35. package/dist/codex-run.d.ts +3 -3
  36. package/dist/codex-run.d.ts.map +1 -1
  37. package/dist/codex-run.js +146 -133
  38. package/dist/codex-run.js.map +1 -1
  39. package/dist/codex-tournament-strategy.d.ts +10 -0
  40. package/dist/codex-tournament-strategy.d.ts.map +1 -1
  41. package/dist/codex-tournament-strategy.js +39 -0
  42. package/dist/codex-tournament-strategy.js.map +1 -1
  43. package/dist/codex-workspace-change-paths.d.ts +20 -0
  44. package/dist/codex-workspace-change-paths.d.ts.map +1 -0
  45. package/dist/codex-workspace-change-paths.js +215 -0
  46. package/dist/codex-workspace-change-paths.js.map +1 -0
  47. package/dist/codex-workspace-changes.d.ts +12 -12
  48. package/dist/codex-workspace-changes.d.ts.map +1 -1
  49. package/dist/codex-workspace-changes.js +19 -122
  50. package/dist/codex-workspace-changes.js.map +1 -1
  51. package/dist/codex-workspace-restore.d.ts +15 -0
  52. package/dist/codex-workspace-restore.d.ts.map +1 -0
  53. package/dist/codex-workspace-restore.js +66 -0
  54. package/dist/codex-workspace-restore.js.map +1 -0
  55. package/dist/codex-workspace-write-fence.d.ts +21 -0
  56. package/dist/codex-workspace-write-fence.d.ts.map +1 -0
  57. package/dist/codex-workspace-write-fence.js +155 -0
  58. package/dist/codex-workspace-write-fence.js.map +1 -0
  59. package/dist/codex-workspace.d.ts +5 -1
  60. package/dist/codex-workspace.d.ts.map +1 -1
  61. package/dist/codex-workspace.js +46 -2
  62. package/dist/codex-workspace.js.map +1 -1
  63. package/dist/collect-artifact-store.d.ts +14 -0
  64. package/dist/collect-artifact-store.d.ts.map +1 -0
  65. package/dist/collect-artifact-store.js +207 -0
  66. package/dist/collect-artifact-store.js.map +1 -0
  67. package/dist/collect-bundle-reasons.d.ts +18 -0
  68. package/dist/collect-bundle-reasons.d.ts.map +1 -0
  69. package/dist/collect-bundle-reasons.js +222 -0
  70. package/dist/collect-bundle-reasons.js.map +1 -0
  71. package/dist/collect-bundle-staleness.d.ts +10 -0
  72. package/dist/collect-bundle-staleness.d.ts.map +1 -0
  73. package/dist/collect-bundle-staleness.js +98 -0
  74. package/dist/collect-bundle-staleness.js.map +1 -0
  75. package/dist/collect-bundles.d.ts +8 -10
  76. package/dist/collect-bundles.d.ts.map +1 -1
  77. package/dist/collect-bundles.js +28 -115
  78. package/dist/collect-bundles.js.map +1 -1
  79. package/dist/collect-dashboard-quality.d.ts +5 -0
  80. package/dist/collect-dashboard-quality.d.ts.map +1 -0
  81. package/dist/collect-dashboard-quality.js +256 -0
  82. package/dist/collect-dashboard-quality.js.map +1 -0
  83. package/dist/collect-dashboard.d.ts +4 -3
  84. package/dist/collect-dashboard.d.ts.map +1 -1
  85. package/dist/collect-dashboard.js +37 -3
  86. package/dist/collect-dashboard.js.map +1 -1
  87. package/dist/collect-evidence.d.ts.map +1 -1
  88. package/dist/collect-evidence.js +13 -2
  89. package/dist/collect-evidence.js.map +1 -1
  90. package/dist/collect-finalize.d.ts +15 -0
  91. package/dist/collect-finalize.d.ts.map +1 -0
  92. package/dist/collect-finalize.js +75 -0
  93. package/dist/collect-finalize.js.map +1 -0
  94. package/dist/collect-landed.d.ts +7 -0
  95. package/dist/collect-landed.d.ts.map +1 -0
  96. package/dist/collect-landed.js +171 -0
  97. package/dist/collect-landed.js.map +1 -0
  98. package/dist/collect-noise.d.ts +6 -0
  99. package/dist/collect-noise.d.ts.map +1 -0
  100. package/dist/collect-noise.js +131 -0
  101. package/dist/collect-noise.js.map +1 -0
  102. package/dist/collect-overlaps.d.ts +3 -0
  103. package/dist/collect-overlaps.d.ts.map +1 -0
  104. package/dist/collect-overlaps.js +8 -0
  105. package/dist/collect-overlaps.js.map +1 -0
  106. package/dist/collect-pids.d.ts +4 -0
  107. package/dist/collect-pids.d.ts.map +1 -0
  108. package/dist/collect-pids.js +33 -0
  109. package/dist/collect-pids.js.map +1 -0
  110. package/dist/collect-setup.d.ts +4 -0
  111. package/dist/collect-setup.d.ts.map +1 -0
  112. package/dist/collect-setup.js +20 -0
  113. package/dist/collect-setup.js.map +1 -0
  114. package/dist/collect-terminal-state.d.ts +14 -0
  115. package/dist/collect-terminal-state.d.ts.map +1 -0
  116. package/dist/collect-terminal-state.js +113 -0
  117. package/dist/collect-terminal-state.js.map +1 -0
  118. package/dist/collect-workspace-only.d.ts +10 -0
  119. package/dist/collect-workspace-only.d.ts.map +1 -0
  120. package/dist/collect-workspace-only.js +289 -0
  121. package/dist/collect-workspace-only.js.map +1 -0
  122. package/dist/collect-workspace-proof.d.ts +3 -0
  123. package/dist/collect-workspace-proof.d.ts.map +1 -0
  124. package/dist/collect-workspace-proof.js +24 -0
  125. package/dist/collect-workspace-proof.js.map +1 -0
  126. package/dist/collect-workspace-recovery.d.ts +22 -0
  127. package/dist/collect-workspace-recovery.d.ts.map +1 -0
  128. package/dist/collect-workspace-recovery.js +94 -0
  129. package/dist/collect-workspace-recovery.js.map +1 -0
  130. package/dist/collect.d.ts +1 -2
  131. package/dist/collect.d.ts.map +1 -1
  132. package/dist/collect.js +125 -116
  133. package/dist/collect.js.map +1 -1
  134. package/dist/common.d.ts +5 -0
  135. package/dist/common.d.ts.map +1 -1
  136. package/dist/common.js +54 -1
  137. package/dist/common.js.map +1 -1
  138. package/dist/constants.d.ts +6 -0
  139. package/dist/constants.d.ts.map +1 -1
  140. package/dist/constants.js +6 -0
  141. package/dist/constants.js.map +1 -1
  142. package/dist/context-budget.d.ts.map +1 -1
  143. package/dist/context-budget.js +49 -6
  144. package/dist/context-budget.js.map +1 -1
  145. package/dist/continuation-adaptive-routing.d.ts +7 -0
  146. package/dist/continuation-adaptive-routing.d.ts.map +1 -0
  147. package/dist/continuation-adaptive-routing.js +129 -0
  148. package/dist/continuation-adaptive-routing.js.map +1 -0
  149. package/dist/continuation-child-backlogs.d.ts +11 -0
  150. package/dist/continuation-child-backlogs.d.ts.map +1 -0
  151. package/dist/continuation-child-backlogs.js +48 -0
  152. package/dist/continuation-child-backlogs.js.map +1 -0
  153. package/dist/continuation-feedback.d.ts +41 -0
  154. package/dist/continuation-feedback.d.ts.map +1 -0
  155. package/dist/continuation-feedback.js +294 -0
  156. package/dist/continuation-feedback.js.map +1 -0
  157. package/dist/continuation-human-actions.d.ts +15 -0
  158. package/dist/continuation-human-actions.d.ts.map +1 -0
  159. package/dist/continuation-human-actions.js +23 -0
  160. package/dist/continuation-human-actions.js.map +1 -0
  161. package/dist/continuation-job-routing-summary.d.ts +4 -0
  162. package/dist/continuation-job-routing-summary.d.ts.map +1 -0
  163. package/dist/continuation-job-routing-summary.js +47 -0
  164. package/dist/continuation-job-routing-summary.js.map +1 -0
  165. package/dist/continuation-task-source.d.ts +10 -0
  166. package/dist/continuation-task-source.d.ts.map +1 -0
  167. package/dist/continuation-task-source.js +11 -0
  168. package/dist/continuation-task-source.js.map +1 -0
  169. package/dist/continuation-terminal-outcomes.d.ts +27 -0
  170. package/dist/continuation-terminal-outcomes.d.ts.map +1 -0
  171. package/dist/continuation-terminal-outcomes.js +215 -0
  172. package/dist/continuation-terminal-outcomes.js.map +1 -0
  173. package/dist/continuation.d.ts +3 -0
  174. package/dist/continuation.d.ts.map +1 -0
  175. package/dist/continuation.js +266 -0
  176. package/dist/continuation.js.map +1 -0
  177. package/dist/dashboard-ui-constants.d.ts +6 -0
  178. package/dist/dashboard-ui-constants.d.ts.map +1 -0
  179. package/dist/dashboard-ui-constants.js +6 -0
  180. package/dist/dashboard-ui-constants.js.map +1 -0
  181. package/dist/dashboard-ui-health.d.ts +24 -0
  182. package/dist/dashboard-ui-health.d.ts.map +1 -0
  183. package/dist/dashboard-ui-health.js +175 -0
  184. package/dist/dashboard-ui-health.js.map +1 -0
  185. package/dist/dashboard-ui-human-actions.d.ts +3 -0
  186. package/dist/dashboard-ui-human-actions.d.ts.map +1 -0
  187. package/dist/dashboard-ui-human-actions.js +218 -0
  188. package/dist/dashboard-ui-human-actions.js.map +1 -0
  189. package/dist/dashboard-ui-jobs.d.ts +7 -0
  190. package/dist/dashboard-ui-jobs.d.ts.map +1 -0
  191. package/dist/dashboard-ui-jobs.js +232 -0
  192. package/dist/dashboard-ui-jobs.js.map +1 -0
  193. package/dist/dashboard-ui-lanes.d.ts +3 -0
  194. package/dist/dashboard-ui-lanes.d.ts.map +1 -0
  195. package/dist/dashboard-ui-lanes.js +17 -0
  196. package/dist/dashboard-ui-lanes.js.map +1 -0
  197. package/dist/dashboard-ui-metric-utils.d.ts +13 -0
  198. package/dist/dashboard-ui-metric-utils.d.ts.map +1 -0
  199. package/dist/dashboard-ui-metric-utils.js +52 -0
  200. package/dist/dashboard-ui-metric-utils.js.map +1 -0
  201. package/dist/dashboard-ui-quality.d.ts +4 -0
  202. package/dist/dashboard-ui-quality.d.ts.map +1 -0
  203. package/dist/dashboard-ui-quality.js +106 -0
  204. package/dist/dashboard-ui-quality.js.map +1 -0
  205. package/dist/dashboard-ui-semantic.d.ts +6 -0
  206. package/dist/dashboard-ui-semantic.d.ts.map +1 -0
  207. package/dist/dashboard-ui-semantic.js +84 -0
  208. package/dist/dashboard-ui-semantic.js.map +1 -0
  209. package/dist/dashboard-ui-sources.d.ts +9 -0
  210. package/dist/dashboard-ui-sources.d.ts.map +1 -0
  211. package/dist/dashboard-ui-sources.js +39 -0
  212. package/dist/dashboard-ui-sources.js.map +1 -0
  213. package/dist/dashboard-ui-steering.d.ts +4 -0
  214. package/dist/dashboard-ui-steering.d.ts.map +1 -0
  215. package/dist/dashboard-ui-steering.js +41 -0
  216. package/dist/dashboard-ui-steering.js.map +1 -0
  217. package/dist/dashboard-ui-summary.d.ts +6 -0
  218. package/dist/dashboard-ui-summary.d.ts.map +1 -0
  219. package/dist/dashboard-ui-summary.js +64 -0
  220. package/dist/dashboard-ui-summary.js.map +1 -0
  221. package/dist/dashboard-ui-time-series.d.ts +6 -0
  222. package/dist/dashboard-ui-time-series.d.ts.map +1 -0
  223. package/dist/dashboard-ui-time-series.js +191 -0
  224. package/dist/dashboard-ui-time-series.js.map +1 -0
  225. package/dist/dashboard-ui-types.d.ts +21 -0
  226. package/dist/dashboard-ui-types.d.ts.map +1 -0
  227. package/dist/dashboard-ui-types.js +2 -0
  228. package/dist/dashboard-ui-types.js.map +1 -0
  229. package/dist/dashboard-ui-values.d.ts +13 -0
  230. package/dist/dashboard-ui-values.d.ts.map +1 -0
  231. package/dist/dashboard-ui-values.js +57 -0
  232. package/dist/dashboard-ui-values.js.map +1 -0
  233. package/dist/dashboard-ui-workspace.d.ts +7 -0
  234. package/dist/dashboard-ui-workspace.d.ts.map +1 -0
  235. package/dist/dashboard-ui-workspace.js +131 -0
  236. package/dist/dashboard-ui-workspace.js.map +1 -0
  237. package/dist/dashboard-ui.d.ts +4 -0
  238. package/dist/dashboard-ui.d.ts.map +1 -0
  239. package/dist/dashboard-ui.js +139 -0
  240. package/dist/dashboard-ui.js.map +1 -0
  241. package/dist/dashboard.js +59 -3
  242. package/dist/dashboard.js.map +1 -1
  243. package/dist/human-actions.d.ts +46 -0
  244. package/dist/human-actions.d.ts.map +1 -0
  245. package/dist/human-actions.js +251 -0
  246. package/dist/human-actions.js.map +1 -0
  247. package/dist/index.d.ts +6 -6
  248. package/dist/index.d.ts.map +1 -1
  249. package/dist/index.js +5 -92
  250. package/dist/index.js.map +1 -1
  251. package/dist/model-pricing.d.ts +49 -0
  252. package/dist/model-pricing.d.ts.map +1 -0
  253. package/dist/model-pricing.js +159 -0
  254. package/dist/model-pricing.js.map +1 -0
  255. package/dist/patch-score-semantic.d.ts.map +1 -1
  256. package/dist/patch-score-semantic.js +34 -30
  257. package/dist/patch-score-semantic.js.map +1 -1
  258. package/dist/plan.d.ts +6 -0
  259. package/dist/plan.d.ts.map +1 -0
  260. package/dist/plan.js +191 -0
  261. package/dist/plan.js.map +1 -0
  262. package/dist/query-io.d.ts +8 -0
  263. package/dist/query-io.d.ts.map +1 -0
  264. package/dist/query-io.js +46 -0
  265. package/dist/query-io.js.map +1 -0
  266. package/dist/query-landed.d.ts +20 -0
  267. package/dist/query-landed.d.ts.map +1 -0
  268. package/dist/query-landed.js +64 -0
  269. package/dist/query-landed.js.map +1 -0
  270. package/dist/query-matchers.d.ts +6 -0
  271. package/dist/query-matchers.d.ts.map +1 -0
  272. package/dist/query-matchers.js +160 -0
  273. package/dist/query-matchers.js.map +1 -0
  274. package/dist/query-signal-types.d.ts +32 -0
  275. package/dist/query-signal-types.d.ts.map +1 -0
  276. package/dist/query-signal-types.js +2 -0
  277. package/dist/query-signal-types.js.map +1 -0
  278. package/dist/query-signals.d.ts +12 -0
  279. package/dist/query-signals.d.ts.map +1 -0
  280. package/dist/query-signals.js +207 -0
  281. package/dist/query-signals.js.map +1 -0
  282. package/dist/query-status.d.ts +10 -0
  283. package/dist/query-status.d.ts.map +1 -0
  284. package/dist/query-status.js +115 -0
  285. package/dist/query-status.js.map +1 -0
  286. package/dist/query-summaries.d.ts +283 -0
  287. package/dist/query-summaries.d.ts.map +1 -0
  288. package/dist/query-summaries.js +195 -0
  289. package/dist/query-summaries.js.map +1 -0
  290. package/dist/query-types.d.ts +45 -0
  291. package/dist/query-types.d.ts.map +1 -0
  292. package/dist/query-types.js +2 -0
  293. package/dist/query-types.js.map +1 -0
  294. package/dist/query-values.d.ts +15 -0
  295. package/dist/query-values.d.ts.map +1 -0
  296. package/dist/query-values.js +73 -0
  297. package/dist/query-values.js.map +1 -0
  298. package/dist/query.d.ts +344 -41
  299. package/dist/query.d.ts.map +1 -1
  300. package/dist/query.js +38 -157
  301. package/dist/query.js.map +1 -1
  302. package/dist/score-calibration.d.ts.map +1 -1
  303. package/dist/score-calibration.js +52 -3
  304. package/dist/score-calibration.js.map +1 -1
  305. package/dist/score.js +1 -1
  306. package/dist/score.js.map +1 -1
  307. package/dist/semantic-edit-admission.d.ts +3 -0
  308. package/dist/semantic-edit-admission.d.ts.map +1 -1
  309. package/dist/semantic-edit-admission.js +90 -11
  310. package/dist/semantic-edit-admission.js.map +1 -1
  311. package/dist/semantic-edit-clean-eligibility.d.ts.map +1 -1
  312. package/dist/semantic-edit-clean-eligibility.js +22 -4
  313. package/dist/semantic-edit-clean-eligibility.js.map +1 -1
  314. package/dist/semantic-edit-script.d.ts.map +1 -1
  315. package/dist/semantic-edit-script.js +26 -5
  316. package/dist/semantic-edit-script.js.map +1 -1
  317. package/dist/semantic-import-layers.d.ts +1 -1
  318. package/dist/semantic-import-layers.d.ts.map +1 -1
  319. package/dist/semantic-import-layers.js +22 -6
  320. package/dist/semantic-import-layers.js.map +1 -1
  321. package/dist/semantic-import-lineage-signals.d.ts +12 -0
  322. package/dist/semantic-import-lineage-signals.d.ts.map +1 -0
  323. package/dist/semantic-import-lineage-signals.js +126 -0
  324. package/dist/semantic-import-lineage-signals.js.map +1 -0
  325. package/dist/semantic-import-lineage.d.ts.map +1 -1
  326. package/dist/semantic-import-lineage.js +120 -18
  327. package/dist/semantic-import-lineage.js.map +1 -1
  328. package/dist/semantic-import-proof.d.ts.map +1 -1
  329. package/dist/semantic-import-proof.js +16 -0
  330. package/dist/semantic-import-proof.js.map +1 -1
  331. package/dist/semantic-import-quality.d.ts.map +1 -1
  332. package/dist/semantic-import-quality.js +8 -0
  333. package/dist/semantic-import-quality.js.map +1 -1
  334. package/dist/semantic-import-readiness.d.ts +15 -0
  335. package/dist/semantic-import-readiness.d.ts.map +1 -0
  336. package/dist/semantic-import-readiness.js +214 -0
  337. package/dist/semantic-import-readiness.js.map +1 -0
  338. package/dist/semantic-import-sidecar.d.ts.map +1 -1
  339. package/dist/semantic-import-sidecar.js +6 -37
  340. package/dist/semantic-import-sidecar.js.map +1 -1
  341. package/dist/semantic-import.d.ts +4 -2
  342. package/dist/semantic-import.d.ts.map +1 -1
  343. package/dist/semantic-import.js +27 -10
  344. package/dist/semantic-import.js.map +1 -1
  345. package/dist/tournament-bandit-view.d.ts +16 -13
  346. package/dist/tournament-bandit-view.d.ts.map +1 -1
  347. package/dist/tournament-bandit-view.js +23 -3
  348. package/dist/tournament-bandit-view.js.map +1 -1
  349. package/dist/tournament-query.d.ts +35 -39
  350. package/dist/tournament-query.d.ts.map +1 -1
  351. package/dist/tournament-query.js +32 -6
  352. package/dist/tournament-query.js.map +1 -1
  353. package/dist/types-collection-quality.d.ts +112 -0
  354. package/dist/types-collection-quality.d.ts.map +1 -0
  355. package/dist/types-collection-quality.js +2 -0
  356. package/dist/types-collection-quality.js.map +1 -0
  357. package/dist/types-collection-score.d.ts +112 -0
  358. package/dist/types-collection-score.d.ts.map +1 -0
  359. package/dist/types-collection-score.js +2 -0
  360. package/dist/types-collection-score.js.map +1 -0
  361. package/dist/types-collection.d.ts +107 -112
  362. package/dist/types-collection.d.ts.map +1 -1
  363. package/dist/types-continuation.d.ts +151 -0
  364. package/dist/types-continuation.d.ts.map +1 -0
  365. package/dist/types-continuation.js +2 -0
  366. package/dist/types-continuation.js.map +1 -0
  367. package/dist/types-dashboard-metrics.d.ts +241 -0
  368. package/dist/types-dashboard-metrics.d.ts.map +1 -0
  369. package/dist/types-dashboard-metrics.js +2 -0
  370. package/dist/types-dashboard-metrics.js.map +1 -0
  371. package/dist/types-dashboard.d.ts +277 -0
  372. package/dist/types-dashboard.d.ts.map +1 -0
  373. package/dist/types-dashboard.js +2 -0
  374. package/dist/types-dashboard.js.map +1 -0
  375. package/dist/types-evidence.d.ts +3 -0
  376. package/dist/types-evidence.d.ts.map +1 -1
  377. package/dist/types-run.d.ts +54 -1
  378. package/dist/types-run.d.ts.map +1 -1
  379. package/dist/types-score-calibration.d.ts +15 -0
  380. package/dist/types-score-calibration.d.ts.map +1 -1
  381. package/dist/types-semantic.d.ts +21 -12
  382. package/dist/types-semantic.d.ts.map +1 -1
  383. package/dist/types-workspace.d.ts +31 -1
  384. package/dist/types-workspace.d.ts.map +1 -1
  385. package/dist/types.d.ts +2 -0
  386. package/dist/types.d.ts.map +1 -1
  387. package/package.json +2 -2
@@ -0,0 +1,222 @@
1
+ import { pathHasIgnoredSegment, uniqueStrings } from './common.js';
2
+ export function collectFailureReasonClasses(reasons, patchStatus) {
3
+ const classes = [];
4
+ if (patchStatus)
5
+ classes.push(`patch-status.${patchStatus}`);
6
+ for (const reason of reasons) {
7
+ const normalized = reason.toLowerCase();
8
+ if (normalized === 'missing patch')
9
+ classes.push('patch.missing');
10
+ if (normalized === 'empty patch')
11
+ classes.push('patch.empty');
12
+ if (normalized.includes('patch applies to working tree'))
13
+ classes.push('patch.applies');
14
+ if (normalized.includes('patch applies to index but not dirty working tree'))
15
+ classes.push('patch.dirty-workspace-conflict');
16
+ if (normalized.includes('stale check disabled'))
17
+ classes.push('stale.check-disabled');
18
+ if (normalized.includes('stale-against-head cleared by patch freshness check'))
19
+ classes.push('stale.cleared-by-freshness-check');
20
+ if (normalized.includes('no patch base hashes available'))
21
+ classes.push('patch.no-base-hashes');
22
+ if (normalized.includes('textual apply failed'))
23
+ classes.push('patch.textual-apply-failed');
24
+ if (normalized.includes('base hash mismatch'))
25
+ classes.push('patch.base-hash-mismatch');
26
+ if (normalized.includes('base hash matches working tree content'))
27
+ classes.push('patch.base-hash-matches-worktree');
28
+ if (invalidGitIndexReason(normalized))
29
+ classes.push('workspace.invalid-git-index');
30
+ if (ownershipViolationReason(normalized))
31
+ classes.push('ownership.violation');
32
+ if (generatedWorkspaceSetupReason(normalized))
33
+ classes.push('generated.workspace-setup');
34
+ if (normalized.includes('source ownership violations present'))
35
+ classes.push('ownership.source-violation');
36
+ if (normalized.includes('ignored workspace noise ownership violations present')) {
37
+ classes.push('workspace.ignored-noise');
38
+ classes.push('workspace.ignored-noise.ownership-violation');
39
+ }
40
+ if (normalized.includes('quarantined-disallowed-changes'))
41
+ classes.push('workspace.quarantine');
42
+ if (normalized.includes('restored-disallowed-changes'))
43
+ classes.push('workspace.restore-disallowed-changes');
44
+ if (normalized.includes('.tsbuildinfo'))
45
+ classes.push('generated.tsbuildinfo-change');
46
+ const missingHeadBlobPath = missingHeadBlobReasonPath(reason);
47
+ if (missingHeadBlobPath) {
48
+ classes.push('patch.missing-head-blob');
49
+ if (ignoredWorkspaceNoisePath(missingHeadBlobPath))
50
+ classes.push('patch.missing-head-blob.generated');
51
+ }
52
+ }
53
+ return uniqueStrings(classes);
54
+ }
55
+ export function compactCollectFailureReasonClasses(reasonClasses) {
56
+ const classes = [];
57
+ const generatedMissingHeadBlob = reasonClasses.includes('patch.missing-head-blob.generated');
58
+ for (const reasonClass of reasonClasses) {
59
+ if (infrastructureNoiseFailureReasonClass(reasonClass))
60
+ classes.push('infrastructure-noise');
61
+ else if (sourceBlockerFailureReasonClass(reasonClass) && !(reasonClass === 'patch.missing-head-blob' && generatedMissingHeadBlob)) {
62
+ classes.push('source-blocker');
63
+ }
64
+ else if (staleFailureReasonClass(reasonClass)) {
65
+ classes.push('stale-state');
66
+ }
67
+ else if (patchPortFailureReasonClass(reasonClass)) {
68
+ classes.push('patch-port-required');
69
+ }
70
+ }
71
+ return uniqueStrings(classes);
72
+ }
73
+ export function infrastructureNoiseFailureReasonClass(reasonClass) {
74
+ return reasonClass === 'workspace.invalid-git-index'
75
+ || reasonClass === 'workspace.ignored-noise'
76
+ || reasonClass.startsWith('workspace.ignored-noise.')
77
+ || reasonClass.startsWith('generated.')
78
+ || reasonClass.endsWith('.generated');
79
+ }
80
+ export function sourceBlockerFailureReasonClass(reasonClass) {
81
+ return reasonClass === 'ownership.source-violation'
82
+ || reasonClass === 'patch.missing'
83
+ || reasonClass === 'patch.empty'
84
+ || reasonClass === 'patch.missing-head-blob'
85
+ || reasonClass === 'patch.base-hash-mismatch';
86
+ }
87
+ export function ignoredWorkspaceNoisePath(file) {
88
+ const normalized = file.replace(/\\/g, '/').toLowerCase();
89
+ return normalized.endsWith('.tsbuildinfo')
90
+ || pathHasIgnoredSegment(normalized, [
91
+ '.git',
92
+ '.cache',
93
+ '.turbo',
94
+ '.next',
95
+ 'coverage',
96
+ 'dist',
97
+ 'build',
98
+ 'generated',
99
+ 'node_modules',
100
+ '.frontier-framework',
101
+ 'agent-runs',
102
+ 'target'
103
+ ]);
104
+ }
105
+ export function sourceOwnershipViolations(paths) {
106
+ return sourceOwnershipViolationsForReasons(paths, []);
107
+ }
108
+ export function ignoredWorkspaceNoiseOwnershipViolations(paths) {
109
+ return ignoredWorkspaceNoiseOwnershipViolationsForReasons(paths, []);
110
+ }
111
+ export function sourceOwnershipViolationsForReasons(paths, reasons) {
112
+ return paths.filter((entry) => !ignoredWorkspaceNoisePath(entry) && !generatedWorkspaceSetupOwnershipPath(entry, reasons));
113
+ }
114
+ export function ignoredWorkspaceNoiseOwnershipViolationsForReasons(paths, reasons) {
115
+ return paths.filter((entry) => ignoredWorkspaceNoisePath(entry) || generatedWorkspaceSetupOwnershipPath(entry, reasons));
116
+ }
117
+ export function ownershipReasonDetails(paths, reasons = []) {
118
+ if (!paths.length)
119
+ return [];
120
+ return [
121
+ ...(sourceOwnershipViolationsForReasons(paths, reasons).length ? ['source ownership violations present'] : []),
122
+ ...(ignoredWorkspaceNoiseOwnershipViolationsForReasons(paths, reasons).length ? ['ignored workspace noise ownership violations present'] : [])
123
+ ];
124
+ }
125
+ export function ignoredWorkspaceNoiseOnlyFailure(bundle) {
126
+ if (bundle.commandsFailed.length > 0)
127
+ return false;
128
+ if (sourceOwnershipViolationsForReasons(bundle.ownershipViolations, bundle.reasons).length > 0)
129
+ return false;
130
+ const reasonClasses = collectFailureReasonClasses(bundle.reasons);
131
+ const compactReasonClasses = compactCollectFailureReasonClasses(reasonClasses);
132
+ const hasInfrastructureNoise = compactReasonClasses.includes('infrastructure-noise')
133
+ || ignoredWorkspaceNoiseOwnershipViolationsForReasons(bundle.ownershipViolations, bundle.reasons).length > 0;
134
+ if (!hasInfrastructureNoise)
135
+ return false;
136
+ if (compactReasonClasses.includes('source-blocker'))
137
+ return false;
138
+ return bundle.reasons.every((reason) => {
139
+ if (ignoredWorkspaceNoiseFailureReason(reason))
140
+ return true;
141
+ return collectFailureReasonClasses([reason]).some((reasonClass) => infrastructureNoiseFailureReasonClass(reasonClass));
142
+ });
143
+ }
144
+ export function nonActionableFailedEvidence(bundle, input) {
145
+ if (input.staleAgainstHead || bundle.staleAgainstHead)
146
+ return false;
147
+ if (input.hasActionablePatch ?? Boolean(bundle.patchPath))
148
+ return false;
149
+ if (bundle.changedPaths.length > 0 || bundle.ownershipViolations.length > 0 || bundle.commandsFailed.length > 0)
150
+ return false;
151
+ if (!bundle.reasons.some(nonActionableFailedEvidenceReason))
152
+ return false;
153
+ return bundle.disposition === 'blocked'
154
+ || bundle.disposition === 'rejected'
155
+ || bundle.mergeReadiness === 'blocked'
156
+ || bundle.mergeReadiness === 'rejected'
157
+ || bundle.status === 'failed'
158
+ || bundle.status === 'blocked';
159
+ }
160
+ function staleFailureReasonClass(reasonClass) {
161
+ return reasonClass.startsWith('stale.');
162
+ }
163
+ function patchPortFailureReasonClass(reasonClass) {
164
+ return reasonClass === 'patch.no-base-hashes'
165
+ || reasonClass === 'patch.textual-apply-failed'
166
+ || reasonClass === 'patch.base-hash-matches-worktree'
167
+ || reasonClass === 'patch.dirty-workspace-conflict'
168
+ || reasonClass.startsWith('patch-status.');
169
+ }
170
+ function invalidGitIndexReason(reason) {
171
+ return (reason.includes('.git/index') || reason.includes('.git\\index') || reason.includes('index file'))
172
+ && (reason.includes('fatal:')
173
+ || reason.includes('error:')
174
+ || reason.includes('invalid')
175
+ || reason.includes('corrupt')
176
+ || reason.includes('smaller than expected')
177
+ || reason.includes('unknown index entry'));
178
+ }
179
+ function ownershipViolationReason(reason) {
180
+ return reason === 'ownership-violations'
181
+ || reason === 'ownership violations present'
182
+ || reason.includes('ownership violation');
183
+ }
184
+ function missingHeadBlobReasonPath(reason) {
185
+ const match = /^missing HEAD blob for (.+)$/i.exec(reason.trim());
186
+ return match?.[1]?.trim();
187
+ }
188
+ function ignoredWorkspaceNoiseFailureReason(reason) {
189
+ const normalized = reason.toLowerCase();
190
+ return normalized === 'failed'
191
+ || normalized === 'rejected'
192
+ || normalized === 'blocked'
193
+ || normalized === 'ownership-violations'
194
+ || normalized === 'ownership violations present'
195
+ || normalized === 'ignored workspace noise ownership violations present'
196
+ || generatedWorkspaceSetupReason(normalized)
197
+ || normalized === 'quarantined-disallowed-changes'
198
+ || normalized === 'restored-disallowed-changes'
199
+ || normalized === 'stale check disabled'
200
+ || normalized.startsWith('patch-status.');
201
+ }
202
+ function generatedWorkspaceSetupReason(reason) {
203
+ return reason === 'generated_setup'
204
+ || reason.includes('generated setup')
205
+ || reason.includes('generated workspace setup');
206
+ }
207
+ function generatedWorkspaceSetupOwnershipPath(file, reasons) {
208
+ if (!reasons.some((reason) => generatedWorkspaceSetupReason(reason.toLowerCase())))
209
+ return false;
210
+ const normalized = file.replace(/\\/g, '/').toLowerCase();
211
+ return normalized === '.gitignore' || normalized === '.loomignore' || normalized === 'loom.json';
212
+ }
213
+ function nonActionableFailedEvidenceReason(reason) {
214
+ const normalized = reason.toLowerCase();
215
+ return normalized.includes('no-source-changes')
216
+ || normalized.includes('no source changes')
217
+ || normalized.includes('non-actionable-worker-output')
218
+ || normalized.includes('failed-output-recorded')
219
+ || normalized.includes('blocked-output-recorded')
220
+ || normalized.includes('generated-failed-evidence');
221
+ }
222
+ //# sourceMappingURL=collect-bundle-reasons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-bundle-reasons.js","sourceRoot":"","sources":["../src/collect-bundle-reasons.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { FrontierSwarmMergeBundle, FrontierSwarmPatchStatus } from '@shapeshift-labs/frontier-swarm';
2
+ export interface FrontierCodexPatchStaleness {
3
+ stale: boolean;
4
+ patchStatus: FrontierSwarmPatchStatus;
5
+ reasons: string[];
6
+ reasonClasses: string[];
7
+ fresh: boolean;
8
+ }
9
+ export declare function bundlePatchStaleness(bundle: FrontierSwarmMergeBundle, mergePath: string, cwd: string): Promise<FrontierCodexPatchStaleness>;
10
+ //# sourceMappingURL=collect-bundle-staleness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-bundle-staleness.d.ts","sourceRoot":"","sources":["../src/collect-bundle-staleness.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAI1G,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,wBAAwB,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,wBAAwB,EAChC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,2BAA2B,CAAC,CAkCtC"}
@@ -0,0 +1,98 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { pathExists, resolveBundlePatchPath, runProcess, tail, uniqueStrings } from './common.js';
4
+ import { collectFailureReasonClasses } from './collect-bundle-reasons.js';
5
+ export async function bundlePatchStaleness(bundle, mergePath, cwd) {
6
+ const patchPath = resolveBundlePatchPath(bundle, mergePath);
7
+ if (!patchPath || !await pathExists(patchPath))
8
+ return patchStalenessResult(false, 'missing', ['missing patch'], false);
9
+ const patch = await fs.readFile(patchPath, 'utf8').catch(() => '');
10
+ if (!patch.trim())
11
+ return patchStalenessResult(false, 'missing', ['empty patch'], false);
12
+ const result = await runProcess('git', ['apply', '--check', patchPath], { cwd, allowFailure: true });
13
+ if (result.status === 0)
14
+ return patchStalenessResult(false, 'applies', ['patch applies to working tree'], true);
15
+ const cached = await runProcess('git', ['apply', '--check', '--cached', patchPath], { cwd, allowFailure: true });
16
+ if (cached.status === 0) {
17
+ return patchStalenessResult(false, 'dirty-workspace-conflict', ['patch applies to index but not dirty working tree'], true);
18
+ }
19
+ const baseStatus = await patchBaseHashStatus(patch, cwd);
20
+ if (!baseStatus.known) {
21
+ return patchStalenessResult(false, 'needs-port', ['patch does not expose comparable base hashes; coordinator review must port it', ...baseStatus.reasons, ...tail(result.stderr || result.stdout, 3)], false);
22
+ }
23
+ if (baseStatus.known && baseStatus.mismatched === 0) {
24
+ return patchStalenessResult(false, 'needs-port', ['patch base hashes match HEAD or working tree content but textual apply failed', ...baseStatus.reasons, ...tail(result.stderr || result.stdout, 3)], true);
25
+ }
26
+ return patchStalenessResult(false, 'needs-port', ['patch base hashes differ from HEAD and working tree content; manual port required', ...baseStatus.reasons, ...tail(result.stderr || result.stdout, 3)], false);
27
+ }
28
+ function patchStalenessResult(stale, patchStatus, reasons, fresh) {
29
+ const normalizedReasons = uniqueStrings([...reasons]);
30
+ return {
31
+ stale,
32
+ patchStatus,
33
+ reasons: normalizedReasons,
34
+ reasonClasses: collectFailureReasonClasses(normalizedReasons, patchStatus),
35
+ fresh
36
+ };
37
+ }
38
+ async function patchBaseHashStatus(patch, cwd) {
39
+ const entries = parsePatchBaseHashes(patch, cwd);
40
+ if (entries.length === 0)
41
+ return { known: false, mismatched: 0, reasons: ['no patch base hashes available'] };
42
+ let mismatched = 0;
43
+ const reasons = [];
44
+ for (const entry of entries) {
45
+ const head = await runProcess('git', ['rev-parse', `HEAD:${entry.path}`], { cwd, allowFailure: true });
46
+ const headHash = head.stdout.trim();
47
+ if (head.status === 0 && headHash.startsWith(entry.oldHash))
48
+ continue;
49
+ const worktree = await runProcess('git', ['hash-object', '--', entry.path], { cwd, allowFailure: true });
50
+ const worktreeHash = worktree.stdout.trim();
51
+ if (worktree.status === 0 && worktreeHash.startsWith(entry.oldHash)) {
52
+ reasons.push(`base hash matches working tree content for ${entry.path}`);
53
+ continue;
54
+ }
55
+ mismatched += 1;
56
+ reasons.push(head.status !== 0 ? `missing HEAD blob for ${entry.path}` : `base hash mismatch for ${entry.path}`);
57
+ }
58
+ return { known: true, mismatched, reasons };
59
+ }
60
+ function parsePatchBaseHashes(patch, cwd) {
61
+ const lines = patch.split(/\r?\n/);
62
+ const entries = [];
63
+ let currentPath;
64
+ for (const line of lines) {
65
+ if (line.startsWith('diff --git ')) {
66
+ const parts = line.split(/\s+/);
67
+ currentPath = normalizePatchBasePath(parts[2], cwd) ?? normalizePatchBasePath(parts[3], cwd);
68
+ continue;
69
+ }
70
+ if (!currentPath || !line.startsWith('index '))
71
+ continue;
72
+ const match = /^index\s+([0-9a-f]+)\.\.([0-9a-f]+)/i.exec(line);
73
+ if (match?.[1] && match[1] !== '0000000')
74
+ entries.push({ path: currentPath, oldHash: match[1] });
75
+ }
76
+ return entries;
77
+ }
78
+ function normalizePatchBasePath(token, cwd) {
79
+ if (!token || token === '/dev/null')
80
+ return undefined;
81
+ let value = token;
82
+ if (value.startsWith('a/') || value.startsWith('b/'))
83
+ value = value.slice(2);
84
+ if (value === '/dev/null')
85
+ return undefined;
86
+ if (path.isAbsolute(value)) {
87
+ const relative = path.relative(cwd, value);
88
+ if (relative && !relative.startsWith('..') && !path.isAbsolute(relative))
89
+ return relative.replace(/\\/g, '/');
90
+ return undefined;
91
+ }
92
+ const rootedValue = path.join(path.parse(cwd).root, value);
93
+ const rootedRelative = path.relative(cwd, rootedValue);
94
+ if (rootedRelative && !rootedRelative.startsWith('..') && !path.isAbsolute(rootedRelative))
95
+ return rootedRelative.replace(/\\/g, '/');
96
+ return value.replace(/\\/g, '/');
97
+ }
98
+ //# sourceMappingURL=collect-bundle-staleness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-bundle-staleness.js","sourceRoot":"","sources":["../src/collect-bundle-staleness.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,16 @@
1
- import { type FrontierSwarmMergeBundle, type FrontierSwarmPatchStatus } from '@shapeshift-labs/frontier-swarm';
1
+ import { type FrontierSwarmMergeBundle } from '@shapeshift-labs/frontier-swarm';
2
+ import type { FrontierCodexPatchStaleness } from './collect-bundle-staleness.js';
2
3
  import type { FrontierCodexCollectBucket } from './index.js';
3
- export interface FrontierCodexPatchStaleness {
4
- stale: boolean;
5
- patchStatus: FrontierSwarmPatchStatus;
6
- reasons: string[];
7
- fresh: boolean;
8
- }
9
- export declare function bundlePatchStaleness(bundle: FrontierSwarmMergeBundle, mergePath: string, cwd: string): Promise<FrontierCodexPatchStaleness>;
4
+ export { bundlePatchStaleness } from './collect-bundle-staleness.js';
5
+ export type { FrontierCodexPatchStaleness } from './collect-bundle-staleness.js';
6
+ export { collectFailureReasonClasses, compactCollectFailureReasonClasses, ignoredWorkspaceNoiseOwnershipViolations, ignoredWorkspaceNoiseOwnershipViolationsForReasons, ignoredWorkspaceNoisePath, infrastructureNoiseFailureReasonClass, nonActionableFailedEvidence, sourceBlockerFailureReasonClass, sourceOwnershipViolations, sourceOwnershipViolationsForReasons } from './collect-bundle-reasons.js';
7
+ export type { FrontierCodexCollectCompactReasonClass } from './collect-bundle-reasons.js';
10
8
  export declare function normalizeCollectedMergeBundle(value: unknown, mergePath: string): FrontierSwarmMergeBundle;
11
9
  export declare function mergeRecordScore(record: {
12
10
  mergePath: string;
13
11
  bundle: FrontierSwarmMergeBundle;
14
12
  }): number;
15
- export declare function classifyCodexCollectBucket(bundle: FrontierSwarmMergeBundle, staleAgainstHead: boolean): FrontierCodexCollectBucket;
13
+ export declare function classifyCodexCollectBucket(bundle: FrontierSwarmMergeBundle, staleAgainstHead: boolean, hasActionablePatch?: boolean): FrontierCodexCollectBucket;
16
14
  export declare function normalizeCollectedStaleAgainstHead(bundle: FrontierSwarmMergeBundle, staleness: FrontierCodexPatchStaleness, checkStale: boolean): boolean;
17
- export declare function normalizeCollectedDisposition(bundle: FrontierSwarmMergeBundle, staleAgainstHead: boolean): FrontierSwarmMergeBundle['disposition'];
15
+ export declare function normalizeCollectedDisposition(bundle: FrontierSwarmMergeBundle, staleAgainstHead: boolean, patchExists?: boolean): FrontierSwarmMergeBundle['disposition'];
18
16
  //# sourceMappingURL=collect-bundles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"collect-bundles.d.ts","sourceRoot":"","sources":["../src/collect-bundles.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAG7D,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,wBAAwB,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,wBAAwB,EAChC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,2BAA2B,CAAC,CAuCtC;AA4DD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,wBAAwB,CAiDzG;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,GAAG,MAAM,CAMxG;AAQD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,OAAO,GAAG,0BAA0B,CAOlI;AAGD,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,wBAAwB,EAChC,SAAS,EAAE,2BAA2B,EACtC,UAAU,EAAE,OAAO,GAClB,OAAO,CAMT;AAGD,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,wBAAwB,EAChC,gBAAgB,EAAE,OAAO,GACxB,wBAAwB,CAAC,aAAa,CAAC,CAIzC"}
1
+ {"version":3,"file":"collect-bundles.d.ts","sourceRoot":"","sources":["../src/collect-bundles.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAOzC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EACL,oBAAoB,EACrB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,2BAA2B,EAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,kCAAkC,EAClC,wCAAwC,EACxC,kDAAkD,EAClD,yBAAyB,EACzB,qCAAqC,EACrC,2BAA2B,EAC3B,+BAA+B,EAC/B,yBAAyB,EACzB,mCAAmC,EACpC,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,sCAAsC,EACvC,MAAM,6BAA6B,CAAC;AAErC,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,wBAAwB,CAkDzG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,GAAG,MAAM,CAMxG;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,wBAAwB,EAChC,gBAAgB,EAAE,OAAO,EACzB,kBAAkB,UAA4B,GAC7C,0BAA0B,CAa5B;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,wBAAwB,EAChC,SAAS,EAAE,2BAA2B,EACtC,UAAU,EAAE,OAAO,GAClB,OAAO,CAMT;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,wBAAwB,EAChC,gBAAgB,EAAE,OAAO,EACzB,WAAW,UAA4B,GACtC,wBAAwB,CAAC,aAAa,CAAC,CAMzC"}
@@ -1,119 +1,21 @@
1
- import fs from 'node:fs/promises';
2
1
  import path from 'node:path';
3
2
  import { FRONTIER_SWARM_MERGE_BUNDLE_KIND, FRONTIER_SWARM_MERGE_BUNDLE_VERSION } from '@shapeshift-labs/frontier-swarm';
4
- import { isObject, pathExists, resolveBundlePatchPath, runProcess, tail, uniqueStrings } from './common.js';
5
- export async function bundlePatchStaleness(bundle, mergePath, cwd) {
6
- const patchPath = resolveBundlePatchPath(bundle, mergePath);
7
- if (!patchPath || !await pathExists(patchPath))
8
- return { stale: false, patchStatus: 'missing', reasons: ['missing patch'], fresh: false };
9
- const patch = await fs.readFile(patchPath, 'utf8').catch(() => '');
10
- if (!patch.trim())
11
- return { stale: false, patchStatus: 'missing', reasons: ['empty patch'], fresh: false };
12
- const result = await runProcess('git', ['apply', '--check', patchPath], { cwd, allowFailure: true });
13
- if (result.status === 0)
14
- return { stale: false, patchStatus: 'applies', reasons: ['patch applies to working tree'], fresh: true };
15
- const cached = await runProcess('git', ['apply', '--check', '--cached', patchPath], { cwd, allowFailure: true });
16
- if (cached.status === 0) {
17
- return {
18
- stale: false,
19
- patchStatus: 'dirty-workspace-conflict',
20
- reasons: ['patch applies to index but not dirty working tree'],
21
- fresh: true
22
- };
23
- }
24
- const baseStatus = await patchBaseHashStatus(patch, cwd);
25
- if (!baseStatus.known) {
26
- return {
27
- stale: false,
28
- patchStatus: 'needs-port',
29
- reasons: ['patch does not expose comparable base hashes; coordinator review must port it', ...baseStatus.reasons],
30
- fresh: false
31
- };
32
- }
33
- if (baseStatus.known && baseStatus.mismatched === 0) {
34
- return {
35
- stale: false,
36
- patchStatus: 'needs-port',
37
- reasons: ['patch base hashes match HEAD or working tree content but textual apply failed', ...baseStatus.reasons],
38
- fresh: true
39
- };
40
- }
41
- return {
42
- stale: false,
43
- patchStatus: 'needs-port',
44
- reasons: uniqueStrings(['patch base hashes differ from HEAD and working tree content; manual port required', ...baseStatus.reasons, ...tail(result.stderr || result.stdout, 3)]),
45
- fresh: false
46
- };
47
- }
48
- async function patchBaseHashStatus(patch, cwd) {
49
- const entries = parsePatchBaseHashes(patch, cwd);
50
- if (entries.length === 0)
51
- return { known: false, mismatched: 0, reasons: ['no patch base hashes available'] };
52
- let mismatched = 0;
53
- const reasons = [];
54
- for (const entry of entries) {
55
- const head = await runProcess('git', ['rev-parse', `HEAD:${entry.path}`], { cwd, allowFailure: true });
56
- const headHash = head.stdout.trim();
57
- if (head.status === 0 && headHash.startsWith(entry.oldHash))
58
- continue;
59
- const worktree = await runProcess('git', ['hash-object', '--', entry.path], { cwd, allowFailure: true });
60
- const worktreeHash = worktree.stdout.trim();
61
- if (worktree.status === 0 && worktreeHash.startsWith(entry.oldHash)) {
62
- reasons.push(`base hash matches working tree content for ${entry.path}`);
63
- continue;
64
- }
65
- mismatched += 1;
66
- reasons.push(head.status !== 0 ? `missing HEAD blob for ${entry.path}` : `base hash mismatch for ${entry.path}`);
67
- }
68
- return { known: true, mismatched, reasons };
69
- }
70
- function parsePatchBaseHashes(patch, cwd) {
71
- const lines = patch.split(/\r?\n/);
72
- const entries = [];
73
- let currentPath;
74
- for (const line of lines) {
75
- if (line.startsWith('diff --git ')) {
76
- const parts = line.split(/\s+/);
77
- currentPath = normalizePatchBasePath(parts[2], cwd) ?? normalizePatchBasePath(parts[3], cwd);
78
- continue;
79
- }
80
- if (!currentPath || !line.startsWith('index '))
81
- continue;
82
- const match = /^index\s+([0-9a-f]+)\.\.([0-9a-f]+)/i.exec(line);
83
- if (match?.[1] && match[1] !== '0000000')
84
- entries.push({ path: currentPath, oldHash: match[1] });
85
- }
86
- return entries;
87
- }
88
- function normalizePatchBasePath(token, cwd) {
89
- if (!token || token === '/dev/null')
90
- return undefined;
91
- let value = token;
92
- if (value.startsWith('a/') || value.startsWith('b/'))
93
- value = value.slice(2);
94
- if (value === '/dev/null')
95
- return undefined;
96
- if (path.isAbsolute(value)) {
97
- const relative = path.relative(cwd, value);
98
- if (relative && !relative.startsWith('..') && !path.isAbsolute(relative))
99
- return relative.replace(/\\/g, '/');
100
- return undefined;
101
- }
102
- const rootedValue = path.join(path.parse(cwd).root, value);
103
- const rootedRelative = path.relative(cwd, rootedValue);
104
- if (rootedRelative && !rootedRelative.startsWith('..') && !path.isAbsolute(rootedRelative))
105
- return rootedRelative.replace(/\\/g, '/');
106
- return value.replace(/\\/g, '/');
107
- }
3
+ import { isObject, uniqueStrings } from './common.js';
4
+ import { ignoredWorkspaceNoiseOnlyFailure, nonActionableFailedEvidence, ownershipReasonDetails } from './collect-bundle-reasons.js';
5
+ export { bundlePatchStaleness } from './collect-bundle-staleness.js';
6
+ export { collectFailureReasonClasses, compactCollectFailureReasonClasses, ignoredWorkspaceNoiseOwnershipViolations, ignoredWorkspaceNoiseOwnershipViolationsForReasons, ignoredWorkspaceNoisePath, infrastructureNoiseFailureReasonClass, nonActionableFailedEvidence, sourceBlockerFailureReasonClass, sourceOwnershipViolations, sourceOwnershipViolationsForReasons } from './collect-bundle-reasons.js';
108
7
  export function normalizeCollectedMergeBundle(value, mergePath) {
109
8
  const input = typeof value === 'object' && value !== null ? value : {};
110
9
  const jobId = typeof input.jobId === 'string' && input.jobId ? input.jobId : path.basename(path.dirname(mergePath));
111
10
  const changedPaths = stringArray(input.changedPaths);
11
+ const ownershipViolations = stringArray(input.ownershipViolations);
112
12
  const status = typeof input.status === 'string' ? input.status : 'completed';
113
13
  const autoMergeable = Boolean(input.autoMergeable);
114
14
  const disposition = typeof input.disposition === 'string'
115
15
  ? input.disposition
116
16
  : autoMergeable ? 'auto-mergeable' : status === 'failed' ? 'rejected' : 'needs-port';
17
+ const inputReasons = stringArray(input.reasons);
18
+ const reasons = uniqueStrings([...inputReasons, ...ownershipReasonDetails(ownershipViolations, inputReasons)]);
117
19
  const bundle = {
118
20
  kind: typeof input.kind === 'string' ? input.kind : FRONTIER_SWARM_MERGE_BUNDLE_KIND,
119
21
  version: typeof input.version === 'number' ? input.version : FRONTIER_SWARM_MERGE_BUNDLE_VERSION,
@@ -136,23 +38,21 @@ export function normalizeCollectedMergeBundle(value, mergePath) {
136
38
  changedRegions: stringArray(input.changedRegions),
137
39
  ownedFilesTouched: stringArray(input.ownedFilesTouched),
138
40
  allowedWrites: stringArray(input.allowedWrites),
139
- ownershipViolations: stringArray(input.ownershipViolations),
41
+ ownershipViolations,
140
42
  ...(typeof input.patchPath === 'string' ? { patchPath: input.patchPath } : {}),
141
43
  ...(typeof input.patchHash === 'string' ? { patchHash: input.patchHash } : {}),
142
44
  evidencePaths: stringArray(input.evidencePaths),
143
45
  commandsPassed: Array.isArray(input.commandsPassed) ? input.commandsPassed : [],
144
46
  commandsFailed: Array.isArray(input.commandsFailed) ? input.commandsFailed : [],
47
+ traceShards: Array.isArray(input.traceShards) ? input.traceShards : [],
145
48
  queueItemIds: stringArray(input.queueItemIds),
146
49
  ...(typeof input.branchName === 'string' ? { branchName: input.branchName } : {}),
147
50
  ...(typeof input.commit === 'string' ? { commit: input.commit } : {}),
148
51
  staleAgainstHead: Boolean(input.staleAgainstHead),
149
- reasons: stringArray(input.reasons),
52
+ reasons,
150
53
  ...(isObject(input.semanticImport) ? { semanticImport: input.semanticImport } : {}),
151
54
  ...(isObject(input.metadata) ? { metadata: input.metadata } : {})
152
55
  };
153
- if (Array.isArray(input.traceShards)) {
154
- bundle.traceShards = input.traceShards;
155
- }
156
56
  return bundle;
157
57
  }
158
58
  export function mergeRecordScore(record) {
@@ -162,13 +62,19 @@ export function mergeRecordScore(record) {
162
62
  + record.bundle.commandsPassed.length
163
63
  + record.bundle.commandsFailed.length;
164
64
  }
165
- function stringArray(value) {
166
- return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
167
- }
168
- export function classifyCodexCollectBucket(bundle, staleAgainstHead) {
65
+ export function classifyCodexCollectBucket(bundle, staleAgainstHead, hasActionablePatch = Boolean(bundle.patchPath)) {
169
66
  if (staleAgainstHead)
170
67
  return 'stale-against-head';
68
+ if (bundle.changedPaths.length > 0 && hasActionablePatch && (bundle.disposition === 'rejected' || bundle.commandsFailed.length > 0 || bundle.status === 'failed')) {
69
+ return 'rerun-work';
70
+ }
71
+ if (bundle.ownershipViolations.length > 0 && bundle.changedPaths.length > 0 && hasActionablePatch)
72
+ return 'rerun-work';
73
+ if (nonActionableFailedEvidence(bundle, { staleAgainstHead, hasActionablePatch }))
74
+ return 'needs-human-port';
171
75
  if (bundle.disposition === 'rejected' || bundle.disposition === 'blocked' || bundle.commandsFailed.length > 0 || bundle.status === 'failed') {
76
+ if (ignoredWorkspaceNoiseOnlyFailure(bundle))
77
+ return 'needs-human-port';
172
78
  return 'failed-evidence';
173
79
  }
174
80
  if (bundle.disposition === 'auto-mergeable' && bundle.autoMergeable)
@@ -185,11 +91,18 @@ export function normalizeCollectedStaleAgainstHead(bundle, staleness, checkStale
185
91
  return false;
186
92
  return inheritedStale;
187
93
  }
188
- export function normalizeCollectedDisposition(bundle, staleAgainstHead) {
94
+ export function normalizeCollectedDisposition(bundle, staleAgainstHead, patchExists = Boolean(bundle.patchPath)) {
189
95
  if (staleAgainstHead)
190
96
  return 'stale-against-head';
97
+ if (nonActionableFailedEvidence(bundle, { staleAgainstHead, hasActionablePatch: patchExists }))
98
+ return 'needs-port';
99
+ if (ignoredWorkspaceNoiseOnlyFailure(bundle))
100
+ return 'needs-port';
191
101
  if (bundle.disposition === 'stale-against-head')
192
102
  return 'needs-port';
193
103
  return bundle.disposition;
194
104
  }
105
+ function stringArray(value) {
106
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
107
+ }
195
108
  //# sourceMappingURL=collect-bundles.js.map