@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
package/CHANGELOG.md CHANGED
@@ -6,6 +6,20 @@ All notable changes to `@farmslot/recipe-cli` are tracked here.
6
6
 
7
7
  - Active-development baseline; add user-facing changes here before release or package publication.
8
8
 
9
+ ## 0.4.0 - 2026-10-05
10
+
11
+ - Add run evidence to `@farmslot/recipe-cli/harness`, moved from mm-harness and driven through the registered adapters and the host identity:
12
+ - execution provenance (`captureExecutionProvenance` with `runnerIncludes`, `executionProvenanceDrift`, `writeExecutionProvenance`, `ProvenanceDriftError`); the runner root defaults to the host package root;
13
+ - the framed recorder (`startRecipeRecording`, `stopRecipeRecording`, `captureActiveRecipeRecordingSnapshot`), `createRecordingTargetProvider` and the capture-helper capability checks;
14
+ - run diagnostics (`beginRunDiagnostics`, `finishRunDiagnostics`, `collectRunDiagnostics`, `verifyConsoleCapture`, `readRunDiagnosticsDocument`, `formatRunDiagnosticsForHuman`), with the console rules injected as a `ConsoleClassifier`;
15
+ - the run report and provenance (`writeRunReport`, `indexProductProvenanceArtifact`, `executedBrowser`, `recipeCdpPorts`);
16
+ - live adapter scripts (`prepareLiveAdapterScript`, `runLiveAdapterScript`, `resolveLiveAdapter`, `liveAdapterProcessTimeoutMs`), with the action `namespace`, input `contextExtras` and extra `tsxCandidates` per call;
17
+ - run options (`recipeRunOptionsFromCli`), recipe trust input and failures (`explicitRecipeTrustOptions`, `recipeTrustFailure`), behavioral proof checks (`validateRuntimeProof`, `validateRuntimeProofPlan`) and `closest`.
18
+ - **BREAKING:** the host identity requires `recipeEnvPrefix`, the prefix of the variables recipe processes and library actions read (`recipeEnvName('ADAPTER_INPUT')`); `farmslot-recipe` uses `RECIPE`.
19
+ - Add `adapterPortFlags`: the dev-server port options every registered adapter adds.
20
+ - Depend on `esbuild` 0.28.1 and `es-module-lexer` 2.3.1, pinned exactly (live adapter bundling): the bundler's patch version changes prepared bytes and so every approved `sourceDigest`.
21
+ - Publish with adapter-sdk 0.3.0, agent-runtime 0.17.0, protocol 0.34.0 and recipe-runner 0.23.0.
22
+
9
23
  ## 0.3.0 - 2026-10-04
10
24
 
11
25
  - Add the lifecycle commands to `@farmslot/recipe-cli/harness`, moved from mm-harness and driven through `@farmslot/adapter-sdk` adapters the host registers (`configureHarnessAdapters`): `handleLaunch`, `handleReload`, `handleStop` (with a `companions` hook for host processes), `handleLast`, and `handleHarness` for `install`/`verify`/`cleanup` (with `usage` and `install`-variant hooks). They come with their shared modules: adapter detection and resolution (`detectAdapter`, `adapterForPlatform`, `resolveAdapter`, `assertAdapter`), option parsing (`parseArgs`, `parseFlags`, `CliError`), leaf spawning (`spawnScript`, `spawnScriptStreaming`, `spawnInherit`), teaching errors (`usageOut`, `checkoutBusyOut`, `EXIT`) and bounded healing (`parseHeal`, `ensureOverlay`, `classifyFailure`, `checkHealBounds`). Platform policy comes from the adapters (`detect`, `targets`, `flags`, `failurePatterns`), and names from the host (new `product` field, required).
package/README.md CHANGED
@@ -29,17 +29,17 @@ Docs: https://farmslot.io/docs/reference/recipe-discovery
29
29
 
30
30
  ## Source layout
31
31
 
32
- | path | owns |
33
- | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
34
- | `src/cli.ts` | the `farmslot-recipe` program: the runner's `run`/`validate` plus discovery |
35
- | `src/commands.ts` | discovery command registration, JSON envelopes and errors |
36
- | `src/libraries.ts` | library resolution: precedence, overrides, digests, `requires` checks |
37
- | `src/discovery-index.ts` | the recipe and action index for one platform view |
38
- | `src/composition.ts` | composition, callers and `explain` |
39
- | `src/search.ts`, `src/template.ts`, `src/render.ts` | search ranking, skeletons, text output |
40
- | `src/types.ts` | the documented `--json` schema |
41
- | `src/harness/` | generic harness support (`@farmslot/recipe-cli/harness`): host identity, adapter registry, runtime paths, journal, checkout lock, JSON stream, colour, option parsing, leaf spawning, bounded healing |
42
- | `src/harness/commands/` | lifecycle commands a host CLI dispatches to: `launch`, `reload`, `stop`, `last`; `overlay.ts` is `install`/`verify`/`cleanup` |
32
+ | path | owns |
33
+ | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
34
+ | `src/cli.ts` | the `farmslot-recipe` program: the runner's `run`/`validate` plus discovery |
35
+ | `src/commands.ts` | discovery command registration, JSON envelopes and errors |
36
+ | `src/libraries.ts` | library resolution: precedence, overrides, digests, `requires` checks |
37
+ | `src/discovery-index.ts` | the recipe and action index for one platform view |
38
+ | `src/composition.ts` | composition, callers and `explain` |
39
+ | `src/search.ts`, `src/template.ts`, `src/render.ts` | search ranking, skeletons, text output |
40
+ | `src/types.ts` | the documented `--json` schema |
41
+ | `src/harness/` | generic harness support (`@farmslot/recipe-cli/harness`): host identity, adapter registry, runtime paths, journal, checkout lock, JSON stream, colour, option parsing, leaf spawning, bounded healing, and run evidence (execution provenance, framed recording, run diagnostics, run report, live adapter scripts, run options, trust input, behavioral proof) |
42
+ | `src/harness/commands/` | lifecycle commands a host CLI dispatches to: `launch`, `reload`, `stop`, `last`; `overlay.ts` is `install`/`verify`/`cleanup` |
43
43
 
44
44
  ## Maintenance rules
45
45
 
@@ -48,7 +48,7 @@ Docs: https://farmslot.io/docs/reference/recipe-discovery
48
48
  - `--json` envelopes are a contract: add fields freely, but bump `DISCOVERY_SCHEMA_VERSION` before removing or renaming one.
49
49
  - Discovery never runs actions or loads adapter code.
50
50
  - Harness commands never compare adapter ids: platform behaviour comes from the registered `@farmslot/adapter-sdk` adapters, and a new behaviour is a new adapter member.
51
- - `src/harness/` never hardcodes a product: names and env variables come from the host identity (`configureHarnessHost`), so a preset such as `mm-harness` keeps its own spelling. Runtime paths are shared by every host (`temp/recipe/runtime`, `temp/recipe/harness`; `RECIPE_RUNTIME_DIR` and `RECIPE_HARNESS_ROOT` override them).
51
+ - `src/harness/` never hardcodes a product: names and env variables come from the host identity (`configureHarnessHost`: `envPrefix` for the host's own variables, `recipeEnvPrefix` for the ones recipe processes and library actions read), so a preset such as `mm-harness` keeps its own spelling. Runtime paths are shared by every host (`temp/recipe/runtime`, `temp/recipe/harness`; `RECIPE_RUNTIME_DIR` and `RECIPE_HARNESS_ROOT` override them).
52
52
 
53
53
  ## Local quality
54
54
 
@@ -20,6 +20,8 @@ export declare function assertAdaptersRegistered(): void;
20
20
  export declare function assertAdapter(adapter: unknown): asserts adapter is string;
21
21
  /** Extra dev-server port environment names every registered adapter reads. */
22
22
  export declare function adapterPortEnv(): string[];
23
+ /** More dev-server port option names every registered adapter accepts, after `watcherPort`. */
24
+ export declare function adapterPortFlags(): string[];
23
25
  /** Boolean flags every registered adapter adds, for `launch` or for the other commands. */
24
26
  export declare function adapterFlags(kind: 'launch' | 'commands'): string[];
25
27
  //# sourceMappingURL=adapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/harness/adapters.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAM/B,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAEpE;AAED,wBAAgB,eAAe,IAAI,eAAe,CAEjD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,CAE1D;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoBhE;AAED,wGAAwG;AACxG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGhF;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,MAAM,CAE3E;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAM/C;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAQzE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,EAAE,CAElE"}
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/harness/adapters.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAM/B,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAEpE;AAED,wBAAgB,eAAe,IAAI,eAAe,CAEjD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,CAE1D;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoBhE;AAED,wGAAwG;AACxG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGhF;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,MAAM,CAE3E;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAM/C;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAQzE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC;AAED,+FAA+F;AAC/F,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,EAAE,CAElE"}
@@ -80,6 +80,10 @@ export function assertAdapter(adapter) {
80
80
  export function adapterPortEnv() {
81
81
  return [...new Set(registered().flatMap((adapter) => [...(adapter.devServer.portEnv ?? [])]))];
82
82
  }
83
+ /** More dev-server port option names every registered adapter accepts, after `watcherPort`. */
84
+ export function adapterPortFlags() {
85
+ return [...new Set(registered().flatMap((adapter) => [...(adapter.devServer.portFlags ?? [])]))];
86
+ }
83
87
  /** Boolean flags every registered adapter adds, for `launch` or for the other commands. */
84
88
  export function adapterFlags(kind) {
85
89
  return registered().flatMap((adapter) => [...(adapter.flags?.[kind] ?? [])]);
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/harness/adapters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/harness/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { RecipeLibrarySource } from '@farmslot/recipe-runner';
2
+ export type ExecutionProvenancePhase = 'start' | 'pre-execute' | 'end';
3
+ export interface SourceProvenanceSnapshot {
4
+ head: string | null;
5
+ status: string;
6
+ sourceFingerprint: string;
7
+ }
8
+ export interface ExecutionProvenanceSnapshot {
9
+ phase: ExecutionProvenancePhase;
10
+ capturedAt: string;
11
+ recipeDigest: string;
12
+ product: SourceProvenanceSnapshot;
13
+ runner: SourceProvenanceSnapshot;
14
+ libraries: Array<SourceProvenanceSnapshot & {
15
+ name: string;
16
+ }>;
17
+ helpers: Array<{
18
+ path: string;
19
+ sourceFingerprint: string;
20
+ }>;
21
+ }
22
+ export interface ExecutionProvenanceDrift {
23
+ phase: Exclude<ExecutionProvenancePhase, 'start'>;
24
+ field: string;
25
+ start: string | null;
26
+ current: string | null;
27
+ }
28
+ export interface ExecutionProvenanceRecord {
29
+ schemaVersion: 1;
30
+ valid: boolean;
31
+ snapshots: ExecutionProvenanceSnapshot[];
32
+ drift: ExecutionProvenanceDrift[];
33
+ }
34
+ export interface ExecutionProvenanceInput {
35
+ adapter: string;
36
+ projectRoot: string;
37
+ recipeDocument: unknown;
38
+ recipePath?: string;
39
+ librarySources?: RecipeLibrarySource[];
40
+ excludedProductRoots?: string[];
41
+ helperPaths?: string[];
42
+ runnerRoot?: string;
43
+ runnerIncludes: readonly string[];
44
+ }
45
+ export declare class ProvenanceDriftError extends Error {
46
+ readonly code = "PROVENANCE_DRIFT";
47
+ readonly exitCode = 5;
48
+ readonly userAction: string;
49
+ readonly provenancePath: string;
50
+ readonly drift: ExecutionProvenanceDrift[];
51
+ constructor(provenancePath: string, drift: ExecutionProvenanceDrift[], cause?: unknown);
52
+ }
53
+ export declare function captureExecutionProvenance(input: ExecutionProvenanceInput, phase: ExecutionProvenancePhase): Promise<ExecutionProvenanceSnapshot>;
54
+ export declare function executionProvenanceDrift(start: ExecutionProvenanceSnapshot, current: ExecutionProvenanceSnapshot): ExecutionProvenanceDrift[];
55
+ export declare function writeExecutionProvenance(artifactsDir: string, snapshots: ExecutionProvenanceSnapshot[], drift: ExecutionProvenanceDrift[], artifactManifestPath?: string): Promise<string>;
56
+ //# sourceMappingURL=execution-provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-provenance.d.ts","sourceRoot":"","sources":["../../src/harness/execution-provenance.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAQnE,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,aAAa,GAAG,KAAK,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,wBAAwB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,EAAE,KAAK,CAAC,wBAAwB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,CAAC,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,2BAA2B,EAAE,CAAC;IACzC,KAAK,EAAE,wBAAwB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACvC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,QAAQ,KAAK;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,wBAAwB,EAAE,CAAC;gBAE/B,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO;CAWvF;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,wBAAwB,EAC/B,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,2BAA2B,CAAC,CAqBtC;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,2BAA2B,EAClC,OAAO,EAAE,2BAA2B,GACnC,wBAAwB,EAAE,CAmD5B;AAED,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,2BAA2B,EAAE,EACxC,KAAK,EAAE,wBAAwB,EAAE,EACjC,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
@@ -0,0 +1,308 @@
1
+ // What a run executed, bound at its start and compared before and after it
2
+ // runs: the recipe, the product checkout, the runner (the host package), the
3
+ // recipe libraries and any command helper scripts. Drift invalidates the run.
4
+ import { execFileSync } from 'node:child_process';
5
+ import { createHash } from 'node:crypto';
6
+ import fs, { constants as fsConstants } from 'node:fs';
7
+ import path from 'node:path';
8
+ import { digestRecipeDocument } from '@farmslot/protocol';
9
+ import { harnessAdapter } from './adapters.js';
10
+ import { indexArtifactManifest } from './artifact-files.js';
11
+ import { harnessHost } from './host.js';
12
+ const gitContexts = new Map();
13
+ export class ProvenanceDriftError extends Error {
14
+ constructor(provenancePath, drift, cause) {
15
+ const fields = [...new Set(drift.map((entry) => entry.field))].join(', ');
16
+ super(`Execution inputs changed after preparation (${fields}); evidence is invalid.`, cause === undefined ? undefined : { cause });
17
+ this.code = 'PROVENANCE_DRIFT';
18
+ this.exitCode = 5;
19
+ this.name = 'ProvenanceDriftError';
20
+ this.provenancePath = provenancePath;
21
+ this.drift = drift;
22
+ this.userAction = `restore the prepared recipe, library, and product source, then rerun; inspect ${provenancePath}`;
23
+ }
24
+ }
25
+ export async function captureExecutionProvenance(input, phase) {
26
+ const recipeDigest = input.recipePath
27
+ ? recipeFileDigest(input.recipePath)
28
+ : digestRecipeDocument(input.recipeDocument);
29
+ const libraries = (input.librarySources ?? []).map((source, index) => ({
30
+ name: source.name ?? `library-${index + 1}`,
31
+ ...sourceSnapshot(source.root),
32
+ }));
33
+ const runnerRoot = input.runnerRoot ?? harnessHost().packageRoot;
34
+ return {
35
+ phase,
36
+ capturedAt: new Date().toISOString(),
37
+ recipeDigest,
38
+ product: sourceSnapshot(input.projectRoot, input.adapter, input.excludedProductRoots),
39
+ runner: sourceSnapshot(runnerRoot, undefined, [], [...input.runnerIncludes]),
40
+ libraries,
41
+ helpers: (input.helperPaths ?? []).map((helperPath) => ({
42
+ path: displayPath(input.projectRoot, helperPath),
43
+ sourceFingerprint: fileFingerprint(helperPath),
44
+ })),
45
+ };
46
+ }
47
+ export function executionProvenanceDrift(start, current) {
48
+ const drift = [];
49
+ if (current.phase === 'start')
50
+ return drift;
51
+ const phase = current.phase;
52
+ compare(drift, phase, 'recipeDigest', start.recipeDigest, current.recipeDigest);
53
+ compareSource(drift, phase, 'product', start.product, current.product);
54
+ compareSource(drift, phase, 'runner', start.runner, current.runner);
55
+ if (start.libraries.length !== current.libraries.length) {
56
+ compare(drift, phase, 'libraries.length', String(start.libraries.length), String(current.libraries.length));
57
+ }
58
+ const count = Math.min(start.libraries.length, current.libraries.length);
59
+ for (let index = 0; index < count; index += 1) {
60
+ const expected = start.libraries[index];
61
+ const actual = current.libraries[index];
62
+ const prefix = `libraries[${index}]`;
63
+ compare(drift, phase, `${prefix}.name`, expected.name, actual.name);
64
+ compareSource(drift, phase, prefix, expected, actual);
65
+ }
66
+ if (start.helpers.length !== current.helpers.length) {
67
+ compare(drift, phase, 'helpers.length', String(start.helpers.length), String(current.helpers.length));
68
+ }
69
+ const helperCount = Math.min(start.helpers.length, current.helpers.length);
70
+ for (let index = 0; index < helperCount; index += 1) {
71
+ compare(drift, phase, `helpers[${index}].path`, start.helpers[index].path, current.helpers[index].path);
72
+ compare(drift, phase, `helpers[${index}].sourceFingerprint`, start.helpers[index].sourceFingerprint, current.helpers[index].sourceFingerprint);
73
+ }
74
+ return drift;
75
+ }
76
+ export async function writeExecutionProvenance(artifactsDir, snapshots, drift, artifactManifestPath) {
77
+ const provenancePath = path.join(path.resolve(artifactsDir), 'execution-provenance.json');
78
+ const record = {
79
+ schemaVersion: 1,
80
+ valid: drift.length === 0,
81
+ snapshots,
82
+ drift,
83
+ };
84
+ fs.mkdirSync(path.dirname(provenancePath), { recursive: true });
85
+ fs.writeFileSync(provenancePath, `${JSON.stringify(record, null, 2)}\n`);
86
+ if (artifactManifestPath) {
87
+ // The one manifest upsert the harness has; a missing or unreadable
88
+ // manifest is the caller's error, not something to skip past.
89
+ await indexArtifactManifest(artifactManifestPath, [
90
+ {
91
+ path: 'execution-provenance.json',
92
+ type: 'json',
93
+ label: 'Execution provenance',
94
+ category: 'system',
95
+ metadata: {
96
+ valid: record.valid,
97
+ errorCode: record.valid ? null : 'PROVENANCE_DRIFT',
98
+ },
99
+ },
100
+ ]);
101
+ }
102
+ return provenancePath;
103
+ }
104
+ function recipeFileDigest(recipePath) {
105
+ const source = readRegularFileNoFollow(recipePath);
106
+ try {
107
+ return digestRecipeDocument(JSON.parse(source.toString('utf8')));
108
+ }
109
+ catch {
110
+ return `invalid:sha256:${createHash('sha256').update(source).digest('hex')}`;
111
+ }
112
+ }
113
+ function sourceSnapshot(root, adapter, excludedRoots = [], includedRoots = []) {
114
+ const git = gitContext(root);
115
+ if (!git) {
116
+ return {
117
+ head: null,
118
+ status: 'not-a-git-checkout',
119
+ sourceFingerprint: directoryFingerprint(root, excludedRoots, includedRoots),
120
+ };
121
+ }
122
+ const pathspecs = sourcePathspecs(git, excludedRoots, includedRoots);
123
+ const status = gitText(git.topLevel, [
124
+ 'status',
125
+ '--porcelain=v1',
126
+ '--untracked-files=normal',
127
+ '--',
128
+ ...pathspecs,
129
+ ]);
130
+ const head = gitBuffer(git.topLevel, ['rev-parse', 'HEAD']);
131
+ const platformFingerprint = adapter ? harnessAdapter(adapter).sourceFingerprint : undefined;
132
+ return {
133
+ head: head.toString('utf8').trim() || null,
134
+ status,
135
+ sourceFingerprint: platformFingerprint && path.resolve(root) === git.topLevel
136
+ ? platformFingerprint(root)
137
+ : nestedGitSourceFingerprint(root, git, pathspecs, excludedRoots, includedRoots, head),
138
+ };
139
+ }
140
+ function nestedGitSourceFingerprint(root, git, pathspecs, excludedRoots, includedRoots, head) {
141
+ const gitFingerprint = gitSourceFingerprint(git.topLevel, pathspecs, head);
142
+ if (git.pathspec === '.' && includedRoots.length === 0)
143
+ return gitFingerprint;
144
+ return createHash('sha256')
145
+ .update(gitFingerprint)
146
+ .update('\0nested-source\0')
147
+ .update(directoryFingerprint(root, excludedRoots, includedRoots))
148
+ .digest('hex');
149
+ }
150
+ function gitContext(root) {
151
+ const cacheKey = path.resolve(root);
152
+ if (gitContexts.has(cacheKey))
153
+ return gitContexts.get(cacheKey) ?? null;
154
+ try {
155
+ const resolved = cacheKey;
156
+ const topLevel = fs.realpathSync(gitText(resolved, ['rev-parse', '--show-toplevel']).trim());
157
+ const relative = path.relative(topLevel, fs.realpathSync(resolved));
158
+ const context = relative === '..' || relative.startsWith(`..${path.sep}`)
159
+ ? null
160
+ : { topLevel, pathspec: relative || '.' };
161
+ gitContexts.set(cacheKey, context);
162
+ return context;
163
+ }
164
+ catch {
165
+ gitContexts.set(cacheKey, null);
166
+ return null;
167
+ }
168
+ }
169
+ function gitSourceFingerprint(topLevel, pathspecs, head) {
170
+ const hash = createHash('sha256');
171
+ hash.update(head);
172
+ hash.update('\0diff\0');
173
+ hash.update(gitBuffer(topLevel, [
174
+ 'diff',
175
+ '--no-ext-diff',
176
+ '--binary',
177
+ head.toString('utf8').trim(),
178
+ '--',
179
+ ...pathspecs,
180
+ ]));
181
+ const untracked = gitText(topLevel, [
182
+ 'ls-files',
183
+ '--others',
184
+ '--exclude-standard',
185
+ '-z',
186
+ '--',
187
+ ...pathspecs,
188
+ ])
189
+ .split('\0')
190
+ .filter(Boolean)
191
+ .sort();
192
+ for (const relative of untracked) {
193
+ hash.update(`\0untracked\0${relative}\0`);
194
+ const absolute = path.join(topLevel, relative);
195
+ hash.update(readPathIdentity(absolute));
196
+ }
197
+ return hash.digest('hex');
198
+ }
199
+ function sourcePathspecs(git, excludedRoots, includedRoots) {
200
+ const exclusions = excludedRoots.flatMap((root) => {
201
+ const relative = path.relative(git.topLevel, fs.existsSync(root) ? fs.realpathSync(root) : path.resolve(root));
202
+ return relative !== '..' && !relative.startsWith(`..${path.sep}`)
203
+ ? [`:(exclude)${relative}`]
204
+ : [];
205
+ });
206
+ const inclusions = includedRoots.length > 0
207
+ ? includedRoots.map((root) => path.join(git.pathspec === '.' ? '' : git.pathspec, root))
208
+ : [git.pathspec];
209
+ return [...inclusions, ...exclusions];
210
+ }
211
+ function directoryFingerprint(root, excludedRoots, includedRoots) {
212
+ const hash = createHash('sha256');
213
+ const resolvedRoot = path.resolve(root);
214
+ const roots = includedRoots.length > 0 ? includedRoots : [''];
215
+ for (const included of roots) {
216
+ hashDirectory(hash, resolvedRoot, included, new Set(excludedRoots.map((entry) => path.resolve(entry))));
217
+ }
218
+ return hash.digest('hex');
219
+ }
220
+ function hashDirectory(hash, root, relative, excludedRoots) {
221
+ const absolute = path.join(root, relative);
222
+ if ([...excludedRoots].some((excluded) => absolute === excluded || absolute.startsWith(`${excluded}${path.sep}`)))
223
+ return;
224
+ let stat;
225
+ try {
226
+ stat = fs.lstatSync(absolute);
227
+ }
228
+ catch (error) {
229
+ if (error.code === 'ENOENT') {
230
+ hash.update(`absent\0${relative}\0`);
231
+ return;
232
+ }
233
+ throw error;
234
+ }
235
+ if (stat.isDirectory()) {
236
+ hash.update(`directory\0${relative}\0`);
237
+ for (const name of fs.readdirSync(absolute).sort()) {
238
+ if (relative === '' && (name === '.git' || name === 'node_modules' || name === 'temp'))
239
+ continue;
240
+ hashDirectory(hash, root, path.join(relative, name), excludedRoots);
241
+ }
242
+ return;
243
+ }
244
+ if (stat.isSymbolicLink()) {
245
+ throw new Error(`Execution provenance source must not be a symbolic link: ${absolute}`);
246
+ }
247
+ hash.update(`file\0${relative}\0`);
248
+ hash.update(readRegularFileNoFollow(absolute));
249
+ hash.update('\0');
250
+ }
251
+ function fileFingerprint(filePath) {
252
+ return createHash('sha256').update(readRegularFileNoFollow(filePath)).digest('hex');
253
+ }
254
+ function readPathIdentity(filePath) {
255
+ const stat = fs.lstatSync(filePath);
256
+ if (stat.isSymbolicLink()) {
257
+ throw new Error(`Execution provenance source must not be a symbolic link: ${filePath}`);
258
+ }
259
+ return readRegularFileNoFollow(filePath);
260
+ }
261
+ function readRegularFileNoFollow(filePath) {
262
+ let fd;
263
+ try {
264
+ fd = fs.openSync(filePath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
265
+ }
266
+ catch (error) {
267
+ if (error.code === 'ELOOP') {
268
+ throw new Error(`Execution provenance source must not be a symbolic link: ${filePath}`);
269
+ }
270
+ throw error;
271
+ }
272
+ try {
273
+ if (!fs.fstatSync(fd).isFile()) {
274
+ throw new Error(`Execution provenance source is not a regular file: ${filePath}`);
275
+ }
276
+ return fs.readFileSync(fd);
277
+ }
278
+ finally {
279
+ fs.closeSync(fd);
280
+ }
281
+ }
282
+ function displayPath(projectRoot, filePath) {
283
+ const relative = path.relative(path.resolve(projectRoot), path.resolve(filePath));
284
+ return relative !== '..' && !relative.startsWith(`..${path.sep}`)
285
+ ? relative || '.'
286
+ : path.resolve(filePath);
287
+ }
288
+ function gitText(cwd, args) {
289
+ return gitBuffer(cwd, args).toString('utf8');
290
+ }
291
+ function gitBuffer(cwd, args) {
292
+ return execFileSync('git', args, {
293
+ cwd,
294
+ encoding: 'buffer',
295
+ maxBuffer: 128 * 1024 * 1024,
296
+ stdio: ['ignore', 'pipe', 'ignore'],
297
+ });
298
+ }
299
+ function compareSource(drift, phase, prefix, start, current) {
300
+ compare(drift, phase, `${prefix}.head`, start.head, current.head);
301
+ compare(drift, phase, `${prefix}.status`, start.status, current.status);
302
+ compare(drift, phase, `${prefix}.sourceFingerprint`, start.sourceFingerprint, current.sourceFingerprint);
303
+ }
304
+ function compare(drift, phase, field, start, current) {
305
+ if (start !== current)
306
+ drift.push({ phase, field, start, current });
307
+ }
308
+ //# sourceMappingURL=execution-provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-provenance.js","sourceRoot":"","sources":["../../src/harness/execution-provenance.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,12 @@ export interface HarnessHost {
11
11
  product: string;
12
12
  /** Prefix of the host's own environment variables: `<envPrefix>_OPERATION_ID`. */
13
13
  envPrefix: string;
14
+ /**
15
+ * Prefix of the variables recipe processes and library actions read:
16
+ * `<recipeEnvPrefix>_ADAPTER_INPUT`. Libraries outside the host depend on
17
+ * them, so they are spelled apart from the host's own `envPrefix`.
18
+ */
19
+ recipeEnvPrefix: string;
14
20
  /** The npm package that ships the bin. */
15
21
  packageName: string;
16
22
  /** The installed package root. */
@@ -32,6 +38,8 @@ export declare function configureHarnessHost(host: HarnessHostConfig): HarnessHo
32
38
  export declare function harnessHost(): HarnessHost;
33
39
  /** The host-owned environment variable `<envPrefix>_<suffix>`. */
34
40
  export declare function hostEnvName(suffix: string): string;
41
+ /** The recipe-process environment variable `<recipeEnvPrefix>_<suffix>`. */
42
+ export declare function recipeEnvName(suffix: string): string;
35
43
  /** Throws unless `value` is a non-empty, safe, checkout-relative path. */
36
44
  export declare function validateRelativeRecipePath(name: string, value: string): string;
37
45
  //# sourceMappingURL=host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/harness/host.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAeD,uEAAuE;AACvE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,GAAG;IACvE,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,WAAW,CAOzE;AAED,wBAAgB,WAAW,IAAI,WAAW,CAEzC;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,0EAA0E;AAC1E,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAa9E"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/harness/host.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAgBD,uEAAuE;AACvE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,GAAG;IACvE,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,WAAW,CASzE;AAED,wBAAgB,WAAW,IAAI,WAAW,CAEzC;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,0EAA0E;AAC1E,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAa9E"}
@@ -4,6 +4,7 @@ const defaultHost = {
4
4
  name: 'farmslot-recipe',
5
5
  product: 'project',
6
6
  envPrefix: 'FARMSLOT_RECIPE',
7
+ recipeEnvPrefix: 'RECIPE',
7
8
  packageName: '@farmslot/recipe-cli',
8
9
  packageRoot: fileURLToPath(new URL('../..', import.meta.url)),
9
10
  bin: 'bin/farmslot-recipe.mjs',
@@ -17,8 +18,10 @@ let current = defaultHost;
17
18
  */
18
19
  export function configureHarnessHost(host) {
19
20
  const next = { ...host, journaledCommands: host.journaledCommands ?? [] };
20
- if (!/^[A-Z][A-Z0-9_]*$/u.test(next.envPrefix)) {
21
- throw new Error(`envPrefix must be an upper-case identifier: ${next.envPrefix}`);
21
+ for (const field of ['envPrefix', 'recipeEnvPrefix']) {
22
+ if (!/^[A-Z][A-Z0-9_]*$/u.test(next[field])) {
23
+ throw new Error(`${field} must be an upper-case identifier: ${next[field]}`);
24
+ }
22
25
  }
23
26
  current = next;
24
27
  return current;
@@ -30,6 +33,10 @@ export function harnessHost() {
30
33
  export function hostEnvName(suffix) {
31
34
  return `${current.envPrefix}_${suffix}`;
32
35
  }
36
+ /** The recipe-process environment variable `<recipeEnvPrefix>_<suffix>`. */
37
+ export function recipeEnvName(suffix) {
38
+ return `${current.recipeEnvPrefix}_${suffix}`;
39
+ }
33
40
  /** Throws unless `value` is a non-empty, safe, checkout-relative path. */
34
41
  export function validateRelativeRecipePath(name, value) {
35
42
  if (!value || path.isAbsolute(value)) {
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/harness/host.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAyBzC,MAAM,WAAW,GAAgB;IAC/B,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,iBAAiB;IAC5B,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,GAAG,EAAE,yBAAyB;IAC9B,+EAA+E;IAC/E,iBAAiB,EAAE,EAAE;CACtB,CAAC;AAEF,IAAI,OAAO,GAAgB,WAAW,CAAC;AAOvC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,MAAM,IAAI,GAAgB,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;IACvF,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,+CAA+C,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,GAAG,IAAI,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,KAAa;IACpE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,uCAAuC,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qCAAqC,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oCAAoC,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/harness/host.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA+BzC,MAAM,WAAW,GAAgB;IAC/B,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,iBAAiB;IAC5B,eAAe,EAAE,QAAQ;IACzB,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,GAAG,EAAE,yBAAyB;IAC9B,+EAA+E;IAC/E,iBAAiB,EAAE,EAAE;CACtB,CAAC;AAEF,IAAI,OAAO,GAAgB,WAAW,CAAC;AAOvC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,MAAM,IAAI,GAAgB,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;IACvF,KAAK,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAU,EAAE,CAAC;QAC9D,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,sCAAsC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,GAAG,IAAI,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,GAAG,OAAO,CAAC,eAAe,IAAI,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,KAAa;IACpE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,uCAAuC,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qCAAqC,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oCAAoC,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,4 +1,4 @@
1
- export { adapterDetectNext, adapterFlags, adapterForPlatform, assertAdapter, configureHarnessAdapters, detectAdapter, harnessAdapter, harnessAdapters, isPlatformTarget, undetectedAdapterMessage, } from './adapters.js';
1
+ export { adapterDetectNext, adapterFlags, adapterForPlatform, adapterPortFlags, assertAdapter, configureHarnessAdapters, detectAdapter, harnessAdapter, harnessAdapters, isPlatformTarget, undetectedAdapterMessage, } from './adapters.js';
2
2
  export { type ArtifactManifestEntry, indexArtifactManifest, readContainedJsonArtifact, writeContainedArtifact, } from './artifact-files.js';
3
3
  export { acquireCheckoutLock, type CheckoutLock, type CheckoutLockFailure, trackCheckoutChild, } from './checkout-lock.js';
4
4
  export { classifyLogEvent, color, colorEnabled, colorHumanMessage, colorKv, colorLogEvent, colorStatusWord, stripAnsi, } from './cli-color.js';
@@ -7,13 +7,23 @@ export { handleLast } from './commands/last.js';
7
7
  export { handleLaunch } from './commands/launch.js';
8
8
  export { handleReload } from './commands/reload.js';
9
9
  export { handleStop, type StopCommandOptions, type StoppedCompanion } from './commands/stop.js';
10
+ export { captureExecutionProvenance, type ExecutionProvenanceDrift, executionProvenanceDrift, type ExecutionProvenanceInput, type ExecutionProvenancePhase, type ExecutionProvenanceRecord, type ExecutionProvenanceSnapshot, ProvenanceDriftError, type SourceProvenanceSnapshot, writeExecutionProvenance, } from './execution-provenance.js';
10
11
  export { checkHealBounds, classifyFailure, conciseFailureForHuman, ensureOverlay, type FailureClass, newHealState, parseHeal, recipeRunning, } from './heal-bounds.js';
11
- export { configureHarnessHost, type HarnessHost, harnessHost, type HarnessHostConfig, hostEnvName, validateRelativeRecipePath, } from './host.js';
12
+ export { configureHarnessHost, type HarnessHost, harnessHost, type HarnessHostConfig, hostEnvName, recipeEnvName, validateRelativeRecipePath, } from './host.js';
12
13
  export { JsonStreamWriter } from './json-stream.js';
13
14
  export { leafStartFailureMessage, missingShellLeafMessage, resolveLeafInvoke, shellLeafMissing, } from './leaf-invoke.js';
14
15
  export { gitLibraryProvenance } from './library-provenance.js';
16
+ export { liveAdapterProcessTimeoutMs, type LiveAdapterRun, type PreparedLiveAdapter, prepareLiveAdapterScript, resolveLiveAdapter, runLiveAdapterScript, } from './live-adapter-contract.js';
15
17
  export { argValue, handleHarness, type HarnessAction, hasArg, type OverlayCommandOptions, type OverlayInstallContext, readRuntimeContextField, resolveRuntimeContextPath, } from './overlay.js';
16
18
  export { actionManifestPathOption, adapterOption, applyRuntimeDirOption, applyWatcherPortOption, CliError, type CliOptions, type CliOptionValue, isRecord, optionFlag, optionString, optionStrings, parseArgs, type ParseArgsOptions, type ParsedArgs, parsePort, parseRecipeParamAssignments, requiredOption, resolveAdapter, shellQuote, shellQuoteArg, targetPath, usageError, } from './parse-args.js';
17
19
  export { DEFAULT_RECIPE_HARNESS_ROOT, DEFAULT_RECIPE_RUNTIME_DIR, harnessExecutable, recipeHarnessPath, recipeHarnessRoot, recipeRuntimeDir, recipeRuntimePath, } from './paths.js';
20
+ export { captureHelperPath, captureHelperSupportsCapability, captureHelperSupportsRecordSessionSnapshots, createRecordingTargetProvider, } from './recording-target.js';
21
+ export { beginRunDiagnostics, type CaptureEvidence, type ClassifiedConsoleRecord, collectRunDiagnostics, type ConsoleAllowlist, type ConsoleAllowlistMatch, type ConsoleCaptureSpec, type ConsoleClassifier, type ConsoleEventKey, type ConsoleRecord, finishRunDiagnostics, formatRunDiagnosticsForHuman, readRunDiagnosticsDocument, type RecipeRunEvidence, type RunDiagnosticBaseline, type RunDiagnosticsDocument, type RunSideFinding, verifyConsoleCapture, } from './run-diagnostics.js';
22
+ export { recipeRunOptionsFromCli } from './run-options.js';
23
+ export { type ActiveRecipeRecording, captureActiveRecipeRecordingSnapshot, type RecipeRecordingOptions, startRecipeRecording, stopRecipeRecording, } from './run-recording.js';
24
+ export { executedBrowser, indexProductProvenanceArtifact, recipeCdpPorts, type RunReport, writeRunReport, } from './run-report.js';
25
+ export { type ProofDocument, type ProofNode, validateRuntimeProof, validateRuntimeProofPlan, } from './runtime-proof.js';
18
26
  export { checkoutBusyOut, EXIT, flag, type ParsedFlags, parseFlags, resolveFlagsAdapter, scriptOverride, type ScriptResult, spawnInherit, spawnScript, spawnScriptStreaming, str, type StreamingSpawnOptions, targetOf, usageOut, writeInteractiveProgress, } from './shared.js';
27
+ export { closest } from './suggest.js';
28
+ export { explicitRecipeTrustOptions, type RecipeTrustFailure, recipeTrustFailure, } from './trust.js';
19
29
  //# sourceMappingURL=index.d.ts.map