semantifold 0.8.0 → 0.10.0
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/README.md +11 -5
- package/bin/semantifold.js +6 -0
- package/build/bin/semantifold.d.ts +3 -0
- package/build/bin/semantifold.d.ts.map +1 -0
- package/build/bin/semantifold.js +5 -0
- package/build/index.d.ts +9 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +10 -1
- package/build/src/artifact-path.d.ts +16 -0
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +29 -3
- package/build/src/backends/c-check.d.ts +7 -0
- package/build/src/backends/c-check.d.ts.map +1 -0
- package/build/src/backends/c-check.js +65 -0
- package/build/src/backends/check-plan.d.ts +96 -0
- package/build/src/backends/check-plan.d.ts.map +1 -0
- package/build/src/backends/check-plan.js +135 -0
- package/build/src/backends/cpp-check.d.ts +7 -0
- package/build/src/backends/cpp-check.d.ts.map +1 -0
- package/build/src/backends/cpp-check.js +59 -0
- package/build/src/backends/csharp-check.d.ts +7 -0
- package/build/src/backends/csharp-check.d.ts.map +1 -0
- package/build/src/backends/csharp-check.js +125 -0
- package/build/src/backends/csharp.d.ts +1 -0
- package/build/src/backends/csharp.d.ts.map +1 -1
- package/build/src/backends/csharp.js +5 -4
- package/build/src/backends/dart-check.d.ts +7 -0
- package/build/src/backends/dart-check.d.ts.map +1 -0
- package/build/src/backends/dart-check.js +103 -0
- package/build/src/backends/dart.d.ts +2 -0
- package/build/src/backends/dart.d.ts.map +1 -1
- package/build/src/backends/dart.js +5 -5
- package/build/src/backends/go-check.d.ts +7 -0
- package/build/src/backends/go-check.d.ts.map +1 -0
- package/build/src/backends/go-check.js +77 -0
- package/build/src/backends/go.d.ts +1 -0
- package/build/src/backends/go.d.ts.map +1 -1
- package/build/src/backends/go.js +3 -3
- package/build/src/backends/java-check.d.ts +21 -0
- package/build/src/backends/java-check.d.ts.map +1 -0
- package/build/src/backends/java-check.js +73 -0
- package/build/src/backends/javascript-check.d.ts +7 -0
- package/build/src/backends/javascript-check.d.ts.map +1 -0
- package/build/src/backends/javascript-check.js +29 -0
- package/build/src/backends/kotlin-check.d.ts +7 -0
- package/build/src/backends/kotlin-check.d.ts.map +1 -0
- package/build/src/backends/kotlin-check.js +31 -0
- package/build/src/backends/php-check.d.ts +7 -0
- package/build/src/backends/php-check.d.ts.map +1 -0
- package/build/src/backends/php-check.js +21 -0
- package/build/src/backends/program.d.ts +7 -0
- package/build/src/backends/program.d.ts.map +1 -1
- package/build/src/backends/program.js +16 -1
- package/build/src/backends/python-check.d.ts +7 -0
- package/build/src/backends/python-check.d.ts.map +1 -0
- package/build/src/backends/python-check.js +28 -0
- package/build/src/backends/ruby-check.d.ts +7 -0
- package/build/src/backends/ruby-check.d.ts.map +1 -0
- package/build/src/backends/ruby-check.js +21 -0
- package/build/src/backends/rust-check.d.ts +7 -0
- package/build/src/backends/rust-check.d.ts.map +1 -0
- package/build/src/backends/rust-check.js +65 -0
- package/build/src/backends/swift-check.d.ts +7 -0
- package/build/src/backends/swift-check.d.ts.map +1 -0
- package/build/src/backends/swift-check.js +77 -0
- package/build/src/backends/typescript-check.d.ts +7 -0
- package/build/src/backends/typescript-check.d.ts.map +1 -0
- package/build/src/backends/typescript-check.js +33 -0
- package/build/src/backends/zig-check.d.ts +7 -0
- package/build/src/backends/zig-check.d.ts.map +1 -0
- package/build/src/backends/zig-check.js +70 -0
- package/build/src/diagnostic.d.ts +13 -1
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +14 -2
- package/build/src/frontends/program.d.ts +6 -0
- package/build/src/frontends/program.d.ts.map +1 -1
- package/build/src/frontends/program.js +9 -1
- package/build/src/language-registry.d.ts +54 -0
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +107 -5
- package/build/src/project-build.d.ts +172 -0
- package/build/src/project-build.d.ts.map +1 -0
- package/build/src/project-build.js +320 -0
- package/build/src/project-cli.d.ts +40 -0
- package/build/src/project-cli.d.ts.map +1 -0
- package/build/src/project-cli.js +145 -0
- package/build/src/project-manifest.d.ts +148 -0
- package/build/src/project-manifest.d.ts.map +1 -0
- package/build/src/project-manifest.js +432 -0
- package/build/src/project-reporter.d.ts +81 -0
- package/build/src/project-reporter.d.ts.map +1 -0
- package/build/src/project-reporter.js +293 -0
- package/build/src/project-snapshot.d.ts +129 -0
- package/build/src/project-snapshot.d.ts.map +1 -0
- package/build/src/project-snapshot.js +362 -0
- package/build/src/project-watch-reporter.d.ts +125 -0
- package/build/src/project-watch-reporter.d.ts.map +1 -0
- package/build/src/project-watch-reporter.js +280 -0
- package/build/src/project-watch.d.ts +133 -0
- package/build/src/project-watch.d.ts.map +1 -0
- package/build/src/project-watch.js +839 -0
- package/build/src/publication.d.ts +218 -0
- package/build/src/publication.d.ts.map +1 -0
- package/build/src/publication.js +1832 -0
- package/build/src/semantic/types.d.ts +613 -0
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +163 -1
- package/build/src/subprocess.d.ts +8 -0
- package/build/src/subprocess.d.ts.map +1 -1
- package/build/src/subprocess.js +50 -9
- package/build/src/target-check.d.ts +52 -0
- package/build/src/target-check.d.ts.map +1 -0
- package/build/src/target-check.js +796 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +3 -3
- package/docs/architecture.md +3 -1
- package/docs/c.md +4 -0
- package/docs/cpp.md +4 -0
- package/docs/dart.md +4 -0
- package/docs/generated-artifact-publication.md +98 -0
- package/docs/kotlin.md +2 -2
- package/docs/language-support.md +29 -3
- package/docs/project-build-cli.md +147 -0
- package/docs/project-watch.md +60 -0
- package/docs/rust.md +4 -0
- package/docs/swift.md +2 -0
- package/docs/testing.md +70 -3
- package/docs/watch-build-pipeline.md +42 -26
- package/docs/zig.md +2 -0
- package/examples/jsdoc-java-watch/expected-output.txt +3 -0
- package/examples/jsdoc-java-watch/semantifold.json +23 -0
- package/examples/jsdoc-java-watch/src/main.js +21 -0
- package/index.js +9 -0
- package/package.json +6 -1
- package/src/artifact-path.js +31 -2
- package/src/backends/c-check.js +80 -0
- package/src/backends/check-plan.js +147 -0
- package/src/backends/cpp-check.js +73 -0
- package/src/backends/csharp-check.js +139 -0
- package/src/backends/csharp.js +4 -3
- package/src/backends/dart-check.js +117 -0
- package/src/backends/dart.js +4 -4
- package/src/backends/go-check.js +89 -0
- package/src/backends/go.js +2 -2
- package/src/backends/java-check.js +77 -0
- package/src/backends/javascript-check.js +33 -0
- package/src/backends/kotlin-check.js +41 -0
- package/src/backends/php-check.js +23 -0
- package/src/backends/program.js +17 -0
- package/src/backends/python-check.js +30 -0
- package/src/backends/ruby-check.js +23 -0
- package/src/backends/rust-check.js +78 -0
- package/src/backends/swift-check.js +89 -0
- package/src/backends/typescript-check.js +37 -0
- package/src/backends/zig-check.js +81 -0
- package/src/diagnostic.js +9 -1
- package/src/frontends/program.js +9 -0
- package/src/language-registry.js +113 -4
- package/src/project-build.js +353 -0
- package/src/project-cli.js +155 -0
- package/src/project-manifest.js +479 -0
- package/src/project-reporter.js +320 -0
- package/src/project-snapshot.js +403 -0
- package/src/project-watch-reporter.js +303 -0
- package/src/project-watch.js +870 -0
- package/src/publication.js +2071 -0
- package/src/semantic/types.js +184 -0
- package/src/subprocess.js +49 -8
- package/src/target-check.js +844 -0
- package/src/toolchains.js +3 -2
- package/tsconfig.json +1 -1
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { SemantifoldDiagnostic } from "./diagnostic.js";
|
|
3
|
+
/**
|
|
4
|
+
* Emits concise human output or the deterministic Task-039 NDJSON state protocol.
|
|
5
|
+
*/
|
|
6
|
+
export class ProjectBuildReporter {
|
|
7
|
+
/** @type {"human" | "ndjson"} */
|
|
8
|
+
#format;
|
|
9
|
+
/** @type {WritableOutput} */
|
|
10
|
+
#stdout;
|
|
11
|
+
/** @type {WritableOutput} */
|
|
12
|
+
#stderr;
|
|
13
|
+
/** @type {string | null} */
|
|
14
|
+
#projectId = null;
|
|
15
|
+
/** @type {string | null} */
|
|
16
|
+
#snapshotHash = null;
|
|
17
|
+
#terminal = false;
|
|
18
|
+
/**
|
|
19
|
+
* Creates a one-cycle reporter.
|
|
20
|
+
* @param {{format?: "human" | "ndjson", stderr?: WritableOutput, stdout?: WritableOutput}} [options] - Output mode and sinks.
|
|
21
|
+
*/
|
|
22
|
+
constructor(options = {}) {
|
|
23
|
+
const format = options.format ?? "human";
|
|
24
|
+
if (format != "human" && format != "ndjson")
|
|
25
|
+
throw new TypeError("Invalid project build reporter format.");
|
|
26
|
+
this.#format = format;
|
|
27
|
+
this.#stdout = options.stdout ?? process.stdout;
|
|
28
|
+
this.#stderr = options.stderr ?? process.stderr;
|
|
29
|
+
if (typeof this.#stdout?.write != "function" || typeof this.#stderr?.write != "function") {
|
|
30
|
+
throw new TypeError("Project build reporter requires writable output sinks.");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Reports validated project configuration.
|
|
35
|
+
* @param {string} projectId - Stable project identity.
|
|
36
|
+
* @returns {void}
|
|
37
|
+
*/
|
|
38
|
+
projectLoaded(projectId) {
|
|
39
|
+
this.#projectId = projectId;
|
|
40
|
+
this.#emitState({ state: "project-loaded" });
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Reports one stable complete source snapshot.
|
|
44
|
+
* @param {string} snapshotHash - Complete ordered snapshot hash.
|
|
45
|
+
* @returns {void}
|
|
46
|
+
*/
|
|
47
|
+
snapshotLoaded(snapshotHash) {
|
|
48
|
+
this.#snapshotHash = snapshotHash;
|
|
49
|
+
this.#emitState({ snapshotHash, state: "snapshot-loaded" });
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Reports one ordered generated target.
|
|
53
|
+
* @param {import("./project-build.js").ProjectBuildTargetResult} target - Completed target result.
|
|
54
|
+
* @returns {void}
|
|
55
|
+
*/
|
|
56
|
+
targetGenerated(target) {
|
|
57
|
+
this.#emitState({
|
|
58
|
+
artifactCount: target.artifactCount,
|
|
59
|
+
language: target.language,
|
|
60
|
+
role: target.role,
|
|
61
|
+
state: "target-generated",
|
|
62
|
+
target: target.id
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reports one successful target-check stage with exact process evidence.
|
|
67
|
+
* @param {{id: string, language: string, stage: import("./semantic/types.js").TargetCheckStageResult}} checked - Target and stage result.
|
|
68
|
+
* @returns {void}
|
|
69
|
+
*/
|
|
70
|
+
targetChecked(checked) {
|
|
71
|
+
this.#emitState({
|
|
72
|
+
argv: checked.stage.argv,
|
|
73
|
+
durationMs: checked.stage.durationMs,
|
|
74
|
+
exitCode: checked.stage.exitCode,
|
|
75
|
+
language: checked.language,
|
|
76
|
+
signal: checked.stage.signal,
|
|
77
|
+
stage: checked.stage.stage,
|
|
78
|
+
state: "target-checked",
|
|
79
|
+
stderr: checked.stage.stderr,
|
|
80
|
+
stdout: checked.stage.stdout,
|
|
81
|
+
target: checked.id,
|
|
82
|
+
tool: checked.stage.tool
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Emits the sole successful terminal record.
|
|
87
|
+
* @param {import("./project-build.js").ProjectBuildSuccess} result - Committed build result.
|
|
88
|
+
* @returns {void}
|
|
89
|
+
*/
|
|
90
|
+
succeeded(result) {
|
|
91
|
+
this.#requireOpenTerminal();
|
|
92
|
+
this.#terminal = true;
|
|
93
|
+
this.#projectId = result.projectId;
|
|
94
|
+
this.#snapshotHash = result.snapshotHash;
|
|
95
|
+
if (this.#format == "human") {
|
|
96
|
+
const targetWord = result.targets.length == 1 ? "target" : "targets";
|
|
97
|
+
const action = result.checked ? "Built and checked" : "Built";
|
|
98
|
+
this.#stdout.write(`${action} project '${result.projectId}' as generation '${result.generationId}' with ${result.targets.length} ${targetWord}.\n`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.#writeNdjson({
|
|
102
|
+
exitCode: 0,
|
|
103
|
+
checked: result.checked,
|
|
104
|
+
generationId: result.generationId,
|
|
105
|
+
snapshotHash: result.snapshotHash,
|
|
106
|
+
state: "succeeded",
|
|
107
|
+
targets: result.targets.map(target => ({
|
|
108
|
+
artifactCount: target.artifactCount,
|
|
109
|
+
id: target.id,
|
|
110
|
+
language: target.language,
|
|
111
|
+
role: target.role
|
|
112
|
+
})),
|
|
113
|
+
terminal: true
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Emits the sole failed terminal record while preserving the first diagnostic.
|
|
118
|
+
* @param {unknown} failure - Build or CLI failure.
|
|
119
|
+
* @returns {void}
|
|
120
|
+
*/
|
|
121
|
+
failed(failure) {
|
|
122
|
+
this.#requireOpenTerminal();
|
|
123
|
+
this.#terminal = true;
|
|
124
|
+
const diagnostic = normalizeDiagnostic(failure);
|
|
125
|
+
if (this.#format == "human") {
|
|
126
|
+
this.#stderr.write(formatHumanProjectFailure(diagnostic, "Build failed"));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
this.#writeNdjson({
|
|
130
|
+
diagnostic: diagnosticRecord(diagnostic),
|
|
131
|
+
exitCode: 1,
|
|
132
|
+
...(this.#snapshotHash === null ? {} : { snapshotHash: this.#snapshotHash }),
|
|
133
|
+
state: "failed",
|
|
134
|
+
terminal: true
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Emits a non-terminal machine state when selected.
|
|
139
|
+
* @param {Record<string, unknown>} fields - State-specific fields.
|
|
140
|
+
* @returns {void}
|
|
141
|
+
*/
|
|
142
|
+
#emitState(fields) {
|
|
143
|
+
if (this.#format == "ndjson")
|
|
144
|
+
this.#writeNdjson(fields);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Writes one complete NDJSON protocol record.
|
|
148
|
+
* @param {Record<string, unknown>} fields - State-specific fields.
|
|
149
|
+
* @returns {void}
|
|
150
|
+
*/
|
|
151
|
+
#writeNdjson(fields) {
|
|
152
|
+
this.#stdout.write(`${JSON.stringify({
|
|
153
|
+
cycle: 1,
|
|
154
|
+
project: this.#projectId,
|
|
155
|
+
schema: "SemantifoldBuildEvent",
|
|
156
|
+
version: 1,
|
|
157
|
+
...fields
|
|
158
|
+
})}\n`);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Rejects an attempt to emit more than one terminal record.
|
|
162
|
+
* @returns {void}
|
|
163
|
+
*/
|
|
164
|
+
#requireOpenTerminal() {
|
|
165
|
+
if (this.#terminal)
|
|
166
|
+
throw new TypeError("Project build reporter already emitted its terminal record.");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Normalizes an unexpected failure without replacing a Semantifold diagnostic.
|
|
171
|
+
* @param {unknown} failure - Opaque failure.
|
|
172
|
+
* @returns {SemantifoldDiagnostic} Stable diagnostic.
|
|
173
|
+
*/
|
|
174
|
+
export function normalizeDiagnostic(failure) {
|
|
175
|
+
if (failure instanceof SemantifoldDiagnostic)
|
|
176
|
+
return failure;
|
|
177
|
+
const cause = failure instanceof Error ? failure : new Error(String(failure));
|
|
178
|
+
return new SemantifoldDiagnostic({
|
|
179
|
+
cause,
|
|
180
|
+
code: "PROJECT_BUILD_FAILED",
|
|
181
|
+
language: "project",
|
|
182
|
+
message: "Project build failed unexpectedly."
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Serializes stable public diagnostic fields without causes or host paths.
|
|
187
|
+
* @param {SemantifoldDiagnostic} diagnostic - Normalized diagnostic.
|
|
188
|
+
* @returns {Record<string, unknown>} Protocol diagnostic.
|
|
189
|
+
*/
|
|
190
|
+
export function diagnosticRecord(diagnostic) {
|
|
191
|
+
return {
|
|
192
|
+
code: diagnostic.code,
|
|
193
|
+
detail: diagnostic.detail,
|
|
194
|
+
language: diagnostic.language,
|
|
195
|
+
...(diagnostic.location === undefined ? {} : { location: diagnostic.location }),
|
|
196
|
+
...optionalDiagnosticFields(diagnostic),
|
|
197
|
+
...(diagnostic.cause instanceof SemantifoldDiagnostic ? { cause: diagnosticRecord(diagnostic.cause) } : {})
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Retains stable structured process and target context.
|
|
202
|
+
* @param {SemantifoldDiagnostic} diagnostic - Diagnostic to serialize.
|
|
203
|
+
* @returns {Record<string, unknown>} Present optional fields.
|
|
204
|
+
*/
|
|
205
|
+
function optionalDiagnosticFields(diagnostic) {
|
|
206
|
+
const fields = [
|
|
207
|
+
"command", "durationMs", "executable", "exitCode", "projectId", "signal", "stage", "stderr", "stdout", "targetId",
|
|
208
|
+
"toolId", "version"
|
|
209
|
+
];
|
|
210
|
+
/** @type {Record<string, unknown>} */
|
|
211
|
+
const result = {};
|
|
212
|
+
for (const field of fields) {
|
|
213
|
+
const value = Reflect.get(diagnostic, field);
|
|
214
|
+
if (value !== undefined)
|
|
215
|
+
result[field] = value;
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Finds the most specific Semantifold diagnostic in a preserved cause chain.
|
|
221
|
+
* @param {SemantifoldDiagnostic} diagnostic - Root diagnostic.
|
|
222
|
+
* @returns {SemantifoldDiagnostic} Deepest structured diagnostic.
|
|
223
|
+
*/
|
|
224
|
+
function deepestDiagnostic(diagnostic) {
|
|
225
|
+
let current = diagnostic;
|
|
226
|
+
while (current.cause instanceof SemantifoldDiagnostic)
|
|
227
|
+
current = current.cause;
|
|
228
|
+
return current;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Formats nested structured diagnostics without duplicating detailed checker-process evidence.
|
|
232
|
+
* @param {SemantifoldDiagnostic} diagnostic - Root diagnostic.
|
|
233
|
+
* @param {SemantifoldDiagnostic} deepest - Deepest structured diagnostic.
|
|
234
|
+
* @returns {string} Ordered human-readable cause lines.
|
|
235
|
+
*/
|
|
236
|
+
function humanDiagnosticCauses(diagnostic, deepest) {
|
|
237
|
+
let current = diagnostic.cause;
|
|
238
|
+
let result = "";
|
|
239
|
+
while (current instanceof SemantifoldDiagnostic) {
|
|
240
|
+
if (current !== deepest || !current.code.startsWith("TARGET_CHECK_")) {
|
|
241
|
+
result += `Caused by: ${current.message}\n`;
|
|
242
|
+
}
|
|
243
|
+
current = current.cause;
|
|
244
|
+
}
|
|
245
|
+
return result;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Formats complete bounded check-process evidence without flattening its diagnostic.
|
|
249
|
+
* @param {SemantifoldDiagnostic} diagnostic - Deepest structured diagnostic.
|
|
250
|
+
* @returns {string} Human-readable check context and streams, when applicable.
|
|
251
|
+
*/
|
|
252
|
+
function humanProcessEvidence(diagnostic) {
|
|
253
|
+
if (!diagnostic.code.startsWith("TARGET_CHECK_"))
|
|
254
|
+
return "";
|
|
255
|
+
/**
|
|
256
|
+
* Reads one optional diagnostic field for compact human display.
|
|
257
|
+
* @param {string} field - Field identity.
|
|
258
|
+
* @returns {unknown} Present value or an explicit absence marker.
|
|
259
|
+
*/
|
|
260
|
+
const value = field => Reflect.get(diagnostic, field) ?? "none";
|
|
261
|
+
const heading = `Check failure: project='${value("projectId")}' target='${value("targetId")}' ` +
|
|
262
|
+
`language='${diagnostic.language}' tool='${value("toolId")}' executable='${value("executable")}' ` +
|
|
263
|
+
`version='${value("version")}' stage='${value("stage")}' exitCode=${value("exitCode")} ` +
|
|
264
|
+
`signal=${value("signal")} durationMs=${value("durationMs")}\n`;
|
|
265
|
+
return `${heading}${humanStream("stdout", diagnostic.stdout)}${humanStream("stderr", diagnostic.stderr)}`;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Formats one normalized failure with preserved nested process evidence.
|
|
269
|
+
* This helper is shared by the one-shot and watch reporters but is not a package-root API.
|
|
270
|
+
* @param {unknown} failure - Opaque or normalized failure.
|
|
271
|
+
* @param {string} heading - Human output heading without punctuation.
|
|
272
|
+
* @returns {string} Complete newline-terminated failure text.
|
|
273
|
+
*/
|
|
274
|
+
export function formatHumanProjectFailure(failure, heading) {
|
|
275
|
+
const diagnostic = normalizeDiagnostic(failure);
|
|
276
|
+
const processFailure = deepestDiagnostic(diagnostic);
|
|
277
|
+
const causes = humanDiagnosticCauses(diagnostic, processFailure);
|
|
278
|
+
const evidence = humanProcessEvidence(processFailure);
|
|
279
|
+
return `${heading}: ${diagnostic.message}\n${causes}${evidence}`;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Labels one bounded process stream and preserves its exact content.
|
|
283
|
+
* @param {string} name - Stream identity.
|
|
284
|
+
* @param {unknown} content - Captured stream value.
|
|
285
|
+
* @returns {string} Labeled newline-terminated stream evidence.
|
|
286
|
+
*/
|
|
287
|
+
function humanStream(name, content) {
|
|
288
|
+
if (typeof content != "string" || content.length == 0)
|
|
289
|
+
return `${name}:\n<empty>\n`;
|
|
290
|
+
return `${name}:\n${content}${content.endsWith("\n") ? "" : "\n"}`;
|
|
291
|
+
}
|
|
292
|
+
/** @typedef {{write: (chunk: string) => unknown}} WritableOutput */
|
|
293
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1yZXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LXJlcG9ydGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUVyRDs7R0FFRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsaUNBQWlDO0lBQ2pDLE9BQU8sQ0FBQTtJQUNQLDZCQUE2QjtJQUM3QixPQUFPLENBQUE7SUFDUCw2QkFBNkI7SUFDN0IsT0FBTyxDQUFBO0lBQ1AsNEJBQTRCO0lBQzVCLFVBQVUsR0FBRyxJQUFJLENBQUE7SUFDakIsNEJBQTRCO0lBQzVCLGFBQWEsR0FBRyxJQUFJLENBQUE7SUFDcEIsU0FBUyxHQUFHLEtBQUssQ0FBQTtJQUVqQjs7O09BR0c7SUFDSCxZQUFZLE9BQU8sR0FBRyxFQUFFO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFBO1FBRXhDLElBQUksTUFBTSxJQUFJLE9BQU8sSUFBSSxNQUFNLElBQUksUUFBUTtZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtRQUMxRyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQTtRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQTtRQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQTtRQUMvQyxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksVUFBVSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksVUFBVSxFQUFFLENBQUM7WUFDekYsTUFBTSxJQUFJLFNBQVMsQ0FBQyx3REFBd0QsQ0FBQyxDQUFBO1FBQy9F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LENBQUE7SUFFakUsT0FBTyxHQUFHLE9BQU8sR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFBO0FBQzNHLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsT0FBTyxFQUFFLE9BQU87SUFDeEQsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDL0MsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDcEQsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBRXJELE9BQU8sR0FBRyxPQUFPLEtBQUssVUFBVSxDQUFDLE9BQU8sS0FBSyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUE7QUFDbEUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU87SUFDaEMsSUFBSSxPQUFPLE9BQU8sSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDO1FBQUUsT0FBTyxHQUFHLElBQUksY0FBYyxDQUFBO0lBRW5GLE9BQU8sR0FBRyxJQUFJLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7QUFDcEUsQ0FBQztBQUVELG9FQUFvRSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZnJvbSBcIi4vZGlhZ25vc3RpYy5qc1wiXG5cbi8qKlxuICogRW1pdHMgY29uY2lzZSBodW1hbiBvdXRwdXQgb3IgdGhlIGRldGVybWluaXN0aWMgVGFzay0wMzkgTkRKU09OIHN0YXRlIHByb3RvY29sLlxuICovXG5leHBvcnQgY2xhc3MgUHJvamVjdEJ1aWxkUmVwb3J0ZXIge1xuICAvKiogQHR5cGUge1wiaHVtYW5cIiB8IFwibmRqc29uXCJ9ICovXG4gICNmb3JtYXRcbiAgLyoqIEB0eXBlIHtXcml0YWJsZU91dHB1dH0gKi9cbiAgI3N0ZG91dFxuICAvKiogQHR5cGUge1dyaXRhYmxlT3V0cHV0fSAqL1xuICAjc3RkZXJyXG4gIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVsbH0gKi9cbiAgI3Byb2plY3RJZCA9IG51bGxcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCBudWxsfSAqL1xuICAjc25hcHNob3RIYXNoID0gbnVsbFxuICAjdGVybWluYWwgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgb25lLWN5Y2xlIHJlcG9ydGVyLlxuICAgKiBAcGFyYW0ge3tmb3JtYXQ/OiBcImh1bWFuXCIgfCBcIm5kanNvblwiLCBzdGRlcnI/OiBXcml0YWJsZU91dHB1dCwgc3Rkb3V0PzogV3JpdGFibGVPdXRwdXR9fSBbb3B0aW9uc10gLSBPdXRwdXQgbW9kZSBhbmQgc2lua3MuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmZvcm1hdCA/PyBcImh1bWFuXCJcblxuICAgIGlmIChmb3JtYXQgIT0gXCJodW1hblwiICYmIGZvcm1hdCAhPSBcIm5kanNvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBwcm9qZWN0IGJ1aWxkIHJlcG9ydGVyIGZvcm1hdC5cIilcbiAgICB0aGlzLiNmb3JtYXQgPSBmb3JtYXRcbiAgICB0aGlzLiNzdGRvdXQgPSBvcHRpb25zLnN0ZG91dCA/PyBwcm9jZXNzLnN0ZG91dFxuICAgIHRoaXMuI3N0ZGVyciA9IG9wdGlvbnMuc3RkZXJyID8/IHByb2Nlc3Muc3RkZXJyXG4gICAgaWYgKHR5cGVvZiB0aGlzLiNzdGRvdXQ/LndyaXRlICE9IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgdGhpcy4jc3RkZXJyPy53cml0ZSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkIHJlcG9ydGVyIHJlcXVpcmVzIHdyaXRhYmxlIG91dHB1dCBzaW5rcy5cIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyB2YWxpZGF0ZWQgcHJvamVjdCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkIC0gU3RhYmxlIHByb2plY3QgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJvamVjdExvYWRlZChwcm9qZWN0SWQpIHtcbiAgICB0aGlzLiNwcm9qZWN0SWQgPSBwcm9qZWN0SWRcbiAgICB0aGlzLiNlbWl0U3RhdGUoe3N0YXRlOiBcInByb2plY3QtbG9hZGVkXCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgb25lIHN0YWJsZSBjb21wbGV0ZSBzb3VyY2Ugc25hcHNob3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzbmFwc2hvdEhhc2ggLSBDb21wbGV0ZSBvcmRlcmVkIHNuYXBzaG90IGhhc2guXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc25hcHNob3RMb2FkZWQoc25hcHNob3RIYXNoKSB7XG4gICAgdGhpcy4jc25hcHNob3RIYXNoID0gc25hcHNob3RIYXNoXG4gICAgdGhpcy4jZW1pdFN0YXRlKHtzbmFwc2hvdEhhc2gsIHN0YXRlOiBcInNuYXBzaG90LWxvYWRlZFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIG9uZSBvcmRlcmVkIGdlbmVyYXRlZCB0YXJnZXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9wcm9qZWN0LWJ1aWxkLmpzXCIpLlByb2plY3RCdWlsZFRhcmdldFJlc3VsdH0gdGFyZ2V0IC0gQ29tcGxldGVkIHRhcmdldCByZXN1bHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgdGFyZ2V0R2VuZXJhdGVkKHRhcmdldCkge1xuICAgIHRoaXMuI2VtaXRTdGF0ZSh7XG4gICAgICBhcnRpZmFjdENvdW50OiB0YXJnZXQuYXJ0aWZhY3RDb3VudCxcbiAgICAgIGxhbmd1YWdlOiB0YXJnZXQubGFuZ3VhZ2UsXG4gICAgICByb2xlOiB0YXJnZXQucm9sZSxcbiAgICAgIHN0YXRlOiBcInRhcmdldC1nZW5lcmF0ZWRcIixcbiAgICAgIHRhcmdldDogdGFyZ2V0LmlkXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIG9uZSBzdWNjZXNzZnVsIHRhcmdldC1jaGVjayBzdGFnZSB3aXRoIGV4YWN0IHByb2Nlc3MgZXZpZGVuY2UuXG4gICAqIEBwYXJhbSB7e2lkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcsIHN0YWdlOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlRhcmdldENoZWNrU3RhZ2VSZXN1bHR9fSBjaGVja2VkIC0gVGFyZ2V0IGFuZCBzdGFnZSByZXN1bHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgdGFyZ2V0Q2hlY2tlZChjaGVja2VkKSB7XG4gICAgdGhpcy4jZW1pdFN0YXRlKHtcbiAgICAgIGFyZ3Y6IGNoZWNrZWQuc3RhZ2UuYXJndixcbiAgICAgIGR1cmF0aW9uTXM6IGNoZWNrZWQuc3RhZ2UuZHVyYXRpb25NcyxcbiAgICAgIGV4aXRDb2RlOiBjaGVja2VkLnN0YWdlLmV4aXRDb2RlLFxuICAgICAgbGFuZ3VhZ2U6IGNoZWNrZWQubGFuZ3VhZ2UsXG4gICAgICBzaWduYWw6IGNoZWNrZWQuc3RhZ2Uuc2lnbmFsLFxuICAgICAgc3RhZ2U6IGNoZWNrZWQuc3RhZ2Uuc3RhZ2UsXG4gICAgICBzdGF0ZTogXCJ0YXJnZXQtY2hlY2tlZFwiLFxuICAgICAgc3RkZXJyOiBjaGVja2VkLnN0YWdlLnN0ZGVycixcbiAgICAgIHN0ZG91dDogY2hlY2tlZC5zdGFnZS5zdGRvdXQsXG4gICAgICB0YXJnZXQ6IGNoZWNrZWQuaWQsXG4gICAgICB0b29sOiBjaGVja2VkLnN0YWdlLnRvb2xcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBzb2xlIHN1Y2Nlc3NmdWwgdGVybWluYWwgcmVjb3JkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcHJvamVjdC1idWlsZC5qc1wiKS5Qcm9qZWN0QnVpbGRTdWNjZXNzfSByZXN1bHQgLSBDb21taXR0ZWQgYnVpbGQgcmVzdWx0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN1Y2NlZWRlZChyZXN1bHQpIHtcbiAgICB0aGlzLiNyZXF1aXJlT3BlblRlcm1pbmFsKClcbiAgICB0aGlzLiN0ZXJtaW5hbCA9IHRydWVcbiAgICB0aGlzLiNwcm9qZWN0SWQgPSByZXN1bHQucHJvamVjdElkXG4gICAgdGhpcy4jc25hcHNob3RIYXNoID0gcmVzdWx0LnNuYXBzaG90SGFzaFxuICAgIGlmICh0aGlzLiNmb3JtYXQgPT0gXCJodW1hblwiKSB7XG4gICAgICBjb25zdCB0YXJnZXRXb3JkID0gcmVzdWx0LnRhcmdldHMubGVuZ3RoID09IDEgPyBcInRhcmdldFwiIDogXCJ0YXJnZXRzXCJcblxuICAgICAgY29uc3QgYWN0aW9uID0gcmVzdWx0LmNoZWNrZWQgPyBcIkJ1aWx0IGFuZCBjaGVja2VkXCIgOiBcIkJ1aWx0XCJcblxuICAgICAgdGhpcy4jc3Rkb3V0LndyaXRlKGAke2FjdGlvbn0gcHJvamVjdCAnJHtyZXN1bHQucHJvamVjdElkfScgYXMgZ2VuZXJhdGlvbiAnJHtyZXN1bHQuZ2VuZXJhdGlvbklkfScgd2l0aCAke3Jlc3VsdC50YXJnZXRzLmxlbmd0aH0gJHt0YXJnZXRXb3JkfS5cXG5gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuI3dyaXRlTmRqc29uKHtcbiAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgY2hlY2tlZDogcmVzdWx0LmNoZWNrZWQsXG4gICAgICBnZW5lcmF0aW9uSWQ6IHJlc3VsdC5nZW5lcmF0aW9uSWQsXG4gICAgICBzbmFwc2hvdEhhc2g6IHJlc3VsdC5zbmFwc2hvdEhhc2gsXG4gICAgICBzdGF0ZTogXCJzdWNjZWVkZWRcIixcbiAgICAgIHRhcmdldHM6IHJlc3VsdC50YXJnZXRzLm1hcCh0YXJnZXQgPT4gKHtcbiAgICAgICAgYXJ0aWZhY3RDb3VudDogdGFyZ2V0LmFydGlmYWN0Q291bnQsXG4gICAgICAgIGlkOiB0YXJnZXQuaWQsXG4gICAgICAgIGxhbmd1YWdlOiB0YXJnZXQubGFuZ3VhZ2UsXG4gICAgICAgIHJvbGU6IHRhcmdldC5yb2xlXG4gICAgICB9KSksXG4gICAgICB0ZXJtaW5hbDogdHJ1ZVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIHNvbGUgZmFpbGVkIHRlcm1pbmFsIHJlY29yZCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBmaXJzdCBkaWFnbm9zdGljLlxuICAgKiBAcGFyYW0ge3Vua25vd259IGZhaWx1cmUgLSBCdWlsZCBvciBDTEkgZmFpbHVyZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmYWlsZWQoZmFpbHVyZSkge1xuICAgIHRoaXMuI3JlcXVpcmVPcGVuVGVybWluYWwoKVxuICAgIHRoaXMuI3Rlcm1pbmFsID0gdHJ1ZVxuICAgIGNvbnN0IGRpYWdub3N0aWMgPSBub3JtYWxpemVEaWFnbm9zdGljKGZhaWx1cmUpXG5cbiAgICBpZiAodGhpcy4jZm9ybWF0ID09IFwiaHVtYW5cIikge1xuICAgICAgdGhpcy4jc3RkZXJyLndyaXRlKGZvcm1hdEh1bWFuUHJvamVjdEZhaWx1cmUoZGlhZ25vc3RpYywgXCJCdWlsZCBmYWlsZWRcIikpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy4jd3JpdGVOZGpzb24oe1xuICAgICAgZGlhZ25vc3RpYzogZGlhZ25vc3RpY1JlY29yZChkaWFnbm9zdGljKSxcbiAgICAgIGV4aXRDb2RlOiAxLFxuICAgICAgLi4uKHRoaXMuI3NuYXBzaG90SGFzaCA9PT0gbnVsbCA/IHt9IDoge3NuYXBzaG90SGFzaDogdGhpcy4jc25hcHNob3RIYXNofSksXG4gICAgICBzdGF0ZTogXCJmYWlsZWRcIixcbiAgICAgIHRlcm1pbmFsOiB0cnVlXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhIG5vbi10ZXJtaW5hbCBtYWNoaW5lIHN0YXRlIHdoZW4gc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGZpZWxkcyAtIFN0YXRlLXNwZWNpZmljIGZpZWxkcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICAjZW1pdFN0YXRlKGZpZWxkcykge1xuICAgIGlmICh0aGlzLiNmb3JtYXQgPT0gXCJuZGpzb25cIikgdGhpcy4jd3JpdGVOZGpzb24oZmllbGRzKVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBvbmUgY29tcGxldGUgTkRKU09OIHByb3RvY29sIHJlY29yZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gZmllbGRzIC0gU3RhdGUtc3BlY2lmaWMgZmllbGRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gICN3cml0ZU5kanNvbihmaWVsZHMpIHtcbiAgICB0aGlzLiNzdGRvdXQud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY3ljbGU6IDEsXG4gICAgICBwcm9qZWN0OiB0aGlzLiNwcm9qZWN0SWQsXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRCdWlsZEV2ZW50XCIsXG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgLi4uZmllbGRzXG4gICAgfSl9XFxuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3RzIGFuIGF0dGVtcHQgdG8gZW1pdCBtb3JlIHRoYW4gb25lIHRlcm1pbmFsIHJlY29yZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICAjcmVxdWlyZU9wZW5UZXJtaW5hbCgpIHtcbiAgICBpZiAodGhpcy4jdGVybWluYWwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkIHJlcG9ydGVyIGFscmVhZHkgZW1pdHRlZCBpdHMgdGVybWluYWwgcmVjb3JkLlwiKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbiB1bmV4cGVjdGVkIGZhaWx1cmUgd2l0aG91dCByZXBsYWNpbmcgYSBTZW1hbnRpZm9sZCBkaWFnbm9zdGljLlxuICogQHBhcmFtIHt1bmtub3dufSBmYWlsdXJlIC0gT3BhcXVlIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBTdGFibGUgZGlhZ25vc3RpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURpYWdub3N0aWMoZmFpbHVyZSkge1xuICBpZiAoZmFpbHVyZSBpbnN0YW5jZW9mIFNlbWFudGlmb2xkRGlhZ25vc3RpYykgcmV0dXJuIGZhaWx1cmVcbiAgY29uc3QgY2F1c2UgPSBmYWlsdXJlIGluc3RhbmNlb2YgRXJyb3IgPyBmYWlsdXJlIDogbmV3IEVycm9yKFN0cmluZyhmYWlsdXJlKSlcblxuICByZXR1cm4gbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY2F1c2UsXG4gICAgY29kZTogXCJQUk9KRUNUX0JVSUxEX0ZBSUxFRFwiLFxuICAgIGxhbmd1YWdlOiBcInByb2plY3RcIixcbiAgICBtZXNzYWdlOiBcIlByb2plY3QgYnVpbGQgZmFpbGVkIHVuZXhwZWN0ZWRseS5cIlxuICB9KVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgc3RhYmxlIHB1YmxpYyBkaWFnbm9zdGljIGZpZWxkcyB3aXRob3V0IGNhdXNlcyBvciBob3N0IHBhdGhzLlxuICogQHBhcmFtIHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGRpYWdub3N0aWMgLSBOb3JtYWxpemVkIGRpYWdub3N0aWMuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFByb3RvY29sIGRpYWdub3N0aWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWFnbm9zdGljUmVjb3JkKGRpYWdub3N0aWMpIHtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBkaWFnbm9zdGljLmNvZGUsXG4gICAgZGV0YWlsOiBkaWFnbm9zdGljLmRldGFpbCxcbiAgICBsYW5ndWFnZTogZGlhZ25vc3RpYy5sYW5ndWFnZSxcbiAgICAuLi4oZGlhZ25vc3RpYy5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkID8ge30gOiB7bG9jYXRpb246IGRpYWdub3N0aWMubG9jYXRpb259KSxcbiAgICAuLi5vcHRpb25hbERpYWdub3N0aWNGaWVsZHMoZGlhZ25vc3RpYyksXG4gICAgLi4uKGRpYWdub3N0aWMuY2F1c2UgaW5zdGFuY2VvZiBTZW1hbnRpZm9sZERpYWdub3N0aWMgPyB7Y2F1c2U6IGRpYWdub3N0aWNSZWNvcmQoZGlhZ25vc3RpYy5jYXVzZSl9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBSZXRhaW5zIHN0YWJsZSBzdHJ1Y3R1cmVkIHByb2Nlc3MgYW5kIHRhcmdldCBjb250ZXh0LlxuICogQHBhcmFtIHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGRpYWdub3N0aWMgLSBEaWFnbm9zdGljIHRvIHNlcmlhbGl6ZS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gUHJlc2VudCBvcHRpb25hbCBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIG9wdGlvbmFsRGlhZ25vc3RpY0ZpZWxkcyhkaWFnbm9zdGljKSB7XG4gIGNvbnN0IGZpZWxkcyA9IFtcbiAgICBcImNvbW1hbmRcIiwgXCJkdXJhdGlvbk1zXCIsIFwiZXhlY3V0YWJsZVwiLCBcImV4aXRDb2RlXCIsIFwicHJvamVjdElkXCIsIFwic2lnbmFsXCIsIFwic3RhZ2VcIiwgXCJzdGRlcnJcIiwgXCJzdGRvdXRcIiwgXCJ0YXJnZXRJZFwiLFxuICAgIFwidG9vbElkXCIsIFwidmVyc2lvblwiXG4gIF1cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgY29uc3QgcmVzdWx0ID0ge31cblxuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgIGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQoZGlhZ25vc3RpYywgZmllbGQpXG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgcmVzdWx0W2ZpZWxkXSA9IHZhbHVlXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG1vc3Qgc3BlY2lmaWMgU2VtYW50aWZvbGQgZGlhZ25vc3RpYyBpbiBhIHByZXNlcnZlZCBjYXVzZSBjaGFpbi5cbiAqIEBwYXJhbSB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBkaWFnbm9zdGljIC0gUm9vdCBkaWFnbm9zdGljLlxuICogQHJldHVybnMge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gRGVlcGVzdCBzdHJ1Y3R1cmVkIGRpYWdub3N0aWMuXG4gKi9cbmZ1bmN0aW9uIGRlZXBlc3REaWFnbm9zdGljKGRpYWdub3N0aWMpIHtcbiAgbGV0IGN1cnJlbnQgPSBkaWFnbm9zdGljXG5cbiAgd2hpbGUgKGN1cnJlbnQuY2F1c2UgaW5zdGFuY2VvZiBTZW1hbnRpZm9sZERpYWdub3N0aWMpIGN1cnJlbnQgPSBjdXJyZW50LmNhdXNlXG5cbiAgcmV0dXJuIGN1cnJlbnRcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG5lc3RlZCBzdHJ1Y3R1cmVkIGRpYWdub3N0aWNzIHdpdGhvdXQgZHVwbGljYXRpbmcgZGV0YWlsZWQgY2hlY2tlci1wcm9jZXNzIGV2aWRlbmNlLlxuICogQHBhcmFtIHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGRpYWdub3N0aWMgLSBSb290IGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZGVlcGVzdCAtIERlZXBlc3Qgc3RydWN0dXJlZCBkaWFnbm9zdGljLlxuICogQHJldHVybnMge3N0cmluZ30gT3JkZXJlZCBodW1hbi1yZWFkYWJsZSBjYXVzZSBsaW5lcy5cbiAqL1xuZnVuY3Rpb24gaHVtYW5EaWFnbm9zdGljQ2F1c2VzKGRpYWdub3N0aWMsIGRlZXBlc3QpIHtcbiAgbGV0IGN1cnJlbnQgPSBkaWFnbm9zdGljLmNhdXNlXG4gIGxldCByZXN1bHQgPSBcIlwiXG5cbiAgd2hpbGUgKGN1cnJlbnQgaW5zdGFuY2VvZiBTZW1hbnRpZm9sZERpYWdub3N0aWMpIHtcbiAgICBpZiAoY3VycmVudCAhPT0gZGVlcGVzdCB8fCAhY3VycmVudC5jb2RlLnN0YXJ0c1dpdGgoXCJUQVJHRVRfQ0hFQ0tfXCIpKSB7XG4gICAgICByZXN1bHQgKz0gYENhdXNlZCBieTogJHtjdXJyZW50Lm1lc3NhZ2V9XFxuYFxuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudC5jYXVzZVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEZvcm1hdHMgY29tcGxldGUgYm91bmRlZCBjaGVjay1wcm9jZXNzIGV2aWRlbmNlIHdpdGhvdXQgZmxhdHRlbmluZyBpdHMgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBkaWFnbm9zdGljIC0gRGVlcGVzdCBzdHJ1Y3R1cmVkIGRpYWdub3N0aWMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBIdW1hbi1yZWFkYWJsZSBjaGVjayBjb250ZXh0IGFuZCBzdHJlYW1zLCB3aGVuIGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGh1bWFuUHJvY2Vzc0V2aWRlbmNlKGRpYWdub3N0aWMpIHtcbiAgaWYgKCFkaWFnbm9zdGljLmNvZGUuc3RhcnRzV2l0aChcIlRBUkdFVF9DSEVDS19cIikpIHJldHVybiBcIlwiXG4gIC8qKlxuICAgKiBSZWFkcyBvbmUgb3B0aW9uYWwgZGlhZ25vc3RpYyBmaWVsZCBmb3IgY29tcGFjdCBodW1hbiBkaXNwbGF5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGQgLSBGaWVsZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge3Vua25vd259IFByZXNlbnQgdmFsdWUgb3IgYW4gZXhwbGljaXQgYWJzZW5jZSBtYXJrZXIuXG4gICAqL1xuICBjb25zdCB2YWx1ZSA9IGZpZWxkID0+IFJlZmxlY3QuZ2V0KGRpYWdub3N0aWMsIGZpZWxkKSA/PyBcIm5vbmVcIlxuICBjb25zdCBoZWFkaW5nID0gYENoZWNrIGZhaWx1cmU6IHByb2plY3Q9JyR7dmFsdWUoXCJwcm9qZWN0SWRcIil9JyB0YXJnZXQ9JyR7dmFsdWUoXCJ0YXJnZXRJZFwiKX0nIGAgK1xuICAgIGBsYW5ndWFnZT0nJHtkaWFnbm9zdGljLmxhbmd1YWdlfScgdG9vbD0nJHt2YWx1ZShcInRvb2xJZFwiKX0nIGV4ZWN1dGFibGU9JyR7dmFsdWUoXCJleGVjdXRhYmxlXCIpfScgYCArXG4gICAgYHZlcnNpb249JyR7dmFsdWUoXCJ2ZXJzaW9uXCIpfScgc3RhZ2U9JyR7dmFsdWUoXCJzdGFnZVwiKX0nIGV4aXRDb2RlPSR7dmFsdWUoXCJleGl0Q29kZVwiKX0gYCArXG4gICAgYHNpZ25hbD0ke3ZhbHVlKFwic2lnbmFsXCIpfSBkdXJhdGlvbk1zPSR7dmFsdWUoXCJkdXJhdGlvbk1zXCIpfVxcbmBcblxuICByZXR1cm4gYCR7aGVhZGluZ30ke2h1bWFuU3RyZWFtKFwic3Rkb3V0XCIsIGRpYWdub3N0aWMuc3Rkb3V0KX0ke2h1bWFuU3RyZWFtKFwic3RkZXJyXCIsIGRpYWdub3N0aWMuc3RkZXJyKX1gXG59XG5cbi8qKlxuICogRm9ybWF0cyBvbmUgbm9ybWFsaXplZCBmYWlsdXJlIHdpdGggcHJlc2VydmVkIG5lc3RlZCBwcm9jZXNzIGV2aWRlbmNlLlxuICogVGhpcyBoZWxwZXIgaXMgc2hhcmVkIGJ5IHRoZSBvbmUtc2hvdCBhbmQgd2F0Y2ggcmVwb3J0ZXJzIGJ1dCBpcyBub3QgYSBwYWNrYWdlLXJvb3QgQVBJLlxuICogQHBhcmFtIHt1bmtub3dufSBmYWlsdXJlIC0gT3BhcXVlIG9yIG5vcm1hbGl6ZWQgZmFpbHVyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkaW5nIC0gSHVtYW4gb3V0cHV0IGhlYWRpbmcgd2l0aG91dCBwdW5jdHVhdGlvbi5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbXBsZXRlIG5ld2xpbmUtdGVybWluYXRlZCBmYWlsdXJlIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRIdW1hblByb2plY3RGYWlsdXJlKGZhaWx1cmUsIGhlYWRpbmcpIHtcbiAgY29uc3QgZGlhZ25vc3RpYyA9IG5vcm1hbGl6ZURpYWdub3N0aWMoZmFpbHVyZSlcbiAgY29uc3QgcHJvY2Vzc0ZhaWx1cmUgPSBkZWVwZXN0RGlhZ25vc3RpYyhkaWFnbm9zdGljKVxuICBjb25zdCBjYXVzZXMgPSBodW1hbkRpYWdub3N0aWNDYXVzZXMoZGlhZ25vc3RpYywgcHJvY2Vzc0ZhaWx1cmUpXG4gIGNvbnN0IGV2aWRlbmNlID0gaHVtYW5Qcm9jZXNzRXZpZGVuY2UocHJvY2Vzc0ZhaWx1cmUpXG5cbiAgcmV0dXJuIGAke2hlYWRpbmd9OiAke2RpYWdub3N0aWMubWVzc2FnZX1cXG4ke2NhdXNlc30ke2V2aWRlbmNlfWBcbn1cblxuLyoqXG4gKiBMYWJlbHMgb25lIGJvdW5kZWQgcHJvY2VzcyBzdHJlYW0gYW5kIHByZXNlcnZlcyBpdHMgZXhhY3QgY29udGVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gU3RyZWFtIGlkZW50aXR5LlxuICogQHBhcmFtIHt1bmtub3dufSBjb250ZW50IC0gQ2FwdHVyZWQgc3RyZWFtIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gTGFiZWxlZCBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyZWFtIGV2aWRlbmNlLlxuICovXG5mdW5jdGlvbiBodW1hblN0cmVhbShuYW1lLCBjb250ZW50KSB7XG4gIGlmICh0eXBlb2YgY29udGVudCAhPSBcInN0cmluZ1wiIHx8IGNvbnRlbnQubGVuZ3RoID09IDApIHJldHVybiBgJHtuYW1lfTpcXG48ZW1wdHk+XFxuYFxuXG4gIHJldHVybiBgJHtuYW1lfTpcXG4ke2NvbnRlbnR9JHtjb250ZW50LmVuZHNXaXRoKFwiXFxuXCIpID8gXCJcIiA6IFwiXFxuXCJ9YFxufVxuXG4vKiogQHR5cGVkZWYge3t3cml0ZTogKGNodW5rOiBzdHJpbmcpID0+IHVua25vd259fSBXcml0YWJsZU91dHB1dCAqL1xuIl19
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { SemantifoldProject } from "./project-manifest.js";
|
|
2
|
+
/**
|
|
3
|
+
* Installs an internal deterministic read observer for real-filesystem snapshot specs.
|
|
4
|
+
* This helper is intentionally not part of the package root API.
|
|
5
|
+
* @param {ProjectSnapshotBuilder} builder - Snapshot builder instance.
|
|
6
|
+
* @param {(event: Readonly<{attempt: number, pass: number, path: string}>) => Promise<void> | void} observer - Ordered read observer.
|
|
7
|
+
* @returns {void}
|
|
8
|
+
*/
|
|
9
|
+
export declare function observeProjectSnapshotReads(builder: ProjectSnapshotBuilder, observer: (event: Readonly<{
|
|
10
|
+
attempt: number;
|
|
11
|
+
pass: number;
|
|
12
|
+
path: string;
|
|
13
|
+
}>) => Promise<void> | void): void;
|
|
14
|
+
/**
|
|
15
|
+
* One complete immutable ordered source snapshot.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ProjectSnapshot {
|
|
18
|
+
hash: string;
|
|
19
|
+
manifestText: string;
|
|
20
|
+
projectId: string;
|
|
21
|
+
sources: readonly Readonly<{
|
|
22
|
+
id: string;
|
|
23
|
+
language: import("./semantic/types.js").SemanticLanguage;
|
|
24
|
+
path: string;
|
|
25
|
+
source: string;
|
|
26
|
+
}>[];
|
|
27
|
+
/**
|
|
28
|
+
* Constructs a trusted snapshot value.
|
|
29
|
+
* @param {{hash: string, manifestText: string, projectId: string, sources: SnapshotSource[]}} value - Stable snapshot fields.
|
|
30
|
+
*/
|
|
31
|
+
constructor(value: {
|
|
32
|
+
hash: string;
|
|
33
|
+
manifestText: string;
|
|
34
|
+
projectId: string;
|
|
35
|
+
sources: SnapshotSource[];
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Reads one complete graph twice before exposing an immutable source snapshot.
|
|
40
|
+
*/
|
|
41
|
+
export declare class ProjectSnapshotBuilder {
|
|
42
|
+
/**
|
|
43
|
+
* Builds a stable snapshot with one bounded retry when the graph changes mid-read.
|
|
44
|
+
* @param {SemantifoldProject} project - Validated immutable project.
|
|
45
|
+
* @returns {Promise<ProjectSnapshot>} Stable complete snapshot.
|
|
46
|
+
*/
|
|
47
|
+
build(project: SemantifoldProject): Promise<ProjectSnapshot>;
|
|
48
|
+
}
|
|
49
|
+
export type SnapshotSource = {
|
|
50
|
+
/**
|
|
51
|
+
* - Stable semantic module identity.
|
|
52
|
+
*/
|
|
53
|
+
id: string;
|
|
54
|
+
/**
|
|
55
|
+
* - Registered source language.
|
|
56
|
+
*/
|
|
57
|
+
language: import("./semantic/types.js").SemanticLanguage;
|
|
58
|
+
/**
|
|
59
|
+
* - Project-relative source path.
|
|
60
|
+
*/
|
|
61
|
+
path: string;
|
|
62
|
+
/**
|
|
63
|
+
* - Exact decoded source text.
|
|
64
|
+
*/
|
|
65
|
+
source: string;
|
|
66
|
+
};
|
|
67
|
+
export type ProjectGraphRead = {
|
|
68
|
+
/**
|
|
69
|
+
* - Exact manifest bytes.
|
|
70
|
+
*/
|
|
71
|
+
manifestBytes: Buffer;
|
|
72
|
+
/**
|
|
73
|
+
* - Stable manifest device/inode identity.
|
|
74
|
+
*/
|
|
75
|
+
manifestIdentity: string;
|
|
76
|
+
/**
|
|
77
|
+
* - Stable manifest mutation-sensitive state.
|
|
78
|
+
*/
|
|
79
|
+
manifestState: string;
|
|
80
|
+
/**
|
|
81
|
+
* - Exact source bytes in manifest order.
|
|
82
|
+
*/
|
|
83
|
+
sourceBytes: Buffer[];
|
|
84
|
+
/**
|
|
85
|
+
* - Stable source device/inode identities in manifest order.
|
|
86
|
+
*/
|
|
87
|
+
sourceIdentities: string[];
|
|
88
|
+
/**
|
|
89
|
+
* - Stable source mutation-sensitive states in manifest order.
|
|
90
|
+
*/
|
|
91
|
+
sourceStates: string[];
|
|
92
|
+
};
|
|
93
|
+
export type StableFileRead = {
|
|
94
|
+
/**
|
|
95
|
+
* - Exact stable file bytes.
|
|
96
|
+
*/
|
|
97
|
+
bytes: Buffer;
|
|
98
|
+
/**
|
|
99
|
+
* - Stable device/inode identity.
|
|
100
|
+
*/
|
|
101
|
+
identity: string;
|
|
102
|
+
/**
|
|
103
|
+
* - Stable mutation-sensitive file state.
|
|
104
|
+
*/
|
|
105
|
+
state: string;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* @typedef SnapshotSource
|
|
109
|
+
* @property {string} id - Stable semantic module identity.
|
|
110
|
+
* @property {import("./semantic/types.js").SemanticLanguage} language - Registered source language.
|
|
111
|
+
* @property {string} path - Project-relative source path.
|
|
112
|
+
* @property {string} source - Exact decoded source text.
|
|
113
|
+
*/
|
|
114
|
+
/**
|
|
115
|
+
* @typedef ProjectGraphRead
|
|
116
|
+
* @property {Buffer} manifestBytes - Exact manifest bytes.
|
|
117
|
+
* @property {string} manifestIdentity - Stable manifest device/inode identity.
|
|
118
|
+
* @property {string} manifestState - Stable manifest mutation-sensitive state.
|
|
119
|
+
* @property {Buffer[]} sourceBytes - Exact source bytes in manifest order.
|
|
120
|
+
* @property {string[]} sourceIdentities - Stable source device/inode identities in manifest order.
|
|
121
|
+
* @property {string[]} sourceStates - Stable source mutation-sensitive states in manifest order.
|
|
122
|
+
*/
|
|
123
|
+
/**
|
|
124
|
+
* @typedef StableFileRead
|
|
125
|
+
* @property {Buffer} bytes - Exact stable file bytes.
|
|
126
|
+
* @property {string} identity - Stable device/inode identity.
|
|
127
|
+
* @property {string} state - Stable mutation-sensitive file state.
|
|
128
|
+
*/
|
|
129
|
+
//# sourceMappingURL=project-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-snapshot.d.ts","sourceRoot":"","sources":["../../src/project-snapshot.js"],"names":[],"mappings":"AAMA,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AAMxD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAJxC,sBAIwC,EAAE,QAAQ,EAHlD,CAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAGlC,GAFhD,IAAI,CAOhB;AAED;;GAEG;AACH,qBAAa,eAAe;IAMnB,IAAI;IACJ,YAAY;IACZ,SAAS;IACT,OAAO;YAuVF,MAAM;kBACN,OAAO,qBAAqB,EAAE,gBAAgB;cAC9C,MAAM;gBACN,MAAM;;IAlWlB;;;OAGG;IACH,YAAY,KAAK,EAFN;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,cAAc,EAAE,CAAA;KAE3E,EAMhB;CACF;AAED;;GAEG;AACH,qBAAa,sBAAsB;IACjC;;;;OAIG;IACG,KAAK,CAAC,OAAO,EAHR,kBAGQ,GAFN,OAAO,CAAC,eAAe,CAAC,CAmDpC;CACF;AAsRE,YAAS,cAAc,GACvB;;;;IAAmB,EAAE,EAAV,MAAM,CACjB;;;;IAA2D,QAAQ,EAAxD,OAAO,qBAAqB,EAAE,gBAAgB,CACzD;;;;IAAmB,IAAI,EAAZ,MAAM,CACjB;;;;IAAmB,MAAM,EAAd,MAAM,CACnB;CAAA,CAAA;AAGE,YAAS,gBAAgB,GACzB;;;;IAAmB,aAAa,EAArB,MAAM,CACjB;;;;IAAmB,gBAAgB,EAAxB,MAAM,CACjB;;;;IAAmB,aAAa,EAArB,MAAM,CACjB;;;;IAAqB,WAAW,EAArB,MAAM,EAAE,CACnB;;;;IAAqB,gBAAgB,EAA1B,MAAM,EAAE,CACnB;;;;IAAqB,YAAY,EAAtB,MAAM,EAAE,CACrB;CAAA,CAAA;AAGE,YAAS,cAAc,GACvB;;;;IAAmB,KAAK,EAAb,MAAM,CACjB;;;;IAAmB,QAAQ,EAAhB,MAAM,CACjB;;;;IAAmB,KAAK,EAAb,MAAM,CACnB;CAAA,CAAA;AAvBD;;;;;;GAMG;AAEH;;;;;;;;GAQG;AAEH;;;;;GAKG"}
|