@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.
- package/CHANGELOG.md +255 -0
- package/LICENSE +21 -0
- package/README.md +274 -0
- package/bin/farmslot-visual-review.mjs +152 -0
- package/dist/adapters/app-lifecycle.d.ts +41 -0
- package/dist/adapters/app-lifecycle.d.ts.map +1 -0
- package/dist/adapters/app-lifecycle.js +224 -0
- package/dist/adapters/app-lifecycle.js.map +1 -0
- package/dist/adapters/core.d.ts +5 -0
- package/dist/adapters/core.d.ts.map +1 -0
- package/dist/adapters/core.js +433 -0
- package/dist/adapters/core.js.map +1 -0
- package/dist/adapters/gesture.d.ts +12 -0
- package/dist/adapters/gesture.d.ts.map +1 -0
- package/dist/adapters/gesture.js +76 -0
- package/dist/adapters/gesture.js.map +1 -0
- package/dist/adapters/ui.d.ts +33 -0
- package/dist/adapters/ui.d.ts.map +1 -0
- package/dist/adapters/ui.js +130 -0
- package/dist/adapters/ui.js.map +1 -0
- package/dist/cli/error-output.d.ts +6 -0
- package/dist/cli/error-output.d.ts.map +1 -0
- package/dist/cli/error-output.js +19 -0
- package/dist/cli/error-output.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/run-command.d.ts +8 -0
- package/dist/cli/run-command.d.ts.map +1 -0
- package/dist/cli/run-command.js +253 -0
- package/dist/cli/run-command.js.map +1 -0
- package/dist/cli/support.d.ts +31 -0
- package/dist/cli/support.d.ts.map +1 -0
- package/dist/cli/support.js +297 -0
- package/dist/cli/support.js.map +1 -0
- package/dist/cli/validate-command.d.ts +4 -0
- package/dist/cli/validate-command.d.ts.map +1 -0
- package/dist/cli/validate-command.js +52 -0
- package/dist/cli/validate-command.js.map +1 -0
- package/dist/core/compose.d.ts +23 -0
- package/dist/core/compose.d.ts.map +1 -0
- package/dist/core/compose.js +104 -0
- package/dist/core/compose.js.map +1 -0
- package/dist/core/execution.d.ts +44 -0
- package/dist/core/execution.d.ts.map +1 -0
- package/dist/core/execution.js +304 -0
- package/dist/core/execution.js.map +1 -0
- package/dist/core/failure.d.ts +23 -0
- package/dist/core/failure.d.ts.map +1 -0
- package/dist/core/failure.js +43 -0
- package/dist/core/failure.js.map +1 -0
- package/dist/core/graph.d.ts +12 -0
- package/dist/core/graph.d.ts.map +1 -0
- package/dist/core/graph.js +65 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/hud.d.ts +11 -0
- package/dist/core/hud.d.ts.map +1 -0
- package/dist/core/hud.js +120 -0
- package/dist/core/hud.js.map +1 -0
- package/dist/core/invocation.d.ts +13 -0
- package/dist/core/invocation.d.ts.map +1 -0
- package/dist/core/invocation.js +68 -0
- package/dist/core/invocation.js.map +1 -0
- package/dist/core/json.d.ts +9 -0
- package/dist/core/json.d.ts.map +1 -0
- package/dist/core/json.js +74 -0
- package/dist/core/json.js.map +1 -0
- package/dist/core/library-manifest.d.ts +53 -0
- package/dist/core/library-manifest.d.ts.map +1 -0
- package/dist/core/library-manifest.js +263 -0
- package/dist/core/library-manifest.js.map +1 -0
- package/dist/core/library.d.ts +80 -0
- package/dist/core/library.d.ts.map +1 -0
- package/dist/core/library.js +321 -0
- package/dist/core/library.js.map +1 -0
- package/dist/core/parameters.d.ts +5 -0
- package/dist/core/parameters.d.ts.map +1 -0
- package/dist/core/parameters.js +57 -0
- package/dist/core/parameters.js.map +1 -0
- package/dist/core/passive-observations.d.ts +25 -0
- package/dist/core/passive-observations.d.ts.map +1 -0
- package/dist/core/passive-observations.js +62 -0
- package/dist/core/passive-observations.js.map +1 -0
- package/dist/core/path.d.ts +7 -0
- package/dist/core/path.d.ts.map +1 -0
- package/dist/core/path.js +147 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/recording-cleanup.d.ts +10 -0
- package/dist/core/recording-cleanup.d.ts.map +1 -0
- package/dist/core/recording-cleanup.js +32 -0
- package/dist/core/recording-cleanup.js.map +1 -0
- package/dist/core/resolution-error.d.ts +7 -0
- package/dist/core/resolution-error.d.ts.map +1 -0
- package/dist/core/resolution-error.js +9 -0
- package/dist/core/resolution-error.js.map +1 -0
- package/dist/core/runner.d.ts +4 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +738 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/scroll-to.d.ts +111 -0
- package/dist/core/scroll-to.d.ts.map +1 -0
- package/dist/core/scroll-to.js +353 -0
- package/dist/core/scroll-to.js.map +1 -0
- package/dist/core/suite.d.ts +25 -0
- package/dist/core/suite.d.ts.map +1 -0
- package/dist/core/suite.js +76 -0
- package/dist/core/suite.js.map +1 -0
- package/dist/core/trace.d.ts +5 -0
- package/dist/core/trace.d.ts.map +1 -0
- package/dist/core/trace.js +25 -0
- package/dist/core/trace.js.map +1 -0
- package/dist/core/trust-error.d.ts +9 -0
- package/dist/core/trust-error.d.ts.map +1 -0
- package/dist/core/trust-error.js +18 -0
- package/dist/core/trust-error.js.map +1 -0
- package/dist/core/trust-input.d.ts +20 -0
- package/dist/core/trust-input.d.ts.map +1 -0
- package/dist/core/trust-input.js +68 -0
- package/dist/core/trust-input.js.map +1 -0
- package/dist/core/trust.d.ts +28 -0
- package/dist/core/trust.d.ts.map +1 -0
- package/dist/core/trust.js +284 -0
- package/dist/core/trust.js.map +1 -0
- package/dist/core/types.d.ts +319 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validation.d.ts +4 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +18 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/node/writers.d.ts +27 -0
- package/dist/node/writers.d.ts.map +1 -0
- package/dist/node/writers.js +99 -0
- package/dist/node/writers.js.map +1 -0
- package/dist/recording/android-mirror.d.ts +10 -0
- package/dist/recording/android-mirror.d.ts.map +1 -0
- package/dist/recording/android-mirror.js +180 -0
- package/dist/recording/android-mirror.js.map +1 -0
- package/dist/recording/capture-helper-timing.d.ts +4 -0
- package/dist/recording/capture-helper-timing.d.ts.map +1 -0
- package/dist/recording/capture-helper-timing.js +47 -0
- package/dist/recording/capture-helper-timing.js.map +1 -0
- package/dist/recording/capture-helper.d.ts +10 -0
- package/dist/recording/capture-helper.d.ts.map +1 -0
- package/dist/recording/capture-helper.js +335 -0
- package/dist/recording/capture-helper.js.map +1 -0
- package/dist/recording/cdp-video-recorder.d.ts +9 -0
- package/dist/recording/cdp-video-recorder.d.ts.map +1 -0
- package/dist/recording/cdp-video-recorder.js +319 -0
- package/dist/recording/cdp-video-recorder.js.map +1 -0
- package/dist/recording/frame-sampler.d.ts +19 -0
- package/dist/recording/frame-sampler.d.ts.map +1 -0
- package/dist/recording/frame-sampler.js +29 -0
- package/dist/recording/frame-sampler.js.map +1 -0
- package/dist/recording/timeline.d.ts +15 -0
- package/dist/recording/timeline.d.ts.map +1 -0
- package/dist/recording/timeline.js +88 -0
- package/dist/recording/timeline.js.map +1 -0
- package/dist/runtime/browser-extension.d.ts +17 -0
- package/dist/runtime/browser-extension.d.ts.map +1 -0
- package/dist/runtime/browser-extension.js +42 -0
- package/dist/runtime/browser-extension.js.map +1 -0
- package/dist/runtime/cdp.d.ts +138 -0
- package/dist/runtime/cdp.d.ts.map +1 -0
- package/dist/runtime/cdp.js +1429 -0
- package/dist/runtime/cdp.js.map +1 -0
- package/dist/runtime/decision-types.d.ts +23 -0
- package/dist/runtime/decision-types.d.ts.map +1 -0
- package/dist/runtime/decision-types.js +2 -0
- package/dist/runtime/decision-types.js.map +1 -0
- package/dist/runtime/deps-readiness.d.ts +21 -0
- package/dist/runtime/deps-readiness.d.ts.map +1 -0
- package/dist/runtime/deps-readiness.js +141 -0
- package/dist/runtime/deps-readiness.js.map +1 -0
- package/dist/runtime/log-analysis.d.ts +48 -0
- package/dist/runtime/log-analysis.d.ts.map +1 -0
- package/dist/runtime/log-analysis.js +128 -0
- package/dist/runtime/log-analysis.js.map +1 -0
- package/dist/runtime/metro-probe.d.ts +5 -0
- package/dist/runtime/metro-probe.d.ts.map +1 -0
- package/dist/runtime/metro-probe.js +24 -0
- package/dist/runtime/metro-probe.js.map +1 -0
- package/dist/runtime/operation.d.ts +32 -0
- package/dist/runtime/operation.d.ts.map +1 -0
- package/dist/runtime/operation.js +184 -0
- package/dist/runtime/operation.js.map +1 -0
- package/dist/runtime/orchestrate-up.d.ts +22 -0
- package/dist/runtime/orchestrate-up.d.ts.map +1 -0
- package/dist/runtime/orchestrate-up.js +35 -0
- package/dist/runtime/orchestrate-up.js.map +1 -0
- package/dist/runtime/react-native-bridge.d.ts +17 -0
- package/dist/runtime/react-native-bridge.d.ts.map +1 -0
- package/dist/runtime/react-native-bridge.js +57 -0
- package/dist/runtime/react-native-bridge.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/package.json +163 -0
- package/test/fixtures/scroll-to-visible/README.md +39 -0
- package/visual-review/feedback-draft.mjs +82 -0
- package/visual-review/index.d.mts +41 -0
- package/visual-review/index.mjs +4 -0
- package/visual-review/recipe-board.mjs +142 -0
- package/visual-review/review-board.mjs +981 -0
- package/visual-review/server.mjs +69 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { readFile, realpath, stat } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { digestRecipeDocument, validateRecipeDocument, } from '@farmslot/protocol';
|
|
5
|
+
import { farmslotHome } from '@farmslot/protocol/node/farmslot-home';
|
|
6
|
+
import { isRecord } from './json.js';
|
|
7
|
+
import { checkRecipeLibraryRequirements, libraryRootReal, listLibraryFiles, readRecipeLibraryManifest, } from './library-manifest.js';
|
|
8
|
+
import { isPathWithin } from './path.js';
|
|
9
|
+
import { RecipeResolutionError } from './resolution-error.js';
|
|
10
|
+
import { invalidRecipeSource } from './trust-error.js';
|
|
11
|
+
const LIBRARY_RECIPES_DIR = 'recipes';
|
|
12
|
+
const RECIPE_FILE_SUFFIX = '.recipe.json';
|
|
13
|
+
/** Platforms whose variant folders every library recognizes without declaring them. */
|
|
14
|
+
export const BUILT_IN_RECIPE_PLATFORMS = ['core', 'extension', 'mobile'];
|
|
15
|
+
/** Platform variant folders a library recognizes: the built-in set plus its declared platforms. */
|
|
16
|
+
export async function listRecipeLibraryPlatforms(root) {
|
|
17
|
+
const manifest = await readRecipeLibraryManifest(root);
|
|
18
|
+
return [...new Set([...BUILT_IN_RECIPE_PLATFORMS, ...(manifest?.platforms ?? [])])].sort();
|
|
19
|
+
}
|
|
20
|
+
function libraryAdapters(manifest, active) {
|
|
21
|
+
const adapters = new Set([...BUILT_IN_RECIPE_PLATFORMS, ...(manifest?.platforms ?? [])]);
|
|
22
|
+
if (active)
|
|
23
|
+
adapters.add(active);
|
|
24
|
+
return adapters;
|
|
25
|
+
}
|
|
26
|
+
const BUILT_IN_PLATFORM_SET = new Set(BUILT_IN_RECIPE_PLATFORMS);
|
|
27
|
+
export function parseRecipeLibraryPath(value) {
|
|
28
|
+
return value
|
|
29
|
+
.split(':')
|
|
30
|
+
.map((entry) => entry.trim())
|
|
31
|
+
.filter(Boolean)
|
|
32
|
+
.map((entry) => {
|
|
33
|
+
const separator = entry.indexOf('=');
|
|
34
|
+
if (separator < 0)
|
|
35
|
+
return { root: expandTilde(entry) };
|
|
36
|
+
const name = entry.slice(0, separator).trim();
|
|
37
|
+
const root = entry.slice(separator + 1).trim();
|
|
38
|
+
if (!name || !root) {
|
|
39
|
+
throw new RecipeResolutionError('RECIPE_LIBRARY_PATH_INVALID', `Recipe library entry ${JSON.stringify(entry)} must be name=path or path.`, 'pass --library name=path (or a bare path), and check RECIPE_LIBRARY_PATH entries');
|
|
40
|
+
}
|
|
41
|
+
return { name, root: expandTilde(root) };
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export function personalRecipeLibraryRoot(env = process.env) {
|
|
45
|
+
return path.join(farmslotHome(env), 'recipe-library');
|
|
46
|
+
}
|
|
47
|
+
export async function defaultRecipeLibrarySources(env = process.env) {
|
|
48
|
+
const personalRoot = personalRecipeLibraryRoot(env);
|
|
49
|
+
if (!(await isDirectory(personalRoot)))
|
|
50
|
+
return [];
|
|
51
|
+
return [{ name: 'personal', root: personalRoot }];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Ordered library sources: --library entries, then RECIPE_LIBRARY_PATH, or the personal
|
|
55
|
+
* library when neither is set. A --library entry replaces the RECIPE_LIBRARY_PATH entry
|
|
56
|
+
* with the same name instead of conflicting with it.
|
|
57
|
+
*/
|
|
58
|
+
export async function resolveRecipeLibrarySources(options) {
|
|
59
|
+
const env = options?.env ?? process.env;
|
|
60
|
+
const flagged = (options?.cliEntries ?? [])
|
|
61
|
+
.flatMap((entry) => parseRecipeLibraryPath(entry))
|
|
62
|
+
.map((source) => ({ ...source, origin: 'flag' }));
|
|
63
|
+
const flaggedByName = new Map(flagged.map((source) => [librarySourceName(source), source]));
|
|
64
|
+
const environment = env.RECIPE_LIBRARY_PATH
|
|
65
|
+
? parseRecipeLibraryPath(env.RECIPE_LIBRARY_PATH).flatMap((source) => {
|
|
66
|
+
const override = flaggedByName.get(librarySourceName(source));
|
|
67
|
+
if (!override)
|
|
68
|
+
return [{ ...source, origin: 'env' }];
|
|
69
|
+
override.overrides = source.root;
|
|
70
|
+
return [];
|
|
71
|
+
})
|
|
72
|
+
: [];
|
|
73
|
+
const explicit = [...flagged, ...environment];
|
|
74
|
+
const configured = explicit.length > 0
|
|
75
|
+
? explicit
|
|
76
|
+
: (await defaultRecipeLibrarySources(env)).map((source) => ({
|
|
77
|
+
...source,
|
|
78
|
+
origin: 'default',
|
|
79
|
+
}));
|
|
80
|
+
if (!options?.recipePath)
|
|
81
|
+
return configured;
|
|
82
|
+
const recipeDir = path.dirname(path.resolve(options.recipePath));
|
|
83
|
+
const taskDir = path.basename(recipeDir) === 'resolved-recipes' ? path.dirname(recipeDir) : recipeDir;
|
|
84
|
+
const taskRoot = path.join(taskDir, 'recipe-library');
|
|
85
|
+
if (!(await isDirectory(taskRoot)))
|
|
86
|
+
return configured;
|
|
87
|
+
if (configured.some((source) => path.resolve(source.root) === taskRoot))
|
|
88
|
+
return configured;
|
|
89
|
+
return [
|
|
90
|
+
{
|
|
91
|
+
name: 'task-local',
|
|
92
|
+
root: taskRoot,
|
|
93
|
+
origin: 'task',
|
|
94
|
+
provenance: { kind: 'task', trust: 'unknown', name: 'task-local' },
|
|
95
|
+
},
|
|
96
|
+
...configured,
|
|
97
|
+
];
|
|
98
|
+
}
|
|
99
|
+
function librarySourceName(source) {
|
|
100
|
+
return source.name ?? path.basename(path.resolve(source.root));
|
|
101
|
+
}
|
|
102
|
+
export function applyTaskLocalInvocationTrust(sources, invocationTrust) {
|
|
103
|
+
return sources.map((source) => source.name === 'task-local'
|
|
104
|
+
? {
|
|
105
|
+
...source,
|
|
106
|
+
provenance: { ...source.provenance, kind: 'task', trust: invocationTrust },
|
|
107
|
+
}
|
|
108
|
+
: source);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Load ordered library sources into one recipe index. The first source wins;
|
|
112
|
+
* within one source an exact adapter variant wins over the generic recipe.
|
|
113
|
+
*/
|
|
114
|
+
export async function loadRecipeLibraries(sources, options) {
|
|
115
|
+
const loadedSources = [];
|
|
116
|
+
const recipes = new Map();
|
|
117
|
+
const qualified = new Map();
|
|
118
|
+
const seenNames = new Set();
|
|
119
|
+
for (const source of sources) {
|
|
120
|
+
const root = path.resolve(expandTilde(source.root));
|
|
121
|
+
const rootReal = await libraryRootReal(root);
|
|
122
|
+
const name = librarySourceName(source);
|
|
123
|
+
const sourceProvenance = source.provenance ?? {
|
|
124
|
+
kind: 'library',
|
|
125
|
+
trust: 'unknown',
|
|
126
|
+
name,
|
|
127
|
+
path: root,
|
|
128
|
+
};
|
|
129
|
+
if (seenNames.has(name)) {
|
|
130
|
+
throw new RecipeResolutionError('RECIPE_LIBRARY_DUPLICATE_SOURCE', `Recipe library source ${name} is configured more than once.`, `assign distinct name=/path aliases or remove one ${name} source`);
|
|
131
|
+
}
|
|
132
|
+
seenNames.add(name);
|
|
133
|
+
const manifest = await readRecipeLibraryManifest(root);
|
|
134
|
+
checkRecipeLibraryRequirements(name, manifest, options?.packageVersions);
|
|
135
|
+
const selected = new Map();
|
|
136
|
+
const adapters = libraryAdapters(manifest, options?.adapter);
|
|
137
|
+
// Read concurrently, then select in sorted file order so precedence stays deterministic.
|
|
138
|
+
const files = await Promise.all((await listRecipeFiles(root)).map(async (relativeFile) => {
|
|
139
|
+
const identity = recipeIdentity(relativeFile, options?.adapter, adapters);
|
|
140
|
+
if (!identity)
|
|
141
|
+
return undefined;
|
|
142
|
+
const absolutePath = path.join(root, LIBRARY_RECIPES_DIR, relativeFile);
|
|
143
|
+
const fileReal = await realpath(absolutePath);
|
|
144
|
+
if (!isPathWithin(rootReal, fileReal)) {
|
|
145
|
+
throw invalidRecipeSource(`Library recipe ${path.join(LIBRARY_RECIPES_DIR, relativeFile)} resolves outside its library root.`, 'move the recipe inside the library root or remove the escaping symlink');
|
|
146
|
+
}
|
|
147
|
+
return { relativeFile, identity, fileReal, document: await readLibraryRecipe(fileReal) };
|
|
148
|
+
}));
|
|
149
|
+
for (const file of files) {
|
|
150
|
+
if (!file)
|
|
151
|
+
continue;
|
|
152
|
+
const { relativeFile, identity, fileReal, document } = file;
|
|
153
|
+
const previous = selected.get(identity.ref);
|
|
154
|
+
const currentFile = path.join(LIBRARY_RECIPES_DIR, relativeFile).split(path.sep).join('/');
|
|
155
|
+
if (previous && previous.adapter === identity.adapter) {
|
|
156
|
+
throw new RecipeResolutionError('RECIPE_LIBRARY_DUPLICATE_RECIPE', `Recipe ${identity.ref} is declared more than once in library ${name}: ${previous.file} and ${currentFile}.`, `keep one ${identity.ref} recipe per adapter in library ${name}; remove or rename one of the listed files`);
|
|
157
|
+
}
|
|
158
|
+
if (previous && previous.adapter && !identity.adapter)
|
|
159
|
+
continue;
|
|
160
|
+
const digest = digestRecipeDocument(document);
|
|
161
|
+
selected.set(identity.ref, {
|
|
162
|
+
ref: identity.ref,
|
|
163
|
+
document,
|
|
164
|
+
source: name,
|
|
165
|
+
file: currentFile,
|
|
166
|
+
path: fileReal,
|
|
167
|
+
...(identity.adapter ? { adapter: identity.adapter } : {}),
|
|
168
|
+
provenance: { ...sourceProvenance, path: fileReal, digest },
|
|
169
|
+
shadows: [],
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
loadedSources.push({ name, root, recipeCount: selected.size, provenance: sourceProvenance });
|
|
173
|
+
for (const [ref, resolved] of selected) {
|
|
174
|
+
if (resolved.adapter && !BUILT_IN_PLATFORM_SET.has(resolved.adapter)) {
|
|
175
|
+
const alias = `${resolved.adapter}.${ref}`;
|
|
176
|
+
if (!qualified.has(alias))
|
|
177
|
+
qualified.set(alias, { ...resolved, ref: alias, aliasFor: ref });
|
|
178
|
+
}
|
|
179
|
+
const winner = recipes.get(ref);
|
|
180
|
+
if (winner)
|
|
181
|
+
winner.shadows.push(name);
|
|
182
|
+
else
|
|
183
|
+
recipes.set(ref, resolved);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Custom directories previously formed qualified generic IDs. Preserve those
|
|
187
|
+
// references as aliases while offering the same logical ID as built-in adapters.
|
|
188
|
+
for (const [alias, recipe] of qualified)
|
|
189
|
+
if (!recipes.has(alias))
|
|
190
|
+
recipes.set(alias, recipe);
|
|
191
|
+
const resolution = { sources: loadedSources, recipes };
|
|
192
|
+
if (options?.logger)
|
|
193
|
+
logRecipeLibraryResolution(options.logger, resolution);
|
|
194
|
+
return resolution;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Resolve a recipe name the way `run` and discovery both do: a ref or alias in the resolution
|
|
198
|
+
* first, then a namespaced `<library>.<ref>` id against that one library.
|
|
199
|
+
*/
|
|
200
|
+
export async function findLibraryRecipe(name, sources, resolution, options) {
|
|
201
|
+
const direct = resolution.recipes.get(name);
|
|
202
|
+
if (direct)
|
|
203
|
+
return { recipe: direct, resolvedBy: direct.aliasFor ? 'alias' : 'ref' };
|
|
204
|
+
for (const source of sources) {
|
|
205
|
+
const prefix = `${librarySourceName(source)}.`;
|
|
206
|
+
if (!name.startsWith(prefix) || name.length === prefix.length)
|
|
207
|
+
continue;
|
|
208
|
+
const own = options?.load
|
|
209
|
+
? await options.load(source)
|
|
210
|
+
: await loadRecipeLibraries([source], {
|
|
211
|
+
...(options?.adapter ? { adapter: options.adapter } : {}),
|
|
212
|
+
...(options?.packageVersions ? { packageVersions: options.packageVersions } : {}),
|
|
213
|
+
});
|
|
214
|
+
const recipe = own.recipes.get(name.slice(prefix.length));
|
|
215
|
+
if (recipe && !recipe.aliasFor)
|
|
216
|
+
return { recipe, resolvedBy: 'id' };
|
|
217
|
+
}
|
|
218
|
+
return undefined;
|
|
219
|
+
}
|
|
220
|
+
/** Recipe files under recipes/, relative to it, from the shared library walker. */
|
|
221
|
+
export async function listRecipeFiles(root) {
|
|
222
|
+
const prefix = `${LIBRARY_RECIPES_DIR}/`;
|
|
223
|
+
return (await listLibraryFiles(root, LIBRARY_RECIPES_DIR))
|
|
224
|
+
.filter((file) => file.endsWith(RECIPE_FILE_SUFFIX))
|
|
225
|
+
.map((file) => file.slice(prefix.length));
|
|
226
|
+
}
|
|
227
|
+
const validatedRecipes = new Map();
|
|
228
|
+
/** Read and validate one library recipe; validation is cached per process while the file is unchanged. */
|
|
229
|
+
async function readLibraryRecipe(fileReal) {
|
|
230
|
+
const info = await stat(fileReal);
|
|
231
|
+
const cached = validatedRecipes.get(fileReal);
|
|
232
|
+
if (cached && cached.mtimeMs === info.mtimeMs && cached.size === info.size)
|
|
233
|
+
return structuredClone(cached.document);
|
|
234
|
+
let document;
|
|
235
|
+
try {
|
|
236
|
+
document = JSON.parse(await readFile(fileReal, 'utf8'));
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
if (!(error instanceof SyntaxError))
|
|
240
|
+
throw error;
|
|
241
|
+
throw new RecipeResolutionError('RECIPE_LIBRARY_RECIPE_INVALID', `Library recipe ${fileReal} is not valid JSON: ${error.message}.`, `fix ${fileReal} so it validates as Recipe v1`);
|
|
242
|
+
}
|
|
243
|
+
if (!isRecord(document))
|
|
244
|
+
throw new RecipeResolutionError('RECIPE_LIBRARY_RECIPE_INVALID', `Library recipe ${fileReal} must contain a recipe object.`, `fix ${fileReal} so it validates as Recipe v1`);
|
|
245
|
+
const validation = validateRecipeDocument(document, { skipRecipeCallResolution: true });
|
|
246
|
+
if (validation.status === 'invalid') {
|
|
247
|
+
throw new RecipeResolutionError('RECIPE_LIBRARY_RECIPE_INVALID', `Library recipe ${fileReal} is invalid: ${validation.findings
|
|
248
|
+
.map((finding) => `${finding.code} ${finding.path}`)
|
|
249
|
+
.join(', ')}.`, `fix ${fileReal} so it validates as Recipe v1`);
|
|
250
|
+
}
|
|
251
|
+
validatedRecipes.set(fileReal, { mtimeMs: info.mtimeMs, size: info.size, document });
|
|
252
|
+
return structuredClone(document);
|
|
253
|
+
}
|
|
254
|
+
function recipeIdentity(relativeFile, adapter, adapters) {
|
|
255
|
+
const portable = relativeFile.split(path.sep).join('/');
|
|
256
|
+
if (!portable.endsWith(RECIPE_FILE_SUFFIX))
|
|
257
|
+
return undefined;
|
|
258
|
+
const libraryFile = `${LIBRARY_RECIPES_DIR}/${portable}`;
|
|
259
|
+
const base = portable.slice(0, -RECIPE_FILE_SUFFIX.length);
|
|
260
|
+
const firstSeparator = base.indexOf('/');
|
|
261
|
+
const firstDirectory = firstSeparator < 0 ? undefined : base.slice(0, firstSeparator);
|
|
262
|
+
const directoryAdapter = firstDirectory && adapters.has(firstDirectory) ? firstDirectory : undefined;
|
|
263
|
+
const directoryScope = firstDirectory === 'shared' ? firstDirectory : directoryAdapter;
|
|
264
|
+
const suffix = base.slice(base.lastIndexOf('.') + 1);
|
|
265
|
+
const filenameAdapter = BUILT_IN_PLATFORM_SET.has(suffix) ? suffix : undefined;
|
|
266
|
+
if (directoryScope && filenameAdapter) {
|
|
267
|
+
throw new RecipeResolutionError('RECIPE_LIBRARY_ADAPTER_DECLARATION_CONFLICT', `Library recipe ${libraryFile} declares ${directoryScope} scope in its directory and ${filenameAdapter} adapter in its filename.`, 'declare the adapter once using recipes/<adapter>/.../*.recipe.json, or use recipes/shared/.../*.recipe.json without an adapter suffix');
|
|
268
|
+
}
|
|
269
|
+
const declaredAdapter = directoryAdapter ?? filenameAdapter;
|
|
270
|
+
const idPath = directoryScope
|
|
271
|
+
? base.slice(directoryScope.length + 1)
|
|
272
|
+
: filenameAdapter
|
|
273
|
+
? base.slice(0, -(filenameAdapter.length + 1))
|
|
274
|
+
: base;
|
|
275
|
+
if ((directoryScope || declaredAdapter) && !idPath.trim()) {
|
|
276
|
+
throw new RecipeResolutionError('RECIPE_LIBRARY_RECIPE_INVALID', `Library recipe ${libraryFile} declares ${declaredAdapter ? `adapter ${declaredAdapter}` : 'shared scope'} but has no recipe id.`, `move it to recipes/${directoryScope ?? declaredAdapter}/<name>.recipe.json`);
|
|
277
|
+
}
|
|
278
|
+
if (declaredAdapter && declaredAdapter !== adapter)
|
|
279
|
+
return undefined;
|
|
280
|
+
const ref = idPath.replaceAll('/', '.').trim();
|
|
281
|
+
return ref ? { ref, ...(declaredAdapter ? { adapter: declaredAdapter } : {}) } : undefined;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Log the resolved sources and shadowed recipes. With `refs`, only shadows among those refs are
|
|
285
|
+
* reported, so a run does not warn about a winner it never executes.
|
|
286
|
+
*/
|
|
287
|
+
export function logRecipeLibraryResolution(logger, resolution, refs) {
|
|
288
|
+
logRecipeLibrarySources(logger, resolution);
|
|
289
|
+
logRecipeLibraryShadows(logger, resolution, refs);
|
|
290
|
+
}
|
|
291
|
+
/** The `Recipe libraries: …` line; log it as soon as libraries load, before anything can fail. */
|
|
292
|
+
export function logRecipeLibrarySources(logger, resolution) {
|
|
293
|
+
const summary = resolution.sources
|
|
294
|
+
.map((source) => `${source.name}=${source.root} (${source.recipeCount} recipes)`)
|
|
295
|
+
.join(', ');
|
|
296
|
+
logger.info(`Recipe libraries: ${summary || 'none'}`);
|
|
297
|
+
}
|
|
298
|
+
/** Shadow warnings, limited to `refs` when given. */
|
|
299
|
+
export function logRecipeLibraryShadows(logger, resolution, refs) {
|
|
300
|
+
for (const recipe of resolution.recipes.values()) {
|
|
301
|
+
if (recipe.aliasFor || (refs && !refs.has(recipe.ref)))
|
|
302
|
+
continue;
|
|
303
|
+
if (recipe.shadows.length > 0) {
|
|
304
|
+
logger.warn(`Recipe ${recipe.ref} resolves from ${recipe.source} and shadows ${recipe.shadows.join(', ')}.`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async function isDirectory(target) {
|
|
309
|
+
try {
|
|
310
|
+
return (await stat(target)).isDirectory();
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
if (error?.code === 'ENOENT')
|
|
314
|
+
return false;
|
|
315
|
+
throw error;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
function expandTilde(value) {
|
|
319
|
+
return value === '~' || value.startsWith('~/') ? path.join(homedir(), value.slice(1)) : value;
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/core/library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function resolveRecipeParams(ref: string, recipe: Record<string, unknown>, input: Record<string, unknown>, options?: {
|
|
2
|
+
allowTemplates?: boolean;
|
|
3
|
+
}): Record<string, unknown>;
|
|
4
|
+
export declare function resolveRecipeValue(value: unknown, params: Record<string, unknown>, outputs?: ReadonlyMap<string, unknown>): unknown;
|
|
5
|
+
//# sourceMappingURL=parameters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../src/core/parameters.ts"],"names":[],"mappings":"AAKA,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAazB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAoBT"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { applyRecipeParamDefaults, validateRecipeParams } from '@farmslot/protocol';
|
|
2
|
+
import { isRecord } from './json.js';
|
|
3
|
+
import { RecipeResolutionError } from './resolution-error.js';
|
|
4
|
+
export function resolveRecipeParams(ref, recipe, input, options) {
|
|
5
|
+
const params = applyRecipeParamDefaults(input, recipe.paramsSchema);
|
|
6
|
+
const validation = validateRecipeParams(params, recipe.paramsSchema, options);
|
|
7
|
+
if (validation.status === 'invalid') {
|
|
8
|
+
throw new RecipeResolutionError('RECIPE_PARAMS_INVALID', `Recipe ${ref} parameters are invalid: ${validation.findings
|
|
9
|
+
.map((finding) => `${finding.code} ${finding.path}: ${finding.message}`)
|
|
10
|
+
.join('; ')}`, `inspect ${ref} with run --describe, then provide the required key=value parameters`);
|
|
11
|
+
}
|
|
12
|
+
return params;
|
|
13
|
+
}
|
|
14
|
+
export function resolveRecipeValue(value, params, outputs) {
|
|
15
|
+
if (typeof value === 'string') {
|
|
16
|
+
const exact = /^\{\{(params|outputs)\.([A-Za-z0-9_.-]+)\}\}$/u.exec(value);
|
|
17
|
+
if (exact) {
|
|
18
|
+
if (exact[1] === 'outputs' && !outputs)
|
|
19
|
+
return value;
|
|
20
|
+
return getRecipeReference(exact[1], exact[2], params, outputs);
|
|
21
|
+
}
|
|
22
|
+
return value.replace(/\{\{(params|outputs)\.([A-Za-z0-9_.-]+)\}\}/gu, (_match, source, key) => source === 'outputs' && !outputs
|
|
23
|
+
? _match
|
|
24
|
+
: String(getRecipeReference(source, key, params, outputs)));
|
|
25
|
+
}
|
|
26
|
+
if (Array.isArray(value))
|
|
27
|
+
return value.map((entry) => resolveRecipeValue(entry, params, outputs));
|
|
28
|
+
if (!isRecord(value))
|
|
29
|
+
return value;
|
|
30
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, resolveRecipeValue(entry, params, outputs)]));
|
|
31
|
+
}
|
|
32
|
+
function getRecipeReference(source, path, params, outputs) {
|
|
33
|
+
if (source === 'params')
|
|
34
|
+
return getNestedValue(params, path, 'parameter');
|
|
35
|
+
if (!outputs)
|
|
36
|
+
return `{{outputs.${path}}}`;
|
|
37
|
+
const [nodeId, ...segments] = path.split('.');
|
|
38
|
+
if (!nodeId || !outputs.has(nodeId)) {
|
|
39
|
+
throw new RecipeResolutionError('RECIPE_PARAMS_INVALID', `Recipe output ${path} is not defined.`, `run the producing node before referencing outputs.${path}`);
|
|
40
|
+
}
|
|
41
|
+
return getNestedValue(outputs.get(nodeId), segments.join('.'), 'output');
|
|
42
|
+
}
|
|
43
|
+
function getNestedValue(value, path, kind) {
|
|
44
|
+
if (!path)
|
|
45
|
+
return value;
|
|
46
|
+
let current = value;
|
|
47
|
+
for (const segment of path.split('.')) {
|
|
48
|
+
if (!isRecord(current) || !Object.hasOwn(current, segment)) {
|
|
49
|
+
throw new RecipeResolutionError('RECIPE_PARAMS_INVALID', `Recipe ${kind} ${path} is not defined.`, kind === 'parameter'
|
|
50
|
+
? `declare ${path} in paramsSchema or provide it before running the recipe`
|
|
51
|
+
: `inspect the producing node output before referencing ${path}`);
|
|
52
|
+
}
|
|
53
|
+
current = current[segment];
|
|
54
|
+
}
|
|
55
|
+
return current;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=parameters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../src/core/parameters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { RecipeActionManifestDocument, UiObserverRef } from '@farmslot/protocol';
|
|
2
|
+
import type { ActionAdapter, ActionResult, RecipeLogger, RecipeObservationResult, RecipeObservationWarning } from './types.js';
|
|
3
|
+
export type DefaultObserverRefs = ReadonlyMap<string, readonly UiObserverRef[]>;
|
|
4
|
+
export declare function defaultObserverRefsFromManifest(manifest: RecipeActionManifestDocument): DefaultObserverRefs;
|
|
5
|
+
export declare function resolveObserveRefs(action: string, defaultObserverRefs: DefaultObserverRefs): UiObserverRef[];
|
|
6
|
+
export declare function filterObservationWarnings(warnings: RecipeObservationResult['warnings'], refs: readonly UiObserverRef[]): RecipeObservationResult['warnings'] | undefined;
|
|
7
|
+
export declare function finalizeNodeObservations({ result, observationResult, observeRefs, }: {
|
|
8
|
+
result: ActionResult;
|
|
9
|
+
observationResult: RecipeObservationResult;
|
|
10
|
+
observeRefs: readonly UiObserverRef[];
|
|
11
|
+
}): {
|
|
12
|
+
observations: RecipeObservationResult['observations'];
|
|
13
|
+
observationWarnings: RecipeObservationWarning[];
|
|
14
|
+
};
|
|
15
|
+
export declare function filterObservations(observations: RecipeObservationResult['observations'], refs: readonly UiObserverRef[]): RecipeObservationResult['observations'] | undefined;
|
|
16
|
+
export declare function mergeObservations(first: RecipeObservationResult['observations'], second: RecipeObservationResult['observations']): RecipeObservationResult['observations'] | undefined;
|
|
17
|
+
export declare function runPassiveObservers({ action, node, adapter, context, logger, refs, }: {
|
|
18
|
+
action: string;
|
|
19
|
+
node: Record<string, unknown>;
|
|
20
|
+
adapter: ActionAdapter;
|
|
21
|
+
context: Parameters<ActionAdapter['execute']>[1];
|
|
22
|
+
logger: RecipeLogger;
|
|
23
|
+
refs: readonly UiObserverRef[];
|
|
24
|
+
}): Promise<RecipeObservationResult>;
|
|
25
|
+
//# sourceMappingURL=passive-observations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passive-observations.d.ts","sourceRoot":"","sources":["../../src/core/passive-observations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGtF,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC,CAAC;AAEhF,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,4BAA4B,GACrC,mBAAmB,CAUrB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,mBAAmB,GACvC,aAAa,EAAE,CAEjB;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,uBAAuB,CAAC,UAAU,CAAC,EAC7C,IAAI,EAAE,SAAS,aAAa,EAAE,GAC7B,uBAAuB,CAAC,UAAU,CAAC,GAAG,SAAS,CAKjD;AAED,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,iBAAiB,EACjB,WAAW,GACZ,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,iBAAiB,EAAE,uBAAuB,CAAC;IAC3C,WAAW,EAAE,SAAS,aAAa,EAAE,CAAC;CACvC,GAAG;IACF,YAAY,EAAE,uBAAuB,CAAC,cAAc,CAAC,CAAC;IACtD,mBAAmB,EAAE,wBAAwB,EAAE,CAAC;CACjD,CAWA;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,uBAAuB,CAAC,cAAc,CAAC,EACrD,IAAI,EAAE,SAAS,aAAa,EAAE,GAC7B,uBAAuB,CAAC,cAAc,CAAC,GAAG,SAAS,CAOrD;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,uBAAuB,CAAC,cAAc,CAAC,EAC9C,MAAM,EAAE,uBAAuB,CAAC,cAAc,CAAC,GAC9C,uBAAuB,CAAC,cAAc,CAAC,GAAG,SAAS,CAGrD;AAED,wBAAsB,mBAAmB,CAAC,EACxC,MAAM,EACN,IAAI,EACJ,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,GACL,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;CAChC,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAoBnC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { verifyExecutableSource } from './trust.js';
|
|
2
|
+
export function defaultObserverRefsFromManifest(manifest) {
|
|
3
|
+
const refsByAction = new Map();
|
|
4
|
+
for (const observer of manifest.observers ?? []) {
|
|
5
|
+
for (const action of observer.default_for ?? []) {
|
|
6
|
+
const refs = refsByAction.get(action) ?? [];
|
|
7
|
+
refs.push(observer.ref);
|
|
8
|
+
refsByAction.set(action, refs);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return refsByAction;
|
|
12
|
+
}
|
|
13
|
+
export function resolveObserveRefs(action, defaultObserverRefs) {
|
|
14
|
+
return [...(defaultObserverRefs.get(action) ?? [])];
|
|
15
|
+
}
|
|
16
|
+
export function filterObservationWarnings(warnings, refs) {
|
|
17
|
+
if (!warnings)
|
|
18
|
+
return undefined;
|
|
19
|
+
const allowed = new Set(refs);
|
|
20
|
+
const filtered = warnings.filter((warning) => allowed.has(warning.ref));
|
|
21
|
+
return filtered.length ? filtered : undefined;
|
|
22
|
+
}
|
|
23
|
+
export function finalizeNodeObservations({ result, observationResult, observeRefs, }) {
|
|
24
|
+
const observations = filterObservations(mergeObservations(result.observations, observationResult.observations), observeRefs);
|
|
25
|
+
const observationWarnings = filterObservationWarnings([...(result.observationWarnings ?? []), ...(observationResult.warnings ?? [])], observeRefs) ?? [];
|
|
26
|
+
return { observations, observationWarnings };
|
|
27
|
+
}
|
|
28
|
+
export function filterObservations(observations, refs) {
|
|
29
|
+
if (!observations)
|
|
30
|
+
return undefined;
|
|
31
|
+
const allowed = new Set(refs);
|
|
32
|
+
const filtered = Object.fromEntries(Object.entries(observations).filter(([ref]) => allowed.has(ref)));
|
|
33
|
+
return Object.keys(filtered).length ? filtered : undefined;
|
|
34
|
+
}
|
|
35
|
+
export function mergeObservations(first, second) {
|
|
36
|
+
const merged = { ...(first ?? {}), ...(second ?? {}) };
|
|
37
|
+
return Object.keys(merged).length ? merged : undefined;
|
|
38
|
+
}
|
|
39
|
+
export async function runPassiveObservers({ action, node, adapter, context, logger, refs, }) {
|
|
40
|
+
if (refs.length === 0)
|
|
41
|
+
return {};
|
|
42
|
+
if (!adapter.observe) {
|
|
43
|
+
return {
|
|
44
|
+
warnings: refs.map((ref) => ({
|
|
45
|
+
ref,
|
|
46
|
+
message: `No passive observer registered for ${action}.`,
|
|
47
|
+
})),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
await verifyExecutableSource(adapter, `Observer ${action}`);
|
|
52
|
+
return await adapter.observe(refs, node, context);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
56
|
+
logger.warn(`passive observation failed for ${action}: ${message}`);
|
|
57
|
+
return {
|
|
58
|
+
warnings: refs.map((ref) => ({ ref, message })),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=passive-observations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passive-observations.js","sourceRoot":"","sources":["../../src/core/passive-observations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function isPathWithin(root: string, candidate: string): boolean;
|
|
2
|
+
export declare function readFileWithinRoot(root: string, relativePath: string): Promise<Buffer>;
|
|
3
|
+
export declare function digestFileWithinRoot(root: string, relativePath: string): Promise<string>;
|
|
4
|
+
export declare function statFileWithinRoot(root: string, relativePath: string): Promise<import("fs").Stats>;
|
|
5
|
+
export declare function writeFileWithinRoot(root: string, relativePath: string, data: string | Uint8Array): Promise<string>;
|
|
6
|
+
export declare function copyFileWithinRoots(sourceRoot: string, sourceRelativePath: string, destinationRoot: string, destinationRelativePath: string): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/core/path.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAMrE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5F;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS9F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,+BAO1E;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GAAG,UAAU,GACxB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,kBAAkB,EAAE,MAAM,EAC1B,eAAe,EAAE,MAAM,EACvB,uBAAuB,EAAE,MAAM,GAC9B,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
|