@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,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning phase orchestration and retry logic.
|
|
3
|
+
*
|
|
4
|
+
* Contains the main planning entry points that coordinate the planning flow:
|
|
5
|
+
* spawning Claude Code, validating results, retrying on failure, and
|
|
6
|
+
* managing flat vs per-strategy planning flows.
|
|
7
|
+
* Split from planning.ts for maintainability.
|
|
8
|
+
*/
|
|
9
|
+
import { createFactoryWorktree } from './git-factory.js';
|
|
10
|
+
import { updateInstanceStatus } from './queries/instances.js';
|
|
11
|
+
import { createWorkUnits } from './queries/work-units.js';
|
|
12
|
+
import { initializeExecutionUnits } from './execution-unit-init.js';
|
|
13
|
+
import { runCodebaseAudit, runScopedCodebaseAudit, formatAuditReport } from './audit.js';
|
|
14
|
+
import { parseTokenUsageFromOutput, sumTokenUsage } from './queries/shared.js';
|
|
15
|
+
import { spawnAsync } from './process-runner.js';
|
|
16
|
+
import { buildPlanningEnv, generateBranchName, buildPlanningPrompt, buildScopedPlanningPrompt, buildRetryPrompt } from './planning-prompt.js';
|
|
17
|
+
import { configForFactoryProduct, findFactoryProduct } from './product-config.js';
|
|
18
|
+
import { extractWorkPlanJson, validateDependencies, mapTempIdsToUuids, WorkPlanSchema } from './plan-parser.js';
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Constants
|
|
21
|
+
// ============================================================================
|
|
22
|
+
/** Timeout for the planning Claude Code session (5 minutes). */
|
|
23
|
+
const PLANNING_TIMEOUT_MS = 300_000;
|
|
24
|
+
/** Maximum number of retry attempts when plan generation fails validation. */
|
|
25
|
+
const MAX_PLANNING_RETRIES = 2;
|
|
26
|
+
/** Log prefix for this module. */
|
|
27
|
+
const LOG_PREFIX = '[planning]';
|
|
28
|
+
/**
|
|
29
|
+
* Spawn Claude Code and validate the resulting work plan.
|
|
30
|
+
*
|
|
31
|
+
* This function encapsulates steps 2-4 of the planning phase:
|
|
32
|
+
* - Spawns Claude Code in --print mode with the given prompt
|
|
33
|
+
* - Extracts and parses the JSON work plan from the output
|
|
34
|
+
* - Validates schema, dependencies, and resource limits
|
|
35
|
+
*
|
|
36
|
+
* Extracted as a standalone function so it can be called in a retry loop
|
|
37
|
+
* when the AI produces an invalid plan.
|
|
38
|
+
*/
|
|
39
|
+
export async function generateAndValidateWorkPlan(prompt, config, worktreePath, blueprint) {
|
|
40
|
+
// -- Spawn Claude Code ----
|
|
41
|
+
let rawOutput;
|
|
42
|
+
try {
|
|
43
|
+
const args = ['--print', '--output-format', 'json', '--verbose'];
|
|
44
|
+
const env = buildPlanningEnv(config);
|
|
45
|
+
console.log(`${LOG_PREFIX} Spawning Claude Code for work plan generation...`);
|
|
46
|
+
rawOutput = await spawnAsync(config.claudeCodePath, args, {
|
|
47
|
+
input: prompt,
|
|
48
|
+
encoding: 'utf-8',
|
|
49
|
+
timeout: PLANNING_TIMEOUT_MS,
|
|
50
|
+
cwd: worktreePath,
|
|
51
|
+
env,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const execErr = err;
|
|
56
|
+
if (execErr.killed || execErr.signal === 'SIGTERM') {
|
|
57
|
+
return { success: false, error: `Claude Code timed out after ${PLANNING_TIMEOUT_MS / 1000}s`, tokenUsage: null };
|
|
58
|
+
}
|
|
59
|
+
const stderr = execErr.stderr ? String(execErr.stderr).slice(0, 500) : '';
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: `Claude Code failed (exit ${execErr.status ?? 'unknown'}): ${execErr.message ?? 'unknown error'}${stderr ? ` | stderr: ${stderr}` : ''}`,
|
|
63
|
+
tokenUsage: null,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (!rawOutput || rawOutput.trim().length === 0) {
|
|
67
|
+
return { success: false, error: 'Claude Code returned empty output', tokenUsage: null };
|
|
68
|
+
}
|
|
69
|
+
// Parse token usage from the NDJSON output (TEL-6: cost tracking for planner sessions)
|
|
70
|
+
const tokenUsage = parseTokenUsageFromOutput(rawOutput);
|
|
71
|
+
// -- Extract and validate the work plan ----
|
|
72
|
+
let workPlanJson;
|
|
73
|
+
try {
|
|
74
|
+
workPlanJson = extractWorkPlanJson(rawOutput);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
error: `Failed to extract work plan JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
80
|
+
tokenUsage,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
let parsedJson;
|
|
84
|
+
try {
|
|
85
|
+
parsedJson = JSON.parse(workPlanJson);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
return {
|
|
89
|
+
success: false,
|
|
90
|
+
error: `Work plan is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
91
|
+
tokenUsage,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Normalize: AI sometimes returns a bare array instead of an object.
|
|
95
|
+
if (Array.isArray(parsedJson)) {
|
|
96
|
+
if (parsedJson.length === 1 && typeof parsedJson[0] === 'object' && parsedJson[0] !== null && !Array.isArray(parsedJson[0])) {
|
|
97
|
+
parsedJson = parsedJson[0];
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
parsedJson = { workUnits: parsedJson };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const validation = WorkPlanSchema.safeParse(parsedJson);
|
|
104
|
+
if (!validation.success) {
|
|
105
|
+
const issues = validation.error.issues
|
|
106
|
+
.map((i) => `${i.path.join('.')}: ${i.message}`)
|
|
107
|
+
.join('; ');
|
|
108
|
+
return { success: false, error: `Work plan validation failed: ${issues}`, tokenUsage };
|
|
109
|
+
}
|
|
110
|
+
const workPlan = validation.data;
|
|
111
|
+
console.log(`${LOG_PREFIX} Work plan validated: ${workPlan.workUnits.length} work unit(s)`);
|
|
112
|
+
// -- Validate dependencies and check max_work_units limit ----
|
|
113
|
+
const depError = validateDependencies(workPlan.workUnits);
|
|
114
|
+
if (depError) {
|
|
115
|
+
return { success: false, error: `Work plan dependency error: ${depError}`, tokenUsage };
|
|
116
|
+
}
|
|
117
|
+
if (blueprint.maxWorkUnits !== null &&
|
|
118
|
+
workPlan.workUnits.length > blueprint.maxWorkUnits) {
|
|
119
|
+
return {
|
|
120
|
+
success: false,
|
|
121
|
+
error: `Work plan has ${workPlan.workUnits.length} work units, ` +
|
|
122
|
+
`but blueprint allows at most ${blueprint.maxWorkUnits}`,
|
|
123
|
+
tokenUsage,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return { success: true, workPlan, tokenUsage };
|
|
127
|
+
}
|
|
128
|
+
// ============================================================================
|
|
129
|
+
// Exported planning phase function
|
|
130
|
+
// ============================================================================
|
|
131
|
+
/**
|
|
132
|
+
* Run the planning phase for a factory instance.
|
|
133
|
+
*
|
|
134
|
+
* This function is called by the instance lifecycle manager when an instance
|
|
135
|
+
* transitions to 'planning'. It:
|
|
136
|
+
* 1. Creates a git worktree and branch
|
|
137
|
+
* 2. Checks if the instance has generated strategies (from designing phase)
|
|
138
|
+
* 3a. If strategies exist: runs per-strategy scoped planning in dependency order
|
|
139
|
+
* 3b. If no strategies: runs flat planning (legacy behavior)
|
|
140
|
+
* 4. Transitions the instance to 'building'
|
|
141
|
+
*
|
|
142
|
+
* @returns An object indicating success or failure with an optional error message.
|
|
143
|
+
*/
|
|
144
|
+
export async function runPlanningPhase(state, config, governor) {
|
|
145
|
+
const { instanceId, blueprint } = state;
|
|
146
|
+
const specification = state.specification;
|
|
147
|
+
console.log(`${LOG_PREFIX} Starting planning phase for instance ${instanceId}`);
|
|
148
|
+
// -- Guard: specification is required ----
|
|
149
|
+
if (!specification || specification.trim().length === 0) {
|
|
150
|
+
const error = 'Instance has no specification -- cannot generate a work plan';
|
|
151
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
152
|
+
return { success: false, error };
|
|
153
|
+
}
|
|
154
|
+
// -- Step 1: Create git worktree and branch (skip if already set by designing phase) --
|
|
155
|
+
let worktreePath;
|
|
156
|
+
if (state.worktreePath && state.branchName) {
|
|
157
|
+
// Worktree already created by the designing phase -- reuse it
|
|
158
|
+
worktreePath = state.worktreePath;
|
|
159
|
+
console.log(`${LOG_PREFIX} Reusing existing worktree: ${worktreePath} (branch: ${state.branchName})`);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// Use product-scoped config so worktrees land in the correct product repo
|
|
163
|
+
const productEntry = findFactoryProduct(config, state.productId);
|
|
164
|
+
const productConfig = productEntry ? configForFactoryProduct(config, productEntry) : config;
|
|
165
|
+
const branchName = generateBranchName(blueprint.name, instanceId);
|
|
166
|
+
try {
|
|
167
|
+
worktreePath = createFactoryWorktree(productConfig.repoPath, productConfig.factoryWorktreeDir, branchName);
|
|
168
|
+
console.log(`${LOG_PREFIX} Worktree created: ${worktreePath} (branch: ${branchName})`);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
const error = `Failed to create worktree: ${err instanceof Error ? err.message : String(err)}`;
|
|
172
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
173
|
+
return { success: false, error };
|
|
174
|
+
}
|
|
175
|
+
// Persist branch and worktree path to the instance record
|
|
176
|
+
try {
|
|
177
|
+
await updateInstanceStatus(instanceId, 'planning', {
|
|
178
|
+
branchName,
|
|
179
|
+
worktreePath,
|
|
180
|
+
});
|
|
181
|
+
state.branchName = branchName;
|
|
182
|
+
state.worktreePath = worktreePath;
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
const error = `Failed to persist worktree info: ${err instanceof Error ? err.message : String(err)}`;
|
|
186
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
187
|
+
return { success: false, error };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// -- Step 2: Check for strategies ----
|
|
191
|
+
const { getStrategiesByFactoryInstance, buildStrategyDependencyGraph } = await import('./strategy-design.js');
|
|
192
|
+
const strategies = await getStrategiesByFactoryInstance(instanceId);
|
|
193
|
+
let planResult;
|
|
194
|
+
if (strategies.length > 0) {
|
|
195
|
+
console.log(`${LOG_PREFIX} Found ${strategies.length} strategies -- running per-strategy planning`);
|
|
196
|
+
planResult = await runPerStrategyPlanning(state, config, worktreePath, specification, strategies, buildStrategyDependencyGraph, governor);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
console.log(`${LOG_PREFIX} No strategies found -- running flat planning`);
|
|
200
|
+
planResult = await runFlatPlanning(state, config, worktreePath, specification, governor);
|
|
201
|
+
}
|
|
202
|
+
if (!planResult.success) {
|
|
203
|
+
return planResult;
|
|
204
|
+
}
|
|
205
|
+
// -- Final: Transition instance to 'building' ----
|
|
206
|
+
try {
|
|
207
|
+
await updateInstanceStatus(instanceId, 'building');
|
|
208
|
+
state.status = 'building';
|
|
209
|
+
console.log(`${LOG_PREFIX} Instance ${instanceId} transitioned: planning -> building`);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
const error = `Failed to transition to building: ${err instanceof Error ? err.message : String(err)}`;
|
|
213
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
214
|
+
return { success: false, error };
|
|
215
|
+
}
|
|
216
|
+
// Initialize execution units for the scheduler
|
|
217
|
+
try {
|
|
218
|
+
await initializeExecutionUnits(state);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
const error = `Failed to initialize execution units: ${err instanceof Error ? err.message : String(err)}`;
|
|
222
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
223
|
+
return { success: false, error };
|
|
224
|
+
}
|
|
225
|
+
return { success: true, tokenUsage: planResult.tokenUsage };
|
|
226
|
+
}
|
|
227
|
+
// ============================================================================
|
|
228
|
+
// Flat planning (legacy -- no strategies)
|
|
229
|
+
// ============================================================================
|
|
230
|
+
/**
|
|
231
|
+
* Run the original flat planning flow for instances without strategies.
|
|
232
|
+
*/
|
|
233
|
+
async function runFlatPlanning(state, config, worktreePath, specification, governor) {
|
|
234
|
+
const { instanceId, blueprint } = state;
|
|
235
|
+
// Run codebase audit (best-effort)
|
|
236
|
+
let auditReportText = null;
|
|
237
|
+
try {
|
|
238
|
+
const auditReport = await runCodebaseAudit(worktreePath, specification, blueprint, config, governor);
|
|
239
|
+
if (auditReport) {
|
|
240
|
+
auditReportText = formatAuditReport(auditReport, blueprint);
|
|
241
|
+
console.log(`${LOG_PREFIX} Codebase audit completed: ` +
|
|
242
|
+
`${auditReport.existingImplementations.length} existing, ` +
|
|
243
|
+
`${auditReport.partialImplementations.length} partial, ` +
|
|
244
|
+
`${auditReport.gaps.length} gaps`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
console.warn(`${LOG_PREFIX} Codebase audit failed (non-fatal): ` +
|
|
249
|
+
`${err instanceof Error ? err.message : String(err)}`);
|
|
250
|
+
}
|
|
251
|
+
// Generate and validate work plan (with retries)
|
|
252
|
+
const originalPrompt = buildPlanningPrompt(specification, blueprint, auditReportText, state.specType, state.reviewGaps);
|
|
253
|
+
let currentPrompt = originalPrompt;
|
|
254
|
+
let workPlan = null;
|
|
255
|
+
let lastError = '';
|
|
256
|
+
const allTokenUsages = [];
|
|
257
|
+
for (let attempt = 0; attempt <= MAX_PLANNING_RETRIES; attempt++) {
|
|
258
|
+
if (attempt > 0) {
|
|
259
|
+
console.log(`${LOG_PREFIX} Retry ${attempt}/${MAX_PLANNING_RETRIES} -- previous error: ${lastError}`);
|
|
260
|
+
currentPrompt = buildRetryPrompt(originalPrompt, lastError);
|
|
261
|
+
}
|
|
262
|
+
if (governor)
|
|
263
|
+
await governor.acquireSlot('factory');
|
|
264
|
+
let result;
|
|
265
|
+
try {
|
|
266
|
+
result = await generateAndValidateWorkPlan(currentPrompt, config, worktreePath, blueprint);
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
if (governor)
|
|
270
|
+
governor.releaseSlot('factory');
|
|
271
|
+
}
|
|
272
|
+
allTokenUsages.push(result.tokenUsage);
|
|
273
|
+
if (result.success) {
|
|
274
|
+
workPlan = result.workPlan;
|
|
275
|
+
if (attempt > 0) {
|
|
276
|
+
console.log(`${LOG_PREFIX} Plan generation succeeded on retry ${attempt}`);
|
|
277
|
+
}
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
lastError = result.error;
|
|
281
|
+
console.error(`${LOG_PREFIX} Plan generation attempt ${attempt + 1} failed: ${lastError}`);
|
|
282
|
+
}
|
|
283
|
+
const accumulatedTokenUsage = sumTokenUsage(allTokenUsages);
|
|
284
|
+
if (workPlan === null) {
|
|
285
|
+
const error = `Plan generation failed after ${MAX_PLANNING_RETRIES + 1} attempt(s): ${lastError}`;
|
|
286
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
287
|
+
return { success: false, error, tokenUsage: accumulatedTokenUsage };
|
|
288
|
+
}
|
|
289
|
+
// Map tempIds to UUIDs and bulk-insert work units
|
|
290
|
+
try {
|
|
291
|
+
const mappedUnits = mapTempIdsToUuids(workPlan.workUnits).map((u) => ({
|
|
292
|
+
...u,
|
|
293
|
+
cycleNumber: 1,
|
|
294
|
+
}));
|
|
295
|
+
const created = await createWorkUnits(instanceId, mappedUnits);
|
|
296
|
+
console.log(`${LOG_PREFIX} Created ${created.length} work unit(s) in database`);
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
const error = `Failed to create work units: ${err instanceof Error ? err.message : String(err)}`;
|
|
300
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
301
|
+
return { success: false, error, tokenUsage: accumulatedTokenUsage };
|
|
302
|
+
}
|
|
303
|
+
return { success: true, tokenUsage: accumulatedTokenUsage };
|
|
304
|
+
}
|
|
305
|
+
// ============================================================================
|
|
306
|
+
// Per-strategy scoped planning
|
|
307
|
+
// ============================================================================
|
|
308
|
+
/**
|
|
309
|
+
* Run per-strategy scoped planning in dependency order.
|
|
310
|
+
*
|
|
311
|
+
* For each strategy (in topological order):
|
|
312
|
+
* 1. Run scoped codebase audit
|
|
313
|
+
* 2. Build scoped planning prompt with dependency context
|
|
314
|
+
* 3. Generate and validate work plan
|
|
315
|
+
* 4. Map tempIds, insert work units tagged with strategyId
|
|
316
|
+
*
|
|
317
|
+
* If any strategy's planning fails after retries, the instance fails.
|
|
318
|
+
*/
|
|
319
|
+
async function runPerStrategyPlanning(state, config, worktreePath, specification, strategies, buildGraph, governor) {
|
|
320
|
+
const { instanceId, blueprint } = state;
|
|
321
|
+
// Build dependency graph to get execution order
|
|
322
|
+
const strategyMap = new Map(strategies.map((s) => [s.id, s]));
|
|
323
|
+
const graphInput = strategies.map((s) => ({
|
|
324
|
+
strategyId: s.id,
|
|
325
|
+
name: s.name,
|
|
326
|
+
dependsOn: s.dependsOn,
|
|
327
|
+
interfaceContract: s.interfaceContract,
|
|
328
|
+
}));
|
|
329
|
+
const graph = buildGraph(graphInput);
|
|
330
|
+
// Track planned strategies for dependency context
|
|
331
|
+
const plannedWorkUnitTitles = new Map();
|
|
332
|
+
let globalSortOffset = 0;
|
|
333
|
+
const allTokenUsages = [];
|
|
334
|
+
for (let idx = 0; idx < graph.executionOrder.length; idx++) {
|
|
335
|
+
const strategyId = graph.executionOrder[idx];
|
|
336
|
+
const strategy = strategyMap.get(strategyId);
|
|
337
|
+
if (!strategy) {
|
|
338
|
+
const error = `Strategy ${strategyId} not found in strategy map`;
|
|
339
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
340
|
+
return { success: false, error, tokenUsage: sumTokenUsage(allTokenUsages) };
|
|
341
|
+
}
|
|
342
|
+
// Guard: verify all dependency strategies have already been planned
|
|
343
|
+
for (const depId of strategy.dependsOn) {
|
|
344
|
+
if (!plannedWorkUnitTitles.has(depId)) {
|
|
345
|
+
const depStrategy = strategyMap.get(depId);
|
|
346
|
+
const depName = depStrategy?.name ?? depId;
|
|
347
|
+
const error = `Strategy "${strategy.name}" depends on "${depName}" which has not been planned yet. ` +
|
|
348
|
+
`This indicates a topological ordering bug in the dependency graph.`;
|
|
349
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
350
|
+
return { success: false, error, tokenUsage: sumTokenUsage(allTokenUsages) };
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
console.log(`${LOG_PREFIX} Planning strategy ${idx + 1}/${graph.executionOrder.length}: ${strategy.name}`);
|
|
354
|
+
// Step a: Run scoped codebase audit (best-effort)
|
|
355
|
+
let auditReportText = null;
|
|
356
|
+
try {
|
|
357
|
+
const auditReport = await runScopedCodebaseAudit(worktreePath, strategy, specification, blueprint, config, governor);
|
|
358
|
+
if (auditReport) {
|
|
359
|
+
auditReportText = formatAuditReport(auditReport, blueprint);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
console.warn(`${LOG_PREFIX} Scoped audit failed for "${strategy.name}" (non-fatal): ` +
|
|
364
|
+
`${err instanceof Error ? err.message : String(err)}`);
|
|
365
|
+
}
|
|
366
|
+
// Step b: Build dependency context from already-planned upstream strategies
|
|
367
|
+
const depContexts = [];
|
|
368
|
+
for (const depId of strategy.dependsOn) {
|
|
369
|
+
const depStrategy = strategyMap.get(depId);
|
|
370
|
+
if (depStrategy) {
|
|
371
|
+
const depNode = graph.nodes.get(depId);
|
|
372
|
+
depContexts.push({
|
|
373
|
+
strategyId: depId,
|
|
374
|
+
strategyName: depStrategy.name,
|
|
375
|
+
description: depStrategy.description,
|
|
376
|
+
workUnitTitles: plannedWorkUnitTitles.get(depId) ?? [],
|
|
377
|
+
produces: depNode?.interfaceContract?.produces ?? [],
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// Step c: Build scoped prompt and generate work plan
|
|
382
|
+
const originalPrompt = buildScopedPlanningPrompt(strategy, specification, blueprint, auditReportText, depContexts, state.specType);
|
|
383
|
+
let currentPrompt = originalPrompt;
|
|
384
|
+
let workPlan = null;
|
|
385
|
+
let lastError = '';
|
|
386
|
+
for (let attempt = 0; attempt <= MAX_PLANNING_RETRIES; attempt++) {
|
|
387
|
+
if (attempt > 0) {
|
|
388
|
+
console.log(`${LOG_PREFIX} Retry ${attempt}/${MAX_PLANNING_RETRIES} for "${strategy.name}" ` +
|
|
389
|
+
`-- previous error: ${lastError}`);
|
|
390
|
+
currentPrompt = buildRetryPrompt(originalPrompt, lastError);
|
|
391
|
+
}
|
|
392
|
+
if (governor)
|
|
393
|
+
await governor.acquireSlot('factory');
|
|
394
|
+
let result;
|
|
395
|
+
try {
|
|
396
|
+
result = await generateAndValidateWorkPlan(currentPrompt, config, worktreePath, blueprint);
|
|
397
|
+
}
|
|
398
|
+
finally {
|
|
399
|
+
if (governor)
|
|
400
|
+
governor.releaseSlot('factory');
|
|
401
|
+
}
|
|
402
|
+
allTokenUsages.push(result.tokenUsage);
|
|
403
|
+
if (result.success) {
|
|
404
|
+
workPlan = result.workPlan;
|
|
405
|
+
if (attempt > 0) {
|
|
406
|
+
console.log(`${LOG_PREFIX} Plan for "${strategy.name}" succeeded on retry ${attempt}`);
|
|
407
|
+
}
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
lastError = result.error;
|
|
411
|
+
console.error(`${LOG_PREFIX} Plan for "${strategy.name}" attempt ${attempt + 1} failed: ${lastError}`);
|
|
412
|
+
}
|
|
413
|
+
if (workPlan === null) {
|
|
414
|
+
const error = `Strategy "${strategy.name}" planning failed after ` +
|
|
415
|
+
`${MAX_PLANNING_RETRIES + 1} attempt(s): ${lastError}`;
|
|
416
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
417
|
+
return { success: false, error, tokenUsage: sumTokenUsage(allTokenUsages) };
|
|
418
|
+
}
|
|
419
|
+
// Step d: Map tempIds, insert work units with strategyId
|
|
420
|
+
try {
|
|
421
|
+
const mappedUnits = mapTempIdsToUuids(workPlan.workUnits).map((u, i) => ({
|
|
422
|
+
...u,
|
|
423
|
+
sortOrder: globalSortOffset + i,
|
|
424
|
+
cycleNumber: 1,
|
|
425
|
+
strategyId,
|
|
426
|
+
}));
|
|
427
|
+
const created = await createWorkUnits(instanceId, mappedUnits);
|
|
428
|
+
plannedWorkUnitTitles.set(strategyId, workPlan.workUnits.map((u) => u.title));
|
|
429
|
+
globalSortOffset += workPlan.workUnits.length;
|
|
430
|
+
console.log(`${LOG_PREFIX} Strategy "${strategy.name}": created ${created.length} work unit(s)`);
|
|
431
|
+
}
|
|
432
|
+
catch (err) {
|
|
433
|
+
const error = `Failed to create work units for strategy "${strategy.name}": ` +
|
|
434
|
+
`${err instanceof Error ? err.message : String(err)}`;
|
|
435
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
436
|
+
return { success: false, error, tokenUsage: sumTokenUsage(allTokenUsages) };
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
console.log(`${LOG_PREFIX} Per-strategy planning complete: ` +
|
|
440
|
+
`${graph.executionOrder.length} strategies planned, ` +
|
|
441
|
+
`${globalSortOffset} total work units`);
|
|
442
|
+
return { success: true, tokenUsage: sumTokenUsage(allTokenUsages) };
|
|
443
|
+
}
|
|
444
|
+
//# sourceMappingURL=planning-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-phase.js","sourceRoot":"","sources":["../src/planning-phase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning prompt builders and environment setup.
|
|
3
|
+
*
|
|
4
|
+
* Contains functions that construct the prompts sent to Claude Code for
|
|
5
|
+
* planning sessions, configure the spawning environment, and generate
|
|
6
|
+
* branch names. Split from planning.ts for maintainability.
|
|
7
|
+
*/
|
|
8
|
+
import type { FactoryBlueprint, FactoryConfig, SpecType } from './types.js';
|
|
9
|
+
import type { PersistedStrategy, StrategyContract } from './strategy-design.js';
|
|
10
|
+
/**
|
|
11
|
+
* Build a clean environment for the planning Claude Code session.
|
|
12
|
+
*
|
|
13
|
+
* Strips inherited CLAUDE_CODE_* and CLAUDECODE env vars to prevent
|
|
14
|
+
* child Claude Code processes from detecting a parent session and hanging.
|
|
15
|
+
* Injects TELORA_TRACKER_ID for the spawned session.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildPlanningEnv(config: FactoryConfig): Record<string, string | undefined>;
|
|
18
|
+
/**
|
|
19
|
+
* Generate a factory branch name from the blueprint name and instance ID.
|
|
20
|
+
*
|
|
21
|
+
* Format: factory/{sanitized-blueprint-name}-{first-8-chars-of-instance-id}
|
|
22
|
+
*/
|
|
23
|
+
export declare function generateBranchName(blueprintName: string, instanceId: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Build the prompt that instructs Claude Code to generate a work plan.
|
|
26
|
+
*
|
|
27
|
+
* The prompt includes the full factory specification, resource limits from the
|
|
28
|
+
* blueprint, and asks for a structured JSON response matching the WorkPlan schema.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildPlanningPrompt(specification: string, blueprint: FactoryBlueprint, auditReport?: string | null, specType?: SpecType | null, reviewGaps?: Array<{
|
|
31
|
+
area: string;
|
|
32
|
+
description: string;
|
|
33
|
+
severity: string;
|
|
34
|
+
suggestedFix: string;
|
|
35
|
+
}> | null): string;
|
|
36
|
+
/** Context about an already-planned dependency strategy. */
|
|
37
|
+
export interface DependencyContext {
|
|
38
|
+
strategyId: string;
|
|
39
|
+
strategyName: string;
|
|
40
|
+
description: string | null;
|
|
41
|
+
/** Work unit titles from this dependency (so downstream planners know what's handled). */
|
|
42
|
+
workUnitTitles: string[];
|
|
43
|
+
/** What this dependency produces (from its interface contract). */
|
|
44
|
+
produces: StrategyContract['produces'];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build a scoped planning prompt for a single strategy within a larger
|
|
48
|
+
* multi-strategy factory instance.
|
|
49
|
+
*
|
|
50
|
+
* Differs from buildPlanningPrompt() in that it:
|
|
51
|
+
* 1. Frames the role as planning within a bounded strategy scope
|
|
52
|
+
* 2. Includes the strategy's tech context and relevant files
|
|
53
|
+
* 3. Includes interface contracts (what this strategy must produce/consume)
|
|
54
|
+
* 4. Includes dependency context from already-planned upstream strategies
|
|
55
|
+
*/
|
|
56
|
+
export declare function buildScopedPlanningPrompt(strategy: PersistedStrategy, specification: string, blueprint: FactoryBlueprint, auditReport?: string | null, dependencyContexts?: DependencyContext[], specType?: SpecType | null): string;
|
|
57
|
+
/**
|
|
58
|
+
* Build a retry prompt that includes the original prompt and the validation error.
|
|
59
|
+
*
|
|
60
|
+
* This gives the AI context about what went wrong so it can correct its output
|
|
61
|
+
* on the next attempt.
|
|
62
|
+
*/
|
|
63
|
+
export declare function buildRetryPrompt(originalPrompt: string, validationError: string): string;
|
|
64
|
+
//# sourceMappingURL=planning-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-prompt.d.ts","sourceRoot":"","sources":["../src/planning-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAMhF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAc1F;AAoBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAIpF;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,gBAAgB,EAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,EAC3B,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,UAAU,CAAC,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,GACvG,MAAM,CAyLR;AAMD,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,0FAA0F;IAC1F,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mEAAmE;IACnE,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;CACxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,EAC3B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,gBAAgB,EAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,EAC3B,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,EACxC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GACzB,MAAM,CAyKR;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAaxF"}
|