@farmslot/recipe-runner 0.23.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 (212) hide show
  1. package/CHANGELOG.md +255 -0
  2. package/LICENSE +21 -0
  3. package/README.md +274 -0
  4. package/bin/farmslot-visual-review.mjs +152 -0
  5. package/dist/adapters/app-lifecycle.d.ts +41 -0
  6. package/dist/adapters/app-lifecycle.d.ts.map +1 -0
  7. package/dist/adapters/app-lifecycle.js +224 -0
  8. package/dist/adapters/app-lifecycle.js.map +1 -0
  9. package/dist/adapters/core.d.ts +5 -0
  10. package/dist/adapters/core.d.ts.map +1 -0
  11. package/dist/adapters/core.js +433 -0
  12. package/dist/adapters/core.js.map +1 -0
  13. package/dist/adapters/gesture.d.ts +12 -0
  14. package/dist/adapters/gesture.d.ts.map +1 -0
  15. package/dist/adapters/gesture.js +76 -0
  16. package/dist/adapters/gesture.js.map +1 -0
  17. package/dist/adapters/ui.d.ts +33 -0
  18. package/dist/adapters/ui.d.ts.map +1 -0
  19. package/dist/adapters/ui.js +130 -0
  20. package/dist/adapters/ui.js.map +1 -0
  21. package/dist/cli/error-output.d.ts +6 -0
  22. package/dist/cli/error-output.d.ts.map +1 -0
  23. package/dist/cli/error-output.js +19 -0
  24. package/dist/cli/error-output.js.map +1 -0
  25. package/dist/cli/index.d.ts +12 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +29 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/cli/run-command.d.ts +8 -0
  30. package/dist/cli/run-command.d.ts.map +1 -0
  31. package/dist/cli/run-command.js +253 -0
  32. package/dist/cli/run-command.js.map +1 -0
  33. package/dist/cli/support.d.ts +31 -0
  34. package/dist/cli/support.d.ts.map +1 -0
  35. package/dist/cli/support.js +297 -0
  36. package/dist/cli/support.js.map +1 -0
  37. package/dist/cli/validate-command.d.ts +4 -0
  38. package/dist/cli/validate-command.d.ts.map +1 -0
  39. package/dist/cli/validate-command.js +52 -0
  40. package/dist/cli/validate-command.js.map +1 -0
  41. package/dist/core/compose.d.ts +23 -0
  42. package/dist/core/compose.d.ts.map +1 -0
  43. package/dist/core/compose.js +104 -0
  44. package/dist/core/compose.js.map +1 -0
  45. package/dist/core/execution.d.ts +44 -0
  46. package/dist/core/execution.d.ts.map +1 -0
  47. package/dist/core/execution.js +304 -0
  48. package/dist/core/execution.js.map +1 -0
  49. package/dist/core/failure.d.ts +23 -0
  50. package/dist/core/failure.d.ts.map +1 -0
  51. package/dist/core/failure.js +43 -0
  52. package/dist/core/failure.js.map +1 -0
  53. package/dist/core/graph.d.ts +12 -0
  54. package/dist/core/graph.d.ts.map +1 -0
  55. package/dist/core/graph.js +65 -0
  56. package/dist/core/graph.js.map +1 -0
  57. package/dist/core/hud.d.ts +11 -0
  58. package/dist/core/hud.d.ts.map +1 -0
  59. package/dist/core/hud.js +120 -0
  60. package/dist/core/hud.js.map +1 -0
  61. package/dist/core/invocation.d.ts +13 -0
  62. package/dist/core/invocation.d.ts.map +1 -0
  63. package/dist/core/invocation.js +68 -0
  64. package/dist/core/invocation.js.map +1 -0
  65. package/dist/core/json.d.ts +9 -0
  66. package/dist/core/json.d.ts.map +1 -0
  67. package/dist/core/json.js +74 -0
  68. package/dist/core/json.js.map +1 -0
  69. package/dist/core/library-manifest.d.ts +53 -0
  70. package/dist/core/library-manifest.d.ts.map +1 -0
  71. package/dist/core/library-manifest.js +263 -0
  72. package/dist/core/library-manifest.js.map +1 -0
  73. package/dist/core/library.d.ts +80 -0
  74. package/dist/core/library.d.ts.map +1 -0
  75. package/dist/core/library.js +321 -0
  76. package/dist/core/library.js.map +1 -0
  77. package/dist/core/parameters.d.ts +5 -0
  78. package/dist/core/parameters.d.ts.map +1 -0
  79. package/dist/core/parameters.js +57 -0
  80. package/dist/core/parameters.js.map +1 -0
  81. package/dist/core/passive-observations.d.ts +25 -0
  82. package/dist/core/passive-observations.d.ts.map +1 -0
  83. package/dist/core/passive-observations.js +62 -0
  84. package/dist/core/passive-observations.js.map +1 -0
  85. package/dist/core/path.d.ts +7 -0
  86. package/dist/core/path.d.ts.map +1 -0
  87. package/dist/core/path.js +147 -0
  88. package/dist/core/path.js.map +1 -0
  89. package/dist/core/recording-cleanup.d.ts +10 -0
  90. package/dist/core/recording-cleanup.d.ts.map +1 -0
  91. package/dist/core/recording-cleanup.js +32 -0
  92. package/dist/core/recording-cleanup.js.map +1 -0
  93. package/dist/core/resolution-error.d.ts +7 -0
  94. package/dist/core/resolution-error.d.ts.map +1 -0
  95. package/dist/core/resolution-error.js +9 -0
  96. package/dist/core/resolution-error.js.map +1 -0
  97. package/dist/core/runner.d.ts +4 -0
  98. package/dist/core/runner.d.ts.map +1 -0
  99. package/dist/core/runner.js +738 -0
  100. package/dist/core/runner.js.map +1 -0
  101. package/dist/core/scroll-to.d.ts +111 -0
  102. package/dist/core/scroll-to.d.ts.map +1 -0
  103. package/dist/core/scroll-to.js +353 -0
  104. package/dist/core/scroll-to.js.map +1 -0
  105. package/dist/core/suite.d.ts +25 -0
  106. package/dist/core/suite.d.ts.map +1 -0
  107. package/dist/core/suite.js +76 -0
  108. package/dist/core/suite.js.map +1 -0
  109. package/dist/core/trace.d.ts +5 -0
  110. package/dist/core/trace.d.ts.map +1 -0
  111. package/dist/core/trace.js +25 -0
  112. package/dist/core/trace.js.map +1 -0
  113. package/dist/core/trust-error.d.ts +9 -0
  114. package/dist/core/trust-error.d.ts.map +1 -0
  115. package/dist/core/trust-error.js +18 -0
  116. package/dist/core/trust-error.js.map +1 -0
  117. package/dist/core/trust-input.d.ts +20 -0
  118. package/dist/core/trust-input.d.ts.map +1 -0
  119. package/dist/core/trust-input.js +68 -0
  120. package/dist/core/trust-input.js.map +1 -0
  121. package/dist/core/trust.d.ts +28 -0
  122. package/dist/core/trust.d.ts.map +1 -0
  123. package/dist/core/trust.js +284 -0
  124. package/dist/core/trust.js.map +1 -0
  125. package/dist/core/types.d.ts +319 -0
  126. package/dist/core/types.d.ts.map +1 -0
  127. package/dist/core/types.js +2 -0
  128. package/dist/core/types.js.map +1 -0
  129. package/dist/core/validation.d.ts +4 -0
  130. package/dist/core/validation.d.ts.map +1 -0
  131. package/dist/core/validation.js +18 -0
  132. package/dist/core/validation.js.map +1 -0
  133. package/dist/index.d.ts +32 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +25 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/node/writers.d.ts +27 -0
  138. package/dist/node/writers.d.ts.map +1 -0
  139. package/dist/node/writers.js +99 -0
  140. package/dist/node/writers.js.map +1 -0
  141. package/dist/recording/android-mirror.d.ts +10 -0
  142. package/dist/recording/android-mirror.d.ts.map +1 -0
  143. package/dist/recording/android-mirror.js +180 -0
  144. package/dist/recording/android-mirror.js.map +1 -0
  145. package/dist/recording/capture-helper-timing.d.ts +4 -0
  146. package/dist/recording/capture-helper-timing.d.ts.map +1 -0
  147. package/dist/recording/capture-helper-timing.js +47 -0
  148. package/dist/recording/capture-helper-timing.js.map +1 -0
  149. package/dist/recording/capture-helper.d.ts +10 -0
  150. package/dist/recording/capture-helper.d.ts.map +1 -0
  151. package/dist/recording/capture-helper.js +335 -0
  152. package/dist/recording/capture-helper.js.map +1 -0
  153. package/dist/recording/cdp-video-recorder.d.ts +9 -0
  154. package/dist/recording/cdp-video-recorder.d.ts.map +1 -0
  155. package/dist/recording/cdp-video-recorder.js +319 -0
  156. package/dist/recording/cdp-video-recorder.js.map +1 -0
  157. package/dist/recording/frame-sampler.d.ts +19 -0
  158. package/dist/recording/frame-sampler.d.ts.map +1 -0
  159. package/dist/recording/frame-sampler.js +29 -0
  160. package/dist/recording/frame-sampler.js.map +1 -0
  161. package/dist/recording/timeline.d.ts +15 -0
  162. package/dist/recording/timeline.d.ts.map +1 -0
  163. package/dist/recording/timeline.js +88 -0
  164. package/dist/recording/timeline.js.map +1 -0
  165. package/dist/runtime/browser-extension.d.ts +17 -0
  166. package/dist/runtime/browser-extension.d.ts.map +1 -0
  167. package/dist/runtime/browser-extension.js +42 -0
  168. package/dist/runtime/browser-extension.js.map +1 -0
  169. package/dist/runtime/cdp.d.ts +138 -0
  170. package/dist/runtime/cdp.d.ts.map +1 -0
  171. package/dist/runtime/cdp.js +1429 -0
  172. package/dist/runtime/cdp.js.map +1 -0
  173. package/dist/runtime/decision-types.d.ts +23 -0
  174. package/dist/runtime/decision-types.d.ts.map +1 -0
  175. package/dist/runtime/decision-types.js +2 -0
  176. package/dist/runtime/decision-types.js.map +1 -0
  177. package/dist/runtime/deps-readiness.d.ts +21 -0
  178. package/dist/runtime/deps-readiness.d.ts.map +1 -0
  179. package/dist/runtime/deps-readiness.js +141 -0
  180. package/dist/runtime/deps-readiness.js.map +1 -0
  181. package/dist/runtime/log-analysis.d.ts +48 -0
  182. package/dist/runtime/log-analysis.d.ts.map +1 -0
  183. package/dist/runtime/log-analysis.js +128 -0
  184. package/dist/runtime/log-analysis.js.map +1 -0
  185. package/dist/runtime/metro-probe.d.ts +5 -0
  186. package/dist/runtime/metro-probe.d.ts.map +1 -0
  187. package/dist/runtime/metro-probe.js +24 -0
  188. package/dist/runtime/metro-probe.js.map +1 -0
  189. package/dist/runtime/operation.d.ts +32 -0
  190. package/dist/runtime/operation.d.ts.map +1 -0
  191. package/dist/runtime/operation.js +184 -0
  192. package/dist/runtime/operation.js.map +1 -0
  193. package/dist/runtime/orchestrate-up.d.ts +22 -0
  194. package/dist/runtime/orchestrate-up.d.ts.map +1 -0
  195. package/dist/runtime/orchestrate-up.js +35 -0
  196. package/dist/runtime/orchestrate-up.js.map +1 -0
  197. package/dist/runtime/react-native-bridge.d.ts +17 -0
  198. package/dist/runtime/react-native-bridge.d.ts.map +1 -0
  199. package/dist/runtime/react-native-bridge.js +57 -0
  200. package/dist/runtime/react-native-bridge.js.map +1 -0
  201. package/dist/version.d.ts +2 -0
  202. package/dist/version.d.ts.map +1 -0
  203. package/dist/version.js +8 -0
  204. package/dist/version.js.map +1 -0
  205. package/package.json +163 -0
  206. package/test/fixtures/scroll-to-visible/README.md +39 -0
  207. package/visual-review/feedback-draft.mjs +82 -0
  208. package/visual-review/index.d.mts +41 -0
  209. package/visual-review/index.mjs +4 -0
  210. package/visual-review/recipe-board.mjs +142 -0
  211. package/visual-review/review-board.mjs +981 -0
  212. package/visual-review/server.mjs +69 -0
@@ -0,0 +1,297 @@
1
+ import { readdir, readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { applyRecipeParamDefaults, digestRecipeDocument, isRecord, mergeRecipeValidationResults, resolvedRecipeArtifactPath, validateArtifactManifestDocument, validateRecipeArtifactPackage, validateRecipeDocument, validateRecipeParams, validateRecipeWithManifest, } from '@farmslot/protocol';
4
+ import { resolveRecipeDependencies, rootResolutionRef, validateRecipeDependencyParams, } from '../core/compose.js';
5
+ import { recordedRecipeParams } from '../core/invocation.js';
6
+ import { loadRecipeLibraries } from '../core/library.js';
7
+ import { readFileWithinRoot } from '../core/path.js';
8
+ import { RecipeResolutionError } from '../core/resolution-error.js';
9
+ export function recipeCliBaseDir() {
10
+ return process.env.INIT_CWD ?? process.cwd();
11
+ }
12
+ export function resolveRecipeCliPath(filePath, baseDir = recipeCliBaseDir()) {
13
+ return path.resolve(baseDir, filePath);
14
+ }
15
+ export function parsePositiveInteger(value) {
16
+ const parsed = Number(value);
17
+ if (!Number.isInteger(parsed) || parsed <= 0) {
18
+ throw new Error(`Expected a positive integer, got ${JSON.stringify(value)}.`);
19
+ }
20
+ return parsed;
21
+ }
22
+ export function parseRecipeParamAssignments(values) {
23
+ const params = {};
24
+ for (const value of values) {
25
+ const separator = value.indexOf('=');
26
+ if (separator <= 0) {
27
+ throw new Error(`Recipe parameter ${JSON.stringify(value)} must use key=value.`);
28
+ }
29
+ const key = value.slice(0, separator).trim();
30
+ if (!key || Object.hasOwn(params, key)) {
31
+ throw new Error(Object.hasOwn(params, key)
32
+ ? `Recipe parameter ${key} was provided more than once.`
33
+ : `Recipe parameter ${JSON.stringify(value)} has an empty key.`);
34
+ }
35
+ const raw = value.slice(separator + 1);
36
+ let parsed;
37
+ try {
38
+ parsed = JSON.parse(raw);
39
+ }
40
+ catch {
41
+ parsed = raw;
42
+ }
43
+ Object.defineProperty(params, key, {
44
+ value: parsed,
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ });
49
+ }
50
+ return params;
51
+ }
52
+ export function parseRecordingTarget(options) {
53
+ if (options.recordPid)
54
+ return { kind: 'pid', pid: parsePositiveInteger(options.recordPid) };
55
+ if (options.recordWindowId)
56
+ return { kind: 'window-id', windowId: options.recordWindowId };
57
+ if (options.recordAppName || options.recordWindowName) {
58
+ if (!options.recordAppName || !options.recordWindowName) {
59
+ throw new Error('--record-app-name and --record-window-name must be provided together.');
60
+ }
61
+ return {
62
+ kind: 'app-window',
63
+ appName: options.recordAppName,
64
+ windowName: options.recordWindowName,
65
+ };
66
+ }
67
+ return undefined;
68
+ }
69
+ export async function readRecipeCliJsonFile(filePath, baseDir = recipeCliBaseDir()) {
70
+ const resolvedPath = resolveRecipeCliPath(filePath, baseDir);
71
+ let text;
72
+ try {
73
+ text = await readFile(resolvedPath, 'utf-8');
74
+ }
75
+ catch (error) {
76
+ const message = error instanceof Error ? error.message : String(error);
77
+ throw new Error(`Failed to read JSON from ${filePath}: ${message}`);
78
+ }
79
+ return parseRecipeCliJsonText(filePath, text);
80
+ }
81
+ export async function readRecipeCliJsonFileWithinRoot(root, relativePath) {
82
+ let text;
83
+ try {
84
+ text = (await readFileWithinRoot(root, relativePath)).toString('utf-8');
85
+ }
86
+ catch (error) {
87
+ const message = error instanceof Error ? error.message : String(error);
88
+ throw new Error(`Failed to read JSON from ${relativePath}: ${message}`, { cause: error });
89
+ }
90
+ return parseRecipeCliJsonText(relativePath, text);
91
+ }
92
+ async function readOptionalRecipeCliJsonFileWithinRoot(root, relativePath) {
93
+ try {
94
+ return await readRecipeCliJsonFileWithinRoot(root, relativePath);
95
+ }
96
+ catch (error) {
97
+ if (error?.cause?.code === 'ENOENT')
98
+ return undefined;
99
+ throw error;
100
+ }
101
+ }
102
+ function parseRecipeCliJsonText(filePath, text) {
103
+ try {
104
+ return JSON.parse(text);
105
+ }
106
+ catch (error) {
107
+ const message = error instanceof Error ? error.message : String(error);
108
+ throw new Error(`Failed to parse JSON from ${filePath}: ${message}`);
109
+ }
110
+ }
111
+ export async function validateRecipeCliInput({ recipePath, actionManifestPath, adapter, artifactManifestPath, artifactDir, baseDir = recipeCliBaseDir(), librarySources, params = {}, packageVersions, }) {
112
+ const recipe = await readRecipeCliJsonFile(recipePath, baseDir);
113
+ const results = [];
114
+ const artifactRoot = artifactDir ? resolveRecipeCliPath(artifactDir, baseDir) : undefined;
115
+ const artifactPaths = artifactRoot ? await listRelativeRecipeCliFiles(artifactRoot) : undefined;
116
+ const recipeResolution = artifactRoot
117
+ ? await readOptionalRecipeCliJsonFileWithinRoot(artifactRoot, 'recipe-resolution.json')
118
+ : undefined;
119
+ const trace = artifactRoot
120
+ ? await readOptionalRecipeCliJsonFileWithinRoot(artifactRoot, 'trace.json')
121
+ : undefined;
122
+ const summary = artifactRoot
123
+ ? await readOptionalRecipeCliJsonFileWithinRoot(artifactRoot, 'summary.json')
124
+ : undefined;
125
+ const invocation = artifactRoot
126
+ ? await readOptionalRecipeCliJsonFileWithinRoot(artifactRoot, 'recipe-invocation.json')
127
+ : undefined;
128
+ let effectiveParams = isRecord(recipe)
129
+ ? applyRecipeParamDefaults(params, recipe.paramsSchema)
130
+ : params;
131
+ if (invocation !== undefined || (isRecord(summary) && summary.invocationDigest !== undefined)) {
132
+ try {
133
+ const recorded = recordedRecipeParams(recipe, invocation, summary);
134
+ if (Object.keys(params).length &&
135
+ digestRecipeDocument(effectiveParams) !== digestRecipeDocument(recorded)) {
136
+ throw new Error('Supplied parameters differ from the recorded execution inputs.');
137
+ }
138
+ effectiveParams = recorded;
139
+ }
140
+ catch (error) {
141
+ results.push({
142
+ status: 'invalid',
143
+ findings: [
144
+ {
145
+ severity: 'error',
146
+ code: 'recipe.invalid_invocation',
147
+ path: 'recipe-invocation.json',
148
+ message: error instanceof Error ? error.message : 'Invalid recorded invocation.',
149
+ },
150
+ ],
151
+ summary: { errors: 1, warnings: 0 },
152
+ });
153
+ }
154
+ }
155
+ if (isRecord(recipe))
156
+ results.push(validateRecipeParams(effectiveParams, recipe.paramsSchema));
157
+ const resolvedRecipes = {};
158
+ if (artifactRoot && isRecord(recipeResolution) && Array.isArray(recipeResolution.dependencies)) {
159
+ for (const dependency of recipeResolution.dependencies) {
160
+ if (!isRecord(dependency))
161
+ continue;
162
+ const artifact = resolvedRecipeArtifactPath(dependency.digest);
163
+ if (!artifact)
164
+ continue;
165
+ const document = await readOptionalRecipeCliJsonFileWithinRoot(artifactRoot, artifact);
166
+ if (document !== undefined)
167
+ resolvedRecipes[String(dependency.digest)] = document;
168
+ }
169
+ }
170
+ const libraryResolution = librarySources && librarySources.length > 0
171
+ ? await loadRecipeLibraries(librarySources, {
172
+ ...(adapter ? { adapter } : {}),
173
+ ...(packageVersions ? { packageVersions } : {}),
174
+ })
175
+ : undefined;
176
+ const externalRecipeIds = new Set(libraryResolution?.recipes.keys() ?? []);
177
+ if (isRecord(recipeResolution) && Array.isArray(recipeResolution.dependencies)) {
178
+ for (const dependency of recipeResolution.dependencies) {
179
+ if (isRecord(dependency) && typeof dependency.ref === 'string') {
180
+ externalRecipeIds.add(dependency.ref);
181
+ }
182
+ }
183
+ }
184
+ const validationOptions = externalRecipeIds.size > 0 || adapter ? { externalRecipeIds, adapter } : undefined;
185
+ if (actionManifestPath) {
186
+ const actionManifest = await readRecipeCliJsonFile(actionManifestPath, baseDir);
187
+ results.push(validateRecipeWithManifest(recipe, actionManifest, validationOptions));
188
+ }
189
+ else {
190
+ results.push(validateRecipeDocument(recipe, validationOptions));
191
+ }
192
+ if (!artifactDir &&
193
+ libraryResolution &&
194
+ isRecord(recipe) &&
195
+ results.every((result) => result.status === 'valid')) {
196
+ try {
197
+ const rootDigest = digestRecipeDocument(recipe);
198
+ resolveRecipeDependencies({
199
+ rootRef: rootResolutionRef(rootDigest),
200
+ root: recipe,
201
+ rootSource: {
202
+ kind: 'operator',
203
+ trust: 'unknown',
204
+ path: resolveRecipeCliPath(recipePath, baseDir),
205
+ digest: rootDigest,
206
+ },
207
+ recipes: libraryResolution.recipes,
208
+ });
209
+ validateRecipeDependencyParams({
210
+ root: recipe,
211
+ params: effectiveParams,
212
+ recipes: libraryResolution.recipes,
213
+ });
214
+ }
215
+ catch (error) {
216
+ results.push({
217
+ status: 'invalid',
218
+ findings: [
219
+ {
220
+ severity: 'error',
221
+ code: error instanceof RecipeResolutionError
222
+ ? error.code.toLowerCase()
223
+ : 'recipe.unresolved_dependency_graph',
224
+ path: 'workflow',
225
+ message: error instanceof RecipeResolutionError
226
+ ? `${error.message} Next: ${error.userAction}.`
227
+ : error instanceof Error
228
+ ? error.message
229
+ : String(error),
230
+ },
231
+ ],
232
+ summary: { errors: 1, warnings: 0 },
233
+ });
234
+ }
235
+ }
236
+ const manifestPath = artifactManifestPath ??
237
+ (artifactDir ? path.join(artifactDir, 'artifact-manifest.json') : undefined);
238
+ let manifest;
239
+ if (manifestPath) {
240
+ manifest = artifactManifestPath
241
+ ? await readRecipeCliJsonFile(manifestPath, baseDir)
242
+ : await readOptionalRecipeCliJsonFileWithinRoot(artifactRoot, 'artifact-manifest.json');
243
+ if (manifest !== undefined && !artifactDir) {
244
+ results.push(validateArtifactManifestDocument(manifest, {
245
+ recipe,
246
+ artifactPaths,
247
+ }));
248
+ }
249
+ }
250
+ if (artifactDir) {
251
+ if ((invocation !== undefined || (isRecord(summary) && summary.invocationDigest !== undefined)) &&
252
+ !(isRecord(manifest) &&
253
+ Array.isArray(manifest.artifacts) &&
254
+ manifest.artifacts.some((entry) => isRecord(entry) && entry.path === 'recipe-invocation.json' && entry.type === 'json'))) {
255
+ results.push({
256
+ status: 'invalid',
257
+ findings: [
258
+ {
259
+ severity: 'error',
260
+ code: 'recipe.unindexed_invocation',
261
+ path: 'artifact-manifest.json',
262
+ message: 'The artifact manifest must index recipe-invocation.json as a JSON artifact.',
263
+ },
264
+ ],
265
+ summary: { errors: 1, warnings: 0 },
266
+ });
267
+ }
268
+ results.push(validateRecipeArtifactPackage({
269
+ recipe,
270
+ manifest,
271
+ trace,
272
+ summary,
273
+ artifactPaths,
274
+ resolvedRecipes,
275
+ recipeResolution,
276
+ }));
277
+ }
278
+ return mergeRecipeValidationResults(results);
279
+ }
280
+ async function listRelativeRecipeCliFiles(root) {
281
+ const output = [];
282
+ async function visit(relativeDir) {
283
+ const entries = await readdir(path.join(root, relativeDir), { withFileTypes: true });
284
+ for (const entry of entries) {
285
+ const relativePath = path.join(relativeDir, entry.name);
286
+ if (entry.isDirectory()) {
287
+ await visit(relativePath);
288
+ }
289
+ else if (entry.isFile() || entry.isSymbolicLink()) {
290
+ output.push(relativePath.split(path.sep).join('/'));
291
+ }
292
+ }
293
+ }
294
+ await visit('');
295
+ return output.sort();
296
+ }
297
+ //# sourceMappingURL=support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.js","sourceRoot":"","sources":["../../src/cli/support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Command } from 'commander';
2
+ import type { RecipeCliCommandContext } from './run-command.js';
3
+ export declare function registerValidateCommand(program: Command, context?: RecipeCliCommandContext): void;
4
+ //# sourceMappingURL=validate-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-command.d.ts","sourceRoot":"","sources":["../../src/cli/validate-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAYhE,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,uBAA4B,GACpC,IAAI,CAiDN"}
@@ -0,0 +1,52 @@
1
+ import { resolveRecipeLibrarySources } from '../core/library.js';
2
+ import { isRecipeCliError, reportRecipeCliError } from './error-output.js';
3
+ import { validateRecipeCliInput } from './support.js';
4
+ export function registerValidateCommand(program, context = {}) {
5
+ program
6
+ .command('validate')
7
+ .description('Validate a recipe and optional v1 artifact package')
8
+ .argument('<recipe>', 'Path to recipe.json')
9
+ .option('--action-manifest <manifest>', 'Runner action manifest JSON')
10
+ .option('--adapter <name>', 'Active adapter for manifest capability validation')
11
+ .option('--artifact-manifest <manifest>', 'Artifact manifest JSON')
12
+ .option('--artifact-dir <dir>', 'Artifact package directory')
13
+ .option('--library <entry>', 'Recipe library source as name=path or path (repeatable; earlier wins). Same resolution as run.', collectRepeatable, [])
14
+ .option('--json', 'Print validation result as JSON')
15
+ .action(async (recipePath, options) => {
16
+ try {
17
+ const librarySources = await resolveRecipeLibrarySources({
18
+ cliEntries: options.library,
19
+ recipePath,
20
+ });
21
+ const result = await validateRecipeCliInput({
22
+ recipePath,
23
+ actionManifestPath: options.actionManifest,
24
+ adapter: options.adapter,
25
+ artifactManifestPath: options.artifactManifest,
26
+ artifactDir: options.artifactDir,
27
+ ...(librarySources.length > 0 ? { librarySources } : {}),
28
+ ...(context.packageVersions ? { packageVersions: context.packageVersions } : {}),
29
+ });
30
+ if (options.json) {
31
+ console.log(JSON.stringify(result, null, 2));
32
+ }
33
+ else {
34
+ console.log(`Recipe validation: ${result.status} (${result.summary.errors} errors, ${result.summary.warnings} warnings)`);
35
+ for (const finding of result.findings) {
36
+ console.log(`- ${finding.severity} ${finding.code} ${finding.path}: ${finding.message}`);
37
+ }
38
+ }
39
+ if (result.status === 'invalid')
40
+ process.exitCode = 1;
41
+ }
42
+ catch (error) {
43
+ if (!isRecipeCliError(error))
44
+ throw error;
45
+ reportRecipeCliError(error, options.json === true);
46
+ }
47
+ });
48
+ }
49
+ function collectRepeatable(value, previous) {
50
+ return [...previous, value];
51
+ }
52
+ //# sourceMappingURL=validate-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-command.js","sourceRoot":"","sources":["../../src/cli/validate-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAWtD,MAAM,UAAU,uBAAuB,CACrC,OAAgB,EAChB,UAAmC,EAAE;IAErC,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,oDAAoD,CAAC;SACjE,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;SAC3C,MAAM,CAAC,8BAA8B,EAAE,6BAA6B,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,mDAAmD,CAAC;SAC/E,MAAM,CAAC,gCAAgC,EAAE,wBAAwB,CAAC;SAClE,MAAM,CAAC,sBAAsB,EAAE,4BAA4B,CAAC;SAC5D,MAAM,CACL,mBAAmB,EACnB,gGAAgG,EAChG,iBAAiB,EACjB,EAAc,CACf;SACA,MAAM,CAAC,QAAQ,EAAE,iCAAiC,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAA+B,EAAE,EAAE;QACpE,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,2BAA2B,CAAC;gBACvD,UAAU,EAAE,OAAO,CAAC,OAAO;gBAC3B,UAAU;aACX,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;gBAC1C,UAAU;gBACV,kBAAkB,EAAE,OAAO,CAAC,cAAc;gBAC1C,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,oBAAoB,EAAE,OAAO,CAAC,gBAAgB;gBAC9C,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjF,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,sBAAsB,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,YAAY,MAAM,CAAC,OAAO,CAAC,QAAQ,YAAY,CAC7G,CAAC;gBACF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACtC,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAC5E,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YAC1C,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,QAAkB;IAC1D,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type RecipeResolutionDocument, type RecipeResolutionEdge, type RecipeSourceProvenance } from '@farmslot/protocol';
2
+ import type { ResolvedLibraryRecipe } from './library.js';
3
+ export interface ResolvedRecipeDependencies {
4
+ recipes: ReadonlyMap<string, ResolvedLibraryRecipe>;
5
+ edges: RecipeResolutionEdge[];
6
+ document: RecipeResolutionDocument;
7
+ }
8
+ export declare function rootResolutionRef(digest: string): string;
9
+ /** Validate every static call boundary after parent defaults and parameters are applied. */
10
+ export declare function validateRecipeDependencyParams(options: {
11
+ root: Record<string, unknown>;
12
+ params: Record<string, unknown>;
13
+ recipes: ReadonlyMap<string, ResolvedLibraryRecipe>;
14
+ }): void;
15
+ /** Resolve the exact static recipe call DAG before any side effect. */
16
+ export declare function resolveRecipeDependencies(options: {
17
+ rootRef: string;
18
+ root: Record<string, unknown>;
19
+ rootSource: RecipeSourceProvenance;
20
+ recipes: ReadonlyMap<string, ResolvedLibraryRecipe>;
21
+ maxDepth?: number;
22
+ }): ResolvedRecipeDependencies;
23
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/core/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAE5B,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAI1D,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACpD,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,QAAQ,EAAE,wBAAwB,CAAC;CACpC;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,4FAA4F;AAC5F,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACrD,GAAG,IAAI,CAkBP;AAED,uEAAuE;AACvE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,UAAU,EAAE,sBAAsB,CAAC;IACnC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,0BAA0B,CAuF7B"}
@@ -0,0 +1,104 @@
1
+ import { normalizeRecipeRef, resolvedRecipeArtifactPath, } from '@farmslot/protocol';
2
+ import { DEFAULT_MAX_RECIPE_CALL_DEPTH } from './execution.js';
3
+ import { extractWorkflowGraph } from './graph.js';
4
+ import { isRecord } from './json.js';
5
+ import { resolveRecipeParams, resolveRecipeValue } from './parameters.js';
6
+ import { RecipeResolutionError } from './resolution-error.js';
7
+ export function rootResolutionRef(digest) {
8
+ return `$root:${digest}`;
9
+ }
10
+ /** Validate every static call boundary after parent defaults and parameters are applied. */
11
+ export function validateRecipeDependencyParams(options) {
12
+ const visit = (document, params) => {
13
+ for (const rawNode of Object.values(extractWorkflowGraph(document).nodes)) {
14
+ if (rawNode.action !== 'call' || typeof rawNode.ref !== 'string')
15
+ continue;
16
+ const ref = normalizeRecipeRef(rawNode.ref);
17
+ const dependency = options.recipes.get(ref);
18
+ if (!dependency)
19
+ continue;
20
+ const node = resolveRecipeValue(rawNode, params);
21
+ const childParams = resolveRecipeParams(ref, dependency.document, isRecord(node) && isRecord(node.params) ? node.params : {}, { allowTemplates: true });
22
+ visit(dependency.document, childParams);
23
+ }
24
+ };
25
+ visit(options.root, options.params);
26
+ }
27
+ /** Resolve the exact static recipe call DAG before any side effect. */
28
+ export function resolveRecipeDependencies(options) {
29
+ const maxDepth = options.maxDepth ?? DEFAULT_MAX_RECIPE_CALL_DEPTH;
30
+ const resolved = new Map();
31
+ const edges = [];
32
+ const visiting = [];
33
+ const visited = new Set();
34
+ const visit = (from, document, depth) => {
35
+ if (depth >= maxDepth) {
36
+ throw new RecipeResolutionError('RECIPE_CALL_DEPTH_EXCEEDED', `Recipe call depth exceeded maximum ${maxDepth}.`, `reduce nested recipe calls below ${maxDepth}`);
37
+ }
38
+ for (const ref of callRefs(document)) {
39
+ edges.push({ from, to: ref });
40
+ const cycleStart = visiting.indexOf(ref);
41
+ if (cycleStart >= 0 || ref === options.rootRef) {
42
+ const cycle = [...visiting.slice(Math.max(cycleStart, 0)), ref];
43
+ throw new RecipeResolutionError('RECIPE_CALL_CYCLE', `Recipe call cycle detected: ${cycle.join(' -> ')}.`, 'remove one call edge so the recipe dependency graph is acyclic');
44
+ }
45
+ const dependency = options.recipes.get(ref);
46
+ if (!dependency) {
47
+ throw new RecipeResolutionError('RECIPE_REFERENCE_NOT_FOUND', `Recipe ${ref} is not available from configured libraries.`, `add ${ref} to a configured recipe library or correct call.ref`);
48
+ }
49
+ resolved.set(ref, dependency);
50
+ if (visited.has(ref))
51
+ continue;
52
+ visiting.push(ref);
53
+ visit(ref, dependency.document, depth + 1);
54
+ visiting.pop();
55
+ visited.add(ref);
56
+ }
57
+ };
58
+ visiting.push(options.rootRef);
59
+ visit(options.rootRef, options.root, 0);
60
+ visiting.pop();
61
+ const rootDigest = options.rootSource.digest;
62
+ if (!rootDigest) {
63
+ throw new RecipeResolutionError('RECIPE_RESOLUTION_DIGEST_MISSING', 'Resolved root recipe source is missing its content digest.', 'reload the root recipe through the runner so its digest is computed');
64
+ }
65
+ const dependencies = [...resolved.values()]
66
+ .sort((left, right) => compareStrings(left.ref, right.ref))
67
+ .map((recipe) => {
68
+ const digest = recipe.provenance.digest;
69
+ if (!digest) {
70
+ throw new RecipeResolutionError('RECIPE_RESOLUTION_DIGEST_MISSING', `Resolved recipe ${recipe.ref} is missing its content digest.`, `reload ${recipe.ref} through the library resolver so its digest is computed`);
71
+ }
72
+ return {
73
+ ref: recipe.ref,
74
+ source: recipe.source,
75
+ file: recipe.file,
76
+ digest,
77
+ artifact: resolvedRecipeArtifactPath(digest),
78
+ ...(recipe.adapter ? { adapter: recipe.adapter } : {}),
79
+ };
80
+ });
81
+ return {
82
+ recipes: resolved,
83
+ edges,
84
+ document: {
85
+ schema_version: 1,
86
+ root: { ref: options.rootRef, digest: rootDigest },
87
+ dependencies,
88
+ edges: [...edges].sort((left, right) => compareStrings(`${left.from}:${left.to}`, `${right.from}:${right.to}`)),
89
+ },
90
+ };
91
+ }
92
+ function compareStrings(left, right) {
93
+ return left < right ? -1 : left > right ? 1 : 0;
94
+ }
95
+ function callRefs(recipe) {
96
+ const refs = [];
97
+ for (const node of Object.values(extractWorkflowGraph(recipe).nodes)) {
98
+ if (node.action === 'call' && typeof node.ref === 'string' && node.ref.trim()) {
99
+ refs.push(normalizeRecipeRef(node.ref));
100
+ }
101
+ }
102
+ return refs;
103
+ }
104
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/core/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type RecipeActionManifestDocument, type RecipeFailureCause } from '@farmslot/protocol';
2
+ import type { ResolvedLibraryRecipe } from './library.js';
3
+ import { type DefaultObserverRefs } from './passive-observations.js';
4
+ import type { ActionAdapter, ActionExecutionContext, ActionResult, RecipeLogger, RecipeRunStatus, TraceWriter } from './types.js';
5
+ export declare const DEFAULT_MAX_RECIPE_CALL_DEPTH = 8;
6
+ type HudPublisher = (status: 'running' | 'pass' | 'fail', event: {
7
+ nodeId: string;
8
+ action: string;
9
+ node: Record<string, unknown>;
10
+ recipe: unknown;
11
+ index: number;
12
+ total: number;
13
+ context: ActionExecutionContext;
14
+ error?: string;
15
+ }) => Promise<boolean>;
16
+ export interface ExecuteRecipeOptions {
17
+ ref: string;
18
+ adapter?: string;
19
+ recipe: Record<string, unknown>;
20
+ params: Record<string, unknown>;
21
+ prefix?: string;
22
+ callStack?: readonly string[];
23
+ maxCallDepth?: number;
24
+ recipes: ReadonlyMap<string, ResolvedLibraryRecipe>;
25
+ actionManifest: RecipeActionManifestDocument;
26
+ adapters: ReadonlyMap<string, ActionAdapter>;
27
+ traceWriter: TraceWriter;
28
+ logger: RecipeLogger;
29
+ defaultObserverRefs: DefaultObserverRefs;
30
+ createContext(nodeId: string, recipe: unknown, outputs: ReadonlyMap<string, unknown>, getOutput: (nodeId: string) => unknown): ActionExecutionContext;
31
+ registerArtifacts(artifacts: NonNullable<ActionResult['artifacts']>): void;
32
+ publishHudProgress?: HudPublisher;
33
+ /** Root-graph partial execution: stop after this node passes, then run teardown. */
34
+ stopAfterNode?: string;
35
+ }
36
+ export interface ExecuteRecipeResult {
37
+ status: RecipeRunStatus;
38
+ failureCause?: RecipeFailureCause;
39
+ output: Record<string, unknown>;
40
+ outputs: ReadonlyMap<string, unknown>;
41
+ }
42
+ export declare function executeRecipe(options: ExecuteRecipeOptions): Promise<ExecuteRecipeResult>;
43
+ export {};
44
+ //# sourceMappingURL=execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/core/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EACL,KAAK,mBAAmB,EAIzB,MAAM,2BAA2B,CAAC;AAInC,OAAO,KAAK,EACV,aAAa,EACb,sBAAsB,EACtB,YAAY,EAEZ,YAAY,EACZ,eAAe,EACf,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,KAAK,YAAY,GAAG,CAClB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EACnC,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,sBAAsB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KACE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACpD,cAAc,EAAE,4BAA4B,CAAC;IAC7C,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC7C,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,aAAa,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GACrC,sBAAsB,CAAC;IAC1B,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3E,kBAAkB,CAAC,EAAE,YAAY,CAAC;IAClC,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsS/F"}