@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,147 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import { lstat, mkdir, open, realpath } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { pipeline } from 'node:stream/promises';
6
+ import { normalizeRelativePath } from './json.js';
7
+ export function isPathWithin(root, candidate) {
8
+ const relative = path.relative(root, candidate);
9
+ return (relative === '' ||
10
+ (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative)));
11
+ }
12
+ export async function readFileWithinRoot(root, relativePath) {
13
+ const handle = await openExistingFileWithinRoot(root, relativePath);
14
+ try {
15
+ return await handle.readFile();
16
+ }
17
+ finally {
18
+ await handle.close();
19
+ }
20
+ }
21
+ export async function digestFileWithinRoot(root, relativePath) {
22
+ const handle = await openExistingFileWithinRoot(root, relativePath);
23
+ try {
24
+ const hash = createHash('sha256');
25
+ for await (const bytes of handle.createReadStream({ autoClose: false }))
26
+ hash.update(bytes);
27
+ return `sha256:${hash.digest('hex')}`;
28
+ }
29
+ finally {
30
+ await handle.close();
31
+ }
32
+ }
33
+ export async function statFileWithinRoot(root, relativePath) {
34
+ const handle = await openExistingFileWithinRoot(root, relativePath);
35
+ try {
36
+ return await handle.stat();
37
+ }
38
+ finally {
39
+ await handle.close();
40
+ }
41
+ }
42
+ export async function writeFileWithinRoot(root, relativePath, data) {
43
+ const { handle, path: outputPath } = await openOutputFileWithinRoot(root, relativePath);
44
+ try {
45
+ await handle.writeFile(data);
46
+ }
47
+ finally {
48
+ await handle.close();
49
+ }
50
+ return outputPath;
51
+ }
52
+ export async function copyFileWithinRoots(sourceRoot, sourceRelativePath, destinationRoot, destinationRelativePath) {
53
+ const [sourceRootReal, destinationRootReal] = await Promise.all([
54
+ realpath(sourceRoot),
55
+ realpath(destinationRoot),
56
+ ]);
57
+ if (sourceRootReal === destinationRootReal &&
58
+ normalizeRelativePath(sourceRelativePath) === normalizeRelativePath(destinationRelativePath)) {
59
+ throw new Error(`Source and destination must be different files: ${sourceRelativePath}.`);
60
+ }
61
+ let source;
62
+ let destination;
63
+ try {
64
+ source = await openExistingFileWithinRoot(sourceRoot, sourceRelativePath);
65
+ destination = await openOutputFileWithinRoot(destinationRoot, destinationRelativePath);
66
+ await pipeline(source.createReadStream(), destination.handle.createWriteStream());
67
+ return destination.path;
68
+ }
69
+ finally {
70
+ await Promise.allSettled([
71
+ ...(source ? [source.close()] : []),
72
+ ...(destination ? [destination.handle.close()] : []),
73
+ ]);
74
+ }
75
+ }
76
+ async function openExistingFileWithinRoot(root, relativePath) {
77
+ const rootReal = await realpath(root);
78
+ const candidateReal = await realpath(path.join(root, normalizeRelativePath(relativePath)));
79
+ assertContained(rootReal, candidateReal, relativePath);
80
+ return open(candidateReal, constants.O_RDONLY | constants.O_NOFOLLOW);
81
+ }
82
+ async function openOutputFileWithinRoot(root, relativePath) {
83
+ const normalized = normalizeRelativePath(relativePath);
84
+ const rootReal = await realpath(root);
85
+ const parentReal = await ensureContainedDirectory(rootReal, path.dirname(normalized), relativePath);
86
+ const outputPath = path.join(parentReal, path.basename(normalized));
87
+ // A hostile same-user process can still swap an already-checked parent; closing
88
+ // that race requires directory-fd/openat isolation beyond this accidental-use guard.
89
+ try {
90
+ const existing = await lstat(outputPath);
91
+ if (existing.isSymbolicLink()) {
92
+ throw new Error(`Path ${relativePath} must not resolve through a symbolic link.`);
93
+ }
94
+ }
95
+ catch (error) {
96
+ if (!isMissing(error))
97
+ throw error;
98
+ }
99
+ return {
100
+ path: outputPath,
101
+ handle: await open(outputPath, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW, 0o600),
102
+ };
103
+ }
104
+ async function ensureContainedDirectory(rootReal, relativeDirectory, displayPath) {
105
+ let current = rootReal;
106
+ const components = relativeDirectory === '.' ? [] : relativeDirectory.split(path.sep);
107
+ for (const component of components) {
108
+ const candidate = path.join(current, component);
109
+ try {
110
+ const info = await lstat(candidate);
111
+ if (!info.isDirectory() && !info.isSymbolicLink()) {
112
+ throw new Error(`Path ${displayPath} has a non-directory parent component.`);
113
+ }
114
+ }
115
+ catch (error) {
116
+ if (!isMissing(error))
117
+ throw error;
118
+ try {
119
+ await mkdir(candidate, { mode: 0o700 });
120
+ }
121
+ catch (mkdirError) {
122
+ if (!isAlreadyExists(mkdirError))
123
+ throw mkdirError;
124
+ }
125
+ }
126
+ const resolved = await realpath(candidate);
127
+ assertContained(rootReal, resolved, displayPath);
128
+ const resolvedInfo = await lstat(resolved);
129
+ if (!resolvedInfo.isDirectory()) {
130
+ throw new Error(`Path ${displayPath} has a non-directory parent component.`);
131
+ }
132
+ current = resolved;
133
+ }
134
+ return current;
135
+ }
136
+ function assertContained(root, candidate, relativePath) {
137
+ if (!isPathWithin(root, candidate)) {
138
+ throw new Error(`Path ${relativePath} resolves outside its root.`);
139
+ }
140
+ }
141
+ function isMissing(error) {
142
+ return Boolean(error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT');
143
+ }
144
+ function isAlreadyExists(error) {
145
+ return Boolean(error && typeof error === 'object' && 'code' in error && error.code === 'EEXIST');
146
+ }
147
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/core/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ActiveVideoRecording, RecipeLogger } from './types.js';
2
+ interface AbortedRunVideoRecording {
3
+ recording: ActiveVideoRecording;
4
+ outputPath: string;
5
+ stagingRoot?: string;
6
+ }
7
+ export declare function cleanupAbortedRunVideoRecording(runRecording: AbortedRunVideoRecording, logger: RecipeLogger): Promise<void>;
8
+ export declare function removePartialRunVideoOutput(outputPath: string, logger: RecipeLogger): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=recording-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-cleanup.d.ts","sourceRoot":"","sources":["../../src/core/recording-cleanup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAErE,UAAU,wBAAwB;IAChC,SAAS,EAAE,oBAAoB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAsB,+BAA+B,CACnD,YAAY,EAAE,wBAAwB,EACtC,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CASf"}
@@ -0,0 +1,32 @@
1
+ import { rm } from 'node:fs/promises';
2
+ function cleanupErrorMessage(error) {
3
+ return error instanceof Error ? error.message : String(error);
4
+ }
5
+ export async function cleanupAbortedRunVideoRecording(runRecording, logger) {
6
+ try {
7
+ await runRecording.recording.stop();
8
+ }
9
+ catch (error) {
10
+ // Preserve the original run error while still surfacing cleanup failure evidence.
11
+ logger.error(`record.video cleanup failed after run abort: ${cleanupErrorMessage(error)}`);
12
+ }
13
+ await removePartialRunVideoOutput(runRecording.outputPath, logger);
14
+ if (runRecording.stagingRoot) {
15
+ try {
16
+ await rm(runRecording.stagingRoot, { recursive: true, force: true });
17
+ }
18
+ catch (error) {
19
+ logger.error(`record.video cleanup could not remove staging directory: ${cleanupErrorMessage(error)}`);
20
+ }
21
+ }
22
+ }
23
+ export async function removePartialRunVideoOutput(outputPath, logger) {
24
+ try {
25
+ await rm(outputPath, { force: true });
26
+ }
27
+ catch (error) {
28
+ // Preserve the original run error while still surfacing cleanup failure evidence.
29
+ logger.error(`record.video cleanup could not remove partial video: ${cleanupErrorMessage(error)}`);
30
+ }
31
+ }
32
+ //# sourceMappingURL=recording-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-cleanup.js","sourceRoot":"","sources":["../../src/core/recording-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAUtC,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,YAAsC,EACtC,MAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kFAAkF;QAClF,MAAM,CAAC,KAAK,CAAC,gDAAgD,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,2BAA2B,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnE,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,4DAA4D,mBAAmB,CAAC,KAAK,CAAC,EAAE,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,UAAkB,EAClB,MAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kFAAkF;QAClF,MAAM,CAAC,KAAK,CACV,wDAAwD,mBAAmB,CAAC,KAAK,CAAC,EAAE,CACrF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type RecipeResolutionErrorCode = 'RECIPE_CALL_CYCLE' | 'RECIPE_CALL_DEPTH_EXCEEDED' | 'RECIPE_LIBRARY_ADAPTER_DECLARATION_CONFLICT' | 'RECIPE_LIBRARY_DUPLICATE_RECIPE' | 'RECIPE_LIBRARY_DUPLICATE_SOURCE' | 'RECIPE_LIBRARY_MANIFEST_INVALID' | 'RECIPE_LIBRARY_PATH_INVALID' | 'RECIPE_LIBRARY_REQUIREMENT_UNSATISFIED' | 'RECIPE_LIBRARY_RECIPE_INVALID' | 'RECIPE_PARAMS_INVALID' | 'RECIPE_PRECONDITION_NOT_FOUND' | 'RECIPE_REFERENCE_NOT_FOUND' | 'RECIPE_RESOLUTION_DIGEST_MISSING' | 'RECIPE_STOP_AFTER_NODE_INVALID';
2
+ export declare class RecipeResolutionError extends Error {
3
+ readonly code: RecipeResolutionErrorCode;
4
+ readonly userAction: string;
5
+ constructor(code: RecipeResolutionErrorCode, message: string, userAction: string);
6
+ }
7
+ //# sourceMappingURL=resolution-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution-error.d.ts","sourceRoot":"","sources":["../../src/core/resolution-error.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GACjC,mBAAmB,GACnB,4BAA4B,GAC5B,6CAA6C,GAC7C,iCAAiC,GACjC,iCAAiC,GACjC,iCAAiC,GACjC,6BAA6B,GAC7B,wCAAwC,GACxC,+BAA+B,GAC/B,uBAAuB,GACvB,+BAA+B,GAC/B,4BAA4B,GAC5B,kCAAkC,GAClC,gCAAgC,CAAC;AAErC,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAMjF"}
@@ -0,0 +1,9 @@
1
+ export class RecipeResolutionError extends Error {
2
+ constructor(code, message, userAction) {
3
+ super(message);
4
+ this.name = 'RecipeResolutionError';
5
+ this.code = code;
6
+ this.userAction = userAction;
7
+ }
8
+ }
9
+ //# sourceMappingURL=resolution-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution-error.js","sourceRoot":"","sources":["../../src/core/resolution-error.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAI9C,YAAY,IAA+B,EAAE,OAAe,EAAE,UAAkB;QAC9E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { ActionAdapter, CreateRecipeRunnerOptions, RecipeRunner } from './types.js';
2
+ export declare function defineActionAdapter(adapter: ActionAdapter): ActionAdapter;
3
+ export declare function createRecipeRunner(options: CreateRecipeRunnerOptions): RecipeRunner;
4
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAwDA,OAAO,KAAK,EACV,aAAa,EAEb,yBAAyB,EAKzB,YAAY,EAOb,MAAM,YAAY,CAAC;AA0BpB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAGzE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,YAAY,CAiCnF"}