@guilz-dev/belay 0.8.0 → 0.9.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 (111) hide show
  1. package/README.md +60 -10
  2. package/dist/adapters/shared/gate-runtime.d.ts +5 -0
  3. package/dist/adapters/shared/gate-runtime.js +237 -33
  4. package/dist/bundle/claude-runtime.mjs +4082 -1230
  5. package/dist/bundle/codex-runtime.mjs +4057 -1205
  6. package/dist/bundle/cursor-runtime.mjs +4057 -1205
  7. package/dist/commands/classify-for-report.js +5 -0
  8. package/dist/commands/doctor.js +90 -27
  9. package/dist/commands/explain.js +3 -2
  10. package/dist/commands/metrics.js +75 -4
  11. package/dist/commands/quality.js +2 -6
  12. package/dist/commands/recovery-checkpoints.d.ts +8 -1
  13. package/dist/commands/recovery-checkpoints.js +44 -11
  14. package/dist/commands/session.d.ts +5 -0
  15. package/dist/commands/session.js +8 -1
  16. package/dist/commands/status.js +1 -1
  17. package/dist/config-io.js +2 -2
  18. package/dist/conformance/contained-execution-guarantee.d.ts +121 -0
  19. package/dist/conformance/contained-execution-guarantee.js +121 -0
  20. package/dist/conformance/guarantee-table.js +7 -0
  21. package/dist/core/audit-io.js +8 -0
  22. package/dist/core/audit-metrics.d.ts +34 -0
  23. package/dist/core/audit-metrics.js +87 -15
  24. package/dist/core/audit-recovery-metrics.d.ts +33 -0
  25. package/dist/core/audit-recovery-metrics.js +146 -0
  26. package/dist/core/audit-types.d.ts +7 -1
  27. package/dist/core/audit-types.js +1 -1
  28. package/dist/core/bounded-output.d.ts +11 -0
  29. package/dist/core/bounded-output.js +26 -0
  30. package/dist/core/capability/attestation.d.ts +56 -0
  31. package/dist/core/capability/attestation.js +110 -3
  32. package/dist/core/capability/boundary-session.d.ts +5 -0
  33. package/dist/core/capability/boundary-session.js +38 -1
  34. package/dist/core/capability/index.d.ts +1 -1
  35. package/dist/core/capability/index.js +1 -1
  36. package/dist/core/config.d.ts +18 -0
  37. package/dist/core/config.js +89 -10
  38. package/dist/core/contained-execution/docker-policy.d.ts +18 -0
  39. package/dist/core/contained-execution/docker-policy.js +97 -0
  40. package/dist/core/contained-execution/docker.d.ts +223 -0
  41. package/dist/core/contained-execution/docker.js +846 -0
  42. package/dist/core/contained-execution/eligibility.d.ts +9 -0
  43. package/dist/core/contained-execution/eligibility.js +103 -0
  44. package/dist/core/contained-execution/failure.d.ts +18 -0
  45. package/dist/core/contained-execution/failure.js +105 -0
  46. package/dist/core/contained-execution/mirror.d.ts +54 -0
  47. package/dist/core/contained-execution/mirror.js +587 -0
  48. package/dist/core/contained-execution/policy.d.ts +10 -0
  49. package/dist/core/contained-execution/policy.js +20 -0
  50. package/dist/core/effect-ir/index.d.ts +1 -1
  51. package/dist/core/effect-ir/index.js +1 -1
  52. package/dist/core/effect-ir/normalize.d.ts +5 -0
  53. package/dist/core/effect-ir/normalize.js +17 -7
  54. package/dist/core/effect-ir/shell-build.js +2 -14
  55. package/dist/core/effect-ir/shell-lower.js +100 -25
  56. package/dist/core/gate-contract.d.ts +4 -1
  57. package/dist/core/gate-contract.js +2 -0
  58. package/dist/core/process-runner.d.ts +10 -3
  59. package/dist/core/process-runner.js +66 -10
  60. package/dist/core/recovery/checkpoint.d.ts +3 -0
  61. package/dist/core/recovery/checkpoint.js +33 -4
  62. package/dist/core/recovery/types.d.ts +1 -0
  63. package/dist/core/scrub.d.ts +17 -0
  64. package/dist/core/scrub.js +499 -5
  65. package/dist/core/standing-allow.d.ts +0 -20
  66. package/dist/core/standing-allow.js +0 -71
  67. package/dist/core/transactional/apply-observed-changes.d.ts +1 -0
  68. package/dist/core/transactional/apply-observed-changes.js +11 -0
  69. package/dist/core/transactional/backend-selector.d.ts +2 -1
  70. package/dist/core/transactional/backend-selector.js +32 -29
  71. package/dist/core/transactional/backend.d.ts +3 -0
  72. package/dist/core/transactional/file-checkpoint-backend.js +242 -54
  73. package/dist/core/transactional/file-checkpoint-git.d.ts +3 -0
  74. package/dist/core/transactional/file-checkpoint-git.js +53 -0
  75. package/dist/core/transactional/file-checkpoint-isolation.d.ts +3 -0
  76. package/dist/core/transactional/file-checkpoint-isolation.js +16 -0
  77. package/dist/core/transactional/git-worktree-backend.js +3 -0
  78. package/dist/core/transactional/git-worktree.d.ts +1 -0
  79. package/dist/core/transactional/git-worktree.js +1 -0
  80. package/dist/core/transactional/runner.js +59 -13
  81. package/dist/core/types.d.ts +13 -0
  82. package/dist/core/verdict/parser.d.ts +10 -0
  83. package/dist/core/verdict/parser.js +271 -40
  84. package/dist/core/verdict/shell-semantics.js +21 -0
  85. package/dist/corpus/adversarial-probe.d.ts +1 -1
  86. package/dist/corpus/adversarial-probe.js +3 -3
  87. package/dist/corpus/benign-probe-cores.d.ts +6 -0
  88. package/dist/corpus/{must-allow-commands.js → benign-probe-cores.js} +8 -2
  89. package/dist/corpus/coverage-compare.d.ts +36 -0
  90. package/dist/corpus/coverage-compare.js +197 -0
  91. package/dist/corpus/coverage-contexts.d.ts +17 -0
  92. package/dist/corpus/coverage-contexts.js +88 -0
  93. package/dist/corpus/coverage-matrix.d.ts +37 -0
  94. package/dist/corpus/coverage-matrix.js +159 -0
  95. package/dist/corpus/coverage-probe.d.ts +91 -0
  96. package/dist/corpus/coverage-probe.js +341 -0
  97. package/dist/corpus/evaluate.d.ts +1 -1
  98. package/dist/corpus/evaluate.js +1 -1
  99. package/dist/corpus/structural-fixture-root.d.ts +2 -0
  100. package/dist/corpus/structural-fixture-root.js +5 -0
  101. package/dist/operational-insights.d.ts +3 -0
  102. package/dist/operational-insights.js +7 -3
  103. package/dist/runtime-provenance.d.ts +8 -0
  104. package/dist/runtime-provenance.js +34 -0
  105. package/dist/types.d.ts +3 -0
  106. package/dist/version.d.ts +1 -1
  107. package/dist/version.js +1 -1
  108. package/package.json +3 -1
  109. package/skills/belay/SKILL.md +19 -0
  110. package/skills/belay/belay-status.md +5 -0
  111. package/dist/corpus/must-allow-commands.d.ts +0 -6
@@ -0,0 +1,9 @@
1
+ import type { BelayConfigV3 } from '../config.js';
2
+ import type { GatedAction } from '../gate-contract.js';
3
+ import type { ClassifyResult } from '../types.js';
4
+ /**
5
+ * Returns whether an unknown shell EffectPlan can be mediated by the contained
6
+ * execution boundary. This only interprets normalized effects and gate context;
7
+ * it never derives authority from command syntax or command identity.
8
+ */
9
+ export declare function isContainedUnknownExecutionEligible(config: BelayConfigV3, action: Pick<GatedAction, 'kind' | 'repoRoot'>, result: ClassifyResult): boolean;
@@ -0,0 +1,103 @@
1
+ import path from 'node:path';
2
+ import { collectRequirements } from '../effect-ir/build.js';
3
+ import { resolveWorkspaceRootMatch } from '../path-utils.js';
4
+ const FORBIDDEN_SIGNALS = new Set([
5
+ 'command_substitution',
6
+ 'control_plane_mutation',
7
+ 'dynamic_shell_evaluation',
8
+ 'high_stakes_path',
9
+ 'pipe_to_shell',
10
+ 'secret_payload_send',
11
+ 'shell.xargs_stdin_dynamic',
12
+ 'sensitive_path_read',
13
+ 'tier0_external',
14
+ 'tier1_catastrophic',
15
+ 'unparseable_shell',
16
+ ]);
17
+ /**
18
+ * Returns whether an unknown shell EffectPlan can be mediated by the contained
19
+ * execution boundary. This only interprets normalized effects and gate context;
20
+ * it never derives authority from command syntax or command identity.
21
+ */
22
+ export function isContainedUnknownExecutionEligible(config, action, result) {
23
+ const contained = config.sandbox.containedExecution;
24
+ if (!contained?.enabled ||
25
+ !config.sandbox.enabled ||
26
+ config.sandbox.runtime !== 'container' ||
27
+ action.kind !== 'shell' ||
28
+ !path.isAbsolute(action.repoRoot) ||
29
+ !hasResolvedRepoIdentity(action.repoRoot) ||
30
+ !config.gates.shell ||
31
+ result.reason !== 'unknown_local_effect' ||
32
+ result.axes?.location !== 'repo_local' ||
33
+ result.assessment.external) {
34
+ return false;
35
+ }
36
+ const plan = result.effectPlan;
37
+ if (!plan || (plan.opacity !== 'transparent' && plan.opacity !== 'recursive')) {
38
+ return false;
39
+ }
40
+ const requirements = collectRequirements(plan.root);
41
+ if (requirements.length === 0 ||
42
+ !hasSafeRecursiveExpansion(plan, requirements) ||
43
+ !requirements.some((requirement) => requirement.action === 'process.exec') ||
44
+ requirements.some((requirement) => !isPermittedRequirement(requirement, action.repoRoot))) {
45
+ return false;
46
+ }
47
+ return !collectSignals(result, requirements).some(isForbiddenSignal);
48
+ }
49
+ function hasSafeRecursiveExpansion(plan, requirements) {
50
+ if (plan.opacity === 'transparent') {
51
+ return true;
52
+ }
53
+ return requirements.some((requirement) => (requirement.provenances ?? [requirement.provenance]).some((provenance) => typeof provenance.innerCommand === 'string' && provenance.innerCommand !== ''));
54
+ }
55
+ function isPermittedRequirement(requirement, repoRoot) {
56
+ if (requirement.tag === 'indeterminate' || requirement.action === 'indeterminate') {
57
+ return (requirement.tag === 'indeterminate' &&
58
+ requirement.action === 'indeterminate' &&
59
+ requirement.resource.kind === 'unknown');
60
+ }
61
+ if (requirement.tag === 'process.exec' && requirement.action === 'process.exec') {
62
+ return (requirement.resource.kind === 'executable' &&
63
+ (requirement.resource.operation === 'inspect' || requirement.resource.operation === 'spawn'));
64
+ }
65
+ return (((requirement.tag === 'fs.read' && requirement.action === 'fs.read') ||
66
+ (requirement.tag === 'fs.write' && requirement.action === 'fs.write')) &&
67
+ requirement.resource.kind === 'path' &&
68
+ isRepoLocalPath(repoRoot, requirement.resource.path));
69
+ }
70
+ function isRepoLocalPath(repoRoot, targetPath) {
71
+ try {
72
+ return resolveWorkspaceRootMatch(repoRoot, [], targetPath)?.kind === 'repo';
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ }
78
+ function hasResolvedRepoIdentity(repoRoot) {
79
+ try {
80
+ const match = resolveWorkspaceRootMatch(repoRoot, [], repoRoot);
81
+ return match?.kind === 'repo' && match.relativePath === '.';
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ function collectSignals(result, requirements) {
88
+ return [
89
+ ...new Set([
90
+ ...result.assessment.signals,
91
+ ...(result.axes?.signals ?? []),
92
+ ...(result.effectPlan?.signals ?? []),
93
+ ...requirements.flatMap((requirement) => requirement.evidence.signals),
94
+ ]),
95
+ ];
96
+ }
97
+ function isForbiddenSignal(signal) {
98
+ return (FORBIDDEN_SIGNALS.has(signal) ||
99
+ signal.startsWith('tier0_') ||
100
+ signal.startsWith('tier1_') ||
101
+ signal.includes('high_stakes') ||
102
+ signal.includes('control_plane'));
103
+ }
@@ -0,0 +1,18 @@
1
+ export declare const CONTAINED_EXECUTION_FAILURE_CODES: readonly ["contained_execution_boundary_failed", "contained_execution_capability_invalid", "contained_execution_capability_mismatch", "contained_execution_cleanup_unconfirmed", "contained_execution_container_cleanup_unconfirmed", "contained_execution_control_plane_roots_required", "contained_execution_create_failed", "contained_execution_create_invalid", "contained_execution_create_mismatch", "contained_execution_create_timeout", "contained_execution_create_truncated", "contained_execution_disabled", "contained_execution_docker_binary_invalid", "contained_execution_docker_config_missing", "contained_execution_docker_daemon_invalid", "contained_execution_docker_daemon_unavailable", "contained_execution_docker_host_invalid", "contained_execution_docker_substrate_mismatch", "contained_execution_docker_substrate_overlap", "contained_execution_docker_substrate_unavailable", "contained_execution_host_identity_unavailable", "contained_execution_image_inspect_invalid", "contained_execution_image_inspect_truncated", "contained_execution_image_mismatch", "contained_execution_image_missing", "contained_execution_input_fingerprint_invalid", "contained_execution_inspect_failed", "contained_execution_inspect_invalid", "contained_execution_inspect_mismatch", "contained_execution_inspect_timeout", "contained_execution_inspect_truncated", "contained_execution_invalid_container_name", "contained_execution_invalid_cwd", "contained_execution_invalid_image_id", "contained_execution_invalid_mirror_lease", "contained_execution_invalid_mount", "contained_execution_invalid_user", "contained_execution_mirror_limits_invalid", "contained_execution_probe_create_failed", "contained_execution_probe_failed", "contained_execution_probe_inspect_failed", "contained_execution_probe_inspect_invalid", "contained_execution_probe_inspect_truncated", "contained_execution_probe_root_cleanup_unconfirmed", "contained_execution_protected_root_overlap", "contained_execution_resource_limits_invalid", "contained_execution_safe_open_unavailable", "contained_execution_source_changed", "contained_execution_source_is_protected", "contained_execution_source_not_directory", "contained_execution_start_attempt_failed", "contained_execution_unknown_option", "contained_execution_unsafe_symlink"];
2
+ export type ContainedExecutionFailureCode = (typeof CONTAINED_EXECUTION_FAILURE_CODES)[number];
3
+ export type ContainedExecutionFailurePhase = 'boundary' | 'capability' | 'image' | 'mirror' | 'lease' | 'container-lifecycle' | 'cleanup';
4
+ export type ContainedExecutionFailureDisposition = 'approval-fallback' | 'deny';
5
+ export type ContainedExecutionFailureRemediation = 'session-start' | 'none';
6
+ export declare function isContainedExecutionFailureCode(value: unknown): value is ContainedExecutionFailureCode;
7
+ export declare function containedExecutionFailurePhase(code: ContainedExecutionFailureCode): ContainedExecutionFailurePhase;
8
+ export declare class ContainedExecutionFailureError extends Error {
9
+ readonly code: ContainedExecutionFailureCode;
10
+ readonly phase: ContainedExecutionFailurePhase;
11
+ readonly executionStarted: boolean;
12
+ readonly disposition: ContainedExecutionFailureDisposition;
13
+ readonly remediation: ContainedExecutionFailureRemediation;
14
+ constructor(code: ContainedExecutionFailureCode, options?: ErrorOptions & {
15
+ phase?: ContainedExecutionFailurePhase;
16
+ executionStarted?: boolean;
17
+ });
18
+ }
@@ -0,0 +1,105 @@
1
+ import { isContainedExecutionApprovalFallbackReason } from './policy.js';
2
+ export const CONTAINED_EXECUTION_FAILURE_CODES = [
3
+ 'contained_execution_boundary_failed',
4
+ 'contained_execution_capability_invalid',
5
+ 'contained_execution_capability_mismatch',
6
+ 'contained_execution_cleanup_unconfirmed',
7
+ 'contained_execution_container_cleanup_unconfirmed',
8
+ 'contained_execution_control_plane_roots_required',
9
+ 'contained_execution_create_failed',
10
+ 'contained_execution_create_invalid',
11
+ 'contained_execution_create_mismatch',
12
+ 'contained_execution_create_timeout',
13
+ 'contained_execution_create_truncated',
14
+ 'contained_execution_disabled',
15
+ 'contained_execution_docker_binary_invalid',
16
+ 'contained_execution_docker_config_missing',
17
+ 'contained_execution_docker_daemon_invalid',
18
+ 'contained_execution_docker_daemon_unavailable',
19
+ 'contained_execution_docker_host_invalid',
20
+ 'contained_execution_docker_substrate_mismatch',
21
+ 'contained_execution_docker_substrate_overlap',
22
+ 'contained_execution_docker_substrate_unavailable',
23
+ 'contained_execution_host_identity_unavailable',
24
+ 'contained_execution_image_inspect_invalid',
25
+ 'contained_execution_image_inspect_truncated',
26
+ 'contained_execution_image_mismatch',
27
+ 'contained_execution_image_missing',
28
+ 'contained_execution_input_fingerprint_invalid',
29
+ 'contained_execution_inspect_failed',
30
+ 'contained_execution_inspect_invalid',
31
+ 'contained_execution_inspect_mismatch',
32
+ 'contained_execution_inspect_timeout',
33
+ 'contained_execution_inspect_truncated',
34
+ 'contained_execution_invalid_container_name',
35
+ 'contained_execution_invalid_cwd',
36
+ 'contained_execution_invalid_image_id',
37
+ 'contained_execution_invalid_mirror_lease',
38
+ 'contained_execution_invalid_mount',
39
+ 'contained_execution_invalid_user',
40
+ 'contained_execution_mirror_limits_invalid',
41
+ 'contained_execution_probe_create_failed',
42
+ 'contained_execution_probe_failed',
43
+ 'contained_execution_probe_inspect_failed',
44
+ 'contained_execution_probe_inspect_invalid',
45
+ 'contained_execution_probe_inspect_truncated',
46
+ 'contained_execution_probe_root_cleanup_unconfirmed',
47
+ 'contained_execution_protected_root_overlap',
48
+ 'contained_execution_resource_limits_invalid',
49
+ 'contained_execution_safe_open_unavailable',
50
+ 'contained_execution_source_changed',
51
+ 'contained_execution_source_is_protected',
52
+ 'contained_execution_source_not_directory',
53
+ 'contained_execution_start_attempt_failed',
54
+ 'contained_execution_unknown_option',
55
+ 'contained_execution_unsafe_symlink',
56
+ ];
57
+ const failureCodes = new Set(CONTAINED_EXECUTION_FAILURE_CODES);
58
+ const mirrorFailureCodes = new Set([
59
+ 'contained_execution_control_plane_roots_required',
60
+ 'contained_execution_mirror_limits_invalid',
61
+ 'contained_execution_safe_open_unavailable',
62
+ 'contained_execution_source_changed',
63
+ 'contained_execution_source_is_protected',
64
+ 'contained_execution_source_not_directory',
65
+ 'contained_execution_unsafe_symlink',
66
+ ]);
67
+ export function isContainedExecutionFailureCode(value) {
68
+ return typeof value === 'string' && failureCodes.has(value);
69
+ }
70
+ export function containedExecutionFailurePhase(code) {
71
+ if (code.includes('cleanup'))
72
+ return 'cleanup';
73
+ if (code.includes('capability'))
74
+ return 'capability';
75
+ if (code.includes('image'))
76
+ return 'image';
77
+ if (code.includes('lease'))
78
+ return 'lease';
79
+ if (mirrorFailureCodes.has(code))
80
+ return 'mirror';
81
+ if (/_(?:create|inspect|start|probe)_/.test(code))
82
+ return 'container-lifecycle';
83
+ return 'boundary';
84
+ }
85
+ export class ContainedExecutionFailureError extends Error {
86
+ code;
87
+ phase;
88
+ executionStarted;
89
+ disposition;
90
+ remediation;
91
+ constructor(code, options) {
92
+ super(code, options);
93
+ this.code = code;
94
+ this.name = 'ContainedExecutionFailureError';
95
+ this.phase = options?.phase ?? containedExecutionFailurePhase(code);
96
+ this.executionStarted = options?.executionStarted ?? false;
97
+ this.disposition = isContainedExecutionApprovalFallbackReason(code)
98
+ ? 'approval-fallback'
99
+ : 'deny';
100
+ this.remediation =
101
+ this.phase === 'capability' || this.phase === 'image' || code.includes('_docker_')
102
+ ? 'session-start'
103
+ : 'none';
104
+ }
105
+ }
@@ -0,0 +1,54 @@
1
+ import { ContainedExecutionFailureError } from './failure.js';
2
+ export declare const CONTAINED_EXECUTION_CLEANUP_UNCONFIRMED = "contained_execution_cleanup_unconfirmed";
3
+ export declare const CONTAINED_EXECUTION_SOURCE_CHANGED = "contained_execution_source_changed";
4
+ export declare const CONTAINED_EXECUTION_UNSAFE_SYMLINK = "contained_execution_unsafe_symlink";
5
+ export declare class ContainedExecutionCleanupUnconfirmedError extends ContainedExecutionFailureError {
6
+ readonly mirrorRoot: string;
7
+ constructor(mirrorRoot: string, options?: ErrorOptions);
8
+ }
9
+ export type ContainedExecutionMirrorBackend = 'file_copy';
10
+ export interface ContainedExecutionMirrorLimits {
11
+ maxFiles: number;
12
+ maxSourceBytes: number;
13
+ maxWorkspaceBytes: number;
14
+ prepareTimeoutMs: number;
15
+ }
16
+ export interface ContainedExecutionMirrorOptions {
17
+ sourceRoot: string;
18
+ /** Must be supplied explicitly, even when the resolved set is deliberately empty. */
19
+ controlPlaneRoots: string[];
20
+ limits: ContainedExecutionMirrorLimits;
21
+ }
22
+ export interface ContainedExecutionMirrorHandle {
23
+ /** Exact private host root containing guest-visible content only. */
24
+ hostMirrorRoot: string;
25
+ /** Absolute path at which Task 4 must mount hostMirrorRoot inside the guest. */
26
+ guestWorkspacePath: string;
27
+ backend: ContainedExecutionMirrorBackend;
28
+ cleanup(): Promise<void>;
29
+ }
30
+ /** Internal execution-boundary check; the public core index deliberately does not re-export it. */
31
+ export declare function validateContainedExecutionMirrorLease(handle: ContainedExecutionMirrorHandle, expected: {
32
+ sourceRoot: string;
33
+ protectedRoots: readonly string[];
34
+ }): boolean;
35
+ interface MirrorTestDependencies {
36
+ makeTempRoot?(): Promise<string>;
37
+ removeRoot?(root: string): Promise<void>;
38
+ now?(): number;
39
+ afterSnapshotCaptured?(): Promise<void>;
40
+ beforeCopyOpen?(sourcePath: string): Promise<void>;
41
+ afterCopyRead?(sourcePath: string, bytesRead: number, totalBytes: number): Promise<void>;
42
+ }
43
+ /**
44
+ * Non-atomic acceptance rule: the current source tree is read, copied, then read again. A mirror
45
+ * is returned only when both source observations and the copied tree have the same content/mode
46
+ * hash. This detects ordinary concurrent changes but does not claim an atomic filesystem snapshot.
47
+ */
48
+ export declare function prepareContainedExecutionMirror(options: ContainedExecutionMirrorOptions): Promise<ContainedExecutionMirrorHandle>;
49
+ /** Narrow test seam for deterministic allocation, race, deadline, and removal failures. */
50
+ export declare function prepareContainedExecutionMirrorForTests(options: ContainedExecutionMirrorOptions, overrides: MirrorTestDependencies): Promise<ContainedExecutionMirrorHandle>;
51
+ export declare function withContainedExecutionMirror<T>(options: ContainedExecutionMirrorOptions, operation: (mirror: ContainedExecutionMirrorHandle) => Promise<T>): Promise<T>;
52
+ /** Narrow test seam matching prepareContainedExecutionMirrorForTests. */
53
+ export declare function withContainedExecutionMirrorForTests<T>(options: ContainedExecutionMirrorOptions, operation: (mirror: ContainedExecutionMirrorHandle) => Promise<T>, overrides: MirrorTestDependencies): Promise<T>;
54
+ export {};