@telora/factory 0.4.5

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 (301) hide show
  1. package/dist/audit.d.ts +69 -0
  2. package/dist/audit.d.ts.map +1 -0
  3. package/dist/audit.js +376 -0
  4. package/dist/audit.js.map +1 -0
  5. package/dist/builder-completion.d.ts +35 -0
  6. package/dist/builder-completion.d.ts.map +1 -0
  7. package/dist/builder-completion.js +375 -0
  8. package/dist/builder-completion.js.map +1 -0
  9. package/dist/builder-spawner.d.ts +40 -0
  10. package/dist/builder-spawner.d.ts.map +1 -0
  11. package/dist/builder-spawner.js +493 -0
  12. package/dist/builder-spawner.js.map +1 -0
  13. package/dist/completion-gate.d.ts +52 -0
  14. package/dist/completion-gate.d.ts.map +1 -0
  15. package/dist/completion-gate.js +336 -0
  16. package/dist/completion-gate.js.map +1 -0
  17. package/dist/completion-report.d.ts +36 -0
  18. package/dist/completion-report.d.ts.map +1 -0
  19. package/dist/completion-report.js +348 -0
  20. package/dist/completion-report.js.map +1 -0
  21. package/dist/completion.d.ts +58 -0
  22. package/dist/completion.d.ts.map +1 -0
  23. package/dist/completion.js +287 -0
  24. package/dist/completion.js.map +1 -0
  25. package/dist/config.d.ts +16 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +57 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/context-manager.d.ts +152 -0
  30. package/dist/context-manager.d.ts.map +1 -0
  31. package/dist/context-manager.js +421 -0
  32. package/dist/context-manager.js.map +1 -0
  33. package/dist/crash-detection.d.ts +70 -0
  34. package/dist/crash-detection.d.ts.map +1 -0
  35. package/dist/crash-detection.js +123 -0
  36. package/dist/crash-detection.js.map +1 -0
  37. package/dist/crash-recovery.d.ts +83 -0
  38. package/dist/crash-recovery.d.ts.map +1 -0
  39. package/dist/crash-recovery.js +522 -0
  40. package/dist/crash-recovery.js.map +1 -0
  41. package/dist/crash-resolution.d.ts +34 -0
  42. package/dist/crash-resolution.d.ts.map +1 -0
  43. package/dist/crash-resolution.js +382 -0
  44. package/dist/crash-resolution.js.map +1 -0
  45. package/dist/escalation.d.ts +150 -0
  46. package/dist/escalation.d.ts.map +1 -0
  47. package/dist/escalation.js +352 -0
  48. package/dist/escalation.js.map +1 -0
  49. package/dist/execution-target.d.ts +31 -0
  50. package/dist/execution-target.d.ts.map +1 -0
  51. package/dist/execution-target.js +71 -0
  52. package/dist/execution-target.js.map +1 -0
  53. package/dist/execution-unit-init.d.ts +28 -0
  54. package/dist/execution-unit-init.d.ts.map +1 -0
  55. package/dist/execution-unit-init.js +115 -0
  56. package/dist/execution-unit-init.js.map +1 -0
  57. package/dist/execution.d.ts +17 -0
  58. package/dist/execution.d.ts.map +1 -0
  59. package/dist/execution.js +20 -0
  60. package/dist/execution.js.map +1 -0
  61. package/dist/factory-engine.d.ts +100 -0
  62. package/dist/factory-engine.d.ts.map +1 -0
  63. package/dist/factory-engine.js +243 -0
  64. package/dist/factory-engine.js.map +1 -0
  65. package/dist/gap-detection.d.ts +43 -0
  66. package/dist/gap-detection.d.ts.map +1 -0
  67. package/dist/gap-detection.js +149 -0
  68. package/dist/gap-detection.js.map +1 -0
  69. package/dist/gate-context.d.ts +23 -0
  70. package/dist/gate-context.d.ts.map +1 -0
  71. package/dist/gate-context.js +63 -0
  72. package/dist/gate-context.js.map +1 -0
  73. package/dist/gate-engine.d.ts +55 -0
  74. package/dist/gate-engine.d.ts.map +1 -0
  75. package/dist/gate-engine.js +191 -0
  76. package/dist/gate-engine.js.map +1 -0
  77. package/dist/gates/adversarial.d.ts +59 -0
  78. package/dist/gates/adversarial.d.ts.map +1 -0
  79. package/dist/gates/adversarial.js +426 -0
  80. package/dist/gates/adversarial.js.map +1 -0
  81. package/dist/gates/adversary-spawner.d.ts +35 -0
  82. package/dist/gates/adversary-spawner.d.ts.map +1 -0
  83. package/dist/gates/adversary-spawner.js +286 -0
  84. package/dist/gates/adversary-spawner.js.map +1 -0
  85. package/dist/gates/adversary-test-dir.d.ts +41 -0
  86. package/dist/gates/adversary-test-dir.d.ts.map +1 -0
  87. package/dist/gates/adversary-test-dir.js +150 -0
  88. package/dist/gates/adversary-test-dir.js.map +1 -0
  89. package/dist/gates/behavioral-parser.d.ts +32 -0
  90. package/dist/gates/behavioral-parser.d.ts.map +1 -0
  91. package/dist/gates/behavioral-parser.js +190 -0
  92. package/dist/gates/behavioral-parser.js.map +1 -0
  93. package/dist/gates/behavioral-runner.d.ts +36 -0
  94. package/dist/gates/behavioral-runner.d.ts.map +1 -0
  95. package/dist/gates/behavioral-runner.js +306 -0
  96. package/dist/gates/behavioral-runner.js.map +1 -0
  97. package/dist/gates/behavioral.d.ts +37 -0
  98. package/dist/gates/behavioral.d.ts.map +1 -0
  99. package/dist/gates/behavioral.js +485 -0
  100. package/dist/gates/behavioral.js.map +1 -0
  101. package/dist/gates/deterministic.d.ts +24 -0
  102. package/dist/gates/deterministic.d.ts.map +1 -0
  103. package/dist/gates/deterministic.js +186 -0
  104. package/dist/gates/deterministic.js.map +1 -0
  105. package/dist/git-factory.d.ts +59 -0
  106. package/dist/git-factory.d.ts.map +1 -0
  107. package/dist/git-factory.js +102 -0
  108. package/dist/git-factory.js.map +1 -0
  109. package/dist/guard-evaluation.d.ts +48 -0
  110. package/dist/guard-evaluation.d.ts.map +1 -0
  111. package/dist/guard-evaluation.js +416 -0
  112. package/dist/guard-evaluation.js.map +1 -0
  113. package/dist/index.d.ts +30 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +39 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/instance-completion.d.ts +34 -0
  118. package/dist/instance-completion.d.ts.map +1 -0
  119. package/dist/instance-completion.js +366 -0
  120. package/dist/instance-completion.js.map +1 -0
  121. package/dist/instance-lifecycle.d.ts +15 -0
  122. package/dist/instance-lifecycle.d.ts.map +1 -0
  123. package/dist/instance-lifecycle.js +18 -0
  124. package/dist/instance-lifecycle.js.map +1 -0
  125. package/dist/instance-phase-dispatch.d.ts +75 -0
  126. package/dist/instance-phase-dispatch.d.ts.map +1 -0
  127. package/dist/instance-phase-dispatch.js +674 -0
  128. package/dist/instance-phase-dispatch.js.map +1 -0
  129. package/dist/instance-poll-loop.d.ts +43 -0
  130. package/dist/instance-poll-loop.d.ts.map +1 -0
  131. package/dist/instance-poll-loop.js +360 -0
  132. package/dist/instance-poll-loop.js.map +1 -0
  133. package/dist/instance-state-machine.d.ts +52 -0
  134. package/dist/instance-state-machine.d.ts.map +1 -0
  135. package/dist/instance-state-machine.js +235 -0
  136. package/dist/instance-state-machine.js.map +1 -0
  137. package/dist/log-manager.d.ts +28 -0
  138. package/dist/log-manager.d.ts.map +1 -0
  139. package/dist/log-manager.js +71 -0
  140. package/dist/log-manager.js.map +1 -0
  141. package/dist/pipeline-evaluator.d.ts +61 -0
  142. package/dist/pipeline-evaluator.d.ts.map +1 -0
  143. package/dist/pipeline-evaluator.js +107 -0
  144. package/dist/pipeline-evaluator.js.map +1 -0
  145. package/dist/pipeline-metrics.d.ts +52 -0
  146. package/dist/pipeline-metrics.d.ts.map +1 -0
  147. package/dist/pipeline-metrics.js +40 -0
  148. package/dist/pipeline-metrics.js.map +1 -0
  149. package/dist/pipeline-traversal.d.ts +43 -0
  150. package/dist/pipeline-traversal.d.ts.map +1 -0
  151. package/dist/pipeline-traversal.js +68 -0
  152. package/dist/pipeline-traversal.js.map +1 -0
  153. package/dist/plan-parser.d.ts +76 -0
  154. package/dist/plan-parser.d.ts.map +1 -0
  155. package/dist/plan-parser.js +223 -0
  156. package/dist/plan-parser.js.map +1 -0
  157. package/dist/planning-phase.d.ts +52 -0
  158. package/dist/planning-phase.d.ts.map +1 -0
  159. package/dist/planning-phase.js +444 -0
  160. package/dist/planning-phase.js.map +1 -0
  161. package/dist/planning-prompt.d.ts +64 -0
  162. package/dist/planning-prompt.d.ts.map +1 -0
  163. package/dist/planning-prompt.js +251 -0
  164. package/dist/planning-prompt.js.map +1 -0
  165. package/dist/planning.d.ts +16 -0
  166. package/dist/planning.d.ts.map +1 -0
  167. package/dist/planning.js +17 -0
  168. package/dist/planning.js.map +1 -0
  169. package/dist/process-runner.d.ts +41 -0
  170. package/dist/process-runner.d.ts.map +1 -0
  171. package/dist/process-runner.js +81 -0
  172. package/dist/process-runner.js.map +1 -0
  173. package/dist/product-config.d.ts +34 -0
  174. package/dist/product-config.d.ts.map +1 -0
  175. package/dist/product-config.js +43 -0
  176. package/dist/product-config.js.map +1 -0
  177. package/dist/queries/cycle-evaluations.d.ts +23 -0
  178. package/dist/queries/cycle-evaluations.d.ts.map +1 -0
  179. package/dist/queries/cycle-evaluations.js +37 -0
  180. package/dist/queries/cycle-evaluations.js.map +1 -0
  181. package/dist/queries/escalations.d.ts +30 -0
  182. package/dist/queries/escalations.d.ts.map +1 -0
  183. package/dist/queries/escalations.js +42 -0
  184. package/dist/queries/escalations.js.map +1 -0
  185. package/dist/queries/execution-units.d.ts +76 -0
  186. package/dist/queries/execution-units.d.ts.map +1 -0
  187. package/dist/queries/execution-units.js +109 -0
  188. package/dist/queries/execution-units.js.map +1 -0
  189. package/dist/queries/gate-results.d.ts +32 -0
  190. package/dist/queries/gate-results.d.ts.map +1 -0
  191. package/dist/queries/gate-results.js +44 -0
  192. package/dist/queries/gate-results.js.map +1 -0
  193. package/dist/queries/instances.d.ts +51 -0
  194. package/dist/queries/instances.d.ts.map +1 -0
  195. package/dist/queries/instances.js +77 -0
  196. package/dist/queries/instances.js.map +1 -0
  197. package/dist/queries/sessions.d.ts +50 -0
  198. package/dist/queries/sessions.d.ts.map +1 -0
  199. package/dist/queries/sessions.js +81 -0
  200. package/dist/queries/sessions.js.map +1 -0
  201. package/dist/queries/shared.d.ts +38 -0
  202. package/dist/queries/shared.d.ts.map +1 -0
  203. package/dist/queries/shared.js +119 -0
  204. package/dist/queries/shared.js.map +1 -0
  205. package/dist/queries/specs.d.ts +12 -0
  206. package/dist/queries/specs.d.ts.map +1 -0
  207. package/dist/queries/specs.js +21 -0
  208. package/dist/queries/specs.js.map +1 -0
  209. package/dist/queries/strategies.d.ts +14 -0
  210. package/dist/queries/strategies.d.ts.map +1 -0
  211. package/dist/queries/strategies.js +18 -0
  212. package/dist/queries/strategies.js.map +1 -0
  213. package/dist/queries/work-units.d.ts +42 -0
  214. package/dist/queries/work-units.d.ts.map +1 -0
  215. package/dist/queries/work-units.js +57 -0
  216. package/dist/queries/work-units.js.map +1 -0
  217. package/dist/queries/workflows.d.ts +29 -0
  218. package/dist/queries/workflows.d.ts.map +1 -0
  219. package/dist/queries/workflows.js +103 -0
  220. package/dist/queries/workflows.js.map +1 -0
  221. package/dist/remediation-units.d.ts +40 -0
  222. package/dist/remediation-units.d.ts.map +1 -0
  223. package/dist/remediation-units.js +263 -0
  224. package/dist/remediation-units.js.map +1 -0
  225. package/dist/replanning.d.ts +72 -0
  226. package/dist/replanning.d.ts.map +1 -0
  227. package/dist/replanning.js +403 -0
  228. package/dist/replanning.js.map +1 -0
  229. package/dist/resource-limits.d.ts +62 -0
  230. package/dist/resource-limits.d.ts.map +1 -0
  231. package/dist/resource-limits.js +322 -0
  232. package/dist/resource-limits.js.map +1 -0
  233. package/dist/scheduler.d.ts +98 -0
  234. package/dist/scheduler.d.ts.map +1 -0
  235. package/dist/scheduler.js +203 -0
  236. package/dist/scheduler.js.map +1 -0
  237. package/dist/session-adapter.d.ts +89 -0
  238. package/dist/session-adapter.d.ts.map +1 -0
  239. package/dist/session-adapter.js +108 -0
  240. package/dist/session-adapter.js.map +1 -0
  241. package/dist/sop-generator.d.ts +29 -0
  242. package/dist/sop-generator.d.ts.map +1 -0
  243. package/dist/sop-generator.js +235 -0
  244. package/dist/sop-generator.js.map +1 -0
  245. package/dist/spec-profiles.d.ts +41 -0
  246. package/dist/spec-profiles.d.ts.map +1 -0
  247. package/dist/spec-profiles.js +131 -0
  248. package/dist/spec-profiles.js.map +1 -0
  249. package/dist/strategy-design-graph.d.ts +23 -0
  250. package/dist/strategy-design-graph.d.ts.map +1 -0
  251. package/dist/strategy-design-graph.js +205 -0
  252. package/dist/strategy-design-graph.js.map +1 -0
  253. package/dist/strategy-design-prompt.d.ts +28 -0
  254. package/dist/strategy-design-prompt.d.ts.map +1 -0
  255. package/dist/strategy-design-prompt.js +108 -0
  256. package/dist/strategy-design-prompt.js.map +1 -0
  257. package/dist/strategy-design-schema.d.ts +767 -0
  258. package/dist/strategy-design-schema.d.ts.map +1 -0
  259. package/dist/strategy-design-schema.js +126 -0
  260. package/dist/strategy-design-schema.js.map +1 -0
  261. package/dist/strategy-design.d.ts +69 -0
  262. package/dist/strategy-design.d.ts.map +1 -0
  263. package/dist/strategy-design.js +411 -0
  264. package/dist/strategy-design.js.map +1 -0
  265. package/dist/strategy-gating.d.ts +31 -0
  266. package/dist/strategy-gating.d.ts.map +1 -0
  267. package/dist/strategy-gating.js +276 -0
  268. package/dist/strategy-gating.js.map +1 -0
  269. package/dist/team-prompt-builder.d.ts +47 -0
  270. package/dist/team-prompt-builder.d.ts.map +1 -0
  271. package/dist/team-prompt-builder.js +362 -0
  272. package/dist/team-prompt-builder.js.map +1 -0
  273. package/dist/trace-engine.d.ts +40 -0
  274. package/dist/trace-engine.d.ts.map +1 -0
  275. package/dist/trace-engine.js +344 -0
  276. package/dist/trace-engine.js.map +1 -0
  277. package/dist/types.d.ts +612 -0
  278. package/dist/types.d.ts.map +1 -0
  279. package/dist/types.js +9 -0
  280. package/dist/types.js.map +1 -0
  281. package/dist/unit-session-lifecycle.d.ts +78 -0
  282. package/dist/unit-session-lifecycle.d.ts.map +1 -0
  283. package/dist/unit-session-lifecycle.js +141 -0
  284. package/dist/unit-session-lifecycle.js.map +1 -0
  285. package/dist/unit-session.d.ts +30 -0
  286. package/dist/unit-session.d.ts.map +1 -0
  287. package/dist/unit-session.js +370 -0
  288. package/dist/unit-session.js.map +1 -0
  289. package/dist/watchdogs.d.ts +33 -0
  290. package/dist/watchdogs.d.ts.map +1 -0
  291. package/dist/watchdogs.js +170 -0
  292. package/dist/watchdogs.js.map +1 -0
  293. package/dist/work-unit-scheduler.d.ts +34 -0
  294. package/dist/work-unit-scheduler.d.ts.map +1 -0
  295. package/dist/work-unit-scheduler.js +91 -0
  296. package/dist/work-unit-scheduler.js.map +1 -0
  297. package/dist/workflow-transition.d.ts +90 -0
  298. package/dist/workflow-transition.d.ts.map +1 -0
  299. package/dist/workflow-transition.js +340 -0
  300. package/dist/workflow-transition.js.map +1 -0
  301. package/package.json +65 -0
@@ -0,0 +1,366 @@
1
+ /**
2
+ * Factory instance completion detection and gap evaluation.
3
+ *
4
+ * Handles the checkInstanceCompletion flow (strategy-level terminal detection,
5
+ * pipeline advance logic) and the runCompletionSequence flow (completion gate,
6
+ * report generation, finalization).
7
+ *
8
+ * Imports from instance-state-machine (leaf) but NOT from instance-poll-loop
9
+ * or instance-phase-dispatch, so no circular dependencies.
10
+ */
11
+ import { updateInstanceStatus } from './queries/instances.js';
12
+ import { getInstanceWorkUnits } from './queries/work-units.js';
13
+ import { deleteExecutionUnitsByInstance } from './queries/execution-units.js';
14
+ import { createCycleEvaluation } from './queries/cycle-evaluations.js';
15
+ import { createFactoryEscalation } from './queries/escalations.js';
16
+ import { updateSpecCompletionSummary } from './queries/specs.js';
17
+ import { terminateAllUnits } from './unit-session.js';
18
+ import { detectCompletion } from './completion.js';
19
+ import { runCompletionGate } from './completion-gate.js';
20
+ import { generateCompletionReport } from './completion-report.js';
21
+ import { runReplanningPhase } from './replanning.js';
22
+ import { releaseUnitForStrategy } from './scheduler.js';
23
+ import { updateStrategyExecutionStatus } from './queries/strategies.js';
24
+ import { escalateOrFail, TRIGGER_RESOURCE_LIMIT_EXCEEDED, } from './escalation.js';
25
+ import { advancePipeline, usesPipeline, getNodeLabel } from './pipeline-traversal.js';
26
+ import { collectMetrics } from './pipeline-metrics.js';
27
+ import { transitionInstanceStatus, handleInstanceFailure } from './instance-state-machine.js';
28
+ // ============================================================================
29
+ // Constants
30
+ // ============================================================================
31
+ /** Safety ceiling for instance iterations when blueprint has no limit configured. */
32
+ const DEFAULT_MAX_INSTANCE_ITERATIONS = 10;
33
+ // ============================================================================
34
+ // Strategy completion detection
35
+ // ============================================================================
36
+ /**
37
+ * Detect strategies where all work units have reached a terminal state.
38
+ *
39
+ * For each in_progress or gate_fix_pending strategy, if all its work units
40
+ * are completed or failed, transition the strategy to the appropriate next state.
41
+ */
42
+ export async function detectStrategyCompletion(state) {
43
+ let strategies;
44
+ try {
45
+ const { getStrategiesByFactoryInstance } = await import('./strategy-design.js');
46
+ strategies = await getStrategiesByFactoryInstance(state.instanceId);
47
+ }
48
+ catch {
49
+ return;
50
+ }
51
+ if (strategies.length === 0)
52
+ return;
53
+ const workUnits = await getInstanceWorkUnits(state.instanceId);
54
+ const unitsByStrategy = new Map();
55
+ for (const unit of workUnits) {
56
+ // Infrastructure-owned units are resolved by the engine, not agents --
57
+ // exclude them from strategy completion detection.
58
+ if (unit.strategyId && !unit.infrastructureOwned) {
59
+ const list = unitsByStrategy.get(unit.strategyId);
60
+ if (list)
61
+ list.push(unit);
62
+ else
63
+ unitsByStrategy.set(unit.strategyId, [unit]);
64
+ }
65
+ }
66
+ for (const strategy of strategies) {
67
+ if (strategy.executionStatus !== 'in_progress' && strategy.executionStatus !== 'gate_fix_pending')
68
+ continue;
69
+ const strategyUnits = unitsByStrategy.get(strategy.id);
70
+ if (!strategyUnits || strategyUnits.length === 0)
71
+ continue;
72
+ const allTerminal = strategyUnits.every((u) => u.status === 'completed' || u.status === 'failed');
73
+ if (!allTerminal)
74
+ continue;
75
+ const failedUnits = strategyUnits.filter((u) => u.status === 'failed');
76
+ try {
77
+ if (failedUnits.length > 0) {
78
+ await updateStrategyExecutionStatus(strategy.id, 'failed', { gateFixStartedAt: null });
79
+ console.log(`[factory] Strategy "${strategy.name}" -> failed ` +
80
+ `(${failedUnits.length}/${strategyUnits.length} work units failed)`);
81
+ // Release the execution unit back to idle
82
+ try {
83
+ await releaseUnitForStrategy(state, strategy.id);
84
+ }
85
+ catch {
86
+ // Best effort
87
+ }
88
+ }
89
+ else {
90
+ const isReEvaluation = strategy.executionStatus === 'gate_fix_pending';
91
+ // Clear gate_fix_started_at when leaving gate_fix_pending
92
+ await updateStrategyExecutionStatus(strategy.id, 'gating_deterministic', {
93
+ gateFixStartedAt: null,
94
+ });
95
+ console.log(`[factory] Strategy "${strategy.name}" -> gating_deterministic ` +
96
+ (isReEvaluation
97
+ ? `(re-evaluation after gate fix)`
98
+ : `(${strategyUnits.length}/${strategyUnits.length} work units done, gates pending)`));
99
+ }
100
+ }
101
+ catch (err) {
102
+ console.warn(`[factory] Failed to update strategy ${strategy.id} status:`, err.message);
103
+ }
104
+ }
105
+ }
106
+ // ============================================================================
107
+ // Instance completion check
108
+ // ============================================================================
109
+ /**
110
+ * Check whether the instance has completed (all strategies terminal).
111
+ *
112
+ * If all strategies are completed or failed, finalize the instance.
113
+ * Uses strategy-level completion (not work-unit level) for DAG-aware instances.
114
+ *
115
+ * The `runDesigningFn` and `runPlanningFn` callbacks allow the poll loop
116
+ * to inject the phase dispatch functions without creating a circular import.
117
+ */
118
+ export async function checkInstanceCompletion(state, config, runDesigningFn, runPlanningFn) {
119
+ if (!config)
120
+ return;
121
+ if (state.status !== 'building')
122
+ return;
123
+ let strategies;
124
+ try {
125
+ const { getStrategiesByFactoryInstance } = await import('./strategy-design.js');
126
+ strategies = await getStrategiesByFactoryInstance(state.instanceId);
127
+ }
128
+ catch {
129
+ return;
130
+ }
131
+ if (strategies.length === 0)
132
+ return;
133
+ const allTerminal = strategies.every((s) => s.executionStatus === 'completed' || s.executionStatus === 'failed');
134
+ if (!allTerminal)
135
+ return;
136
+ const failedStrategies = strategies.filter((s) => s.executionStatus === 'failed');
137
+ // When all strategies succeeded and the instance uses a pipeline graph,
138
+ // attempt to advance to the next pipeline node instead of completing.
139
+ if (failedStrategies.length === 0 && usesPipeline(state)) {
140
+ const handled = await handlePipelineAdvance(state, runDesigningFn, runPlanningFn);
141
+ if (handled)
142
+ return;
143
+ }
144
+ // Terminate any still-running units
145
+ terminateAllUnits(state);
146
+ if (failedStrategies.length > 0) {
147
+ console.log(`[factory] All strategies terminal. ${failedStrategies.length} failed -- marking instance failed.`);
148
+ state.status = 'failed';
149
+ }
150
+ else {
151
+ console.log(`[factory] All strategies completed -- marking instance completed.`);
152
+ state.status = 'completed';
153
+ }
154
+ // Completion gate + report + workflow transition
155
+ if (state.status === 'completed') {
156
+ await runCompletionSequence(state, config);
157
+ }
158
+ else {
159
+ await transitionInstanceStatus(state, 'failed', 'All strategies failed or no progress possible');
160
+ }
161
+ }
162
+ /**
163
+ * Handle pipeline node advancement after all strategies complete successfully.
164
+ *
165
+ * Returns true if the pipeline was advanced (or paused/escalated), meaning the
166
+ * caller should return early. Returns false to fall through to normal completion.
167
+ */
168
+ async function handlePipelineAdvance(state, runDesigningFn, runPlanningFn) {
169
+ const workUnits = await getInstanceWorkUnits(state.instanceId);
170
+ const completedUnits = workUnits.filter((u) => u.status === 'completed');
171
+ const wallClockMs = state.startedAt ? Date.now() - state.startedAt.getTime() : 0;
172
+ const metrics = collectMetrics({
173
+ cycleCount: state.completionGateIterations,
174
+ deliveryCompletionPct: workUnits.length > 0
175
+ ? (completedUnits.length / workUnits.length) * 100
176
+ : 0,
177
+ wallClockMinutes: wallClockMs / 60_000,
178
+ });
179
+ const advanceResult = advancePipeline(state, metrics);
180
+ switch (advanceResult.outcome) {
181
+ case 'advanced':
182
+ return handlePipelineNodeTransition(state, advanceResult.nextNodeId, runDesigningFn, runPlanningFn);
183
+ case 'completed':
184
+ console.log(`[factory] Pipeline completed at terminal node for instance ${state.instanceId}`);
185
+ return false;
186
+ case 'no_match': {
187
+ terminateAllUnits(state);
188
+ const nodeLabel = getNodeLabel(state.pipelineGraph, state.currentPipelineNodeId);
189
+ console.warn(`[factory] Pipeline stuck: no edge conditions matched at node "${nodeLabel}" ` +
190
+ `for instance ${state.instanceId}. Escalating.`);
191
+ await createFactoryEscalation(state.instanceId, `Pipeline stuck at node "${nodeLabel}": no outgoing edge conditions matched`, `Review pipeline edge conditions for node "${nodeLabel}" and either ` +
192
+ `add a fallback edge or manually advance the instance.`);
193
+ state.status = 'paused';
194
+ await updateInstanceStatus(state.instanceId, 'paused');
195
+ return true;
196
+ }
197
+ default:
198
+ return false;
199
+ }
200
+ }
201
+ /**
202
+ * Transition the instance to a new pipeline node after the pipeline evaluator
203
+ * determined the next node. Resets execution state and kicks off the
204
+ * appropriate phase (designing or planning based on node template type).
205
+ *
206
+ * Returns true (caller should return early) unless the next node is terminal.
207
+ */
208
+ async function handlePipelineNodeTransition(state, nextNodeId, runDesigningFn, runPlanningFn) {
209
+ const nextNodeTemplateType = state.pipelineGraph.nodes.find((n) => n.id === nextNodeId)?.templateType;
210
+ // Terminal nodes are stop signals -- fall through to normal completion.
211
+ if (nextNodeTemplateType === 'terminal') {
212
+ const nodeLabel = getNodeLabel(state.pipelineGraph, nextNodeId);
213
+ console.log(`[factory] Pipeline advanced to terminal node "${nodeLabel}" -- ` +
214
+ `completing instance ${state.instanceId}`);
215
+ return false;
216
+ }
217
+ // Reset execution state for the new pipeline node
218
+ terminateAllUnits(state);
219
+ await deleteExecutionUnitsByInstance(state.instanceId);
220
+ state.currentPipelineNodeId = nextNodeId;
221
+ state.executionUnits.clear();
222
+ state.completionGateIterations = 0;
223
+ const nodeLabel = getNodeLabel(state.pipelineGraph, nextNodeId);
224
+ // Engineering nodes skip strategy redesign -- go directly to planning.
225
+ if (nextNodeTemplateType === 'engineering') {
226
+ state.status = 'planning';
227
+ await updateInstanceStatus(state.instanceId, 'planning', {
228
+ currentPipelineNodeId: nextNodeId,
229
+ });
230
+ console.log(`[factory] Pipeline advanced to engineering node "${nodeLabel}" (${nextNodeId}) ` +
231
+ `-- skipping design, starting planning for instance ${state.instanceId}`);
232
+ runPlanningFn(state).catch((error) => {
233
+ console.error(`[factory] Planning failed for pipeline node "${nextNodeId}" ` +
234
+ `on instance ${state.instanceId}:`, error.message);
235
+ handleInstanceFailure(state, `Planning failed for pipeline node: ${error.message}`);
236
+ });
237
+ }
238
+ else {
239
+ state.status = 'designing';
240
+ await updateInstanceStatus(state.instanceId, 'designing', {
241
+ currentPipelineNodeId: nextNodeId,
242
+ });
243
+ console.log(`[factory] Pipeline advanced to node "${nodeLabel}" (${nextNodeId}) ` +
244
+ `for instance ${state.instanceId}`);
245
+ runDesigningFn(state).catch((error) => {
246
+ console.error(`[factory] Designing failed for pipeline node "${nextNodeId}" ` +
247
+ `on instance ${state.instanceId}:`, error.message);
248
+ handleInstanceFailure(state, `Designing failed for pipeline node: ${error.message}`);
249
+ });
250
+ }
251
+ return true;
252
+ }
253
+ // ============================================================================
254
+ // Completion sequence
255
+ // ============================================================================
256
+ /**
257
+ * Run the completion sequence: completion gate, report, workflow transition.
258
+ */
259
+ export async function runCompletionSequence(state, config, governor) {
260
+ if (!config)
261
+ return;
262
+ // Skip completion gate entirely when disabled -- proceed directly to completion
263
+ if (!state.blueprint.completionGateEnabled) {
264
+ console.log(`[factory] Completion gate disabled on blueprint -- skipping AI review, proceeding to completion`);
265
+ }
266
+ else {
267
+ const maxIterations = state.blueprint.maxInstanceIterations ?? DEFAULT_MAX_INSTANCE_ITERATIONS;
268
+ if (state.completionGateIterations < maxIterations) {
269
+ try {
270
+ const workUnits = await getInstanceWorkUnits(state.instanceId);
271
+ const gateResult = await runCompletionGate(state, config, workUnits, governor ?? null);
272
+ if (gateResult) {
273
+ try {
274
+ await createCycleEvaluation(state.instanceId, state.completionGateIterations + 1, gateResult);
275
+ }
276
+ catch (persistErr) {
277
+ console.warn(`[factory] Failed to persist cycle evaluation (non-fatal): ` +
278
+ `${persistErr instanceof Error ? persistErr.message : String(persistErr)}`);
279
+ }
280
+ }
281
+ if (gateResult && !gateResult.passed && gateResult.gaps.some((g) => g.severity === 'critical')) {
282
+ const replanResult = await runReplanningPhase(state, config, governor ?? null);
283
+ if (replanResult.success && replanResult.workUnitsCreated > 0) {
284
+ state.completionGateIterations++;
285
+ state.status = 'building';
286
+ await updateInstanceStatus(state.instanceId, 'building', {
287
+ completion_gate_iterations: state.completionGateIterations,
288
+ });
289
+ console.log(`[factory] Re-planning cycle ${state.completionGateIterations}: ` +
290
+ `${replanResult.workUnitsCreated} work unit(s) created from fresh context ` +
291
+ `(iteration ${state.completionGateIterations}/${maxIterations})`);
292
+ return;
293
+ }
294
+ if (!replanResult.success) {
295
+ const failReason = `Re-planning failed after completion gate found critical gaps: ${replanResult.error ?? 'unknown'}`;
296
+ await escalateOrFail(state, TRIGGER_RESOURCE_LIMIT_EXCEEDED, 'replanning_failed', failReason, () => transitionInstanceStatus(state, 'failed', `Re-planning failed: ${replanResult.error ?? 'unknown'}`));
297
+ return;
298
+ }
299
+ const noWorkReason = 'Re-planning succeeded but produced no work units despite critical gaps. ' +
300
+ 'The planner could not determine what additional work is needed.';
301
+ await escalateOrFail(state, TRIGGER_RESOURCE_LIMIT_EXCEEDED, 'replanning_no_work_units', noWorkReason, () => transitionInstanceStatus(state, 'failed', noWorkReason));
302
+ return;
303
+ }
304
+ state.completionGateIterations++;
305
+ await updateInstanceStatus(state.instanceId, 'building', {
306
+ completion_gate_iterations: state.completionGateIterations,
307
+ });
308
+ }
309
+ catch (err) {
310
+ console.warn(`[factory] Completion gate error (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
311
+ }
312
+ }
313
+ else if (state.completionGateIterations >= maxIterations) {
314
+ console.log(`[factory] Completion gate iteration limit reached (${maxIterations}) -- proceeding to completion`);
315
+ }
316
+ }
317
+ // Generate completion report
318
+ if (state.completionReport) {
319
+ console.log('[factory] Completion report already exists -- skipping regeneration');
320
+ }
321
+ else {
322
+ try {
323
+ const report = await generateCompletionReport(state, config, governor ?? null);
324
+ if (report) {
325
+ await updateInstanceStatus(state.instanceId, state.status, {
326
+ completionReport: report,
327
+ });
328
+ state.completionReport = report;
329
+ console.log(`[factory] Completion report generated: ${report.keep.length} keep, ` +
330
+ `${report.stop.length} stop, ${report.change.length} change items. ` +
331
+ `Spec quality: ${report.specQualityAssessment.overallScore}. ` +
332
+ `Strategy design: ${report.strategyDesignAssessment.overallScore}.`);
333
+ if (state.specId) {
334
+ const summary = {
335
+ specQualityOverallScore: report.specQualityAssessment.overallScore,
336
+ specQualityGaps: report.specQualityAssessment.gaps,
337
+ strategyDesignOverallScore: report.strategyDesignAssessment.overallScore,
338
+ changeItems: report.change,
339
+ keepItems: report.keep,
340
+ stopItems: report.stop,
341
+ executionMetrics: report.executionMetrics,
342
+ completedAt: new Date().toISOString(),
343
+ instanceId: state.instanceId,
344
+ };
345
+ updateSpecCompletionSummary(state.specId, summary).catch((cbErr) => {
346
+ console.warn(`[factory] Spec completion callback failed (non-fatal): ` +
347
+ `${cbErr instanceof Error ? cbErr.message : String(cbErr)}`);
348
+ });
349
+ }
350
+ }
351
+ else {
352
+ console.warn('[factory] Completion report generation returned null -- proceeding without report');
353
+ }
354
+ }
355
+ catch (reportErr) {
356
+ console.warn(`[factory] Completion report error (non-fatal): ${reportErr instanceof Error ? reportErr.message : String(reportErr)}`);
357
+ }
358
+ }
359
+ // Finalize
360
+ await transitionInstanceStatus(state, 'completed');
361
+ const completion = await detectCompletion(state.instanceId, config);
362
+ if (!completion.isComplete) {
363
+ state.status = 'building';
364
+ }
365
+ }
366
+ //# sourceMappingURL=instance-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-completion.js","sourceRoot":"","sources":["../src/instance-completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Factory instance lifecycle -- barrel re-export.
3
+ *
4
+ * The implementation has been split into focused modules:
5
+ * - instance-poll-loop.ts -- poll loop, instance discovery, active tracking
6
+ * - instance-phase-dispatch.ts -- phase handlers (designing, planning, building, gating)
7
+ * - instance-state-machine.ts -- workflow transitions, pause/resume, error handling
8
+ * - instance-completion.ts -- strategy/instance completion, gate evaluation, reports
9
+ *
10
+ * This file preserves the original import path for consumers (index.ts, factory-engine.ts).
11
+ */
12
+ export { startPollLoop, stopPollLoop, getActiveInstances, setShuttingDown, setFactoryGovernor, } from './instance-poll-loop.js';
13
+ export { handleInstanceFailure } from './instance-state-machine.js';
14
+ export { checkGateFixTimeouts } from './instance-phase-dispatch.js';
15
+ //# sourceMappingURL=instance-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-lifecycle.d.ts","sourceRoot":"","sources":["../src/instance-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Factory instance lifecycle -- barrel re-export.
3
+ *
4
+ * The implementation has been split into focused modules:
5
+ * - instance-poll-loop.ts -- poll loop, instance discovery, active tracking
6
+ * - instance-phase-dispatch.ts -- phase handlers (designing, planning, building, gating)
7
+ * - instance-state-machine.ts -- workflow transitions, pause/resume, error handling
8
+ * - instance-completion.ts -- strategy/instance completion, gate evaluation, reports
9
+ *
10
+ * This file preserves the original import path for consumers (index.ts, factory-engine.ts).
11
+ */
12
+ // Poll loop controls
13
+ export { startPollLoop, stopPollLoop, getActiveInstances, setShuttingDown, setFactoryGovernor, } from './instance-poll-loop.js';
14
+ // Error handling
15
+ export { handleInstanceFailure } from './instance-state-machine.js';
16
+ // Phase dispatch (checkGateFixTimeouts is consumed by factory-engine)
17
+ export { checkGateFixTimeouts } from './instance-phase-dispatch.js';
18
+ //# sourceMappingURL=instance-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-lifecycle.js","sourceRoot":"","sources":["../src/instance-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,qBAAqB;AACrB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,iBAAiB;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,sEAAsE;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Factory instance phase dispatch -- orchestrates designing, planning,
3
+ * building, and review phases.
4
+ *
5
+ * Contains the phase handler functions that drive instances through
6
+ * their lifecycle stages. Imports from instance-state-machine (leaf)
7
+ * and instance-completion, but NOT from instance-poll-loop.
8
+ */
9
+ import type { ResourceGovernor } from '@telora/daemon-core';
10
+ import type { FactoryConfig, FactoryInstanceState } from './types.js';
11
+ /**
12
+ * Set the module-level config for phase dispatch functions.
13
+ * Called by the poll loop when starting.
14
+ */
15
+ export declare function setPhaseDispatchConfig(factoryConfig: FactoryConfig): void;
16
+ /**
17
+ * Set the module-level governor for phase dispatch functions.
18
+ * Called by the poll loop when the governor is set.
19
+ */
20
+ export declare function setPhaseDispatchGovernor(gov: ResourceGovernor): void;
21
+ export declare function getCurrentNodeTemplateType(state: FactoryInstanceState): string | null;
22
+ /**
23
+ * Run the designing phase for an instance.
24
+ *
25
+ * Creates a git worktree, spawns Claude Code to decompose the specification
26
+ * into bounded strategies, validates and persists them, then transitions
27
+ * to "planning".
28
+ */
29
+ export declare function runDesigning(state: FactoryInstanceState): Promise<void>;
30
+ /**
31
+ * Execute the Review pipeline node.
32
+ *
33
+ * Review nodes skip the full design/plan/build cycle. Instead they:
34
+ * 1. Run the completion gate against all work produced so far
35
+ * 2. Use gap counts to populate pipeline edge metrics
36
+ * 3. Advance the pipeline (back to Engineering if gaps, to Done if clean)
37
+ * 4. Store gap details in state.reviewGaps so the next Engineering cycle
38
+ * can constrain its scope to closing those gaps only
39
+ */
40
+ export declare function runReviewGateAndAdvance(state: FactoryInstanceState): Promise<void>;
41
+ /**
42
+ * Run the planning phase for an instance.
43
+ *
44
+ * Creates a git worktree, spawns Claude Code to generate a work plan,
45
+ * validates and persists work units, then transitions to "building".
46
+ */
47
+ export declare function runPlanning(state: FactoryInstanceState): Promise<void>;
48
+ /**
49
+ * Check on an instance in the building phase.
50
+ *
51
+ * Runs resource limit checks, the DAG-aware scheduler to assign strategies
52
+ * to execution units, spawns sessions for newly assigned units, monitors
53
+ * running unit health, evaluates strategy-level gates, and checks for
54
+ * instance completion.
55
+ */
56
+ export declare function checkBuilding(state: FactoryInstanceState): Promise<void>;
57
+ /**
58
+ * Log a compact cycle summary showing execution unit and strategy states.
59
+ */
60
+ export declare function logCycleSummary(state: FactoryInstanceState): void;
61
+ /**
62
+ * Check for strategies stuck in gate_fix_pending past their timeout.
63
+ *
64
+ * For each gate_fix_pending strategy with a configured gate_fix_timeout_ms,
65
+ * checks whether gate_fix_started_at + timeout has elapsed. On timeout,
66
+ * transitions the strategy to failed, creates an escalation, and terminates
67
+ * the unit session.
68
+ *
69
+ * Also warns about orphaned gate_fix_pending strategies that have no live
70
+ * unit session (the scheduler may reassign, so we don't auto-fail).
71
+ */
72
+ /** @internal Exported for testing. */
73
+ export declare function checkGateFixTimeouts(state: FactoryInstanceState): Promise<void>;
74
+ export { recoverResumedInstance } from './instance-state-machine.js';
75
+ //# sourceMappingURL=instance-phase-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-phase-dispatch.d.ts","sourceRoot":"","sources":["../src/instance-phase-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EAErB,MAAM,YAAY,CAAC;AA4CpB;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,CAEzE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAEpE;AAMD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAIrF;AAMD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqG7E;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4KxF;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C5E;AA6ID;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuG9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAiBjE;AAuED;;;;;;;;;;GAUG;AACH,sCAAsC;AACtC,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyErF;AAMD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}