semantifold 0.9.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.
Files changed (171) hide show
  1. package/README.md +6 -3
  2. package/bin/semantifold.js +6 -0
  3. package/build/bin/semantifold.d.ts +3 -0
  4. package/build/bin/semantifold.d.ts.map +1 -0
  5. package/build/bin/semantifold.js +5 -0
  6. package/build/index.d.ts +8 -0
  7. package/build/index.d.ts.map +1 -1
  8. package/build/index.js +9 -1
  9. package/build/src/artifact-path.d.ts +16 -0
  10. package/build/src/artifact-path.d.ts.map +1 -1
  11. package/build/src/artifact-path.js +29 -3
  12. package/build/src/backends/c-check.d.ts +7 -0
  13. package/build/src/backends/c-check.d.ts.map +1 -0
  14. package/build/src/backends/c-check.js +65 -0
  15. package/build/src/backends/check-plan.d.ts +96 -0
  16. package/build/src/backends/check-plan.d.ts.map +1 -0
  17. package/build/src/backends/check-plan.js +135 -0
  18. package/build/src/backends/cpp-check.d.ts +7 -0
  19. package/build/src/backends/cpp-check.d.ts.map +1 -0
  20. package/build/src/backends/cpp-check.js +59 -0
  21. package/build/src/backends/csharp-check.d.ts +7 -0
  22. package/build/src/backends/csharp-check.d.ts.map +1 -0
  23. package/build/src/backends/csharp-check.js +125 -0
  24. package/build/src/backends/csharp.d.ts +1 -0
  25. package/build/src/backends/csharp.d.ts.map +1 -1
  26. package/build/src/backends/csharp.js +5 -4
  27. package/build/src/backends/dart-check.d.ts +7 -0
  28. package/build/src/backends/dart-check.d.ts.map +1 -0
  29. package/build/src/backends/dart-check.js +103 -0
  30. package/build/src/backends/dart.d.ts +2 -0
  31. package/build/src/backends/dart.d.ts.map +1 -1
  32. package/build/src/backends/dart.js +5 -5
  33. package/build/src/backends/go-check.d.ts +7 -0
  34. package/build/src/backends/go-check.d.ts.map +1 -0
  35. package/build/src/backends/go-check.js +77 -0
  36. package/build/src/backends/go.d.ts +1 -0
  37. package/build/src/backends/go.d.ts.map +1 -1
  38. package/build/src/backends/go.js +3 -3
  39. package/build/src/backends/java-check.d.ts +21 -0
  40. package/build/src/backends/java-check.d.ts.map +1 -0
  41. package/build/src/backends/java-check.js +73 -0
  42. package/build/src/backends/javascript-check.d.ts +7 -0
  43. package/build/src/backends/javascript-check.d.ts.map +1 -0
  44. package/build/src/backends/javascript-check.js +29 -0
  45. package/build/src/backends/kotlin-check.d.ts +7 -0
  46. package/build/src/backends/kotlin-check.d.ts.map +1 -0
  47. package/build/src/backends/kotlin-check.js +31 -0
  48. package/build/src/backends/php-check.d.ts +7 -0
  49. package/build/src/backends/php-check.d.ts.map +1 -0
  50. package/build/src/backends/php-check.js +21 -0
  51. package/build/src/backends/program.d.ts +7 -0
  52. package/build/src/backends/program.d.ts.map +1 -1
  53. package/build/src/backends/program.js +16 -1
  54. package/build/src/backends/python-check.d.ts +7 -0
  55. package/build/src/backends/python-check.d.ts.map +1 -0
  56. package/build/src/backends/python-check.js +28 -0
  57. package/build/src/backends/ruby-check.d.ts +7 -0
  58. package/build/src/backends/ruby-check.d.ts.map +1 -0
  59. package/build/src/backends/ruby-check.js +21 -0
  60. package/build/src/backends/rust-check.d.ts +7 -0
  61. package/build/src/backends/rust-check.d.ts.map +1 -0
  62. package/build/src/backends/rust-check.js +65 -0
  63. package/build/src/backends/swift-check.d.ts +7 -0
  64. package/build/src/backends/swift-check.d.ts.map +1 -0
  65. package/build/src/backends/swift-check.js +77 -0
  66. package/build/src/backends/typescript-check.d.ts +7 -0
  67. package/build/src/backends/typescript-check.d.ts.map +1 -0
  68. package/build/src/backends/typescript-check.js +33 -0
  69. package/build/src/backends/zig-check.d.ts +7 -0
  70. package/build/src/backends/zig-check.d.ts.map +1 -0
  71. package/build/src/backends/zig-check.js +70 -0
  72. package/build/src/diagnostic.d.ts +13 -1
  73. package/build/src/diagnostic.d.ts.map +1 -1
  74. package/build/src/diagnostic.js +14 -2
  75. package/build/src/frontends/program.d.ts +6 -0
  76. package/build/src/frontends/program.d.ts.map +1 -1
  77. package/build/src/frontends/program.js +9 -1
  78. package/build/src/language-registry.d.ts +54 -0
  79. package/build/src/language-registry.d.ts.map +1 -1
  80. package/build/src/language-registry.js +107 -5
  81. package/build/src/project-build.d.ts +172 -0
  82. package/build/src/project-build.d.ts.map +1 -0
  83. package/build/src/project-build.js +320 -0
  84. package/build/src/project-cli.d.ts +40 -0
  85. package/build/src/project-cli.d.ts.map +1 -0
  86. package/build/src/project-cli.js +145 -0
  87. package/build/src/project-manifest.d.ts +148 -0
  88. package/build/src/project-manifest.d.ts.map +1 -0
  89. package/build/src/project-manifest.js +432 -0
  90. package/build/src/project-reporter.d.ts +81 -0
  91. package/build/src/project-reporter.d.ts.map +1 -0
  92. package/build/src/project-reporter.js +293 -0
  93. package/build/src/project-snapshot.d.ts +129 -0
  94. package/build/src/project-snapshot.d.ts.map +1 -0
  95. package/build/src/project-snapshot.js +362 -0
  96. package/build/src/project-watch-reporter.d.ts +125 -0
  97. package/build/src/project-watch-reporter.d.ts.map +1 -0
  98. package/build/src/project-watch-reporter.js +280 -0
  99. package/build/src/project-watch.d.ts +133 -0
  100. package/build/src/project-watch.d.ts.map +1 -0
  101. package/build/src/project-watch.js +839 -0
  102. package/build/src/publication.d.ts +69 -5
  103. package/build/src/publication.d.ts.map +1 -1
  104. package/build/src/publication.js +246 -57
  105. package/build/src/semantic/types.d.ts +303 -2
  106. package/build/src/semantic/types.d.ts.map +1 -1
  107. package/build/src/semantic/types.js +79 -2
  108. package/build/src/subprocess.d.ts +8 -0
  109. package/build/src/subprocess.d.ts.map +1 -1
  110. package/build/src/subprocess.js +50 -9
  111. package/build/src/target-check.d.ts +52 -0
  112. package/build/src/target-check.d.ts.map +1 -0
  113. package/build/src/target-check.js +796 -0
  114. package/build/src/toolchains.d.ts.map +1 -1
  115. package/build/src/toolchains.js +3 -3
  116. package/docs/architecture.md +3 -1
  117. package/docs/c.md +4 -0
  118. package/docs/cpp.md +4 -0
  119. package/docs/dart.md +4 -0
  120. package/docs/generated-artifact-publication.md +11 -8
  121. package/docs/kotlin.md +2 -2
  122. package/docs/language-support.md +29 -3
  123. package/docs/project-build-cli.md +147 -0
  124. package/docs/project-watch.md +60 -0
  125. package/docs/rust.md +4 -0
  126. package/docs/swift.md +2 -0
  127. package/docs/testing.md +70 -3
  128. package/docs/watch-build-pipeline.md +39 -23
  129. package/docs/zig.md +2 -0
  130. package/examples/jsdoc-java-watch/expected-output.txt +3 -0
  131. package/examples/jsdoc-java-watch/semantifold.json +23 -0
  132. package/examples/jsdoc-java-watch/src/main.js +21 -0
  133. package/index.js +8 -0
  134. package/package.json +6 -1
  135. package/src/artifact-path.js +31 -2
  136. package/src/backends/c-check.js +80 -0
  137. package/src/backends/check-plan.js +147 -0
  138. package/src/backends/cpp-check.js +73 -0
  139. package/src/backends/csharp-check.js +139 -0
  140. package/src/backends/csharp.js +4 -3
  141. package/src/backends/dart-check.js +117 -0
  142. package/src/backends/dart.js +4 -4
  143. package/src/backends/go-check.js +89 -0
  144. package/src/backends/go.js +2 -2
  145. package/src/backends/java-check.js +77 -0
  146. package/src/backends/javascript-check.js +33 -0
  147. package/src/backends/kotlin-check.js +41 -0
  148. package/src/backends/php-check.js +23 -0
  149. package/src/backends/program.js +17 -0
  150. package/src/backends/python-check.js +30 -0
  151. package/src/backends/ruby-check.js +23 -0
  152. package/src/backends/rust-check.js +78 -0
  153. package/src/backends/swift-check.js +89 -0
  154. package/src/backends/typescript-check.js +37 -0
  155. package/src/backends/zig-check.js +81 -0
  156. package/src/diagnostic.js +9 -1
  157. package/src/frontends/program.js +9 -0
  158. package/src/language-registry.js +113 -4
  159. package/src/project-build.js +353 -0
  160. package/src/project-cli.js +155 -0
  161. package/src/project-manifest.js +479 -0
  162. package/src/project-reporter.js +320 -0
  163. package/src/project-snapshot.js +403 -0
  164. package/src/project-watch-reporter.js +303 -0
  165. package/src/project-watch.js +870 -0
  166. package/src/publication.js +275 -58
  167. package/src/semantic/types.js +87 -1
  168. package/src/subprocess.js +49 -8
  169. package/src/target-check.js +844 -0
  170. package/src/toolchains.js +3 -2
  171. 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"}