@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,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fresh context re-planning module.
|
|
3
|
+
*
|
|
4
|
+
* When the completion gate finds critical gaps after a build cycle, this
|
|
5
|
+
* module orchestrates a full re-planning cycle with fresh context:
|
|
6
|
+
* 1. Fetch prior cycle evaluations and completed work units
|
|
7
|
+
* 2. Run a fresh codebase audit against the current worktree state
|
|
8
|
+
* 3. Format prior cycle history as concise context
|
|
9
|
+
* 4. Build a re-planning prompt (original spec + fresh audit + cycle history)
|
|
10
|
+
* 5. Generate and validate a new work plan in a fresh Claude Code session
|
|
11
|
+
* 6. Create work units with the correct cycle_number
|
|
12
|
+
*
|
|
13
|
+
* This replaces the shallow gap-to-work-unit approach of
|
|
14
|
+
* generateRemediationWorkUnits() with full-context AI reasoning.
|
|
15
|
+
*/
|
|
16
|
+
import { generateFactorySOP } from './sop-generator.js';
|
|
17
|
+
import { runCodebaseAudit, formatAuditReport } from './audit.js';
|
|
18
|
+
import { generateAndValidateWorkPlan, buildRetryPrompt, mapTempIdsToUuids, } from './planning.js';
|
|
19
|
+
import { getCycleEvaluations } from './queries/cycle-evaluations.js';
|
|
20
|
+
import { getInstanceWorkUnits, createWorkUnits } from './queries/work-units.js';
|
|
21
|
+
import { updateStrategyExecutionStatus } from './queries/strategies.js';
|
|
22
|
+
import { formatGateContext } from './gate-context.js';
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Constants
|
|
25
|
+
// ============================================================================
|
|
26
|
+
/** Maximum character length for the prior cycle context to keep prompt budget. */
|
|
27
|
+
const MAX_PRIOR_CONTEXT_CHARS = 4_000;
|
|
28
|
+
/** Maximum character length for truncated work unit descriptions. */
|
|
29
|
+
const MAX_WU_DESC_CHARS = 100;
|
|
30
|
+
/** Maximum number of retry attempts for re-plan generation. */
|
|
31
|
+
const MAX_REPLANNING_RETRIES = 2;
|
|
32
|
+
/** Log prefix for this module. */
|
|
33
|
+
const LOG_PREFIX = '[replanning]';
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Gap filtering (strip verification-only gaps before re-planning)
|
|
36
|
+
// ============================================================================
|
|
37
|
+
/**
|
|
38
|
+
* Patterns that indicate a gap is about test execution, build verification,
|
|
39
|
+
* or command execution rather than a missing functional capability.
|
|
40
|
+
*/
|
|
41
|
+
const VERIFICATION_GAP_PATTERNS = [
|
|
42
|
+
/\bverif(y|ied|ication)\b.*\b(test|build|lint|typecheck|npm)\b/i,
|
|
43
|
+
/\b(run|execute|confirm)\b.*\b(test|build|lint|typecheck|npm)\b/i,
|
|
44
|
+
/\bnpm\s+(test|run\s+(build|lint|typecheck))\b/i,
|
|
45
|
+
/\btest\s+suite\s+(execution|run|pass)/i,
|
|
46
|
+
/\bbuild\s+(succeed|pass|valid)/i,
|
|
47
|
+
/\bensure\b.*\b(test|build|lint)\b.*\b(pass|succeed|run)/i,
|
|
48
|
+
];
|
|
49
|
+
/**
|
|
50
|
+
* Returns true if a gap describes a verification/test-execution concern
|
|
51
|
+
* rather than an absent functional capability.
|
|
52
|
+
*/
|
|
53
|
+
function isVerificationGap(gap) {
|
|
54
|
+
const text = `${gap.area} ${gap.description}`;
|
|
55
|
+
return VERIFICATION_GAP_PATTERNS.some((pattern) => pattern.test(text));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Filter completion gate gaps to only include those describing absent
|
|
59
|
+
* functional capabilities. Strips verification-related gaps (test execution,
|
|
60
|
+
* build confirmation, etc.) that are not spec requirements.
|
|
61
|
+
*/
|
|
62
|
+
export function filterFunctionalGaps(gaps) {
|
|
63
|
+
return gaps.filter((gap) => {
|
|
64
|
+
if (isVerificationGap(gap)) {
|
|
65
|
+
console.log(`${LOG_PREFIX} Filtered verification gap from re-planning context: ${gap.area}`);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// Prior cycle context formatter (TEL-2)
|
|
73
|
+
// ============================================================================
|
|
74
|
+
/**
|
|
75
|
+
* Format prior cycle evaluations and completed work units into a concise
|
|
76
|
+
* markdown string for injection into the re-planning prompt.
|
|
77
|
+
*
|
|
78
|
+
* Rules:
|
|
79
|
+
* - Work unit descriptions truncated to ~100 chars to save context
|
|
80
|
+
* - Only completed work units included (not failed/pending)
|
|
81
|
+
* - Gap descriptions kept in full (they are the signal for what is missing)
|
|
82
|
+
* - Total output capped at MAX_PRIOR_CONTEXT_CHARS
|
|
83
|
+
*/
|
|
84
|
+
export function formatPriorCycleContext(evaluations, completedWorkUnits) {
|
|
85
|
+
if (evaluations.length === 0) {
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
const parts = ['## Prior Cycle History', ''];
|
|
89
|
+
for (const evaluation of evaluations) {
|
|
90
|
+
parts.push(`### Cycle ${evaluation.cycleNumber}`);
|
|
91
|
+
parts.push(`Evaluation: ${evaluation.passed ? 'PASSED' : 'FAILED'} ` +
|
|
92
|
+
`(confidence: ${evaluation.confidence})`);
|
|
93
|
+
parts.push(`Summary: ${evaluation.summary}`);
|
|
94
|
+
// Filter to functional gaps only (strip verification/test-execution gaps)
|
|
95
|
+
const functionalGaps = filterFunctionalGaps(evaluation.gaps);
|
|
96
|
+
// Critical gaps
|
|
97
|
+
const criticalGaps = functionalGaps.filter((g) => g.severity === 'critical');
|
|
98
|
+
if (criticalGaps.length > 0) {
|
|
99
|
+
parts.push('Critical gaps found:');
|
|
100
|
+
for (const gap of criticalGaps) {
|
|
101
|
+
parts.push(`- ${gap.area}: ${gap.description}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Important gaps (brief)
|
|
105
|
+
const importantGaps = functionalGaps.filter((g) => g.severity === 'important');
|
|
106
|
+
if (importantGaps.length > 0) {
|
|
107
|
+
parts.push(`Important gaps (${importantGaps.length}): ${importantGaps.map((g) => g.area).join(', ')}`);
|
|
108
|
+
}
|
|
109
|
+
// Work units completed in this cycle
|
|
110
|
+
const cycleUnits = completedWorkUnits.filter((wu) => wu.cycleNumber === evaluation.cycleNumber);
|
|
111
|
+
if (cycleUnits.length > 0) {
|
|
112
|
+
parts.push(`Work completed (${cycleUnits.length} units):`);
|
|
113
|
+
for (const wu of cycleUnits) {
|
|
114
|
+
const desc = wu.description
|
|
115
|
+
? wu.description.length > MAX_WU_DESC_CHARS
|
|
116
|
+
? wu.description.slice(0, MAX_WU_DESC_CHARS) + '...'
|
|
117
|
+
: wu.description
|
|
118
|
+
: 'No description';
|
|
119
|
+
parts.push(`- ${wu.title}: ${desc}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
parts.push('');
|
|
123
|
+
}
|
|
124
|
+
let formatted = parts.join('\n');
|
|
125
|
+
// Truncate if over budget
|
|
126
|
+
if (formatted.length > MAX_PRIOR_CONTEXT_CHARS) {
|
|
127
|
+
const truncationNote = '\n\n[Prior cycle context truncated due to size constraints]';
|
|
128
|
+
formatted = formatted.slice(0, MAX_PRIOR_CONTEXT_CHARS - truncationNote.length) + truncationNote;
|
|
129
|
+
}
|
|
130
|
+
return formatted;
|
|
131
|
+
}
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// Re-planning prompt builder (TEL-3)
|
|
134
|
+
// ============================================================================
|
|
135
|
+
/**
|
|
136
|
+
* Build the re-planning prompt that instructs Claude Code to generate work
|
|
137
|
+
* units for remaining gaps in a multi-cycle factory run.
|
|
138
|
+
*
|
|
139
|
+
* Key differences from buildPlanningPrompt():
|
|
140
|
+
* - Explicitly states this is iteration N (not a fresh start)
|
|
141
|
+
* - Includes prior cycle evaluation history
|
|
142
|
+
* - Includes a fresh codebase audit against the current state
|
|
143
|
+
* - Instructs the planner to only generate work for remaining gaps
|
|
144
|
+
*/
|
|
145
|
+
export function buildReplanningPrompt(specification, blueprint, auditReport, priorCycleContext, cycleNumber, gateContext) {
|
|
146
|
+
const parts = [
|
|
147
|
+
'You are a re-planning agent for a software factory system.',
|
|
148
|
+
`This is ITERATION ${cycleNumber} of a multi-cycle factory run.`,
|
|
149
|
+
'Previous cycles have already built and committed code. Your task is to analyze',
|
|
150
|
+
'what is STILL MISSING and generate work units ONLY for remaining gaps.',
|
|
151
|
+
'',
|
|
152
|
+
'## Blueprint',
|
|
153
|
+
`Name: ${blueprint.name}`,
|
|
154
|
+
];
|
|
155
|
+
if (blueprint.operationalNotes) {
|
|
156
|
+
parts.push('', '## Operational Notes', blueprint.operationalNotes);
|
|
157
|
+
}
|
|
158
|
+
if (blueprint.specConstraints) {
|
|
159
|
+
parts.push('', '## Blueprint Infrastructure Requirements', 'The following requirements are mandated by the factory blueprint and take precedence', 'over spec requirements. Do NOT generate work units that would remove or modify items', 'covered by these requirements, even if the specification appears to prohibit them.', '', blueprint.specConstraints);
|
|
160
|
+
}
|
|
161
|
+
// Resource limits
|
|
162
|
+
const limits = [];
|
|
163
|
+
if (blueprint.maxWorkUnits !== null) {
|
|
164
|
+
limits.push(`- Maximum work units: ${blueprint.maxWorkUnits}`);
|
|
165
|
+
}
|
|
166
|
+
if (blueprint.maxIterationsPerWorkUnit !== null) {
|
|
167
|
+
limits.push(`- Maximum iterations per work unit: ${blueprint.maxIterationsPerWorkUnit}`);
|
|
168
|
+
}
|
|
169
|
+
if (blueprint.maxTokenBudget !== null) {
|
|
170
|
+
limits.push(`- Token budget for entire instance: ${blueprint.maxTokenBudget}`);
|
|
171
|
+
}
|
|
172
|
+
if (blueprint.maxWallClockHours !== null) {
|
|
173
|
+
limits.push(`- Wall-clock time limit: ${blueprint.maxWallClockHours} hours`);
|
|
174
|
+
}
|
|
175
|
+
if (limits.length > 0) {
|
|
176
|
+
parts.push('', '## Resource Limits', ...limits);
|
|
177
|
+
}
|
|
178
|
+
// Pipeline SOP (generated from promise contracts)
|
|
179
|
+
const sop = generateFactorySOP(blueprint.pipelineGraph);
|
|
180
|
+
if (sop) {
|
|
181
|
+
parts.push('', sop);
|
|
182
|
+
}
|
|
183
|
+
parts.push('', '## Original Specification', specification);
|
|
184
|
+
// Prior cycle history (evaluations + completed work)
|
|
185
|
+
if (priorCycleContext) {
|
|
186
|
+
parts.push('', priorCycleContext);
|
|
187
|
+
}
|
|
188
|
+
// Fresh audit results
|
|
189
|
+
if (auditReport) {
|
|
190
|
+
parts.push('', '## Fresh Codebase Audit (current state)', '', 'The following audit was performed against the CURRENT codebase state,', 'which includes all code committed by prior cycles.', '', auditReport);
|
|
191
|
+
}
|
|
192
|
+
if (gateContext) {
|
|
193
|
+
parts.push('', gateContext);
|
|
194
|
+
}
|
|
195
|
+
// Infrastructure gate ownership context
|
|
196
|
+
parts.push('', '## Infrastructure-Owned Gate Verification', '', 'The factory engine pre-creates a "Gate verification" work unit per strategy.', 'This unit is infrastructure-owned and resolved automatically by the gate engine.', 'Do NOT generate work units for gate verification, build validation, typecheck,', 'lint, or test execution -- these are handled by the factory infrastructure.');
|
|
197
|
+
parts.push('', '## Instructions', '', `This is iteration ${cycleNumber}. Prior cycles have already built code and committed it.`, 'The completion gate evaluated each cycle and found remaining gaps (listed above).', 'A fresh codebase audit has been performed against the current state.', '', 'Your task:', '1. Review the original specification', '2. Review what prior cycles built and what gaps the completion gate found', '3. Review the fresh codebase audit to understand what currently exists', '4. Generate work units ONLY for what is STILL MISSING', '', 'CRITICAL RULES:', '- Do NOT duplicate work that prior cycles already completed', '- Do NOT create work units for features the fresh audit shows as already implemented', '- Focus on UNIMPLEMENTED FUNCTIONAL REQUIREMENTS from the specification', '- If the fresh audit contradicts the gate evaluation, trust the fresh audit', '- Each work unit should represent a distinct functional capability the specification requires', '- Each work unit is something to BUILD. Writing and running tests is part of implementing', ' a feature, not a separate deliverable. Do NOT create work units whose sole purpose is', ' to run tests, confirm builds succeed, or verify commands execute.', '- Do NOT create work units for test coverage, type safety, build validity, or', ' runtime behavioral testing -- these are validated by the factory gate system,', ' not by work units. If the gates passed, those dimensions are already verified.', '', '## Output Format', 'Return ONLY a JSON object (no markdown fencing, no commentary) with this exact structure:', '```', '{', ' "workUnits": [', ' {', ' "tempId": "wu-0",', ' "title": "Short descriptive title",', ' "description": "Detailed description of what this work unit implements",', ' "sortOrder": 0,', ' "blockedBy": []', ' }', ' ]', '}', '```', '', 'Rules:', '- Each tempId must be unique (e.g. "wu-0", "wu-1", "wu-2", ...)', '- sortOrder must start at 0 and increment by 1', '- blockedBy must only reference tempIds of other work units in the plan', '- Every work unit must have a non-empty title and description', '- Return at least one work unit');
|
|
198
|
+
if (blueprint.maxWorkUnits !== null) {
|
|
199
|
+
parts.push(`- You MUST produce no more than ${blueprint.maxWorkUnits} work units`);
|
|
200
|
+
}
|
|
201
|
+
parts.push('- Return ONLY the JSON object, nothing else');
|
|
202
|
+
return parts.join('\n');
|
|
203
|
+
}
|
|
204
|
+
// ============================================================================
|
|
205
|
+
// Re-planning phase orchestrator (TEL-4)
|
|
206
|
+
// ============================================================================
|
|
207
|
+
/**
|
|
208
|
+
* Run a full re-planning phase for a factory instance.
|
|
209
|
+
*
|
|
210
|
+
* This is the fresh-context equivalent of runPlanningPhase() but skips
|
|
211
|
+
* worktree/branch creation (already exists from cycle 1). Steps:
|
|
212
|
+
* 1. Fetch all prior cycle evaluations
|
|
213
|
+
* 2. Fetch all work units, filter to completed
|
|
214
|
+
* 3. Run fresh codebase audit against current worktree state
|
|
215
|
+
* 4. Format prior cycle context
|
|
216
|
+
* 5. Build re-planning prompt
|
|
217
|
+
* 6. Generate and validate work plan (with retries)
|
|
218
|
+
* 7. Map tempIds to UUIDs and create work units with correct cycle_number
|
|
219
|
+
*/
|
|
220
|
+
export async function runReplanningPhase(state, config, governor) {
|
|
221
|
+
const cycleNumber = state.completionGateIterations + 1;
|
|
222
|
+
console.log(`${LOG_PREFIX} Starting re-planning phase for instance ${state.instanceId} ` +
|
|
223
|
+
`(cycle ${cycleNumber})`);
|
|
224
|
+
// Guard: must have worktree and specification
|
|
225
|
+
if (!state.worktreePath || !state.specification) {
|
|
226
|
+
const error = 'Missing worktree path or specification for re-planning';
|
|
227
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
228
|
+
return { success: false, error, workUnitsCreated: 0 };
|
|
229
|
+
}
|
|
230
|
+
// Step 1: Fetch prior cycle evaluations
|
|
231
|
+
let evaluations;
|
|
232
|
+
try {
|
|
233
|
+
evaluations = await getCycleEvaluations(state.instanceId);
|
|
234
|
+
console.log(`${LOG_PREFIX} Fetched ${evaluations.length} prior cycle evaluation(s)`);
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
const error = `Failed to fetch cycle evaluations: ${err instanceof Error ? err.message : String(err)}`;
|
|
238
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
239
|
+
return { success: false, error, workUnitsCreated: 0 };
|
|
240
|
+
}
|
|
241
|
+
// Step 2: Fetch completed work units
|
|
242
|
+
let allWorkUnits;
|
|
243
|
+
try {
|
|
244
|
+
allWorkUnits = await getInstanceWorkUnits(state.instanceId);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
const error = `Failed to fetch work units: ${err instanceof Error ? err.message : String(err)}`;
|
|
248
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
249
|
+
return { success: false, error, workUnitsCreated: 0 };
|
|
250
|
+
}
|
|
251
|
+
const completedUnits = allWorkUnits.filter((wu) => wu.status === 'completed' && !wu.infrastructureOwned);
|
|
252
|
+
console.log(`${LOG_PREFIX} ${completedUnits.length} completed work unit(s) from prior cycles`);
|
|
253
|
+
// Step 3: Run fresh codebase audit (best-effort)
|
|
254
|
+
let auditReportText = null;
|
|
255
|
+
try {
|
|
256
|
+
const auditReport = await runCodebaseAudit(state.worktreePath, state.specification, state.blueprint, config, governor);
|
|
257
|
+
if (auditReport) {
|
|
258
|
+
auditReportText = formatAuditReport(auditReport, state.blueprint);
|
|
259
|
+
console.log(`${LOG_PREFIX} Fresh audit completed: ` +
|
|
260
|
+
`${auditReport.existingImplementations.length} existing, ` +
|
|
261
|
+
`${auditReport.partialImplementations.length} partial, ` +
|
|
262
|
+
`${auditReport.gaps.length} gaps`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
console.warn(`${LOG_PREFIX} Fresh audit failed (non-fatal): ` +
|
|
267
|
+
`${err instanceof Error ? err.message : String(err)}`);
|
|
268
|
+
}
|
|
269
|
+
// Step 4: Format prior cycle context
|
|
270
|
+
const priorContext = formatPriorCycleContext(evaluations, completedUnits);
|
|
271
|
+
// Step 5: Build re-planning prompt -- include gate context so planner doesn't create
|
|
272
|
+
// work units for dimensions the gate layer already validates
|
|
273
|
+
const gateContext = formatGateContext(state.blueprint);
|
|
274
|
+
const originalPrompt = buildReplanningPrompt(state.specification, state.blueprint, auditReportText, priorContext, cycleNumber, gateContext);
|
|
275
|
+
// Step 6: Generate and validate work plan (with retries)
|
|
276
|
+
let currentPrompt = originalPrompt;
|
|
277
|
+
let workPlan = null;
|
|
278
|
+
let lastError = '';
|
|
279
|
+
for (let attempt = 0; attempt <= MAX_REPLANNING_RETRIES; attempt++) {
|
|
280
|
+
if (attempt > 0) {
|
|
281
|
+
console.log(`${LOG_PREFIX} Retry ${attempt}/${MAX_REPLANNING_RETRIES} -- previous error: ${lastError}`);
|
|
282
|
+
currentPrompt = buildRetryPrompt(originalPrompt, lastError);
|
|
283
|
+
}
|
|
284
|
+
if (governor)
|
|
285
|
+
await governor.acquireSlot('factory');
|
|
286
|
+
let planResult;
|
|
287
|
+
try {
|
|
288
|
+
planResult = await generateAndValidateWorkPlan(currentPrompt, config, state.worktreePath, state.blueprint);
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
if (governor)
|
|
292
|
+
governor.releaseSlot('factory');
|
|
293
|
+
}
|
|
294
|
+
if (planResult.success) {
|
|
295
|
+
workPlan = planResult.workPlan;
|
|
296
|
+
if (attempt > 0) {
|
|
297
|
+
console.log(`${LOG_PREFIX} Re-plan generation succeeded on retry ${attempt}`);
|
|
298
|
+
}
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
lastError = planResult.error;
|
|
302
|
+
console.error(`${LOG_PREFIX} Re-plan generation attempt ${attempt + 1} failed: ${lastError}`);
|
|
303
|
+
}
|
|
304
|
+
if (workPlan === null) {
|
|
305
|
+
const error = `Re-plan generation failed after ${MAX_REPLANNING_RETRIES + 1} attempt(s): ${lastError}`;
|
|
306
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
307
|
+
return { success: false, error, workUnitsCreated: 0 };
|
|
308
|
+
}
|
|
309
|
+
// Check maxWorkUnits limit including existing units
|
|
310
|
+
if (state.blueprint.maxWorkUnits !== null) {
|
|
311
|
+
const totalAfter = allWorkUnits.length + workPlan.workUnits.length;
|
|
312
|
+
if (totalAfter > state.blueprint.maxWorkUnits) {
|
|
313
|
+
const error = `Re-plan would create ${workPlan.workUnits.length} work units, ` +
|
|
314
|
+
`but total (${allWorkUnits.length} existing + ${workPlan.workUnits.length} new) ` +
|
|
315
|
+
`exceeds maxWorkUnits limit (${state.blueprint.maxWorkUnits})`;
|
|
316
|
+
console.warn(`${LOG_PREFIX} ${error}`);
|
|
317
|
+
return { success: false, error, workUnitsCreated: 0 };
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Step 7: Fetch strategies for strategy-aware tagging (best-effort)
|
|
321
|
+
let strategies = [];
|
|
322
|
+
try {
|
|
323
|
+
const { getStrategiesByFactoryInstance } = await import('./strategy-design.js');
|
|
324
|
+
strategies = await getStrategiesByFactoryInstance(state.instanceId);
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
// Non-fatal: re-planning works without strategy tagging
|
|
328
|
+
}
|
|
329
|
+
// Step 8: Map tempIds to UUIDs and create work units
|
|
330
|
+
const maxSortOrder = allWorkUnits.reduce((max, wu) => Math.max(max, wu.sortOrder), -1);
|
|
331
|
+
let mappedUnits;
|
|
332
|
+
try {
|
|
333
|
+
mappedUnits = mapTempIdsToUuids(workPlan.workUnits).map((u, i) => ({
|
|
334
|
+
...u,
|
|
335
|
+
sortOrder: maxSortOrder + 1 + i,
|
|
336
|
+
cycleNumber,
|
|
337
|
+
strategyId: matchWorkUnitToStrategy(u.title, u.description, strategies),
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
const error = `Failed to map tempIds to UUIDs: ${err instanceof Error ? err.message : String(err)}`;
|
|
342
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
343
|
+
return { success: false, error, workUnitsCreated: 0 };
|
|
344
|
+
}
|
|
345
|
+
let created;
|
|
346
|
+
try {
|
|
347
|
+
created = await createWorkUnits(state.instanceId, mappedUnits);
|
|
348
|
+
console.log(`${LOG_PREFIX} Re-planning cycle ${cycleNumber}: created ${created.length} work unit(s)`);
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
const error = `Failed to create work units: ${err instanceof Error ? err.message : String(err)}`;
|
|
352
|
+
console.error(`${LOG_PREFIX} ${error}`);
|
|
353
|
+
return { success: false, error, workUnitsCreated: 0 };
|
|
354
|
+
}
|
|
355
|
+
// Reset only the strategies that received new work units back to 'pending'
|
|
356
|
+
// so the scheduler picks them up. Strategies with no new work assigned
|
|
357
|
+
// stay completed -- resetting them would cause unnecessary re-execution.
|
|
358
|
+
const assignedStrategyIds = new Set(mappedUnits
|
|
359
|
+
.map((u) => u.strategyId)
|
|
360
|
+
.filter((id) => id !== undefined));
|
|
361
|
+
if (assignedStrategyIds.size > 0 && strategies.length > 0) {
|
|
362
|
+
const toReset = strategies.filter((s) => assignedStrategyIds.has(s.id) && s.executionStatus === 'completed');
|
|
363
|
+
if (toReset.length > 0) {
|
|
364
|
+
await Promise.all(toReset.map((s) => updateStrategyExecutionStatus(s.id, 'pending')));
|
|
365
|
+
console.log(`${LOG_PREFIX} Reset ${toReset.length} strategy/strategies to 'pending' ` +
|
|
366
|
+
`for re-planning cycle ${cycleNumber}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return { success: true, workUnitsCreated: created.length };
|
|
370
|
+
}
|
|
371
|
+
// ============================================================================
|
|
372
|
+
// Strategy matching for re-planned work units
|
|
373
|
+
// ============================================================================
|
|
374
|
+
/**
|
|
375
|
+
* Best-effort matching of a new work unit to an existing strategy based on
|
|
376
|
+
* text similarity between the work unit title/description and strategy
|
|
377
|
+
* name/description. Returns the most relevant strategy ID or undefined.
|
|
378
|
+
*/
|
|
379
|
+
function matchWorkUnitToStrategy(title, description, strategies) {
|
|
380
|
+
if (strategies.length === 0)
|
|
381
|
+
return undefined;
|
|
382
|
+
const text = `${title} ${description}`.toLowerCase();
|
|
383
|
+
let bestScore = 0;
|
|
384
|
+
let bestId;
|
|
385
|
+
for (const strategy of strategies) {
|
|
386
|
+
const keywords = [
|
|
387
|
+
strategy.name.toLowerCase(),
|
|
388
|
+
...(strategy.description?.toLowerCase().split(/\s+/) ?? []),
|
|
389
|
+
];
|
|
390
|
+
let score = 0;
|
|
391
|
+
for (const kw of keywords) {
|
|
392
|
+
if (kw.length >= 3 && text.includes(kw)) {
|
|
393
|
+
score += kw.length;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
if (score > bestScore) {
|
|
397
|
+
bestScore = score;
|
|
398
|
+
bestId = strategy.id;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return bestId;
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=replanning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replanning.js","sourceRoot":"","sources":["../src/replanning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource limit checking for factory instances.
|
|
3
|
+
*
|
|
4
|
+
* Enforces blueprint resource limits (token budget, wall-clock time,
|
|
5
|
+
* per-unit iterations, work unit count) and returns a structured result
|
|
6
|
+
* indicating whether any limit has been exceeded.
|
|
7
|
+
*
|
|
8
|
+
* Checks are designed to run after each session completion and gate
|
|
9
|
+
* evaluation. All checks are based on the blueprint configuration --
|
|
10
|
+
* null limits are treated as unlimited.
|
|
11
|
+
*/
|
|
12
|
+
import type { FactoryInstanceState, FactoryWorkUnit, FactorySession } from './types.js';
|
|
13
|
+
/** Detail about a specific resource limit that was exceeded. */
|
|
14
|
+
export interface ResourceLimitDetail {
|
|
15
|
+
/** Which limit was exceeded. */
|
|
16
|
+
limitType: 'token_budget' | 'cost_budget' | 'wall_clock' | 'iteration_count' | 'work_unit_count' | 'instance_iterations';
|
|
17
|
+
/** The current value. */
|
|
18
|
+
currentValue: number;
|
|
19
|
+
/** The configured maximum. */
|
|
20
|
+
maxValue: number;
|
|
21
|
+
/** Human-readable description. */
|
|
22
|
+
description: string;
|
|
23
|
+
}
|
|
24
|
+
/** Result of checking all resource limits for an instance. */
|
|
25
|
+
export interface ResourceLimitResult {
|
|
26
|
+
/** Whether any limit has been exceeded. */
|
|
27
|
+
exceeded: boolean;
|
|
28
|
+
/** Summary reason string (empty if not exceeded). */
|
|
29
|
+
reason: string;
|
|
30
|
+
/** Detailed breakdown of the exceeded limit(s). */
|
|
31
|
+
details: ResourceLimitDetail[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check all resource limits for a factory instance.
|
|
35
|
+
*
|
|
36
|
+
* Evaluates four resource limits defined in the blueprint:
|
|
37
|
+
* 1. Token budget: aggregate tokens across all factory sessions
|
|
38
|
+
* 2. Wall-clock time: elapsed time since instance started
|
|
39
|
+
* 3. Iteration count: per-work-unit iteration limit
|
|
40
|
+
* 4. Work unit count: total work units vs max_work_units
|
|
41
|
+
*
|
|
42
|
+
* Returns immediately on the first exceeded limit found. All limits
|
|
43
|
+
* configured as null in the blueprint are treated as unlimited.
|
|
44
|
+
*
|
|
45
|
+
* @param instanceState - The in-memory state of the factory instance.
|
|
46
|
+
* @returns A result indicating whether any limit has been exceeded.
|
|
47
|
+
*/
|
|
48
|
+
export declare function checkResourceLimits(instanceState: FactoryInstanceState): Promise<ResourceLimitResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Sum token counts across a list of factory sessions.
|
|
51
|
+
* Sessions with null token_count are treated as 0.
|
|
52
|
+
*/
|
|
53
|
+
export declare function sumSessionTokens(sessions: FactorySession[]): number;
|
|
54
|
+
/**
|
|
55
|
+
* Check resource limits using pre-fetched data (no API calls).
|
|
56
|
+
*
|
|
57
|
+
* This is useful when the caller has already fetched work units and
|
|
58
|
+
* sessions and wants to avoid redundant API calls. Performs the same
|
|
59
|
+
* checks as checkResourceLimits but operates on provided data.
|
|
60
|
+
*/
|
|
61
|
+
export declare function checkResourceLimitsSync(instanceState: FactoryInstanceState, sessions: FactorySession[], workUnits: FactoryWorkUnit[]): ResourceLimitResult;
|
|
62
|
+
//# sourceMappingURL=resource-limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-limits.d.ts","sourceRoot":"","sources":["../src/resource-limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAEpB,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAC;AAQpB,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,SAAS,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,qBAAqB,CAAC;IACzH,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAiD9B;AAoMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAEnE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,oBAAoB,EACnC,QAAQ,EAAE,cAAc,EAAE,EAC1B,SAAS,EAAE,eAAe,EAAE,GAC3B,mBAAmB,CAkGrB"}
|