@farmslot/recipe-cli 0.4.1 → 0.5.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 +13 -0
- package/README.md +11 -11
- package/dist/harness/catalog.d.ts +71 -0
- package/dist/harness/catalog.d.ts.map +1 -0
- package/dist/harness/catalog.js +280 -0
- package/dist/harness/catalog.js.map +1 -0
- package/dist/harness/commands/call.d.ts +18 -0
- package/dist/harness/commands/call.d.ts.map +1 -0
- package/dist/harness/commands/call.js +663 -0
- package/dist/harness/commands/call.js.map +1 -0
- package/dist/harness/commands/discover.d.ts +29 -0
- package/dist/harness/commands/discover.d.ts.map +1 -0
- package/dist/harness/commands/discover.js +563 -0
- package/dist/harness/commands/discover.js.map +1 -0
- package/dist/harness/commands/run.d.ts +40 -0
- package/dist/harness/commands/run.d.ts.map +1 -0
- package/dist/harness/commands/run.js +727 -0
- package/dist/harness/commands/run.js.map +1 -0
- package/dist/harness/heal-bounds.d.ts +8 -0
- package/dist/harness/heal-bounds.d.ts.map +1 -1
- package/dist/harness/heal-bounds.js +10 -0
- package/dist/harness/heal-bounds.js.map +1 -1
- package/dist/harness/host.d.ts +5 -0
- package/dist/harness/host.d.ts.map +1 -1
- package/dist/harness/host.js +7 -0
- package/dist/harness/host.js.map +1 -1
- package/dist/harness/index.d.ts +8 -0
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +8 -0
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/network-observation.d.ts +19 -0
- package/dist/harness/network-observation.d.ts.map +1 -0
- package/dist/harness/network-observation.js +202 -0
- package/dist/harness/network-observation.js.map +1 -0
- package/dist/harness/recipe-library.d.ts +65 -0
- package/dist/harness/recipe-library.d.ts.map +1 -0
- package/dist/harness/recipe-library.js +182 -0
- package/dist/harness/recipe-library.js.map +1 -0
- package/dist/harness/recipe-validation.d.ts +27 -0
- package/dist/harness/recipe-validation.d.ts.map +1 -0
- package/dist/harness/recipe-validation.js +249 -0
- package/dist/harness/recipe-validation.js.map +1 -0
- package/dist/harness/run-engine.d.ts +79 -0
- package/dist/harness/run-engine.d.ts.map +1 -0
- package/dist/harness/run-engine.js +632 -0
- package/dist/harness/run-engine.js.map +1 -0
- package/dist/harness/run-observers.d.ts +13 -0
- package/dist/harness/run-observers.d.ts.map +1 -0
- package/dist/harness/run-observers.js +21 -0
- package/dist/harness/run-observers.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
// The recipe execution path `run` and `call` share: one engine door. The host
|
|
2
|
+
// supplies its catalog, runner factory, trusted-mutation binding and console
|
|
3
|
+
// rules as a `RecipeEngine`; the registered adapters supply platform behavior.
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { resolveRecipeTrustInput, } from '@farmslot/recipe-runner';
|
|
7
|
+
import { adapterPortEnv, harnessAdapter } from './adapters.js';
|
|
8
|
+
import { captureExecutionProvenance, executionProvenanceDrift, ProvenanceDriftError, writeExecutionProvenance, } from './execution-provenance.js';
|
|
9
|
+
import { checkHealBounds, conciseFailureForHuman, ensureOverlay, newHealState, parseHeal, recipeRunning, recipeRunningRefusal, } from './heal-bounds.js';
|
|
10
|
+
import { harnessHost, hostEnvName, recipeEnvName } from './host.js';
|
|
11
|
+
import { isRecord, optionString, shellQuoteArg } from './parse-args.js';
|
|
12
|
+
import { recipeRuntimePath } from './paths.js';
|
|
13
|
+
import { captureHelperSupportsRecordSessionSnapshots } from './recording-target.js';
|
|
14
|
+
import { beginRunDiagnostics, finishRunDiagnostics, } from './run-diagnostics.js';
|
|
15
|
+
import { startRecipeRecording, stopRecipeRecording } from './run-recording.js';
|
|
16
|
+
import { executedBrowser, recipeCdpPorts } from './run-report.js';
|
|
17
|
+
import { EXIT } from './shared.js';
|
|
18
|
+
export async function runRecipe(engine, adapter, recipe, artifactsDir, projectRoot, actionManifestPath, runtimeOptions = {}, preflightedExecution, effectsState = newHealState()) {
|
|
19
|
+
const restoreRuntimeEnvironment = activateRecipeRuntimeEnvironment(adapter, projectRoot, runtimeOptions);
|
|
20
|
+
try {
|
|
21
|
+
const wasPreflighted = preflightedExecution !== undefined;
|
|
22
|
+
const execution = preflightedExecution ??
|
|
23
|
+
(await resolveRecipeExecution(engine, adapter, recipe, artifactsDir, projectRoot, actionManifestPath, runtimeOptions));
|
|
24
|
+
const { runner, runRequest, absoluteArtifactsDir, useFramedRecording, provenanceInput, provenanceSnapshots, } = execution;
|
|
25
|
+
if (!wasPreflighted)
|
|
26
|
+
await runner.preflight(runRequest);
|
|
27
|
+
await prepareRuntimeIfNeeded(adapter, projectRoot, runtimeOptions);
|
|
28
|
+
// The prepared runner owns frozen action bundles. Rechecking its plan here
|
|
29
|
+
// does not reconstruct adapters or replace their approved bytes.
|
|
30
|
+
await runner.preflight(runRequest);
|
|
31
|
+
const preExecute = await captureExecutionProvenance(provenanceInput, 'pre-execute');
|
|
32
|
+
provenanceSnapshots.push(preExecute);
|
|
33
|
+
const preExecuteDrift = executionProvenanceDrift(provenanceSnapshots[0], preExecute);
|
|
34
|
+
if (preExecuteDrift.length > 0) {
|
|
35
|
+
const provenancePath = await writeExecutionProvenance(absoluteArtifactsDir, provenanceSnapshots, preExecuteDrift);
|
|
36
|
+
throw new ProvenanceDriftError(provenancePath, preExecuteDrift);
|
|
37
|
+
}
|
|
38
|
+
const diagnosticBaseline = await beginRunDiagnostics(adapter, projectRoot);
|
|
39
|
+
const recording = useFramedRecording
|
|
40
|
+
? await startRecipeRecording(adapter, projectRoot, absoluteArtifactsDir, {
|
|
41
|
+
record: true,
|
|
42
|
+
cdpPort: runtimeOptions.cdpPort,
|
|
43
|
+
})
|
|
44
|
+
: undefined;
|
|
45
|
+
let result;
|
|
46
|
+
let executionError;
|
|
47
|
+
try {
|
|
48
|
+
result = await runner.run(runRequest);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
executionError = error;
|
|
52
|
+
try {
|
|
53
|
+
await stopRecipeRecording(recording);
|
|
54
|
+
}
|
|
55
|
+
catch (recordingError) {
|
|
56
|
+
console.error(`WARN: recipe and video recording both failed; preserving recipe failure: ${recordingError instanceof Error ? recordingError.message : String(recordingError)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
// Always clear a HUD step the engine left on-device (a failed run strands
|
|
61
|
+
// the FAIL banner). Best-effort — never masks the run's real outcome.
|
|
62
|
+
const run = harnessAdapter(adapter).run;
|
|
63
|
+
if (run?.teardown)
|
|
64
|
+
await run.teardown(projectRoot, recipeRunEnv(adapter, runtimeOptions));
|
|
65
|
+
}
|
|
66
|
+
let recordingError;
|
|
67
|
+
if (executionError === undefined && result) {
|
|
68
|
+
try {
|
|
69
|
+
await stopRecipeRecording(recording, result);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
recordingError = error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const end = await captureExecutionProvenance(provenanceInput, 'end');
|
|
76
|
+
provenanceSnapshots.push(end);
|
|
77
|
+
const endDrift = executionProvenanceDrift(provenanceSnapshots[0], end);
|
|
78
|
+
const provenancePath = await writeExecutionProvenance(absoluteArtifactsDir, provenanceSnapshots, endDrift, result?.artifactManifestPath);
|
|
79
|
+
if (endDrift.length > 0) {
|
|
80
|
+
throw new ProvenanceDriftError(provenancePath, endDrift, executionError);
|
|
81
|
+
}
|
|
82
|
+
if (executionError !== undefined)
|
|
83
|
+
throw executionError;
|
|
84
|
+
if (recordingError !== undefined)
|
|
85
|
+
throw recordingError;
|
|
86
|
+
if (!result)
|
|
87
|
+
throw new Error('Recipe execution returned no result.');
|
|
88
|
+
const finalized = await finishRunDiagnostics(diagnosticBaseline, result, engine.console);
|
|
89
|
+
persistRunEffects(finalized.summaryPath, finalized.artifactManifestPath, effectsState);
|
|
90
|
+
const browser = executedBrowser(adapter, projectRoot, finalized.artifactManifestPath, recipeCdpPorts(runRequest));
|
|
91
|
+
return browser ? { ...finalized, browser } : finalized;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
restoreRuntimeEnvironment();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export async function preflightRecipe(engine, adapter, recipe, artifactsDir, projectRoot, actionManifestPath, runtimeOptions = {}) {
|
|
98
|
+
const restoreRuntimeEnvironment = activateRecipeRuntimeEnvironment(adapter, projectRoot, runtimeOptions);
|
|
99
|
+
try {
|
|
100
|
+
const execution = await resolveRecipeExecution(engine, adapter, recipe, artifactsDir, projectRoot, actionManifestPath, runtimeOptions);
|
|
101
|
+
await execution.runner.preflight(execution.runRequest);
|
|
102
|
+
return execution;
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
restoreRuntimeEnvironment();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Record the run's recoveries and mutations in its summary and artifact manifest. */
|
|
109
|
+
export function persistRunEffects(summaryPath, artifactManifestPath, state) {
|
|
110
|
+
for (const filePath of [summaryPath, artifactManifestPath]) {
|
|
111
|
+
let document;
|
|
112
|
+
try {
|
|
113
|
+
document = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
document = null;
|
|
117
|
+
}
|
|
118
|
+
if (!isRecord(document)) {
|
|
119
|
+
throw new Error(`Recipe evidence file is not valid JSON: ${filePath}`);
|
|
120
|
+
}
|
|
121
|
+
document.recovered = [...state.recovered];
|
|
122
|
+
document.mutations = state.mutations.map((mutation) => ({ ...mutation }));
|
|
123
|
+
fs.writeFileSync(filePath, `${JSON.stringify(document, null, 2)}\n`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async function resolveRecipeExecution(engine, adapter, recipe, artifactsDir, projectRoot, actionManifestPath, runtimeOptions) {
|
|
127
|
+
const absoluteArtifactsDir = path.resolve(artifactsDir);
|
|
128
|
+
const absoluteRecipePath = typeof recipe === 'string' ? path.resolve(recipe) : undefined;
|
|
129
|
+
const recordVideo = runtimeOptions.recordVideo ?? false;
|
|
130
|
+
const trust = resolveRecipeTrustInput({
|
|
131
|
+
sourceTrust: runtimeOptions.source?.trust,
|
|
132
|
+
sourceKind: runtimeOptions.source?.kind,
|
|
133
|
+
sourceName: runtimeOptions.source?.name,
|
|
134
|
+
sourceDigest: runtimeOptions.source?.digest,
|
|
135
|
+
approvalDigest: runtimeOptions.approval?.planDigest,
|
|
136
|
+
});
|
|
137
|
+
const librarySources = executionLibrarySources(engine, runtimeOptions.librarySources, trust.source?.trust ?? 'trusted');
|
|
138
|
+
const { manifest, actionSources } = await engine.resolveActionManifest(adapter, actionManifestPath, librarySources, process.env[recipeEnvName('LIVE_ADAPTER_DIR')]);
|
|
139
|
+
const recipeDocument = runtimeRecipeDocument(recipe, absoluteRecipePath);
|
|
140
|
+
const mutation = engine.trustedMutation;
|
|
141
|
+
const trustedMutation = mutation
|
|
142
|
+
? await mutation.load({
|
|
143
|
+
cli: runtimeOptions.cli ?? {},
|
|
144
|
+
artifactsDir: absoluteArtifactsDir,
|
|
145
|
+
projectRoot,
|
|
146
|
+
rootRecipe: recipeDocument,
|
|
147
|
+
})
|
|
148
|
+
: undefined;
|
|
149
|
+
const surface = harnessAdapter(adapter);
|
|
150
|
+
const suppressAutoHud = surface.run?.autoHud?.() === false;
|
|
151
|
+
const runnerOptions = {
|
|
152
|
+
quietStdout: runtimeOptions.stdoutIsMachineContract === true,
|
|
153
|
+
suppressLibraryResolutionLogs: runtimeOptions.suppressLibraryResolutionLogs,
|
|
154
|
+
autoHud: suppressAutoHud
|
|
155
|
+
? false
|
|
156
|
+
: trust.source && trust.source.trust !== 'trusted'
|
|
157
|
+
? false
|
|
158
|
+
: runtimeOptions.autoHud,
|
|
159
|
+
onActionEvent: runtimeOptions.onActionEvent,
|
|
160
|
+
actionSources,
|
|
161
|
+
// A direct engineer invocation is the explicit trust boundary for a
|
|
162
|
+
// task-local adapter. Inherited gateway provenance remains authoritative,
|
|
163
|
+
// so an untrusted worker cannot promote itself with CLI flags.
|
|
164
|
+
trustTaskActions: (trust.source?.trust ?? 'trusted') === 'trusted',
|
|
165
|
+
};
|
|
166
|
+
let runner = await engine.createRunner(adapter, manifest, {
|
|
167
|
+
...runnerOptions,
|
|
168
|
+
trustedMutation,
|
|
169
|
+
});
|
|
170
|
+
// The wrapper-owned framed recorder is outside the generic execution plan.
|
|
171
|
+
// Keep it for trusted operator runs only; restricted sources use the generic
|
|
172
|
+
// recorder so capture remains plan-bound and approval-gated.
|
|
173
|
+
const useFramedRecording = surface.recording?.framed !== undefined &&
|
|
174
|
+
recordVideo === 'full-run' &&
|
|
175
|
+
trust.source?.trust !== 'untrusted' &&
|
|
176
|
+
trust.source?.trust !== 'unknown' &&
|
|
177
|
+
captureHelperSupportsRecordSessionSnapshots(projectRoot);
|
|
178
|
+
const runRequest = {
|
|
179
|
+
...(recipeDocument !== undefined
|
|
180
|
+
? { recipeDocument }
|
|
181
|
+
: absoluteRecipePath
|
|
182
|
+
? { recipePath: absoluteRecipePath }
|
|
183
|
+
: { recipeDocument: recipe }),
|
|
184
|
+
artifactsDir: absoluteArtifactsDir,
|
|
185
|
+
projectRoot,
|
|
186
|
+
inheritProcessEnv: false,
|
|
187
|
+
env: {
|
|
188
|
+
...recipeProcessEnvironment(),
|
|
189
|
+
...recipeRunEnv(adapter, runtimeOptions),
|
|
190
|
+
[recipeEnvName('ACTION_SOURCE_MAP')]: actionSourceMap(actionSources),
|
|
191
|
+
},
|
|
192
|
+
recordVideo: useFramedRecording ? false : recordVideo,
|
|
193
|
+
...trust,
|
|
194
|
+
...(librarySources ? { librarySources } : {}),
|
|
195
|
+
adapter,
|
|
196
|
+
...(runtimeOptions.params ? { params: runtimeOptions.params } : {}),
|
|
197
|
+
};
|
|
198
|
+
if (mutation && trustedMutation) {
|
|
199
|
+
const executionPlan = await runner.preflight(runRequest);
|
|
200
|
+
const authorizedMutation = await mutation.authorize(trustedMutation, executionPlan);
|
|
201
|
+
runner = await engine.createRunner(adapter, manifest, {
|
|
202
|
+
...runnerOptions,
|
|
203
|
+
trustedMutation: authorizedMutation,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
const provenanceInput = {
|
|
207
|
+
adapter,
|
|
208
|
+
projectRoot,
|
|
209
|
+
recipeDocument: recipeDocument ?? recipe,
|
|
210
|
+
...(absoluteRecipePath ? { recipePath: absoluteRecipePath } : {}),
|
|
211
|
+
...(librarySources ? { librarySources } : {}),
|
|
212
|
+
excludedProductRoots: [
|
|
213
|
+
absoluteArtifactsDir,
|
|
214
|
+
recipeRuntimePath(projectRoot, 'operations'),
|
|
215
|
+
recipeRuntimePath(projectRoot, 'lock-members'),
|
|
216
|
+
],
|
|
217
|
+
helperPaths: commandHelperPaths(recipeDocument ?? recipe, projectRoot),
|
|
218
|
+
runnerIncludes: engine.runnerIncludes,
|
|
219
|
+
};
|
|
220
|
+
const startProvenance = await captureExecutionProvenance(provenanceInput, 'start');
|
|
221
|
+
return {
|
|
222
|
+
runner,
|
|
223
|
+
absoluteArtifactsDir,
|
|
224
|
+
useFramedRecording,
|
|
225
|
+
runRequest,
|
|
226
|
+
provenanceInput,
|
|
227
|
+
provenanceSnapshots: [startProvenance],
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function commandHelperPaths(recipe, projectRoot) {
|
|
231
|
+
const helpers = new Set();
|
|
232
|
+
visitRecipeValues(recipe, (value) => {
|
|
233
|
+
if (!isRecord(value) || value.action !== 'command' || typeof value.cmd !== 'string')
|
|
234
|
+
return;
|
|
235
|
+
const candidates = commandHelperTokens(value.cmd);
|
|
236
|
+
for (const token of candidates) {
|
|
237
|
+
if (/[$`{}]/u.test(token)) {
|
|
238
|
+
throw new Error(`Command helper path cannot be bound before execution: ${token}`);
|
|
239
|
+
}
|
|
240
|
+
if (!isHelperToken(token))
|
|
241
|
+
continue;
|
|
242
|
+
const absolute = path.isAbsolute(token)
|
|
243
|
+
? path.resolve(token)
|
|
244
|
+
: path.resolve(projectRoot, token);
|
|
245
|
+
let stat;
|
|
246
|
+
try {
|
|
247
|
+
stat = fs.lstatSync(absolute);
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
throw new Error(`Command helper source does not exist: ${token}`);
|
|
251
|
+
}
|
|
252
|
+
if (stat.isSymbolicLink() || !stat.isFile()) {
|
|
253
|
+
throw new Error(`Command helper source must be a regular file: ${token}`);
|
|
254
|
+
}
|
|
255
|
+
helpers.add(absolute);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
return [...helpers].sort();
|
|
259
|
+
}
|
|
260
|
+
function commandHelperTokens(command, depth = 0) {
|
|
261
|
+
if (depth > 4) {
|
|
262
|
+
throw new Error('Command helper sources exceed the supported shell nesting depth.');
|
|
263
|
+
}
|
|
264
|
+
const tokens = shellTokens(command);
|
|
265
|
+
const candidates = new Set(tokens.filter(isHelperToken));
|
|
266
|
+
for (const token of tokens) {
|
|
267
|
+
const assignment = /^(?:--)?(?:config|configuration|manifest|project|recipe|schema|tsconfig)=([^=]+)$/iu.exec(token);
|
|
268
|
+
const value = assignment?.[1];
|
|
269
|
+
if (value && (isHelperToken(value) || isConfigInputToken(value))) {
|
|
270
|
+
candidates.add(value);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
for (let index = 0; index < tokens.length - 1; index += 1) {
|
|
274
|
+
if (!isScriptInterpreter(tokens[index]))
|
|
275
|
+
continue;
|
|
276
|
+
const option = tokens[index + 1];
|
|
277
|
+
if (isShellInterpreter(tokens[index]) &&
|
|
278
|
+
/^-[a-z]*c[a-z]*$/iu.test(option) &&
|
|
279
|
+
tokens[index + 2]) {
|
|
280
|
+
for (const nested of commandHelperTokens(tokens[index + 2], depth + 1)) {
|
|
281
|
+
candidates.add(nested);
|
|
282
|
+
}
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
if (!option.startsWith('-'))
|
|
286
|
+
candidates.add(option);
|
|
287
|
+
}
|
|
288
|
+
return candidates;
|
|
289
|
+
}
|
|
290
|
+
function visitRecipeValues(value, visit) {
|
|
291
|
+
visit(value);
|
|
292
|
+
if (Array.isArray(value)) {
|
|
293
|
+
for (const child of value)
|
|
294
|
+
visitRecipeValues(child, visit);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (!isRecord(value))
|
|
298
|
+
return;
|
|
299
|
+
for (const child of Object.values(value))
|
|
300
|
+
visitRecipeValues(child, visit);
|
|
301
|
+
}
|
|
302
|
+
function isHelperToken(token) {
|
|
303
|
+
return (!token.startsWith('-') &&
|
|
304
|
+
!token.includes('=') &&
|
|
305
|
+
!/^[a-z][a-z0-9+.-]*:\/\//iu.test(token) &&
|
|
306
|
+
/^\S+\.(?:cjs|mjs|js|jsx|ts|tsx|sh|py)$/u.test(token));
|
|
307
|
+
}
|
|
308
|
+
function isConfigInputToken(token) {
|
|
309
|
+
return (!token.startsWith('-') &&
|
|
310
|
+
!token.includes('=') &&
|
|
311
|
+
/^\S+\.(?:json|json5|ya?ml|toml)$/u.test(token));
|
|
312
|
+
}
|
|
313
|
+
function isScriptInterpreter(token) {
|
|
314
|
+
return /^(?:node|bash|sh|python|python3)$/u.test(path.basename(token));
|
|
315
|
+
}
|
|
316
|
+
function isShellInterpreter(token) {
|
|
317
|
+
return /^(?:bash|sh)$/u.test(path.basename(token));
|
|
318
|
+
}
|
|
319
|
+
function shellTokens(command) {
|
|
320
|
+
const tokens = [];
|
|
321
|
+
let token = '';
|
|
322
|
+
let quote = null;
|
|
323
|
+
let escaped = false;
|
|
324
|
+
const push = () => {
|
|
325
|
+
if (token)
|
|
326
|
+
tokens.push(token);
|
|
327
|
+
token = '';
|
|
328
|
+
};
|
|
329
|
+
for (const character of command) {
|
|
330
|
+
if (escaped) {
|
|
331
|
+
token += character;
|
|
332
|
+
escaped = false;
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
if (character === '\\' && quote !== "'") {
|
|
336
|
+
escaped = true;
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
if (quote) {
|
|
340
|
+
if (character === quote)
|
|
341
|
+
quote = null;
|
|
342
|
+
else
|
|
343
|
+
token += character;
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (character === "'" || character === '"') {
|
|
347
|
+
quote = character;
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
if (/\s|[;&|<>]/u.test(character))
|
|
351
|
+
push();
|
|
352
|
+
else
|
|
353
|
+
token += character;
|
|
354
|
+
}
|
|
355
|
+
if (quote || escaped) {
|
|
356
|
+
throw new Error('Command helper sources cannot be bound from an unterminated shell token.');
|
|
357
|
+
}
|
|
358
|
+
push();
|
|
359
|
+
return tokens;
|
|
360
|
+
}
|
|
361
|
+
function runtimeRecipeDocument(recipe, absoluteRecipePath) {
|
|
362
|
+
if (typeof recipe !== 'string')
|
|
363
|
+
return recipe;
|
|
364
|
+
if (!absoluteRecipePath || !fs.existsSync(absoluteRecipePath))
|
|
365
|
+
return undefined;
|
|
366
|
+
try {
|
|
367
|
+
return JSON.parse(fs.readFileSync(absoluteRecipePath, 'utf8'));
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
return undefined;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// The run's child environment: this process's, without the host's checkout
|
|
374
|
+
// lock and operation identity.
|
|
375
|
+
function recipeProcessEnvironment() {
|
|
376
|
+
const env = { ...process.env };
|
|
377
|
+
delete env[hostEnvName('CHECKOUT_LOCK_TOKEN')];
|
|
378
|
+
delete env[hostEnvName('OPERATION_ID')];
|
|
379
|
+
return env;
|
|
380
|
+
}
|
|
381
|
+
function executionLibrarySources(catalog, sources, invocationTrust) {
|
|
382
|
+
return sources?.map((source) => {
|
|
383
|
+
if (source.name === catalog.bundledLibrary.name)
|
|
384
|
+
return source;
|
|
385
|
+
return {
|
|
386
|
+
...source,
|
|
387
|
+
provenance: {
|
|
388
|
+
...source.provenance,
|
|
389
|
+
kind: source.provenance?.kind ?? 'library',
|
|
390
|
+
trust: invocationTrust === 'trusted' ? 'trusted' : 'unknown',
|
|
391
|
+
name: source.provenance?.name ?? source.name ?? path.basename(source.root),
|
|
392
|
+
},
|
|
393
|
+
};
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
// The ports every run sets: CDP, the watcher, and each registered adapter's
|
|
397
|
+
// dev-server port names.
|
|
398
|
+
function runEnvKeys() {
|
|
399
|
+
return ['CDP_PORT', 'RECIPE_CDP_PORT', 'WATCHER_PORT', ...adapterPortEnv()];
|
|
400
|
+
}
|
|
401
|
+
export function activateRecipeRuntimeEnvironment(adapter, projectRoot, runtimeOptions) {
|
|
402
|
+
const surface = harnessAdapter(adapter);
|
|
403
|
+
// Restored when the run ends: the keys every run sets, plus the ones the
|
|
404
|
+
// platform's run may change (slot ports, its activateEnv).
|
|
405
|
+
const previousEnv = Object.fromEntries([...runEnvKeys(), ...(surface.run?.envKeys ?? [])].map((key) => [key, process.env[key]]));
|
|
406
|
+
const pinnedEnv = surface.run?.pinnedEnv?.();
|
|
407
|
+
// Every engine execution resolves the slot's ports/device first (context →
|
|
408
|
+
// pool → formula), so call/run/fixtures get the same slot isolation launch
|
|
409
|
+
// has; explicit runtimeOptions below still override.
|
|
410
|
+
surface.resolveSlotPorts(projectRoot);
|
|
411
|
+
// Slot resolution owns ports, but an explicit --device selection owns the
|
|
412
|
+
// device. Restore that pin after the slot context is loaded so HUD and live
|
|
413
|
+
// adapter child processes cannot drift back to the slot's default device.
|
|
414
|
+
if (pinnedEnv) {
|
|
415
|
+
for (const [key, value] of Object.entries(pinnedEnv)) {
|
|
416
|
+
restoreEnv(key, value);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
if (runtimeOptions.cdpPort) {
|
|
420
|
+
process.env.CDP_PORT = runtimeOptions.cdpPort;
|
|
421
|
+
process.env.RECIPE_CDP_PORT = runtimeOptions.cdpPort;
|
|
422
|
+
}
|
|
423
|
+
if (runtimeOptions.watcherPort) {
|
|
424
|
+
process.env.WATCHER_PORT = runtimeOptions.watcherPort;
|
|
425
|
+
for (const name of adapterPortEnv())
|
|
426
|
+
process.env[name] = runtimeOptions.watcherPort;
|
|
427
|
+
}
|
|
428
|
+
surface.run?.activateEnv?.(projectRoot, runtimeOptions);
|
|
429
|
+
return () => {
|
|
430
|
+
for (const [key, value] of Object.entries(previousEnv))
|
|
431
|
+
restoreEnv(key, value);
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
// Where each non-official action's implementation lives, for live adapter scripts.
|
|
435
|
+
function actionSourceMap(sources) {
|
|
436
|
+
const roots = {};
|
|
437
|
+
for (const [action, source] of sources) {
|
|
438
|
+
if (source.tier === 'official')
|
|
439
|
+
continue;
|
|
440
|
+
roots[action] =
|
|
441
|
+
source.implementationRoot ??
|
|
442
|
+
(source.tier === 'task'
|
|
443
|
+
? path.join(path.dirname(source.manifestPath), 'actions')
|
|
444
|
+
: path.join(path.dirname(path.dirname(source.manifestPath)), 'actions'));
|
|
445
|
+
}
|
|
446
|
+
return JSON.stringify(roots);
|
|
447
|
+
}
|
|
448
|
+
function recipeRunEnv(adapter, runtimeOptions = {}) {
|
|
449
|
+
const explicitPlatform = hostEnvName('EXPLICIT_PLATFORM');
|
|
450
|
+
const base = {
|
|
451
|
+
CDP_PORT: runtimeOptions.cdpPort ?? process.env.CDP_PORT,
|
|
452
|
+
RECIPE_CDP_PORT: runtimeOptions.cdpPort ?? process.env.RECIPE_CDP_PORT,
|
|
453
|
+
FARMSLOT_SLOT_ID: runtimeOptions.slot ?? process.env.FARMSLOT_SLOT_ID,
|
|
454
|
+
SLOT_ID: runtimeOptions.slot ?? process.env.SLOT_ID,
|
|
455
|
+
PLATFORM: process.env.PLATFORM,
|
|
456
|
+
[explicitPlatform]: process.env[explicitPlatform],
|
|
457
|
+
};
|
|
458
|
+
const run = harnessAdapter(adapter).run;
|
|
459
|
+
return run?.childEnv ? run.childEnv(base) : base;
|
|
460
|
+
}
|
|
461
|
+
export async function prepareRuntimeIfNeeded(adapter, projectRoot, runtimeOptions) {
|
|
462
|
+
await harnessAdapter(adapter).run?.prepareRuntime?.(projectRoot, runtimeOptions);
|
|
463
|
+
}
|
|
464
|
+
function restoreEnv(key, value) {
|
|
465
|
+
if (value === undefined)
|
|
466
|
+
delete process.env[key];
|
|
467
|
+
else
|
|
468
|
+
process.env[key] = value;
|
|
469
|
+
}
|
|
470
|
+
/** A one-node recipe that runs `action` with `args` through the real engine path. */
|
|
471
|
+
export function synthesizeOneNodeRecipe(action, args) {
|
|
472
|
+
const host = harnessHost().name;
|
|
473
|
+
return {
|
|
474
|
+
$schema: 'https://farmslot.io/schemas/recipe-v1.schema.json',
|
|
475
|
+
title: `${host} call ${action}`,
|
|
476
|
+
description: `Ad-hoc single-action execution of ${action} via the real engine path (${host} call).`,
|
|
477
|
+
workflow: {
|
|
478
|
+
entry: 'call',
|
|
479
|
+
nodes: {
|
|
480
|
+
call: {
|
|
481
|
+
...args,
|
|
482
|
+
action,
|
|
483
|
+
next: 'done',
|
|
484
|
+
intent: typeof args.intent === 'string'
|
|
485
|
+
? args.intent
|
|
486
|
+
: `Complete the requested ${action} operation`,
|
|
487
|
+
},
|
|
488
|
+
done: { action: 'end', status: 'pass' },
|
|
489
|
+
},
|
|
490
|
+
},
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Refuse a concurrent recipe, parse --heal, ensure the runtime overlay, and run
|
|
495
|
+
* the platform's runtime check: the heal state to run with, or the exit code.
|
|
496
|
+
*/
|
|
497
|
+
export async function prepareHeal(adapter, target, options, json, prepareOptions = {}) {
|
|
498
|
+
const host = harnessHost().name;
|
|
499
|
+
if (recipeRunning(target)) {
|
|
500
|
+
const { message: msg, userAction } = recipeRunningRefusal(shellQuoteArg(target));
|
|
501
|
+
if (json) {
|
|
502
|
+
console.log(JSON.stringify({
|
|
503
|
+
schemaVersion: 1,
|
|
504
|
+
status: 'fail',
|
|
505
|
+
recoverable: false,
|
|
506
|
+
error: { code: 'RECIPE_RUNNING', message: msg, userAction },
|
|
507
|
+
}, null, 2));
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
console.error(`✗ ${host}: ${msg}\n Next: ${userAction}`);
|
|
511
|
+
}
|
|
512
|
+
return EXIT.bounded;
|
|
513
|
+
}
|
|
514
|
+
const healValue = optionString(options, 'heal');
|
|
515
|
+
const healOpts = {};
|
|
516
|
+
if (healValue !== undefined)
|
|
517
|
+
healOpts.heal = healValue;
|
|
518
|
+
const heal = parseHeal(healOpts, 'infra-only');
|
|
519
|
+
if (typeof heal !== 'string') {
|
|
520
|
+
console.error(heal.error);
|
|
521
|
+
return EXIT.usage;
|
|
522
|
+
}
|
|
523
|
+
const state = newHealState();
|
|
524
|
+
const runtimeCheck = harnessAdapter(adapter).run?.runtimeCheck?.({
|
|
525
|
+
target,
|
|
526
|
+
options,
|
|
527
|
+
heal,
|
|
528
|
+
state,
|
|
529
|
+
json,
|
|
530
|
+
appRestartAuthored: prepareOptions.appRestartAuthored,
|
|
531
|
+
onRecovery: (code) => prepareOptions.onPhase?.('recover', { code }),
|
|
532
|
+
});
|
|
533
|
+
prepareOptions.onPhase?.('install');
|
|
534
|
+
const ensured = await ensureOverlay(adapter, target, heal, state, json);
|
|
535
|
+
if (!ensured.ok) {
|
|
536
|
+
const userAction = `${host} install --adapter ${adapter} --target ${shellQuoteArg(target)}`;
|
|
537
|
+
if (json) {
|
|
538
|
+
console.log(JSON.stringify({
|
|
539
|
+
schemaVersion: 1,
|
|
540
|
+
status: 'fail',
|
|
541
|
+
recoverable: false,
|
|
542
|
+
mutations: state.mutations,
|
|
543
|
+
error: {
|
|
544
|
+
code: 'OVERLAY_INSTALL_FAILED',
|
|
545
|
+
message: ensured.error,
|
|
546
|
+
userAction,
|
|
547
|
+
},
|
|
548
|
+
}, null, 2));
|
|
549
|
+
}
|
|
550
|
+
else {
|
|
551
|
+
console.error(`✗ overlay auto-ensure failed: ${ensured.error}\n Next: ${userAction}`);
|
|
552
|
+
}
|
|
553
|
+
return EXIT.infra;
|
|
554
|
+
}
|
|
555
|
+
prepareOptions.onPhase?.('healthcheck');
|
|
556
|
+
if (runtimeCheck) {
|
|
557
|
+
const current = await runtimeCheck();
|
|
558
|
+
if (current !== null)
|
|
559
|
+
return current;
|
|
560
|
+
}
|
|
561
|
+
return { state, heal };
|
|
562
|
+
}
|
|
563
|
+
function readRunFailureText(result) {
|
|
564
|
+
try {
|
|
565
|
+
const trace = JSON.parse(fs.readFileSync(result.tracePath, 'utf8'));
|
|
566
|
+
const entries = Array.isArray(trace.entries) ? trace.entries : [];
|
|
567
|
+
return entries
|
|
568
|
+
.filter((entry) => entry && entry.ok === false && typeof entry.error === 'string')
|
|
569
|
+
.map((entry) => entry.error)
|
|
570
|
+
.join('\n')
|
|
571
|
+
.trim();
|
|
572
|
+
}
|
|
573
|
+
catch {
|
|
574
|
+
return '';
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
/** Run once; a failed run is classified against the recovery bounds. */
|
|
578
|
+
export async function executeWithHealBounds(exec, target, state) {
|
|
579
|
+
const result = await exec();
|
|
580
|
+
if (result.status === 'pass' || result.status === 'unknown')
|
|
581
|
+
return { result, violation: null };
|
|
582
|
+
return {
|
|
583
|
+
result,
|
|
584
|
+
violation: checkHealBounds(target, readRunFailureText(result), state),
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
export function emitHealViolation(json, command, result, violation, state, adapter) {
|
|
588
|
+
const userAction = (adapter ? harnessAdapter(adapter).run?.violationUserAction?.(violation) : undefined) ??
|
|
589
|
+
violation.userAction ??
|
|
590
|
+
`inspect ${shellQuoteArg(result.summaryPath)} and ${shellQuoteArg(result.tracePath)}; fix the application or recipe failure before retrying`;
|
|
591
|
+
if (json) {
|
|
592
|
+
console.log(JSON.stringify({
|
|
593
|
+
schemaVersion: 1,
|
|
594
|
+
command,
|
|
595
|
+
status: 'fail',
|
|
596
|
+
recoverable: false,
|
|
597
|
+
recovered: state.recovered,
|
|
598
|
+
mutations: state.mutations,
|
|
599
|
+
attemptedRecoveries: state.attemptedRecoveries,
|
|
600
|
+
summaryPath: result.summaryPath,
|
|
601
|
+
tracePath: result.tracePath,
|
|
602
|
+
artifactManifestPath: result.artifactManifestPath,
|
|
603
|
+
exitCode: violation.exitCode,
|
|
604
|
+
error: {
|
|
605
|
+
code: violation.code,
|
|
606
|
+
message: violation.message,
|
|
607
|
+
retryable: false,
|
|
608
|
+
userAction,
|
|
609
|
+
originalError: violation.originalError ?? null,
|
|
610
|
+
},
|
|
611
|
+
}, null, 2));
|
|
612
|
+
}
|
|
613
|
+
else {
|
|
614
|
+
const message = violation.code === 'APP_LOGIC_FAILURE' && violation.originalError
|
|
615
|
+
? conciseFailureForHuman(violation.originalError)
|
|
616
|
+
: violation.message;
|
|
617
|
+
console.error(`✗ ${harnessHost().name} ${command}: ${message}` +
|
|
618
|
+
(violation.originalError && violation.code !== 'APP_LOGIC_FAILURE'
|
|
619
|
+
? `\n --- original failure ---\n${violation.originalError}`
|
|
620
|
+
: '') +
|
|
621
|
+
(userAction ? `\n Next: ${userAction}` : ''));
|
|
622
|
+
}
|
|
623
|
+
return violation.exitCode;
|
|
624
|
+
}
|
|
625
|
+
export function countRecipeNodes(recipe) {
|
|
626
|
+
if (!isRecord(recipe))
|
|
627
|
+
return undefined;
|
|
628
|
+
const workflow = isRecord(recipe.workflow) ? recipe.workflow : undefined;
|
|
629
|
+
const nodes = workflow && isRecord(workflow.nodes) ? workflow.nodes : undefined;
|
|
630
|
+
return nodes ? Object.keys(nodes).length : undefined;
|
|
631
|
+
}
|
|
632
|
+
//# sourceMappingURL=run-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-engine.js","sourceRoot":"","sources":["../../src/harness/run-engine.ts"],"names":[],"mappings":"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"}
|