@amsterdamdatalabs/enact-factory 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (644) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +566 -0
  3. package/dist/adapters/agenticLoop.d.ts +90 -0
  4. package/dist/adapters/agenticLoop.d.ts.map +1 -0
  5. package/dist/adapters/agenticLoop.js +219 -0
  6. package/dist/adapters/agenticLoop.js.map +1 -0
  7. package/dist/adapters/base.d.ts +16 -0
  8. package/dist/adapters/base.d.ts.map +1 -0
  9. package/dist/adapters/base.js +135 -0
  10. package/dist/adapters/base.js.map +1 -0
  11. package/dist/adapters/claude.d.ts +13 -0
  12. package/dist/adapters/claude.d.ts.map +1 -0
  13. package/dist/adapters/claude.js +318 -0
  14. package/dist/adapters/claude.js.map +1 -0
  15. package/dist/adapters/codex.d.ts +14 -0
  16. package/dist/adapters/codex.d.ts.map +1 -0
  17. package/dist/adapters/codex.js +366 -0
  18. package/dist/adapters/codex.js.map +1 -0
  19. package/dist/adapters/cryptoQuantAdapter.d.ts +85 -0
  20. package/dist/adapters/cryptoQuantAdapter.d.ts.map +1 -0
  21. package/dist/adapters/cryptoQuantAdapter.js +238 -0
  22. package/dist/adapters/cryptoQuantAdapter.js.map +1 -0
  23. package/dist/adapters/cursor.d.ts +13 -0
  24. package/dist/adapters/cursor.d.ts.map +1 -0
  25. package/dist/adapters/cursor.js +300 -0
  26. package/dist/adapters/cursor.js.map +1 -0
  27. package/dist/adapters/envPath.d.ts +20 -0
  28. package/dist/adapters/envPath.d.ts.map +1 -0
  29. package/dist/adapters/envPath.js +49 -0
  30. package/dist/adapters/envPath.js.map +1 -0
  31. package/dist/adapters/hermes.d.ts +13 -0
  32. package/dist/adapters/hermes.d.ts.map +1 -0
  33. package/dist/adapters/hermes.js +283 -0
  34. package/dist/adapters/hermes.js.map +1 -0
  35. package/dist/adapters/index.d.ts +18 -0
  36. package/dist/adapters/index.d.ts.map +1 -0
  37. package/dist/adapters/index.js +56 -0
  38. package/dist/adapters/index.js.map +1 -0
  39. package/dist/adapters/opencode.d.ts +13 -0
  40. package/dist/adapters/opencode.d.ts.map +1 -0
  41. package/dist/adapters/opencode.js +282 -0
  42. package/dist/adapters/opencode.js.map +1 -0
  43. package/dist/adapters/processRegistry.d.ts +38 -0
  44. package/dist/adapters/processRegistry.d.ts.map +1 -0
  45. package/dist/adapters/processRegistry.js +147 -0
  46. package/dist/adapters/processRegistry.js.map +1 -0
  47. package/dist/adapters/responses.d.ts +16 -0
  48. package/dist/adapters/responses.d.ts.map +1 -0
  49. package/dist/adapters/responses.js +244 -0
  50. package/dist/adapters/responses.js.map +1 -0
  51. package/dist/adapters/streamBuffer.d.ts +59 -0
  52. package/dist/adapters/streamBuffer.d.ts.map +1 -0
  53. package/dist/adapters/streamBuffer.js +123 -0
  54. package/dist/adapters/streamBuffer.js.map +1 -0
  55. package/dist/adapters/tools.d.ts +30 -0
  56. package/dist/adapters/tools.d.ts.map +1 -0
  57. package/dist/adapters/tools.js +219 -0
  58. package/dist/adapters/tools.js.map +1 -0
  59. package/dist/adapters/types.d.ts +82 -0
  60. package/dist/adapters/types.d.ts.map +1 -0
  61. package/dist/adapters/types.js +6 -0
  62. package/dist/adapters/types.js.map +1 -0
  63. package/dist/agents/agentBus.d.ts +160 -0
  64. package/dist/agents/agentBus.d.ts.map +1 -0
  65. package/dist/agents/agentBus.js +350 -0
  66. package/dist/agents/agentBus.js.map +1 -0
  67. package/dist/agents/agentPair.d.ts +215 -0
  68. package/dist/agents/agentPair.d.ts.map +1 -0
  69. package/dist/agents/agentPair.js +456 -0
  70. package/dist/agents/agentPair.js.map +1 -0
  71. package/dist/agents/auditor.d.ts +27 -0
  72. package/dist/agents/auditor.d.ts.map +1 -0
  73. package/dist/agents/auditor.js +238 -0
  74. package/dist/agents/auditor.js.map +1 -0
  75. package/dist/agents/cliStreamParser.d.ts +18 -0
  76. package/dist/agents/cliStreamParser.d.ts.map +1 -0
  77. package/dist/agents/cliStreamParser.js +156 -0
  78. package/dist/agents/cliStreamParser.js.map +1 -0
  79. package/dist/agents/documenter.d.ts +31 -0
  80. package/dist/agents/documenter.d.ts.map +1 -0
  81. package/dist/agents/documenter.js +286 -0
  82. package/dist/agents/documenter.js.map +1 -0
  83. package/dist/agents/draftAnalyzer.d.ts +50 -0
  84. package/dist/agents/draftAnalyzer.d.ts.map +1 -0
  85. package/dist/agents/draftAnalyzer.js +289 -0
  86. package/dist/agents/draftAnalyzer.js.map +1 -0
  87. package/dist/agents/evaluator.d.ts +61 -0
  88. package/dist/agents/evaluator.d.ts.map +1 -0
  89. package/dist/agents/evaluator.js +338 -0
  90. package/dist/agents/evaluator.js.map +1 -0
  91. package/dist/agents/executor.d.ts +33 -0
  92. package/dist/agents/executor.d.ts.map +1 -0
  93. package/dist/agents/executor.js +130 -0
  94. package/dist/agents/executor.js.map +1 -0
  95. package/dist/agents/index.d.ts +10 -0
  96. package/dist/agents/index.d.ts.map +1 -0
  97. package/dist/agents/index.js +10 -0
  98. package/dist/agents/index.js.map +1 -0
  99. package/dist/agents/pairMetrics.d.ts +63 -0
  100. package/dist/agents/pairMetrics.d.ts.map +1 -0
  101. package/dist/agents/pairMetrics.js +232 -0
  102. package/dist/agents/pairMetrics.js.map +1 -0
  103. package/dist/agents/pairPipeline.d.ts +184 -0
  104. package/dist/agents/pairPipeline.d.ts.map +1 -0
  105. package/dist/agents/pairPipeline.js +934 -0
  106. package/dist/agents/pairPipeline.js.map +1 -0
  107. package/dist/agents/pairWebhook.d.ts +59 -0
  108. package/dist/agents/pairWebhook.d.ts.map +1 -0
  109. package/dist/agents/pairWebhook.js +242 -0
  110. package/dist/agents/pairWebhook.js.map +1 -0
  111. package/dist/agents/pipelineFormat.d.ts +8 -0
  112. package/dist/agents/pipelineFormat.d.ts.map +1 -0
  113. package/dist/agents/pipelineFormat.js +65 -0
  114. package/dist/agents/pipelineFormat.js.map +1 -0
  115. package/dist/agents/pipelineGuards.d.ts +23 -0
  116. package/dist/agents/pipelineGuards.d.ts.map +1 -0
  117. package/dist/agents/pipelineGuards.js +257 -0
  118. package/dist/agents/pipelineGuards.js.map +1 -0
  119. package/dist/agents/reviewer.d.ts +37 -0
  120. package/dist/agents/reviewer.d.ts.map +1 -0
  121. package/dist/agents/reviewer.js +214 -0
  122. package/dist/agents/reviewer.js.map +1 -0
  123. package/dist/agents/skillDocumenter.d.ts +23 -0
  124. package/dist/agents/skillDocumenter.d.ts.map +1 -0
  125. package/dist/agents/skillDocumenter.js +219 -0
  126. package/dist/agents/skillDocumenter.js.map +1 -0
  127. package/dist/agents/tester.d.ts +37 -0
  128. package/dist/agents/tester.d.ts.map +1 -0
  129. package/dist/agents/tester.js +309 -0
  130. package/dist/agents/tester.js.map +1 -0
  131. package/dist/automation/autonomousRunner.d.ts +145 -0
  132. package/dist/automation/autonomousRunner.d.ts.map +1 -0
  133. package/dist/automation/autonomousRunner.js +1272 -0
  134. package/dist/automation/autonomousRunner.js.map +1 -0
  135. package/dist/automation/dailyReporter.d.ts +26 -0
  136. package/dist/automation/dailyReporter.d.ts.map +1 -0
  137. package/dist/automation/dailyReporter.js +130 -0
  138. package/dist/automation/dailyReporter.js.map +1 -0
  139. package/dist/automation/index.d.ts +5 -0
  140. package/dist/automation/index.d.ts.map +1 -0
  141. package/dist/automation/index.js +5 -0
  142. package/dist/automation/index.js.map +1 -0
  143. package/dist/automation/longRunningMonitor.d.ts +26 -0
  144. package/dist/automation/longRunningMonitor.d.ts.map +1 -0
  145. package/dist/automation/longRunningMonitor.js +356 -0
  146. package/dist/automation/longRunningMonitor.js.map +1 -0
  147. package/dist/automation/prOwnership.d.ts +18 -0
  148. package/dist/automation/prOwnership.d.ts.map +1 -0
  149. package/dist/automation/prOwnership.js +61 -0
  150. package/dist/automation/prOwnership.js.map +1 -0
  151. package/dist/automation/runnerExecution.d.ts +57 -0
  152. package/dist/automation/runnerExecution.d.ts.map +1 -0
  153. package/dist/automation/runnerExecution.js +701 -0
  154. package/dist/automation/runnerExecution.js.map +1 -0
  155. package/dist/automation/runnerState.d.ts +170 -0
  156. package/dist/automation/runnerState.d.ts.map +1 -0
  157. package/dist/automation/runnerState.js +496 -0
  158. package/dist/automation/runnerState.js.map +1 -0
  159. package/dist/automation/runnerTypes.d.ts +57 -0
  160. package/dist/automation/runnerTypes.d.ts.map +1 -0
  161. package/dist/automation/runnerTypes.js +5 -0
  162. package/dist/automation/runnerTypes.js.map +1 -0
  163. package/dist/automation/scheduler.d.ts +75 -0
  164. package/dist/automation/scheduler.d.ts.map +1 -0
  165. package/dist/automation/scheduler.js +402 -0
  166. package/dist/automation/scheduler.js.map +1 -0
  167. package/dist/azdo/azdo.d.ts +70 -0
  168. package/dist/azdo/azdo.d.ts.map +1 -0
  169. package/dist/azdo/azdo.js +328 -0
  170. package/dist/azdo/azdo.js.map +1 -0
  171. package/dist/azdo/index.d.ts +3 -0
  172. package/dist/azdo/index.d.ts.map +1 -0
  173. package/dist/azdo/index.js +3 -0
  174. package/dist/azdo/index.js.map +1 -0
  175. package/dist/azdo/projectUpdater.d.ts +13 -0
  176. package/dist/azdo/projectUpdater.d.ts.map +1 -0
  177. package/dist/azdo/projectUpdater.js +155 -0
  178. package/dist/azdo/projectUpdater.js.map +1 -0
  179. package/dist/azureDevOps/client.d.ts +75 -0
  180. package/dist/azureDevOps/client.d.ts.map +1 -0
  181. package/dist/azureDevOps/client.js +150 -0
  182. package/dist/azureDevOps/client.js.map +1 -0
  183. package/dist/azureDevOps/hierarchy.d.ts +119 -0
  184. package/dist/azureDevOps/hierarchy.d.ts.map +1 -0
  185. package/dist/azureDevOps/hierarchy.js +470 -0
  186. package/dist/azureDevOps/hierarchy.js.map +1 -0
  187. package/dist/azureDevOps/mapper.d.ts +101 -0
  188. package/dist/azureDevOps/mapper.d.ts.map +1 -0
  189. package/dist/azureDevOps/mapper.js +438 -0
  190. package/dist/azureDevOps/mapper.js.map +1 -0
  191. package/dist/azureDevOps/stateMapping.d.ts +15 -0
  192. package/dist/azureDevOps/stateMapping.d.ts.map +1 -0
  193. package/dist/azureDevOps/stateMapping.js +141 -0
  194. package/dist/azureDevOps/stateMapping.js.map +1 -0
  195. package/dist/cli/authHandler.d.ts +13 -0
  196. package/dist/cli/authHandler.d.ts.map +1 -0
  197. package/dist/cli/authHandler.js +70 -0
  198. package/dist/cli/authHandler.js.map +1 -0
  199. package/dist/cli/checkHandler.d.ts +27 -0
  200. package/dist/cli/checkHandler.d.ts.map +1 -0
  201. package/dist/cli/checkHandler.js +560 -0
  202. package/dist/cli/checkHandler.js.map +1 -0
  203. package/dist/cli/daemon.d.ts +30 -0
  204. package/dist/cli/daemon.d.ts.map +1 -0
  205. package/dist/cli/daemon.js +141 -0
  206. package/dist/cli/daemon.js.map +1 -0
  207. package/dist/cli/factoryCommands.d.ts +3 -0
  208. package/dist/cli/factoryCommands.d.ts.map +1 -0
  209. package/dist/cli/factoryCommands.js +165 -0
  210. package/dist/cli/factoryCommands.js.map +1 -0
  211. package/dist/cli/promptHandler.d.ts +13 -0
  212. package/dist/cli/promptHandler.d.ts.map +1 -0
  213. package/dist/cli/promptHandler.js +193 -0
  214. package/dist/cli/promptHandler.js.map +1 -0
  215. package/dist/cli.d.ts +3 -0
  216. package/dist/cli.d.ts.map +1 -0
  217. package/dist/cli.js +320 -0
  218. package/dist/cli.js.map +1 -0
  219. package/dist/core/agentLifecycle.d.ts +322 -0
  220. package/dist/core/agentLifecycle.d.ts.map +1 -0
  221. package/dist/core/agentLifecycle.js +230 -0
  222. package/dist/core/agentLifecycle.js.map +1 -0
  223. package/dist/core/areaMapping.d.ts +9 -0
  224. package/dist/core/areaMapping.d.ts.map +1 -0
  225. package/dist/core/areaMapping.js +37 -0
  226. package/dist/core/areaMapping.js.map +1 -0
  227. package/dist/core/config.d.ts +469 -0
  228. package/dist/core/config.d.ts.map +1 -0
  229. package/dist/core/config.js +780 -0
  230. package/dist/core/config.js.map +1 -0
  231. package/dist/core/dashboardContract.d.ts +204 -0
  232. package/dist/core/dashboardContract.d.ts.map +1 -0
  233. package/dist/core/dashboardContract.js +205 -0
  234. package/dist/core/dashboardContract.js.map +1 -0
  235. package/dist/core/devopsModel.d.ts +138 -0
  236. package/dist/core/devopsModel.d.ts.map +1 -0
  237. package/dist/core/devopsModel.js +137 -0
  238. package/dist/core/devopsModel.js.map +1 -0
  239. package/dist/core/envFile.d.ts +11 -0
  240. package/dist/core/envFile.d.ts.map +1 -0
  241. package/dist/core/envFile.js +104 -0
  242. package/dist/core/envFile.js.map +1 -0
  243. package/dist/core/eventHub.d.ts +220 -0
  244. package/dist/core/eventHub.d.ts.map +1 -0
  245. package/dist/core/eventHub.js +136 -0
  246. package/dist/core/eventHub.js.map +1 -0
  247. package/dist/core/index.d.ts +8 -0
  248. package/dist/core/index.d.ts.map +1 -0
  249. package/dist/core/index.js +7 -0
  250. package/dist/core/index.js.map +1 -0
  251. package/dist/core/laneExecutionState.d.ts +29 -0
  252. package/dist/core/laneExecutionState.d.ts.map +1 -0
  253. package/dist/core/laneExecutionState.js +18 -0
  254. package/dist/core/laneExecutionState.js.map +1 -0
  255. package/dist/core/laneStatus.d.ts +49 -0
  256. package/dist/core/laneStatus.d.ts.map +1 -0
  257. package/dist/core/laneStatus.js +153 -0
  258. package/dist/core/laneStatus.js.map +1 -0
  259. package/dist/core/prSidecar.d.ts +96 -0
  260. package/dist/core/prSidecar.d.ts.map +1 -0
  261. package/dist/core/prSidecar.js +33 -0
  262. package/dist/core/prSidecar.js.map +1 -0
  263. package/dist/core/runtimeConfig.d.ts +6 -0
  264. package/dist/core/runtimeConfig.d.ts.map +1 -0
  265. package/dist/core/runtimeConfig.js +24 -0
  266. package/dist/core/runtimeConfig.js.map +1 -0
  267. package/dist/core/scmProvider.d.ts +19 -0
  268. package/dist/core/scmProvider.d.ts.map +1 -0
  269. package/dist/core/scmProvider.js +38 -0
  270. package/dist/core/scmProvider.js.map +1 -0
  271. package/dist/core/service.d.ts +10 -0
  272. package/dist/core/service.d.ts.map +1 -0
  273. package/dist/core/service.js +297 -0
  274. package/dist/core/service.js.map +1 -0
  275. package/dist/core/traceCollector.d.ts +105 -0
  276. package/dist/core/traceCollector.d.ts.map +1 -0
  277. package/dist/core/traceCollector.js +141 -0
  278. package/dist/core/traceCollector.js.map +1 -0
  279. package/dist/core/types.d.ts +432 -0
  280. package/dist/core/types.d.ts.map +1 -0
  281. package/dist/core/types.js +2 -0
  282. package/dist/core/types.js.map +1 -0
  283. package/dist/core/workItemMapper.d.ts +39 -0
  284. package/dist/core/workItemMapper.d.ts.map +1 -0
  285. package/dist/core/workItemMapper.js +427 -0
  286. package/dist/core/workItemMapper.js.map +1 -0
  287. package/dist/core/workItemModel.d.ts +120 -0
  288. package/dist/core/workItemModel.d.ts.map +1 -0
  289. package/dist/core/workItemModel.js +104 -0
  290. package/dist/core/workItemModel.js.map +1 -0
  291. package/dist/core/workItemPayload.d.ts +195 -0
  292. package/dist/core/workItemPayload.d.ts.map +1 -0
  293. package/dist/core/workItemPayload.js +24 -0
  294. package/dist/core/workItemPayload.js.map +1 -0
  295. package/dist/core/workspaceConfig.d.ts +57 -0
  296. package/dist/core/workspaceConfig.d.ts.map +1 -0
  297. package/dist/core/workspaceConfig.js +184 -0
  298. package/dist/core/workspaceConfig.js.map +1 -0
  299. package/dist/doctor.d.ts +18 -0
  300. package/dist/doctor.d.ts.map +1 -0
  301. package/dist/doctor.js +34 -0
  302. package/dist/doctor.js.map +1 -0
  303. package/dist/factory/activeSkill.d.ts +11 -0
  304. package/dist/factory/activeSkill.d.ts.map +1 -0
  305. package/dist/factory/activeSkill.js +44 -0
  306. package/dist/factory/activeSkill.js.map +1 -0
  307. package/dist/factory/assignment.d.ts +54 -0
  308. package/dist/factory/assignment.d.ts.map +1 -0
  309. package/dist/factory/assignment.js +94 -0
  310. package/dist/factory/assignment.js.map +1 -0
  311. package/dist/factory/auditLog.d.ts +10 -0
  312. package/dist/factory/auditLog.d.ts.map +1 -0
  313. package/dist/factory/auditLog.js +38 -0
  314. package/dist/factory/auditLog.js.map +1 -0
  315. package/dist/factory/closureRequirements.d.ts +12 -0
  316. package/dist/factory/closureRequirements.d.ts.map +1 -0
  317. package/dist/factory/closureRequirements.js +30 -0
  318. package/dist/factory/closureRequirements.js.map +1 -0
  319. package/dist/factory/delegationPrompt.d.ts +3 -0
  320. package/dist/factory/delegationPrompt.d.ts.map +1 -0
  321. package/dist/factory/delegationPrompt.js +16 -0
  322. package/dist/factory/delegationPrompt.js.map +1 -0
  323. package/dist/factory/http.d.ts +3 -0
  324. package/dist/factory/http.d.ts.map +1 -0
  325. package/dist/factory/http.js +555 -0
  326. package/dist/factory/http.js.map +1 -0
  327. package/dist/factory/lifecyclePushMap.d.ts +4 -0
  328. package/dist/factory/lifecyclePushMap.d.ts.map +1 -0
  329. package/dist/factory/lifecyclePushMap.js +7 -0
  330. package/dist/factory/lifecyclePushMap.js.map +1 -0
  331. package/dist/factory/missions.d.ts +125 -0
  332. package/dist/factory/missions.d.ts.map +1 -0
  333. package/dist/factory/missions.js +304 -0
  334. package/dist/factory/missions.js.map +1 -0
  335. package/dist/factory/mode.d.ts +9 -0
  336. package/dist/factory/mode.d.ts.map +1 -0
  337. package/dist/factory/mode.js +30 -0
  338. package/dist/factory/mode.js.map +1 -0
  339. package/dist/factory/operatorActiveSkill.d.ts +15 -0
  340. package/dist/factory/operatorActiveSkill.d.ts.map +1 -0
  341. package/dist/factory/operatorActiveSkill.js +95 -0
  342. package/dist/factory/operatorActiveSkill.js.map +1 -0
  343. package/dist/factory/paseoDispatcher.d.ts +52 -0
  344. package/dist/factory/paseoDispatcher.d.ts.map +1 -0
  345. package/dist/factory/paseoDispatcher.js +122 -0
  346. package/dist/factory/paseoDispatcher.js.map +1 -0
  347. package/dist/factory/paseoLifecycle.d.ts +32 -0
  348. package/dist/factory/paseoLifecycle.d.ts.map +1 -0
  349. package/dist/factory/paseoLifecycle.js +260 -0
  350. package/dist/factory/paseoLifecycle.js.map +1 -0
  351. package/dist/factory/paths.d.ts +31 -0
  352. package/dist/factory/paths.d.ts.map +1 -0
  353. package/dist/factory/paths.js +139 -0
  354. package/dist/factory/paths.js.map +1 -0
  355. package/dist/factory/progressWatchdog.d.ts +58 -0
  356. package/dist/factory/progressWatchdog.d.ts.map +1 -0
  357. package/dist/factory/progressWatchdog.js +160 -0
  358. package/dist/factory/progressWatchdog.js.map +1 -0
  359. package/dist/factory/roster.d.ts +59 -0
  360. package/dist/factory/roster.d.ts.map +1 -0
  361. package/dist/factory/roster.js +116 -0
  362. package/dist/factory/roster.js.map +1 -0
  363. package/dist/factory/runtime.d.ts +44 -0
  364. package/dist/factory/runtime.d.ts.map +1 -0
  365. package/dist/factory/runtime.js +238 -0
  366. package/dist/factory/runtime.js.map +1 -0
  367. package/dist/factory/sync.d.ts +29 -0
  368. package/dist/factory/sync.d.ts.map +1 -0
  369. package/dist/factory/sync.js +77 -0
  370. package/dist/factory/sync.js.map +1 -0
  371. package/dist/factory/workitemQueues.d.ts +37 -0
  372. package/dist/factory/workitemQueues.d.ts.map +1 -0
  373. package/dist/factory/workitemQueues.js +99 -0
  374. package/dist/factory/workitemQueues.js.map +1 -0
  375. package/dist/factory/workitemTriage.d.ts +9 -0
  376. package/dist/factory/workitemTriage.d.ts.map +1 -0
  377. package/dist/factory/workitemTriage.js +81 -0
  378. package/dist/factory/workitemTriage.js.map +1 -0
  379. package/dist/hooks.d.ts +18 -0
  380. package/dist/hooks.d.ts.map +1 -0
  381. package/dist/hooks.js +96 -0
  382. package/dist/hooks.js.map +1 -0
  383. package/dist/index.d.ts +3 -0
  384. package/dist/index.d.ts.map +1 -0
  385. package/dist/index.js +90 -0
  386. package/dist/index.js.map +1 -0
  387. package/dist/install/agentCatalog.d.ts +7 -0
  388. package/dist/install/agentCatalog.d.ts.map +1 -0
  389. package/dist/install/agentCatalog.js +28 -0
  390. package/dist/install/agentCatalog.js.map +1 -0
  391. package/dist/install/bundlePaths.d.ts +10 -0
  392. package/dist/install/bundlePaths.d.ts.map +1 -0
  393. package/dist/install/bundlePaths.js +30 -0
  394. package/dist/install/bundlePaths.js.map +1 -0
  395. package/dist/install/codex.d.ts +43 -0
  396. package/dist/install/codex.d.ts.map +1 -0
  397. package/dist/install/codex.js +207 -0
  398. package/dist/install/codex.js.map +1 -0
  399. package/dist/install/enactHome.d.ts +37 -0
  400. package/dist/install/enactHome.d.ts.map +1 -0
  401. package/dist/install/enactHome.js +152 -0
  402. package/dist/install/enactHome.js.map +1 -0
  403. package/dist/install/plugins.d.ts +115 -0
  404. package/dist/install/plugins.d.ts.map +1 -0
  405. package/dist/install/plugins.js +259 -0
  406. package/dist/install/plugins.js.map +1 -0
  407. package/dist/install/setup.d.ts +33 -0
  408. package/dist/install/setup.d.ts.map +1 -0
  409. package/dist/install/setup.js +167 -0
  410. package/dist/install/setup.js.map +1 -0
  411. package/dist/locale/en.d.ts +3 -0
  412. package/dist/locale/en.d.ts.map +1 -0
  413. package/dist/locale/en.js +435 -0
  414. package/dist/locale/en.js.map +1 -0
  415. package/dist/locale/index.d.ts +28 -0
  416. package/dist/locale/index.d.ts.map +1 -0
  417. package/dist/locale/index.js +84 -0
  418. package/dist/locale/index.js.map +1 -0
  419. package/dist/locale/prompts/en.d.ts +3 -0
  420. package/dist/locale/prompts/en.d.ts.map +1 -0
  421. package/dist/locale/prompts/en.js +254 -0
  422. package/dist/locale/prompts/en.js.map +1 -0
  423. package/dist/locale/types.d.ts +433 -0
  424. package/dist/locale/types.d.ts.map +1 -0
  425. package/dist/locale/types.js +5 -0
  426. package/dist/locale/types.js.map +1 -0
  427. package/dist/mcp/server.d.ts +489 -0
  428. package/dist/mcp/server.d.ts.map +1 -0
  429. package/dist/mcp/server.js +597 -0
  430. package/dist/mcp/server.js.map +1 -0
  431. package/dist/orchestration/decisionEngine.d.ts +175 -0
  432. package/dist/orchestration/decisionEngine.d.ts.map +1 -0
  433. package/dist/orchestration/decisionEngine.js +471 -0
  434. package/dist/orchestration/decisionEngine.js.map +1 -0
  435. package/dist/orchestration/index.d.ts +5 -0
  436. package/dist/orchestration/index.d.ts.map +1 -0
  437. package/dist/orchestration/index.js +5 -0
  438. package/dist/orchestration/index.js.map +1 -0
  439. package/dist/orchestration/workItemParser.d.ts +67 -0
  440. package/dist/orchestration/workItemParser.d.ts.map +1 -0
  441. package/dist/orchestration/workItemParser.js +560 -0
  442. package/dist/orchestration/workItemParser.js.map +1 -0
  443. package/dist/orchestration/workItemScheduler.d.ts +141 -0
  444. package/dist/orchestration/workItemScheduler.d.ts.map +1 -0
  445. package/dist/orchestration/workItemScheduler.js +317 -0
  446. package/dist/orchestration/workItemScheduler.js.map +1 -0
  447. package/dist/orchestration/workflow.d.ts +145 -0
  448. package/dist/orchestration/workflow.d.ts.map +1 -0
  449. package/dist/orchestration/workflow.js +301 -0
  450. package/dist/orchestration/workflow.js.map +1 -0
  451. package/dist/providers/codexSessions.d.ts +93 -0
  452. package/dist/providers/codexSessions.d.ts.map +1 -0
  453. package/dist/providers/codexSessions.js +366 -0
  454. package/dist/providers/codexSessions.js.map +1 -0
  455. package/dist/registry/bsDetector.d.ts +24 -0
  456. package/dist/registry/bsDetector.d.ts.map +1 -0
  457. package/dist/registry/bsDetector.js +276 -0
  458. package/dist/registry/bsDetector.js.map +1 -0
  459. package/dist/registry/entityScanner.d.ts +36 -0
  460. package/dist/registry/entityScanner.d.ts.map +1 -0
  461. package/dist/registry/entityScanner.js +693 -0
  462. package/dist/registry/entityScanner.js.map +1 -0
  463. package/dist/registry/index.d.ts +9 -0
  464. package/dist/registry/index.d.ts.map +1 -0
  465. package/dist/registry/index.js +13 -0
  466. package/dist/registry/index.js.map +1 -0
  467. package/dist/registry/schema.d.ts +307 -0
  468. package/dist/registry/schema.d.ts.map +1 -0
  469. package/dist/registry/schema.js +139 -0
  470. package/dist/registry/schema.js.map +1 -0
  471. package/dist/registry/sqliteStore.d.ts +101 -0
  472. package/dist/registry/sqliteStore.d.ts.map +1 -0
  473. package/dist/registry/sqliteStore.js +688 -0
  474. package/dist/registry/sqliteStore.js.map +1 -0
  475. package/dist/registry/workItemBridge.d.ts +8 -0
  476. package/dist/registry/workItemBridge.d.ts.map +1 -0
  477. package/dist/registry/workItemBridge.js +30 -0
  478. package/dist/registry/workItemBridge.js.map +1 -0
  479. package/dist/runners/cliRunner.d.ts +11 -0
  480. package/dist/runners/cliRunner.d.ts.map +1 -0
  481. package/dist/runners/cliRunner.js +193 -0
  482. package/dist/runners/cliRunner.js.map +1 -0
  483. package/dist/support/apiCache.d.ts +85 -0
  484. package/dist/support/apiCache.d.ts.map +1 -0
  485. package/dist/support/apiCache.js +163 -0
  486. package/dist/support/apiCache.js.map +1 -0
  487. package/dist/support/chat.d.ts +3 -0
  488. package/dist/support/chat.d.ts.map +1 -0
  489. package/dist/support/chat.js +305 -0
  490. package/dist/support/chat.js.map +1 -0
  491. package/dist/support/chatBackend.d.ts +25 -0
  492. package/dist/support/chatBackend.d.ts.map +1 -0
  493. package/dist/support/chatBackend.js +289 -0
  494. package/dist/support/chatBackend.js.map +1 -0
  495. package/dist/support/chatTui.d.ts +3 -0
  496. package/dist/support/chatTui.d.ts.map +1 -0
  497. package/dist/support/chatTui.js +1082 -0
  498. package/dist/support/chatTui.js.map +1 -0
  499. package/dist/support/costTracker.d.ts +29 -0
  500. package/dist/support/costTracker.d.ts.map +1 -0
  501. package/dist/support/costTracker.js +113 -0
  502. package/dist/support/costTracker.js.map +1 -0
  503. package/dist/support/dashboardHtml.d.ts +5 -0
  504. package/dist/support/dashboardHtml.d.ts.map +1 -0
  505. package/dist/support/dashboardHtml.js +2629 -0
  506. package/dist/support/dashboardHtml.js.map +1 -0
  507. package/dist/support/dev.d.ts +55 -0
  508. package/dist/support/dev.d.ts.map +1 -0
  509. package/dist/support/dev.js +298 -0
  510. package/dist/support/dev.js.map +1 -0
  511. package/dist/support/editParser.d.ts +37 -0
  512. package/dist/support/editParser.d.ts.map +1 -0
  513. package/dist/support/editParser.js +365 -0
  514. package/dist/support/editParser.js.map +1 -0
  515. package/dist/support/ghosttyThemeCatalog.generated.d.ts +2 -0
  516. package/dist/support/ghosttyThemeCatalog.generated.d.ts.map +1 -0
  517. package/dist/support/ghosttyThemeCatalog.generated.js +11116 -0
  518. package/dist/support/ghosttyThemeCatalog.generated.js.map +1 -0
  519. package/dist/support/gitStatus.d.ts +21 -0
  520. package/dist/support/gitStatus.d.ts.map +1 -0
  521. package/dist/support/gitStatus.js +108 -0
  522. package/dist/support/gitStatus.js.map +1 -0
  523. package/dist/support/gitTracker.d.ts +30 -0
  524. package/dist/support/gitTracker.d.ts.map +1 -0
  525. package/dist/support/gitTracker.js +143 -0
  526. package/dist/support/gitTracker.js.map +1 -0
  527. package/dist/support/index.d.ts +12 -0
  528. package/dist/support/index.d.ts.map +1 -0
  529. package/dist/support/index.js +12 -0
  530. package/dist/support/index.js.map +1 -0
  531. package/dist/support/planner.d.ts +64 -0
  532. package/dist/support/planner.d.ts.map +1 -0
  533. package/dist/support/planner.js +396 -0
  534. package/dist/support/planner.js.map +1 -0
  535. package/dist/support/projectMapper.d.ts +46 -0
  536. package/dist/support/projectMapper.d.ts.map +1 -0
  537. package/dist/support/projectMapper.js +273 -0
  538. package/dist/support/projectMapper.js.map +1 -0
  539. package/dist/support/pty-helper.py +117 -0
  540. package/dist/support/quotaTracker.d.ts +29 -0
  541. package/dist/support/quotaTracker.d.ts.map +1 -0
  542. package/dist/support/quotaTracker.js +89 -0
  543. package/dist/support/quotaTracker.js.map +1 -0
  544. package/dist/support/rateLimiter.d.ts +101 -0
  545. package/dist/support/rateLimiter.d.ts.map +1 -0
  546. package/dist/support/rateLimiter.js +219 -0
  547. package/dist/support/rateLimiter.js.map +1 -0
  548. package/dist/support/rollback.d.ts +61 -0
  549. package/dist/support/rollback.d.ts.map +1 -0
  550. package/dist/support/rollback.js +329 -0
  551. package/dist/support/rollback.js.map +1 -0
  552. package/dist/support/sharedShell.d.ts +17 -0
  553. package/dist/support/sharedShell.d.ts.map +1 -0
  554. package/dist/support/sharedShell.js +439 -0
  555. package/dist/support/sharedShell.js.map +1 -0
  556. package/dist/support/stuckDetector.d.ts +68 -0
  557. package/dist/support/stuckDetector.d.ts.map +1 -0
  558. package/dist/support/stuckDetector.js +174 -0
  559. package/dist/support/stuckDetector.js.map +1 -0
  560. package/dist/support/terminalBridge.d.ts +18 -0
  561. package/dist/support/terminalBridge.d.ts.map +1 -0
  562. package/dist/support/terminalBridge.js +553 -0
  563. package/dist/support/terminalBridge.js.map +1 -0
  564. package/dist/support/timeWindow.d.ts +60 -0
  565. package/dist/support/timeWindow.d.ts.map +1 -0
  566. package/dist/support/timeWindow.js +236 -0
  567. package/dist/support/timeWindow.js.map +1 -0
  568. package/dist/support/uiThemes.d.ts +44 -0
  569. package/dist/support/uiThemes.d.ts.map +1 -0
  570. package/dist/support/uiThemes.js +290 -0
  571. package/dist/support/uiThemes.js.map +1 -0
  572. package/dist/support/web.d.ts +29 -0
  573. package/dist/support/web.d.ts.map +1 -0
  574. package/dist/support/web.js +1097 -0
  575. package/dist/support/web.js.map +1 -0
  576. package/dist/support/worktreeManager.d.ts +20 -0
  577. package/dist/support/worktreeManager.d.ts.map +1 -0
  578. package/dist/support/worktreeManager.js +140 -0
  579. package/dist/support/worktreeManager.js.map +1 -0
  580. package/dist/task_state_model.py +55 -0
  581. package/dist/workItemState/store.d.ts +122 -0
  582. package/dist/workItemState/store.d.ts.map +1 -0
  583. package/dist/workItemState/store.js +438 -0
  584. package/dist/workItemState/store.js.map +1 -0
  585. package/dist/workItems/azdoBridge.d.ts +42 -0
  586. package/dist/workItems/azdoBridge.d.ts.map +1 -0
  587. package/dist/workItems/azdoBridge.js +143 -0
  588. package/dist/workItems/azdoBridge.js.map +1 -0
  589. package/dist/workItems/azdoSyncRuntime.d.ts +28 -0
  590. package/dist/workItems/azdoSyncRuntime.d.ts.map +1 -0
  591. package/dist/workItems/azdoSyncRuntime.js +158 -0
  592. package/dist/workItems/azdoSyncRuntime.js.map +1 -0
  593. package/dist/workItems/azureDevOpsSync.d.ts +128 -0
  594. package/dist/workItems/azureDevOpsSync.d.ts.map +1 -0
  595. package/dist/workItems/azureDevOpsSync.js +748 -0
  596. package/dist/workItems/azureDevOpsSync.js.map +1 -0
  597. package/dist/workItems/helpers.d.ts +11 -0
  598. package/dist/workItems/helpers.d.ts.map +1 -0
  599. package/dist/workItems/helpers.js +17 -0
  600. package/dist/workItems/helpers.js.map +1 -0
  601. package/dist/workItems/index.d.ts +21 -0
  602. package/dist/workItems/index.d.ts.map +1 -0
  603. package/dist/workItems/index.js +89 -0
  604. package/dist/workItems/index.js.map +1 -0
  605. package/dist/workItems/localWorkItemFetcher.d.ts +55 -0
  606. package/dist/workItems/localWorkItemFetcher.d.ts.map +1 -0
  607. package/dist/workItems/localWorkItemFetcher.js +209 -0
  608. package/dist/workItems/localWorkItemFetcher.js.map +1 -0
  609. package/dist/workItems/migrations/001_rename_workItem_to_work_item.sql +10 -0
  610. package/dist/workItems/postgresStore.d.ts +78 -0
  611. package/dist/workItems/postgresStore.d.ts.map +1 -0
  612. package/dist/workItems/postgresStore.js +937 -0
  613. package/dist/workItems/postgresStore.js.map +1 -0
  614. package/dist/workItems/schema.d.ts +257 -0
  615. package/dist/workItems/schema.d.ts.map +1 -0
  616. package/dist/workItems/schema.js +176 -0
  617. package/dist/workItems/schema.js.map +1 -0
  618. package/dist/workItems/sqliteStore.d.ts +124 -0
  619. package/dist/workItems/sqliteStore.d.ts.map +1 -0
  620. package/dist/workItems/sqliteStore.js +713 -0
  621. package/dist/workItems/sqliteStore.js.map +1 -0
  622. package/dist/workItems/workItemBoardHtml.d.ts +5 -0
  623. package/dist/workItems/workItemBoardHtml.d.ts.map +1 -0
  624. package/dist/workItems/workItemBoardHtml.js +2192 -0
  625. package/dist/workItems/workItemBoardHtml.js.map +1 -0
  626. package/package.json +99 -0
  627. package/templates/AGENTS.md +432 -0
  628. package/templates/BOOT.md +25 -0
  629. package/templates/BOOTSTRAP.md +50 -0
  630. package/templates/CHANGELOG_AUDIT.md +74 -0
  631. package/templates/HEARTBEAT.md +86 -0
  632. package/templates/IDENTITY.md +27 -0
  633. package/templates/PR_LAND.md +75 -0
  634. package/templates/PR_REVIEW.md +97 -0
  635. package/templates/SOUL.dev.md +52 -0
  636. package/templates/SOUL.md +81 -0
  637. package/templates/TOOLS.md +52 -0
  638. package/templates/USER.md +22 -0
  639. package/templates/WORKITEM_ANALYSIS.md +31 -0
  640. package/templates/agents/executor.md +26 -0
  641. package/templates/agents/plan.md +22 -0
  642. package/templates/agents/ralph.md +37 -0
  643. package/templates/agents/review.md +22 -0
  644. package/templates/agents/team.md +39 -0
@@ -0,0 +1,701 @@
1
+ // ============================================
2
+ // Enact Factory - Runner Execution Helpers
3
+ // Execution/reporting/integration logic extracted from AutonomousRunner
4
+ // ============================================
5
+ import { existsSync } from 'node:fs';
6
+ import { homedir } from 'node:os';
7
+ import { createPipelineFromConfig, buildWorkItemPrefix } from '../agents/pairPipeline.js';
8
+ import { formatParsedWorkItemSummary, loadParsedWorkItem } from '../orchestration/workItemParser.js';
9
+ import * as executorAgent from '../agents/executor.js';
10
+ import * as reviewerAgent from '../agents/reviewer.js';
11
+ import * as projectMapper from '../support/projectMapper.js';
12
+ import * as azdo from '../azdo/index.js';
13
+ import * as planner from '../support/planner.js';
14
+ import { runDraftAnalysis } from '../agents/draftAnalyzer.js';
15
+ import { t } from '../locale/index.js';
16
+ import { broadcastEvent } from '../core/eventHub.js';
17
+ import { branchNameFor, shouldTeardown } from '../core/devopsModel.js';
18
+ import { createWorktree, commitAndCreatePR, removeWorktree, } from '../support/worktreeManager.js';
19
+ import { getWorkItemStore } from '../workItems/index.js';
20
+ import { getDecompositionDepth, getChildrenCount, getDailyCreationCount, canCreateMoreWorkItems, registerDecomposition, } from '../automation/runnerState.js';
21
+ import { buildWorkItemStateSyncComment, completeParentIfChildrenDone, markWorkItemBlocked, markWorkItemDecomposed, markWorkItemDone, markWorkItemInProgress, releaseDependentWorkItems, upsertWorkItemState, } from '../workItemState/store.js';
22
+ let notificationSend = null;
23
+ /** @deprecated Discord removed — registers an optional notification sink */
24
+ export function setDiscordReporter(sendFn) {
25
+ notificationSend = sendFn;
26
+ console.log('[AutonomousRunner] Notification reporter registered');
27
+ }
28
+ export async function reportToDiscord(message) {
29
+ if (notificationSend) {
30
+ try {
31
+ await notificationSend(message);
32
+ return;
33
+ }
34
+ catch (error) {
35
+ console.error('[AutonomousRunner] Notification report failed:', error);
36
+ }
37
+ }
38
+ console.log('[AutonomousRunner]', message);
39
+ }
40
+ let workItemFetch = null;
41
+ let workItemSource = null;
42
+ export function setAzdoFetcher(fetchFn) {
43
+ workItemFetch = fetchFn;
44
+ workItemSource = 'azdo';
45
+ console.log('[AutonomousRunner] Azdo fetcher registered');
46
+ }
47
+ export function setLocalFetcher(fetchFn) {
48
+ workItemFetch = fetchFn;
49
+ workItemSource = 'local';
50
+ console.log('[AutonomousRunner] Local fetcher registered');
51
+ }
52
+ // Track consecutive fetch failures for visibility
53
+ let fetchFailureCount = 0;
54
+ export async function fetchAzdoWorkItems() {
55
+ if (!workItemFetch) {
56
+ console.log('[AutonomousRunner] No workItem fetcher registered');
57
+ return { workItems: [], error: 'No workItem fetcher registered' };
58
+ }
59
+ try {
60
+ const workItems = await workItemFetch();
61
+ if (fetchFailureCount > 0) {
62
+ console.log(`[AutonomousRunner] WorkItem fetch recovered after ${fetchFailureCount} failures`);
63
+ }
64
+ fetchFailureCount = 0;
65
+ return { workItems };
66
+ }
67
+ catch (error) {
68
+ fetchFailureCount++;
69
+ const msg = error instanceof Error ? error.message : String(error);
70
+ console.error(`[AutonomousRunner] WorkItem fetch failed (${fetchFailureCount}x consecutive): ${msg}`);
71
+ return { workItems: [], error: msg };
72
+ }
73
+ }
74
+ /**
75
+ * Get current workItem source type
76
+ */
77
+ export function getWorkItemSource() {
78
+ return workItemSource;
79
+ }
80
+ // Project Path Resolution
81
+ export async function resolveProjectPath(ctx, workItem) {
82
+ // For local workItems, projectPath is already resolved
83
+ if (workItem.source === 'local' && workItem.projectPath) {
84
+ // Verify the path exists
85
+ if (!existsSync(workItem.projectPath)) {
86
+ console.error(`[AutonomousRunner] Local workItem "${workItem.title}" project path does not exist: ${workItem.projectPath}`);
87
+ return null;
88
+ }
89
+ return workItem.projectPath;
90
+ }
91
+ // For Azdo workItems, resolve via project mapping
92
+ const projectName = workItem.azdoProject?.name;
93
+ const projectId = workItem.azdoProject?.id;
94
+ if (!projectId || !projectName) {
95
+ console.error(`[AutonomousRunner] WorkItem "${workItem.title}" has no project info - SKIP`);
96
+ return null;
97
+ }
98
+ // 1순위: allowedProjects에서 정확한 basename 매칭 (fuzzy보다 신뢰도 높음)
99
+ for (const allowed of ctx.allowedProjects) {
100
+ const expanded = allowed.replace(/^~(?=\/|$)/, homedir());
101
+ const dirName = expanded.split('/').pop();
102
+ if (dirName === projectName || dirName?.toLowerCase() === projectName.toLowerCase()) {
103
+ if (await isValidProjectPath(expanded)) {
104
+ console.log(`[AutonomousRunner] AllowedProjects match: ${projectName} → ${expanded}`);
105
+ return expanded;
106
+ }
107
+ }
108
+ }
109
+ // 2순위: ~/dev/{name} 직접 경로
110
+ const directPath = `${homedir()}/dev/${projectName}`;
111
+ if (await isValidProjectPath(directPath)) {
112
+ console.log(`[AutonomousRunner] Direct path found: ${projectName} → ${directPath}`);
113
+ return directPath;
114
+ }
115
+ const lowerPath = `${homedir()}/dev/${projectName.toLowerCase()}`;
116
+ if (await isValidProjectPath(lowerPath)) {
117
+ console.log(`[AutonomousRunner] Lowercase path found: ${projectName} → ${lowerPath}`);
118
+ return lowerPath;
119
+ }
120
+ // 3순위: ~/dev/tools/ 서브디렉토리
121
+ const toolsPath = `${homedir()}/dev/tools/${projectName}`;
122
+ if (await isValidProjectPath(toolsPath)) {
123
+ console.log(`[AutonomousRunner] Tools path found: ${projectName} → ${toolsPath}`);
124
+ return toolsPath;
125
+ }
126
+ // 4순위: fuzzy match (스캔 기반, 오탐 가능성 있음)
127
+ const mappedPath = await projectMapper.mapAzdoProject(projectId, projectName, ctx.allowedProjects);
128
+ if (mappedPath) {
129
+ console.log(`[AutonomousRunner] Fuzzy mapped: ${projectName} → ${mappedPath}`);
130
+ return mappedPath;
131
+ }
132
+ console.error(`[AutonomousRunner] Failed to resolve project path for "${projectName}" - SKIP`);
133
+ console.error(`[AutonomousRunner] Tried: allowedProjects, ${directPath}, ${lowerPath}, ${toolsPath}, fuzzy mapper`);
134
+ return null;
135
+ }
136
+ export async function isValidProjectPath(path) {
137
+ try {
138
+ const fs = await import('fs/promises');
139
+ const stats = await fs.stat(path);
140
+ if (!stats.isDirectory())
141
+ return false;
142
+ const checks = ['.git', 'package.json', 'pyproject.toml'];
143
+ for (const check of checks) {
144
+ try {
145
+ await fs.stat(`${path}/${check}`);
146
+ return true;
147
+ }
148
+ catch {
149
+ // continue
150
+ }
151
+ }
152
+ return false;
153
+ }
154
+ catch {
155
+ return false;
156
+ }
157
+ }
158
+ // WorkItem Decomposition
159
+ export async function decomposeWorkItem(ctx, workItem, projectPath, targetMinutes, draftAnalysis) {
160
+ console.log(`[AutonomousRunner] Decomposing workItem: ${workItem.title}`);
161
+ const workItemId = workItem.workItemId || workItem.id;
162
+ const maxDepth = ctx.decompositionMaxDepth ?? 2;
163
+ const maxChildren = ctx.decompositionMaxChildren ?? 5;
164
+ const dailyLimit = ctx.decompositionDailyLimit ?? 20;
165
+ const autoBacklog = ctx.decompositionAutoBacklog ?? true;
166
+ // ============================================
167
+ // Pre-checks: Depth, Children, Daily Limit
168
+ // ============================================
169
+ // Check decomposition depth limit
170
+ if (workItem.workItemId) {
171
+ const currentDepth = getDecompositionDepth(workItem.workItemId);
172
+ if (currentDepth >= maxDepth) {
173
+ console.log(`[AutonomousRunner] Decomposition depth limit reached: ${currentDepth}/${maxDepth}`);
174
+ if (autoBacklog && workItem.workItemId) {
175
+ try {
176
+ await azdo.updateWorkItemState(workItem.workItemId, 'Backlog');
177
+ await azdo.addComment(workItem.workItemId, `⚠️ **Auto-moved to Backlog**\n\n` +
178
+ `Reason: Decomposition depth limit reached (${currentDepth}/${maxDepth})\n\n` +
179
+ `This workItem has been nested too deeply. Please review and simplify the workItem structure, ` +
180
+ `or handle it manually.`);
181
+ console.log(`[AutonomousRunner] WorkItem moved to backlog (depth limit)`);
182
+ }
183
+ catch (err) {
184
+ console.error(`[AutonomousRunner] Failed to move to backlog:`, err);
185
+ }
186
+ }
187
+ return false;
188
+ }
189
+ // Check children count limit
190
+ const childrenCount = getChildrenCount(workItem.workItemId);
191
+ if (childrenCount >= maxChildren) {
192
+ console.log(`[AutonomousRunner] Children count limit reached: ${childrenCount}/${maxChildren}`);
193
+ if (autoBacklog) {
194
+ try {
195
+ await azdo.updateWorkItemState(workItem.workItemId, 'Backlog');
196
+ await azdo.addComment(workItem.workItemId, `⚠️ **Auto-moved to Backlog**\n\n` +
197
+ `Reason: Too many sub-workItems already created (${childrenCount}/${maxChildren})\n\n` +
198
+ `This workItem has generated too many sub-workItems. Please review the decomposition strategy, ` +
199
+ `or handle it manually.`);
200
+ console.log(`[AutonomousRunner] WorkItem moved to backlog (children limit)`);
201
+ }
202
+ catch (err) {
203
+ console.error(`[AutonomousRunner] Failed to move to backlog:`, err);
204
+ }
205
+ }
206
+ return false;
207
+ }
208
+ }
209
+ // Check daily creation limit
210
+ // NOTE: Don't move to Backlog on daily limit — it resets tomorrow.
211
+ // Moving to Backlog would permanently exclude the workItem from future heartbeats.
212
+ // Instead, skip decomposition and fall through to direct execution.
213
+ if (!canCreateMoreWorkItems(dailyLimit)) {
214
+ const currentCount = getDailyCreationCount();
215
+ console.log(`[AutonomousRunner] Daily workItem creation limit reached: ${currentCount}/${dailyLimit} — skipping decomposition (will retry tomorrow)`);
216
+ return false;
217
+ }
218
+ broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'decompose', status: 'start' } });
219
+ await ctx.reportToDiscord(t('runner.decomposition.starting', {
220
+ title: workItem.title,
221
+ estimated: String(planner.estimateWorkItemDuration(workItem)),
222
+ threshold: String(targetMinutes),
223
+ }));
224
+ // Periodic progress log while planner runs (fallback if stdout isn't streaming)
225
+ let elapsed = 0;
226
+ const progressTimer = setInterval(() => {
227
+ elapsed += 30;
228
+ broadcastEvent({ type: 'log', data: { workItemId, stage: 'decompose', line: `⏱ Planner running... ${elapsed}s` } });
229
+ }, 30000);
230
+ let result;
231
+ try {
232
+ result = await planner.runPlanner({
233
+ workItemTitle: workItem.title,
234
+ workItemDescription: workItem.description || '',
235
+ projectPath,
236
+ projectName: workItem.azdoProject?.name,
237
+ targetMinutes,
238
+ model: ctx.plannerModel ?? 'claude-sonnet-4-5-20250929',
239
+ timeoutMs: ctx.plannerTimeoutMs ?? 600000,
240
+ onLog: (line) => broadcastEvent({ type: 'log', data: { workItemId, stage: 'decompose', line } }),
241
+ draftAnalysis: draftAnalysis ? {
242
+ workItemType: draftAnalysis.workItemType,
243
+ intentSummary: draftAnalysis.intentSummary,
244
+ relevantFiles: draftAnalysis.relevantFiles,
245
+ suggestedApproach: draftAnalysis.suggestedApproach,
246
+ projectStats: draftAnalysis.projectStats,
247
+ } : undefined,
248
+ });
249
+ }
250
+ finally {
251
+ clearInterval(progressTimer);
252
+ }
253
+ await ctx.reportToDiscord(planner.formatPlannerResult(result));
254
+ if (!result.success) {
255
+ console.error(`[AutonomousRunner] Planner failed: ${result.error}`);
256
+ broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'decompose', status: 'fail' } });
257
+ return false;
258
+ }
259
+ if (!result.needsDecomposition || result.subWorkItems.length === 0) {
260
+ console.log('[AutonomousRunner] Planner determined no decomposition needed');
261
+ return 'no-decomp';
262
+ }
263
+ if (!workItem.workItemId) {
264
+ console.error('[AutonomousRunner] Cannot create sub-workItems: no parent workItemId');
265
+ return false;
266
+ }
267
+ const createdSubWorkItems = [];
268
+ for (const [index, subWorkItem] of result.subWorkItems.entries()) {
269
+ const depsStr = subWorkItem.dependencies?.length
270
+ ? `\n\n${t('runner.decomposition.prerequisite', { deps: subWorkItem.dependencies.join(', ') })}`
271
+ : '';
272
+ const subDescription = `${subWorkItem.description}\n\n` +
273
+ `${t('runner.decomposition.estimatedTime', { n: String(subWorkItem.estimatedMinutes) })}${depsStr}\n\n` +
274
+ t('runner.decomposition.autoDecomposed', { parentTitle: workItem.title });
275
+ const subResult = await azdo.createSubWorkItem(workItem.workItemId, subWorkItem.title, subDescription, {
276
+ priority: subWorkItem.priority,
277
+ projectId: workItem.azdoProject?.id,
278
+ estimatedMinutes: subWorkItem.estimatedMinutes,
279
+ });
280
+ if ('error' in subResult) {
281
+ console.error(`[AutonomousRunner] Failed to create sub-workItem: ${subResult.error}`);
282
+ continue;
283
+ }
284
+ createdSubWorkItems.push({
285
+ id: subResult.id,
286
+ identifier: subResult.identifier,
287
+ title: subResult.title,
288
+ dependencies: subWorkItem.dependencies || [],
289
+ topoRank: index,
290
+ estimatedMinutes: subWorkItem.estimatedMinutes,
291
+ });
292
+ console.log(`[AutonomousRunner] Created sub-workItem: ${subResult.identifier}`);
293
+ }
294
+ if (createdSubWorkItems.length === 0) {
295
+ console.error('[AutonomousRunner] No sub-workItems created');
296
+ broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'decompose', status: 'fail' } });
297
+ return false;
298
+ }
299
+ // Register decomposition in tracking (for limits)
300
+ registerDecomposition(workItem.workItemId, workItem.parentId, // Parent ID if this workItem is also a sub-workItem
301
+ createdSubWorkItems.map(s => s.id));
302
+ console.log(`[AutonomousRunner] Registered decomposition: parent=${workItem.workItemId}, children=${createdSubWorkItems.length}, daily=${getDailyCreationCount()}/${dailyLimit}`);
303
+ await azdo.markAsDecomposed(workItem.workItemId, createdSubWorkItems.length, result.totalEstimatedMinutes);
304
+ const childIdByTitle = new Map(createdSubWorkItems.map((subWorkItem) => [subWorkItem.title, subWorkItem.id]));
305
+ const parentState = markWorkItemDecomposed(workItem.workItemId, {
306
+ workItemIdentifier: workItem.workItemIdentifier,
307
+ title: workItem.title,
308
+ projectId: workItem.azdoProject?.id,
309
+ projectName: workItem.azdoProject?.name,
310
+ parentWorkItemId: workItem.parentId,
311
+ childWorkItemIds: createdSubWorkItems.map((subWorkItem) => subWorkItem.id),
312
+ });
313
+ await azdo.addComment(workItem.workItemId, buildWorkItemStateSyncComment(parentState, 'Parent workItem decomposed'));
314
+ const subWorkItemList = createdSubWorkItems
315
+ .map((s, i) => `${i + 1}. ${s.identifier}: ${s.title}`)
316
+ .join('\n');
317
+ await ctx.reportToDiscord(t('runner.decomposition.completed', {
318
+ original: workItem.workItemIdentifier || workItem.workItemId || '',
319
+ count: String(createdSubWorkItems.length),
320
+ list: subWorkItemList,
321
+ totalMinutes: String(result.totalEstimatedMinutes),
322
+ }));
323
+ broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'decompose', status: 'complete' } });
324
+ // Log each sub-workItem as a log line for the dashboard
325
+ for (const s of createdSubWorkItems) {
326
+ broadcastEvent({ type: 'log', data: { workItemId, stage: 'decompose', line: `↳ ${s.identifier}: ${s.title}` } });
327
+ }
328
+ console.log(`[AutonomousRunner] Decomposition complete: ${createdSubWorkItems.length} sub-workItems created`);
329
+ for (const subWorkItem of createdSubWorkItems) {
330
+ const dependencyWorkItemIds = subWorkItem.dependencies
331
+ .map((title) => childIdByTitle.get(title))
332
+ .filter((value) => Boolean(value));
333
+ const isReady = dependencyWorkItemIds.length === 0;
334
+ const childState = upsertWorkItemState(subWorkItem.id, {
335
+ workItemIdentifier: subWorkItem.identifier,
336
+ title: subWorkItem.title,
337
+ projectId: workItem.azdoProject?.id,
338
+ projectName: workItem.azdoProject?.name,
339
+ parentWorkItemId: workItem.workItemId,
340
+ dependencyWorkItemIds,
341
+ dependencyTitles: subWorkItem.dependencies,
342
+ topoRank: subWorkItem.topoRank,
343
+ execution: {
344
+ status: isReady ? 'todo' : 'blocked',
345
+ blockedReason: isReady ? undefined : `Waiting on dependencies: ${dependencyWorkItemIds.join(', ')}`,
346
+ retryCount: 0,
347
+ },
348
+ azdoState: isReady ? 'Todo' : 'Backlog',
349
+ });
350
+ try {
351
+ if (isReady) {
352
+ await azdo.updateWorkItemState(subWorkItem.id, 'Todo');
353
+ console.log(`[AutonomousRunner] Moved ${subWorkItem.identifier} to Todo`);
354
+ }
355
+ else {
356
+ console.log(`[AutonomousRunner] Keeping ${subWorkItem.identifier} in Backlog until dependencies resolve`);
357
+ }
358
+ await azdo.addComment(subWorkItem.id, buildWorkItemStateSyncComment(childState, isReady ? 'WorkItem ready after decomposition' : 'WorkItem blocked by decomposition dependency'));
359
+ }
360
+ catch (err) {
361
+ console.warn(`[AutonomousRunner] Failed to initialize ${subWorkItem.identifier} state:`, err);
362
+ }
363
+ }
364
+ // Trigger immediate heartbeat to pick up newly created sub-workItems
365
+ if (ctx.scheduleNextHeartbeat) {
366
+ console.log('[AutonomousRunner] Scheduling immediate heartbeat to process sub-workItems...');
367
+ ctx.scheduleNextHeartbeat();
368
+ }
369
+ return true;
370
+ }
371
+ // Pipeline Execution
372
+ export async function executePipeline(ctx, workItem, projectPath) {
373
+ console.log(`[AutonomousRunner] executePipeline: ${workItem.title}`);
374
+ // ============================================
375
+ // Draft Analysis (Haiku 사전 분석 — ~3초)
376
+ // Planner + Executor에 enriched context 제공
377
+ // ============================================
378
+ let draftResult;
379
+ if (ctx.enableDraftAnalysis !== false) {
380
+ try {
381
+ // Use stable internal workItem id so dashboard can map draft stage rows
382
+ // back to project/workItem metadata populated from workItem:queued events.
383
+ const workItemId = workItem.id;
384
+ broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'draft', status: 'start' } });
385
+ draftResult = await runDraftAnalysis({
386
+ workItemTitle: workItem.title,
387
+ workItemDescription: workItem.description || '',
388
+ projectPath,
389
+ model: ctx.draftModel,
390
+ timeoutMs: 30000,
391
+ onLog: (line) => broadcastEvent({ type: 'log', data: { workItemId, stage: 'draft', line } }),
392
+ });
393
+ broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'draft', status: 'complete' } });
394
+ console.log(`[AutonomousRunner] Draft: type=${draftResult.workItemType}, files=${draftResult.relevantFiles.length}, ${draftResult.durationMs}ms`);
395
+ }
396
+ catch (err) {
397
+ console.warn('[AutonomousRunner] Draft analysis failed (non-blocking):', err);
398
+ }
399
+ }
400
+ if (ctx.enableDecomposition) {
401
+ const threshold = ctx.decompositionThresholdMinutes ?? 30;
402
+ const needsDecomp = planner.needsDecomposition(workItem, threshold, true); // heuristic pre-filter
403
+ if (needsDecomp) {
404
+ const estimated = planner.estimateWorkItemDuration(workItem);
405
+ console.log(`[AutonomousRunner] WorkItem "${workItem.title}" may need decomposition (estimated ${estimated}min > ${threshold}min)`);
406
+ const decomposed = await decomposeWorkItem(ctx, workItem, projectPath, threshold, draftResult);
407
+ if (decomposed === true) {
408
+ // Successfully decomposed into sub-workItems
409
+ return {
410
+ success: true,
411
+ sessionId: `decomposed-${Date.now()}`,
412
+ iterations: 0,
413
+ totalDuration: 0,
414
+ finalStatus: 'decomposed',
415
+ stages: [],
416
+ };
417
+ }
418
+ if (decomposed === 'no-decomp') {
419
+ // Planner says workItem is smaller than threshold — proceed with direct execution
420
+ console.log('[AutonomousRunner] Planner says workItem fits in threshold, executing directly');
421
+ }
422
+ else {
423
+ // Decomposition failed (limit reached, planner error, API error, etc.)
424
+ // Fall through to direct execution instead of aborting entirely
425
+ console.log('[AutonomousRunner] Decomposition failed, falling back to direct execution');
426
+ }
427
+ }
428
+ }
429
+ // ============================================
430
+ // Git Worktree: work in an isolated branch per workItem
431
+ // ============================================
432
+ let worktreeInfo = null;
433
+ let actualPath = projectPath;
434
+ let teardownLifecycle = null;
435
+ if (ctx.worktreeMode && workItem.workItemId && workItem.workItemIdentifier) {
436
+ const workItemKind = workItem.workItemId
437
+ ? (await (await getWorkItemStore()).getWorkItem(workItem.workItemId))?.kind ?? 'Backlog item'
438
+ : 'Backlog item';
439
+ const branchName = branchNameFor({ workItemId: workItem.workItemIdentifier, title: workItem.title }, workItemKind);
440
+ try {
441
+ worktreeInfo = await createWorktree(projectPath, workItem.workItemId, branchName);
442
+ actualPath = worktreeInfo.worktreePath;
443
+ broadcastEvent({
444
+ type: 'log',
445
+ data: {
446
+ workItemId: workItem.workItemId,
447
+ stage: 'worktree',
448
+ line: `Worktree: ${actualPath} (branch: ${branchName})`,
449
+ },
450
+ });
451
+ }
452
+ catch (err) {
453
+ console.warn('[Worktree] Failed to create worktree, falling back to main repo:', err);
454
+ }
455
+ }
456
+ try {
457
+ const roles = ctx.getRolesForProject(projectPath); // look up config using original path
458
+ const pipeline = createPipelineFromConfig(roles, ctx.pairMaxAttempts ?? 3, ctx.guards, ctx.jobProfiles, draftResult ? {
459
+ workItemType: draftResult.workItemType,
460
+ intentSummary: draftResult.intentSummary,
461
+ relevantFiles: draftResult.relevantFiles,
462
+ suggestedApproach: draftResult.suggestedApproach,
463
+ projectStats: draftResult.projectStats,
464
+ registrySnapshot: draftResult.registrySnapshot,
465
+ } : undefined);
466
+ const workItemPrefix = buildWorkItemPrefix(workItem, actualPath);
467
+ pipeline.on('stage:start', ({ stage }) => {
468
+ console.log(`[${workItemPrefix}] Stage started: ${stage}`);
469
+ });
470
+ const workItemReportCtx = {
471
+ workItemIdentifier: workItem.workItemIdentifier || workItem.workItemId,
472
+ projectName: workItem.azdoProject?.name,
473
+ projectPath: actualPath,
474
+ };
475
+ pipeline.on('stage:complete', async ({ stage, result }) => {
476
+ console.log(`[${workItemPrefix}] Stage completed: ${stage}, success=${result.success}`);
477
+ await reportStageResult(stage, result, ctx.reportToDiscord, workItemReportCtx);
478
+ });
479
+ pipeline.on('revision:start', ({ stage }) => {
480
+ void ctx.reportToDiscord(t('runner.pipeline.revisionNeeded', { stage }));
481
+ });
482
+ // HALT event: low confidence → report to Azdo + Discord
483
+ pipeline.on('halt', async ({ confidence, haltReason, sessionId, iteration }) => {
484
+ console.warn(`[${workItemPrefix}] HALT event: confidence=${confidence}%, reason=${haltReason}`);
485
+ // Report to Azdo
486
+ if (workItem.workItemId && ctx.guards?.haltToAzdo) {
487
+ try {
488
+ await azdo.logHalt(workItem.workItemId, sessionId, confidence, iteration, haltReason);
489
+ }
490
+ catch (err) {
491
+ console.error(`[${workItemPrefix}] Azdo logHalt failed:`, err);
492
+ }
493
+ }
494
+ // Report to Discord
495
+ await ctx.reportToDiscord(`⚠️ HALT - Low Confidence\nWorkItem: ${workItem.title}\nConfidence: ${confidence}%\nIteration: #${iteration}\nReason: ${haltReason || 'Low confidence score'}`);
496
+ });
497
+ const stages = getEnabledStages(roles);
498
+ const workItemRef = workItem.workItemIdentifier || workItem.workItemId || '';
499
+ const projectDisplay = workItem.azdoProject?.name
500
+ ? `📁 ${workItem.azdoProject.name} (${actualPath.split('/').slice(-2).join('/')})`
501
+ : actualPath.split('/').slice(-2).join('/');
502
+ await ctx.reportToDiscord(`${t('runner.pipeline.starting')}\n${t('runner.result.workItemLabel')}: ${workItem.title}\nProject: ${projectDisplay}` +
503
+ (workItemRef ? `\nWorkItem: ${workItemRef}` : '') +
504
+ `\nStages: ${stages.join(' → ')}` +
505
+ (worktreeInfo ? `\nBranch: ${worktreeInfo.branchName}` : ''));
506
+ if (workItem.workItemId) {
507
+ try {
508
+ const sessionId = `pipeline-${Date.now()}`;
509
+ const inProgressState = await markWorkItemInProgress(workItem.workItemId, {
510
+ workItemIdentifier: workItem.workItemIdentifier,
511
+ title: workItem.title,
512
+ projectId: workItem.azdoProject?.id,
513
+ projectName: workItem.azdoProject?.name,
514
+ azdoState: 'In Progress',
515
+ sessionId,
516
+ branchName: worktreeInfo?.branchName,
517
+ worktreePath: actualPath,
518
+ });
519
+ await azdo.logPairStart(workItem.workItemId, sessionId, projectPath);
520
+ await azdo.addComment(workItem.workItemId, buildWorkItemStateSyncComment(inProgressState, 'WorkItem execution started'));
521
+ }
522
+ catch (err) {
523
+ console.error(`[${workItemPrefix}] Azdo logPairStart failed:`, err);
524
+ // Continue pipeline even if this fails
525
+ await azdo.updateWorkItemState(workItem.workItemId, 'In Progress');
526
+ }
527
+ }
528
+ // Run pipeline in worktree path
529
+ const result = await pipeline.run(workItem, actualPath);
530
+ // Create PR (worktree mode + pipeline success = finalStatus 'approved')
531
+ if (worktreeInfo && result.success && result.finalStatus === 'approved') {
532
+ try {
533
+ const prUrl = await commitAndCreatePR(worktreeInfo, workItem.title, workItem.workItemIdentifier || '', workItem.description || '');
534
+ result.prUrl = prUrl;
535
+ broadcastEvent({
536
+ type: 'log',
537
+ data: {
538
+ workItemId: workItem.workItemId || workItem.id,
539
+ stage: 'pr',
540
+ line: `PR created: ${prUrl}`,
541
+ },
542
+ });
543
+ console.log(`[Runner] PR created for ${workItem.workItemIdentifier}: ${prUrl}`);
544
+ teardownLifecycle = { phase: 'done', status: 'merging' };
545
+ }
546
+ catch (err) {
547
+ console.error('[Worktree] PR creation failed:', err);
548
+ broadcastEvent({
549
+ type: 'log',
550
+ data: {
551
+ workItemId: workItem.workItemId || workItem.id,
552
+ stage: 'pr',
553
+ line: `PR creation failed: ${err instanceof Error ? err.message : String(err)}`,
554
+ },
555
+ });
556
+ teardownLifecycle = { phase: 'failed', status: 'active' };
557
+ }
558
+ }
559
+ else if (worktreeInfo) {
560
+ // Log why PR was not created
561
+ const reason = !result.success
562
+ ? `Pipeline failed (${result.finalStatus})`
563
+ : `Unexpected state (success=${result.success}, finalStatus=${result.finalStatus})`;
564
+ console.log(`[Runner] PR not created for ${workItem.workItemIdentifier}: ${reason}`);
565
+ teardownLifecycle = {
566
+ phase: result.success ? 'done' : 'failed',
567
+ status: result.success ? 'active' : 'active',
568
+ };
569
+ }
570
+ return result;
571
+ }
572
+ finally {
573
+ if (worktreeInfo && teardownLifecycle && shouldTeardown(teardownLifecycle)) {
574
+ await removeWorktree(worktreeInfo).catch((err) => console.warn('[Worktree] Cleanup failed:', err));
575
+ }
576
+ else if (worktreeInfo) {
577
+ console.log(`[Worktree] Preserving ${worktreeInfo.worktreePath} until merge/teardown policy is satisfied`);
578
+ }
579
+ }
580
+ }
581
+ function getEnabledStages(stages) {
582
+ const enabledStages = [];
583
+ if (stages?.coder?.enabled !== false)
584
+ enabledStages.push('coder');
585
+ if (stages?.critic?.enabled !== false)
586
+ enabledStages.push('critic');
587
+ if (stages?.tester?.enabled)
588
+ enabledStages.push('tester');
589
+ if (stages?.documenter?.enabled)
590
+ enabledStages.push('documenter');
591
+ return enabledStages;
592
+ }
593
+ // Reporting
594
+ async function reportStageResult(stage, result, reportFn, workItemCtx) {
595
+ switch (stage) {
596
+ case 'coder':
597
+ await reportFn(executorAgent.formatWorkReport(result.result, workItemCtx));
598
+ break;
599
+ case 'critic':
600
+ await reportFn(reviewerAgent.formatReviewFeedback(result.result));
601
+ break;
602
+ case 'tester': {
603
+ const { formatTestReport } = await import('../agents/tester.js');
604
+ await reportFn(formatTestReport(result.result));
605
+ break;
606
+ }
607
+ case 'documenter': {
608
+ const { formatDocReport } = await import('../agents/documenter.js');
609
+ await reportFn(formatDocReport(result.result));
610
+ break;
611
+ }
612
+ }
613
+ }
614
+ export async function requestApproval(decision, reportFn) {
615
+ if (!decision.workItem)
616
+ return;
617
+ const projectInfo = decision.workItem.azdoProject?.name
618
+ ? `📁 **${decision.workItem.azdoProject.name}**\n`
619
+ : '';
620
+ const workItemRef = decision.workItem.workItemIdentifier || decision.workItem.workItemId || 'N/A';
621
+ await reportFn(`${t('runner.approval.title')}\n${t('runner.approval.question', { project: projectInfo, title: decision.workItem.title })}\n` +
622
+ `WorkItem: ${workItemRef}\nPriority: P${decision.workItem.priority}\n${t('runner.approval.reason')}: ${decision.reason}\n${t('runner.approval.footer')}`);
623
+ if (decision.workItem.workItemId) {
624
+ const parsed = await loadParsedWorkItem(decision.workItem.workItemId);
625
+ if (parsed) {
626
+ const summary = formatParsedWorkItemSummary(parsed);
627
+ await reportFn(`\`\`\`\n${summary.slice(0, 1800)}\n\`\`\``);
628
+ }
629
+ }
630
+ }
631
+ export async function reportExecutionResult(workItem, result, reportFn) {
632
+ const duration = (result.duration / 1000).toFixed(1);
633
+ const stepCount = Object.keys(result.execution.stepResults).length;
634
+ const completedCount = Object.values(result.execution.stepResults)
635
+ .filter(r => r.status === 'completed').length;
636
+ const projectPrefix = workItem.azdoProject?.name ? `[${workItem.azdoProject.name}] ` : '';
637
+ const workItemDisplay = `${projectPrefix}${workItem.title}`;
638
+ if (result.success) {
639
+ await reportFn(`${t('runner.result.workItemCompleted')}\n${t('runner.result.workItemLabel')}: ${workItemDisplay}\n` +
640
+ `${t('runner.result.duration')}: ${duration}s\n${t('runner.result.completedSteps')}: ${completedCount}/${stepCount}`);
641
+ }
642
+ else {
643
+ await reportFn(`${t('runner.result.workItemFailed')}\n${t('runner.result.workItemLabel')}: ${workItemDisplay}\n` +
644
+ `${t('runner.result.failedStep')}: ${result.failedStep || 'Unknown'}\n${t('runner.result.rollback')}: ${result.rollbackPerformed ? '✅' : '❌'}`);
645
+ const failedStepResult = result.execution.stepResults[result.failedStep || ''];
646
+ if (failedStepResult?.error) {
647
+ await reportFn(`\`\`\`\n${failedStepResult.error.slice(0, 1500)}\n\`\`\``);
648
+ }
649
+ }
650
+ }
651
+ export async function reconcileCompletionState(workItem) {
652
+ if (!workItem.workItemId)
653
+ return;
654
+ const released = releaseDependentWorkItems(workItem.workItemId);
655
+ for (const child of released) {
656
+ try {
657
+ await azdo.updateWorkItemState(child.workItemId, 'Todo');
658
+ await azdo.addComment(child.workItemId, buildWorkItemStateSyncComment(child, 'WorkItem unblocked and ready'));
659
+ }
660
+ catch (err) {
661
+ console.warn(`[AutonomousRunner] Failed to release dependent workItem ${child.workItemId}:`, err);
662
+ }
663
+ }
664
+ const parent = completeParentIfChildrenDone(workItem.workItemId);
665
+ if (!parent)
666
+ return;
667
+ try {
668
+ await azdo.updateWorkItemState(parent.workItemId, 'Done');
669
+ await azdo.addComment(parent.workItemId, buildWorkItemStateSyncComment(parent, 'All child workItems completed'));
670
+ }
671
+ catch (err) {
672
+ console.warn(`[AutonomousRunner] Failed to complete parent workItem ${parent.workItemId}:`, err);
673
+ }
674
+ }
675
+ export async function syncFailureState(workItem, reason) {
676
+ if (!workItem.workItemId)
677
+ return;
678
+ const state = await markWorkItemBlocked(workItem.workItemId, reason, workItem.blockedBy || [], workItem.azdoState);
679
+ try {
680
+ await azdo.addComment(workItem.workItemId, buildWorkItemStateSyncComment(state, 'WorkItem blocked'));
681
+ }
682
+ catch (err) {
683
+ console.warn(`[AutonomousRunner] Failed to sync blocked state for ${workItem.workItemId}:`, err);
684
+ }
685
+ }
686
+ export async function syncSuccessState(workItem, confidence) {
687
+ if (!workItem.workItemId)
688
+ return;
689
+ const state = await markWorkItemDone(workItem.workItemId, {
690
+ workItemIdentifier: workItem.workItemIdentifier,
691
+ title: workItem.title,
692
+ confidence,
693
+ });
694
+ try {
695
+ await azdo.addComment(workItem.workItemId, buildWorkItemStateSyncComment(state, 'WorkItem completed'));
696
+ }
697
+ catch (err) {
698
+ console.warn(`[AutonomousRunner] Failed to sync success state for ${workItem.workItemId}:`, err);
699
+ }
700
+ }
701
+ //# sourceMappingURL=runnerExecution.js.map