@farmslot/adapter-rn 0.15.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 +117 -0
- package/LICENSE +21 -0
- package/README.md +143 -0
- package/bin/farmslot-adapter-rn.mjs +10 -0
- package/dist/agent-device-ui-transport.d.ts +88 -0
- package/dist/agent-device-ui-transport.d.ts.map +1 -0
- package/dist/agent-device-ui-transport.js +1148 -0
- package/dist/agent-device-ui-transport.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +169 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/doctor.d.ts +17 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +125 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +2 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +5 -0
- package/dist/json.js.map +1 -0
- package/dist/metro-recipe-bridge-transport.d.ts +12 -0
- package/dist/metro-recipe-bridge-transport.d.ts.map +1 -0
- package/dist/metro-recipe-bridge-transport.js +63 -0
- package/dist/metro-recipe-bridge-transport.js.map +1 -0
- package/dist/redaction.d.ts +3 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +57 -0
- package/dist/redaction.js.map +1 -0
- package/dist/runner.d.ts +20 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +270 -0
- package/dist/runner.js.map +1 -0
- package/dist/scaffold.d.ts +14 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +82 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/simctl-video-recorder.d.ts +6 -0
- package/dist/simctl-video-recorder.d.ts.map +1 -0
- package/dist/simctl-video-recorder.js +160 -0
- package/dist/simctl-video-recorder.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +81 -0
- package/templates/scripts/agentic/recipe/README.md +15 -0
- package/templates/scripts/agentic/recipe/action-manifest.json +547 -0
- package/templates/scripts/agentic/recipe/action-manifest.with-bridge.json +599 -0
- package/templates/scripts/agentic/recipe/recipes/expo.config.recipe.json +37 -0
- package/templates/scripts/agentic/validate-recipe.sh +64 -0
- package/templates/src/farmslot/RecipeBridgeProvider.tsx +127 -0
- package/templates/src/farmslot/RecipeHud.tsx +138 -0
- package/templates/src/farmslot/index.ts +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metro-recipe-bridge-transport.js","sourceRoot":"","sources":["../src/metro-recipe-bridge-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAGnB,MAAM,yBAAyB,CAAC;AASjC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAU9E"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createStandardCoreAdapters, } from '@farmslot/recipe-runner';
|
|
2
|
+
const SENSITIVE_OUTPUT_KEY_PATTERN = /(token|secret|password|api[_-]?key|private[_-]?key|auth(?:key|token|secret)|credential)/iu;
|
|
3
|
+
const SENSITIVE_TEXT_PATTERN = /\b(token|secret|password|api[_-]?key|private[_-]?key|auth(?:key|token|secret)|credential)\b(\s*[:=]\s*)("[^"]*"|'[^']*'|[^\s,;]+)/giu;
|
|
4
|
+
const REDACTED_VALUE = '<redacted>';
|
|
5
|
+
// Recipe traces persist adapter outputs, so the Expo package redacts command output before the runner writes any artifacts.
|
|
6
|
+
export function createRedactingCoreAdapters(actions) {
|
|
7
|
+
return createStandardCoreAdapters({ actions }).map((adapter) => {
|
|
8
|
+
if (adapter.action !== 'command')
|
|
9
|
+
return adapter;
|
|
10
|
+
return {
|
|
11
|
+
...adapter,
|
|
12
|
+
async execute(node, context) {
|
|
13
|
+
return redactActionResult(await adapter.execute(node, context));
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function redactActionResult(result) {
|
|
19
|
+
return result.output === undefined
|
|
20
|
+
? result
|
|
21
|
+
: { ...result, output: redactSensitiveOutput(result.output) };
|
|
22
|
+
}
|
|
23
|
+
function redactSensitiveOutput(value, sensitiveKey = false) {
|
|
24
|
+
if (sensitiveKey)
|
|
25
|
+
return REDACTED_VALUE;
|
|
26
|
+
if (Array.isArray(value))
|
|
27
|
+
return value.map((entry) => redactSensitiveOutput(entry));
|
|
28
|
+
if (value && typeof value === 'object')
|
|
29
|
+
return redactSensitiveObject(value);
|
|
30
|
+
if (typeof value === 'string')
|
|
31
|
+
return redactSensitiveString(value);
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function redactSensitiveObject(value) {
|
|
35
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
|
|
36
|
+
key,
|
|
37
|
+
redactSensitiveOutput(entry, SENSITIVE_OUTPUT_KEY_PATTERN.test(key)),
|
|
38
|
+
]));
|
|
39
|
+
}
|
|
40
|
+
function redactSensitiveString(value) {
|
|
41
|
+
const trimmed = value.trim();
|
|
42
|
+
if (!trimmed.startsWith('{') && !trimmed.startsWith('['))
|
|
43
|
+
return redactSensitiveText(value);
|
|
44
|
+
try {
|
|
45
|
+
return JSON.stringify(redactSensitiveOutput(JSON.parse(value)));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Non-JSON stdout/stderr is expected for arbitrary project commands; redact common key=value fragments only.
|
|
49
|
+
return redactSensitiveText(value);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function redactSensitiveText(value) {
|
|
53
|
+
return value.replace(SENSITIVE_TEXT_PATTERN, (_match, key, separator) => {
|
|
54
|
+
return `${key}${separator}${REDACTED_VALUE}`;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,4BAA4B,GAChC,2FAA2F,CAAC;AAC9F,MAAM,sBAAsB,GAC1B,sIAAsI,CAAC;AACzI,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,4HAA4H;AAC5H,MAAM,UAAU,2BAA2B,CAAC,OAAiB;IAC3D,OAAO,0BAA0B,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC;QACjD,OAAO;YACL,GAAG,OAAO;YACV,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO;gBACzB,OAAO,kBAAkB,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,CAAC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAoB;IAC9C,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS;QAChC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAE,YAAY,GAAG,KAAK;IACjE,IAAI,YAAY;QAAE,OAAO,cAAc,CAAC;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAC1C,GAAG;QACH,qBAAqB,CAAC,KAAK,EAAE,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACrE,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC5F,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,6GAA6G;QAC7G,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,SAAiB,EAAE,EAAE;QACtF,OAAO,GAAG,GAAG,GAAG,SAAS,GAAG,cAAc,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type RecipeVideoRecordingOptions, type RecordingTarget, type VideoRecorder } from '@farmslot/recipe-runner';
|
|
2
|
+
export interface ExpoRecipeRunOptions {
|
|
3
|
+
projectRoot?: string;
|
|
4
|
+
manifestPath?: string;
|
|
5
|
+
artifactsDir?: string;
|
|
6
|
+
dryRun?: boolean;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
recordVideo?: boolean | RecipeVideoRecordingOptions;
|
|
9
|
+
metroHost?: string;
|
|
10
|
+
metroPort?: number;
|
|
11
|
+
params?: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export declare function validateExpoRecipeDocument(recipePath?: string, options?: ExpoRecipeRunOptions): Promise<import("@farmslot/protocol").RecipeValidationResult>;
|
|
14
|
+
export declare function runExpoRecipeDocument(recipePath?: string, options?: ExpoRecipeRunOptions): Promise<import("@farmslot/recipe-runner").RecipeRunResult>;
|
|
15
|
+
export declare function closeUiTransportQuietly(transport: {
|
|
16
|
+
close?(): Promise<unknown> | void;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
export declare function resolveExpoRecordingTarget(env: Record<string, string | undefined>): RecordingTarget;
|
|
19
|
+
export declare function resolveExpoVideoRecorder(env: Record<string, string | undefined>): VideoRecorder;
|
|
20
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AASA,OAAO,EAOL,KAAK,2BAA2B,EAChC,KAAK,eAAe,EAOpB,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AAsBjC,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,GAAG,2BAA2B,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,wBAAsB,0BAA0B,CAC9C,UAAU,GAAE,MAAiC,EAC7C,OAAO,GAAE,oBAAyB,gEAgBnC;AAED,wBAAsB,qBAAqB,CACzC,UAAU,GAAE,MAAiC,EAC7C,OAAO,GAAE,oBAAyB,8DAyEnC;AAoDD,wBAAsB,uBAAuB,CAAC,SAAS,EAAE;IACvD,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CACnC,GAAG,OAAO,CAAC,IAAI,CAAC,CAShB;AAUD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,eAAe,CAWjB;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,aAAa,CAY/F"}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { digestRecipeDocument, getRecipeActionManifestActionNames, isRecord, } from '@farmslot/protocol';
|
|
4
|
+
import { applyTaskLocalInvocationTrust, createCaptureHelperVideoRecorder, createRecipeRunner, createStandardUiAdapters, loadRecipeLibraries, resolveRecipeDependencies, resolveRecipeLibrarySources, resolveRecipeTrustInput, rootResolutionRef, } from '@farmslot/recipe-runner';
|
|
5
|
+
import { parsePositiveInteger, resolveRecipeCliPath, validateRecipeCliInput, } from '@farmslot/recipe-runner/cli/support';
|
|
6
|
+
import { createAgentDeviceUiTransport, NATIVE_UI_ACTIONS, } from './agent-device-ui-transport.js';
|
|
7
|
+
import { DEFAULT_EXPO_RECIPE_MANIFEST_PATH, DEFAULT_EXPO_RECIPE_PATH } from './constants.js';
|
|
8
|
+
import { readJsonFile } from './json.js';
|
|
9
|
+
import { createMetroRecipeBridgeUiTransport, resolveMetroRecipeBridgePort, } from './metro-recipe-bridge-transport.js';
|
|
10
|
+
import { createRedactingCoreAdapters } from './redaction.js';
|
|
11
|
+
import { createSimctlVideoRecorder } from './simctl-video-recorder.js';
|
|
12
|
+
import { ADAPTER_RN_PACKAGE_VERSIONS } from './version.js';
|
|
13
|
+
export async function validateExpoRecipeDocument(recipePath = DEFAULT_EXPO_RECIPE_PATH, options = {}) {
|
|
14
|
+
const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
|
|
15
|
+
const recipeAbsolutePath = resolveRecipeCliPath(recipePath, projectRoot);
|
|
16
|
+
const librarySources = await resolveRecipeLibrarySources({ recipePath: recipeAbsolutePath });
|
|
17
|
+
const platform = normalizeRecipeAdapter(process.env.PLATFORM);
|
|
18
|
+
return validateRecipeCliInput({
|
|
19
|
+
recipePath: recipeAbsolutePath,
|
|
20
|
+
actionManifestPath: options.manifestPath ?? DEFAULT_EXPO_RECIPE_MANIFEST_PATH,
|
|
21
|
+
...(platform ? { adapter: platform } : {}),
|
|
22
|
+
baseDir: projectRoot,
|
|
23
|
+
artifactDir: options.artifactsDir,
|
|
24
|
+
...(librarySources.length ? { librarySources } : {}),
|
|
25
|
+
...(options.params ? { params: options.params } : {}),
|
|
26
|
+
packageVersions: ADAPTER_RN_PACKAGE_VERSIONS,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export async function runExpoRecipeDocument(recipePath = DEFAULT_EXPO_RECIPE_PATH, options = {}) {
|
|
30
|
+
const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
|
|
31
|
+
const manifestPath = resolveRecipeCliPath(options.manifestPath ?? DEFAULT_EXPO_RECIPE_MANIFEST_PATH, projectRoot);
|
|
32
|
+
const recipeAbsolutePath = resolveRecipeCliPath(recipePath, projectRoot);
|
|
33
|
+
const artifactsDir = resolveRecipeCliPath(options.artifactsDir ?? defaultArtifactsDir(recipePath), projectRoot);
|
|
34
|
+
const manifest = (await readJsonFile(manifestPath));
|
|
35
|
+
const platform = normalizeRecipeAdapter(process.env.PLATFORM);
|
|
36
|
+
const actions = getRecipeActionManifestActionNames(manifest);
|
|
37
|
+
const trust = resolveRecipeTrustInput();
|
|
38
|
+
const invocationTrust = trust.source?.trust ?? 'trusted';
|
|
39
|
+
const librarySources = applyTaskLocalInvocationTrust(await resolveRecipeLibrarySources({ recipePath: recipeAbsolutePath }), invocationTrust);
|
|
40
|
+
if (!options.dryRun && platform !== 'web') {
|
|
41
|
+
await assertNativeRecipeContext(recipeAbsolutePath, librarySources, process.env);
|
|
42
|
+
}
|
|
43
|
+
const transport = createExpoUiTransport(options);
|
|
44
|
+
const adapters = [
|
|
45
|
+
...createRedactingCoreAdapters(actions),
|
|
46
|
+
...createStandardUiAdapters({
|
|
47
|
+
actions,
|
|
48
|
+
transport,
|
|
49
|
+
}),
|
|
50
|
+
];
|
|
51
|
+
const runner = createRecipeRunner({
|
|
52
|
+
actionManifest: manifest,
|
|
53
|
+
adapters,
|
|
54
|
+
defaultSource: {
|
|
55
|
+
kind: 'operator',
|
|
56
|
+
trust: 'trusted',
|
|
57
|
+
name: '@farmslot/adapter-rn',
|
|
58
|
+
},
|
|
59
|
+
hud: false,
|
|
60
|
+
runner: {
|
|
61
|
+
source: '@farmslot/adapter-rn',
|
|
62
|
+
git_ref: 'package',
|
|
63
|
+
name: '@farmslot/adapter-rn',
|
|
64
|
+
},
|
|
65
|
+
logger: console,
|
|
66
|
+
recording: {
|
|
67
|
+
targetProvider: createExpoRecordingTargetProvider(),
|
|
68
|
+
videoRecorder: resolveExpoVideoRecorder(process.env),
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
try {
|
|
72
|
+
return await runner.run({
|
|
73
|
+
recipePath: recipeAbsolutePath,
|
|
74
|
+
artifactsDir,
|
|
75
|
+
projectRoot,
|
|
76
|
+
...(librarySources.length ? { librarySources } : {}),
|
|
77
|
+
packageVersions: ADAPTER_RN_PACKAGE_VERSIONS,
|
|
78
|
+
...(options.params ? { params: options.params } : {}),
|
|
79
|
+
...(platform ? { adapter: platform } : {}),
|
|
80
|
+
env: {
|
|
81
|
+
FARMSLOT_RECIPE_ARTIFACTS_DIR: artifactsDir,
|
|
82
|
+
},
|
|
83
|
+
recordVideo: options.recordVideo,
|
|
84
|
+
...trust,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
await closeUiTransportQuietly(transport);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function assertNativeRecipeContext(recipePath, librarySources, env) {
|
|
92
|
+
const root = await readJsonFile(recipePath);
|
|
93
|
+
if (!isRecord(root))
|
|
94
|
+
return;
|
|
95
|
+
const libraries = await loadRecipeLibraries(librarySources, {
|
|
96
|
+
packageVersions: ADAPTER_RN_PACKAGE_VERSIONS,
|
|
97
|
+
});
|
|
98
|
+
const digest = digestRecipeDocument(root);
|
|
99
|
+
const dependencies = resolveRecipeDependencies({
|
|
100
|
+
rootRef: rootResolutionRef(digest),
|
|
101
|
+
root,
|
|
102
|
+
rootSource: { kind: 'operator', trust: 'trusted', path: recipePath, digest },
|
|
103
|
+
recipes: libraries.recipes,
|
|
104
|
+
});
|
|
105
|
+
const documents = [root, ...[...dependencies.recipes.values()].map((entry) => entry.document)];
|
|
106
|
+
if (!documents.some(recipeUsesNativeUi))
|
|
107
|
+
return;
|
|
108
|
+
const platform = normalizeNativePlatform(env.PLATFORM);
|
|
109
|
+
if (!platform) {
|
|
110
|
+
throw new Error('Native recipe actions require PLATFORM=ios or android from the assigned slot.');
|
|
111
|
+
}
|
|
112
|
+
const device = platform === 'ios'
|
|
113
|
+
? (env.IOS_SIMULATOR ?? env.SIMULATOR)
|
|
114
|
+
: (env.ADB_SERIAL ?? env.ANDROID_SERIAL ?? env.ANDROID_DEVICE);
|
|
115
|
+
if (!device) {
|
|
116
|
+
throw new Error(platform === 'ios'
|
|
117
|
+
? 'Native iOS recipe actions require IOS_SIMULATOR or SIMULATOR from the assigned slot.'
|
|
118
|
+
: 'Native Android recipe actions require ADB_SERIAL from the assigned slot.');
|
|
119
|
+
}
|
|
120
|
+
if (!env.FARMSLOT_RECIPE_APP_ID) {
|
|
121
|
+
throw new Error('Native recipe actions require FARMSLOT_RECIPE_APP_ID for the target app.');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function recipeUsesNativeUi(recipe) {
|
|
125
|
+
const workflow = isRecord(recipe.workflow) ? recipe.workflow : {};
|
|
126
|
+
const nodes = isRecord(workflow.nodes) ? Object.values(workflow.nodes) : [];
|
|
127
|
+
return nodes.some((node) => isRecord(node) && typeof node.action === 'string' && isNativeUiAction(node.action));
|
|
128
|
+
}
|
|
129
|
+
export async function closeUiTransportQuietly(transport) {
|
|
130
|
+
try {
|
|
131
|
+
await transport.close?.();
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
// Cleanup must never convert a passing run to failure or mask the original run error.
|
|
135
|
+
console.warn(`Native recipe transport cleanup failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function createExpoRecordingTargetProvider() {
|
|
139
|
+
return {
|
|
140
|
+
async resolveRecordingTarget() {
|
|
141
|
+
return resolveExpoRecordingTarget(process.env);
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export function resolveExpoRecordingTarget(env) {
|
|
146
|
+
if (env.FARMSLOT_RECORD_PID)
|
|
147
|
+
return { kind: 'pid', pid: parsePositiveInteger(env.FARMSLOT_RECORD_PID) };
|
|
148
|
+
if (env.FARMSLOT_RECORD_WINDOW_ID) {
|
|
149
|
+
return { kind: 'window-id', windowId: env.FARMSLOT_RECORD_WINDOW_ID };
|
|
150
|
+
}
|
|
151
|
+
const simulator = env.SIMULATOR ?? env.IOS_SIMULATOR;
|
|
152
|
+
if (simulator)
|
|
153
|
+
return { kind: 'simulator', device: simulator };
|
|
154
|
+
const appName = env.FARMSLOT_RECORD_APP_NAME ?? 'Simulator';
|
|
155
|
+
const windowName = env.FARMSLOT_RECORD_WINDOW_NAME ?? 'Simulator';
|
|
156
|
+
return { kind: 'app-window', appName, windowName };
|
|
157
|
+
}
|
|
158
|
+
export function resolveExpoVideoRecorder(env) {
|
|
159
|
+
if (env.FARMSLOT_RECORD_PID ||
|
|
160
|
+
env.FARMSLOT_RECORD_WINDOW_ID ||
|
|
161
|
+
env.FARMSLOT_RECORD_APP_NAME ||
|
|
162
|
+
env.FARMSLOT_RECORD_WINDOW_NAME) {
|
|
163
|
+
return createCaptureHelperVideoRecorder();
|
|
164
|
+
}
|
|
165
|
+
const target = resolveExpoRecordingTarget(env);
|
|
166
|
+
if (target.kind === 'simulator')
|
|
167
|
+
return createSimctlVideoRecorder();
|
|
168
|
+
return createCaptureHelperVideoRecorder();
|
|
169
|
+
}
|
|
170
|
+
function createExpoUiTransport(options) {
|
|
171
|
+
if (options.dryRun === true) {
|
|
172
|
+
return dryRunUiTransport(true);
|
|
173
|
+
}
|
|
174
|
+
let metro;
|
|
175
|
+
const resolveMetro = () => {
|
|
176
|
+
metro ??= createMetroRecipeBridgeUiTransport({
|
|
177
|
+
host: options.metroHost ?? process.env.FARMSLOT_RECIPE_METRO_HOST ?? '127.0.0.1',
|
|
178
|
+
port: options.metroPort ?? resolveMetroRecipeBridgePort(),
|
|
179
|
+
});
|
|
180
|
+
return metro;
|
|
181
|
+
};
|
|
182
|
+
const native = resolveAgentDeviceTransport();
|
|
183
|
+
if (!native) {
|
|
184
|
+
return {
|
|
185
|
+
execute(action, node, context) {
|
|
186
|
+
return resolveMetro().execute(action, node, context);
|
|
187
|
+
},
|
|
188
|
+
observe(refs, node, context) {
|
|
189
|
+
return resolveMetro().observe(refs, node, context);
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
execute(action, node, context) {
|
|
195
|
+
return isNativeUiAction(action)
|
|
196
|
+
? native.execute(action, node, context)
|
|
197
|
+
: resolveMetro().execute(action, node, context);
|
|
198
|
+
},
|
|
199
|
+
observe(refs, node, context) {
|
|
200
|
+
return native.observe(refs, node, context);
|
|
201
|
+
},
|
|
202
|
+
close() {
|
|
203
|
+
return native.close();
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function resolveAgentDeviceTransport() {
|
|
208
|
+
const platform = normalizeNativePlatform(process.env.PLATFORM);
|
|
209
|
+
const device = platform === 'ios'
|
|
210
|
+
? (process.env.IOS_SIMULATOR ?? process.env.SIMULATOR)
|
|
211
|
+
: (process.env.ADB_SERIAL ?? process.env.ANDROID_SERIAL ?? process.env.ANDROID_DEVICE);
|
|
212
|
+
const app = process.env.FARMSLOT_RECIPE_APP_ID;
|
|
213
|
+
if (!platform || !device || !app)
|
|
214
|
+
return undefined;
|
|
215
|
+
const slot = process.env.FARMSLOT_SLOT_ID ?? path.basename(process.env.RUNTIME_DIR ?? 'local');
|
|
216
|
+
const deviceKey = device.replace(/[^a-zA-Z0-9._-]/gu, '-');
|
|
217
|
+
return createAgentDeviceUiTransport({
|
|
218
|
+
platform,
|
|
219
|
+
device,
|
|
220
|
+
app,
|
|
221
|
+
session: `farmslot-${slot}-${process.pid}`.replace(/[^a-zA-Z0-9._-]/gu, '-'),
|
|
222
|
+
stateDir: process.env.FARMSLOT_AGENT_DEVICE_STATE_DIR ??
|
|
223
|
+
path.join(os.tmpdir(), 'farmslot-agent-device', deviceKey),
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
function normalizeNativePlatform(value) {
|
|
227
|
+
if (value?.startsWith('ios'))
|
|
228
|
+
return 'ios';
|
|
229
|
+
if (value?.startsWith('android'))
|
|
230
|
+
return 'android';
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
function normalizeRecipeAdapter(value) {
|
|
234
|
+
return normalizeNativePlatform(value) ?? (value?.startsWith('web') ? 'web' : undefined);
|
|
235
|
+
}
|
|
236
|
+
function isNativeUiAction(action) {
|
|
237
|
+
return NATIVE_UI_ACTIONS.includes(action);
|
|
238
|
+
}
|
|
239
|
+
function dryRunUiTransport(isDryRun) {
|
|
240
|
+
return {
|
|
241
|
+
async execute(action, node, context) {
|
|
242
|
+
if (!isDryRun) {
|
|
243
|
+
throw new Error(`${action} requires a project live UI bridge. Run with --dry-run for scaffold validation or configure a project transport.`);
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
output: {
|
|
247
|
+
ok: true,
|
|
248
|
+
dryRun: true,
|
|
249
|
+
action,
|
|
250
|
+
nodeId: context.nodeId,
|
|
251
|
+
intent: typeof node.intent === 'string' ? node.intent : undefined,
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
},
|
|
255
|
+
async observe() {
|
|
256
|
+
return {};
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function defaultArtifactsDir(recipePath) {
|
|
261
|
+
const slug = path
|
|
262
|
+
.basename(recipePath)
|
|
263
|
+
.replace(/\.recipe\.json$/u, '')
|
|
264
|
+
.replace(/\.json$/u, '');
|
|
265
|
+
return path.join('.agent', 'recipe-runs', `${slug}-${timestamp()}`);
|
|
266
|
+
}
|
|
267
|
+
function timestamp() {
|
|
268
|
+
return new Date().toISOString().replace(/[:.]/gu, '-');
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ExpoRecipeInstallOptions {
|
|
2
|
+
projectRoot?: string;
|
|
3
|
+
force?: boolean;
|
|
4
|
+
withBridge?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface ExpoRecipeInstallResult {
|
|
7
|
+
projectRoot: string;
|
|
8
|
+
written: string[];
|
|
9
|
+
skipped: string[];
|
|
10
|
+
packageJsonUpdated: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function installExpoRecipeScaffold(options?: ExpoRecipeInstallOptions): Promise<ExpoRecipeInstallResult>;
|
|
13
|
+
export declare function packageScripts(): Record<string, string>;
|
|
14
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAUD,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAmBlC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASvD"}
|
package/dist/scaffold.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { copyFile, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { BRIDGE_HUD_PATH, BRIDGE_INDEX_PATH, BRIDGE_PROVIDER_PATH, DEFAULT_EXPO_RECIPE_MANIFEST_PATH, DEFAULT_EXPO_RECIPE_PATH, } from './constants.js';
|
|
6
|
+
const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
7
|
+
const TEMPLATE_ROOT = resolveTemplateRoot();
|
|
8
|
+
export async function installExpoRecipeScaffold(options = {}) {
|
|
9
|
+
const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
|
|
10
|
+
const files = scaffoldFiles(options.withBridge === true);
|
|
11
|
+
const written = [];
|
|
12
|
+
const skipped = [];
|
|
13
|
+
for (const file of files) {
|
|
14
|
+
const target = path.join(projectRoot, file.target);
|
|
15
|
+
if (!options.force && existsSync(target)) {
|
|
16
|
+
skipped.push(file.target);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
20
|
+
await copyFile(path.join(TEMPLATE_ROOT, file.source), target);
|
|
21
|
+
written.push(file.target);
|
|
22
|
+
}
|
|
23
|
+
const packageJsonUpdated = await updatePackageScripts(projectRoot, options.force === true);
|
|
24
|
+
return { projectRoot, written, skipped, packageJsonUpdated };
|
|
25
|
+
}
|
|
26
|
+
export function packageScripts() {
|
|
27
|
+
return {
|
|
28
|
+
recipe: 'farmslot-adapter-rn',
|
|
29
|
+
'recipe:manifest': 'farmslot-adapter-rn manifest',
|
|
30
|
+
'recipe:doctor': 'farmslot-adapter-rn doctor',
|
|
31
|
+
'recipe:validate': 'farmslot-adapter-rn validate',
|
|
32
|
+
'recipe:dry-run': 'farmslot-adapter-rn run --dry-run',
|
|
33
|
+
'recipe:run': 'farmslot-adapter-rn run',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function scaffoldFiles(withBridge) {
|
|
37
|
+
const files = [
|
|
38
|
+
{ source: DEFAULT_EXPO_RECIPE_MANIFEST_PATH, target: DEFAULT_EXPO_RECIPE_MANIFEST_PATH },
|
|
39
|
+
{ source: DEFAULT_EXPO_RECIPE_PATH, target: DEFAULT_EXPO_RECIPE_PATH },
|
|
40
|
+
{ source: 'scripts/agentic/recipe/README.md', target: 'scripts/agentic/recipe/README.md' },
|
|
41
|
+
{ source: 'scripts/agentic/validate-recipe.sh', target: 'scripts/agentic/validate-recipe.sh' },
|
|
42
|
+
];
|
|
43
|
+
if (!withBridge)
|
|
44
|
+
return files;
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
source: 'scripts/agentic/recipe/action-manifest.with-bridge.json',
|
|
48
|
+
target: DEFAULT_EXPO_RECIPE_MANIFEST_PATH,
|
|
49
|
+
},
|
|
50
|
+
...files.slice(1),
|
|
51
|
+
{ source: BRIDGE_PROVIDER_PATH, target: BRIDGE_PROVIDER_PATH },
|
|
52
|
+
{ source: BRIDGE_HUD_PATH, target: BRIDGE_HUD_PATH },
|
|
53
|
+
{ source: BRIDGE_INDEX_PATH, target: BRIDGE_INDEX_PATH },
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
async function updatePackageScripts(projectRoot, overwriteExisting = false) {
|
|
57
|
+
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
58
|
+
if (!existsSync(packageJsonPath))
|
|
59
|
+
return false;
|
|
60
|
+
const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));
|
|
61
|
+
packageJson.scripts = packageJson.scripts ?? {};
|
|
62
|
+
let changed = false;
|
|
63
|
+
for (const [name, command] of Object.entries(packageScripts())) {
|
|
64
|
+
if (!overwriteExisting && Object.hasOwn(packageJson.scripts, name))
|
|
65
|
+
continue;
|
|
66
|
+
if (packageJson.scripts[name] === command)
|
|
67
|
+
continue;
|
|
68
|
+
packageJson.scripts[name] = command;
|
|
69
|
+
changed = true;
|
|
70
|
+
}
|
|
71
|
+
if (!changed)
|
|
72
|
+
return false;
|
|
73
|
+
await writeFile(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\n`);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
function resolveTemplateRoot() {
|
|
77
|
+
const packageRootCandidate = path.join(PACKAGE_ROOT, 'templates');
|
|
78
|
+
if (existsSync(packageRootCandidate))
|
|
79
|
+
return packageRootCandidate;
|
|
80
|
+
return path.resolve(process.cwd(), 'packages/adapter-rn/templates');
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type VideoRecorder } from '@farmslot/recipe-runner';
|
|
2
|
+
export interface SimctlVideoRecorderOptions {
|
|
3
|
+
stopTimeoutMs?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function createSimctlVideoRecorder(options?: SimctlVideoRecorderOptions): VideoRecorder;
|
|
6
|
+
//# sourceMappingURL=simctl-video-recorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simctl-video-recorder.d.ts","sourceRoot":"","sources":["../src/simctl-video-recorder.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,aAAa,EAGnB,MAAM,yBAAyB,CAAC;AAIjC,MAAM,WAAW,0BAA0B;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,0BAA+B,GAAG,aAAa,CAEjG"}
|