@farmslot/recipe-cli 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +12 -12
  3. package/dist/harness/adapters.d.ts +2 -0
  4. package/dist/harness/adapters.d.ts.map +1 -1
  5. package/dist/harness/adapters.js +4 -0
  6. package/dist/harness/adapters.js.map +1 -1
  7. package/dist/harness/execution-provenance.d.ts +56 -0
  8. package/dist/harness/execution-provenance.d.ts.map +1 -0
  9. package/dist/harness/execution-provenance.js +308 -0
  10. package/dist/harness/execution-provenance.js.map +1 -0
  11. package/dist/harness/host.d.ts +8 -0
  12. package/dist/harness/host.d.ts.map +1 -1
  13. package/dist/harness/host.js +9 -2
  14. package/dist/harness/host.js.map +1 -1
  15. package/dist/harness/index.d.ts +12 -2
  16. package/dist/harness/index.d.ts.map +1 -1
  17. package/dist/harness/index.js +12 -2
  18. package/dist/harness/index.js.map +1 -1
  19. package/dist/harness/live-adapter-contract.d.ts +32 -0
  20. package/dist/harness/live-adapter-contract.d.ts.map +1 -0
  21. package/dist/harness/live-adapter-contract.js +425 -0
  22. package/dist/harness/live-adapter-contract.js.map +1 -0
  23. package/dist/harness/recording-target.d.ts +9 -0
  24. package/dist/harness/recording-target.d.ts.map +1 -0
  25. package/dist/harness/recording-target.js +39 -0
  26. package/dist/harness/recording-target.js.map +1 -0
  27. package/dist/harness/run-diagnostics.d.ts +139 -0
  28. package/dist/harness/run-diagnostics.d.ts.map +1 -0
  29. package/dist/harness/run-diagnostics.js +458 -0
  30. package/dist/harness/run-diagnostics.js.map +1 -0
  31. package/dist/harness/run-options.d.ts +4 -0
  32. package/dist/harness/run-options.d.ts.map +1 -0
  33. package/dist/harness/run-options.js +35 -0
  34. package/dist/harness/run-options.js.map +1 -0
  35. package/dist/harness/run-recording.d.ts +43 -0
  36. package/dist/harness/run-recording.d.ts.map +1 -0
  37. package/dist/harness/run-recording.js +517 -0
  38. package/dist/harness/run-recording.js.map +1 -0
  39. package/dist/harness/run-report.d.ts +19 -0
  40. package/dist/harness/run-report.d.ts.map +1 -0
  41. package/dist/harness/run-report.js +269 -0
  42. package/dist/harness/run-report.js.map +1 -0
  43. package/dist/harness/runtime-proof.d.ts +27 -0
  44. package/dist/harness/runtime-proof.d.ts.map +1 -0
  45. package/dist/harness/runtime-proof.js +144 -0
  46. package/dist/harness/runtime-proof.js.map +1 -0
  47. package/dist/harness/suggest.d.ts +3 -0
  48. package/dist/harness/suggest.d.ts.map +1 -0
  49. package/dist/harness/suggest.js +37 -0
  50. package/dist/harness/suggest.js.map +1 -0
  51. package/dist/harness/trust.d.ts +38 -0
  52. package/dist/harness/trust.d.ts.map +1 -0
  53. package/dist/harness/trust.js +89 -0
  54. package/dist/harness/trust.js.map +1 -0
  55. package/package.json +4 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  // Generic harness support shared by every host CLI (`farmslot-recipe`, product
2
2
  // presets such as `mm-harness`): host identity, runtime paths, the resumability
3
3
  // journal, the checkout lock, JSON streaming and colour output.
4
- export { adapterDetectNext, adapterFlags, adapterForPlatform, assertAdapter, configureHarnessAdapters, detectAdapter, harnessAdapter, harnessAdapters, isPlatformTarget, undetectedAdapterMessage, } from './adapters.js';
4
+ export { adapterDetectNext, adapterFlags, adapterForPlatform, adapterPortFlags, assertAdapter, configureHarnessAdapters, detectAdapter, harnessAdapter, harnessAdapters, isPlatformTarget, undetectedAdapterMessage, } from './adapters.js';
5
5
  export { indexArtifactManifest, readContainedJsonArtifact, writeContainedArtifact, } from './artifact-files.js';
6
6
  export { acquireCheckoutLock, trackCheckoutChild, } from './checkout-lock.js';
7
7
  export { classifyLogEvent, color, colorEnabled, colorHumanMessage, colorKv, colorLogEvent, colorStatusWord, stripAnsi, } from './cli-color.js';
@@ -10,13 +10,23 @@ export { handleLast } from './commands/last.js';
10
10
  export { handleLaunch } from './commands/launch.js';
11
11
  export { handleReload } from './commands/reload.js';
12
12
  export { handleStop } from './commands/stop.js';
13
+ export { captureExecutionProvenance, executionProvenanceDrift, ProvenanceDriftError, writeExecutionProvenance, } from './execution-provenance.js';
13
14
  export { checkHealBounds, classifyFailure, conciseFailureForHuman, ensureOverlay, newHealState, parseHeal, recipeRunning, } from './heal-bounds.js';
14
- export { configureHarnessHost, harnessHost, hostEnvName, validateRelativeRecipePath, } from './host.js';
15
+ export { configureHarnessHost, harnessHost, hostEnvName, recipeEnvName, validateRelativeRecipePath, } from './host.js';
15
16
  export { JsonStreamWriter } from './json-stream.js';
16
17
  export { leafStartFailureMessage, missingShellLeafMessage, resolveLeafInvoke, shellLeafMissing, } from './leaf-invoke.js';
17
18
  export { gitLibraryProvenance } from './library-provenance.js';
19
+ export { liveAdapterProcessTimeoutMs, prepareLiveAdapterScript, resolveLiveAdapter, runLiveAdapterScript, } from './live-adapter-contract.js';
18
20
  export { argValue, handleHarness, hasArg, readRuntimeContextField, resolveRuntimeContextPath, } from './overlay.js';
19
21
  export { actionManifestPathOption, adapterOption, applyRuntimeDirOption, applyWatcherPortOption, CliError, isRecord, optionFlag, optionString, optionStrings, parseArgs, parsePort, parseRecipeParamAssignments, requiredOption, resolveAdapter, shellQuote, shellQuoteArg, targetPath, usageError, } from './parse-args.js';
20
22
  export { DEFAULT_RECIPE_HARNESS_ROOT, DEFAULT_RECIPE_RUNTIME_DIR, harnessExecutable, recipeHarnessPath, recipeHarnessRoot, recipeRuntimeDir, recipeRuntimePath, } from './paths.js';
23
+ export { captureHelperPath, captureHelperSupportsCapability, captureHelperSupportsRecordSessionSnapshots, createRecordingTargetProvider, } from './recording-target.js';
24
+ export { beginRunDiagnostics, collectRunDiagnostics, finishRunDiagnostics, formatRunDiagnosticsForHuman, readRunDiagnosticsDocument, verifyConsoleCapture, } from './run-diagnostics.js';
25
+ export { recipeRunOptionsFromCli } from './run-options.js';
26
+ export { captureActiveRecipeRecordingSnapshot, startRecipeRecording, stopRecipeRecording, } from './run-recording.js';
27
+ export { executedBrowser, indexProductProvenanceArtifact, recipeCdpPorts, writeRunReport, } from './run-report.js';
28
+ export { validateRuntimeProof, validateRuntimeProofPlan, } from './runtime-proof.js';
21
29
  export { checkoutBusyOut, EXIT, flag, parseFlags, resolveFlagsAdapter, scriptOverride, spawnInherit, spawnScript, spawnScriptStreaming, str, targetOf, usageOut, writeInteractiveProgress, } from './shared.js';
30
+ export { closest } from './suggest.js';
31
+ export { explicitRecipeTrustOptions, recipeTrustFailure, } from './trust.js';
22
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,gFAAgF;AAChF,gEAAgE;AAChE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EAGnB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,eAAe,EACf,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAElB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAkD,MAAM,oBAAoB,CAAC;AAChG,OAAO,EACL,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,aAAa,EAEb,YAAY,EACZ,SAAS,EACT,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EAEpB,WAAW,EAEX,WAAW,EACX,0BAA0B,GAC3B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACL,QAAQ,EACR,aAAa,EAEb,MAAM,EAGN,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EAGR,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EAGT,SAAS,EACT,2BAA2B,EAC3B,cAAc,EACd,cAAc,EACd,UAAU,EACV,aAAa,EACb,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,IAAI,EACJ,IAAI,EAEJ,UAAU,EACV,mBAAmB,EACnB,cAAc,EAEd,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,GAAG,EAEH,QAAQ,EACR,QAAQ,EACR,wBAAwB,GACzB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,gFAAgF;AAChF,gEAAgE;AAChE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EAGnB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,eAAe,EACf,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAElB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAkD,MAAM,oBAAoB,CAAC;AAChG,OAAO,EACL,0BAA0B,EAE1B,wBAAwB,EAKxB,oBAAoB,EAEpB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,aAAa,EAEb,YAAY,EACZ,SAAS,EACT,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EAEpB,WAAW,EAEX,WAAW,EACX,aAAa,EACb,0BAA0B,GAC3B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACL,2BAA2B,EAG3B,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,QAAQ,EACR,aAAa,EAEb,MAAM,EAGN,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EAGR,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EAGT,SAAS,EACT,2BAA2B,EAC3B,cAAc,EACd,cAAc,EACd,UAAU,EACV,aAAa,EACb,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,+BAA+B,EAC/B,2CAA2C,EAC3C,6BAA6B,GAC9B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EAGnB,qBAAqB,EAOrB,oBAAoB,EACpB,4BAA4B,EAC5B,0BAA0B,EAK1B,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAEL,oCAAoC,EAEpC,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,8BAA8B,EAC9B,cAAc,EAEd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAGL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,IAAI,EACJ,IAAI,EAEJ,UAAU,EACV,mBAAmB,EACnB,cAAc,EAEd,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,GAAG,EAEH,QAAQ,EACR,QAAQ,EACR,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,0BAA0B,EAE1B,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { ActionExecutionContext } from '@farmslot/recipe-runner';
2
+ export interface PreparedLiveAdapter {
3
+ action: string;
4
+ platform: string;
5
+ entryPath: string;
6
+ sourceDigest: string;
7
+ sourceText: string;
8
+ }
9
+ export declare function prepareLiveAdapterScript({ platform, action, namespace, implementationRoot, allowRuntimeImports, }: {
10
+ platform: string;
11
+ action: string;
12
+ namespace: string;
13
+ implementationRoot: string;
14
+ allowRuntimeImports?: boolean;
15
+ }): Promise<PreparedLiveAdapter | null>;
16
+ export declare function resolveLiveAdapter(platform: string, action: string, namespace: string, runtimeEnv?: NodeJS.ProcessEnv): Promise<string | null>;
17
+ export interface LiveAdapterRun {
18
+ platform: string;
19
+ action: string;
20
+ namespace: string;
21
+ node: Record<string, unknown>;
22
+ context: Pick<ActionExecutionContext, 'nodeId' | 'projectRoot' | 'artifactsDir' | 'env' | 'registerArtifact'>;
23
+ prepared?: PreparedLiveAdapter;
24
+ contextExtras?: Record<string, unknown>;
25
+ tsxCandidates?: readonly string[];
26
+ }
27
+ export declare function runLiveAdapterScript({ platform, action, namespace, node, context, prepared, contextExtras, tsxCandidates, }: LiveAdapterRun): Promise<{
28
+ script: string;
29
+ result: unknown;
30
+ } | null>;
31
+ export declare function liveAdapterProcessTimeoutMs(node: Record<string, unknown>): number;
32
+ //# sourceMappingURL=live-adapter-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-adapter-contract.d.ts","sourceRoot":"","sources":["../../src/harness/live-adapter-contract.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAoLtE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,wBAAwB,CAAC,EAC7C,QAAQ,EACR,MAAM,EACN,SAAS,EACT,kBAAkB,EAClB,mBAA2B,GAC5B,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAEf,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA0DtC;AAuGD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,0BAG/B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAEf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,EAAE,IAAI,CACX,sBAAsB,EACtB,QAAQ,GAAG,aAAa,GAAG,cAAc,GAAG,KAAK,GAAG,kBAAkB,CACvE,CAAC;IACF,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAE/B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAExC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAsB,oBAAoB,CAAC,EACzC,QAAQ,EACR,MAAM,EACN,SAAS,EACT,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,aAAa,EACb,aAAkB,GACnB,EAAE,cAAc,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAmEtE;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAsBjF"}
@@ -0,0 +1,425 @@
1
+ // Live adapter scripts: the library action implementation (`<root>/<platform>/
2
+ // <family>/<name>.mjs`) a recipe action runs as a child process. The script
3
+ // reads its input from the file in `<recipeEnvPrefix>_ADAPTER_INPUT` (also
4
+ // argv[2]) and writes JSON to the `outputPath` it names. A prepared script is
5
+ // bundled once so the approved bytes are the ones that run.
6
+ import { spawn } from 'node:child_process';
7
+ import { createHash } from 'node:crypto';
8
+ import { existsSync, readFileSync } from 'node:fs';
9
+ import { access, mkdtemp, readFile, realpath, rm, writeFile } from 'node:fs/promises';
10
+ import os from 'node:os';
11
+ import path from 'node:path';
12
+ import { pathToFileURL } from 'node:url';
13
+ import { harnessAdapter, harnessAdapters } from './adapters.js';
14
+ import { trackCheckoutChild } from './checkout-lock.js';
15
+ import { recordCommandOutput } from './command-journal.js';
16
+ import { harnessHost, recipeEnvName } from './host.js';
17
+ function actionFileStem(action) {
18
+ return String(action).replace(/[^a-zA-Z0-9._-]/g, '_');
19
+ }
20
+ // `<namespace>.<family>.<name>` and `<family>.<name>` resolve the same files.
21
+ function actionParts(action, namespace) {
22
+ const parts = String(action).split('.').filter(Boolean);
23
+ if (parts.length >= 3 && parts[0] === namespace) {
24
+ return { family: parts[1], localName: parts.slice(2).join('.') };
25
+ }
26
+ if (parts.length >= 2) {
27
+ return { family: parts[0], localName: parts.slice(1).join('.') };
28
+ }
29
+ return { family: 'actions', localName: String(action) };
30
+ }
31
+ function candidateStems(action, namespace) {
32
+ const stem = actionFileStem(action);
33
+ const { localName } = actionParts(action, namespace);
34
+ const localStem = actionFileStem(localName);
35
+ const stems = [stem];
36
+ if (localStem && localStem !== stem)
37
+ stems.push(localStem);
38
+ return stems;
39
+ }
40
+ function candidateFamilies(action, namespace) {
41
+ const { family } = actionParts(action, namespace);
42
+ const families = [family];
43
+ return [...new Set(families)];
44
+ }
45
+ function candidatePaths(platform, action, namespace, runtimeEnv = process.env) {
46
+ const stems = candidateStems(action, namespace);
47
+ const families = candidateFamilies(action, namespace);
48
+ const sourceMap = recipeEnvName('ACTION_SOURCE_MAP');
49
+ const liveAdapterDir = recipeEnvName('LIVE_ADAPTER_DIR');
50
+ const declaredRoot = declaredActionRoot(runtimeEnv[sourceMap] ?? process.env[sourceMap], action);
51
+ // Without a declared root: the live adapter directory, then the host's
52
+ // bundled library.
53
+ const roots = [
54
+ ...new Set((declaredRoot
55
+ ? [declaredRoot]
56
+ : [
57
+ runtimeEnv[liveAdapterDir] ?? process.env[liveAdapterDir],
58
+ path.join(harnessHost().packageRoot, 'library/actions'),
59
+ ]).filter((entry) => Boolean(entry))),
60
+ ];
61
+ const files = [];
62
+ for (const root of roots) {
63
+ for (const family of families) {
64
+ for (const candidateStem of stems) {
65
+ pushCandidateFiles(files, root, platform, family, candidateStem);
66
+ }
67
+ pushDomainDispatcherFiles(files, root, platform, family);
68
+ }
69
+ }
70
+ return files;
71
+ }
72
+ function declaredActionRoot(raw, action) {
73
+ if (!raw)
74
+ return undefined;
75
+ try {
76
+ const parsed = JSON.parse(raw);
77
+ const root = parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed[action] : undefined;
78
+ return typeof root === 'string' && root.length > 0 ? root : undefined;
79
+ }
80
+ catch {
81
+ return undefined;
82
+ }
83
+ }
84
+ function pushCandidateFiles(files, root, platform, family, stem) {
85
+ files.push(path.join(root, platform, family, `${stem}.mjs`));
86
+ files.push(path.join(root, 'shared', family, `${stem}.mjs`));
87
+ }
88
+ function pushDomainDispatcherFiles(files, root, platform, family) {
89
+ files.push(path.join(root, platform, family, `${family}.mjs`));
90
+ files.push(path.join(root, 'shared', family, `${family}.mjs`));
91
+ }
92
+ async function firstExecutablePath(paths) {
93
+ for (const file of paths) {
94
+ try {
95
+ await access(file);
96
+ return file;
97
+ }
98
+ catch (error) {
99
+ // Try the next candidate path. Missing optional live adapters are reported by the caller.
100
+ if (error.code !== 'ENOENT')
101
+ throw error;
102
+ }
103
+ }
104
+ return null;
105
+ }
106
+ function runProcess(command, args, options) {
107
+ return new Promise((resolve, reject) => {
108
+ let settled = false;
109
+ const child = spawn(command, args, {
110
+ cwd: options.cwd,
111
+ env: options.env,
112
+ stdio: [options.stdin == null ? 'ignore' : 'pipe', 'pipe', 'pipe'],
113
+ });
114
+ if (child.pid)
115
+ trackCheckoutChild(options.cwd, child.pid);
116
+ if (options.stdin != null) {
117
+ child.stdin.on('error', (error) => {
118
+ if (error.code === 'EPIPE' || settled)
119
+ return;
120
+ settled = true;
121
+ reject(error);
122
+ });
123
+ child.stdin.end(options.stdin);
124
+ }
125
+ let stdout = '';
126
+ let stderr = '';
127
+ child.stdout.on('data', (chunk) => {
128
+ stdout += chunk;
129
+ recordCommandOutput(chunk);
130
+ });
131
+ child.stderr.on('data', (chunk) => {
132
+ stderr += chunk;
133
+ recordCommandOutput(chunk);
134
+ });
135
+ const timeout = options.timeoutMs
136
+ ? setTimeout(() => {
137
+ if (settled)
138
+ return;
139
+ settled = true;
140
+ child.kill('SIGTERM');
141
+ // Always escalate after the grace period: child.killed only records
142
+ // that kill() was CALLED, not that the process exited, so gating
143
+ // SIGKILL on it never fires and a SIGTERM-ignoring child leaks. The
144
+ // close listener cancels the escalation when the child exits in time.
145
+ const killTimer = setTimeout(() => child.kill('SIGKILL'), 1000);
146
+ child.once('close', () => clearTimeout(killTimer));
147
+ resolve({ exitCode: null, stdout, stderr, timedOut: true });
148
+ }, options.timeoutMs)
149
+ : undefined;
150
+ child.on('error', (error) => {
151
+ if (settled)
152
+ return;
153
+ settled = true;
154
+ if (timeout)
155
+ clearTimeout(timeout);
156
+ reject(error);
157
+ });
158
+ child.on('close', (exitCode) => {
159
+ if (settled)
160
+ return;
161
+ settled = true;
162
+ if (timeout)
163
+ clearTimeout(timeout);
164
+ resolve({ exitCode, stdout, stderr, timedOut: false });
165
+ });
166
+ });
167
+ }
168
+ export async function prepareLiveAdapterScript({ platform, action, namespace, implementationRoot, allowRuntimeImports = false, }) {
169
+ const entryPath = await firstExecutablePath(candidatePaths(platform, action, namespace, {
170
+ [recipeEnvName('ACTION_SOURCE_MAP')]: JSON.stringify({ [action]: implementationRoot }),
171
+ }));
172
+ if (!entryPath)
173
+ return null;
174
+ const rootReal = await realpath(implementationRoot);
175
+ const entryReal = await realpath(entryPath);
176
+ if (!isPathWithin(rootReal, entryReal)) {
177
+ throw new Error(`Live adapter ${entryPath} resolves outside ${implementationRoot}.`);
178
+ }
179
+ // Loaded on first use: every harness command imports this module.
180
+ const { build } = await import('esbuild');
181
+ const result = await build({
182
+ entryPoints: [entryReal],
183
+ bundle: true,
184
+ write: false,
185
+ platform: 'node',
186
+ format: 'esm',
187
+ target: `node${process.versions.node.split('.')[0]}`,
188
+ legalComments: 'none',
189
+ sourcemap: false,
190
+ banner: {
191
+ // The banner is part of the approved bundle's digest: keep its bytes.
192
+ js: `import { createRequire as __mmCreateRequire } from 'node:module';` +
193
+ `const require = __mmCreateRequire(import.meta.url);` +
194
+ `process.argv[1] = ${JSON.stringify(entryReal)};`,
195
+ },
196
+ plugins: [bindImportMetaUrls()],
197
+ logLevel: 'silent',
198
+ });
199
+ const output = result.outputFiles[0];
200
+ if (!output)
201
+ throw new Error(`Bundling live adapter ${entryReal} produced no executable output.`);
202
+ const sourceText = output.text;
203
+ const { init, parse } = await import('es-module-lexer');
204
+ await init;
205
+ const [imports] = parse(sourceText);
206
+ if (!allowRuntimeImports && imports.some((entry) => entry.d >= 0)) {
207
+ const error = new Error(`Live adapter ${entryReal} contains a runtime dynamic import that cannot be bound to the approved bundle. ` +
208
+ 'Replace it with a static import so its implementation bytes are included in the plan digest.');
209
+ Object.assign(error, {
210
+ code: 'RECIPE_TRUST_UNBOUND_IMPORT',
211
+ userAction: 'replace the computed import with a static import, or promote the adapter into an explicitly trusted engineer-owned library',
212
+ });
213
+ throw error;
214
+ }
215
+ return {
216
+ action,
217
+ platform,
218
+ entryPath: entryReal,
219
+ sourceText,
220
+ sourceDigest: `sha256:${createHash('sha256').update(sourceText).digest('hex')}`,
221
+ };
222
+ }
223
+ function bindImportMetaUrls() {
224
+ return {
225
+ name: 'bind-import-meta-urls',
226
+ setup(buildContext) {
227
+ buildContext.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, async (args) => {
228
+ const contents = await readFile(args.path, 'utf8');
229
+ if (!contents.includes('import.meta.url'))
230
+ return undefined;
231
+ const extension = path.extname(args.path);
232
+ const loader = extension === '.ts' || extension === '.mts' || extension === '.cts'
233
+ ? 'ts'
234
+ : extension === '.tsx'
235
+ ? 'tsx'
236
+ : extension === '.jsx'
237
+ ? 'jsx'
238
+ : 'js';
239
+ return {
240
+ contents: contents.replaceAll('import.meta.url', JSON.stringify(pathToFileURL(args.path).href)),
241
+ loader,
242
+ };
243
+ });
244
+ },
245
+ };
246
+ }
247
+ // The platform's tsx contract for its live adapter scripts, if it has one.
248
+ function tsxLiveScripts(platform) {
249
+ return platform && harnessAdapters().has(platform)
250
+ ? harnessAdapter(platform).actions.tsxLiveScripts
251
+ : undefined;
252
+ }
253
+ function commandFor(file, tsxCandidates, projectRoot, platform) {
254
+ // A platform with tsxLiveScripts has actions that dynamically import the
255
+ // checkout's TypeScript (a computed import() static analysis cannot see), so
256
+ // they MUST run under tsx even though importsSourceTypescript is false —
257
+ // otherwise bare node throws ERR_MODULE_NOT_FOUND on an unbuilt checkout's
258
+ // extensionless src imports.
259
+ const needsTsx = Boolean(tsxLiveScripts(platform)) || importsSourceTypescript(file);
260
+ if (!needsTsx) {
261
+ return { command: process.execPath, args: [file] };
262
+ }
263
+ const tsxBin = resolveTsxBin(tsxCandidates, projectRoot);
264
+ if (!tsxBin) {
265
+ const where = projectRoot ?? 'the checkout';
266
+ const error = new Error(`this action runs TypeScript from the checkout but no tsx runtime was found.\n` +
267
+ ` Next: run 'yarn install' in ${where} (tsx is a dev dependency of the checkout); ` +
268
+ `if package imports still fail, run 'yarn build' there`);
269
+ error.exitCode = 2;
270
+ throw error;
271
+ }
272
+ return { command: tsxBin, args: [file] };
273
+ }
274
+ // Prefer the TARGET checkout's own tsx (delegate-don't-duplicate): a thin-installed
275
+ // slot has tsx in its node_modules, and a published host need not ship tsx.
276
+ // Order: TSX_BIN seam → target tsx → host package tsx (dev) → the caller's candidates.
277
+ function resolveTsxBin(tsxCandidates, projectRoot) {
278
+ if (process.env.TSX_BIN)
279
+ return process.env.TSX_BIN;
280
+ const candidates = [];
281
+ if (projectRoot)
282
+ candidates.push(path.join(projectRoot, 'node_modules/.bin/tsx'));
283
+ candidates.push(path.join(harnessHost().packageRoot, 'node_modules/.bin/tsx'));
284
+ candidates.push(...tsxCandidates);
285
+ for (const candidate of candidates) {
286
+ if (existsSync(candidate))
287
+ return candidate;
288
+ }
289
+ return null;
290
+ }
291
+ function importsSourceTypescript(file) {
292
+ return importsSourceTypescriptFrom(file, new Set());
293
+ }
294
+ function importsSourceTypescriptFrom(file, visited) {
295
+ const absolute = path.resolve(file);
296
+ if (visited.has(absolute))
297
+ return false;
298
+ visited.add(absolute);
299
+ const source = readFileSync(file, 'utf8');
300
+ const importPattern = /(?:from\s+|import\(\s*)['"]([^'"]+)['"]/gu;
301
+ for (const match of source.matchAll(importPattern)) {
302
+ const specifier = match[1] ?? '';
303
+ if (specifier.endsWith('.ts'))
304
+ return true;
305
+ if (!specifier.startsWith('.'))
306
+ continue;
307
+ if (!specifier.endsWith('.mjs'))
308
+ continue;
309
+ if (importsSourceTypescriptFrom(path.resolve(path.dirname(absolute), specifier), visited)) {
310
+ return true;
311
+ }
312
+ }
313
+ return false;
314
+ }
315
+ export async function resolveLiveAdapter(platform, action, namespace, runtimeEnv) {
316
+ return firstExecutablePath(candidatePaths(platform, action, namespace, runtimeEnv));
317
+ }
318
+ export async function runLiveAdapterScript({ platform, action, namespace, node, context, prepared, contextExtras, tsxCandidates = [], }) {
319
+ const script = prepared?.entryPath ?? (await resolveLiveAdapter(platform, action, namespace, context.env));
320
+ if (!script)
321
+ return null;
322
+ const tempDir = await mkdtemp(path.join(os.tmpdir(), `${harnessHost().name}-live-adapter-`));
323
+ const inputPath = path.join(tempDir, 'input.json');
324
+ const outputPath = path.join(tempDir, 'output.json');
325
+ const input = {
326
+ schemaVersion: 1,
327
+ platform,
328
+ action,
329
+ node,
330
+ context: {
331
+ nodeId: context.nodeId,
332
+ projectRoot: context.projectRoot,
333
+ artifactsDir: context.artifactsDir,
334
+ ...contextExtras,
335
+ },
336
+ outputPath,
337
+ };
338
+ await writeFile(inputPath, `${JSON.stringify(input, null, 2)}\n`);
339
+ const command = prepared
340
+ ? commandForPrepared(context.projectRoot, platform, tsxCandidates)
341
+ : commandFor(script, tsxCandidates, context.projectRoot, platform);
342
+ const platformEnv = (await tsxLiveScripts(platform)?.env(context.projectRoot, tempDir)) ?? {};
343
+ const processTimeoutMs = liveAdapterProcessTimeoutMs(node);
344
+ const result = await runProcess(command.command, [...command.args, inputPath], {
345
+ cwd: context.projectRoot,
346
+ env: {
347
+ ...process.env,
348
+ ...context.env,
349
+ ...platformEnv,
350
+ [recipeEnvName('ADAPTER_INPUT')]: inputPath,
351
+ [recipeEnvName('ADAPTER_OUTPUT')]: outputPath,
352
+ },
353
+ timeoutMs: processTimeoutMs,
354
+ ...(prepared ? { stdin: prepared.sourceText } : {}),
355
+ });
356
+ try {
357
+ if (result.timedOut) {
358
+ throw new Error(`Live adapter ${script} timed out after ${processTimeoutMs}ms.`);
359
+ }
360
+ if (result.exitCode !== 0) {
361
+ // Failed adapters may publish diagnostics before exiting; missing or partial output is optional.
362
+ const failureOutput = await readFile(outputPath, 'utf8')
363
+ .then(JSON.parse)
364
+ .catch(() => null);
365
+ if (Array.isArray(failureOutput?.artifacts)) {
366
+ for (const artifact of failureOutput.artifacts)
367
+ context.registerArtifact(artifact);
368
+ }
369
+ throw new Error(`Live adapter ${script} exited ${result.exitCode}: ${result.stderr || result.stdout}`);
370
+ }
371
+ let parsed = null;
372
+ try {
373
+ parsed = JSON.parse(await readFile(outputPath, 'utf8'));
374
+ }
375
+ catch (_error) {
376
+ const stdout = result.stdout.trim();
377
+ if (!stdout)
378
+ throw new Error(`Live adapter ${script} did not write JSON output.`);
379
+ parsed = JSON.parse(stdout);
380
+ }
381
+ return { script, result: parsed };
382
+ }
383
+ finally {
384
+ await rm(tempDir, { recursive: true, force: true });
385
+ }
386
+ }
387
+ export function liveAdapterProcessTimeoutMs(node) {
388
+ if (node.live_adapter_timeout_ms != null) {
389
+ const timeoutMs = Number(node.live_adapter_timeout_ms);
390
+ return Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : 60000;
391
+ }
392
+ const settleMs = Number(node.settle_ms);
393
+ const settleAllowance = Number.isFinite(settleMs) && settleMs > 0 ? settleMs : 0;
394
+ const actionTimeouts = [
395
+ node.target_timeout_ms,
396
+ node.unlock_timeout_ms,
397
+ node.timeout_ms,
398
+ node.wait_timeout_ms,
399
+ ]
400
+ .map(Number)
401
+ .filter((value) => Number.isFinite(value) && value > 0);
402
+ if (actionTimeouts.length > 0) {
403
+ return Math.max(60000, actionTimeouts.reduce((total, value) => total + value, 0) + settleAllowance + 5000);
404
+ }
405
+ return 60000 + settleAllowance;
406
+ }
407
+ function commandForPrepared(projectRoot, platform, tsxCandidates) {
408
+ if (!tsxLiveScripts(platform)) {
409
+ return { command: process.execPath, args: ['--input-type=module', '-'] };
410
+ }
411
+ const tsxBin = resolveTsxBin(tsxCandidates, projectRoot);
412
+ if (!tsxBin) {
413
+ const error = new Error(`this action imports TypeScript from the checkout but no tsx runtime was found.\n` +
414
+ ` Next: run 'yarn install' in ${projectRoot}`);
415
+ error.exitCode = 2;
416
+ throw error;
417
+ }
418
+ return { command: tsxBin, args: ['--input-type=module', '-'] };
419
+ }
420
+ function isPathWithin(root, candidate) {
421
+ const relative = path.relative(root, candidate);
422
+ return (relative === '' ||
423
+ (relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative)));
424
+ }
425
+ //# sourceMappingURL=live-adapter-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-adapter-contract.js","sourceRoot":"","sources":["../../src/harness/live-adapter-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RecordingTargetProvider } from '@farmslot/recipe-runner';
2
+ /** The runner's `--record-video` target, resolved by the adapter's `recording`. */
3
+ export declare function createRecordingTargetProvider(adapter: string): RecordingTargetProvider;
4
+ export declare function captureHelperSupportsRecordSessionSnapshots(projectRoot: string): boolean;
5
+ /** Whether `capture-helper version --json` lists `capability`. */
6
+ export declare function captureHelperSupportsCapability(projectRoot: string, capability: string): boolean;
7
+ /** `CAPTURE_HELPER_PATH`, else `capture-helper` on PATH. */
8
+ export declare function captureHelperPath(): string;
9
+ //# sourceMappingURL=recording-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-target.d.ts","sourceRoot":"","sources":["../../src/harness/recording-target.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AAIjC,mFAAmF;AACnF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAStF;AAED,wBAAgB,2CAA2C,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAExF;AAED,kEAAkE;AAClE,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAYhG;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,39 @@
1
+ // Video recording support every platform shares: the runner's recording-target
2
+ // provider (the platform resolves the target) and capture-helper capability checks.
3
+ import { spawnSync } from 'node:child_process';
4
+ import { harnessAdapter } from './adapters.js';
5
+ /** The runner's `--record-video` target, resolved by the adapter's `recording`. */
6
+ export function createRecordingTargetProvider(adapter) {
7
+ return {
8
+ async resolveRecordingTarget(context) {
9
+ const recording = harnessAdapter(adapter).recording;
10
+ if (!recording)
11
+ throw new Error(`--record-video is not implemented for the ${adapter} adapter.`);
12
+ return recording.target(context);
13
+ },
14
+ };
15
+ }
16
+ export function captureHelperSupportsRecordSessionSnapshots(projectRoot) {
17
+ return captureHelperSupportsCapability(projectRoot, 'record_session_snapshot');
18
+ }
19
+ /** Whether `capture-helper version --json` lists `capability`. */
20
+ export function captureHelperSupportsCapability(projectRoot, capability) {
21
+ const result = spawnSync(captureHelperPath(), ['version', '--json'], {
22
+ cwd: projectRoot,
23
+ encoding: 'utf8',
24
+ });
25
+ if (result.status !== 0)
26
+ return false;
27
+ try {
28
+ const parsed = JSON.parse(result.stdout);
29
+ return Array.isArray(parsed.capabilities) && parsed.capabilities.includes(capability);
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ /** `CAPTURE_HELPER_PATH`, else `capture-helper` on PATH. */
36
+ export function captureHelperPath() {
37
+ return process.env.CAPTURE_HELPER_PATH || 'capture-helper';
38
+ }
39
+ //# sourceMappingURL=recording-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-target.js","sourceRoot":"","sources":["../../src/harness/recording-target.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oFAAoF;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,mFAAmF;AACnF,MAAM,UAAU,6BAA6B,CAAC,OAAe;IAC3D,OAAO;QACL,KAAK,CAAC,sBAAsB,CAAC,OAA+B;YAC1D,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;YACpD,IAAI,CAAC,SAAS;gBACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,WAAW,CAAC,CAAC;YACnF,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2CAA2C,CAAC,WAAmB;IAC7E,OAAO,+BAA+B,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;AACjF,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,+BAA+B,CAAC,WAAmB,EAAE,UAAkB;IACrF,MAAM,MAAM,GAAG,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;QACnE,GAAG,EAAE,WAAW;QAChB,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAA+B,CAAC;QACvE,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,gBAAgB,CAAC;AAC7D,CAAC"}