frontend-harness 0.1.0 → 0.2.1
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/AGENTS.md +17 -5
- package/CLAUDE.md +17 -5
- package/README.md +65 -11
- package/dist/cli/index.js +166 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/runtime/builtin-skills.js +10 -1
- package/dist/runtime/builtin-skills.js.map +1 -1
- package/dist/runtime/clean.js +6 -1
- package/dist/runtime/clean.js.map +1 -1
- package/dist/runtime/command-taxonomy.js +12 -1
- package/dist/runtime/command-taxonomy.js.map +1 -1
- package/dist/runtime/common/naming.d.ts +2 -0
- package/dist/runtime/common/naming.js +13 -0
- package/dist/runtime/common/naming.js.map +1 -0
- package/dist/runtime/common/parsing.d.ts +11 -0
- package/dist/runtime/common/parsing.js +30 -0
- package/dist/runtime/common/parsing.js.map +1 -0
- package/dist/runtime/common/text.d.ts +1 -0
- package/dist/runtime/common/text.js +4 -0
- package/dist/runtime/common/text.js.map +1 -0
- package/dist/runtime/context.js +3 -2
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/graph.js +1 -1
- package/dist/runtime/graph.js.map +1 -1
- package/dist/runtime/knowledge.d.ts +136 -1
- package/dist/runtime/knowledge.js +658 -17
- package/dist/runtime/knowledge.js.map +1 -1
- package/dist/runtime/plan/component-resolver.d.ts +8 -0
- package/dist/runtime/plan/component-resolver.js +350 -0
- package/dist/runtime/plan/component-resolver.js.map +1 -0
- package/dist/runtime/plan/guidance.d.ts +3 -0
- package/dist/runtime/plan/guidance.js +143 -0
- package/dist/runtime/plan/guidance.js.map +1 -0
- package/dist/runtime/plan/proposal.d.ts +2 -0
- package/dist/runtime/plan/proposal.js +251 -0
- package/dist/runtime/plan/proposal.js.map +1 -0
- package/dist/runtime/plan/workflow.d.ts +8 -0
- package/dist/runtime/plan/workflow.js +234 -0
- package/dist/runtime/plan/workflow.js.map +1 -0
- package/dist/runtime/plan.d.ts +4 -3
- package/dist/runtime/plan.js +163 -445
- package/dist/runtime/plan.js.map +1 -1
- package/dist/runtime/policy-provenance.js +30 -17
- package/dist/runtime/policy-provenance.js.map +1 -1
- package/dist/runtime/project-discovery.js +12 -4
- package/dist/runtime/project-discovery.js.map +1 -1
- package/dist/runtime/project-paths.js +5 -2
- package/dist/runtime/project-paths.js.map +1 -1
- package/dist/runtime/protocol-init.js +7 -4
- package/dist/runtime/protocol-init.js.map +1 -1
- package/dist/runtime/repair-decision.js +15 -30
- package/dist/runtime/repair-decision.js.map +1 -1
- package/dist/runtime/repair-packet.js +8 -1
- package/dist/runtime/repair-packet.js.map +1 -1
- package/dist/runtime/scaffold/vue-template.d.ts +7 -0
- package/dist/runtime/scaffold/vue-template.js +187 -0
- package/dist/runtime/scaffold/vue-template.js.map +1 -0
- package/dist/runtime/scaffold.d.ts +21 -0
- package/dist/runtime/scaffold.js +80 -0
- package/dist/runtime/scaffold.js.map +1 -0
- package/dist/runtime/skills.js +3 -3
- package/dist/runtime/skills.js.map +1 -1
- package/dist/runtime/state.d.ts +4 -2
- package/dist/runtime/state.js +84 -20
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/ui-restoration.d.ts +4 -0
- package/dist/runtime/ui-restoration.js +38 -0
- package/dist/runtime/ui-restoration.js.map +1 -0
- package/dist/runtime/units.js +38 -2
- package/dist/runtime/units.js.map +1 -1
- package/dist/runtime/verification-commands.js +8 -4
- package/dist/runtime/verification-commands.js.map +1 -1
- package/dist/runtime/verify.js +107 -40
- package/dist/runtime/verify.js.map +1 -1
- package/dist/schemas/types.d.ts +73 -6
- package/dist/schemas/validation.js +21 -0
- package/dist/schemas/validation.js.map +1 -1
- package/dist/storage/json.js +6 -1
- package/dist/storage/json.js.map +1 -1
- package/docs/DIRECTION.md +1 -1
- package/package.json +3 -4
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { lines } from "./common/text.js";
|
|
2
|
+
export const UI_RESTORATION_CONSTRAINTS = [
|
|
3
|
+
"Treat imported MCP/Stitch/Figma/HTML output as source material, not project-ready code.",
|
|
4
|
+
"Normalize generated UI into project components, naming, state, routing, and styling conventions.",
|
|
5
|
+
"Split substantial restored screens into page orchestration, typed data fixtures, view configuration, calculations, and focused presentational components.",
|
|
6
|
+
"Represent mock/domain data with named object fields instead of long positional factory arguments.",
|
|
7
|
+
"Derive progress, summary values, badges, disabled states, and totals from source data or explicit workflow state instead of duplicating static literals.",
|
|
8
|
+
"Preserve PRD terminology in visible labels and record stable domain wording in project knowledge when PRD input is provided.",
|
|
9
|
+
"Implement expected interactions for the affected workflow, or mark unsupported interactions as explicit assumptions in the handoff evidence.",
|
|
10
|
+
"Use reusable design tokens for colors, spacing, layout metrics, and status semantics instead of one-off page-only constants.",
|
|
11
|
+
"Keep design input, PRD summary, component boundary notes, and visual verification evidence as durable project artifacts when a design source is provided.",
|
|
12
|
+
"Replace visible placeholder labels for icons or visual primitives with real project icons, components, or CSS shapes.",
|
|
13
|
+
"Cross-check visible state consistency across selected steps, progress labels, percentages, bars, badges, disabled states, and summary counts.",
|
|
14
|
+
"Keep generated build output such as dist/ out of lint and typecheck scopes."
|
|
15
|
+
];
|
|
16
|
+
export const UI_RESTORATION_VERIFICATION_FOCUS = [
|
|
17
|
+
"typecheck",
|
|
18
|
+
"component behavior",
|
|
19
|
+
"affected interaction smoke",
|
|
20
|
+
"responsive rendering",
|
|
21
|
+
"visual regressions when UI source is provided"
|
|
22
|
+
];
|
|
23
|
+
export const UI_RESTORATION_GUIDANCE = [
|
|
24
|
+
"Keep page files thin; move types, data fixtures, view configuration, calculations, and repeated sections into feature modules or focused components.",
|
|
25
|
+
"Use named object fixtures for domain rows; avoid long positional factory arguments in generated examples.",
|
|
26
|
+
"Derive summary values, progress text, percentages, bars, badges, and disabled states from the same source state.",
|
|
27
|
+
"Preserve PRD terminology in visible labels and capture stable domain wording in project knowledge when PRD input is available.",
|
|
28
|
+
"Implement or explicitly defer expected interactions for the affected workflow, such as filtering, selection, editing, navigation, dialogs, or bulk actions when applicable.",
|
|
29
|
+
"Use reusable design tokens for colors, spacing, status colors, and layout metrics instead of page-only literals.",
|
|
30
|
+
"Keep design input, PRD summary, component boundary notes, and visual verification screenshots or notes as project artifacts when a design source exists.",
|
|
31
|
+
"Replace visible placeholder labels for icons or visual primitives with real project icons, components, or CSS shapes.",
|
|
32
|
+
"Verify visible state consistency across selected steps, progress labels, percentages, bars, badges, disabled states, and summary counts.",
|
|
33
|
+
"Keep generated build output such as dist/ out of lint and typecheck scopes."
|
|
34
|
+
];
|
|
35
|
+
export function renderUiRestorationChecklist() {
|
|
36
|
+
return lines("# UI Restoration Checklist", "", "Use this checklist when converting design files, screenshots, exported HTML, or generated UI into project code.", "", "## Required Artifacts", "", "- Save or reference the design input used for implementation.", "- Keep a concise PRD summary with domain terminology and acceptance rules when product requirements are available.", "- Record the component boundary plan before implementation.", "- Keep visual verification evidence such as screenshots, browser notes, or viewport checks.", "", "## Source Structure", "", "- Keep route/page entry files as orchestration only.", "- Put feature code under the project-standard feature/module location.", "- Split substantial screens into types, data fixtures, view configuration, calculations, and focused components when the screen has repeated sections, workflows, editable data, dialogs, or dense state.", "- Use named object fixtures for mock/domain rows instead of long positional factory arguments.", "", "## State And Interactions", "", "- Derive summary values, progress labels, percentages, progress bars, badges, disabled states, and totals from the same source state.", "- Preserve PRD wording in visible labels.", "- Implement expected interactions for the affected workflow, or document deferred interactions explicitly.", "", "## Styling", "", "- Reuse project design tokens for colors, spacing, status colors, and layout sizing.", "- Keep generated build output such as `dist/` out of lint and typecheck scopes.");
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ui-restoration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-restoration.js","sourceRoot":"","sources":["../../src/runtime/ui-restoration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,yFAAyF;IACzF,kGAAkG;IAClG,2JAA2J;IAC3J,mGAAmG;IACnG,0JAA0J;IAC1J,8HAA8H;IAC9H,8IAA8I;IAC9I,8HAA8H;IAC9H,2JAA2J;IAC3J,uHAAuH;IACvH,+IAA+I;IAC/I,6EAA6E;CACrE,CAAC;AAEX,MAAM,CAAC,MAAM,iCAAiC,GAAG;IAC/C,WAAW;IACX,oBAAoB;IACpB,4BAA4B;IAC5B,sBAAsB;IACtB,+CAA+C;CACvC,CAAC;AAEX,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,sJAAsJ;IACtJ,2GAA2G;IAC3G,kHAAkH;IAClH,gIAAgI;IAChI,6KAA6K;IAC7K,kHAAkH;IAClH,0JAA0J;IAC1J,uHAAuH;IACvH,0IAA0I;IAC1I,6EAA6E;CACrE,CAAC;AAEX,MAAM,UAAU,4BAA4B;IAC1C,OAAO,KAAK,CACV,4BAA4B,EAC5B,EAAE,EACF,iHAAiH,EACjH,EAAE,EACF,uBAAuB,EACvB,EAAE,EACF,+DAA+D,EAC/D,oHAAoH,EACpH,6DAA6D,EAC7D,6FAA6F,EAC7F,EAAE,EACF,qBAAqB,EACrB,EAAE,EACF,sDAAsD,EACtD,wEAAwE,EACxE,2MAA2M,EAC3M,gGAAgG,EAChG,EAAE,EACF,2BAA2B,EAC3B,EAAE,EACF,uIAAuI,EACvI,2CAA2C,EAC3C,4GAA4G,EAC5G,EAAE,EACF,YAAY,EACZ,EAAE,EACF,sFAAsF,EACtF,iFAAiF,CAClF,CAAC;AACJ,CAAC"}
|
package/dist/runtime/units.js
CHANGED
|
@@ -7,7 +7,9 @@ const policyVerificationNames = [
|
|
|
7
7
|
"regression test",
|
|
8
8
|
"integration test or API mock",
|
|
9
9
|
"affected regression test",
|
|
10
|
-
"knowledge review"
|
|
10
|
+
"knowledge review",
|
|
11
|
+
"documentation review",
|
|
12
|
+
"review findings"
|
|
11
13
|
];
|
|
12
14
|
export function checkExecutionUnits(projectRoot) {
|
|
13
15
|
const artifactPath = relativeHarnessPath("execution-units", "latest.json");
|
|
@@ -57,6 +59,7 @@ export function checkExecutionUnits(projectRoot) {
|
|
|
57
59
|
}
|
|
58
60
|
validateUnit(unit, index, ids, knownVerificationNames, errors);
|
|
59
61
|
}
|
|
62
|
+
validateDependencyCycles(units, errors);
|
|
60
63
|
return {
|
|
61
64
|
status: errors.length > 0 ? "failed" : "passed",
|
|
62
65
|
artifactPath,
|
|
@@ -66,6 +69,39 @@ export function checkExecutionUnits(projectRoot) {
|
|
|
66
69
|
warnings
|
|
67
70
|
};
|
|
68
71
|
}
|
|
72
|
+
function validateDependencyCycles(units, errors) {
|
|
73
|
+
const graph = new Map();
|
|
74
|
+
for (const unit of units) {
|
|
75
|
+
if (!isRecord(unit) || typeof unit["id"] !== "string" || !Array.isArray(unit["dependsOn"])) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
graph.set(unit["id"], unit["dependsOn"].filter((dependency) => typeof dependency === "string"));
|
|
79
|
+
}
|
|
80
|
+
const visiting = new Set();
|
|
81
|
+
const visited = new Set();
|
|
82
|
+
function visit(id, pathStack) {
|
|
83
|
+
if (visited.has(id)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (visiting.has(id)) {
|
|
87
|
+
const cycleStart = pathStack.indexOf(id);
|
|
88
|
+
const cycle = [...pathStack.slice(Math.max(0, cycleStart)), id];
|
|
89
|
+
errors.push(`Execution unit dependency cycle detected: ${cycle.join(" -> ")}.`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
visiting.add(id);
|
|
93
|
+
for (const dependency of graph.get(id) ?? []) {
|
|
94
|
+
if (graph.has(dependency)) {
|
|
95
|
+
visit(dependency, [...pathStack, dependency]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
visiting.delete(id);
|
|
99
|
+
visited.add(id);
|
|
100
|
+
}
|
|
101
|
+
for (const id of graph.keys()) {
|
|
102
|
+
visit(id, [id]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
69
105
|
function readArtifact(fullPath, errors) {
|
|
70
106
|
try {
|
|
71
107
|
return JSON.parse(fs.readFileSync(fullPath, "utf8"));
|
|
@@ -173,7 +209,7 @@ function isProjectRelativeSourcePath(file) {
|
|
|
173
209
|
return false;
|
|
174
210
|
}
|
|
175
211
|
const firstSegment = normalized.split("/")[0];
|
|
176
|
-
return firstSegment !== ".frontend-harness"
|
|
212
|
+
return firstSegment !== ".frontend-harness";
|
|
177
213
|
}
|
|
178
214
|
function isRecord(value) {
|
|
179
215
|
return typeof value === "object" && value !== null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/runtime/units.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAsB3G,MAAM,uBAAuB,GAAG;IAC9B,eAAe;IACf,iBAAiB;IACjB,8BAA8B;IAC9B,0BAA0B;IAC1B,kBAAkB;
|
|
1
|
+
{"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/runtime/units.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { harnessPath } from "../storage/paths.js";
|
|
4
4
|
import { readJson } from "../storage/json.js";
|
|
5
|
+
import { isRecord } from "./common/parsing.js";
|
|
5
6
|
export const defaultVerificationCommandNames = ["typecheck", "test", "build"];
|
|
6
7
|
export function discoverVerificationCommands(projectRoot, overrides = {}) {
|
|
7
8
|
const config = readJson(harnessPath(projectRoot, "config.json")) ?? {};
|
|
@@ -77,13 +78,16 @@ function readPackageScripts(projectRoot) {
|
|
|
77
78
|
if (!fs.existsSync(packageJsonPath)) {
|
|
78
79
|
return {};
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
+
let packageJson;
|
|
82
|
+
try {
|
|
83
|
+
packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
81
88
|
return packageJson.scripts ?? {};
|
|
82
89
|
}
|
|
83
90
|
function isValidCommandName(value) {
|
|
84
91
|
return /^[a-zA-Z0-9][a-zA-Z0-9:_-]{0,79}$/.test(value);
|
|
85
92
|
}
|
|
86
|
-
function isRecord(value) {
|
|
87
|
-
return typeof value === "object" && value !== null;
|
|
88
|
-
}
|
|
89
93
|
//# sourceMappingURL=verification-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-commands.js","sourceRoot":"","sources":["../../src/runtime/verification-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"verification-commands.js","sourceRoot":"","sources":["../../src/runtime/verification-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/verify.js
CHANGED
|
@@ -7,6 +7,7 @@ import { ensureDir, readJson, writeJson, writeText } from "../storage/json.js";
|
|
|
7
7
|
import { updateVerificationState } from "./state.js";
|
|
8
8
|
import { discoverVerificationCommands } from "./verification-commands.js";
|
|
9
9
|
import { createRepairPacket } from "./repair-packet.js";
|
|
10
|
+
const MAX_NODE_E_SCRIPT_LENGTH = 200;
|
|
10
11
|
export function runVerification(projectRoot, options) {
|
|
11
12
|
const commands = resolveCommands(projectRoot, options);
|
|
12
13
|
const startedFromFailed = readPreviousStatus(projectRoot) === "failed";
|
|
@@ -75,7 +76,8 @@ function runCommand(projectRoot, name, source, command) {
|
|
|
75
76
|
"## stdout",
|
|
76
77
|
result.stdout ?? "",
|
|
77
78
|
"## stderr",
|
|
78
|
-
result.stderr ?? ""
|
|
79
|
+
result.stderr ?? "",
|
|
80
|
+
result.error ? `\n## spawn error\n${result.error.message}` : ""
|
|
79
81
|
].join("\n");
|
|
80
82
|
writeText(logPath, output);
|
|
81
83
|
const commandLaunchError = result.error
|
|
@@ -103,53 +105,72 @@ function runCommand(projectRoot, name, source, command) {
|
|
|
103
105
|
};
|
|
104
106
|
}
|
|
105
107
|
function spawnVerificationCommand(projectRoot, command) {
|
|
106
|
-
const
|
|
107
|
-
if (
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (nodeCommand) {
|
|
113
|
-
return spawnSync(nodeCommand.executable, nodeCommand.args, {
|
|
108
|
+
const npmScript = parseNpmRunCommand(command);
|
|
109
|
+
if (npmScript) {
|
|
110
|
+
const packageScript = readPackageScript(projectRoot, npmScript);
|
|
111
|
+
const parsedPackageScript = packageScript ? parseCommand(packageScript) : null;
|
|
112
|
+
if (parsedPackageScript && path.isAbsolute(parsedPackageScript.executable)) {
|
|
113
|
+
return spawnSync(parsedPackageScript.executable, parsedPackageScript.args, {
|
|
114
114
|
cwd: projectRoot,
|
|
115
|
-
shell: false,
|
|
116
115
|
encoding: "utf8"
|
|
117
116
|
});
|
|
118
117
|
}
|
|
118
|
+
const npmCommand = resolveNpmCommand();
|
|
119
|
+
return spawnSync(npmCommand.executable, [...npmCommand.args, "run", npmScript], {
|
|
120
|
+
cwd: projectRoot,
|
|
121
|
+
encoding: "utf8"
|
|
122
|
+
});
|
|
119
123
|
}
|
|
120
|
-
|
|
124
|
+
const parsedCommand = parseCommand(command);
|
|
125
|
+
if (!parsedCommand) {
|
|
126
|
+
return {
|
|
127
|
+
status: null,
|
|
128
|
+
signal: null,
|
|
129
|
+
output: [null, "", "Verification command contains unsupported shell syntax."],
|
|
130
|
+
pid: 0,
|
|
131
|
+
stdout: "",
|
|
132
|
+
stderr: "Verification command contains unsupported shell syntax.",
|
|
133
|
+
error: new Error("Verification command contains unsupported shell syntax.")
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return spawnSync(parsedCommand.executable, parsedCommand.args, {
|
|
121
137
|
cwd: projectRoot,
|
|
122
|
-
shell: true,
|
|
123
138
|
encoding: "utf8"
|
|
124
139
|
});
|
|
125
140
|
}
|
|
126
|
-
function
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
141
|
+
function readPackageScript(projectRoot, scriptName) {
|
|
142
|
+
const packageJson = readJson(path.join(projectRoot, "package.json"));
|
|
143
|
+
const script = packageJson?.scripts?.[scriptName];
|
|
144
|
+
return typeof script === "string" ? script : null;
|
|
145
|
+
}
|
|
146
|
+
function parseNpmRunCommand(command) {
|
|
130
147
|
const match = /^npm run ([^\s]+)$/.exec(command.trim());
|
|
131
|
-
|
|
132
|
-
|
|
148
|
+
return match?.[1] ?? null;
|
|
149
|
+
}
|
|
150
|
+
function resolveNpmCommand() {
|
|
151
|
+
const candidates = [
|
|
152
|
+
process.env["npm_execpath"],
|
|
153
|
+
path.join(path.dirname(process.execPath), "node_modules", "npm", "bin", "npm-cli.js")
|
|
154
|
+
].filter((candidate) => Boolean(candidate));
|
|
155
|
+
const npmCli = candidates.find((candidate) => fs.existsSync(candidate));
|
|
156
|
+
if (npmCli) {
|
|
157
|
+
return { executable: process.execPath, args: [npmCli] };
|
|
133
158
|
}
|
|
134
|
-
|
|
135
|
-
|
|
159
|
+
return {
|
|
160
|
+
executable: process.platform === "win32" ? "npm.cmd" : "npm",
|
|
161
|
+
args: []
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function parseCommand(command) {
|
|
165
|
+
const trimmed = command.trim();
|
|
166
|
+
if (!trimmed) {
|
|
136
167
|
return null;
|
|
137
168
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (scriptName === undefined) {
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
const script = parsed.scripts?.[scriptName];
|
|
145
|
-
if (typeof script !== "string" || !parseUnquotedWindowsNodeCommand(script)) {
|
|
146
|
-
return null;
|
|
147
|
-
}
|
|
148
|
-
return script;
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
return null;
|
|
169
|
+
const windowsNodeCommand = parseUnquotedWindowsNodeCommand(trimmed);
|
|
170
|
+
if (windowsNodeCommand) {
|
|
171
|
+
return windowsNodeCommand;
|
|
152
172
|
}
|
|
173
|
+
return parseShellLikeCommand(trimmed);
|
|
153
174
|
}
|
|
154
175
|
function parseUnquotedWindowsNodeCommand(command) {
|
|
155
176
|
const marker = "\\node.exe";
|
|
@@ -167,20 +188,66 @@ function parseUnquotedWindowsNodeCommand(command) {
|
|
|
167
188
|
return null;
|
|
168
189
|
}
|
|
169
190
|
const script = parseQuotedArgument(remainder.slice(3).trim());
|
|
191
|
+
if (script !== null && script.length > MAX_NODE_E_SCRIPT_LENGTH) {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
170
194
|
return script === null ? null : { executable, args: ["-e", script] };
|
|
171
195
|
}
|
|
172
196
|
function parseQuotedArgument(value) {
|
|
173
|
-
|
|
197
|
+
const parsed = parseShellLikeCommand(value);
|
|
198
|
+
if (!parsed || parsed.args.length > 0) {
|
|
174
199
|
return null;
|
|
175
200
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
201
|
+
return parsed.executable;
|
|
202
|
+
}
|
|
203
|
+
function parseShellLikeCommand(command) {
|
|
204
|
+
const args = [];
|
|
205
|
+
let current = "";
|
|
206
|
+
let quote = null;
|
|
207
|
+
let escaped = false;
|
|
208
|
+
for (const char of command) {
|
|
209
|
+
if (escaped) {
|
|
210
|
+
current += char;
|
|
211
|
+
escaped = false;
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (char === "\\" && quote !== "'") {
|
|
215
|
+
escaped = true;
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
if (quote) {
|
|
219
|
+
if (char === quote) {
|
|
220
|
+
quote = null;
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
current += char;
|
|
224
|
+
}
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (char === "\"" || char === "'") {
|
|
228
|
+
quote = char;
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
if (/\s/.test(char)) {
|
|
232
|
+
if (current) {
|
|
233
|
+
args.push(current);
|
|
234
|
+
current = "";
|
|
235
|
+
}
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (";&|<>`$(){}".includes(char)) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
current += char;
|
|
179
242
|
}
|
|
180
|
-
if (
|
|
243
|
+
if (escaped || quote) {
|
|
181
244
|
return null;
|
|
182
245
|
}
|
|
183
|
-
|
|
246
|
+
if (current) {
|
|
247
|
+
args.push(current);
|
|
248
|
+
}
|
|
249
|
+
const executable = args.shift();
|
|
250
|
+
return executable ? { executable, args } : null;
|
|
184
251
|
}
|
|
185
252
|
function readPreviousStatus(projectRoot) {
|
|
186
253
|
const previous = readJson(harnessPath(projectRoot, "verification", "latest.json"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/runtime/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAgE,MAAM,4BAA4B,CAAC;AACxI,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/runtime/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas/types.d.ts
CHANGED
|
@@ -8,20 +8,21 @@ export interface TaskUnderstanding {
|
|
|
8
8
|
inputs?: {
|
|
9
9
|
prd?: string;
|
|
10
10
|
ui?: string;
|
|
11
|
-
|
|
11
|
+
agentProposal?: string;
|
|
12
12
|
};
|
|
13
13
|
reasoningMode?: "deterministic" | "agent_assisted";
|
|
14
14
|
policyProvenance?: PolicyProvenance;
|
|
15
|
-
|
|
15
|
+
agentProposal?: {
|
|
16
16
|
summary?: string | null;
|
|
17
17
|
artifactPath?: string | null;
|
|
18
18
|
contractVersion?: 1 | null;
|
|
19
19
|
intentSuggestion?: string | null;
|
|
20
20
|
constraintHints?: string[];
|
|
21
21
|
componentHints?: AgentDecisionComponentHint[];
|
|
22
|
+
planningEvidence?: AgentPlanningEvidence;
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
|
-
export type FrontendWorkflowKind = "ui_implementation" | "prd_knowledge" | "api_integration" | "frontend_test" | "bug_fix" | "requirement_change";
|
|
25
|
+
export type FrontendWorkflowKind = "ui_implementation" | "prd_knowledge" | "api_integration" | "frontend_test" | "bug_fix" | "frontend_review" | "requirement_change" | "documentation" | "maintenance";
|
|
25
26
|
export interface FrontendWorkflowPolicy {
|
|
26
27
|
kind: FrontendWorkflowKind;
|
|
27
28
|
summary: string;
|
|
@@ -53,16 +54,41 @@ export interface AgentPlanningDecision {
|
|
|
53
54
|
intentSuggestion?: string;
|
|
54
55
|
constraintHints?: string[];
|
|
55
56
|
componentHints?: AgentDecisionComponentHint[];
|
|
57
|
+
planningEvidence?: AgentPlanningEvidence;
|
|
58
|
+
}
|
|
59
|
+
export interface AgentWorkflowCandidate {
|
|
60
|
+
kind: FrontendWorkflowKind;
|
|
61
|
+
confidence: number;
|
|
62
|
+
reasons: string[];
|
|
63
|
+
}
|
|
64
|
+
export interface AgentTargetCandidate {
|
|
65
|
+
path: string;
|
|
66
|
+
role: string;
|
|
67
|
+
confidence: number;
|
|
68
|
+
}
|
|
69
|
+
export interface AgentVerificationCandidate {
|
|
70
|
+
kind: string;
|
|
71
|
+
reason: string;
|
|
72
|
+
}
|
|
73
|
+
export interface AgentAmbiguity {
|
|
74
|
+
question: string;
|
|
75
|
+
severity: "low" | "medium" | "high";
|
|
76
|
+
}
|
|
77
|
+
export interface AgentPlanningEvidence {
|
|
78
|
+
workflowCandidates?: AgentWorkflowCandidate[];
|
|
79
|
+
targetCandidates?: AgentTargetCandidate[];
|
|
80
|
+
verificationCandidates?: AgentVerificationCandidate[];
|
|
81
|
+
ambiguities?: AgentAmbiguity[];
|
|
56
82
|
}
|
|
57
83
|
export interface AgentPlanningDecisionEnvelope {
|
|
58
84
|
contractVersion: 1;
|
|
59
|
-
|
|
85
|
+
proposal: AgentPlanningDecision;
|
|
60
86
|
}
|
|
61
|
-
export interface
|
|
87
|
+
export interface AgentProposalCheckResult {
|
|
62
88
|
status: "passed" | "failed";
|
|
63
89
|
artifactPath: string;
|
|
64
90
|
contractVersion: 1 | null;
|
|
65
|
-
|
|
91
|
+
proposal: AgentPlanningDecision | null;
|
|
66
92
|
errors: string[];
|
|
67
93
|
}
|
|
68
94
|
export interface PlanningDecisionSummary {
|
|
@@ -71,6 +97,38 @@ export interface PlanningDecisionSummary {
|
|
|
71
97
|
intentSuggestion: string | null;
|
|
72
98
|
constraintHints: string[];
|
|
73
99
|
componentHints: AgentDecisionComponentHint[];
|
|
100
|
+
planningEvidence?: AgentPlanningEvidence;
|
|
101
|
+
}
|
|
102
|
+
export interface PlanDecisionTraceItem {
|
|
103
|
+
source: "system" | "agent" | "merged";
|
|
104
|
+
reason: string;
|
|
105
|
+
}
|
|
106
|
+
export interface PlanComponentHintTrace {
|
|
107
|
+
used: boolean;
|
|
108
|
+
strategy: "none" | "expand" | "merge" | "ignore";
|
|
109
|
+
confidence: number;
|
|
110
|
+
acceptedHints: number;
|
|
111
|
+
rejectedHints: number;
|
|
112
|
+
policy: {
|
|
113
|
+
expandMinWeight: number;
|
|
114
|
+
mergeMinConfidence: number;
|
|
115
|
+
};
|
|
116
|
+
constraints: Array<{
|
|
117
|
+
type: string;
|
|
118
|
+
outcome: "accepted" | "rejected" | "preserved";
|
|
119
|
+
reason?: string;
|
|
120
|
+
confidence?: number;
|
|
121
|
+
}>;
|
|
122
|
+
}
|
|
123
|
+
export interface PlanMeta {
|
|
124
|
+
decisionTrace: {
|
|
125
|
+
workflow: PlanDecisionTraceItem;
|
|
126
|
+
targets: PlanDecisionTraceItem;
|
|
127
|
+
components: PlanDecisionTraceItem;
|
|
128
|
+
componentHints: PlanComponentHintTrace;
|
|
129
|
+
agentEvidence?: PlanDecisionTraceItem;
|
|
130
|
+
};
|
|
131
|
+
warnings: string[];
|
|
74
132
|
}
|
|
75
133
|
export interface ComponentItem {
|
|
76
134
|
name: string;
|
|
@@ -154,6 +212,15 @@ export interface HarnessState {
|
|
|
154
212
|
components: ComponentItem[];
|
|
155
213
|
units: ExecutionUnit[];
|
|
156
214
|
changedFiles: string[];
|
|
215
|
+
changeBaseline: {
|
|
216
|
+
source: "git";
|
|
217
|
+
entries: Array<{
|
|
218
|
+
path: string;
|
|
219
|
+
status: string;
|
|
220
|
+
signature: string;
|
|
221
|
+
}>;
|
|
222
|
+
capturedAt: string;
|
|
223
|
+
} | null;
|
|
157
224
|
verification: {
|
|
158
225
|
status: VerificationStatus;
|
|
159
226
|
latestResultPath: string | null;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const harnessStatuses = new Set(["idle", "awaiting_agent_edit", "failed", "passed", "blocked"]);
|
|
2
|
+
const verificationStatuses = new Set(["not_run", "not_configured", "passed", "failed", "error"]);
|
|
1
3
|
export function isHarnessState(value) {
|
|
2
4
|
if (!isRecord(value)) {
|
|
3
5
|
return false;
|
|
@@ -5,16 +7,35 @@ export function isHarnessState(value) {
|
|
|
5
7
|
const verification = value["verification"];
|
|
6
8
|
return value["version"] === 1
|
|
7
9
|
&& typeof value["status"] === "string"
|
|
10
|
+
&& harnessStatuses.has(value["status"])
|
|
8
11
|
&& Array.isArray(value["components"])
|
|
9
12
|
&& Array.isArray(value["units"])
|
|
10
13
|
&& Array.isArray(value["changedFiles"])
|
|
14
|
+
&& isValidChangeBaseline(value["changeBaseline"])
|
|
11
15
|
&& isRecord(verification)
|
|
12
16
|
&& typeof verification["status"] === "string"
|
|
17
|
+
&& verificationStatuses.has(verification["status"])
|
|
13
18
|
&& Array.isArray(value["errors"])
|
|
14
19
|
&& typeof value["retryCount"] === "number"
|
|
15
20
|
&& Array.isArray(value["blockers"])
|
|
16
21
|
&& typeof value["updatedAt"] === "string";
|
|
17
22
|
}
|
|
23
|
+
function isValidChangeBaseline(value) {
|
|
24
|
+
if (value === null) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return isRecord(value)
|
|
28
|
+
&& value["source"] === "git"
|
|
29
|
+
&& Array.isArray(value["entries"])
|
|
30
|
+
&& value["entries"].every(isValidChangeBaselineEntry)
|
|
31
|
+
&& typeof value["capturedAt"] === "string";
|
|
32
|
+
}
|
|
33
|
+
function isValidChangeBaselineEntry(value) {
|
|
34
|
+
return isRecord(value)
|
|
35
|
+
&& typeof value["path"] === "string"
|
|
36
|
+
&& typeof value["status"] === "string"
|
|
37
|
+
&& typeof value["signature"] === "string";
|
|
38
|
+
}
|
|
18
39
|
function isRecord(value) {
|
|
19
40
|
return typeof value === "object" && value !== null;
|
|
20
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/schemas/validation.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;WACxB,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ;WACnC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;WAClC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;WAC7B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;WACpC,QAAQ,CAAC,YAAY,CAAC;WACtB,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,QAAQ;WAC1C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;WAC9B,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,QAAQ;WACvC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;WAChC,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/schemas/validation.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAChG,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjG,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;WACxB,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ;WACnC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;WACpC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;WAClC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;WAC7B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;WACpC,qBAAqB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;WAC9C,QAAQ,CAAC,YAAY,CAAC;WACtB,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,QAAQ;WAC1C,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;WAChD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;WAC9B,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,QAAQ;WACvC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;WAChC,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC;AAC9C,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC;WACjB,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK;WACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;WAC/B,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC;WAClD,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC;AAC/C,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc;IAChD,OAAO,QAAQ,CAAC,KAAK,CAAC;WACjB,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ;WACjC,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ;WACnC,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
|
package/dist/storage/json.js
CHANGED
|
@@ -15,7 +15,12 @@ export function readJson(filePath) {
|
|
|
15
15
|
if (!fs.existsSync(filePath)) {
|
|
16
16
|
return null;
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
19
24
|
}
|
|
20
25
|
export function writeText(filePath, value) {
|
|
21
26
|
ensureDir(path.dirname(filePath));
|
package/dist/storage/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/storage/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,KAAc;IACxD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAAc;IACjE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,QAAgB;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/storage/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,KAAc;IACxD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAAc;IACjE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,QAAgB;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAM,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,KAAa;IACvD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|