@entelligentsia/forgecli 0.10.1 → 0.11.2
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/CHANGELOG.md +78 -0
- package/README.md +21 -3
- package/dist/CHANGELOG-forge-plugin.md +22 -0
- package/dist/extensions/forgecli/add-pipeline.d.ts +19 -0
- package/dist/extensions/forgecli/add-pipeline.js +143 -0
- package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/add-task.d.ts +20 -0
- package/dist/extensions/forgecli/add-task.js +154 -0
- package/dist/extensions/forgecli/add-task.js.map +1 -0
- package/dist/extensions/forgecli/calibrate.d.ts +61 -0
- package/dist/extensions/forgecli/calibrate.js +488 -0
- package/dist/extensions/forgecli/calibrate.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.d.ts +9 -1
- package/dist/extensions/forgecli/fix-bug.js +70 -8
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-commands.js +15 -22
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.js +34 -7
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/forge-update-command.d.ts +9 -0
- package/dist/extensions/forgecli/forge-update-command.js +106 -7
- package/dist/extensions/forgecli/forge-update-command.js.map +1 -1
- package/dist/extensions/forgecli/health-check.d.ts +22 -1
- package/dist/extensions/forgecli/health-check.js +177 -4
- package/dist/extensions/forgecli/health-check.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.d.ts +25 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +104 -9
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/hooks/check-update.d.ts +81 -0
- package/dist/extensions/forgecli/hooks/check-update.js +308 -0
- package/dist/extensions/forgecli/hooks/check-update.js.map +1 -0
- package/dist/extensions/forgecli/hooks/forge-permissions.d.ts +32 -0
- package/dist/extensions/forgecli/hooks/forge-permissions.js +119 -0
- package/dist/extensions/forgecli/hooks/forge-permissions.js.map +1 -0
- package/dist/extensions/forgecli/hooks/triage-error.d.ts +23 -0
- package/dist/extensions/forgecli/hooks/triage-error.js +62 -0
- package/dist/extensions/forgecli/hooks/triage-error.js.map +1 -0
- package/dist/extensions/forgecli/hooks/write-guard.d.ts +28 -0
- package/dist/extensions/forgecli/hooks/write-guard.js +225 -0
- package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -0
- package/dist/extensions/forgecli/index.js +60 -0
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/init-context.d.ts +1 -1
- package/dist/extensions/forgecli/init-context.js +21 -6
- package/dist/extensions/forgecli/init-context.js.map +1 -1
- package/dist/extensions/forgecli/materialize.d.ts +16 -0
- package/dist/extensions/forgecli/materialize.js +195 -0
- package/dist/extensions/forgecli/materialize.js.map +1 -0
- package/dist/extensions/forgecli/migrate.d.ts +19 -0
- package/dist/extensions/forgecli/migrate.js +258 -0
- package/dist/extensions/forgecli/migrate.js.map +1 -0
- package/dist/extensions/forgecli/migration-engine.d.ts +111 -0
- package/dist/extensions/forgecli/migration-engine.js +533 -0
- package/dist/extensions/forgecli/migration-engine.js.map +1 -0
- package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
- package/dist/extensions/forgecli/quiz-agent.js +98 -0
- package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
- package/dist/extensions/forgecli/remove-command.d.ts +17 -0
- package/dist/extensions/forgecli/remove-command.js +124 -0
- package/dist/extensions/forgecli/remove-command.js.map +1 -0
- package/dist/extensions/forgecli/report-bug.d.ts +25 -0
- package/dist/extensions/forgecli/report-bug.js +159 -0
- package/dist/extensions/forgecli/report-bug.js.map +1 -0
- package/dist/extensions/forgecli/retrospective.d.ts +19 -0
- package/dist/extensions/forgecli/retrospective.js +156 -0
- package/dist/extensions/forgecli/retrospective.js.map +1 -0
- package/dist/extensions/forgecli/run-sprint.js +34 -0
- package/dist/extensions/forgecli/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/run-task.d.ts +9 -1
- package/dist/extensions/forgecli/run-task.js +64 -10
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/session-registry.d.ts +27 -2
- package/dist/extensions/forgecli/session-registry.js +52 -1
- package/dist/extensions/forgecli/session-registry.js.map +1 -1
- package/dist/extensions/forgecli/status-command.d.ts +19 -0
- package/dist/extensions/forgecli/status-command.js +140 -0
- package/dist/extensions/forgecli/status-command.js.map +1 -0
- package/dist/extensions/forgecli/store-query.d.ts +22 -0
- package/dist/extensions/forgecli/store-query.js +107 -0
- package/dist/extensions/forgecli/store-query.js.map +1 -0
- package/dist/extensions/forgecli/store-repair.d.ts +17 -0
- package/dist/extensions/forgecli/store-repair.js +123 -0
- package/dist/extensions/forgecli/store-repair.js.map +1 -0
- package/dist/extensions/forgecli/thread-switcher.js +213 -28
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
- package/dist/extensions/forgecli/update-tools.d.ts +23 -0
- package/dist/extensions/forgecli/update-tools.js +136 -0
- package/dist/extensions/forgecli/update-tools.js.map +1 -0
- package/dist/extensions/forgecli/viewport-theme.js +4 -0
- package/dist/extensions/forgecli/viewport-theme.js.map +1 -1
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/config.schema.json +83 -0
- package/dist/forge-payload/.schemas/migrations.json +2049 -0
- package/dist/forge-payload/commands/regenerate.md +17 -1
- package/dist/forge-payload/meta/personas/README.md +16 -0
- package/dist/forge-payload/meta/personas/meta-architect.md +70 -0
- package/dist/forge-payload/meta/personas/meta-bug-fixer.md +73 -0
- package/dist/forge-payload/meta/personas/meta-collator.md +72 -0
- package/dist/forge-payload/meta/personas/meta-engineer.md +70 -0
- package/dist/forge-payload/meta/personas/meta-orchestrator.md +71 -0
- package/dist/forge-payload/meta/personas/meta-product-manager.md +82 -0
- package/dist/forge-payload/meta/personas/meta-qa-engineer.md +91 -0
- package/dist/forge-payload/meta/personas/meta-supervisor.md +92 -0
- package/dist/forge-payload/meta/skill-recommendations.md +154 -0
- package/dist/forge-payload/meta/skills/meta-architect-skills.md +43 -0
- package/dist/forge-payload/meta/skills/meta-bug-fixer-skills.md +43 -0
- package/dist/forge-payload/meta/skills/meta-collator-skills.md +41 -0
- package/dist/forge-payload/meta/skills/meta-engineer-skills.md +43 -0
- package/dist/forge-payload/meta/skills/meta-generic-skills.md +58 -0
- package/dist/forge-payload/meta/skills/meta-qa-engineer-skills.md +46 -0
- package/dist/forge-payload/meta/skills/meta-supervisor-skills.md +43 -0
- package/dist/forge-payload/meta/store-schema/bug.schema.md +71 -0
- package/dist/forge-payload/meta/store-schema/event.schema.md +76 -0
- package/dist/forge-payload/meta/store-schema/feature.schema.md +65 -0
- package/dist/forge-payload/meta/store-schema/sprint.schema.md +64 -0
- package/dist/forge-payload/meta/store-schema/task.schema.md +78 -0
- package/dist/forge-payload/meta/templates/meta-code-review.md +26 -0
- package/dist/forge-payload/meta/templates/meta-plan-review.md +28 -0
- package/dist/forge-payload/meta/templates/meta-plan.md +28 -0
- package/dist/forge-payload/meta/templates/meta-progress.md +25 -0
- package/dist/forge-payload/meta/templates/meta-retrospective.md +28 -0
- package/dist/forge-payload/meta/templates/meta-sprint-manifest.md +26 -0
- package/dist/forge-payload/meta/templates/meta-sprint-requirements.md +91 -0
- package/dist/forge-payload/meta/templates/meta-task-prompt.md +26 -0
- package/dist/forge-payload/meta/tool-specs/collate.spec.md +88 -0
- package/dist/forge-payload/meta/tool-specs/generation-manifest.spec.md +139 -0
- package/dist/forge-payload/meta/tool-specs/manage-config.spec.md +143 -0
- package/dist/forge-payload/meta/tool-specs/seed-store.spec.md +91 -0
- package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +328 -0
- package/dist/forge-payload/meta/tool-specs/validate-store.spec.md +191 -0
- package/dist/forge-payload/meta/workflows/_fragments/context-injection.md +75 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +73 -0
- package/dist/forge-payload/meta/workflows/_fragments/finalize.md +13 -0
- package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +73 -0
- package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +38 -0
- package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +39 -0
- package/dist/forge-payload/meta/workflows/meta-approve.md +119 -0
- package/dist/forge-payload/meta/workflows/meta-collate.md +89 -0
- package/dist/forge-payload/meta/workflows/meta-commit.md +93 -0
- package/dist/forge-payload/meta/workflows/meta-enhance.md +286 -0
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +501 -0
- package/dist/forge-payload/meta/workflows/meta-implement.md +132 -0
- package/dist/forge-payload/meta/workflows/meta-migrate.md +455 -0
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +993 -0
- package/dist/forge-payload/meta/workflows/meta-plan-task.md +133 -0
- package/dist/forge-payload/meta/workflows/meta-quiz-agent.md +135 -0
- package/dist/forge-payload/meta/workflows/meta-retrospective.md +65 -0
- package/dist/forge-payload/meta/workflows/meta-review-implementation.md +119 -0
- package/dist/forge-payload/meta/workflows/meta-review-plan.md +108 -0
- package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +65 -0
- package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +76 -0
- package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +147 -0
- package/dist/forge-payload/meta/workflows/meta-update-implementation.md +76 -0
- package/dist/forge-payload/meta/workflows/meta-update-plan.md +76 -0
- package/dist/forge-payload/meta/workflows/meta-validate.md +111 -0
- package/dist/forge-payload/tools/check-structure.cjs +344 -0
- package/dist/forge-payload/tools/list-skills.js +76 -0
- package/dist/forge-payload/tools/store-cli.cjs +27 -1
- package/dist/forge-payload/tools/substitute-placeholders.cjs +60 -8
- package/dist/forge-payload/tools/verify-integrity.cjs +86 -0
- package/package.json +2 -2
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
// calibrate.ts — /forge:calibrate orchestrator handler (FORGE-S23-T08).
|
|
2
|
+
//
|
|
3
|
+
// 4-phase flow matching calibrate.md:
|
|
4
|
+
// Phase 1 — Structural-element readiness check (advisory, never blocks)
|
|
5
|
+
// Phase 2 — Hash drift detection (deterministic). Auto-initializes baseline if absent.
|
|
6
|
+
// Phase 3 — Architect patch proposal via runForgeSubagent
|
|
7
|
+
// Phase 4 — Approval gate (ctx.ui.confirm) + patch application + calibration history write
|
|
8
|
+
//
|
|
9
|
+
// Non-interactive mode (FORGE_YES=1 or FORGE_NON_INTERACTIVE=1): auto-apply all patches.
|
|
10
|
+
//
|
|
11
|
+
// Iron Laws:
|
|
12
|
+
// IL1 — code only under forge-cli/src/extensions/forgecli/
|
|
13
|
+
// IL6 — no shell-string interpolation
|
|
14
|
+
// IL7 — every failure path emits ctx.ui.notify and returns; no silent continuation
|
|
15
|
+
// IL10 — LLM dispatch for patch-proposal phase goes through runForgeSubagent
|
|
16
|
+
import * as crypto from "node:crypto";
|
|
17
|
+
import * as fs from "node:fs";
|
|
18
|
+
import * as path from "node:path";
|
|
19
|
+
import { computeCalibrationBaseline } from "./init-context.js";
|
|
20
|
+
import { loadForgePersona, runForgeSubagent, getFinalOutput } from "./forge-subagent.js";
|
|
21
|
+
import { getBundledPayloadRoot } from "./forge-init.js";
|
|
22
|
+
// ── Bundled forge version ─────────────────────────────────────────────────
|
|
23
|
+
/**
|
|
24
|
+
* Read the bundled forge version from .claude-plugin/plugin.json inside the
|
|
25
|
+
* bundled payload root. Falls back to "0.0.0" on any error.
|
|
26
|
+
* Mirrors the private getBundledForgeVersion() in forge-init.ts.
|
|
27
|
+
*/
|
|
28
|
+
function getBundledForgeVersion() {
|
|
29
|
+
try {
|
|
30
|
+
const pluginPath = path.join(getBundledPayloadRoot(), ".claude-plugin", "plugin.json");
|
|
31
|
+
const raw = fs.readFileSync(pluginPath, "utf8");
|
|
32
|
+
const plugin = JSON.parse(raw);
|
|
33
|
+
return typeof plugin.version === "string" ? plugin.version : "0.0.0";
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return "0.0.0";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ── Non-interactive mode ───────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Returns true when running in non-interactive / CI mode.
|
|
42
|
+
*
|
|
43
|
+
* Activated by either:
|
|
44
|
+
* - FORGE_YES=1 — ergonomic shell shorthand
|
|
45
|
+
* - FORGE_NON_INTERACTIVE=1 — set by forge --non-interactive flag
|
|
46
|
+
*/
|
|
47
|
+
function isNonInteractive() {
|
|
48
|
+
return process.env.FORGE_YES === "1" || process.env.FORGE_NON_INTERACTIVE === "1";
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parse /forge:calibrate arguments.
|
|
52
|
+
* Supports: --path <dir>
|
|
53
|
+
*/
|
|
54
|
+
export function parseCalibrateFlags(args) {
|
|
55
|
+
const parts = args.trim().split(/\s+/).filter(Boolean);
|
|
56
|
+
let customPath = null;
|
|
57
|
+
for (let i = 0; i < parts.length; i++) {
|
|
58
|
+
if (parts[i] === "--path" && i + 1 < parts.length) {
|
|
59
|
+
customPath = parts[i + 1];
|
|
60
|
+
i++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { path: customPath };
|
|
64
|
+
}
|
|
65
|
+
/** Read and parse .forge/config.json from projectRoot. Returns null on any error. */
|
|
66
|
+
export function readForgeConfig(projectRoot) {
|
|
67
|
+
const cfgPath = path.join(projectRoot, ".forge", "config.json");
|
|
68
|
+
try {
|
|
69
|
+
const raw = fs.readFileSync(cfgPath, "utf8");
|
|
70
|
+
return JSON.parse(raw);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Write ForgeConfig to .forge/config.json. */
|
|
77
|
+
function writeForgeConfig(projectRoot, cfg) {
|
|
78
|
+
const cfgPath = path.join(projectRoot, ".forge", "config.json");
|
|
79
|
+
fs.writeFileSync(cfgPath, JSON.stringify(cfg, null, 2) + "\n", "utf8");
|
|
80
|
+
}
|
|
81
|
+
// ── Hash computation ──────────────────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Compute SHA-256 of MASTER_INDEX.md, stripping blank lines and HTML comment lines.
|
|
84
|
+
* Returns null if the file does not exist.
|
|
85
|
+
*/
|
|
86
|
+
export function computeCurrentHash(projectRoot, kbPath) {
|
|
87
|
+
const masterIndexPath = path.join(projectRoot, kbPath, "MASTER_INDEX.md");
|
|
88
|
+
try {
|
|
89
|
+
const content = fs.readFileSync(masterIndexPath, "utf8");
|
|
90
|
+
const lines = content.split("\n").filter((l) => l.trim() && !l.trim().startsWith("<!--"));
|
|
91
|
+
return crypto.createHash("sha256").update(lines.join("\n")).digest("hex");
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const SECTION_CATEGORY_MAP = [
|
|
98
|
+
{
|
|
99
|
+
keywords: [
|
|
100
|
+
"stack",
|
|
101
|
+
"architecture",
|
|
102
|
+
"routing",
|
|
103
|
+
"database",
|
|
104
|
+
"deployment",
|
|
105
|
+
"processes",
|
|
106
|
+
"schema",
|
|
107
|
+
"checklist",
|
|
108
|
+
"convention",
|
|
109
|
+
],
|
|
110
|
+
category: "technical",
|
|
111
|
+
targets: ["personas:engineer", "skills:engineer-skills", "skills:supervisor-skills"],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
keywords: ["entity", "domain", "feature", "business", "model"],
|
|
115
|
+
category: "business",
|
|
116
|
+
targets: ["personas:all"],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
keywords: ["retrospective", "iron law", "lesson", "learning"],
|
|
120
|
+
category: "retrospective",
|
|
121
|
+
targets: ["personas:all"],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
keywords: ["acceptance", "criteria", "validation", "qa"],
|
|
125
|
+
category: "acceptance criteria",
|
|
126
|
+
targets: ["personas:product-manager", "skills:qa-engineer"],
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
/**
|
|
130
|
+
* Categorize drift by scanning MASTER_INDEX.md content for section keywords
|
|
131
|
+
* and identifying new sprints since last calibration.
|
|
132
|
+
*/
|
|
133
|
+
export function categorizeDrift(projectRoot, kbPath, baseline) {
|
|
134
|
+
const found = new Map();
|
|
135
|
+
// Read MASTER_INDEX.md for keyword-based section categorization
|
|
136
|
+
const masterIndexPath = path.join(projectRoot, kbPath, "MASTER_INDEX.md");
|
|
137
|
+
let masterIndexContent = "";
|
|
138
|
+
try {
|
|
139
|
+
masterIndexContent = fs.readFileSync(masterIndexPath, "utf8").toLowerCase();
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// If we cannot read it, report generic technical drift
|
|
143
|
+
found.set("technical", {
|
|
144
|
+
category: "technical",
|
|
145
|
+
evidence: "MASTER_INDEX.md changed (content unreadable)",
|
|
146
|
+
targets: ["personas:engineer", "skills:engineer-skills", "skills:supervisor-skills"],
|
|
147
|
+
});
|
|
148
|
+
return [...found.values()];
|
|
149
|
+
}
|
|
150
|
+
// Check each category's keywords against content
|
|
151
|
+
for (const mapping of SECTION_CATEGORY_MAP) {
|
|
152
|
+
const matched = mapping.keywords.filter((kw) => masterIndexContent.includes(kw));
|
|
153
|
+
if (matched.length > 0) {
|
|
154
|
+
if (!found.has(mapping.category)) {
|
|
155
|
+
found.set(mapping.category, {
|
|
156
|
+
category: mapping.category,
|
|
157
|
+
evidence: `MASTER_INDEX.md contains ${mapping.category} content (keywords: ${matched.slice(0, 3).join(", ")})`,
|
|
158
|
+
targets: [...mapping.targets],
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Identify new sprints since last calibration
|
|
164
|
+
const coveredIds = new Set(Array.isArray(baseline.sprintsCovered) ? baseline.sprintsCovered : []);
|
|
165
|
+
const storeSprintsDir = path.join(projectRoot, ".forge", "store", "sprints");
|
|
166
|
+
let newSprintCount = 0;
|
|
167
|
+
try {
|
|
168
|
+
const files = fs.readdirSync(storeSprintsDir).filter((f) => f.endsWith(".json"));
|
|
169
|
+
for (const f of files) {
|
|
170
|
+
try {
|
|
171
|
+
const raw = fs.readFileSync(path.join(storeSprintsDir, f), "utf8");
|
|
172
|
+
const sprint = JSON.parse(raw);
|
|
173
|
+
if (typeof sprint.sprintId === "string" &&
|
|
174
|
+
(sprint.status === "done" || sprint.status === "retrospective-done") &&
|
|
175
|
+
!coveredIds.has(sprint.sprintId)) {
|
|
176
|
+
newSprintCount++;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Skip malformed sprint file
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Store not accessible
|
|
186
|
+
}
|
|
187
|
+
if (newSprintCount > 0) {
|
|
188
|
+
if (!found.has("retrospective")) {
|
|
189
|
+
found.set("retrospective", {
|
|
190
|
+
category: "retrospective",
|
|
191
|
+
evidence: `${newSprintCount} new completed sprint(s) since last calibration`,
|
|
192
|
+
targets: ["personas:all"],
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// If nothing found but hash changed, report generic technical drift
|
|
197
|
+
if (found.size === 0) {
|
|
198
|
+
found.set("technical", {
|
|
199
|
+
category: "technical",
|
|
200
|
+
evidence: "MASTER_INDEX.md hash changed — specific section changes not identified",
|
|
201
|
+
targets: ["personas:engineer", "skills:engineer-skills", "skills:supervisor-skills"],
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return [...found.values()];
|
|
205
|
+
}
|
|
206
|
+
function buildPatchProposalPrompt(categories) {
|
|
207
|
+
const lines = [
|
|
208
|
+
"# Forge Calibration — Patch Proposal Request",
|
|
209
|
+
"",
|
|
210
|
+
"You are the Forge Architect. Drift has been detected in the project knowledge base.",
|
|
211
|
+
"Review the drift categories below and propose surgical regeneration patches.",
|
|
212
|
+
"",
|
|
213
|
+
"## Drift Report",
|
|
214
|
+
"",
|
|
215
|
+
];
|
|
216
|
+
for (let i = 0; i < categories.length; i++) {
|
|
217
|
+
const cat = categories[i];
|
|
218
|
+
lines.push(`### Category ${i + 1}: ${cat.category.charAt(0).toUpperCase() + cat.category.slice(1)}`, `Evidence: ${cat.evidence}`, `Suggested targets: ${cat.targets.join(", ")}`, "");
|
|
219
|
+
}
|
|
220
|
+
lines.push("## Instructions", "", "For each drift category, output a JSON block (one per patch) with this exact structure:", "", "```json", "{", ' "target": "<target string e.g. personas:engineer or skills:engineer-skills>",', ' "type": "regenerate",', ' "rationale": "<brief explanation of why this target needs regeneration>"', "}", "```", "", "Output one json block per proposed patch. Add prose analysis before or after the blocks.", "If a suggested target is redundant or not needed, omit it and explain why.", "", "Targets must be from this set:", "- personas:engineer", "- personas:product-manager", "- personas:all (full persona rebuild)", "- skills:engineer-skills", "- skills:supervisor-skills", "- skills:qa-engineer", "- skills:all (full skills rebuild)");
|
|
221
|
+
return lines.join("\n");
|
|
222
|
+
}
|
|
223
|
+
/** Extract PatchProposal objects from the architect's free-form response text. */
|
|
224
|
+
export function extractPatchProposals(text) {
|
|
225
|
+
const proposals = [];
|
|
226
|
+
const blockRegex = /```json\s*([\s\S]+?)\s*```/g;
|
|
227
|
+
let match;
|
|
228
|
+
while ((match = blockRegex.exec(text)) !== null) {
|
|
229
|
+
try {
|
|
230
|
+
const obj = JSON.parse(match[1]);
|
|
231
|
+
if (typeof obj.target === "string" &&
|
|
232
|
+
obj.type === "regenerate" &&
|
|
233
|
+
typeof obj.rationale === "string") {
|
|
234
|
+
proposals.push({ target: obj.target, type: "regenerate", rationale: obj.rationale });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Skip malformed JSON blocks
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return proposals;
|
|
242
|
+
}
|
|
243
|
+
// ── Structural readiness check ────────────────────────────────────────────
|
|
244
|
+
function runStructuralReadinessCheck(projectRoot, bundledVersion, ctx) {
|
|
245
|
+
const versionsPath = path.join(projectRoot, ".forge", "structure-versions.json");
|
|
246
|
+
try {
|
|
247
|
+
const raw = fs.readFileSync(versionsPath, "utf8");
|
|
248
|
+
const versionsData = JSON.parse(raw);
|
|
249
|
+
const { basePackVersion, currentSnapshot } = versionsData;
|
|
250
|
+
if (basePackVersion === bundledVersion) {
|
|
251
|
+
ctx.ui.notify(`○ Structural elements current — snapshot ${currentSnapshot ?? "?"} (plugin v${basePackVersion})`, "info");
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
ctx.ui.notify(`△ Structural element drift detected — installed elements were generated from plugin v${basePackVersion ?? "?"}; ` +
|
|
255
|
+
`current plugin is v${bundledVersion}. Run /forge:update to refresh structural elements.`, "warning");
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
const e = err;
|
|
260
|
+
if (e.code === "ENOENT") {
|
|
261
|
+
ctx.ui.notify(`◇ structure-versions.json absent — project predates snapshot versioning. Run /forge:update to install the versioning system.`, "info");
|
|
262
|
+
}
|
|
263
|
+
// Other errors: silently skip (advisory only)
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// ── Registration ──────────────────────────────────────────────────────────
|
|
267
|
+
export function registerCalibrate(pi) {
|
|
268
|
+
const sendToAgent = (text) => pi.sendUserMessage(text, { deliverAs: "steer" });
|
|
269
|
+
pi.registerCommand("forge:calibrate", {
|
|
270
|
+
description: "Detect drift between the knowledge base and agent definitions, propose surgical regeneration patches, and apply approved patches.",
|
|
271
|
+
async handler(args, ctx) {
|
|
272
|
+
const rawCwd = process.cwd();
|
|
273
|
+
const flags = parseCalibrateFlags(args);
|
|
274
|
+
// Resolve projectRoot from --path flag or cwd
|
|
275
|
+
let projectRoot = rawCwd;
|
|
276
|
+
if (flags.path !== null) {
|
|
277
|
+
projectRoot = path.isAbsolute(flags.path) ? flags.path : path.resolve(rawCwd, flags.path);
|
|
278
|
+
}
|
|
279
|
+
const bundleRoot = getBundledPayloadRoot();
|
|
280
|
+
const bundledVersion = getBundledForgeVersion();
|
|
281
|
+
// ── Step 0 — Structural-element readiness check (advisory) ──────────
|
|
282
|
+
runStructuralReadinessCheck(projectRoot, bundledVersion, ctx);
|
|
283
|
+
// ── Step 1 — Read config ─────────────────────────────────────────────
|
|
284
|
+
const cfg = readForgeConfig(projectRoot);
|
|
285
|
+
if (!cfg) {
|
|
286
|
+
ctx.ui.notify("△ No Forge instance found — run /forge:init to create one.", "error");
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
const kbPath = cfg.paths?.engineering ?? "engineering";
|
|
290
|
+
const forgeRoot = cfg.paths?.forgeRoot ?? bundleRoot;
|
|
291
|
+
// ── Step 2 — Establish or verify calibration baseline ────────────────
|
|
292
|
+
const baseline = cfg.calibrationBaseline;
|
|
293
|
+
if (!baseline || !baseline.masterIndexHash) {
|
|
294
|
+
// Auto-initialize baseline
|
|
295
|
+
ctx.ui.notify("○ No calibration baseline found — initializing...", "info");
|
|
296
|
+
const newBaseline = computeCalibrationBaseline(projectRoot, kbPath, bundledVersion);
|
|
297
|
+
cfg.calibrationBaseline = newBaseline;
|
|
298
|
+
try {
|
|
299
|
+
writeForgeConfig(projectRoot, cfg);
|
|
300
|
+
ctx.ui.notify(`○ Baseline established — calibration baseline written to config ` +
|
|
301
|
+
`(version: ${bundledVersion}, sprints covered: ${newBaseline.sprintsCovered.length})`, "info");
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
const e = err;
|
|
305
|
+
ctx.ui.notify(`× Failed to write calibration baseline: ${e.message ?? "unknown"}`, "error");
|
|
306
|
+
}
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
// ── Step 3 — Detect drift ────────────────────────────────────────────
|
|
310
|
+
const currentHash = computeCurrentHash(projectRoot, kbPath);
|
|
311
|
+
if (currentHash !== null && currentHash === baseline.masterIndexHash) {
|
|
312
|
+
ctx.ui.notify(`○ KB calibrated — no drift since last calibration ` +
|
|
313
|
+
`(last: ${baseline.lastCalibrated ?? "unknown"}, version: ${baseline.version ?? "unknown"})`, "info");
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
ctx.ui.notify("△ Drift detected in MASTER_INDEX.md — analyzing...", "warning");
|
|
317
|
+
// ── Step 4 — Categorize drift ────────────────────────────────────────
|
|
318
|
+
const driftCategories = categorizeDrift(projectRoot, kbPath, baseline);
|
|
319
|
+
if (driftCategories.length === 0) {
|
|
320
|
+
ctx.ui.notify("△ Drift detected in MASTER_INDEX.md but no specific category changes identified. " +
|
|
321
|
+
"Run /forge:regenerate to do a full rebuild.", "warning");
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
// ── Step 5 — Propose patches via architect subagent ──────────────────
|
|
325
|
+
ctx.ui.setStatus?.("forge:calibrate", "Generating patch proposals...");
|
|
326
|
+
let proposals = [];
|
|
327
|
+
try {
|
|
328
|
+
const architectPersona = loadForgePersona("architect", projectRoot);
|
|
329
|
+
const patchPrompt = buildPatchProposalPrompt(driftCategories);
|
|
330
|
+
const result = await runForgeSubagent({
|
|
331
|
+
persona: architectPersona,
|
|
332
|
+
task: patchPrompt,
|
|
333
|
+
cwd: projectRoot,
|
|
334
|
+
forgeRoot,
|
|
335
|
+
signal: ctx.signal,
|
|
336
|
+
});
|
|
337
|
+
if (result.exitCode !== 0) {
|
|
338
|
+
ctx.ui.notify(`△ Architect subagent returned non-zero: ${result.errorMessage ?? "unknown error"}. ` +
|
|
339
|
+
"Using drift categories directly as patch targets.", "warning");
|
|
340
|
+
proposals = driftCategories.flatMap((cat) => cat.targets.map((t) => ({
|
|
341
|
+
target: t,
|
|
342
|
+
type: "regenerate",
|
|
343
|
+
rationale: cat.evidence,
|
|
344
|
+
})));
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
const proposalText = getFinalOutput(result.messages);
|
|
348
|
+
proposals = extractPatchProposals(proposalText);
|
|
349
|
+
if (proposals.length === 0) {
|
|
350
|
+
ctx.ui.notify("△ Patch proposal parsing yielded no structured patches — using drift categories as targets.", "warning");
|
|
351
|
+
proposals = driftCategories.flatMap((cat) => cat.targets.map((t) => ({
|
|
352
|
+
target: t,
|
|
353
|
+
type: "regenerate",
|
|
354
|
+
rationale: cat.evidence,
|
|
355
|
+
})));
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
catch (err) {
|
|
360
|
+
const e = err;
|
|
361
|
+
ctx.ui.notify(`△ Architect subagent failed: ${e.message ?? "unknown"}. Using drift categories as targets.`, "warning");
|
|
362
|
+
proposals = driftCategories.flatMap((cat) => cat.targets.map((t) => ({
|
|
363
|
+
target: t,
|
|
364
|
+
type: "regenerate",
|
|
365
|
+
rationale: cat.evidence,
|
|
366
|
+
})));
|
|
367
|
+
}
|
|
368
|
+
ctx.ui.setStatus?.("forge:calibrate", undefined);
|
|
369
|
+
// ── Step 6 — Approval gate ───────────────────────────────────────────
|
|
370
|
+
const driftLines = [
|
|
371
|
+
"",
|
|
372
|
+
`## Calibration Drift Report`,
|
|
373
|
+
"",
|
|
374
|
+
`△ Drift detected — ${driftCategories.length} categories since last calibration ` +
|
|
375
|
+
`(${baseline.lastCalibrated ?? "unknown"})`,
|
|
376
|
+
"",
|
|
377
|
+
];
|
|
378
|
+
for (let i = 0; i < driftCategories.length; i++) {
|
|
379
|
+
const cat = driftCategories[i];
|
|
380
|
+
const catProposals = proposals.filter((p) => cat.targets.includes(p.target));
|
|
381
|
+
driftLines.push(`### Category ${i + 1}: ${cat.category.charAt(0).toUpperCase() + cat.category.slice(1)}`, ` Evidence: ${cat.evidence}`, ` Proposed regeneration:`, ...catProposals.map((p) => ` · ${p.target}`), "");
|
|
382
|
+
}
|
|
383
|
+
ctx.ui.notify(driftLines.join("\n"), "info");
|
|
384
|
+
const approvedPatches = [];
|
|
385
|
+
const skippedPatches = [];
|
|
386
|
+
if (isNonInteractive()) {
|
|
387
|
+
ctx.ui.notify(`○ Non-interactive mode — auto-applying all ${proposals.length} patch(es).`, "info");
|
|
388
|
+
for (const p of proposals) {
|
|
389
|
+
approvedPatches.push({ ...p, applied: false });
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
const proposalSummary = proposals
|
|
394
|
+
.map((p, i) => `${i + 1}. ${p.target} — ${p.rationale}`)
|
|
395
|
+
.join("\n");
|
|
396
|
+
const applyAll = await ctx.ui.confirm("Apply all calibration patches?", `${proposals.length} patch(es) proposed:\n\n${proposalSummary}\n\nYes = apply all | No = skip all`);
|
|
397
|
+
if (!applyAll) {
|
|
398
|
+
ctx.ui.notify("○ Calibration patches skipped — run /forge:calibrate again to apply.", "info");
|
|
399
|
+
skippedPatches.push(...proposals);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
for (const p of proposals) {
|
|
403
|
+
approvedPatches.push({ ...p, applied: false });
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// ── Step 7 — Execute approved patches ────────────────────────────────
|
|
408
|
+
for (const patch of approvedPatches) {
|
|
409
|
+
ctx.ui.notify(` → Regenerating ${patch.target}...`, "info");
|
|
410
|
+
try {
|
|
411
|
+
// Delegate to LLM via steer channel — waitForIdle() ensures regeneration
|
|
412
|
+
// completes before we record history (F2 from plan review).
|
|
413
|
+
sendToAgent(`Run /forge:regenerate for target: ${patch.target}\n\n` +
|
|
414
|
+
`Regenerate the Forge knowledge base target: ${patch.target}\n` +
|
|
415
|
+
`Project root: ${projectRoot}`);
|
|
416
|
+
await ctx.waitForIdle();
|
|
417
|
+
patch.applied = true;
|
|
418
|
+
ctx.ui.notify(` ○ ${patch.target} regenerated.`, "info");
|
|
419
|
+
}
|
|
420
|
+
catch (err) {
|
|
421
|
+
const e = err;
|
|
422
|
+
ctx.ui.notify(` △ Regeneration failed for ${patch.target}: ${e.message ?? "unknown"} — skipping.`, "warning");
|
|
423
|
+
patch.applied = false;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// ── Step 8 — Update calibration state ────────────────────────────────
|
|
427
|
+
const newHash = computeCurrentHash(projectRoot, kbPath);
|
|
428
|
+
const newBaseline = computeCalibrationBaseline(projectRoot, kbPath, bundledVersion);
|
|
429
|
+
if (newHash !== null) {
|
|
430
|
+
newBaseline.masterIndexHash = newHash;
|
|
431
|
+
}
|
|
432
|
+
const historyPatches = [
|
|
433
|
+
...approvedPatches.map((p) => ({
|
|
434
|
+
target: p.target,
|
|
435
|
+
type: "regenerate",
|
|
436
|
+
applied: p.applied,
|
|
437
|
+
})),
|
|
438
|
+
...skippedPatches.map((p) => ({
|
|
439
|
+
target: p.target,
|
|
440
|
+
type: "regenerate",
|
|
441
|
+
applied: false,
|
|
442
|
+
})),
|
|
443
|
+
];
|
|
444
|
+
const historyEntry = {
|
|
445
|
+
date: new Date().toISOString(),
|
|
446
|
+
version: bundledVersion,
|
|
447
|
+
categories: driftCategories.map((c) => c.category),
|
|
448
|
+
patches: historyPatches,
|
|
449
|
+
};
|
|
450
|
+
cfg.calibrationBaseline = newBaseline;
|
|
451
|
+
if (!Array.isArray(cfg.calibrationHistory)) {
|
|
452
|
+
cfg.calibrationHistory = [];
|
|
453
|
+
}
|
|
454
|
+
cfg.calibrationHistory.push(historyEntry);
|
|
455
|
+
try {
|
|
456
|
+
writeForgeConfig(projectRoot, cfg);
|
|
457
|
+
}
|
|
458
|
+
catch (err) {
|
|
459
|
+
const e = err;
|
|
460
|
+
ctx.ui.notify(`△ Failed to update calibration state: ${e.message ?? "unknown"} — baseline may be stale.`, "warning");
|
|
461
|
+
}
|
|
462
|
+
// ── Step 9 — Summary ─────────────────────────────────────────────────
|
|
463
|
+
const appliedCount = approvedPatches.filter((p) => p.applied).length;
|
|
464
|
+
const totalCount = approvedPatches.length + skippedPatches.length;
|
|
465
|
+
const appliedTargets = approvedPatches
|
|
466
|
+
.filter((p) => p.applied)
|
|
467
|
+
.map((p) => p.target)
|
|
468
|
+
.join(", ");
|
|
469
|
+
const summaryLines = [
|
|
470
|
+
"",
|
|
471
|
+
"## ○ Calibration Complete",
|
|
472
|
+
"",
|
|
473
|
+
` Patches applied: ${appliedCount} of ${totalCount}`,
|
|
474
|
+
` Regenerated: ${appliedTargets || "(none)"}`,
|
|
475
|
+
` Baseline updated: ${newBaseline.lastCalibrated}`,
|
|
476
|
+
"",
|
|
477
|
+
"── Run /forge:health to verify knowledge base currency.",
|
|
478
|
+
];
|
|
479
|
+
const failedPatches = approvedPatches.filter((p) => !p.applied);
|
|
480
|
+
if (failedPatches.length > 0) {
|
|
481
|
+
const failedTargets = failedPatches.map((p) => p.target).join(", ");
|
|
482
|
+
summaryLines.push("", `△ Failed patches: ${failedTargets}`, "── Re-run /forge:calibrate or manually /forge:regenerate the failed targets.");
|
|
483
|
+
}
|
|
484
|
+
ctx.ui.notify(summaryLines.join("\n"), "info");
|
|
485
|
+
},
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=calibrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calibrate.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/calibrate.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,sCAAsC;AACtC,0EAA0E;AAC1E,yFAAyF;AACzF,4DAA4D;AAC5D,6FAA6F;AAC7F,EAAE;AACF,yFAAyF;AACzF,EAAE;AACF,aAAa;AACb,8DAA8D;AAC9D,yCAAyC;AACzC,sFAAsF;AACtF,+EAA+E;AAE/E,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAA4B,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,6EAA6E;AAE7E;;;;GAIG;AACH,SAAS,sBAAsB;IAC9B,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;QACvF,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACvD,OAAO,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,OAAO,CAAC;IAChB,CAAC;AACF,CAAC;AAED,8EAA8E;AAE9E;;;;;;GAMG;AACH,SAAS,gBAAgB;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,CAAC;AACnF,CAAC;AASD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACnD,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,EAAE,CAAC;QACL,CAAC;IACF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC7B,CAAC;AAWD,qFAAqF;AACrF,MAAM,UAAU,eAAe,CAAC,WAAmB;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAChE,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,+CAA+C;AAC/C,SAAS,gBAAgB,CAAC,WAAmB,EAAE,GAAgB;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAChE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,6EAA6E;AAE7E;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,MAAc;IACrE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1E,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1F,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAUD,MAAM,oBAAoB,GAIrB;IACJ;QACC,QAAQ,EAAE;YACT,OAAO;YACP,cAAc;YACd,SAAS;YACT,UAAU;YACV,YAAY;YACZ,WAAW;YACX,QAAQ;YACR,WAAW;YACX,YAAY;SACZ;QACD,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,0BAA0B,CAAC;KACpF;IACD;QACC,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC;QAC9D,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,CAAC,cAAc,CAAC;KACzB;IACD;QACC,QAAQ,EAAE,CAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC7D,QAAQ,EAAE,eAAe;QACzB,OAAO,EAAE,CAAC,cAAc,CAAC;KACzB;IACD;QACC,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC;QACxD,QAAQ,EAAE,qBAAqB;QAC/B,OAAO,EAAE,CAAC,0BAA0B,EAAE,oBAAoB,CAAC;KAC3D;CACD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC9B,WAAmB,EACnB,MAAc,EACd,QAA4E;IAE5E,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4C,CAAC;IAElE,gEAAgE;IAChE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1E,IAAI,kBAAkB,GAAG,EAAE,CAAC;IAC5B,IAAI,CAAC;QACJ,kBAAkB,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACR,uDAAuD;QACvD,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;YACtB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,8CAA8C;YACxD,OAAO,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,0BAA0B,CAAC;SACpF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,iDAAiD;IACjD,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;oBAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,QAAQ,EAAE,4BAA4B,OAAO,CAAC,QAAQ,uBAAuB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBAC9G,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;iBAC7B,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;IACF,CAAC;IAED,8CAA8C;IAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClG,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC7E,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACjF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACnE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2C,CAAC;gBACzE,IACC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;oBACnC,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,oBAAoB,CAAC;oBACpE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC/B,CAAC;oBACF,cAAc,EAAE,CAAC;gBAClB,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,6BAA6B;YAC9B,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,uBAAuB;IACxB,CAAC;IAED,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE;gBAC1B,QAAQ,EAAE,eAAe;gBACzB,QAAQ,EAAE,GAAG,cAAc,iDAAiD;gBAC5E,OAAO,EAAE,CAAC,cAAc,CAAC;aACzB,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,oEAAoE;IACpE,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;YACtB,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,wEAAwE;YAClF,OAAO,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,0BAA0B,CAAC;SACpF,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B,CAAC;AAUD,SAAS,wBAAwB,CAAC,UAA2B;IAC5D,MAAM,KAAK,GAAG;QACb,8CAA8C;QAC9C,EAAE;QACF,qFAAqF;QACrF,8EAA8E;QAC9E,EAAE;QACF,iBAAiB;QACjB,EAAE;KACF,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CACT,gBAAgB,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EACxF,aAAa,GAAG,CAAC,QAAQ,EAAE,EAC3B,sBAAsB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC9C,EAAE,CACF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CACT,iBAAiB,EACjB,EAAE,EACF,yFAAyF,EACzF,EAAE,EACF,SAAS,EACT,GAAG,EACH,iFAAiF,EACjF,yBAAyB,EACzB,4EAA4E,EAC5E,GAAG,EACH,KAAK,EACL,EAAE,EACF,0FAA0F,EAC1F,4EAA4E,EAC5E,EAAE,EACF,gCAAgC,EAChC,qBAAqB,EACrB,4BAA4B,EAC5B,wCAAwC,EACxC,0BAA0B,EAC1B,4BAA4B,EAC5B,sBAAsB,EACtB,qCAAqC,CACrC,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,qBAAqB,CAAC,IAAY;IACjD,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,6BAA6B,CAAC;IACjD,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAA2B,CAAC;YAC3D,IACC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;gBAC9B,GAAG,CAAC,IAAI,KAAK,YAAY;gBACzB,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAChC,CAAC;gBACF,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YACtF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,6BAA6B;QAC9B,CAAC;IACF,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAiBD,6EAA6E;AAE7E,SAAS,2BAA2B,CACnC,WAAmB,EACnB,cAAsB,EACtB,GAA4B;IAE5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC;IACjF,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2D,CAAC;QAC/F,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,YAAY,CAAC;QAE1D,IAAI,eAAe,KAAK,cAAc,EAAE,CAAC;YACxC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,4CAA4C,eAAe,IAAI,GAAG,aAAa,eAAe,GAAG,EACjG,MAAM,CACN,CAAC;QACH,CAAC;aAAM,CAAC;YACP,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,wFAAwF,eAAe,IAAI,GAAG,IAAI;gBACjH,sBAAsB,cAAc,qDAAqD,EAC1F,SAAS,CACT,CAAC;QACH,CAAC;IACF,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,GAAwB,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,8HAA8H,EAC9H,MAAM,CACN,CAAC;QACH,CAAC;QACD,8CAA8C;IAC/C,CAAC;AACF,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,iBAAiB,CAAC,EAAgB;IACjD,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAEvF,EAAE,CAAC,eAAe,CAAC,iBAAiB,EAAE;QACrC,WAAW,EACV,mIAAmI;QACpI,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,GAA4B;YACvD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAExC,8CAA8C;YAC9C,IAAI,WAAW,GAAG,MAAM,CAAC;YACzB,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACzB,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3F,CAAC;YAED,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;YAC3C,MAAM,cAAc,GAAG,sBAAsB,EAAE,CAAC;YAEhD,uEAAuE;YACvE,2BAA2B,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;YAE9D,wEAAwE;YACxE,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACV,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,4DAA4D,EAC5D,OAAO,CACP,CAAC;gBACF,OAAO;YACR,CAAC;YAED,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,WAAW,IAAI,aAAa,CAAC;YACvD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,UAAU,CAAC;YAErD,wEAAwE;YACxE,MAAM,QAAQ,GAAG,GAAG,CAAC,mBAA+D,CAAC;YAErF,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;gBAC5C,2BAA2B;gBAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,mDAAmD,EAAE,MAAM,CAAC,CAAC;gBAC3E,MAAM,WAAW,GAAG,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;gBAEpF,GAAG,CAAC,mBAAmB,GAAG,WAAW,CAAC;gBACtC,IAAI,CAAC;oBACJ,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;oBACnC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,kEAAkE;wBACjE,aAAa,cAAc,sBAAsB,WAAW,CAAC,cAAc,CAAC,MAAM,GAAG,EACtF,MAAM,CACN,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACvB,MAAM,CAAC,GAAG,GAA2B,CAAC;oBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,2CAA2C,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EACnE,OAAO,CACP,CAAC;gBACH,CAAC;gBACD,OAAO;YACR,CAAC;YAED,wEAAwE;YACxE,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAE5D,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,QAAQ,CAAC,eAAe,EAAE,CAAC;gBACtE,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,oDAAoD;oBACnD,UAAU,QAAQ,CAAC,cAAc,IAAI,SAAS,cAAc,QAAQ,CAAC,OAAO,IAAI,SAAS,GAAG,EAC7F,MAAM,CACN,CAAC;gBACF,OAAO;YACR,CAAC;YAED,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oDAAoD,EAAE,SAAS,CAAC,CAAC;YAE/E,wEAAwE;YACxE,MAAM,eAAe,GAAG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEvE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,mFAAmF;oBAClF,6CAA6C,EAC9C,SAAS,CACT,CAAC;gBACF,OAAO;YACR,CAAC;YAED,wEAAwE;YACxE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAC;YAEvE,IAAI,SAAS,GAAoB,EAAE,CAAC;YAEpC,IAAI,CAAC;gBACJ,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACpE,MAAM,WAAW,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;gBAE9D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;oBACrC,OAAO,EAAE,gBAAgB;oBACzB,IAAI,EAAE,WAAW;oBACjB,GAAG,EAAE,WAAW;oBAChB,SAAS;oBACT,MAAM,EAAE,GAAG,CAAC,MAAM;iBAClB,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,2CAA2C,MAAM,CAAC,YAAY,IAAI,eAAe,IAAI;wBACpF,mDAAmD,EACpD,SAAS,CACT,CAAC;oBACF,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3C,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACvB,MAAM,EAAE,CAAC;wBACT,IAAI,EAAE,YAAqB;wBAC3B,SAAS,EAAE,GAAG,CAAC,QAAQ;qBACvB,CAAC,CAAC,CACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACrD,SAAS,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;oBAEhD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,6FAA6F,EAC7F,SAAS,CACT,CAAC;wBACF,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3C,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACvB,MAAM,EAAE,CAAC;4BACT,IAAI,EAAE,YAAqB;4BAC3B,SAAS,EAAE,GAAG,CAAC,QAAQ;yBACvB,CAAC,CAAC,CACH,CAAC;oBACH,CAAC;gBACF,CAAC;YACF,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAA2B,CAAC;gBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,gCAAgC,CAAC,CAAC,OAAO,IAAI,SAAS,sCAAsC,EAC5F,SAAS,CACT,CAAC;gBACF,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3C,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvB,MAAM,EAAE,CAAC;oBACT,IAAI,EAAE,YAAqB;oBAC3B,SAAS,EAAE,GAAG,CAAC,QAAQ;iBACvB,CAAC,CAAC,CACH,CAAC;YACH,CAAC;YAED,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;YAEjD,wEAAwE;YACxE,MAAM,UAAU,GAAa;gBAC5B,EAAE;gBACF,6BAA6B;gBAC7B,EAAE;gBACF,sBAAsB,eAAe,CAAC,MAAM,qCAAqC;oBAChF,IAAI,QAAQ,CAAC,cAAc,IAAI,SAAS,GAAG;gBAC5C,EAAE;aACF,CAAC;YACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjD,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7E,UAAU,CAAC,IAAI,CACd,gBAAgB,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EACxF,eAAe,GAAG,CAAC,QAAQ,EAAE,EAC7B,0BAA0B,EAC1B,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,EAC/C,EAAE,CACF,CAAC;YACH,CAAC;YACD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAE7C,MAAM,eAAe,GAAgD,EAAE,CAAC;YACxE,MAAM,cAAc,GAAoB,EAAE,CAAC;YAE3C,IAAI,gBAAgB,EAAE,EAAE,CAAC;gBACxB,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,8CAA8C,SAAS,CAAC,MAAM,aAAa,EAC3E,MAAM,CACN,CAAC;gBACF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC3B,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChD,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,MAAM,eAAe,GAAG,SAAS;qBAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;qBACvD,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEb,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CACpC,gCAAgC,EAChC,GAAG,SAAS,CAAC,MAAM,2BAA2B,eAAe,qCAAqC,CAClG,CAAC;gBAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,sEAAsE,EACtE,MAAM,CACN,CAAC;oBACF,cAAc,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACP,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;wBAC3B,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAChD,CAAC;gBACF,CAAC;YACF,CAAC;YAED,wEAAwE;YACxE,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;gBACrC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,MAAM,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC7D,IAAI,CAAC;oBACJ,yEAAyE;oBACzE,4DAA4D;oBAC5D,WAAW,CACV,qCAAqC,KAAK,CAAC,MAAM,MAAM;wBACtD,+CAA+C,KAAK,CAAC,MAAM,IAAI;wBAC/D,iBAAiB,WAAW,EAAE,CAC/B,CAAC;oBACF,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;oBACxB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;oBACrB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,MAAM,eAAe,EAAE,MAAM,CAAC,CAAC;gBAC3D,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACvB,MAAM,CAAC,GAAG,GAA2B,CAAC;oBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,+BAA+B,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,IAAI,SAAS,cAAc,EACpF,SAAS,CACT,CAAC;oBACF,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;gBACvB,CAAC;YACF,CAAC;YAED,wEAAwE;YACxE,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YACpF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACtB,WAAW,CAAC,eAAe,GAAG,OAAO,CAAC;YACvC,CAAC;YAED,MAAM,cAAc,GAA8B;gBACjD,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9B,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,IAAI,EAAE,YAAqB;oBAC3B,OAAO,EAAE,CAAC,CAAC,OAAO;iBAClB,CAAC,CAAC;gBACH,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,IAAI,EAAE,YAAqB;oBAC3B,OAAO,EAAE,KAAK;iBACd,CAAC,CAAC;aACH,CAAC;YAEF,MAAM,YAAY,GAA4B;gBAC7C,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC9B,OAAO,EAAE,cAAc;gBACvB,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAClD,OAAO,EAAE,cAAc;aACvB,CAAC;YAEF,GAAG,CAAC,mBAAmB,GAAG,WAAW,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC5C,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAC;YAC7B,CAAC;YACD,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE1C,IAAI,CAAC;gBACJ,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAA2B,CAAC;gBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,yCAAyC,CAAC,CAAC,OAAO,IAAI,SAAS,2BAA2B,EAC1F,SAAS,CACT,CAAC;YACH,CAAC;YAED,wEAAwE;YACxE,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YACrE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;YAClE,MAAM,cAAc,GAAG,eAAe;iBACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;iBACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;iBACpB,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,MAAM,YAAY,GAAG;gBACpB,EAAE;gBACF,2BAA2B;gBAC3B,EAAE;gBACF,sBAAsB,YAAY,OAAO,UAAU,EAAE;gBACrD,kBAAkB,cAAc,IAAI,QAAQ,EAAE;gBAC9C,uBAAuB,WAAW,CAAC,cAAc,EAAE;gBACnD,EAAE;gBACF,yDAAyD;aACzD,CAAC;YAEF,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAChE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpE,YAAY,CAAC,IAAI,CAChB,EAAE,EACF,qBAAqB,aAAa,EAAE,EACpC,8EAA8E,CAC9E,CAAC;YACH,CAAC;YAED,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -12,6 +12,8 @@ export interface RunBugState {
|
|
|
12
12
|
phaseIndex: number;
|
|
13
13
|
iterationCounts: Record<string, number>;
|
|
14
14
|
halted: boolean;
|
|
15
|
+
/** Set on cancellation so the resume prompt says "cancelled" vs "halted". */
|
|
16
|
+
status?: "cancelled" | "halted" | "running";
|
|
15
17
|
lastError?: string;
|
|
16
18
|
savedAt: string;
|
|
17
19
|
}
|
|
@@ -43,7 +45,7 @@ export declare function extractBugIdFromEvents(events: Array<{
|
|
|
43
45
|
toolName?: string;
|
|
44
46
|
result?: unknown;
|
|
45
47
|
}>): string | null;
|
|
46
|
-
export type RunBugPipelineStatus = "completed" | "halted" | "escalated" | "failed";
|
|
48
|
+
export type RunBugPipelineStatus = "completed" | "halted" | "escalated" | "failed" | "cancelled";
|
|
47
49
|
export interface RunBugPipelineResult {
|
|
48
50
|
status: RunBugPipelineStatus;
|
|
49
51
|
lastPhaseIndex: number;
|
|
@@ -66,6 +68,12 @@ export interface RunBugPipelineOptions {
|
|
|
66
68
|
preflightGate: string;
|
|
67
69
|
registry: ReturnType<typeof getSessionRegistry>;
|
|
68
70
|
resumeFromState?: RunBugState;
|
|
71
|
+
/**
|
|
72
|
+
* Optional AbortSignal from SessionRegistry. When provided, the pipeline
|
|
73
|
+
* checks signal.aborted between phases and passes the signal to
|
|
74
|
+
* runForgeSubagent so in-flight subagents can be aborted.
|
|
75
|
+
*/
|
|
76
|
+
signal?: AbortSignal;
|
|
69
77
|
}
|
|
70
78
|
export declare function runBugPipeline(opts: RunBugPipelineOptions): Promise<RunBugPipelineResult>;
|
|
71
79
|
export interface RegisterFixBugOptions {
|