@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,780 @@
1
+ // ============================================
2
+ // Enact Factory - Configuration
3
+ // ============================================
4
+ import { readFileSync, existsSync } from 'node:fs';
5
+ import { join, resolve, dirname } from 'node:path';
6
+ import { homedir } from 'node:os';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { getWorkspaceConfigPath, readWorkspaceRootConfig } from '../core/workspaceConfig.js';
9
+ import { z } from 'zod';
10
+ import YAML from 'yaml';
11
+ import TOML from '@iarna/toml';
12
+ import { setTimeWindowConfig, DEFAULT_TIME_WINDOW } from '../support/timeWindow.js';
13
+ import { validateRuntimeStageConfig } from '../core/agentLifecycle.js';
14
+ import { validateAzdoStateMapConfig } from '../azureDevOps/stateMapping.js';
15
+ // Constants
16
+ const CONFIG_FILENAMES = ['config.toml'];
17
+ // Directories searched for config, in priority order.
18
+ // 1. global baseline ~/.enact/factory/config.toml
19
+ // 2. nearest workspace config.toml discovered by walking up from cwd to $HOME
20
+ function getConfigSearchDirs() {
21
+ const home = homedir();
22
+ const dirs = [join(home, '.enact', 'factory')];
23
+ let current = resolve(process.cwd());
24
+ const stop = resolve(home);
25
+ while (true) {
26
+ dirs.push(current);
27
+ if (current === stop)
28
+ break;
29
+ const parent = dirname(current);
30
+ if (parent === current)
31
+ break;
32
+ current = parent;
33
+ }
34
+ const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
35
+ dirs.push(repoRoot);
36
+ return [...new Set(dirs)];
37
+ }
38
+ function getConfigSearchPaths() {
39
+ const paths = [];
40
+ for (const dir of getConfigSearchDirs()) {
41
+ for (const name of CONFIG_FILENAMES) {
42
+ paths.push(join(dir, name));
43
+ }
44
+ }
45
+ return paths;
46
+ }
47
+ const DEFAULT_HEARTBEAT_INTERVAL = 30 * 60 * 1000; // 30 minutes
48
+ const AdapterNameSchema = z.enum(['claude', 'codex', 'responses', 'cursor', 'hermes', 'opencode']);
49
+ const DEFAULT_POSTGRES_PORT = 45432;
50
+ const DEFAULT_POSTGRES_DATABASE = 'enact_factory_dev';
51
+ // Zod Schemas
52
+ const ProjectConfigSchema = z.object({
53
+ name: z.string().min(1, 'Project name is required'),
54
+ path: z.string().min(1, 'Project path is required'),
55
+ heartbeatMs: z.number().positive().optional(),
56
+ azdoLabel: z.string().optional(),
57
+ enabled: z.boolean().default(true),
58
+ paused: z.boolean().default(false),
59
+ operators: z.array(z.string()).optional(),
60
+ });
61
+ const WorkItemRecordStatusSchema = z.enum([
62
+ 'backlog',
63
+ 'todo',
64
+ 'blocked',
65
+ 'in_progress',
66
+ 'in_review',
67
+ 'done',
68
+ 'duplicate',
69
+ 'cancelled',
70
+ ]);
71
+ const AzdoConfigSchema = z.object({
72
+ apiKey: z.string().min(1, 'Azdo API key is required'),
73
+ teamId: z.string().min(1, 'Azdo team ID is required'),
74
+ }).optional();
75
+ const TimeRangeSchema = z.object({
76
+ start: z.string().regex(/^\d{2}:\d{2}$/, 'Format: HH:MM'),
77
+ end: z.string().regex(/^\d{2}:\d{2}$/, 'Format: HH:MM'),
78
+ });
79
+ const TimeWindowConfigSchema = z.object({
80
+ enabled: z.boolean().default(true),
81
+ allowedWindows: z.array(TimeRangeSchema).default([]),
82
+ blockedWindows: z.array(TimeRangeSchema).default([]),
83
+ restrictedDays: z.array(z.number().min(0).max(6)).optional(),
84
+ timezone: z.string().default('Asia/Seoul'),
85
+ }).optional();
86
+ const PairModeConfigSchema = z.object({
87
+ /** Enable pair mode */
88
+ enabled: z.boolean().default(false),
89
+ /** Executor max attempts */
90
+ maxAttempts: z.number().min(1).max(10).default(3),
91
+ /** Executor timeout (ms) */
92
+ executorTimeoutMs: z.number().positive().default(300000), // 5 min
93
+ /** Reviewer timeout (ms) */
94
+ reviewerTimeoutMs: z.number().positive().default(180000), // 3 min
95
+ /** Webhook URL (notification on complete/failure) */
96
+ webhookUrl: z.string().url().optional(),
97
+ /** Auto Azdo status update */
98
+ autoAzdoUpdate: z.boolean().default(true),
99
+ }).optional();
100
+ const ModelConfigSchema = z.object({
101
+ /** Executor agent model */
102
+ executor: z.string().default('claude-sonnet-4-5-20250929'),
103
+ /** Reviewer agent model */
104
+ reviewer: z.string().default('claude-sonnet-4-5-20250929'),
105
+ }).optional();
106
+ /** Per-role configuration schema */
107
+ const ReviewerConsensusConfigSchema = z.object({
108
+ /** Enable multi-reviewer consensus checks */
109
+ enabled: z.boolean().default(false),
110
+ /** Additional reviewer models to run in addition to primary reviewer */
111
+ models: z.array(z.string()).default([]),
112
+ /** Required approvals to pass (defaults to all configured reviewer runs) */
113
+ requiredApprovals: z.number().int().positive().optional(),
114
+ });
115
+ const StageConfigSchema = z.object({
116
+ enabled: z.boolean().default(true),
117
+ adapter: AdapterNameSchema,
118
+ model: z.string(),
119
+ timeoutMs: z.number().min(0).default(0),
120
+ escalateModel: z.string().optional(),
121
+ escalateAfterIteration: z.number().min(1).optional(),
122
+ consensus: ReviewerConsensusConfigSchema.optional(),
123
+ });
124
+ /** Default stages configuration schema */
125
+ const DefaultStagesConfigSchema = z.object({
126
+ coder: StageConfigSchema.default({
127
+ enabled: true,
128
+ adapter: 'claude',
129
+ model: 'claude-haiku-4-5-20251001',
130
+ timeoutMs: 0,
131
+ escalateModel: 'claude-sonnet-4-5-20250929',
132
+ escalateAfterIteration: 3,
133
+ }),
134
+ critic: StageConfigSchema.default({
135
+ enabled: true,
136
+ adapter: 'claude',
137
+ model: 'claude-haiku-4-5-20251001',
138
+ timeoutMs: 0,
139
+ }),
140
+ tester: StageConfigSchema.optional(),
141
+ documenter: StageConfigSchema.optional(),
142
+ auditor: StageConfigSchema.optional(),
143
+ 'stage-documenter': StageConfigSchema.optional(),
144
+ }).optional();
145
+ /** Per-project stage override schema */
146
+ const ProjectStagesOverrideSchema = z.object({
147
+ coder: StageConfigSchema.partial().optional(),
148
+ critic: StageConfigSchema.partial().optional(),
149
+ tester: StageConfigSchema.partial().optional(),
150
+ documenter: StageConfigSchema.partial().optional(),
151
+ auditor: StageConfigSchema.partial().optional(),
152
+ 'stage-documenter': StageConfigSchema.partial().optional(),
153
+ }).optional();
154
+ /** Per-project agent configuration schema */
155
+ const ProjectAgentConfigSchema = z.object({
156
+ path: z.string().min(1),
157
+ azdoProjectId: z.string().optional(),
158
+ stages: ProjectStagesOverrideSchema,
159
+ });
160
+ /** WorkItem decomposition (Planner) configuration schema */
161
+ const DecompositionConfigSchema = z.object({
162
+ /** Enable decomposition */
163
+ enabled: z.boolean().default(false),
164
+ /** Decomposition threshold (minutes) - workItems exceeding this estimate are decomposed */
165
+ thresholdMinutes: z.number().min(10).max(120).default(30),
166
+ /** Max decomposition depth (default: 2) - prevents infinite nesting */
167
+ maxDepth: z.number().min(1).max(5).default(2).optional(),
168
+ /** Max children per workItem (default: 5) - prevents workItem explosion */
169
+ maxChildrenPerWorkItem: z.number().min(1).max(20).default(5).optional(),
170
+ /** Daily workItem creation limit (default: 20) - prevents runaway creation */
171
+ dailyLimit: z.number().min(1).max(100).default(20).optional(),
172
+ /** Auto-move to backlog if too complex or failing (default: true) */
173
+ autoBacklog: z.boolean().default(true).optional(),
174
+ /** Planner model */
175
+ plannerModel: z.string().default('claude-sonnet-4-5-20250929'),
176
+ /** Planner timeout (ms) - default 600000 (10min) */
177
+ plannerTimeoutMs: z.number().min(60000).default(600000),
178
+ }).optional();
179
+ const PipelineStageSchema = z.enum(['coder', 'critic', 'evaluator', 'tester', 'documenter', 'auditor', 'stage-documenter']);
180
+ const JobProfileSchema = z.object({
181
+ name: z.string().min(1),
182
+ minMinutes: z.number().min(0).optional(),
183
+ maxMinutes: z.number().min(0).optional(),
184
+ priority: z.number().int().min(1).max(4).optional(),
185
+ roles: z.record(PipelineStageSchema, z.string()).optional(),
186
+ });
187
+ const PaseoDispatchConfigSchema = z.object({
188
+ cliPath: z.string().default('paseo'),
189
+ provider: z.string().default('codex/gpt-5.3-codex-spark'),
190
+ mode: z.string().default('default'),
191
+ detached: z.boolean().default(true),
192
+ useWorktree: z.boolean().default(true),
193
+ baseBranch: z.string().optional(),
194
+ titlePrefix: z.string().default('Factory'),
195
+ labels: z.record(z.string(), z.string()).default({}),
196
+ env: z.record(z.string(), z.string()).default({}),
197
+ }).default({
198
+ cliPath: 'paseo',
199
+ provider: 'codex/gpt-5.3-codex-spark',
200
+ mode: 'default',
201
+ detached: true,
202
+ useWorktree: true,
203
+ titlePrefix: 'Factory',
204
+ labels: {},
205
+ env: {},
206
+ });
207
+ const AutonomousConfigSchema = z.object({
208
+ /** Auto-enable on service start */
209
+ enabled: z.boolean().default(false),
210
+ /** Executor/Reviewer pair mode */
211
+ pairMode: z.boolean().default(true),
212
+ /** Execution schedule (cron expression) */
213
+ schedule: z.string().default('*/30 * * * *'),
214
+ /** Pair mode max attempts */
215
+ maxAttempts: z.number().min(1).max(10).default(3),
216
+ /** Allowed project paths */
217
+ allowedProjects: z.array(z.string()).default(['~/dev']),
218
+ /** Model configuration (legacy) */
219
+ models: ModelConfigSchema,
220
+ /** Executor timeout (ms) - 0 = unlimited (legacy) */
221
+ executorTimeoutMs: z.number().min(0).default(0),
222
+ /** Reviewer timeout (ms) - 0 = unlimited (legacy) */
223
+ reviewerTimeoutMs: z.number().min(0).default(0),
224
+ /** Max concurrent workItems */
225
+ maxConcurrentWorkItems: z.number().min(1).max(10).default(1),
226
+ /** Default stage configuration */
227
+ defaultStages: DefaultStagesConfigSchema,
228
+ /** Per-project agent configuration */
229
+ projectAgents: z.array(ProjectAgentConfigSchema).optional(),
230
+ /** WorkItem decomposition configuration (Planner Agent) */
231
+ decomposition: DecompositionConfigSchema,
232
+ /** Git worktree mode: each workItem runs in isolated worktree */
233
+ worktreeMode: z.boolean().default(false),
234
+ /** Dispatch backend for executable workItems. */
235
+ dispatchBackend: z.enum(['paseo', 'legacy']).default('paseo'),
236
+ /** Paseo dispatch options. */
237
+ paseo: PaseoDispatchConfigSchema,
238
+ /** Dynamic job profiles for model selection */
239
+ jobProfiles: z.array(JobProfileSchema).optional(),
240
+ /** Daily workItem completion cap (default: 6) */
241
+ dailyWorkItemCap: z.number().min(1).max(50).default(6),
242
+ /** Cooldown between workItem completions in ms (default: 1800000 = 30min) */
243
+ interWorkItemCooldownMs: z.number().min(0).default(1800000),
244
+ /** Pipeline guards configuration */
245
+ guards: z.any().optional(),
246
+ }).optional();
247
+ // Long-Running Monitor schemas
248
+ const CompletionCheckSchema = z.discriminatedUnion('type', [
249
+ z.object({ type: z.literal('exit-code'), successExitCode: z.number().optional() }),
250
+ z.object({ type: z.literal('output-regex'), successPattern: z.string(), failurePattern: z.string().optional() }),
251
+ z.object({ type: z.literal('http-status'), expectedStatus: z.number().optional() }),
252
+ ]);
253
+ const LongRunningMonitorConfigSchema = z.object({
254
+ id: z.string().min(1),
255
+ name: z.string().min(1),
256
+ checkCommand: z.array(z.string().min(1)).min(1),
257
+ completionCheck: CompletionCheckSchema,
258
+ workItemId: z.string().optional(),
259
+ checkInterval: z.number().min(1).default(1),
260
+ maxDurationHours: z.number().min(1).default(48),
261
+ notify: z.boolean().default(true),
262
+ metadata: z.record(z.string(), z.unknown()).optional(),
263
+ });
264
+ const AzdoSyncConfigSchema = z.object({
265
+ enabled: z.boolean().default(false),
266
+ organization: z.string().default('amsterdamdatalabs'),
267
+ project: z.string().default('Enact'),
268
+ intervalMs: z.number().positive().default(30000),
269
+ authStrategy: z.enum(['pat', 'az-cli']).default('az-cli'),
270
+ patEnvVar: z.string().optional(),
271
+ areaFilter: z.string().optional(),
272
+ fieldNames: z.record(z.string(), z.string()).optional(),
273
+ azdoStateToStatus: z.record(z.string(), WorkItemRecordStatusSchema).optional(),
274
+ statusToAzdoState: z.record(z.string(), z.string().min(1)).optional(),
275
+ terminalStates: z.array(z.string().min(1)).optional(),
276
+ }).optional();
277
+ const WorkItemSourceSchema = z.enum(['auto', 'azdo', 'local', 'disabled']).default('auto');
278
+ const LifecycleBooleanSchema = z.object({
279
+ id: z.string(),
280
+ label: z.string().optional(),
281
+ order: z.number().optional(),
282
+ flippedBy: z.array(z.string()).default([]),
283
+ source: z.string().optional(),
284
+ });
285
+ const LifecycleSchema = z.object({
286
+ booleans: z.array(LifecycleBooleanSchema).default([]),
287
+ }).optional();
288
+ const SchedulerSchema = z.object({
289
+ enabled: z.boolean().default(false),
290
+ pickNextOperator: z.object({
291
+ strategy: z.string().default('capability-match'),
292
+ fallback: z.string().default('ralph'),
293
+ respectOperatorLaneHint: z.boolean().default(true),
294
+ }).default({ strategy: 'capability-match', fallback: 'ralph', respectOperatorLaneHint: true }),
295
+ }).optional();
296
+ const DatabaseConfigSchema = z.object({
297
+ /** Database type: postgres (default) or sqlite */
298
+ type: z.enum(['sqlite', 'postgres']).default('postgres'),
299
+ /** PostgreSQL connection string (overrides individual settings) */
300
+ url: z.string().optional(),
301
+ /** PostgreSQL host */
302
+ host: z.string().default('localhost'),
303
+ /** PostgreSQL port */
304
+ port: z.number().default(DEFAULT_POSTGRES_PORT),
305
+ /** PostgreSQL database name */
306
+ database: z.string().default(DEFAULT_POSTGRES_DATABASE),
307
+ /** PostgreSQL username */
308
+ user: z.string().default('enact'),
309
+ /** PostgreSQL password */
310
+ password: z.string().default('enact'),
311
+ /** Schema name (default: public) */
312
+ schema: z.string().default('public'),
313
+ }).optional();
314
+ const ClosureContractSchema = z.object({
315
+ required: z.array(z.string()).default([]),
316
+ optional: z.array(z.string()).default([]),
317
+ tagOverrides: z.record(z.string(), z.object({
318
+ addRequired: z.array(z.string()).optional(),
319
+ removeRequired: z.array(z.string()).optional(),
320
+ })).optional(),
321
+ });
322
+ const RawConfigSchema = z.object({
323
+ language: z.enum(['en', 'ko']).default('en'),
324
+ workItemSource: WorkItemSourceSchema,
325
+ database: DatabaseConfigSchema,
326
+ azdo: AzdoConfigSchema,
327
+ timeWindow: TimeWindowConfigSchema,
328
+ pairMode: PairModeConfigSchema,
329
+ autonomous: AutonomousConfigSchema,
330
+ monitors: z.array(LongRunningMonitorConfigSchema).optional(),
331
+ projects: z.array(ProjectConfigSchema).default([]),
332
+ defaultHeartbeatMs: z.number().positive().default(DEFAULT_HEARTBEAT_INTERVAL),
333
+ azureDevOps: AzdoSyncConfigSchema,
334
+ closureContracts: z.record(z.string(), ClosureContractSchema).optional(),
335
+ lifecycle: LifecycleSchema,
336
+ scheduler: SchedulerSchema,
337
+ });
338
+ const LIFECYCLE_RUNTIME_STAGE_IDS = [
339
+ 'coder',
340
+ 'critic',
341
+ 'tester',
342
+ 'documenter',
343
+ 'auditor',
344
+ 'stage-documenter',
345
+ ];
346
+ // Environment Variable Substitution
347
+ /**
348
+ * Environment variable pattern: ${VAR_NAME} or ${VAR_NAME:-default}
349
+ */
350
+ const ENV_VAR_PATTERN = /\$\{([^}:]+)(?::-([^}]*))?\}/g;
351
+ /**
352
+ * Substitute environment variables in string
353
+ */
354
+ function substituteEnvVars(value) {
355
+ return value.replace(ENV_VAR_PATTERN, (match, varName, defaultValue) => {
356
+ const envValue = process.env[varName];
357
+ if (envValue !== undefined) {
358
+ return envValue;
359
+ }
360
+ if (defaultValue !== undefined) {
361
+ return defaultValue;
362
+ }
363
+ // Return empty string if no env var and no default value
364
+ console.warn(`Environment variable ${varName} is not set`);
365
+ return '';
366
+ });
367
+ }
368
+ /**
369
+ * Apply environment variable substitution to all strings in an object
370
+ */
371
+ function substituteEnvVarsDeep(obj) {
372
+ if (typeof obj === 'string') {
373
+ return substituteEnvVars(obj);
374
+ }
375
+ if (Array.isArray(obj)) {
376
+ return obj.map(substituteEnvVarsDeep);
377
+ }
378
+ if (obj !== null && typeof obj === 'object') {
379
+ const result = {};
380
+ for (const [key, value] of Object.entries(obj)) {
381
+ result[key] = substituteEnvVarsDeep(value);
382
+ }
383
+ return result;
384
+ }
385
+ return obj;
386
+ }
387
+ /**
388
+ * Expand path (~/ handling)
389
+ */
390
+ export function expandPath(path, resolveRelative = false) {
391
+ if (path.startsWith('~/')) {
392
+ return join(homedir(), path.slice(2));
393
+ }
394
+ if (resolveRelative) {
395
+ const { resolve } = require('node:path');
396
+ return resolve(path);
397
+ }
398
+ return path;
399
+ }
400
+ // Config Loading
401
+ /**
402
+ * Find configuration file.
403
+ *
404
+ * Resolution order:
405
+ * 1. ../../config.toml (canonical enact-os root config)
406
+ * 2. ./config.toml (cwd fallback)
407
+ * 3. ~/.enact/factory/config.toml (canonical factory home — searched first via getConfigSearchDirs)
408
+ * 4. ~/.config/enact-factory/config.toml (legacy XDG path — no longer searched; kept here for migration reference)
409
+ * 5. ~/.enact-factory/config.toml (legacy home path — no longer searched; kept here for migration reference)
410
+ */
411
+ function findConfigFile() {
412
+ for (const path of getConfigSearchPaths()) {
413
+ if (existsSync(path)) {
414
+ return path;
415
+ }
416
+ }
417
+ return null;
418
+ }
419
+ /**
420
+ * Parse configuration file
421
+ */
422
+ function parseConfigFile(path) {
423
+ const content = readFileSync(path, 'utf-8');
424
+ if (path.endsWith('.toml')) {
425
+ const parsed = TOML.parse(content);
426
+ if (parsed.factory && typeof parsed.factory === 'object' && !Array.isArray(parsed.factory)) {
427
+ return parsed.factory;
428
+ }
429
+ return parsed;
430
+ }
431
+ if (path.endsWith('.json')) {
432
+ return JSON.parse(content);
433
+ }
434
+ // YAML parsing
435
+ return YAML.parse(content);
436
+ }
437
+ function validateLifecycleStageConfig(configPath, stageId, stageConfig, fallbackProvider) {
438
+ if (!stageConfig) {
439
+ return [];
440
+ }
441
+ const result = validateRuntimeStageConfig(stageId, stageConfig, fallbackProvider);
442
+ if ('errors' in result) {
443
+ return result.errors.map((error) => `${configPath}.${error.field}: ${error.message}`);
444
+ }
445
+ return [];
446
+ }
447
+ function collectLifecycleStageValidationErrors(config) {
448
+ const errors = [];
449
+ const fallbackProvider = 'claude';
450
+ const defaultStages = config.autonomous?.defaultStages;
451
+ if (defaultStages) {
452
+ for (const stageId of LIFECYCLE_RUNTIME_STAGE_IDS) {
453
+ const stageConfig = defaultStages[stageId];
454
+ errors.push(...validateLifecycleStageConfig(`autonomous.defaultStages.${stageId}`, stageId, stageConfig, fallbackProvider));
455
+ }
456
+ }
457
+ config.autonomous?.projectAgents?.forEach((projectAgent, index) => {
458
+ for (const stageId of LIFECYCLE_RUNTIME_STAGE_IDS) {
459
+ const stageConfig = projectAgent.stages?.[stageId];
460
+ errors.push(...validateLifecycleStageConfig(`autonomous.projectAgents[${index}].stages.${stageId}`, stageId, stageConfig, fallbackProvider));
461
+ }
462
+ });
463
+ return errors;
464
+ }
465
+ /**
466
+ * Transform raw config to FactoryConfig
467
+ */
468
+ function transformConfig(raw) {
469
+ return {
470
+ language: raw.language,
471
+ workItemSource: raw.workItemSource,
472
+ database: raw.database ? {
473
+ type: raw.database.type,
474
+ url: raw.database.url,
475
+ host: raw.database.host,
476
+ port: raw.database.port,
477
+ database: raw.database.database,
478
+ user: raw.database.user,
479
+ password: raw.database.password,
480
+ schema: raw.database.schema,
481
+ } : { type: 'postgres' },
482
+ azdoApiKey: raw.azdo?.apiKey ?? '',
483
+ azdoTeamId: raw.azdo?.teamId ?? '',
484
+ projects: raw.projects.map(project => ({
485
+ ...project,
486
+ path: expandPath(project.path),
487
+ heartbeatMs: project.heartbeatMs ?? raw.defaultHeartbeatMs,
488
+ azdoLabel: project.azdoLabel ?? project.name,
489
+ })),
490
+ defaultHeartbeatMs: raw.defaultHeartbeatMs,
491
+ timeWindow: raw.timeWindow ? {
492
+ enabled: raw.timeWindow.enabled,
493
+ allowedWindows: raw.timeWindow.allowedWindows,
494
+ blockedWindows: raw.timeWindow.blockedWindows,
495
+ restrictedDays: raw.timeWindow.restrictedDays,
496
+ timezone: raw.timeWindow.timezone,
497
+ } : undefined,
498
+ pairMode: raw.pairMode ? {
499
+ enabled: raw.pairMode.enabled,
500
+ maxAttempts: raw.pairMode.maxAttempts,
501
+ executorTimeoutMs: raw.pairMode.executorTimeoutMs,
502
+ reviewerTimeoutMs: raw.pairMode.reviewerTimeoutMs,
503
+ webhookUrl: raw.pairMode.webhookUrl,
504
+ autoAzdoUpdate: raw.pairMode.autoAzdoUpdate,
505
+ } : undefined,
506
+ autonomous: raw.autonomous ? {
507
+ enabled: raw.autonomous.enabled,
508
+ pairMode: raw.autonomous.pairMode,
509
+ schedule: raw.autonomous.schedule,
510
+ maxAttempts: raw.autonomous.maxAttempts,
511
+ allowedProjects: raw.autonomous.allowedProjects.map((path) => expandPath(path)),
512
+ models: raw.autonomous.models ? {
513
+ executor: raw.autonomous.models.executor,
514
+ reviewer: raw.autonomous.models.reviewer,
515
+ } : undefined,
516
+ executorTimeoutMs: raw.autonomous.executorTimeoutMs,
517
+ reviewerTimeoutMs: raw.autonomous.reviewerTimeoutMs,
518
+ maxConcurrentWorkItems: raw.autonomous.maxConcurrentWorkItems,
519
+ defaultStages: raw.autonomous.defaultStages,
520
+ projectAgents: raw.autonomous.projectAgents?.map(pa => ({
521
+ ...pa,
522
+ path: expandPath(pa.path),
523
+ })),
524
+ decomposition: raw.autonomous.decomposition ? {
525
+ enabled: raw.autonomous.decomposition.enabled,
526
+ thresholdMinutes: raw.autonomous.decomposition.thresholdMinutes,
527
+ maxDepth: raw.autonomous.decomposition.maxDepth ?? 2,
528
+ maxChildrenPerWorkItem: raw.autonomous.decomposition.maxChildrenPerWorkItem ?? 5,
529
+ dailyLimit: raw.autonomous.decomposition.dailyLimit ?? 20,
530
+ autoBacklog: raw.autonomous.decomposition.autoBacklog ?? true,
531
+ plannerModel: raw.autonomous.decomposition.plannerModel,
532
+ plannerTimeoutMs: raw.autonomous.decomposition.plannerTimeoutMs,
533
+ } : undefined,
534
+ worktreeMode: raw.autonomous.worktreeMode,
535
+ dispatchBackend: raw.autonomous.dispatchBackend,
536
+ paseo: raw.autonomous.paseo,
537
+ dailyWorkItemCap: raw.autonomous.dailyWorkItemCap,
538
+ interWorkItemCooldownMs: raw.autonomous.interWorkItemCooldownMs,
539
+ jobProfiles: raw.autonomous.jobProfiles,
540
+ guards: raw.autonomous.guards,
541
+ } : undefined,
542
+ monitors: raw.monitors,
543
+ azureDevOps: raw.azureDevOps ? {
544
+ enabled: raw.azureDevOps.enabled,
545
+ organization: raw.azureDevOps.organization,
546
+ project: raw.azureDevOps.project,
547
+ intervalMs: raw.azureDevOps.intervalMs,
548
+ authStrategy: raw.azureDevOps.authStrategy,
549
+ patEnvVar: raw.azureDevOps.patEnvVar,
550
+ areaFilter: raw.azureDevOps.areaFilter,
551
+ fieldNames: raw.azureDevOps.fieldNames,
552
+ } : undefined,
553
+ closureContracts: raw.closureContracts,
554
+ lifecycle: raw.lifecycle,
555
+ scheduler: raw.scheduler,
556
+ };
557
+ }
558
+ /**
559
+ * Load config (env var substitution + Zod validation)
560
+ */
561
+ function extractFactorySection(merged) {
562
+ const factory = merged.factory;
563
+ if (factory && typeof factory === 'object' && !Array.isArray(factory)) {
564
+ return factory;
565
+ }
566
+ return merged;
567
+ }
568
+ export function loadConfig(customPath) {
569
+ let rawData;
570
+ let configLabel;
571
+ if (customPath) {
572
+ configLabel = customPath;
573
+ try {
574
+ rawData = parseConfigFile(customPath);
575
+ }
576
+ catch (err) {
577
+ throw new Error(`Failed to parse config file: ${err}`);
578
+ }
579
+ }
580
+ else {
581
+ const merged = readWorkspaceRootConfig();
582
+ if (!merged) {
583
+ const searched = getConfigSearchPaths().map((p) => ` - ${p}`).join('\n');
584
+ throw new Error(`Config file not found. Searched:\n${searched}\n` +
585
+ `Create the canonical enact-os config.toml.`);
586
+ }
587
+ const workspacePath = getWorkspaceConfigPath();
588
+ configLabel = workspacePath
589
+ ? `merged (global + ${workspacePath})`
590
+ : `merged (global ~/.enact/config.toml)`;
591
+ rawData = extractFactorySection(merged);
592
+ }
593
+ console.log(`Loading config from: ${configLabel}`);
594
+ // 3. Substitute environment variables
595
+ const substituted = substituteEnvVarsDeep(rawData);
596
+ // 4. Key migrations (deprecated keys → new keys)
597
+ let migrated = { ...substituted };
598
+ // autonomous.defaultRoles → autonomous.defaultStages
599
+ const auto = migrated.autonomous;
600
+ if (auto && 'defaultRoles' in auto && !('defaultStages' in auto)) {
601
+ console.warn('[Config] "autonomous.defaultRoles:" is deprecated — use "autonomous.defaultStages:" instead.');
602
+ auto.defaultStages = auto.defaultRoles;
603
+ delete auto.defaultRoles;
604
+ }
605
+ // Stage key migrations within defaultStages
606
+ const stages = auto?.defaultStages;
607
+ if (stages) {
608
+ if ('executor' in stages && !('coder' in stages)) {
609
+ console.warn('[Config] Stage key "executor" is deprecated — use "coder" instead.');
610
+ stages.coder = stages.executor;
611
+ delete stages.executor;
612
+ }
613
+ if ('reviewer' in stages && !('critic' in stages)) {
614
+ console.warn('[Config] Stage key "reviewer" is deprecated — use "critic" instead.');
615
+ stages.critic = stages.reviewer;
616
+ delete stages.reviewer;
617
+ }
618
+ if ('skill-documenter' in stages && !('stage-documenter' in stages)) {
619
+ console.warn('[Config] Stage key "skill-documenter" is deprecated — use "stage-documenter" instead.');
620
+ stages['stage-documenter'] = stages['skill-documenter'];
621
+ delete stages['skill-documenter'];
622
+ }
623
+ }
624
+ // Job profile role key migrations
625
+ const profiles = auto?.jobProfiles;
626
+ if (profiles) {
627
+ for (const profile of profiles) {
628
+ const roles = profile.roles;
629
+ if (roles) {
630
+ if ('executor' in roles && !('coder' in roles)) {
631
+ roles.coder = roles.executor;
632
+ delete roles.executor;
633
+ }
634
+ if ('reviewer' in roles && !('critic' in roles)) {
635
+ roles.critic = roles.reviewer;
636
+ delete roles.reviewer;
637
+ }
638
+ if ('skill-documenter' in roles && !('stage-documenter' in roles)) {
639
+ roles['stage-documenter'] = roles['skill-documenter'];
640
+ delete roles['skill-documenter'];
641
+ }
642
+ }
643
+ }
644
+ }
645
+ // 5. Zod schema validation
646
+ const parseResult = RawConfigSchema.safeParse(migrated);
647
+ if (!parseResult.success) {
648
+ const errors = parseResult.error.issues
649
+ .map((e) => ` - ${e.path.join('.')}: ${e.message}`)
650
+ .join('\n');
651
+ throw new Error(`Config validation failed:\n${errors}`);
652
+ }
653
+ // 5. Transform to FactoryConfig
654
+ const config = transformConfig(parseResult.data);
655
+ // 6. Apply time window config
656
+ if (config.timeWindow) {
657
+ setTimeWindowConfig(config.timeWindow);
658
+ console.log(`[Config] TimeWindow config loaded (enabled: ${config.timeWindow.enabled})`);
659
+ }
660
+ else {
661
+ setTimeWindowConfig(DEFAULT_TIME_WINDOW);
662
+ console.log(`[Config] Using default TimeWindow config`);
663
+ }
664
+ return config;
665
+ }
666
+ /**
667
+ * Validate config (supplementary checks beyond Zod validation)
668
+ */
669
+ export function validateBootstrapConfig(config) {
670
+ const errors = [];
671
+ // Verify agent project paths exist
672
+ for (const project of config.projects) {
673
+ if (!existsSync(project.path)) {
674
+ errors.push(`Project "${project.name}" path does not exist: ${project.path}`);
675
+ }
676
+ }
677
+ if (config.autonomous?.allowedProjects) {
678
+ for (const projectPath of config.autonomous.allowedProjects) {
679
+ if (!existsSync(projectPath)) {
680
+ errors.push(`Autonomous allowed project path does not exist: ${projectPath}`);
681
+ }
682
+ }
683
+ }
684
+ if (config.autonomous?.projectAgents) {
685
+ for (const projectAgent of config.autonomous.projectAgents) {
686
+ if (!existsSync(projectAgent.path)) {
687
+ errors.push(`Autonomous project agent path does not exist: ${projectAgent.path}`);
688
+ }
689
+ }
690
+ }
691
+ errors.push(...collectLifecycleStageValidationErrors(config));
692
+ errors.push(...validateAzdoStateMapConfig(config.azureDevOps));
693
+ if (config.autonomous?.worktreeMode) {
694
+ if (config.autonomous.defaultStages?.coder?.enabled === false) {
695
+ console.warn('⚠️ Coder stage is disabled — pipeline will not generate code.');
696
+ }
697
+ if (config.autonomous.defaultStages?.critic?.enabled === false) {
698
+ errors.push('autonomous.worktreeMode requires the reviewer stage to remain enabled');
699
+ }
700
+ config.autonomous.projectAgents?.forEach((projectAgent, index) => {
701
+ if (projectAgent.stages?.coder?.enabled === false) {
702
+ errors.push(`autonomous.projectAgents[${index}].stages.coder must remain enabled when worktreeMode is on`);
703
+ }
704
+ if (projectAgent.stages?.critic?.enabled === false) {
705
+ errors.push(`autonomous.projectAgents[${index}].stages.critic must remain enabled when worktreeMode is on`);
706
+ }
707
+ });
708
+ }
709
+ return { valid: errors.length === 0, errors };
710
+ }
711
+ /**
712
+ * Validate resolved runtime config, including canonical registered-project paths.
713
+ */
714
+ export function validateConfig(config) {
715
+ const base = validateBootstrapConfig(config);
716
+ const errors = [...base.errors];
717
+ for (const project of config.projects) {
718
+ if (!existsSync(project.path)) {
719
+ errors.push(`Project "${project.name}" path does not exist: ${project.path}`);
720
+ }
721
+ }
722
+ return { valid: errors.length === 0, errors };
723
+ }
724
+ /**
725
+ * Create a default project config
726
+ */
727
+ export function createProjectConfig(name, path, options) {
728
+ return {
729
+ name,
730
+ path: expandPath(path),
731
+ heartbeatMs: options?.heartbeatMs ?? DEFAULT_HEARTBEAT_INTERVAL,
732
+ azdoLabel: options?.azdoLabel ?? name,
733
+ enabled: options?.enabled ?? true,
734
+ paused: options?.paused ?? false,
735
+ };
736
+ }
737
+ /**
738
+ * Generate a sample configuration file
739
+ */
740
+ export function generateSampleConfig() {
741
+ return `# Root enact-os config.toml excerpt for enact-factory
742
+ # Merge this into the single canonical config.toml at the enact-os root.
743
+
744
+ [factory]
745
+ # Single canonical UI port for the dashboard (43206 dev / 53206 prod).
746
+ # Both \`enact-factory dash\` and \`start\` serve the SAME dashboard here.
747
+ # \`dash_port\` is retired; new configs write only \`port\`.
748
+ port = 43206
749
+ node_env = "development"
750
+ language = "en"
751
+ workItemSource = "auto"
752
+ defaultHeartbeatMs = 1800000
753
+ storage = ".enact/factory"
754
+
755
+ [factory.database]
756
+ type = "postgres"
757
+ host = "localhost"
758
+ port = 45432
759
+ database = "enact_factory_dev"
760
+ user = "enact"
761
+ password = "enact"
762
+ schema = "public"
763
+
764
+ # Registered repositories are stored in Postgres (\`projects\` table).
765
+ # A legacy [[factory.projects]] list is only used one time to seed that table
766
+ # when it is empty.
767
+
768
+ [factory.autonomous]
769
+ dispatchBackend = "paseo"
770
+
771
+ [factory.autonomous.paseo]
772
+ cliPath = "paseo"
773
+ provider = "codex/gpt-5.3-codex-spark"
774
+ mode = "default"
775
+ detached = true
776
+ useWorktree = true
777
+ titlePrefix = "Factory"
778
+ `;
779
+ }
780
+ //# sourceMappingURL=config.js.map