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,280 @@
1
+ // @ts-check
2
+ import { diagnosticRecord, formatHumanProjectFailure, normalizeDiagnostic } from "./project-reporter.js";
3
+ /**
4
+ * Emits long-lived watch state with one terminal record for every admitted cycle and one for the watcher.
5
+ */
6
+ export class ProjectWatchReporter {
7
+ /** @type {"human" | "ndjson"} */
8
+ #format;
9
+ /** @type {import("./project-reporter.js").WritableOutput} */
10
+ #stdout;
11
+ /** @type {import("./project-reporter.js").WritableOutput} */
12
+ #stderr;
13
+ /** @type {() => number} */
14
+ #now;
15
+ /** @type {string | null} */
16
+ #projectId = null;
17
+ /** @type {string | null} */
18
+ #snapshotHash = null;
19
+ /** @type {number | null} */
20
+ #cycle = null;
21
+ /** @type {readonly string[]} */
22
+ #changedPaths = Object.freeze([]);
23
+ #cycleStartedAt = 0;
24
+ #watchTerminal = false;
25
+ #cycleTerminal = true;
26
+ /**
27
+ * Creates a watch reporter.
28
+ * @param {{format?: "human" | "ndjson", now?: () => number, stderr?: import("./project-reporter.js").WritableOutput, stdout?: import("./project-reporter.js").WritableOutput}} [options] - Output mode, clock, and sinks.
29
+ */
30
+ constructor(options = {}) {
31
+ const format = options.format ?? "human";
32
+ if (format != "human" && format != "ndjson" || options.now !== undefined && typeof options.now != "function") {
33
+ throw new TypeError("Invalid project watch reporter options.");
34
+ }
35
+ this.#format = format;
36
+ this.#stdout = options.stdout ?? process.stdout;
37
+ this.#stderr = options.stderr ?? process.stderr;
38
+ this.#now = options.now ?? (() => performance.now());
39
+ if (typeof this.#stdout?.write != "function" || typeof this.#stderr?.write != "function") {
40
+ throw new TypeError("Project watch reporter requires writable output sinks.");
41
+ }
42
+ }
43
+ /**
44
+ * Reports validated watch startup.
45
+ * @param {string} projectId - Stable initial project identity.
46
+ * @returns {void}
47
+ */
48
+ watchStarted(projectId) {
49
+ this.#projectId = projectId;
50
+ this.#emit({ state: "watch-started" });
51
+ }
52
+ /**
53
+ * Reports the selected event backend.
54
+ * @param {"native" | "polling"} backend - Active event backend.
55
+ * @returns {void}
56
+ */
57
+ watchBackend(backend) {
58
+ this.#emit({ backend, state: "watch-backend" });
59
+ }
60
+ /**
61
+ * Begins one admitted build cycle.
62
+ * @param {ProjectWatchCycleContext} cycle - Cycle context.
63
+ * @returns {void}
64
+ */
65
+ cycleStarted(cycle) {
66
+ if (!this.#cycleTerminal || this.#watchTerminal)
67
+ throw new TypeError("Project watch reporter cycle lifecycle is invalid.");
68
+ this.#cycle = cycle.cycle;
69
+ this.#cycleTerminal = false;
70
+ this.#changedPaths = Object.freeze([...cycle.changedPaths]);
71
+ this.#projectId = cycle.projectId;
72
+ this.#snapshotHash = cycle.snapshotHash ?? null;
73
+ this.#cycleStartedAt = this.#now();
74
+ this.#emit({ changedPaths: this.#changedPaths, ...(cycle.snapshotHash === undefined ? {} : { snapshotHash: cycle.snapshotHash }), state: "cycle-started" });
75
+ }
76
+ /**
77
+ * Reports the cycle's validated project identity.
78
+ * @param {string} projectId - Validated project identity.
79
+ * @returns {void}
80
+ */
81
+ projectLoaded(projectId) {
82
+ this.#projectId = projectId;
83
+ this.#emit({ state: "project-loaded" });
84
+ }
85
+ /**
86
+ * Reports the cycle's complete source snapshot.
87
+ * @param {string} snapshotHash - Complete source snapshot hash.
88
+ * @returns {void}
89
+ */
90
+ snapshotLoaded(snapshotHash) {
91
+ this.#snapshotHash = snapshotHash;
92
+ this.#emit({ snapshotHash, state: "snapshot-loaded" });
93
+ }
94
+ /**
95
+ * Reports one generated target.
96
+ * @param {import("./project-build.js").ProjectBuildTargetResult} target - Generated target.
97
+ * @returns {void}
98
+ */
99
+ targetGenerated(target) {
100
+ this.#emit({
101
+ artifactCount: target.artifactCount,
102
+ language: target.language,
103
+ role: target.role,
104
+ state: "target-generated",
105
+ target: target.id
106
+ });
107
+ }
108
+ /**
109
+ * Reports one completed target-check stage.
110
+ * @param {{id: string, language: string, stage: import("./semantic/types.js").TargetCheckStageResult}} checked - Check stage.
111
+ * @returns {void}
112
+ */
113
+ targetChecked(checked) {
114
+ this.#emit({
115
+ argv: checked.stage.argv,
116
+ durationMs: checked.stage.durationMs,
117
+ exitCode: checked.stage.exitCode,
118
+ language: checked.language,
119
+ signal: checked.stage.signal,
120
+ stage: checked.stage.stage,
121
+ state: "target-checked",
122
+ stderr: checked.stage.stderr,
123
+ stdout: checked.stage.stdout,
124
+ target: checked.id,
125
+ tool: checked.stage.tool
126
+ });
127
+ }
128
+ /**
129
+ * Emits one successful or recovered cycle terminal.
130
+ * @param {import("./project-build.js").ProjectBuildSuccess} result - Published result.
131
+ * @param {boolean} recovered - Whether the prior ordinary cycle failed.
132
+ * @returns {void}
133
+ */
134
+ cycleSucceeded(result, recovered) {
135
+ this.#requireCycle();
136
+ this.#cycleTerminal = true;
137
+ this.#snapshotHash = result.snapshotHash;
138
+ const state = recovered ? "cycle-recovered" : "cycle-succeeded";
139
+ if (this.#format == "human") {
140
+ const verb = recovered ? "recovered" : "succeeded";
141
+ this.#stdout.write(`Watch cycle ${this.#cycle} ${verb}: project '${result.projectId}' published generation '${result.generationId}'.\n`);
142
+ return;
143
+ }
144
+ this.#write({
145
+ changedPaths: this.#changedPaths,
146
+ checked: result.checked,
147
+ durationMs: this.#duration(),
148
+ generationId: result.generationId,
149
+ snapshotHash: result.snapshotHash,
150
+ state,
151
+ targets: result.targets.map(target => ({ id: target.id, language: target.language, role: target.role })),
152
+ terminal: true,
153
+ terminalScope: "cycle"
154
+ });
155
+ }
156
+ /**
157
+ * Emits one failed, cancelled, or superseded cycle terminal.
158
+ * @param {unknown} failure - Preserved cycle failure.
159
+ * @param {"cancelled" | "failed" | "superseded"} status - Terminal classification.
160
+ * @returns {void}
161
+ */
162
+ cycleFailed(failure, status) {
163
+ this.#requireCycle();
164
+ this.#cycleTerminal = true;
165
+ const diagnostic = normalizeDiagnostic(failure);
166
+ if (this.#format == "human") {
167
+ this.#stderr.write(formatHumanProjectFailure(diagnostic, `Watch cycle ${this.#cycle} ${status}`));
168
+ return;
169
+ }
170
+ this.#write({
171
+ changedPaths: this.#changedPaths,
172
+ diagnostic: diagnosticRecord(diagnostic),
173
+ durationMs: this.#duration(),
174
+ ...(this.#snapshotHash === null ? {} : { snapshotHash: this.#snapshotHash }),
175
+ state: `cycle-${status}`,
176
+ terminal: true,
177
+ terminalScope: "cycle"
178
+ });
179
+ }
180
+ /**
181
+ * Reports reconciliation whose complete content hash did not change.
182
+ * @param {readonly string[]} changedPaths - Coalesced hint paths.
183
+ * @returns {void}
184
+ */
185
+ unchanged(changedPaths) {
186
+ this.#emit({ changedPaths, state: "reconciled-unchanged" });
187
+ }
188
+ /**
189
+ * Reports the first filesystem hint admitted while the current cycle remains active.
190
+ * @returns {void}
191
+ */
192
+ cycleDirty() {
193
+ this.#requireCycle();
194
+ this.#emit({ state: "cycle-dirty" });
195
+ }
196
+ /**
197
+ * Emits the sole clean watcher terminal.
198
+ * @param {string} reason - Shutdown reason.
199
+ * @returns {void}
200
+ */
201
+ watchStopped(reason) {
202
+ this.#requireWatchTerminal();
203
+ this.#watchTerminal = true;
204
+ if (this.#format == "human") {
205
+ this.#stdout.write(`Watch stopped: ${reason}\n`);
206
+ return;
207
+ }
208
+ this.#write({ reason, state: "watch-stopped", terminal: true, terminalScope: "watch" });
209
+ }
210
+ /**
211
+ * Emits the sole startup/configuration watcher terminal.
212
+ * @param {unknown} failure - Startup/configuration failure.
213
+ * @returns {void}
214
+ */
215
+ watchFailed(failure) {
216
+ this.#requireWatchTerminal();
217
+ this.#watchTerminal = true;
218
+ const diagnostic = normalizeDiagnostic(failure);
219
+ if (this.#format == "human") {
220
+ this.#stderr.write(formatHumanProjectFailure(diagnostic, "Watch failed"));
221
+ return;
222
+ }
223
+ this.#write({ diagnostic: diagnosticRecord(diagnostic), state: "watch-failed", terminal: true, terminalScope: "watch" });
224
+ }
225
+ /**
226
+ * Computes a stable non-negative cycle duration.
227
+ * @returns {number} Cycle duration.
228
+ */
229
+ #duration() {
230
+ const value = this.#now() - this.#cycleStartedAt;
231
+ return Number.isFinite(value) && value >= 0 ? value : 0;
232
+ }
233
+ /**
234
+ * Emits a non-terminal machine state when selected.
235
+ * @param {Record<string, unknown>} fields - State fields.
236
+ * @returns {void}
237
+ */
238
+ #emit(fields) {
239
+ if (this.#format == "ndjson")
240
+ this.#write(fields);
241
+ }
242
+ /**
243
+ * Writes one complete NDJSON record.
244
+ * @param {Record<string, unknown>} fields - Protocol fields.
245
+ * @returns {void}
246
+ */
247
+ #write(fields) {
248
+ this.#stdout.write(`${JSON.stringify({
249
+ cycle: this.#cycle,
250
+ project: this.#projectId,
251
+ schema: "SemantifoldWatchEvent",
252
+ version: 1,
253
+ ...fields
254
+ })}\n`);
255
+ }
256
+ /**
257
+ * Requires one open cycle terminal slot.
258
+ * @returns {void}
259
+ */
260
+ #requireCycle() {
261
+ if (this.#cycleTerminal || this.#watchTerminal)
262
+ throw new TypeError("Project watch reporter has no open cycle.");
263
+ }
264
+ /**
265
+ * Requires one open watcher terminal slot.
266
+ * @returns {void}
267
+ */
268
+ #requireWatchTerminal() {
269
+ if (this.#watchTerminal || !this.#cycleTerminal)
270
+ throw new TypeError("Project watch reporter watcher lifecycle is invalid.");
271
+ }
272
+ }
273
+ /**
274
+ * @typedef ProjectWatchCycleContext
275
+ * @property {readonly string[]} changedPaths - Stable changed paths.
276
+ * @property {number} cycle - One-based cycle number.
277
+ * @property {string} projectId - Stable project identity.
278
+ * @property {string} [snapshotHash] - Complete snapshot hash when reconciliation succeeded.
279
+ */
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC13YXRjaC1yZXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LXdhdGNoLXJlcG9ydGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUV0Rzs7R0FFRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsaUNBQWlDO0lBQ2pDLE9BQU8sQ0FBQTtJQUNQLDZEQUE2RDtJQUM3RCxPQUFPLENBQUE7SUFDUCw2REFBNkQ7SUFDN0QsT0FBTyxDQUFBO0lBQ1AsMkJBQTJCO0lBQzNCLElBQUksQ0FBQTtJQUNKLDRCQUE0QjtJQUM1QixVQUFVLEdBQUcsSUFBSSxDQUFBO0lBQ2pCLDRCQUE0QjtJQUM1QixhQUFhLEdBQUcsSUFBSSxDQUFBO0lBQ3BCLDRCQUE0QjtJQUM1QixNQUFNLEdBQUcsSUFBSSxDQUFBO0lBQ2IsZ0NBQWdDO0lBQ2hDLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2pDLGVBQWUsR0FBRyxDQUFDLENBQUE7SUFDbkIsY0FBYyxHQUFHLEtBQUssQ0FBQTtJQUN0QixjQUFjLEdBQUcsSUFBSSxDQUFBO0lBRXJCOzs7T0FHRztJQUNILFlBQVksT0FBTyxHQUFHLEVBQUU7UUFDdEIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUE7UUFFeEMsSUFBSSxNQUFNLElBQUksT0FBTyxJQUFJLE1BQU0sSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzdHLE1BQU0sSUFBSSxTQUFTLENBQUMseUNBQXlDLENBQUMsQ0FBQTtRQUNoRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9B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SUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3hCLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsT0FBTyxFQUFFLENBQUM7WUFDVixHQUFHLE1BQU07U0FDVixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ1QsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDJDQUEyQyxDQUFDLENBQUE7SUFDbEgsQ0FBQztJQUVEOzs7T0FHRztJQUNILHFCQUFxQjtRQUNuQixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUMsQ0FBQTtJQUM5SCxDQUFDO0NBQ0Y7QUFFRDs7Ozs7O0dBTUciLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWFnbm9zdGljUmVjb3JkLCBmb3JtYXRIdW1hblByb2plY3RGYWlsdXJlLCBub3JtYWxpemVEaWFnbm9zdGljfSBmcm9tIFwiLi9wcm9qZWN0LXJlcG9ydGVyLmpzXCJcblxuLyoqXG4gKiBFbWl0cyBsb25nLWxpdmVkIHdhdGNoIHN0YXRlIHdpdGggb25lIHRlcm1pbmFsIHJlY29yZCBmb3IgZXZlcnkgYWRtaXR0ZWQgY3ljbGUgYW5kIG9uZSBmb3IgdGhlIHdhdGNoZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9qZWN0V2F0Y2hSZXBvcnRlciB7XG4gIC8qKiBAdHlwZSB7XCJodW1hblwiIHwgXCJuZGpzb25cIn0gKi9cbiAgI2Zvcm1hdFxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vcHJvamVjdC1yZXBvcnRlci5qc1wiKS5Xcml0YWJsZU91dHB1dH0gKi9cbiAgI3N0ZG91dFxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vcHJvamVjdC1yZXBvcnRlci5qc1wiKS5Xcml0YWJsZU91dHB1dH0gKi9cbiAgI3N0ZGVyclxuICAvKiogQHR5cGUgeygpID0+IG51bWJlcn0gKi9cbiAgI25vd1xuICAvKiogQHR5cGUge3N0cmluZyB8IG51bGx9ICovXG4gICNwcm9qZWN0SWQgPSBudWxsXG4gIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVsbH0gKi9cbiAgI3NuYXBzaG90SGFzaCA9IG51bGxcbiAgLyoqIEB0eXBlIHtudW1iZXIgfCBudWxsfSAqL1xuICAjY3ljbGUgPSBudWxsXG4gIC8qKiBAdHlwZSB7cmVhZG9ubHkgc3RyaW5nW119ICovXG4gICNjaGFuZ2VkUGF0aHMgPSBPYmplY3QuZnJlZXplKFtdKVxuICAjY3ljbGVTdGFydGVkQXQgPSAwXG4gICN3YXRjaFRlcm1pbmFsID0gZmFsc2VcbiAgI2N5Y2xlVGVybWluYWwgPSB0cnVlXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB3YXRjaCByZXBvcnRlci5cbiAgICogQHBhcmFtIHt7Zm9ybWF0PzogXCJodW1hblwiIHwgXCJuZGpzb25cIiwgbm93PzogKCkgPT4gbnVtYmVyLCBzdGRlcnI/OiBpbXBvcnQoXCIuL3Byb2plY3QtcmVwb3J0ZXIuanNcIikuV3JpdGFibGVPdXRwdXQsIHN0ZG91dD86IGltcG9ydChcIi4vcHJvamVjdC1yZXBvcnRlci5qc1wiKS5Xcml0YWJsZU91dHB1dH19IFtvcHRpb25zXSAtIE91dHB1dCBtb2RlLCBjbG9jaywgYW5kIHNpbmtzLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQgPz8gXCJodW1hblwiXG5cbiAgICBpZiAoZm9ybWF0ICE9IFwiaHVtYW5cIiAmJiBmb3JtYXQgIT0gXCJuZGpzb25cIiB8fCBvcHRpb25zLm5vdyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLm5vdyAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHByb2plY3Qgd2F0Y2ggcmVwb3J0ZXIgb3B0aW9ucy5cIilcbiAgICB9XG4gICAgdGhpcy4jZm9ybWF0ID0gZm9ybWF0XG4gICAgdGhpcy4jc3Rkb3V0ID0gb3B0aW9ucy5zdGRvdXQgPz8gcHJvY2Vzcy5zdGRvdXRcbiAgICB0aGlzLiNzdGRlcnIgPSBvcHRpb25zLnN0ZGVyciA/PyBwcm9jZXNzLnN0ZGVyclxuICAgIHRoaXMuI25vdyA9IG9wdGlvbnMubm93ID8/ICgoKSA9PiBwZXJmb3JtYW5jZS5ub3coKSlcbiAgICBpZiAodHlwZW9mIHRoaXMuI3N0ZG91dD8ud3JpdGUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiB0aGlzLiNzdGRlcnI/LndyaXRlICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb2plY3Qgd2F0Y2ggcmVwb3J0ZXIgcmVxdWlyZXMgd3JpdGFibGUgb3V0cHV0IHNpbmtzLlwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHZhbGlkYXRlZCB3YXRjaCBzdGFydHVwLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkIC0gU3RhYmxlIGluaXRpYWwgcHJvamVjdCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB3YXRjaFN0YXJ0ZWQocHJvamVjdElkKSB7XG4gICAgdGhpcy4jcHJvamVjdElkID0gcHJvamVjdElkXG4gICAgdGhpcy4jZW1pdCh7c3RhdGU6IFwid2F0Y2gtc3RhcnRlZFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHRoZSBzZWxlY3RlZCBldmVudCBiYWNrZW5kLlxuICAgKiBAcGFyYW0ge1wibmF0aXZlXCIgfCBcInBvbGxpbmdcIn0gYmFja2VuZCAtIEFjdGl2ZSBldmVudCBiYWNrZW5kLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHdhdGNoQmFja2VuZChiYWNrZW5kKSB7XG4gICAgdGhpcy4jZW1pdCh7YmFja2VuZCwgc3RhdGU6IFwid2F0Y2gtYmFja2VuZFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbnMgb25lIGFkbWl0dGVkIGJ1aWxkIGN5Y2xlLlxuICAgKiBAcGFyYW0ge1Byb2plY3RXYXRjaEN5Y2xlQ29udGV4dH0gY3ljbGUgLSBDeWNsZSBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGN5Y2xlU3RhcnRlZChjeWNsZSkge1xuICAgIGlmICghdGhpcy4jY3ljbGVUZXJtaW5hbCB8fCB0aGlzLiN3YXRjaFRlcm1pbmFsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJvamVjdCB3YXRjaCByZXBvcnRlciBjeWNsZSBsaWZlY3ljbGUgaXMgaW52YWxpZC5cIilcbiAgICB0aGlzLiNjeWNsZSA9IGN5Y2xlLmN5Y2xlXG4gICAgdGhpcy4jY3ljbGVUZXJtaW5hbCA9IGZhbHNlXG4gICAgdGhpcy4jY2hhbmdlZFBhdGhzID0gT2JqZWN0LmZyZWV6ZShbLi4uY3ljbGUuY2hhbmdlZFBhdGhzXSlcbiAgICB0aGlzLiNwcm9qZWN0SWQgPSBjeWNsZS5wcm9qZWN0SWRcbiAgICB0aGlzLiNzbmFwc2hvdEhhc2ggPSBjeWNsZS5zbmFwc2hvdEhhc2ggPz8gbnVsbFxuICAgIHRoaXMuI2N5Y2xlU3RhcnRlZEF0ID0gdGhpcy4jbm93KClcbiAgICB0aGlzLiNlbWl0KHtjaGFuZ2VkUGF0aHM6IHRoaXMuI2NoYW5nZWRQYXRocywgLi4uKGN5Y2xlLnNuYXBzaG90SGFzaCA9PT0gdW5kZWZpbmVkID8ge30gOiB7c25hcHNob3RIYXNoOiBjeWNsZS5zbmFwc2hvdEhhc2h9KSwgc3RhdGU6IFwiY3ljbGUtc3RhcnRlZFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHRoZSBjeWNsZSdzIHZhbGlkYXRlZCBwcm9qZWN0IGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkIC0gVmFsaWRhdGVkIHByb2plY3QgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJvamVjdExvYWRlZChwcm9qZWN0SWQpIHtcbiAgICB0aGlzLiNwcm9qZWN0SWQgPSBwcm9qZWN0SWRcbiAgICB0aGlzLiNlbWl0KHtzdGF0ZTogXCJwcm9qZWN0LWxvYWRlZFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHRoZSBjeWNsZSdzIGNvbXBsZXRlIHNvdXJjZSBzbmFwc2hvdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNuYXBzaG90SGFzaCAtIENvbXBsZXRlIHNvdXJjZSBzbmFwc2hvdCBoYXNoLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNuYXBzaG90TG9hZGVkKHNuYXBzaG90SGFzaCkge1xuICAgIHRoaXMuI3NuYXBzaG90SGFzaCA9IHNuYXBzaG90SGFzaFxuICAgIHRoaXMuI2VtaXQoe3NuYXBzaG90SGFzaCwgc3RhdGU6IFwic25hcHNob3QtbG9hZGVkXCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgb25lIGdlbmVyYXRlZCB0YXJnZXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9wcm9qZWN0LWJ1aWxkLmpzXCIpLlByb2plY3RCdWlsZFRhcmdldFJlc3VsdH0gdGFyZ2V0IC0gR2VuZXJhdGVkIHRhcmdldC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB0YXJnZXRHZW5lcmF0ZWQodGFyZ2V0KSB7XG4gICAgdGhpcy4jZW1pdCh7XG4gICAgICBhcnRpZmFjdENvdW50OiB0YXJnZXQuYXJ0aWZhY3RDb3VudCxcbiAgICAgIGxhbmd1YWdlOiB0YXJnZXQubGFuZ3VhZ2UsXG4gICAgICByb2xlOiB0YXJnZXQucm9sZSxcbiAgICAgIHN0YXRlOiBcInRhcmdldC1nZW5lcmF0ZWRcIixcbiAgICAgIHRhcmdldDogdGFyZ2V0LmlkXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIG9uZSBjb21wbGV0ZWQgdGFyZ2V0LWNoZWNrIHN0YWdlLlxuICAgKiBAcGFyYW0ge3tpZDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nLCBzdGFnZTogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UYXJnZXRDaGVja1N0YWdlUmVzdWx0fX0gY2hlY2tlZCAtIENoZWNrIHN0YWdlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRhcmdldENoZWNrZWQoY2hlY2tlZCkge1xuICAgIHRoaXMuI2VtaXQoe1xuICAgICAgYXJndjogY2hlY2tlZC5zdGFnZS5hcmd2LFxuICAgICAgZHVyYXRpb25NczogY2hlY2tlZC5zdGFnZS5kdXJhdGlvbk1zLFxuICAgICAgZXhpdENvZGU6IGNoZWNrZWQuc3RhZ2UuZXhpdENvZGUsXG4gICAgICBsYW5ndWFnZTogY2hlY2tlZC5sYW5ndWFnZSxcbiAgICAgIHNpZ25hbDogY2hlY2tlZC5zdGFnZS5zaWduYWwsXG4gICAgICBzdGFnZTogY2hlY2tlZC5zdGFnZS5zdGFnZSxcbiAgICAgIHN0YXRlOiBcInRhcmdldC1jaGVja2VkXCIsXG4gICAgICBzdGRlcnI6IGNoZWNrZWQuc3RhZ2Uuc3RkZXJyLFxuICAgICAgc3Rkb3V0OiBjaGVja2VkLnN0YWdlLnN0ZG91dCxcbiAgICAgIHRhcmdldDogY2hlY2tlZC5pZCxcbiAgICAgIHRvb2w6IGNoZWNrZWQuc3RhZ2UudG9vbFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgb25lIHN1Y2Nlc3NmdWwgb3IgcmVjb3ZlcmVkIGN5Y2xlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcHJvamVjdC1idWlsZC5qc1wiKS5Qcm9qZWN0QnVpbGRTdWNjZXNzfSByZXN1bHQgLSBQdWJsaXNoZWQgcmVzdWx0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlY292ZXJlZCAtIFdoZXRoZXIgdGhlIHByaW9yIG9yZGluYXJ5IGN5Y2xlIGZhaWxlZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjeWNsZVN1Y2NlZWRlZChyZXN1bHQsIHJlY292ZXJlZCkge1xuICAgIHRoaXMuI3JlcXVpcmVDeWNsZSgpXG4gICAgdGhpcy4jY3ljbGVUZXJtaW5hbCA9IHRydWVcbiAgICB0aGlzLiNzbmFwc2hvdEhhc2ggPSByZXN1bHQuc25hcHNob3RIYXNoXG4gICAgY29uc3Qgc3RhdGUgPSByZWNvdmVyZWQgPyBcImN5Y2xlLXJlY292ZXJlZFwiIDogXCJjeWNsZS1zdWNjZWVkZWRcIlxuXG4gICAgaWYgKHRoaXMuI2Zvcm1hdCA9PSBcImh1bWFuXCIpIHtcbiAgICAgIGNvbnN0IHZlcmIgPSByZWNvdmVyZWQgPyBcInJlY292ZXJlZFwiIDogXCJzdWNjZWVkZWRcIlxuXG4gICAgICB0aGlzLiNzdGRvdXQud3JpdGUoYFdhdGNoIGN5Y2xlICR7dGhpcy4jY3ljbGV9ICR7dmVyYn06IHByb2plY3QgJyR7cmVzdWx0LnByb2plY3RJZH0nIHB1Ymxpc2hlZCBnZW5lcmF0aW9uICcke3Jlc3VsdC5nZW5lcmF0aW9uSWR9Jy5cXG5gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuI3dyaXRlKHtcbiAgICAgIGNoYW5nZWRQYXRoczogdGhpcy4jY2hhbmdlZFBhdGhzLFxuICAgICAgY2hlY2tlZDogcmVzdWx0LmNoZWNrZWQsXG4gICAgICBkdXJhdGlvbk1zOiB0aGlzLiNkdXJhdGlvbigpLFxuICAgICAgZ2VuZXJhdGlvbklkOiByZXN1bHQuZ2VuZXJhdGlvbklkLFxuICAgICAgc25hcHNob3RIYXNoOiByZXN1bHQuc25hcHNob3RIYXNoLFxuICAgICAgc3RhdGUsXG4gICAgICB0YXJnZXRzOiByZXN1bHQudGFyZ2V0cy5tYXAodGFyZ2V0ID0+ICh7aWQ6IHRhcmdldC5pZCwgbGFuZ3VhZ2U6IHRhcmdldC5sYW5ndWFnZSwgcm9sZTogdGFyZ2V0LnJvbGV9KSksXG4gICAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICAgIHRlcm1pbmFsU2NvcGU6IFwiY3ljbGVcIlxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgb25lIGZhaWxlZCwgY2FuY2VsbGVkLCBvciBzdXBlcnNlZGVkIGN5Y2xlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0ge3Vua25vd259IGZhaWx1cmUgLSBQcmVzZXJ2ZWQgY3ljbGUgZmFpbHVyZS5cbiAgICogQHBhcmFtIHtcImNhbmNlbGxlZFwiIHwgXCJmYWlsZWRcIiB8IFwic3VwZXJzZWRlZFwifSBzdGF0dXMgLSBUZXJtaW5hbCBjbGFzc2lmaWNhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjeWNsZUZhaWxlZChmYWlsdXJlLCBzdGF0dXMpIHtcbiAgICB0aGlzLiNyZXF1aXJlQ3ljbGUoKVxuICAgIHRoaXMuI2N5Y2xlVGVybWluYWwgPSB0cnVlXG4gICAgY29uc3QgZGlhZ25vc3RpYyA9IG5vcm1hbGl6ZURpYWdub3N0aWMoZmFpbHVyZSlcblxuICAgIGlmICh0aGlzLiNmb3JtYXQgPT0gXCJodW1hblwiKSB7XG4gICAgICB0aGlzLiNzdGRlcnIud3JpdGUoZm9ybWF0SHVtYW5Qcm9qZWN0RmFpbHVyZShkaWFnbm9zdGljLCBgV2F0Y2ggY3ljbGUgJHt0aGlzLiNjeWNsZX0gJHtzdGF0dXN9YCkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy4jd3JpdGUoe1xuICAgICAgY2hhbmdlZFBhdGhzOiB0aGlzLiNjaGFuZ2VkUGF0aHMsXG4gICAgICBkaWFnbm9zdGljOiBkaWFnbm9zdGljUmVjb3JkKGRpYWdub3N0aWMpLFxuICAgICAgZHVyYXRpb25NczogdGhpcy4jZHVyYXRpb24oKSxcbiAgICAgIC4uLih0aGlzLiNzbmFwc2hvdEhhc2ggPT09IG51bGwgPyB7fSA6IHtzbmFwc2hvdEhhc2g6IHRoaXMuI3NuYXBzaG90SGFzaH0pLFxuICAgICAgc3RhdGU6IGBjeWNsZS0ke3N0YXR1c31gLFxuICAgICAgdGVybWluYWw6IHRydWUsXG4gICAgICB0ZXJtaW5hbFNjb3BlOiBcImN5Y2xlXCJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgcmVjb25jaWxpYXRpb24gd2hvc2UgY29tcGxldGUgY29udGVudCBoYXNoIGRpZCBub3QgY2hhbmdlLlxuICAgKiBAcGFyYW0ge3JlYWRvbmx5IHN0cmluZ1tdfSBjaGFuZ2VkUGF0aHMgLSBDb2FsZXNjZWQgaGludCBwYXRocy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB1bmNoYW5nZWQoY2hhbmdlZFBhdGhzKSB7XG4gICAgdGhpcy4jZW1pdCh7Y2hhbmdlZFBhdGhzLCBzdGF0ZTogXCJyZWNvbmNpbGVkLXVuY2hhbmdlZFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHRoZSBmaXJzdCBmaWxlc3lzdGVtIGhpbnQgYWRtaXR0ZWQgd2hpbGUgdGhlIGN1cnJlbnQgY3ljbGUgcmVtYWlucyBhY3RpdmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY3ljbGVEaXJ0eSgpIHtcbiAgICB0aGlzLiNyZXF1aXJlQ3ljbGUoKVxuICAgIHRoaXMuI2VtaXQoe3N0YXRlOiBcImN5Y2xlLWRpcnR5XCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBzb2xlIGNsZWFuIHdhdGNoZXIgdGVybWluYWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBTaHV0ZG93biByZWFzb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgd2F0Y2hTdG9wcGVkKHJlYXNvbikge1xuICAgIHRoaXMuI3JlcXVpcmVXYXRjaFRlcm1pbmFsKClcbiAgICB0aGlzLiN3YXRjaFRlcm1pbmFsID0gdHJ1ZVxuICAgIGlmICh0aGlzLiNmb3JtYXQgPT0gXCJodW1hblwiKSB7XG4gICAgICB0aGlzLiNzdGRvdXQud3JpdGUoYFdhdGNoIHN0b3BwZWQ6ICR7cmVhc29ufVxcbmApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy4jd3JpdGUoe3JlYXNvbiwgc3RhdGU6IFwid2F0Y2gtc3RvcHBlZFwiLCB0ZXJtaW5hbDogdHJ1ZSwgdGVybWluYWxTY29wZTogXCJ3YXRjaFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgc29sZSBzdGFydHVwL2NvbmZpZ3VyYXRpb24gd2F0Y2hlciB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIHt1bmtub3dufSBmYWlsdXJlIC0gU3RhcnR1cC9jb25maWd1cmF0aW9uIGZhaWx1cmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgd2F0Y2hGYWlsZWQoZmFpbHVyZSkge1xuICAgIHRoaXMuI3JlcXVpcmVXYXRjaFRlcm1pbmFsKClcbiAgICB0aGlzLiN3YXRjaFRlcm1pbmFsID0gdHJ1ZVxuICAgIGNvbnN0IGRpYWdub3N0aWMgPSBub3JtYWxpemVEaWFnbm9zdGljKGZhaWx1cmUpXG5cbiAgICBpZiAodGhpcy4jZm9ybWF0ID09IFwiaHVtYW5cIikge1xuICAgICAgdGhpcy4jc3RkZXJyLndyaXRlKGZvcm1hdEh1bWFuUHJvamVjdEZhaWx1cmUoZGlhZ25vc3RpYywgXCJXYXRjaCBmYWlsZWRcIikpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy4jd3JpdGUoe2RpYWdub3N0aWM6IGRpYWdub3N0aWNSZWNvcmQoZGlhZ25vc3RpYyksIHN0YXRlOiBcIndhdGNoLWZhaWxlZFwiLCB0ZXJtaW5hbDogdHJ1ZSwgdGVybWluYWxTY29wZTogXCJ3YXRjaFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhIHN0YWJsZSBub24tbmVnYXRpdmUgY3ljbGUgZHVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IEN5Y2xlIGR1cmF0aW9uLlxuICAgKi9cbiAgI2R1cmF0aW9uKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jbm93KCkgLSB0aGlzLiNjeWNsZVN0YXJ0ZWRBdFxuXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMCA/IHZhbHVlIDogMFxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgbm9uLXRlcm1pbmFsIG1hY2hpbmUgc3RhdGUgd2hlbiBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gZmllbGRzIC0gU3RhdGUgZmllbGRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gICNlbWl0KGZpZWxkcykge1xuICAgIGlmICh0aGlzLiNmb3JtYXQgPT0gXCJuZGpzb25cIikgdGhpcy4jd3JpdGUoZmllbGRzKVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBvbmUgY29tcGxldGUgTkRKU09OIHJlY29yZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gZmllbGRzIC0gUHJvdG9jb2wgZmllbGRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gICN3cml0ZShmaWVsZHMpIHtcbiAgICB0aGlzLiNzdGRvdXQud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY3ljbGU6IHRoaXMuI2N5Y2xlLFxuICAgICAgcHJvamVjdDogdGhpcy4jcHJvamVjdElkLFxuICAgICAgc2NoZW1hOiBcIlNlbWFudGlmb2xkV2F0Y2hFdmVudFwiLFxuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIC4uLmZpZWxkc1xuICAgIH0pfVxcbmApXG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZXMgb25lIG9wZW4gY3ljbGUgdGVybWluYWwgc2xvdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICAjcmVxdWlyZUN5Y2xlKCkge1xuICAgIGlmICh0aGlzLiNjeWNsZVRlcm1pbmFsIHx8IHRoaXMuI3dhdGNoVGVybWluYWwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IHdhdGNoIHJlcG9ydGVyIGhhcyBubyBvcGVuIGN5Y2xlLlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVpcmVzIG9uZSBvcGVuIHdhdGNoZXIgdGVybWluYWwgc2xvdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICAjcmVxdWlyZVdhdGNoVGVybWluYWwoKSB7XG4gICAgaWYgKHRoaXMuI3dhdGNoVGVybWluYWwgfHwgIXRoaXMuI2N5Y2xlVGVybWluYWwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IHdhdGNoIHJlcG9ydGVyIHdhdGNoZXIgbGlmZWN5Y2xlIGlzIGludmFsaWQuXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBQcm9qZWN0V2F0Y2hDeWNsZUNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGNoYW5nZWRQYXRocyAtIFN0YWJsZSBjaGFuZ2VkIHBhdGhzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGN5Y2xlIC0gT25lLWJhc2VkIGN5Y2xlIG51bWJlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0SWQgLSBTdGFibGUgcHJvamVjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc25hcHNob3RIYXNoXSAtIENvbXBsZXRlIHNuYXBzaG90IGhhc2ggd2hlbiByZWNvbmNpbGlhdGlvbiBzdWNjZWVkZWQuXG4gKi9cbiJdfQ==
@@ -0,0 +1,133 @@
1
+ import { watch as watchFileSystem } from "node:fs";
2
+ import { ProjectBuilder } from "./project-build.js";
3
+ import { ProjectManifestLoader, SemantifoldProject } from "./project-manifest.js";
4
+ import { ProjectSnapshot, ProjectSnapshotBuilder } from "./project-snapshot.js";
5
+ import { ProjectWatchReporter } from "./project-watch-reporter.js";
6
+ /**
7
+ * Installs a synchronous lifecycle observer for focused coordination specs.
8
+ * This helper is intentionally not part of the package root API.
9
+ * @param {ProjectWatchCoordinator} coordinator - Coordinator instance.
10
+ * @param {(event: ProjectWatchObservation) => void} observer - Marker observer.
11
+ * @returns {void}
12
+ */
13
+ export declare function observeProjectWatch(coordinator: ProjectWatchCoordinator, observer: (event: ProjectWatchObservation) => void): void;
14
+ /**
15
+ * Creates a coordinator with one instance-owned native event backend for focused fallback specs.
16
+ * This helper is intentionally not part of the package root API.
17
+ * @param {{builder?: ProjectBuilder, manifestLoader?: ProjectManifestLoader, nativeWatch: typeof watchFileSystem, pollIntervalMs?: number, quietPeriodMs?: number, snapshotBuilder?: ProjectSnapshotBuilder, watchStateReader?: ProjectWatchStateReader}} options - Coordinator options and backends.
18
+ * @returns {ProjectWatchCoordinator} Configured coordinator.
19
+ */
20
+ export declare function createProjectWatchCoordinator(options: {
21
+ builder?: ProjectBuilder;
22
+ manifestLoader?: ProjectManifestLoader;
23
+ nativeWatch: typeof watchFileSystem;
24
+ pollIntervalMs?: number;
25
+ quietPeriodMs?: number;
26
+ snapshotBuilder?: ProjectSnapshotBuilder;
27
+ watchStateReader?: ProjectWatchStateReader;
28
+ }): ProjectWatchCoordinator;
29
+ /**
30
+ * Turns filesystem hints into serialized complete project build transactions.
31
+ */
32
+ export declare class ProjectWatchCoordinator {
33
+ #private;
34
+ /**
35
+ * Creates one idle coordinator without touching the filesystem.
36
+ * @param {{builder?: ProjectBuilder, manifestLoader?: ProjectManifestLoader, pollIntervalMs?: number, quietPeriodMs?: number, snapshotBuilder?: ProjectSnapshotBuilder}} [options] - Collaborators and bounded timing policy.
37
+ */
38
+ constructor(options?: {
39
+ builder?: ProjectBuilder;
40
+ manifestLoader?: ProjectManifestLoader;
41
+ pollIntervalMs?: number;
42
+ quietPeriodMs?: number;
43
+ snapshotBuilder?: ProjectSnapshotBuilder;
44
+ });
45
+ /**
46
+ * Starts the initial build and remains active until shutdown or startup failure.
47
+ * @param {string} [projectPath] - Project manifest path.
48
+ * @param {ProjectWatchReporter} [reporter] - Watch protocol reporter.
49
+ * @param {{check?: boolean}} [options] - Whether every cycle runs target-owned checks.
50
+ * @returns {Promise<Readonly<ProjectWatchResult>>} Terminal watcher result.
51
+ */
52
+ run(projectPath?: string, reporter?: ProjectWatchReporter, options?: {
53
+ check?: boolean;
54
+ }): Promise<Readonly<ProjectWatchResult>>;
55
+ /**
56
+ * Stops admitting work, cancels the exact active operation, and waits through child close and staging cleanup.
57
+ * @param {string} [reason] - Stable shutdown reason.
58
+ * @returns {Promise<Readonly<ProjectWatchResult>>} Terminal watcher result.
59
+ */
60
+ stop(reason?: string): Promise<Readonly<ProjectWatchResult>>;
61
+ }
62
+ export type ProjectWatchStateReader = (filenames: Readonly<Set<string>>) => Promise<Map<string, string>>;
63
+ export type ProjectWatchObservation = {
64
+ /**
65
+ * - Marker type.
66
+ */
67
+ type: "cycle-start" | "cycle-terminal" | "dirty" | "ready" | "reconciled" | "stopped" | "watch-backend";
68
+ /**
69
+ * - Related cycle number.
70
+ */
71
+ cycle?: number;
72
+ /**
73
+ * - Marker status.
74
+ */
75
+ status: "cancelled" | "dirty" | "failed" | "native" | "polling" | "ready" | "recovered" | "started" | "stopped" | "succeeded" | "superseded" | "unchanged";
76
+ };
77
+ export type ProjectWatchResult = {
78
+ /**
79
+ * - Watcher terminal state.
80
+ */
81
+ status: "failed" | "stopped";
82
+ /**
83
+ * - Admitted cycle count.
84
+ */
85
+ cycles: number;
86
+ /**
87
+ * - Stable terminal reason.
88
+ */
89
+ reason: string;
90
+ };
91
+ export type WatchCycleInput = {
92
+ /**
93
+ * - Stable changed paths.
94
+ */
95
+ changedPaths: readonly string[];
96
+ /**
97
+ * - Whether target checks are enabled.
98
+ */
99
+ check: boolean;
100
+ /**
101
+ * - Preserved reconciliation failure.
102
+ */
103
+ failure?: unknown;
104
+ /**
105
+ * - Reconciled project, when valid.
106
+ */
107
+ project: SemantifoldProject | undefined;
108
+ /**
109
+ * - Reconciled snapshot, when valid.
110
+ */
111
+ snapshot: ProjectSnapshot | undefined;
112
+ };
113
+ /**
114
+ * @typedef ProjectWatchObservation
115
+ * @property {"cycle-start" | "cycle-terminal" | "dirty" | "ready" | "reconciled" | "stopped" | "watch-backend"} type - Marker type.
116
+ * @property {number} [cycle] - Related cycle number.
117
+ * @property {"cancelled" | "dirty" | "failed" | "native" | "polling" | "ready" | "recovered" | "started" | "stopped" | "succeeded" | "superseded" | "unchanged"} status - Marker status.
118
+ */
119
+ /**
120
+ * @typedef ProjectWatchResult
121
+ * @property {"failed" | "stopped"} status - Watcher terminal state.
122
+ * @property {number} cycles - Admitted cycle count.
123
+ * @property {string} reason - Stable terminal reason.
124
+ */
125
+ /**
126
+ * @typedef WatchCycleInput
127
+ * @property {readonly string[]} changedPaths - Stable changed paths.
128
+ * @property {boolean} check - Whether target checks are enabled.
129
+ * @property {unknown} [failure] - Preserved reconciliation failure.
130
+ * @property {SemantifoldProject | undefined} project - Reconciled project, when valid.
131
+ * @property {ProjectSnapshot | undefined} snapshot - Reconciled snapshot, when valid.
132
+ */
133
+ //# sourceMappingURL=project-watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-watch.d.ts","sourceRoot":"","sources":["../../src/project-watch.js"],"names":[],"mappings":"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"}