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.
Files changed (171) hide show
  1. package/README.md +11 -5
  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 +9 -0
  7. package/build/index.d.ts.map +1 -1
  8. package/build/index.js +10 -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 +218 -0
  103. package/build/src/publication.d.ts.map +1 -0
  104. package/build/src/publication.js +1832 -0
  105. package/build/src/semantic/types.d.ts +613 -0
  106. package/build/src/semantic/types.d.ts.map +1 -1
  107. package/build/src/semantic/types.js +163 -1
  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 +98 -0
  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 +42 -26
  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 +9 -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 +2071 -0
  167. package/src/semantic/types.js +184 -0
  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,172 @@
1
+ import { ProjectManifestLoader } from "./project-manifest.js";
2
+ import { ProjectSnapshotBuilder } from "./project-snapshot.js";
3
+ import { TargetCheckRunner } from "./target-check.js";
4
+ /**
5
+ * Installs an internal synchronous orchestration observer for focused specs.
6
+ * This helper is intentionally not part of the package root API.
7
+ * @param {ProjectBuilder} builder - Project builder instance.
8
+ * @param {(operation: string) => void} observer - Ordered operation observer.
9
+ * @returns {void}
10
+ */
11
+ export declare function observeProjectBuild(builder: ProjectBuilder, observer: (operation: string) => void): void;
12
+ /**
13
+ * Runs one builder invocation with the narrow snapshot-currentness controls owned by the watch coordinator.
14
+ * This helper is intentionally not part of the package root API.
15
+ * @param {ProjectBuilder} builder - Project builder instance.
16
+ * @param {string} projectPath - Exact project manifest path.
17
+ * @param {ProjectBuildReporterLike} reporter - Watch-cycle reporter.
18
+ * @param {ProjectWatchBuildOptions} options - Checked-cycle and currentness controls.
19
+ * @returns {Promise<Readonly<ProjectBuildSuccess>>} Committed build result.
20
+ */
21
+ export declare function buildWatchedProject(builder: ProjectBuilder, projectPath: string, reporter: ProjectBuildReporterLike, options: ProjectWatchBuildOptions): Promise<Readonly<ProjectBuildSuccess>>;
22
+ /**
23
+ * Orchestrates one complete immutable project build and one transactional publication.
24
+ */
25
+ export declare class ProjectBuilder {
26
+ #private;
27
+ /**
28
+ * Creates a one-shot project builder.
29
+ * @param {{checkRunner?: TargetCheckRunner, environment?: Readonly<Record<string, string | undefined>>, manifestLoader?: ProjectManifestLoader, snapshotBuilder?: ProjectSnapshotBuilder}} [options] - Lifecycle collaborators.
30
+ */
31
+ constructor(options?: {
32
+ checkRunner?: TargetCheckRunner;
33
+ environment?: Readonly<Record<string, string | undefined>>;
34
+ manifestLoader?: ProjectManifestLoader;
35
+ snapshotBuilder?: ProjectSnapshotBuilder;
36
+ });
37
+ /**
38
+ * Builds and atomically publishes one project generation.
39
+ * @param {string} [projectPath] - Project manifest path.
40
+ * @param {ProjectBuildReporterLike} [reporter] - Optional state reporter.
41
+ * @param {ProjectBuildOptions} [options] - Optional developer-check and publication lifecycle.
42
+ * @returns {Promise<Readonly<ProjectBuildSuccess>>} Committed build result.
43
+ */
44
+ build(projectPath?: string, reporter?: ProjectBuildReporterLike, options?: ProjectBuildOptions): Promise<Readonly<ProjectBuildSuccess>>;
45
+ }
46
+ export type ProjectBuildOptions = {
47
+ /**
48
+ * - Whether every target must run its developer check.
49
+ */
50
+ check?: boolean;
51
+ /**
52
+ * - Active check and publication cancellation authority.
53
+ */
54
+ signal?: AbortSignal;
55
+ /**
56
+ * - Per-check-stage deadline.
57
+ */
58
+ timeoutMs?: number;
59
+ };
60
+ export type ProjectWatchBuildOptions = {
61
+ /**
62
+ * - Whether every target must run its developer check.
63
+ */
64
+ check: boolean;
65
+ /**
66
+ * - Coordinator-reconciled complete graph hash.
67
+ */
68
+ expectedSnapshotHash: string;
69
+ /**
70
+ * - Publication-only cancellation authority.
71
+ */
72
+ publicationSignal: AbortSignal;
73
+ /**
74
+ * - Active check and publication cancellation authority.
75
+ */
76
+ signal: AbortSignal;
77
+ /**
78
+ * - Complete graph guard at the pointer boundary.
79
+ */
80
+ validateCurrentSnapshot: () => Promise<void> | void;
81
+ };
82
+ export type ProjectWatchBuildControls = {
83
+ /**
84
+ * - Coordinator-reconciled complete graph hash.
85
+ */
86
+ expectedSnapshotHash: string;
87
+ /**
88
+ * - Publication-only cancellation authority.
89
+ */
90
+ publicationSignal: AbortSignal;
91
+ /**
92
+ * - Complete graph guard at the pointer boundary.
93
+ */
94
+ validateCurrentSnapshot: () => Promise<void> | void;
95
+ };
96
+ export type ProjectBuildReporterLike = {
97
+ /**
98
+ * - Reports validated configuration.
99
+ */
100
+ projectLoaded: (projectId: string) => void;
101
+ /**
102
+ * - Reports a complete snapshot.
103
+ */
104
+ snapshotLoaded: (snapshotHash: string) => void;
105
+ /**
106
+ * - Reports generated target output.
107
+ */
108
+ targetGenerated: (target: ProjectBuildTargetResult) => void;
109
+ /**
110
+ * - Reports a successful check stage.
111
+ */
112
+ targetChecked: (checked: {
113
+ id: string;
114
+ language: string;
115
+ stage: import("./semantic/types.js").TargetCheckStageResult;
116
+ }) => void;
117
+ };
118
+ export type ProjectBuildTargetResult = {
119
+ /**
120
+ * - Generated artifact count.
121
+ */
122
+ artifactCount: number;
123
+ /**
124
+ * - Project target identity.
125
+ */
126
+ id: string;
127
+ /**
128
+ * - Backend target identity.
129
+ */
130
+ language: import("./semantic/types.js").BackendLanguage;
131
+ /**
132
+ * - Explicit target role.
133
+ */
134
+ role: import("./semantic/types.js").PublicationTargetRole;
135
+ /**
136
+ * - Successful developer-check evidence.
137
+ */
138
+ check?: Readonly<{
139
+ stages: readonly import("./semantic/types.js").TargetCheckStageResult[];
140
+ }>;
141
+ };
142
+ export type ProjectBuildSuccess = {
143
+ /**
144
+ * - Terminal success state.
145
+ */
146
+ status: "succeeded";
147
+ /**
148
+ * - Stable project identity.
149
+ */
150
+ projectId: string;
151
+ /**
152
+ * - Complete ordered input hash.
153
+ */
154
+ snapshotHash: string;
155
+ /**
156
+ * - Deterministic immutable generation identity.
157
+ */
158
+ generationId: string;
159
+ /**
160
+ * - Whether developer checks completed for every target.
161
+ */
162
+ checked: boolean;
163
+ /**
164
+ * - Ordered generated target results.
165
+ */
166
+ targets: readonly ProjectBuildTargetResult[];
167
+ /**
168
+ * - Committed publisher snapshot.
169
+ */
170
+ generation: import("./semantic/types.js").PublishedGeneration;
171
+ };
172
+ //# sourceMappingURL=project-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-build.d.ts","sourceRoot":"","sources":["../../src/project-build.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,320 @@
1
+ // @ts-check
2
+ import { randomUUID } from "node:crypto";
3
+ import { generateProgramArtifacts } from "./backends/program.js";
4
+ import { SemantifoldDiagnostic } from "./diagnostic.js";
5
+ import { parseProgramSource } from "./frontends/program.js";
6
+ import { ProjectManifestLoader } from "./project-manifest.js";
7
+ import { ProjectSnapshotBuilder } from "./project-snapshot.js";
8
+ import { GeneratedArtifactPublisher, guardNextPublicationCommit } from "./publication.js";
9
+ import { languageRegistry } from "./language-registry.js";
10
+ import { createTargetCheckPlan, TargetCheckRunner } from "./target-check.js";
11
+ import { canonicalToolchains, discoverCanonicalToolchain } from "./toolchains.js";
12
+ /** @type {WeakMap<ProjectBuilder, (operation: string) => void>} */
13
+ const projectBuildObservers = new WeakMap();
14
+ /** @type {WeakMap<ProjectBuilder, ProjectWatchBuildControls[]>} */
15
+ const projectWatchBuildControls = new WeakMap();
16
+ /**
17
+ * Installs an internal synchronous orchestration observer for focused specs.
18
+ * This helper is intentionally not part of the package root API.
19
+ * @param {ProjectBuilder} builder - Project builder instance.
20
+ * @param {(operation: string) => void} observer - Ordered operation observer.
21
+ * @returns {void}
22
+ */
23
+ export function observeProjectBuild(builder, observer) {
24
+ if (!(builder instanceof ProjectBuilder) || typeof observer != "function") {
25
+ throw new TypeError("Invalid project build observer.");
26
+ }
27
+ projectBuildObservers.set(builder, observer);
28
+ }
29
+ /**
30
+ * Runs one builder invocation with the narrow snapshot-currentness controls owned by the watch coordinator.
31
+ * This helper is intentionally not part of the package root API.
32
+ * @param {ProjectBuilder} builder - Project builder instance.
33
+ * @param {string} projectPath - Exact project manifest path.
34
+ * @param {ProjectBuildReporterLike} reporter - Watch-cycle reporter.
35
+ * @param {ProjectWatchBuildOptions} options - Checked-cycle and currentness controls.
36
+ * @returns {Promise<Readonly<ProjectBuildSuccess>>} Committed build result.
37
+ */
38
+ export function buildWatchedProject(builder, projectPath, reporter, options) {
39
+ if (!(builder instanceof ProjectBuilder) || typeof projectPath != "string" || projectPath.length == 0 ||
40
+ !isPlainObject(options) || Object.keys(options).some(key => !["check", "expectedSnapshotHash", "publicationSignal", "signal", "validateCurrentSnapshot"].includes(key)) ||
41
+ typeof options.check != "boolean" || typeof options.expectedSnapshotHash != "string" ||
42
+ !/^[a-f0-9]{64}$/u.test(options.expectedSnapshotHash) || !(options.publicationSignal instanceof AbortSignal) ||
43
+ !(options.signal instanceof AbortSignal) || typeof options.validateCurrentSnapshot != "function") {
44
+ throw new TypeError("Invalid watched project build controls.");
45
+ }
46
+ const queued = projectWatchBuildControls.get(builder) ?? [];
47
+ queued.push({
48
+ expectedSnapshotHash: options.expectedSnapshotHash,
49
+ publicationSignal: options.publicationSignal,
50
+ validateCurrentSnapshot: options.validateCurrentSnapshot
51
+ });
52
+ projectWatchBuildControls.set(builder, queued);
53
+ return builder.build(projectPath, reporter, { check: options.check, signal: options.signal });
54
+ }
55
+ /**
56
+ * Orchestrates one complete immutable project build and one transactional publication.
57
+ */
58
+ export class ProjectBuilder {
59
+ /** @type {ProjectManifestLoader} */
60
+ #manifestLoader;
61
+ /** @type {ProjectSnapshotBuilder} */
62
+ #snapshotBuilder;
63
+ /** @type {TargetCheckRunner} */
64
+ #checkRunner;
65
+ /** @type {Readonly<Record<string, string | undefined>> | undefined} */
66
+ #environment;
67
+ /**
68
+ * Creates a one-shot project builder.
69
+ * @param {{checkRunner?: TargetCheckRunner, environment?: Readonly<Record<string, string | undefined>>, manifestLoader?: ProjectManifestLoader, snapshotBuilder?: ProjectSnapshotBuilder}} [options] - Lifecycle collaborators.
70
+ */
71
+ constructor(options = {}) {
72
+ if (options.checkRunner !== undefined && !(options.checkRunner instanceof TargetCheckRunner)) {
73
+ throw new TypeError("Project builder check runner must be a TargetCheckRunner.");
74
+ }
75
+ this.#manifestLoader = options.manifestLoader ?? new ProjectManifestLoader();
76
+ this.#snapshotBuilder = options.snapshotBuilder ?? new ProjectSnapshotBuilder();
77
+ this.#checkRunner = options.checkRunner ?? new TargetCheckRunner();
78
+ this.#environment = options.environment === undefined ? undefined : snapshotEnvironment(options.environment);
79
+ }
80
+ /**
81
+ * Builds and atomically publishes one project generation.
82
+ * @param {string} [projectPath] - Project manifest path.
83
+ * @param {ProjectBuildReporterLike} [reporter] - Optional state reporter.
84
+ * @param {ProjectBuildOptions} [options] - Optional developer-check and publication lifecycle.
85
+ * @returns {Promise<Readonly<ProjectBuildSuccess>>} Committed build result.
86
+ */
87
+ async build(projectPath = "./semantifold.json", reporter, options = {}) {
88
+ const queuedWatchControls = projectWatchBuildControls.get(this);
89
+ const watchControls = queuedWatchControls?.shift();
90
+ if (queuedWatchControls?.length == 0)
91
+ projectWatchBuildControls.delete(this);
92
+ if (typeof options != "object" || options == null || Array.isArray(options) || Object.getPrototypeOf(options) != Object.prototype ||
93
+ Object.keys(options).some(key => !["check", "signal", "timeoutMs"].includes(key)) ||
94
+ options.check !== undefined && typeof options.check != "boolean" ||
95
+ options.signal !== undefined && !(options.signal instanceof AbortSignal) ||
96
+ options.timeoutMs !== undefined && (typeof options.timeoutMs != "number" || !Number.isInteger(options.timeoutMs))) {
97
+ throw new SemantifoldDiagnostic({
98
+ code: "INVALID_PROJECT_BUILD",
99
+ language: "project",
100
+ message: "Project build options require valid check, snapshot-currentness, cancellation, and timeout controls."
101
+ });
102
+ }
103
+ const check = options.check === true;
104
+ const signal = options.signal;
105
+ const project = await this.#manifestLoader.load(projectPath);
106
+ reporter?.projectLoaded(project.id);
107
+ const snapshot = await this.#snapshotBuilder.build(project);
108
+ if (watchControls !== undefined && snapshot.hash != watchControls.expectedSnapshotHash) {
109
+ throw new SemantifoldDiagnostic({
110
+ code: "WATCH_SNAPSHOT_CHANGED",
111
+ language: project.id,
112
+ message: "The complete project snapshot changed before its watch cycle began."
113
+ });
114
+ }
115
+ reporter?.snapshotLoaded(snapshot.hash);
116
+ projectBuildObservers.get(this)?.("snapshot");
117
+ const program = parseProgramSource({
118
+ entryModule: project.entryModule,
119
+ sources: snapshot.sources.map(source => ({
120
+ filename: source.path,
121
+ id: source.id,
122
+ language: source.language,
123
+ source: source.source
124
+ }))
125
+ });
126
+ projectBuildObservers.get(this)?.("parse");
127
+ /** @type {import("./semantic/types.js").PublicationTargetInput[]} */
128
+ const publicationTargets = [];
129
+ /** @type {ProjectBuildTargetResult[]} */
130
+ const targetResults = [];
131
+ /** @type {Map<string, import("./semantic/types.js").TargetCheckResult>} */
132
+ const checkResults = new Map();
133
+ for (const target of project.targets) {
134
+ if (target.role == "binary") {
135
+ throw new SemantifoldDiagnostic({
136
+ code: "UNSUPPORTED_PROJECT_TARGET",
137
+ language: target.language,
138
+ message: "Complete semantic programs do not support binary project generation."
139
+ });
140
+ }
141
+ const artifactSet = generateProgramArtifacts({
142
+ language: target.language,
143
+ program,
144
+ role: target.role
145
+ });
146
+ const checkCapability = languageRegistry.record(target.language).check;
147
+ if (check && !checkCapability.supported) {
148
+ throw new SemantifoldDiagnostic({
149
+ code: "UNSUPPORTED_TARGET_CHECK",
150
+ language: target.language,
151
+ message: `Project target '${target.id}' does not provide a developer check plan.`
152
+ });
153
+ }
154
+ /**
155
+ * Ordered candidate validators when checking is enabled.
156
+ * @type {import("./semantic/types.js").PublicationValidator[] | undefined}
157
+ */
158
+ const validators = check ? [async ({ buildPath, sourcePath, targetId }) => {
159
+ /** @type {import("./semantic/types.js").DiscoveredToolchain[]} */
160
+ const tools = [];
161
+ for (const toolchain of checkCapability.toolchains) {
162
+ tools.push(await discoverCanonicalToolchain(/** @type {keyof typeof canonicalToolchains} */ (toolchain), {
163
+ ...(this.#environment === undefined ? {} : { environment: this.#environment })
164
+ }));
165
+ }
166
+ const plan = createTargetCheckPlan({
167
+ artifacts: artifactSet,
168
+ buildPath,
169
+ projectId: project.id,
170
+ sourcePath,
171
+ targetId,
172
+ tools: Object.freeze(tools)
173
+ });
174
+ const result = await this.#checkRunner.run(plan, {
175
+ onStage: stage => {
176
+ reporter?.targetChecked({ id: target.id, language: target.language, stage });
177
+ projectBuildObservers.get(this)?.(`check:${target.id}:${stage.stage}`);
178
+ },
179
+ ...(signal === undefined ? {} : { signal }),
180
+ ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs })
181
+ });
182
+ checkResults.set(target.id, result);
183
+ return [...result.outputs];
184
+ }] : undefined;
185
+ publicationTargets.push({
186
+ artifactSet,
187
+ buildProjection: target.buildProjection,
188
+ id: target.id,
189
+ role: target.role,
190
+ sourceProjection: target.sourceProjection,
191
+ ...(validators === undefined ? {} : { validators })
192
+ });
193
+ targetResults.push(Object.freeze({
194
+ artifactCount: artifactSet.artifacts.length,
195
+ id: target.id,
196
+ language: target.language,
197
+ role: target.role
198
+ }));
199
+ reporter?.targetGenerated(targetResults[targetResults.length - 1]);
200
+ projectBuildObservers.get(this)?.(`target:${target.id}`);
201
+ }
202
+ const publisher = new GeneratedArtifactPublisher({
203
+ projectId: project.id,
204
+ projectRoot: project.projectRoot,
205
+ publicationRoot: project.publicationRoot,
206
+ sourceFiles: project.sources.map(({ absolutePath }) => absolutePath)
207
+ });
208
+ const generationId = check
209
+ ? `g-${snapshot.hash}-checked-${randomUUID()}`
210
+ : `g-${snapshot.hash}`;
211
+ if (watchControls !== undefined) {
212
+ guardNextPublicationCommit(publisher, watchControls.validateCurrentSnapshot);
213
+ }
214
+ const publicationSignal = signal === undefined
215
+ ? watchControls?.publicationSignal
216
+ : watchControls === undefined
217
+ ? signal
218
+ : AbortSignal.any([signal, watchControls.publicationSignal]);
219
+ const generation = await publisher.publish({ generationId, targets: publicationTargets }, {
220
+ ...(publicationSignal === undefined ? {} : { signal: publicationSignal })
221
+ });
222
+ projectBuildObservers.get(this)?.("publish");
223
+ return Object.freeze({
224
+ generation,
225
+ generationId,
226
+ checked: check,
227
+ projectId: project.id,
228
+ snapshotHash: snapshot.hash,
229
+ status: /** @type {const} */ ("succeeded"),
230
+ targets: Object.freeze(targetResults.map(target => {
231
+ const result = checkResults.get(target.id);
232
+ return Object.freeze({
233
+ ...target,
234
+ ...(result === undefined ? {} : { check: Object.freeze({ stages: result.stages }) })
235
+ });
236
+ }))
237
+ });
238
+ }
239
+ }
240
+ /**
241
+ * @typedef ProjectBuildOptions
242
+ * @property {boolean} [check] - Whether every target must run its developer check.
243
+ * @property {AbortSignal} [signal] - Active check and publication cancellation authority.
244
+ * @property {number} [timeoutMs] - Per-check-stage deadline.
245
+ */
246
+ /**
247
+ * @typedef ProjectWatchBuildOptions
248
+ * @property {boolean} check - Whether every target must run its developer check.
249
+ * @property {string} expectedSnapshotHash - Coordinator-reconciled complete graph hash.
250
+ * @property {AbortSignal} publicationSignal - Publication-only cancellation authority.
251
+ * @property {AbortSignal} signal - Active check and publication cancellation authority.
252
+ * @property {() => Promise<void> | void} validateCurrentSnapshot - Complete graph guard at the pointer boundary.
253
+ */
254
+ /**
255
+ * @typedef ProjectWatchBuildControls
256
+ * @property {string} expectedSnapshotHash - Coordinator-reconciled complete graph hash.
257
+ * @property {AbortSignal} publicationSignal - Publication-only cancellation authority.
258
+ * @property {() => Promise<void> | void} validateCurrentSnapshot - Complete graph guard at the pointer boundary.
259
+ */
260
+ /**
261
+ * @typedef ProjectBuildReporterLike
262
+ * @property {(projectId: string) => void} projectLoaded - Reports validated configuration.
263
+ * @property {(snapshotHash: string) => void} snapshotLoaded - Reports a complete snapshot.
264
+ * @property {(target: ProjectBuildTargetResult) => void} targetGenerated - Reports generated target output.
265
+ * @property {(checked: {id: string, language: string, stage: import("./semantic/types.js").TargetCheckStageResult}) => void} targetChecked - Reports a successful check stage.
266
+ */
267
+ /**
268
+ * @typedef ProjectBuildTargetResult
269
+ * @property {number} artifactCount - Generated artifact count.
270
+ * @property {string} id - Project target identity.
271
+ * @property {import("./semantic/types.js").BackendLanguage} language - Backend target identity.
272
+ * @property {import("./semantic/types.js").PublicationTargetRole} role - Explicit target role.
273
+ * @property {Readonly<{stages: readonly import("./semantic/types.js").TargetCheckStageResult[]}>} [check] - Successful developer-check evidence.
274
+ */
275
+ /**
276
+ * @typedef ProjectBuildSuccess
277
+ * @property {"succeeded"} status - Terminal success state.
278
+ * @property {string} projectId - Stable project identity.
279
+ * @property {string} snapshotHash - Complete ordered input hash.
280
+ * @property {string} generationId - Deterministic immutable generation identity.
281
+ * @property {boolean} checked - Whether developer checks completed for every target.
282
+ * @property {readonly ProjectBuildTargetResult[]} targets - Ordered generated target results.
283
+ * @property {import("./semantic/types.js").PublishedGeneration} generation - Committed publisher snapshot.
284
+ */
285
+ /**
286
+ * Detaches explicit tool discovery configuration from caller mutation.
287
+ * @param {unknown} candidate - Candidate environment.
288
+ * @returns {Readonly<Record<string, string | undefined>>} Immutable snapshot.
289
+ */
290
+ function snapshotEnvironment(candidate) {
291
+ if (typeof candidate != "object" || candidate == null || Array.isArray(candidate)) {
292
+ throw new TypeError("Project builder environment must be a plain string record.");
293
+ }
294
+ const prototype = Object.getPrototypeOf(candidate);
295
+ if (prototype !== Object.prototype && prototype !== null) {
296
+ throw new TypeError("Project builder environment must be a plain string record.");
297
+ }
298
+ /** @type {Record<string, string | undefined>} */
299
+ const snapshot = Object.create(null);
300
+ for (const key of Reflect.ownKeys(candidate)) {
301
+ if (typeof key != "string")
302
+ throw new TypeError("Project builder environment must use string keys.");
303
+ const descriptor = Object.getOwnPropertyDescriptor(candidate, key);
304
+ if (descriptor == undefined || !descriptor.enumerable || !("value" in descriptor) ||
305
+ descriptor.value !== undefined && typeof descriptor.value != "string") {
306
+ throw new TypeError("Project builder environment must contain string or undefined data values.");
307
+ }
308
+ snapshot[key] = descriptor.value;
309
+ }
310
+ return Object.freeze(snapshot);
311
+ }
312
+ /**
313
+ * Checks for an ordinary object-prototype record.
314
+ * @param {unknown} value - Candidate value.
315
+ * @returns {value is Record<string, unknown>} Whether the value is a plain object.
316
+ */
317
+ function isPlainObject(value) {
318
+ return typeof value == "object" && value != null && !Array.isArray(value) && Object.getPrototypeOf(value) == Object.prototype;
319
+ }
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1idWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LWJ1aWxkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3RDLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHVCQUF1QixDQUFBO0FBQzlELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQ3pELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFBO0FBQzNELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHVCQUF1QixDQUFBO0FBQzVELE9BQU8sRUFBQywwQkFBMEIsRUFBRSwwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQ3ZGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQ3ZELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQzFFLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBRS9FLG1FQUFtRTtBQUNuRSxNQUFNLHFCQUFxQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFDM0MsbUVBQW1FO0FBQ25FLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUUvQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFFBQVE7SUFDbkQsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLGNBQWMsQ0FBQyxJQUFJLE9BQU8sUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtJ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QUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDaEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFLO0lBQzFCLE9BQU8sT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQTtBQUMvSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7cmFuZG9tVVVJRH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCB7Z2VuZXJhdGVQcm9ncmFtQXJ0aWZhY3RzfSBmcm9tIFwiLi9iYWNrZW5kcy9wcm9ncmFtLmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7cGFyc2VQcm9ncmFtU291cmNlfSBmcm9tIFwiLi9mcm9udGVuZHMvcHJvZ3JhbS5qc1wiXG5pbXBvcnQge1Byb2plY3RNYW5pZmVzdExvYWRlcn0gZnJvbSBcIi4vcHJvamVjdC1tYW5pZmVzdC5qc1wiXG5pbXBvcnQge1Byb2plY3RTbmFwc2hvdEJ1aWxkZXJ9IGZyb20gXCIuL3Byb2plY3Qtc25hcHNob3QuanNcIlxuaW1wb3J0IHtHZW5lcmF0ZWRBcnRpZmFjdFB1Ymxpc2hlciwgZ3VhcmROZXh0UHVibGljYXRpb25Db21taXR9IGZyb20gXCIuL3B1YmxpY2F0aW9uLmpzXCJcbmltcG9ydCB7bGFuZ3VhZ2VSZWdpc3RyeX0gZnJvbSBcIi4vbGFuZ3VhZ2UtcmVnaXN0cnkuanNcIlxuaW1wb3J0IHtjcmVhdGVUYXJnZXRDaGVja1BsYW4sIFRhcmdldENoZWNrUnVubmVyfSBmcm9tIFwiLi90YXJnZXQtY2hlY2suanNcIlxuaW1wb3J0IHtjYW5vbmljYWxUb29sY2hhaW5zLCBkaXNjb3ZlckNhbm9uaWNhbFRvb2xjaGFpbn0gZnJvbSBcIi4vdG9vbGNoYWlucy5qc1wiXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxQcm9qZWN0QnVpbGRlciwgKG9wZXJhdGlvbjogc3RyaW5nKSA9PiB2b2lkPn0gKi9cbmNvbnN0IHByb2plY3RCdWlsZE9ic2VydmVycyA9IG5ldyBXZWFrTWFwKClcbi8qKiBAdHlwZSB7V2Vha01hcDxQcm9qZWN0QnVpbGRlciwgUHJvamVjdFdhdGNoQnVpbGRDb250cm9sc1tdPn0gKi9cbmNvbnN0IHByb2plY3RXYXRjaEJ1aWxkQ29udHJvbHMgPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogSW5zdGFsbHMgYW4gaW50ZXJuYWwgc3luY2hyb25vdXMgb3JjaGVzdHJhdGlvbiBvYnNlcnZlciBmb3IgZm9jdXNlZCBzcGVjcy5cbiAqIFRoaXMgaGVscGVyIGlzIGludGVudGlvbmFsbHkgbm90IHBhcnQgb2YgdGhlIHBhY2thZ2Ugcm9vdCBBUEkuXG4gKiBAcGFyYW0ge1Byb2plY3RCdWlsZGVyfSBidWlsZGVyIC0gUHJvamVjdCBidWlsZGVyIGluc3RhbmNlLlxuICogQHBhcmFtIHsob3BlcmF0aW9uOiBzdHJpbmcpID0+IHZvaWR9IG9ic2VydmVyIC0gT3JkZXJlZCBvcGVyYXRpb24gb2JzZXJ2ZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVQcm9qZWN0QnVpbGQoYnVpbGRlciwgb2JzZXJ2ZXIpIHtcbiAgaWYgKCEoYnVpbGRlciBpbnN0YW5jZW9mIFByb2plY3RCdWlsZGVyKSB8fCB0eXBlb2Ygb2JzZXJ2ZXIgIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcHJvamVjdCBidWlsZCBvYnNlcnZlci5cIilcbiAgfVxuICBwcm9qZWN0QnVpbGRPYnNlcnZlcnMuc2V0KGJ1aWxkZXIsIG9ic2VydmVyKVxufVxuXG4vKipcbiAqIFJ1bnMgb25lIGJ1aWxkZXIgaW52b2NhdGlvbiB3aXRoIHRoZSBuYXJyb3cgc25hcHNob3QtY3VycmVudG5lc3MgY29udHJvbHMgb3duZWQgYnkgdGhlIHdhdGNoIGNvb3JkaW5hdG9yLlxuICogVGhpcyBoZWxwZXIgaXMgaW50ZW50aW9uYWxseSBub3QgcGFydCBvZiB0aGUgcGFja2FnZSByb290IEFQSS5cbiAqIEBwYXJhbSB7UHJvamVjdEJ1aWxkZXJ9IGJ1aWxkZXIgLSBQcm9qZWN0IGJ1aWxkZXIgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdFBhdGggLSBFeGFjdCBwcm9qZWN0IG1hbmlmZXN0IHBhdGguXG4gKiBAcGFyYW0ge1Byb2plY3RCdWlsZFJlcG9ydGVyTGlrZX0gcmVwb3J0ZXIgLSBXYXRjaC1jeWNsZSByZXBvcnRlci5cbiAqIEBwYXJhbSB7UHJvamVjdFdhdGNoQnVpbGRPcHRpb25zfSBvcHRpb25zIC0gQ2hlY2tlZC1jeWNsZSBhbmQgY3VycmVudG5lc3MgY29udHJvbHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxQcm9qZWN0QnVpbGRTdWNjZXNzPj59IENvbW1pdHRlZCBidWlsZCByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdhdGNoZWRQcm9qZWN0KGJ1aWxkZXIsIHByb2plY3RQYXRoLCByZXBvcnRlciwgb3B0aW9ucykge1xuICBpZiAoIShidWlsZGVyIGluc3RhbmNlb2YgUHJvamVjdEJ1aWxkZXIpIHx8IHR5cGVvZiBwcm9qZWN0UGF0aCAhPSBcInN0cmluZ1wiIHx8IHByb2plY3RQYXRoLmxlbmd0aCA9PSAwIHx8XG4gICAgIWlzUGxhaW5PYmplY3Qob3B0aW9ucykgfHwgT2JqZWN0LmtleXMob3B0aW9ucykuc29tZShrZXkgPT5cbiAgICAgICFbXCJjaGVja1wiLCBcImV4cGVjdGVkU25hcHNob3RIYXNoXCIsIFwicHVibGljYXRpb25TaWduYWxcIiwgXCJzaWduYWxcIiwgXCJ2YWxpZGF0ZUN1cnJlbnRTbmFwc2hvdFwiXS5pbmNsdWRlcyhrZXkpKSB8fFxuICAgIHR5cGVvZiBvcHRpb25zLmNoZWNrICE9IFwiYm9vbGVhblwiIHx8IHR5cGVvZiBvcHRpb25zLmV4cGVjdGVkU25hcHNob3RIYXNoICE9IFwic3RyaW5nXCIgfHxcbiAgICAhL15bYS1mMC05XXs2NH0kL3UudGVzdChvcHRpb25zLmV4cGVjdGVkU25hcHNob3RIYXNoKSB8fCAhKG9wdGlvbnMucHVibGljYXRpb25TaWduYWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkgfHxcbiAgICAhKG9wdGlvbnMuc2lnbmFsIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpIHx8IHR5cGVvZiBvcHRpb25zLnZhbGlkYXRlQ3VycmVudFNuYXBzaG90ICE9IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHdhdGNoZWQgcHJvamVjdCBidWlsZCBjb250cm9scy5cIilcbiAgfVxuICBjb25zdCBxdWV1ZWQgPSBwcm9qZWN0V2F0Y2hCdWlsZENvbnRyb2xzLmdldChidWlsZGVyKSA/PyBbXVxuXG4gIHF1ZXVlZC5wdXNoKHtcbiAgICBleHBlY3RlZFNuYXBzaG90SGFzaDogb3B0aW9ucy5leHBlY3RlZFNuYXBzaG90SGFzaCxcbiAgICBwdWJsaWNhdGlvblNpZ25hbDogb3B0aW9ucy5wdWJsaWNhdGlvblNpZ25hbCxcbiAgICB2YWxpZGF0ZUN1cnJlbnRTbmFwc2hvdDogb3B0aW9ucy52YWxpZGF0ZUN1cnJlbnRTbmFwc2hvdFxuICB9KVxuICBwcm9qZWN0V2F0Y2hCdWlsZENvbnRyb2xzLnNldChidWlsZGVyLCBxdWV1ZWQpXG5cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQocHJvamVjdFBhdGgsIHJlcG9ydGVyLCB7Y2hlY2s6IG9wdGlvbnMuY2hlY2ssIHNpZ25hbDogb3B0aW9ucy5zaWduYWx9KVxufVxuXG4vKipcbiAqIE9yY2hlc3RyYXRlcyBvbmUgY29tcGxldGUgaW1tdXRhYmxlIHByb2plY3QgYnVpbGQgYW5kIG9uZSB0cmFuc2FjdGlvbmFsIHB1YmxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUHJvamVjdEJ1aWxkZXIge1xuICAvKiogQHR5cGUge1Byb2plY3RNYW5pZmVzdExvYWRlcn0gKi9cbiAgI21hbmlmZXN0TG9hZGVyXG4gIC8qKiBAdHlwZSB7UHJvamVjdFNuYXBzaG90QnVpbGRlcn0gKi9cbiAgI3NuYXBzaG90QnVpbGRlclxuICAvKiogQHR5cGUge1RhcmdldENoZWNrUnVubmVyfSAqL1xuICAjY2hlY2tSdW5uZXJcbiAgLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PiB8IHVuZGVmaW5lZH0gKi9cbiAgI2Vudmlyb25tZW50XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBvbmUtc2hvdCBwcm9qZWN0IGJ1aWxkZXIuXG4gICAqIEBwYXJhbSB7e2NoZWNrUnVubmVyPzogVGFyZ2V0Q2hlY2tSdW5uZXIsIGVudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4sIG1hbmlmZXN0TG9hZGVyPzogUHJvamVjdE1hbmlmZXN0TG9hZGVyLCBzbmFwc2hvdEJ1aWxkZXI/OiBQcm9qZWN0U25hcHNob3RCdWlsZGVyfX0gW29wdGlvbnNdIC0gTGlmZWN5Y2xlIGNvbGxhYm9yYXRvcnMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy5jaGVja1J1bm5lciAhPT0gdW5kZWZpbmVkICYmICEob3B0aW9ucy5jaGVja1J1bm5lciBpbnN0YW5jZW9mIFRhcmdldENoZWNrUnVubmVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb2plY3QgYnVpbGRlciBjaGVjayBydW5uZXIgbXVzdCBiZSBhIFRhcmdldENoZWNrUnVubmVyLlwiKVxuICAgIH1cbiAgICB0aGlzLiNtYW5pZmVzdExvYWRlciA9IG9wdGlvbnMubWFuaWZlc3RMb2FkZXIgPz8gbmV3IFByb2plY3RNYW5pZmVzdExvYWRlcigpXG4gICAgdGhpcy4jc25hcHNob3RCdWlsZGVyID0gb3B0aW9ucy5zbmFwc2hvdEJ1aWxkZXIgPz8gbmV3IFByb2plY3RTbmFwc2hvdEJ1aWxkZXIoKVxuICAgIHRoaXMuI2NoZWNrUnVubmVyID0gb3B0aW9ucy5jaGVja1J1bm5lciA/PyBuZXcgVGFyZ2V0Q2hlY2tSdW5uZXIoKVxuICAgIHRoaXMuI2Vudmlyb25tZW50ID0gb3B0aW9ucy5lbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc25hcHNob3RFbnZpcm9ubWVudChvcHRpb25zLmVudmlyb25tZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgYXRvbWljYWxseSBwdWJsaXNoZXMgb25lIHByb2plY3QgZ2VuZXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwcm9qZWN0UGF0aF0gLSBQcm9qZWN0IG1hbmlmZXN0IHBhdGguXG4gICAqIEBwYXJhbSB7UHJvamVjdEJ1aWxkUmVwb3J0ZXJMaWtlfSBbcmVwb3J0ZXJdIC0gT3B0aW9uYWwgc3RhdGUgcmVwb3J0ZXIuXG4gICAqIEBwYXJhbSB7UHJvamVjdEJ1aWxkT3B0aW9uc30gW29wdGlvbnNdIC0gT3B0aW9uYWwgZGV2ZWxvcGVyLWNoZWNrIGFuZCBwdWJsaWNhdGlvbiBsaWZlY3ljbGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlYWRvbmx5PFByb2plY3RCdWlsZFN1Y2Nlc3M+Pn0gQ29tbWl0dGVkIGJ1aWxkIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGJ1aWxkKHByb2plY3RQYXRoID0gXCIuL3NlbWFudGlmb2xkLmpzb25cIiwgcmVwb3J0ZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHF1ZXVlZFdhdGNoQ29udHJvbHMgPSBwcm9qZWN0V2F0Y2hCdWlsZENvbnRyb2xzLmdldCh0aGlzKVxuICAgIGNvbnN0IHdhdGNoQ29udHJvbHMgPSBxdWV1ZWRXYXRjaENvbnRyb2xzPy5zaGlmdCgpXG5cbiAgICBpZiAocXVldWVkV2F0Y2hDb250cm9scz8ubGVuZ3RoID09IDApIHByb2plY3RXYXRjaEJ1aWxkQ29udHJvbHMuZGVsZXRlKHRoaXMpXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zICE9IFwib2JqZWN0XCIgfHwgb3B0aW9ucyA9PSBudWxsIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9wdGlvbnMpICE9IE9iamVjdC5wcm90b3R5cGUgfHxcbiAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLnNvbWUoa2V5ID0+ICFbXCJjaGVja1wiLCBcInNpZ25hbFwiLCBcInRpbWVvdXRNc1wiXS5pbmNsdWRlcyhrZXkpKSB8fFxuICAgICAgb3B0aW9ucy5jaGVjayAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNoZWNrICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICBvcHRpb25zLnNpZ25hbCAhPT0gdW5kZWZpbmVkICYmICEob3B0aW9ucy5zaWduYWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkgfHxcbiAgICAgIG9wdGlvbnMudGltZW91dE1zICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLnRpbWVvdXRNcyAhPSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMudGltZW91dE1zKSkpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIklOVkFMSURfUFJPSkVDVF9CVUlMRFwiLFxuICAgICAgICBsYW5ndWFnZTogXCJwcm9qZWN0XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiUHJvamVjdCBidWlsZCBvcHRpb25zIHJlcXVpcmUgdmFsaWQgY2hlY2ssIHNuYXBzaG90LWN1cnJlbnRuZXNzLCBjYW5jZWxsYXRpb24sIGFuZCB0aW1lb3V0IGNvbnRyb2xzLlwiXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBjaGVjayA9IG9wdGlvbnMuY2hlY2sgPT09IHRydWVcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zLnNpZ25hbFxuICAgIGNvbnN0IHByb2plY3QgPSBhd2FpdCB0aGlzLiNtYW5pZmVzdExvYWRlci5sb2FkKHByb2plY3RQYXRoKVxuXG4gICAgcmVwb3J0ZXI/LnByb2plY3RMb2FkZWQocHJvamVjdC5pZClcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuI3NuYXBzaG90QnVpbGRlci5idWlsZChwcm9qZWN0KVxuXG4gICAgaWYgKHdhdGNoQ29udHJvbHMgIT09IHVuZGVmaW5lZCAmJiBzbmFwc2hvdC5oYXNoICE9IHdhdGNoQ29udHJvbHMuZXhwZWN0ZWRTbmFwc2hvdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIldBVENIX1NOQVBTSE9UX0NIQU5HRURcIixcbiAgICAgICAgbGFuZ3VhZ2U6IHByb2plY3QuaWQsXG4gICAgICAgIG1lc3NhZ2U6IFwiVGhlIGNvbXBsZXRlIHByb2plY3Qgc25hcHNob3QgY2hhbmdlZCBiZWZvcmUgaXRzIHdhdGNoIGN5Y2xlIGJlZ2FuLlwiXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJlcG9ydGVyPy5zbmFwc2hvdExvYWRlZChzbmFwc2hvdC5oYXNoKVxuICAgIHByb2plY3RCdWlsZE9ic2VydmVycy5nZXQodGhpcyk/LihcInNuYXBzaG90XCIpXG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhcnNlUHJvZ3JhbVNvdXJjZSh7XG4gICAgICBlbnRyeU1vZHVsZTogcHJvamVjdC5lbnRyeU1vZHVsZSxcbiAgICAgIHNvdXJjZXM6IHNuYXBzaG90LnNvdXJjZXMubWFwKHNvdXJjZSA9PiAoe1xuICAgICAgICBmaWxlbmFtZTogc291cmNlLnBhdGgsXG4gICAgICAgIGlkOiBzb3VyY2UuaWQsXG4gICAgICAgIGxhbmd1YWdlOiBzb3VyY2UubGFuZ3VhZ2UsXG4gICAgICAgIHNvdXJjZTogc291cmNlLnNvdXJjZVxuICAgICAgfSkpXG4gICAgfSlcblxuICAgIHByb2plY3RCdWlsZE9ic2VydmVycy5nZXQodGhpcyk/LihcInBhcnNlXCIpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlB1YmxpY2F0aW9uVGFyZ2V0SW5wdXRbXX0gKi9cbiAgICBjb25zdCBwdWJsaWNhdGlvblRhcmdldHMgPSBbXVxuICAgIC8qKiBAdHlwZSB7UHJvamVjdEJ1aWxkVGFyZ2V0UmVzdWx0W119ICovXG4gICAgY29uc3QgdGFyZ2V0UmVzdWx0cyA9IFtdXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlRhcmdldENoZWNrUmVzdWx0Pn0gKi9cbiAgICBjb25zdCBjaGVja1Jlc3VsdHMgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHByb2plY3QudGFyZ2V0cykge1xuICAgICAgaWYgKHRhcmdldC5yb2xlID09IFwiYmluYXJ5XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgICAgY29kZTogXCJVTlNVUFBPUlRFRF9QUk9KRUNUX1RBUkdFVFwiLFxuICAgICAgICAgIGxhbmd1YWdlOiB0YXJnZXQubGFuZ3VhZ2UsXG4gICAgICAgICAgbWVzc2FnZTogXCJDb21wbGV0ZSBzZW1hbnRpYyBwcm9ncmFtcyBkbyBub3Qgc3VwcG9ydCBiaW5hcnkgcHJvamVjdCBnZW5lcmF0aW9uLlwiXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBhcnRpZmFjdFNldCA9IGdlbmVyYXRlUHJvZ3JhbUFydGlmYWN0cyh7XG4gICAgICAgIGxhbmd1YWdlOiB0YXJnZXQubGFuZ3VhZ2UsXG4gICAgICAgIHByb2dyYW0sXG4gICAgICAgIHJvbGU6IHRhcmdldC5yb2xlXG4gICAgICB9KVxuICAgICAgY29uc3QgY2hlY2tDYXBhYmlsaXR5ID0gbGFuZ3VhZ2VSZWdpc3RyeS5yZWNvcmQodGFyZ2V0Lmxhbmd1YWdlKS5jaGVja1xuXG4gICAgICBpZiAoY2hlY2sgJiYgIWNoZWNrQ2FwYWJpbGl0eS5zdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgICAgY29kZTogXCJVTlNVUFBPUlRFRF9UQVJHRVRfQ0hFQ0tcIixcbiAgICAgICAgICBsYW5ndWFnZTogdGFyZ2V0Lmxhbmd1YWdlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBQcm9qZWN0IHRhcmdldCAnJHt0YXJnZXQuaWR9JyBkb2VzIG5vdCBwcm92aWRlIGEgZGV2ZWxvcGVyIGNoZWNrIHBsYW4uYFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBPcmRlcmVkIGNhbmRpZGF0ZSB2YWxpZGF0b3JzIHdoZW4gY2hlY2tpbmcgaXMgZW5hYmxlZC5cbiAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlB1YmxpY2F0aW9uVmFsaWRhdG9yW10gfCB1bmRlZmluZWR9XG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBjaGVjayA/IFthc3luYyAoe2J1aWxkUGF0aCwgc291cmNlUGF0aCwgdGFyZ2V0SWR9KSA9PiB7XG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWluW119ICovXG4gICAgICAgIGNvbnN0IHRvb2xzID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IHRvb2xjaGFpbiBvZiBjaGVja0NhcGFiaWxpdHkudG9vbGNoYWlucykge1xuICAgICAgICAgIHRvb2xzLnB1c2goYXdhaXQgZGlzY292ZXJDYW5vbmljYWxUb29sY2hhaW4oLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgY2Fub25pY2FsVG9vbGNoYWluc30gKi8gKHRvb2xjaGFpbiksIHtcbiAgICAgICAgICAgIC4uLih0aGlzLiNlbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkID8ge30gOiB7ZW52aXJvbm1lbnQ6IHRoaXMuI2Vudmlyb25tZW50fSlcbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbGFuID0gY3JlYXRlVGFyZ2V0Q2hlY2tQbGFuKHtcbiAgICAgICAgICBhcnRpZmFjdHM6IGFydGlmYWN0U2V0LFxuICAgICAgICAgIGJ1aWxkUGF0aCxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3QuaWQsXG4gICAgICAgICAgc291cmNlUGF0aCxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgICB0b29sczogT2JqZWN0LmZyZWV6ZSh0b29scylcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jY2hlY2tSdW5uZXIucnVuKHBsYW4sIHtcbiAgICAgICAgICBvblN0YWdlOiBzdGFnZSA9PiB7XG4gICAgICAgICAgICByZXBvcnRlcj8udGFyZ2V0Q2hlY2tlZCh7aWQ6IHRhcmdldC5pZCwgbGFuZ3VhZ2U6IHRhcmdldC5sYW5ndWFnZSwgc3RhZ2V9KVxuICAgICAgICAgICAgcHJvamVjdEJ1aWxkT2JzZXJ2ZXJzLmdldCh0aGlzKT8uKGBjaGVjazoke3RhcmdldC5pZH06JHtzdGFnZS5zdGFnZX1gKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKHNpZ25hbCA9PT0gdW5kZWZpbmVkID8ge30gOiB7c2lnbmFsfSksXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dE1zID09PSB1bmRlZmluZWQgPyB7fSA6IHt0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zfSlcbiAgICAgICAgfSlcblxuICAgICAgICBjaGVja1Jlc3VsdHMuc2V0KHRhcmdldC5pZCwgcmVzdWx0KVxuXG4gICAgICAgIHJldHVybiBbLi4ucmVzdWx0Lm91dHB1dHNdXG4gICAgICB9XSA6IHVuZGVmaW5lZFxuXG4gICAgICBwdWJsaWNhdGlvblRhcmdldHMucHVzaCh7XG4gICAgICAgIGFydGlmYWN0U2V0LFxuICAgICAgICBidWlsZFByb2plY3Rpb246IHRhcmdldC5idWlsZFByb2plY3Rpb24sXG4gICAgICAgIGlkOiB0YXJnZXQuaWQsXG4gICAgICAgIHJvbGU6IHRhcmdldC5yb2xlLFxuICAgICAgICBzb3VyY2VQcm9qZWN0aW9uOiB0YXJnZXQuc291cmNlUHJvamVjdGlvbixcbiAgICAgICAgLi4uKHZhbGlkYXRvcnMgPT09IHVuZGVmaW5lZCA/IHt9IDoge3ZhbGlkYXRvcnN9KVxuICAgICAgfSlcbiAgICAgIHRhcmdldFJlc3VsdHMucHVzaChPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXJ0aWZhY3RDb3VudDogYXJ0aWZhY3RTZXQuYXJ0aWZhY3RzLmxlbmd0aCxcbiAgICAgICAgaWQ6IHRhcmdldC5pZCxcbiAgICAgICAgbGFuZ3VhZ2U6IHRhcmdldC5sYW5ndWFnZSxcbiAgICAgICAgcm9sZTogdGFyZ2V0LnJvbGVcbiAgICAgIH0pKVxuICAgICAgcmVwb3J0ZXI/LnRhcmdldEdlbmVyYXRlZCh0YXJnZXRSZXN1bHRzW3RhcmdldFJlc3VsdHMubGVuZ3RoIC0gMV0pXG4gICAgICBwcm9qZWN0QnVpbGRPYnNlcnZlcnMuZ2V0KHRoaXMpPy4oYHRhcmdldDoke3RhcmdldC5pZH1gKVxuICAgIH1cbiAgICBjb25zdCBwdWJsaXNoZXIgPSBuZXcgR2VuZXJhdGVkQXJ0aWZhY3RQdWJsaXNoZXIoe1xuICAgICAgcHJvamVjdElkOiBwcm9qZWN0LmlkLFxuICAgICAgcHJvamVjdFJvb3Q6IHByb2plY3QucHJvamVjdFJvb3QsXG4gICAgICBwdWJsaWNhdGlvblJvb3Q6IHByb2plY3QucHVibGljYXRpb25Sb290LFxuICAgICAgc291cmNlRmlsZXM6IHByb2plY3Quc291cmNlcy5tYXAoKHthYnNvbHV0ZVBhdGh9KSA9PiBhYnNvbHV0ZVBhdGgpXG4gICAgfSlcbiAgICBjb25zdCBnZW5lcmF0aW9uSWQgPSBjaGVja1xuICAgICAgPyBgZy0ke3NuYXBzaG90Lmhhc2h9LWNoZWNrZWQtJHtyYW5kb21VVUlEKCl9YFxuICAgICAgOiBgZy0ke3NuYXBzaG90Lmhhc2h9YFxuICAgIGlmICh3YXRjaENvbnRyb2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGd1YXJkTmV4dFB1YmxpY2F0aW9uQ29tbWl0KHB1Ymxpc2hlciwgd2F0Y2hDb250cm9scy52YWxpZGF0ZUN1cnJlbnRTbmFwc2hvdClcbiAgICB9XG4gICAgY29uc3QgcHVibGljYXRpb25TaWduYWwgPSBzaWduYWwgPT09IHVuZGVmaW5lZFxuICAgICAgPyB3YXRjaENvbnRyb2xzPy5wdWJsaWNhdGlvblNpZ25hbFxuICAgICAgOiB3YXRjaENvbnRyb2xzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzaWduYWxcbiAgICAgICAgOiBBYm9ydFNpZ25hbC5hbnkoW3NpZ25hbCwgd2F0Y2hDb250cm9scy5wdWJsaWNhdGlvblNpZ25hbF0pXG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IGF3YWl0IHB1Ymxpc2hlci5wdWJsaXNoKHtnZW5lcmF0aW9uSWQsIHRhcmdldHM6IHB1YmxpY2F0aW9uVGFyZ2V0c30sIHtcbiAgICAgIC4uLihwdWJsaWNhdGlvblNpZ25hbCA9PT0gdW5kZWZpbmVkID8ge30gOiB7c2lnbmFsOiBwdWJsaWNhdGlvblNpZ25hbH0pXG4gICAgfSlcblxuICAgIHByb2plY3RCdWlsZE9ic2VydmVycy5nZXQodGhpcyk/LihcInB1Ymxpc2hcIilcblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGdlbmVyYXRpb24sXG4gICAgICBnZW5lcmF0aW9uSWQsXG4gICAgICBjaGVja2VkOiBjaGVjayxcbiAgICAgIHByb2plY3RJZDogcHJvamVjdC5pZCxcbiAgICAgIHNuYXBzaG90SGFzaDogc25hcHNob3QuaGFzaCxcbiAgICAgIHN0YXR1czogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3VjY2VlZGVkXCIpLFxuICAgICAgdGFyZ2V0czogT2JqZWN0LmZyZWV6ZSh0YXJnZXRSZXN1bHRzLm1hcCh0YXJnZXQgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVja1Jlc3VsdHMuZ2V0KHRhcmdldC5pZClcblxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgLi4udGFyZ2V0LFxuICAgICAgICAgIC4uLihyZXN1bHQgPT09IHVuZGVmaW5lZCA/IHt9IDoge2NoZWNrOiBPYmplY3QuZnJlZXplKHtzdGFnZXM6IHJlc3VsdC5zdGFnZXN9KX0pXG4gICAgICAgIH0pXG4gICAgICB9KSlcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUHJvamVjdEJ1aWxkT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hlY2tdIC0gV2hldGhlciBldmVyeSB0YXJnZXQgbXVzdCBydW4gaXRzIGRldmVsb3BlciBjaGVjay5cbiAqIEBwcm9wZXJ0eSB7QWJvcnRTaWduYWx9IFtzaWduYWxdIC0gQWN0aXZlIGNoZWNrIGFuZCBwdWJsaWNhdGlvbiBjYW5jZWxsYXRpb24gYXV0aG9yaXR5LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0TXNdIC0gUGVyLWNoZWNrLXN0YWdlIGRlYWRsaW5lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJvamVjdFdhdGNoQnVpbGRPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNoZWNrIC0gV2hldGhlciBldmVyeSB0YXJnZXQgbXVzdCBydW4gaXRzIGRldmVsb3BlciBjaGVjay5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHBlY3RlZFNuYXBzaG90SGFzaCAtIENvb3JkaW5hdG9yLXJlY29uY2lsZWQgY29tcGxldGUgZ3JhcGggaGFzaC5cbiAqIEBwcm9wZXJ0eSB7QWJvcnRTaWduYWx9IHB1YmxpY2F0aW9uU2lnbmFsIC0gUHVibGljYXRpb24tb25seSBjYW5jZWxsYXRpb24gYXV0aG9yaXR5LlxuICogQHByb3BlcnR5IHtBYm9ydFNpZ25hbH0gc2lnbmFsIC0gQWN0aXZlIGNoZWNrIGFuZCBwdWJsaWNhdGlvbiBjYW5jZWxsYXRpb24gYXV0aG9yaXR5LlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gdmFsaWRhdGVDdXJyZW50U25hcHNob3QgLSBDb21wbGV0ZSBncmFwaCBndWFyZCBhdCB0aGUgcG9pbnRlciBib3VuZGFyeS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByb2plY3RXYXRjaEJ1aWxkQ29udHJvbHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHBlY3RlZFNuYXBzaG90SGFzaCAtIENvb3JkaW5hdG9yLXJlY29uY2lsZWQgY29tcGxldGUgZ3JhcGggaGFzaC5cbiAqIEBwcm9wZXJ0eSB7QWJvcnRTaWduYWx9IHB1YmxpY2F0aW9uU2lnbmFsIC0gUHVibGljYXRpb24tb25seSBjYW5jZWxsYXRpb24gYXV0aG9yaXR5LlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gdmFsaWRhdGVDdXJyZW50U25hcHNob3QgLSBDb21wbGV0ZSBncmFwaCBndWFyZCBhdCB0aGUgcG9pbnRlciBib3VuZGFyeS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByb2plY3RCdWlsZFJlcG9ydGVyTGlrZVxuICogQHByb3BlcnR5IHsocHJvamVjdElkOiBzdHJpbmcpID0+IHZvaWR9IHByb2plY3RMb2FkZWQgLSBSZXBvcnRzIHZhbGlkYXRlZCBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHsoc25hcHNob3RIYXNoOiBzdHJpbmcpID0+IHZvaWR9IHNuYXBzaG90TG9hZGVkIC0gUmVwb3J0cyBhIGNvbXBsZXRlIHNuYXBzaG90LlxuICogQHByb3BlcnR5IHsodGFyZ2V0OiBQcm9qZWN0QnVpbGRUYXJnZXRSZXN1bHQpID0+IHZvaWR9IHRhcmdldEdlbmVyYXRlZCAtIFJlcG9ydHMgZ2VuZXJhdGVkIHRhcmdldCBvdXRwdXQuXG4gKiBAcHJvcGVydHkgeyhjaGVja2VkOiB7aWQ6IHN0cmluZywgbGFuZ3VhZ2U6IHN0cmluZywgc3RhZ2U6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuVGFyZ2V0Q2hlY2tTdGFnZVJlc3VsdH0pID0+IHZvaWR9IHRhcmdldENoZWNrZWQgLSBSZXBvcnRzIGEgc3VjY2Vzc2Z1bCBjaGVjayBzdGFnZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByb2plY3RCdWlsZFRhcmdldFJlc3VsdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGFydGlmYWN0Q291bnQgLSBHZW5lcmF0ZWQgYXJ0aWZhY3QgY291bnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBQcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gQmFja2VuZCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUHVibGljYXRpb25UYXJnZXRSb2xlfSByb2xlIC0gRXhwbGljaXQgdGFyZ2V0IHJvbGUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PHtzdGFnZXM6IHJlYWRvbmx5IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuVGFyZ2V0Q2hlY2tTdGFnZVJlc3VsdFtdfT59IFtjaGVja10gLSBTdWNjZXNzZnVsIGRldmVsb3Blci1jaGVjayBldmlkZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByb2plY3RCdWlsZFN1Y2Nlc3NcbiAqIEBwcm9wZXJ0eSB7XCJzdWNjZWVkZWRcIn0gc3RhdHVzIC0gVGVybWluYWwgc3VjY2VzcyBzdGF0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0SWQgLSBTdGFibGUgcHJvamVjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzbmFwc2hvdEhhc2ggLSBDb21wbGV0ZSBvcmRlcmVkIGlucHV0IGhhc2guXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvbklkIC0gRGV0ZXJtaW5pc3RpYyBpbW11dGFibGUgZ2VuZXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2hlY2tlZCAtIFdoZXRoZXIgZGV2ZWxvcGVyIGNoZWNrcyBjb21wbGV0ZWQgZm9yIGV2ZXJ5IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHJvamVjdEJ1aWxkVGFyZ2V0UmVzdWx0W119IHRhcmdldHMgLSBPcmRlcmVkIGdlbmVyYXRlZCB0YXJnZXQgcmVzdWx0cy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5QdWJsaXNoZWRHZW5lcmF0aW9ufSBnZW5lcmF0aW9uIC0gQ29tbWl0dGVkIHB1Ymxpc2hlciBzbmFwc2hvdC5cbiAqL1xuXG4vKipcbiAqIERldGFjaGVzIGV4cGxpY2l0IHRvb2wgZGlzY292ZXJ5IGNvbmZpZ3VyYXRpb24gZnJvbSBjYWxsZXIgbXV0YXRpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gSW1tdXRhYmxlIHNuYXBzaG90LlxuICovXG5mdW5jdGlvbiBzbmFwc2hvdEVudmlyb25tZW50KGNhbmRpZGF0ZSkge1xuICBpZiAodHlwZW9mIGNhbmRpZGF0ZSAhPSBcIm9iamVjdFwiIHx8IGNhbmRpZGF0ZSA9PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkZXIgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIHN0cmluZyByZWNvcmQuXCIpXG4gIH1cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSlcblxuICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkZXIgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIHN0cmluZyByZWNvcmQuXCIpXG4gIH1cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+fSAqL1xuICBjb25zdCBzbmFwc2hvdCA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoY2FuZGlkYXRlKSkge1xuICAgIGlmICh0eXBlb2Yga2V5ICE9IFwic3RyaW5nXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkZXIgZW52aXJvbm1lbnQgbXVzdCB1c2Ugc3RyaW5nIGtleXMuXCIpXG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLCBrZXkpXG5cbiAgICBpZiAoZGVzY3JpcHRvciA9PSB1bmRlZmluZWQgfHwgIWRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCAhKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSB8fFxuICAgICAgZGVzY3JpcHRvci52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlICE9IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkZXIgZW52aXJvbm1lbnQgbXVzdCBjb250YWluIHN0cmluZyBvciB1bmRlZmluZWQgZGF0YSB2YWx1ZXMuXCIpXG4gICAgfVxuICAgIHNuYXBzaG90W2tleV0gPSBkZXNjcmlwdG9yLnZhbHVlXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShzbmFwc2hvdClcbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IG9iamVjdC1wcm90b3R5cGUgcmVjb3JkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gT2JqZWN0LnByb3RvdHlwZVxufVxuIl19
@@ -0,0 +1,40 @@
1
+ import { ProjectBuilder } from "./project-build.js";
2
+ import { ProjectWatchCoordinator } from "./project-watch.js";
3
+ /**
4
+ * Owns one strict command invocation while delegating durable build behavior.
5
+ */
6
+ export declare class SemantifoldCli {
7
+ #private;
8
+ /**
9
+ * Creates an importable CLI lifecycle.
10
+ * @param {{builder?: ProjectBuilder, coordinator?: ProjectWatchCoordinator, stderr?: import("./project-reporter.js").WritableOutput, stdout?: import("./project-reporter.js").WritableOutput}} [options] - Collaborators and sinks.
11
+ */
12
+ constructor(options?: {
13
+ builder?: ProjectBuilder;
14
+ coordinator?: ProjectWatchCoordinator;
15
+ stderr?: import("./project-reporter.js").WritableOutput;
16
+ stdout?: import("./project-reporter.js").WritableOutput;
17
+ });
18
+ /**
19
+ * Runs one command without mutating process exit state.
20
+ * @param {readonly string[]} arguments_ - Arguments after the executable name.
21
+ * @returns {Promise<0 | 1>} Exact process status.
22
+ */
23
+ run(arguments_: readonly string[]): Promise<0 | 1>;
24
+ }
25
+ /**
26
+ * Parses the intentionally narrow one-shot CLI grammar.
27
+ * @param {readonly string[]} arguments_ - Arguments after the executable name.
28
+ * @returns {Readonly<{check: boolean, format: "human" | "ndjson", projectPath: string}> | Readonly<{command: "watch", check: boolean, format: "human" | "ndjson", projectPath: string}>} Validated command options.
29
+ */
30
+ export declare function parseSemantifoldCliArguments(arguments_: readonly string[]): Readonly<{
31
+ check: boolean;
32
+ format: "human" | "ndjson";
33
+ projectPath: string;
34
+ }> | Readonly<{
35
+ command: "watch";
36
+ check: boolean;
37
+ format: "human" | "ndjson";
38
+ projectPath: string;
39
+ }>;
40
+ //# sourceMappingURL=project-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-cli.d.ts","sourceRoot":"","sources":["../../src/project-cli.js"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAC,uBAAuB,EAAC,MAAM,oBAAoB,CAAA;AAG1D;;GAEG;AACH,qBAAa,cAAc;;IAUzB;;;OAGG;IACH,YAAY,OAAO,AAFhB,CACF,EADU;QAAC,OAAO,CAAC,EAAE,cAAc,CAAC;QAAC,WAAW,CAAC,EAAE,uBAAuB,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,uBAAuB,EAAE,cAAc,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,uBAAuB,EAAE,cAAc,CAAA;KAErK,EAKvB;IAED;;;;OAIG;IACG,GAAG,CAAC,UAAU,EAHT,SAAS,MAAM,EAGN,GAFP,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAuD1B;CACF;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAH5C,SAAS,MAAM,EAG6B,GAF1C,QAAQ,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,CAAC,GAAG,QAAQ,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,CAAC,CA6CvL"}