@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.
- package/dist/audit.d.ts +69 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +376 -0
- package/dist/audit.js.map +1 -0
- package/dist/builder-completion.d.ts +35 -0
- package/dist/builder-completion.d.ts.map +1 -0
- package/dist/builder-completion.js +375 -0
- package/dist/builder-completion.js.map +1 -0
- package/dist/builder-spawner.d.ts +40 -0
- package/dist/builder-spawner.d.ts.map +1 -0
- package/dist/builder-spawner.js +493 -0
- package/dist/builder-spawner.js.map +1 -0
- package/dist/completion-gate.d.ts +52 -0
- package/dist/completion-gate.d.ts.map +1 -0
- package/dist/completion-gate.js +336 -0
- package/dist/completion-gate.js.map +1 -0
- package/dist/completion-report.d.ts +36 -0
- package/dist/completion-report.d.ts.map +1 -0
- package/dist/completion-report.js +348 -0
- package/dist/completion-report.js.map +1 -0
- package/dist/completion.d.ts +58 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +287 -0
- package/dist/completion.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/context-manager.d.ts +152 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +421 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/crash-detection.d.ts +70 -0
- package/dist/crash-detection.d.ts.map +1 -0
- package/dist/crash-detection.js +123 -0
- package/dist/crash-detection.js.map +1 -0
- package/dist/crash-recovery.d.ts +83 -0
- package/dist/crash-recovery.d.ts.map +1 -0
- package/dist/crash-recovery.js +522 -0
- package/dist/crash-recovery.js.map +1 -0
- package/dist/crash-resolution.d.ts +34 -0
- package/dist/crash-resolution.d.ts.map +1 -0
- package/dist/crash-resolution.js +382 -0
- package/dist/crash-resolution.js.map +1 -0
- package/dist/escalation.d.ts +150 -0
- package/dist/escalation.d.ts.map +1 -0
- package/dist/escalation.js +352 -0
- package/dist/escalation.js.map +1 -0
- package/dist/execution-target.d.ts +31 -0
- package/dist/execution-target.d.ts.map +1 -0
- package/dist/execution-target.js +71 -0
- package/dist/execution-target.js.map +1 -0
- package/dist/execution-unit-init.d.ts +28 -0
- package/dist/execution-unit-init.d.ts.map +1 -0
- package/dist/execution-unit-init.js +115 -0
- package/dist/execution-unit-init.js.map +1 -0
- package/dist/execution.d.ts +17 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +20 -0
- package/dist/execution.js.map +1 -0
- package/dist/factory-engine.d.ts +100 -0
- package/dist/factory-engine.d.ts.map +1 -0
- package/dist/factory-engine.js +243 -0
- package/dist/factory-engine.js.map +1 -0
- package/dist/gap-detection.d.ts +43 -0
- package/dist/gap-detection.d.ts.map +1 -0
- package/dist/gap-detection.js +149 -0
- package/dist/gap-detection.js.map +1 -0
- package/dist/gate-context.d.ts +23 -0
- package/dist/gate-context.d.ts.map +1 -0
- package/dist/gate-context.js +63 -0
- package/dist/gate-context.js.map +1 -0
- package/dist/gate-engine.d.ts +55 -0
- package/dist/gate-engine.d.ts.map +1 -0
- package/dist/gate-engine.js +191 -0
- package/dist/gate-engine.js.map +1 -0
- package/dist/gates/adversarial.d.ts +59 -0
- package/dist/gates/adversarial.d.ts.map +1 -0
- package/dist/gates/adversarial.js +426 -0
- package/dist/gates/adversarial.js.map +1 -0
- package/dist/gates/adversary-spawner.d.ts +35 -0
- package/dist/gates/adversary-spawner.d.ts.map +1 -0
- package/dist/gates/adversary-spawner.js +286 -0
- package/dist/gates/adversary-spawner.js.map +1 -0
- package/dist/gates/adversary-test-dir.d.ts +41 -0
- package/dist/gates/adversary-test-dir.d.ts.map +1 -0
- package/dist/gates/adversary-test-dir.js +150 -0
- package/dist/gates/adversary-test-dir.js.map +1 -0
- package/dist/gates/behavioral-parser.d.ts +32 -0
- package/dist/gates/behavioral-parser.d.ts.map +1 -0
- package/dist/gates/behavioral-parser.js +190 -0
- package/dist/gates/behavioral-parser.js.map +1 -0
- package/dist/gates/behavioral-runner.d.ts +36 -0
- package/dist/gates/behavioral-runner.d.ts.map +1 -0
- package/dist/gates/behavioral-runner.js +306 -0
- package/dist/gates/behavioral-runner.js.map +1 -0
- package/dist/gates/behavioral.d.ts +37 -0
- package/dist/gates/behavioral.d.ts.map +1 -0
- package/dist/gates/behavioral.js +485 -0
- package/dist/gates/behavioral.js.map +1 -0
- package/dist/gates/deterministic.d.ts +24 -0
- package/dist/gates/deterministic.d.ts.map +1 -0
- package/dist/gates/deterministic.js +186 -0
- package/dist/gates/deterministic.js.map +1 -0
- package/dist/git-factory.d.ts +59 -0
- package/dist/git-factory.d.ts.map +1 -0
- package/dist/git-factory.js +102 -0
- package/dist/git-factory.js.map +1 -0
- package/dist/guard-evaluation.d.ts +48 -0
- package/dist/guard-evaluation.d.ts.map +1 -0
- package/dist/guard-evaluation.js +416 -0
- package/dist/guard-evaluation.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/instance-completion.d.ts +34 -0
- package/dist/instance-completion.d.ts.map +1 -0
- package/dist/instance-completion.js +366 -0
- package/dist/instance-completion.js.map +1 -0
- package/dist/instance-lifecycle.d.ts +15 -0
- package/dist/instance-lifecycle.d.ts.map +1 -0
- package/dist/instance-lifecycle.js +18 -0
- package/dist/instance-lifecycle.js.map +1 -0
- package/dist/instance-phase-dispatch.d.ts +75 -0
- package/dist/instance-phase-dispatch.d.ts.map +1 -0
- package/dist/instance-phase-dispatch.js +674 -0
- package/dist/instance-phase-dispatch.js.map +1 -0
- package/dist/instance-poll-loop.d.ts +43 -0
- package/dist/instance-poll-loop.d.ts.map +1 -0
- package/dist/instance-poll-loop.js +360 -0
- package/dist/instance-poll-loop.js.map +1 -0
- package/dist/instance-state-machine.d.ts +52 -0
- package/dist/instance-state-machine.d.ts.map +1 -0
- package/dist/instance-state-machine.js +235 -0
- package/dist/instance-state-machine.js.map +1 -0
- package/dist/log-manager.d.ts +28 -0
- package/dist/log-manager.d.ts.map +1 -0
- package/dist/log-manager.js +71 -0
- package/dist/log-manager.js.map +1 -0
- package/dist/pipeline-evaluator.d.ts +61 -0
- package/dist/pipeline-evaluator.d.ts.map +1 -0
- package/dist/pipeline-evaluator.js +107 -0
- package/dist/pipeline-evaluator.js.map +1 -0
- package/dist/pipeline-metrics.d.ts +52 -0
- package/dist/pipeline-metrics.d.ts.map +1 -0
- package/dist/pipeline-metrics.js +40 -0
- package/dist/pipeline-metrics.js.map +1 -0
- package/dist/pipeline-traversal.d.ts +43 -0
- package/dist/pipeline-traversal.d.ts.map +1 -0
- package/dist/pipeline-traversal.js +68 -0
- package/dist/pipeline-traversal.js.map +1 -0
- package/dist/plan-parser.d.ts +76 -0
- package/dist/plan-parser.d.ts.map +1 -0
- package/dist/plan-parser.js +223 -0
- package/dist/plan-parser.js.map +1 -0
- package/dist/planning-phase.d.ts +52 -0
- package/dist/planning-phase.d.ts.map +1 -0
- package/dist/planning-phase.js +444 -0
- package/dist/planning-phase.js.map +1 -0
- package/dist/planning-prompt.d.ts +64 -0
- package/dist/planning-prompt.d.ts.map +1 -0
- package/dist/planning-prompt.js +251 -0
- package/dist/planning-prompt.js.map +1 -0
- package/dist/planning.d.ts +16 -0
- package/dist/planning.d.ts.map +1 -0
- package/dist/planning.js +17 -0
- package/dist/planning.js.map +1 -0
- package/dist/process-runner.d.ts +41 -0
- package/dist/process-runner.d.ts.map +1 -0
- package/dist/process-runner.js +81 -0
- package/dist/process-runner.js.map +1 -0
- package/dist/product-config.d.ts +34 -0
- package/dist/product-config.d.ts.map +1 -0
- package/dist/product-config.js +43 -0
- package/dist/product-config.js.map +1 -0
- package/dist/queries/cycle-evaluations.d.ts +23 -0
- package/dist/queries/cycle-evaluations.d.ts.map +1 -0
- package/dist/queries/cycle-evaluations.js +37 -0
- package/dist/queries/cycle-evaluations.js.map +1 -0
- package/dist/queries/escalations.d.ts +30 -0
- package/dist/queries/escalations.d.ts.map +1 -0
- package/dist/queries/escalations.js +42 -0
- package/dist/queries/escalations.js.map +1 -0
- package/dist/queries/execution-units.d.ts +76 -0
- package/dist/queries/execution-units.d.ts.map +1 -0
- package/dist/queries/execution-units.js +109 -0
- package/dist/queries/execution-units.js.map +1 -0
- package/dist/queries/gate-results.d.ts +32 -0
- package/dist/queries/gate-results.d.ts.map +1 -0
- package/dist/queries/gate-results.js +44 -0
- package/dist/queries/gate-results.js.map +1 -0
- package/dist/queries/instances.d.ts +51 -0
- package/dist/queries/instances.d.ts.map +1 -0
- package/dist/queries/instances.js +77 -0
- package/dist/queries/instances.js.map +1 -0
- package/dist/queries/sessions.d.ts +50 -0
- package/dist/queries/sessions.d.ts.map +1 -0
- package/dist/queries/sessions.js +81 -0
- package/dist/queries/sessions.js.map +1 -0
- package/dist/queries/shared.d.ts +38 -0
- package/dist/queries/shared.d.ts.map +1 -0
- package/dist/queries/shared.js +119 -0
- package/dist/queries/shared.js.map +1 -0
- package/dist/queries/specs.d.ts +12 -0
- package/dist/queries/specs.d.ts.map +1 -0
- package/dist/queries/specs.js +21 -0
- package/dist/queries/specs.js.map +1 -0
- package/dist/queries/strategies.d.ts +14 -0
- package/dist/queries/strategies.d.ts.map +1 -0
- package/dist/queries/strategies.js +18 -0
- package/dist/queries/strategies.js.map +1 -0
- package/dist/queries/work-units.d.ts +42 -0
- package/dist/queries/work-units.d.ts.map +1 -0
- package/dist/queries/work-units.js +57 -0
- package/dist/queries/work-units.js.map +1 -0
- package/dist/queries/workflows.d.ts +29 -0
- package/dist/queries/workflows.d.ts.map +1 -0
- package/dist/queries/workflows.js +103 -0
- package/dist/queries/workflows.js.map +1 -0
- package/dist/remediation-units.d.ts +40 -0
- package/dist/remediation-units.d.ts.map +1 -0
- package/dist/remediation-units.js +263 -0
- package/dist/remediation-units.js.map +1 -0
- package/dist/replanning.d.ts +72 -0
- package/dist/replanning.d.ts.map +1 -0
- package/dist/replanning.js +403 -0
- package/dist/replanning.js.map +1 -0
- package/dist/resource-limits.d.ts +62 -0
- package/dist/resource-limits.d.ts.map +1 -0
- package/dist/resource-limits.js +322 -0
- package/dist/resource-limits.js.map +1 -0
- package/dist/scheduler.d.ts +98 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +203 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/session-adapter.d.ts +89 -0
- package/dist/session-adapter.d.ts.map +1 -0
- package/dist/session-adapter.js +108 -0
- package/dist/session-adapter.js.map +1 -0
- package/dist/sop-generator.d.ts +29 -0
- package/dist/sop-generator.d.ts.map +1 -0
- package/dist/sop-generator.js +235 -0
- package/dist/sop-generator.js.map +1 -0
- package/dist/spec-profiles.d.ts +41 -0
- package/dist/spec-profiles.d.ts.map +1 -0
- package/dist/spec-profiles.js +131 -0
- package/dist/spec-profiles.js.map +1 -0
- package/dist/strategy-design-graph.d.ts +23 -0
- package/dist/strategy-design-graph.d.ts.map +1 -0
- package/dist/strategy-design-graph.js +205 -0
- package/dist/strategy-design-graph.js.map +1 -0
- package/dist/strategy-design-prompt.d.ts +28 -0
- package/dist/strategy-design-prompt.d.ts.map +1 -0
- package/dist/strategy-design-prompt.js +108 -0
- package/dist/strategy-design-prompt.js.map +1 -0
- package/dist/strategy-design-schema.d.ts +767 -0
- package/dist/strategy-design-schema.d.ts.map +1 -0
- package/dist/strategy-design-schema.js +126 -0
- package/dist/strategy-design-schema.js.map +1 -0
- package/dist/strategy-design.d.ts +69 -0
- package/dist/strategy-design.d.ts.map +1 -0
- package/dist/strategy-design.js +411 -0
- package/dist/strategy-design.js.map +1 -0
- package/dist/strategy-gating.d.ts +31 -0
- package/dist/strategy-gating.d.ts.map +1 -0
- package/dist/strategy-gating.js +276 -0
- package/dist/strategy-gating.js.map +1 -0
- package/dist/team-prompt-builder.d.ts +47 -0
- package/dist/team-prompt-builder.d.ts.map +1 -0
- package/dist/team-prompt-builder.js +362 -0
- package/dist/team-prompt-builder.js.map +1 -0
- package/dist/trace-engine.d.ts +40 -0
- package/dist/trace-engine.d.ts.map +1 -0
- package/dist/trace-engine.js +344 -0
- package/dist/trace-engine.js.map +1 -0
- package/dist/types.d.ts +612 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/unit-session-lifecycle.d.ts +78 -0
- package/dist/unit-session-lifecycle.d.ts.map +1 -0
- package/dist/unit-session-lifecycle.js +141 -0
- package/dist/unit-session-lifecycle.js.map +1 -0
- package/dist/unit-session.d.ts +30 -0
- package/dist/unit-session.d.ts.map +1 -0
- package/dist/unit-session.js +370 -0
- package/dist/unit-session.js.map +1 -0
- package/dist/watchdogs.d.ts +33 -0
- package/dist/watchdogs.d.ts.map +1 -0
- package/dist/watchdogs.js +170 -0
- package/dist/watchdogs.js.map +1 -0
- package/dist/work-unit-scheduler.d.ts +34 -0
- package/dist/work-unit-scheduler.d.ts.map +1 -0
- package/dist/work-unit-scheduler.js +91 -0
- package/dist/work-unit-scheduler.js.map +1 -0
- package/dist/workflow-transition.d.ts +90 -0
- package/dist/workflow-transition.d.ts.map +1 -0
- package/dist/workflow-transition.js +340 -0
- package/dist/workflow-transition.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builder completion handling and main execution cycle.
|
|
3
|
+
*
|
|
4
|
+
* Handles builder session completion (token accounting, status transitions),
|
|
5
|
+
* and orchestrates the main execution cycle that finds ready work units,
|
|
6
|
+
* spawns builders, tracks strategy progress, and detects global completion.
|
|
7
|
+
*
|
|
8
|
+
* Extracted from execution.ts for focused module boundaries.
|
|
9
|
+
*/
|
|
10
|
+
import { getInstanceWorkUnits, updateWorkUnitStatus } from './queries/work-units.js';
|
|
11
|
+
import { updateFactorySession } from './queries/sessions.js';
|
|
12
|
+
import { updateInstanceStatus } from './queries/instances.js';
|
|
13
|
+
import { updateStrategyExecutionStatus } from './queries/strategies.js';
|
|
14
|
+
import { findReadyWorkUnits } from './work-unit-scheduler.js';
|
|
15
|
+
import { spawnBuilder, transitionWorkUnitStatus, lastGateOutputByWorkUnit, LOG_PREFIX, } from './builder-spawner.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Builder completion handling
|
|
18
|
+
// ============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Handle builder session completion.
|
|
21
|
+
*
|
|
22
|
+
* Routes the result through the gate engine (stubbed for now), then:
|
|
23
|
+
* - On gate pass: marks work unit completed, unblocks dependents
|
|
24
|
+
* - On gate fail + retries remaining: feeds output back, increments iteration
|
|
25
|
+
* - On gate fail + retries exhausted: marks work unit failed, escalates
|
|
26
|
+
*/
|
|
27
|
+
export async function handleBuilderCompletion(builder, exitCode, state, _config, _governor) {
|
|
28
|
+
const { workUnitId, sessionId } = builder;
|
|
29
|
+
// Remove from active builders map
|
|
30
|
+
state.activeBuilderSessions.delete(workUnitId);
|
|
31
|
+
// Build session update fields including token usage
|
|
32
|
+
const sessionStatus = exitCode === 0 ? 'completed' : 'failed';
|
|
33
|
+
const sessionFields = {
|
|
34
|
+
status: sessionStatus,
|
|
35
|
+
endedAt: new Date().toISOString(),
|
|
36
|
+
};
|
|
37
|
+
// Persist token usage from the stream-json parser (TEL-4)
|
|
38
|
+
if (builder.tokenUsage) {
|
|
39
|
+
const tokenCount = builder.tokenUsage.inputTokens + builder.tokenUsage.outputTokens;
|
|
40
|
+
sessionFields.tokenCount = tokenCount;
|
|
41
|
+
if (builder.tokenUsage.totalCostUsd !== null) {
|
|
42
|
+
sessionFields.costEstimate = builder.tokenUsage.totalCostUsd;
|
|
43
|
+
}
|
|
44
|
+
console.log(`${LOG_PREFIX} Builder for work unit ${workUnitId} used ` +
|
|
45
|
+
`${tokenCount} tokens (input: ${builder.tokenUsage.inputTokens}, ` +
|
|
46
|
+
`output: ${builder.tokenUsage.outputTokens}` +
|
|
47
|
+
`${builder.tokenUsage.totalCostUsd !== null ? `, cost: $${builder.tokenUsage.totalCostUsd.toFixed(4)}` : ''})`);
|
|
48
|
+
}
|
|
49
|
+
await updateFactorySession(sessionId, sessionFields);
|
|
50
|
+
// Aggregate session tokens and cost into instance-level totals
|
|
51
|
+
if (builder.tokenUsage) {
|
|
52
|
+
const sessionTokens = builder.tokenUsage.inputTokens + builder.tokenUsage.outputTokens;
|
|
53
|
+
state.tokensUsed += sessionTokens;
|
|
54
|
+
if (builder.tokenUsage.totalCostUsd !== null) {
|
|
55
|
+
state.costUsed += builder.tokenUsage.totalCostUsd;
|
|
56
|
+
}
|
|
57
|
+
await updateInstanceStatus(state.instanceId, state.status, {
|
|
58
|
+
tokensUsed: state.tokensUsed,
|
|
59
|
+
costUsed: state.costUsed,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
console.log(`${LOG_PREFIX} Builder for work unit ${workUnitId} exited ` +
|
|
63
|
+
`(code: ${exitCode}, session: ${sessionId})`);
|
|
64
|
+
// If builder crashed (non-zero exit), treat as gate failure
|
|
65
|
+
if (exitCode !== 0) {
|
|
66
|
+
console.warn(`${LOG_PREFIX} Builder exited with non-zero code ${exitCode} ` +
|
|
67
|
+
`for work unit ${workUnitId}`);
|
|
68
|
+
}
|
|
69
|
+
// -- Work unit completion (gates run at strategy level, not per work unit) --
|
|
70
|
+
// Signal-killed builders (exit code > 128) are marked failed.
|
|
71
|
+
// All other exits (including non-zero) are marked completed --
|
|
72
|
+
// the strategy-level gates validate the actual code quality.
|
|
73
|
+
if (exitCode > 128) {
|
|
74
|
+
console.warn(`${LOG_PREFIX} Builder killed by signal (exit code ${exitCode}) ` +
|
|
75
|
+
`for work unit ${workUnitId} -- marking failed`);
|
|
76
|
+
const transitioned = await transitionWorkUnitStatus(workUnitId, 'in_progress', 'failed', state);
|
|
77
|
+
if (!transitioned)
|
|
78
|
+
await updateWorkUnitStatus(workUnitId, 'failed');
|
|
79
|
+
lastGateOutputByWorkUnit.delete(workUnitId);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Mark work unit completed -- gates will evaluate at the strategy level
|
|
83
|
+
const transitioned = await transitionWorkUnitStatus(workUnitId, 'in_progress', 'completed', state);
|
|
84
|
+
if (!transitioned) {
|
|
85
|
+
console.warn(`${LOG_PREFIX} Workflow blocked in_progress -> completed for ${workUnitId} ` +
|
|
86
|
+
`-- forcing direct status update`);
|
|
87
|
+
await updateWorkUnitStatus(workUnitId, 'completed');
|
|
88
|
+
}
|
|
89
|
+
lastGateOutputByWorkUnit.delete(workUnitId);
|
|
90
|
+
console.log(`${LOG_PREFIX} Work unit ${workUnitId} builder exited -- marked completed (gates at strategy level)`);
|
|
91
|
+
}
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// Main execution cycle
|
|
94
|
+
// ============================================================================
|
|
95
|
+
/**
|
|
96
|
+
* Run a single execution cycle for a factory instance.
|
|
97
|
+
*
|
|
98
|
+
* This is the main orchestration loop called by the instance lifecycle
|
|
99
|
+
* manager during the "building" phase:
|
|
100
|
+
*
|
|
101
|
+
* 1. Fetch current work units from DB
|
|
102
|
+
* 2. Reconcile orphaned builders and stuck work units
|
|
103
|
+
* 3. Find work units with all dependencies satisfied
|
|
104
|
+
* 4. Spawn builders for ready units (skip if already active)
|
|
105
|
+
* 5. Track strategy progress transitions
|
|
106
|
+
* 6. Detect global completion (all units completed or failed)
|
|
107
|
+
*/
|
|
108
|
+
export async function runExecutionCycle(state, config, governor) {
|
|
109
|
+
// Step 1: Fetch current work units
|
|
110
|
+
const workUnits = await getInstanceWorkUnits(state.instanceId);
|
|
111
|
+
if (workUnits.length === 0) {
|
|
112
|
+
console.warn(`${LOG_PREFIX} Instance ${state.instanceId} has no work units -- ` +
|
|
113
|
+
`nothing to execute`);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Step 2: Clean up stale builder state
|
|
117
|
+
await reconcileOrphanedBuilders(state, workUnits);
|
|
118
|
+
// Step 3: Build strategy context
|
|
119
|
+
const hasStrategies = workUnits.some((u) => u.strategyId !== null);
|
|
120
|
+
let strategies = [];
|
|
121
|
+
let strategyDeps;
|
|
122
|
+
if (hasStrategies) {
|
|
123
|
+
try {
|
|
124
|
+
const { getStrategiesByFactoryInstance } = await import('./strategy-design.js');
|
|
125
|
+
strategies = await getStrategiesByFactoryInstance(state.instanceId);
|
|
126
|
+
if (strategies.length > 0) {
|
|
127
|
+
strategyDeps = new Map();
|
|
128
|
+
for (const s of strategies) {
|
|
129
|
+
strategyDeps.set(s.id, s.dependsOn);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
console.warn(`${LOG_PREFIX} Failed to fetch strategies for instance ${state.instanceId} ` +
|
|
135
|
+
`(proceeding without cross-strategy blocking): ` +
|
|
136
|
+
`${err instanceof Error ? err.message : String(err)}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Step 4: Find ready work units and spawn builders
|
|
140
|
+
let strategyStatuses;
|
|
141
|
+
if (strategies.length > 0) {
|
|
142
|
+
strategyStatuses = new Map(strategies.map((s) => [s.id, s.executionStatus ?? '']));
|
|
143
|
+
}
|
|
144
|
+
const readyUnits = findReadyWorkUnits(workUnits, strategyDeps, strategyStatuses);
|
|
145
|
+
const spawnedInThisCycle = [];
|
|
146
|
+
for (const unit of readyUnits) {
|
|
147
|
+
if (state.activeBuilderSessions.has(unit.id))
|
|
148
|
+
continue;
|
|
149
|
+
try {
|
|
150
|
+
await spawnBuilder(unit, state, config, governor);
|
|
151
|
+
spawnedInThisCycle.push(unit);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error(`${LOG_PREFIX} Failed to spawn builder for work unit "${unit.title}":`, error.message);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Step 5: Track strategy progress (in_progress transitions + completion detection)
|
|
158
|
+
if (hasStrategies && strategies.length > 0) {
|
|
159
|
+
await trackStrategyProgress(state, strategies, spawnedInThisCycle);
|
|
160
|
+
}
|
|
161
|
+
// Step 6: Log cycle summary
|
|
162
|
+
await logCycleSummary(state, hasStrategies, strategies);
|
|
163
|
+
// Step 7: Detect global completion
|
|
164
|
+
const allTerminal = workUnits.every((u) => u.status === 'completed' || u.status === 'failed');
|
|
165
|
+
if (allTerminal && state.activeBuilderSessions.size === 0) {
|
|
166
|
+
const failedCount = workUnits.filter((u) => u.status === 'failed').length;
|
|
167
|
+
if (failedCount > 0) {
|
|
168
|
+
console.log(`${LOG_PREFIX} Instance ${state.instanceId} execution finished ` +
|
|
169
|
+
`with ${failedCount} failed work unit(s) out of ${workUnits.length}`);
|
|
170
|
+
state.status = 'failed';
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
console.log(`${LOG_PREFIX} Instance ${state.instanceId} execution complete -- ` +
|
|
174
|
+
`all ${workUnits.length} work unit(s) succeeded`);
|
|
175
|
+
state.status = 'completed';
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// Execution cycle helpers
|
|
181
|
+
// ============================================================================
|
|
182
|
+
/**
|
|
183
|
+
* Reconcile in-memory builder tracking with DB work unit statuses.
|
|
184
|
+
*
|
|
185
|
+
* Kills orphaned builders whose work units were externally reset, and
|
|
186
|
+
* resets stuck in_progress work units that have no active builder.
|
|
187
|
+
*/
|
|
188
|
+
async function reconcileOrphanedBuilders(state, workUnits) {
|
|
189
|
+
const activeStatuses = new Set(['in_progress']);
|
|
190
|
+
const dbStatusById = new Map(workUnits.map((u) => [u.id, u.status]));
|
|
191
|
+
// Kill builders for work units that were externally reset
|
|
192
|
+
for (const [workUnitId, builder] of state.activeBuilderSessions) {
|
|
193
|
+
const dbStatus = dbStatusById.get(workUnitId);
|
|
194
|
+
if (dbStatus && !activeStatuses.has(dbStatus)) {
|
|
195
|
+
console.log(`${LOG_PREFIX} Orphaned builder detected for work unit ${workUnitId}: ` +
|
|
196
|
+
`DB status is "${dbStatus}" but builder is still active (session: ${builder.sessionId}). Killing.`);
|
|
197
|
+
try {
|
|
198
|
+
process.kill(builder.pid, 'SIGTERM');
|
|
199
|
+
}
|
|
200
|
+
catch { /* Process may already be dead */ }
|
|
201
|
+
state.activeBuilderSessions.delete(workUnitId);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Reset in_progress work units with no active builder
|
|
205
|
+
for (const unit of workUnits) {
|
|
206
|
+
if (unit.status === 'in_progress' && !state.activeBuilderSessions.has(unit.id)) {
|
|
207
|
+
console.log(`${LOG_PREFIX} Work unit ${unit.id} ("${unit.title}") is in_progress ` +
|
|
208
|
+
`but has no active builder -- resetting to ready`);
|
|
209
|
+
try {
|
|
210
|
+
await updateWorkUnitStatus(unit.id, 'ready');
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
console.error(`${LOG_PREFIX} Failed to reset orphaned work unit ${unit.id}:`, err.message);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Track strategy execution progress:
|
|
220
|
+
* - Transition pending strategies to in_progress when their first work unit spawns
|
|
221
|
+
* - Detect per-strategy completion when all work units reach terminal states
|
|
222
|
+
*/
|
|
223
|
+
async function trackStrategyProgress(state, strategies, spawnedInThisCycle) {
|
|
224
|
+
// Mark strategies as in_progress when their first work unit is dispatched
|
|
225
|
+
if (spawnedInThisCycle.length > 0) {
|
|
226
|
+
const strategiesById = new Map(strategies.map((s) => [s.id, s]));
|
|
227
|
+
const transitioned = new Set();
|
|
228
|
+
for (const unit of spawnedInThisCycle) {
|
|
229
|
+
if (unit.strategyId && !transitioned.has(unit.strategyId)) {
|
|
230
|
+
const strategy = strategiesById.get(unit.strategyId);
|
|
231
|
+
if (strategy && strategy.executionStatus === 'pending') {
|
|
232
|
+
transitioned.add(unit.strategyId);
|
|
233
|
+
try {
|
|
234
|
+
await updateStrategyExecutionStatus(unit.strategyId, 'in_progress');
|
|
235
|
+
console.log(`${LOG_PREFIX} Strategy "${strategy.name}" (${strategy.id}) -> in_progress ` +
|
|
236
|
+
`(first work unit dispatched)`);
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
console.warn(`${LOG_PREFIX} Failed to update strategy ${strategy.id} execution status:`, err.message);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Detect per-strategy completion
|
|
246
|
+
const freshWorkUnits = await getInstanceWorkUnits(state.instanceId);
|
|
247
|
+
const unitsByStrategy = new Map();
|
|
248
|
+
for (const unit of freshWorkUnits) {
|
|
249
|
+
if (unit.strategyId) {
|
|
250
|
+
const list = unitsByStrategy.get(unit.strategyId);
|
|
251
|
+
if (list)
|
|
252
|
+
list.push(unit);
|
|
253
|
+
else
|
|
254
|
+
unitsByStrategy.set(unit.strategyId, [unit]);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const strategiesById = new Map(strategies.map((s) => [s.id, s]));
|
|
258
|
+
for (const [strategyId, units] of unitsByStrategy) {
|
|
259
|
+
const strategy = strategiesById.get(strategyId);
|
|
260
|
+
if (!strategy || strategy.executionStatus !== 'in_progress')
|
|
261
|
+
continue;
|
|
262
|
+
const allTerminalInStrategy = units.every((u) => u.status === 'completed' || u.status === 'failed');
|
|
263
|
+
if (!allTerminalInStrategy)
|
|
264
|
+
continue;
|
|
265
|
+
const failedUnits = units.filter((u) => u.status === 'failed');
|
|
266
|
+
try {
|
|
267
|
+
if (failedUnits.length > 0) {
|
|
268
|
+
await updateStrategyExecutionStatus(strategyId, 'failed');
|
|
269
|
+
const depStrategies = strategies
|
|
270
|
+
.filter((s) => s.dependsOn.includes(strategyId))
|
|
271
|
+
.map((s) => s.name);
|
|
272
|
+
console.log(`${LOG_PREFIX} Strategy "${strategy.name}" (${strategyId}) -> failed ` +
|
|
273
|
+
`(${failedUnits.length}/${units.length} work units failed)` +
|
|
274
|
+
(depStrategies.length > 0
|
|
275
|
+
? `. Blocking downstream: ${depStrategies.join(', ')}`
|
|
276
|
+
: ''));
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
await updateStrategyExecutionStatus(strategyId, 'gating_deterministic');
|
|
280
|
+
console.log(`${LOG_PREFIX} Strategy "${strategy.name}" (${strategyId}) -> gating_deterministic ` +
|
|
281
|
+
`(${units.length}/${units.length} work units done, gates pending)`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
console.warn(`${LOG_PREFIX} Failed to update strategy ${strategyId} completion status:`, err.message);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Log a human-readable cycle summary for the instance.
|
|
291
|
+
*
|
|
292
|
+
* Simple mode for instances without strategies, detailed mode with
|
|
293
|
+
* per-strategy builder counts and blocked dependency chains otherwise.
|
|
294
|
+
*/
|
|
295
|
+
async function logCycleSummary(state, hasStrategies, strategies) {
|
|
296
|
+
if (!hasStrategies || strategies.length === 0) {
|
|
297
|
+
const freshWorkUnits = await getInstanceWorkUnits(state.instanceId);
|
|
298
|
+
const wuDone = freshWorkUnits.filter((u) => u.status === 'completed').length;
|
|
299
|
+
const wuFailed = freshWorkUnits.filter((u) => u.status === 'failed').length;
|
|
300
|
+
const wuActive = freshWorkUnits.filter((u) => u.status === 'in_progress').length;
|
|
301
|
+
const wuReady = freshWorkUnits.filter((u) => u.status === 'ready' || u.status === 'pending').length;
|
|
302
|
+
console.log(`${LOG_PREFIX} Cycle summary for instance ${state.instanceId}: ` +
|
|
303
|
+
`${wuDone} done, ${wuActive} active, ${wuReady} ready, ${wuFailed} failed ` +
|
|
304
|
+
`(${freshWorkUnits.length} total) | ${state.activeBuilderSessions.size} builder(s)`);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
// Re-fetch strategies for latest execution statuses
|
|
308
|
+
let freshStrategies = strategies;
|
|
309
|
+
try {
|
|
310
|
+
const { getStrategiesByFactoryInstance } = await import('./strategy-design.js');
|
|
311
|
+
freshStrategies = await getStrategiesByFactoryInstance(state.instanceId);
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
// Use stale data
|
|
315
|
+
}
|
|
316
|
+
const completedStrats = freshStrategies.filter((s) => s.executionStatus === 'completed');
|
|
317
|
+
const failedStrats = freshStrategies.filter((s) => s.executionStatus === 'failed');
|
|
318
|
+
const activeStrats = freshStrategies.filter((s) => s.executionStatus === 'in_progress' ||
|
|
319
|
+
s.executionStatus === 'gating_deterministic' ||
|
|
320
|
+
s.executionStatus === 'gating_behavioral' ||
|
|
321
|
+
s.executionStatus === 'gating_adversarial' ||
|
|
322
|
+
s.executionStatus === 'gate_fix_pending');
|
|
323
|
+
const pendingStrats = freshStrategies.filter((s) => s.executionStatus === 'pending');
|
|
324
|
+
const freshWorkUnits = await getInstanceWorkUnits(state.instanceId);
|
|
325
|
+
const wuDone = freshWorkUnits.filter((u) => u.status === 'completed').length;
|
|
326
|
+
const wuFailed = freshWorkUnits.filter((u) => u.status === 'failed').length;
|
|
327
|
+
const wuActive = freshWorkUnits.filter((u) => u.status === 'in_progress').length;
|
|
328
|
+
// Per-strategy active builder counts
|
|
329
|
+
const activeByStrategy = new Map();
|
|
330
|
+
for (const [, builder] of state.activeBuilderSessions) {
|
|
331
|
+
const wu = freshWorkUnits.find((u) => u.id === builder.workUnitId);
|
|
332
|
+
if (wu?.strategyId) {
|
|
333
|
+
activeByStrategy.set(wu.strategyId, (activeByStrategy.get(wu.strategyId) ?? 0) + 1);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const executingParts = [];
|
|
337
|
+
for (const s of activeStrats) {
|
|
338
|
+
const builderCount = activeByStrategy.get(s.id) ?? 0;
|
|
339
|
+
executingParts.push(`${s.name}: ${builderCount} active builder(s)`);
|
|
340
|
+
}
|
|
341
|
+
// Blocked strategies summary
|
|
342
|
+
const failedIds = new Set(failedStrats.map((s) => s.id));
|
|
343
|
+
const completedIds = new Set(completedStrats.map((s) => s.id));
|
|
344
|
+
const blockedParts = [];
|
|
345
|
+
for (const s of pendingStrats) {
|
|
346
|
+
if (s.dependsOn.length === 0)
|
|
347
|
+
continue;
|
|
348
|
+
const waitingOn = s.dependsOn
|
|
349
|
+
.filter((depId) => !completedIds.has(depId))
|
|
350
|
+
.map((depId) => {
|
|
351
|
+
const dep = freshStrategies.find((fs) => fs.id === depId);
|
|
352
|
+
const status = failedIds.has(depId) ? ' [FAILED]' : '';
|
|
353
|
+
return `${dep?.name ?? depId}${status}`;
|
|
354
|
+
});
|
|
355
|
+
if (waitingOn.length > 0) {
|
|
356
|
+
blockedParts.push(`${s.name} (waiting on: ${waitingOn.join(', ')})`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
const summaryLines = [
|
|
360
|
+
`${LOG_PREFIX} Cycle summary for instance ${state.instanceId}:`,
|
|
361
|
+
` Strategies: ${completedStrats.length} completed, ${activeStrats.length} active, ` +
|
|
362
|
+
`${pendingStrats.length} pending, ${failedStrats.length} failed (${freshStrategies.length} total)`,
|
|
363
|
+
` Work units: ${wuDone} done, ${wuActive} active, ${wuFailed} failed ` +
|
|
364
|
+
`(${freshWorkUnits.length} total)`,
|
|
365
|
+
` Active builders: ${state.activeBuilderSessions.size}`,
|
|
366
|
+
];
|
|
367
|
+
if (executingParts.length > 0) {
|
|
368
|
+
summaryLines.push(` Executing: ${executingParts.join('; ')}`);
|
|
369
|
+
}
|
|
370
|
+
if (blockedParts.length > 0) {
|
|
371
|
+
summaryLines.push(` Blocked: ${blockedParts.join('; ')}`);
|
|
372
|
+
}
|
|
373
|
+
console.log(summaryLines.join('\n'));
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=builder-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-completion.js","sourceRoot":"","sources":["../src/builder-completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builder process lifecycle management -- spawning Claude Code sessions.
|
|
3
|
+
*
|
|
4
|
+
* Spawns a Claude Code builder session per work unit, sets up stream
|
|
5
|
+
* handling, signal detection, heartbeat monitoring, and wires up the
|
|
6
|
+
* completion handler on process exit.
|
|
7
|
+
*
|
|
8
|
+
* Extracted from execution.ts for focused module boundaries.
|
|
9
|
+
*/
|
|
10
|
+
import type { ResourceGovernor } from '@telora/daemon-core';
|
|
11
|
+
import type { FactoryConfig, FactoryInstanceState, BuilderState, FactoryWorkUnit, WorkUnitStatus } from './types.js';
|
|
12
|
+
/** Default max iterations when the blueprint doesn't specify one. */
|
|
13
|
+
export declare const DEFAULT_MAX_ITERATIONS = 3;
|
|
14
|
+
/** Log prefix for all execution-phase messages. */
|
|
15
|
+
export declare const LOG_PREFIX = "[execution]";
|
|
16
|
+
/**
|
|
17
|
+
* In-memory cache of the last gate failure output per work unit.
|
|
18
|
+
* Used to provide gate feedback when re-spawning a builder with fresh context.
|
|
19
|
+
* Entries are cleaned up when a work unit completes or fails permanently.
|
|
20
|
+
*/
|
|
21
|
+
export declare const lastGateOutputByWorkUnit: Map<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Transition a work unit through the workflow state machine.
|
|
24
|
+
*
|
|
25
|
+
* Attempts a workflow-governed transition, falling back to direct status
|
|
26
|
+
* update if no workflow exists. On success, persists both the status and
|
|
27
|
+
* the new workflow stage ID.
|
|
28
|
+
*/
|
|
29
|
+
export declare function transitionWorkUnitStatus(workUnitId: string, currentStatus: string, targetStatus: WorkUnitStatus, state: FactoryInstanceState, extraFields?: Record<string, unknown>): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Spawn a Claude Code builder session for a single work unit.
|
|
32
|
+
*
|
|
33
|
+
* Creates a factory_sessions record, launches the `claude` CLI in
|
|
34
|
+
* stream-json mode, and registers the builder in the instance's
|
|
35
|
+
* `activeBuilderSessions` map.
|
|
36
|
+
*
|
|
37
|
+
* @returns The in-memory BuilderState for the spawned session.
|
|
38
|
+
*/
|
|
39
|
+
export declare function spawnBuilder(workUnit: FactoryWorkUnit, state: FactoryInstanceState, config: FactoryConfig, governor?: ResourceGovernor | null): Promise<BuilderState>;
|
|
40
|
+
//# sourceMappingURL=builder-spawner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-spawner.d.ts","sourceRoot":"","sources":["../src/builder-spawner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,OAAO,KAAK,EAAE,gBAAgB,EAAiC,MAAM,qBAAqB,CAAC;AAE3F,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,cAAc,EAEf,MAAM,YAAY,CAAC;AAkBpB,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,mDAAmD;AACnD,eAAO,MAAM,UAAU,gBAAgB,CAAC;AAExC;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,qBAA4B,CAAC;AA6ElE;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,cAAc,EAC5B,KAAK,EAAE,oBAAoB,EAC3B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CAAC,OAAO,CAAC,CAsClB;AAyJD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,aAAa,EACrB,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,GACjC,OAAO,CAAC,YAAY,CAAC,CAsKvB"}
|