@gate-forge/witness 0.0.0-stage → 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 (123) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +114 -2
  3. package/dist/adapter/contract-suite.d.ts +167 -0
  4. package/dist/adapter/contract-suite.d.ts.map +1 -0
  5. package/dist/adapter/contract-suite.js +348 -0
  6. package/dist/adapter/contract-suite.js.map +1 -0
  7. package/dist/adapter/contract.d.ts +266 -0
  8. package/dist/adapter/contract.d.ts.map +1 -0
  9. package/dist/adapter/contract.js +2 -0
  10. package/dist/adapter/contract.js.map +1 -0
  11. package/dist/adapter/index.d.ts +8 -0
  12. package/dist/adapter/index.d.ts.map +1 -0
  13. package/dist/adapter/index.js +2 -0
  14. package/dist/adapter/index.js.map +1 -0
  15. package/dist/adapter-kit/config.d.ts +163 -0
  16. package/dist/adapter-kit/config.d.ts.map +1 -0
  17. package/dist/adapter-kit/config.js +21 -0
  18. package/dist/adapter-kit/config.js.map +1 -0
  19. package/dist/adapter-kit/define.d.ts +47 -0
  20. package/dist/adapter-kit/define.d.ts.map +1 -0
  21. package/dist/adapter-kit/define.js +336 -0
  22. package/dist/adapter-kit/define.js.map +1 -0
  23. package/dist/adapter-kit/index.d.ts +34 -0
  24. package/dist/adapter-kit/index.d.ts.map +1 -0
  25. package/dist/adapter-kit/index.js +32 -0
  26. package/dist/adapter-kit/index.js.map +1 -0
  27. package/dist/adapter-kit/projection.d.ts +69 -0
  28. package/dist/adapter-kit/projection.d.ts.map +1 -0
  29. package/dist/adapter-kit/projection.js +85 -0
  30. package/dist/adapter-kit/projection.js.map +1 -0
  31. package/dist/adapter-kit/session.d.ts +105 -0
  32. package/dist/adapter-kit/session.d.ts.map +1 -0
  33. package/dist/adapter-kit/session.js +230 -0
  34. package/dist/adapter-kit/session.js.map +1 -0
  35. package/dist/client/witness-client.d.ts +193 -0
  36. package/dist/client/witness-client.d.ts.map +1 -0
  37. package/dist/client/witness-client.js +321 -0
  38. package/dist/client/witness-client.js.map +1 -0
  39. package/dist/constants.d.ts +189 -0
  40. package/dist/constants.d.ts.map +1 -0
  41. package/dist/constants.js +197 -0
  42. package/dist/constants.js.map +1 -0
  43. package/dist/index.d.ts +15 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +20 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/json.d.ts +16 -0
  48. package/dist/json.d.ts.map +1 -0
  49. package/dist/json.js +21 -0
  50. package/dist/json.js.map +1 -0
  51. package/dist/queue/bullmq.d.ts +28 -0
  52. package/dist/queue/bullmq.d.ts.map +1 -0
  53. package/dist/queue/bullmq.js +210 -0
  54. package/dist/queue/bullmq.js.map +1 -0
  55. package/dist/queue/observer.d.ts +130 -0
  56. package/dist/queue/observer.d.ts.map +1 -0
  57. package/dist/queue/observer.js +179 -0
  58. package/dist/queue/observer.js.map +1 -0
  59. package/dist/surface.d.ts +211 -0
  60. package/dist/surface.d.ts.map +1 -0
  61. package/dist/surface.js +268 -0
  62. package/dist/surface.js.map +1 -0
  63. package/dist/witness/adapter-registry.d.ts +92 -0
  64. package/dist/witness/adapter-registry.d.ts.map +1 -0
  65. package/dist/witness/adapter-registry.js +370 -0
  66. package/dist/witness/adapter-registry.js.map +1 -0
  67. package/dist/witness/behavior-request.d.ts +80 -0
  68. package/dist/witness/behavior-request.d.ts.map +1 -0
  69. package/dist/witness/behavior-request.js +335 -0
  70. package/dist/witness/behavior-request.js.map +1 -0
  71. package/dist/witness/behavior.d.ts +52 -0
  72. package/dist/witness/behavior.d.ts.map +1 -0
  73. package/dist/witness/behavior.js +118 -0
  74. package/dist/witness/behavior.js.map +1 -0
  75. package/dist/witness/bin.d.ts +21 -0
  76. package/dist/witness/bin.d.ts.map +1 -0
  77. package/dist/witness/bin.js +254 -0
  78. package/dist/witness/bin.js.map +1 -0
  79. package/dist/witness/browser.d.ts +221 -0
  80. package/dist/witness/browser.d.ts.map +1 -0
  81. package/dist/witness/browser.js +644 -0
  82. package/dist/witness/browser.js.map +1 -0
  83. package/dist/witness/chaos.d.ts +179 -0
  84. package/dist/witness/chaos.d.ts.map +1 -0
  85. package/dist/witness/chaos.js +270 -0
  86. package/dist/witness/chaos.js.map +1 -0
  87. package/dist/witness/classifications.d.ts +42 -0
  88. package/dist/witness/classifications.d.ts.map +1 -0
  89. package/dist/witness/classifications.js +87 -0
  90. package/dist/witness/classifications.js.map +1 -0
  91. package/dist/witness/env-attestation.d.ts +98 -0
  92. package/dist/witness/env-attestation.d.ts.map +1 -0
  93. package/dist/witness/env-attestation.js +202 -0
  94. package/dist/witness/env-attestation.js.map +1 -0
  95. package/dist/witness/fixture-provider.d.ts +89 -0
  96. package/dist/witness/fixture-provider.d.ts.map +1 -0
  97. package/dist/witness/fixture-provider.js +116 -0
  98. package/dist/witness/fixture-provider.js.map +1 -0
  99. package/dist/witness/loopback-pins.d.ts +79 -0
  100. package/dist/witness/loopback-pins.d.ts.map +1 -0
  101. package/dist/witness/loopback-pins.js +244 -0
  102. package/dist/witness/loopback-pins.js.map +1 -0
  103. package/dist/witness/run-options.d.ts +47 -0
  104. package/dist/witness/run-options.d.ts.map +1 -0
  105. package/dist/witness/run-options.js +179 -0
  106. package/dist/witness/run-options.js.map +1 -0
  107. package/dist/witness/server.d.ts +34 -0
  108. package/dist/witness/server.d.ts.map +1 -0
  109. package/dist/witness/server.js +4963 -0
  110. package/dist/witness/server.js.map +1 -0
  111. package/dist/witness/task.d.ts +77 -0
  112. package/dist/witness/task.d.ts.map +1 -0
  113. package/dist/witness/task.js +201 -0
  114. package/dist/witness/task.js.map +1 -0
  115. package/dist/witness/twin-shapes.d.ts +51 -0
  116. package/dist/witness/twin-shapes.d.ts.map +1 -0
  117. package/dist/witness/twin-shapes.js +127 -0
  118. package/dist/witness/twin-shapes.js.map +1 -0
  119. package/dist/witness/types.d.ts +1094 -0
  120. package/dist/witness/types.d.ts.map +1 -0
  121. package/dist/witness/types.js +2 -0
  122. package/dist/witness/types.js.map +1 -0
  123. package/package.json +98 -4
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Witness process entry (`gateforge-witness`): derives configuration
3
+ * from CLI flags and the environment and starts the loopback witness
4
+ * service.
5
+ *
6
+ * Usage (every flag has an env fallback; the flag wins when both are
7
+ * given):
8
+ *
9
+ * gateforge-witness [--help]
10
+ * [--proxy-target <url>] start the observation proxy against
11
+ * this loopback base URL (ADR 0004 D7)
12
+ * [--mount-path <prefix>] browser-facing mount prefix the proxy
13
+ * strips before forwarding AND recording
14
+ * (e.g. /api; requires --proxy-target)
15
+ * [--state-dir <dir>] manifest append at shutdown
16
+ * [--classifications <path>] classifications YAML input
17
+ * [--adapters-dir <dir>] reviewed adapters (default .gateforge/adapters)
18
+ * [--target-base-url <url>] attestation subject (GF-10, loopback)
19
+ * [--target-fingerprint <m>] expected marker (GF-13)
20
+ * [--adapter-base-url <url>] default adapter read base
21
+ *
22
+ * Env surface:
23
+ * GATEFORGE_RUN_ID, GATEFORGE_RUN_TOKEN (required; CLI contract)
24
+ * GATEFORGE_PROXY_TARGET, GATEFORGE_MOUNT_PATH (observation proxy)
25
+ * GATEFORGE_STATE_DIR (manifest append at shutdown)
26
+ * GATEFORGE_ADAPTERS_DIR (default .gateforge/adapters)
27
+ * GATEFORGE_CLASSIFICATIONS (classifications YAML path)
28
+ * GATEFORGE_TARGET_BASE_URL (attestation subject, GF-10)
29
+ * GATEFORGE_TARGET_FINGERPRINT (expected marker, GF-13)
30
+ * GATEFORGE_ADAPTER_BASE_URL (default adapter read base)
31
+ * GATEFORGE_FIXTURE_PROVIDER (approved fixture provider)
32
+ * GATEFORGE_WITNESS_VERIFIER_KEY (attestation verifier key)
33
+ *
34
+ * SECRETS NEVER TRAVEL ON ARGV (a process's cmdline is world-readable
35
+ * via /proc — the same rule `gateforge test-gates` applies): the run
36
+ * id/token are env-only (set by 'gateforge test-gates'), and the
37
+ * verifier key is read from GATEFORGE_WITNESS_VERIFIER_KEY only. With a
38
+ * verifier key the witness serves the MAC-attested ledger surface;
39
+ * without one it stays unauthenticated and downstream evaluation fails
40
+ * closed.
41
+ *
42
+ * The wrapper prints `GATEFORGE_WITNESS_URL=<url>` once listening — and
43
+ * `GATEFORGE_WITNESS_PROXY_URL=<url>` when an observation proxy is
44
+ * active; the process serves until SIGTERM/SIGINT.
45
+ */
46
+ import { startWitness, WitnessStartupError } from './server.js';
47
+ import { loadFixtureProvider } from './fixture-provider.js';
48
+ import { openConfiguredQueueChannel } from '../queue/observer.js';
49
+ import { parseChaosOptions } from './chaos.js';
50
+ import { parseTwinShapePlan } from './twin-shapes.js';
51
+ import { ENV_ADAPTER_BASE_URL, ENV_ADAPTERS_DIR, ENV_CHAOS_MAX_DELAY_MS, ENV_CHAOS_REORDER, ENV_CHAOS_SEED, ENV_CLASSIFICATIONS, ENV_FIXTURE_PROVIDER, ENV_MOUNT_PATH, ENV_PROXY_TARGET, ENV_RUN_ID, ENV_RUN_TOKEN, ENV_STATE_DIR, ENV_TARGET_BASE_URL, ENV_TARGET_FINGERPRINT, ENV_TWIN_INVENTORY, ENV_TWIN_QUERY_KEYS, ENV_TWIN_SHAPES, ENV_WITNESS_VERIFIER_KEY, } from '../constants.js';
52
+ import { createRequire } from 'node:module';
53
+ /** One-line usage (the header comment above is the long form). */
54
+ export const WITNESS_BIN_USAGE = 'usage: gateforge-witness [--proxy-target <url>] [--mount-path <prefix>] ' +
55
+ '[--state-dir <dir>] [--classifications <path>] [--adapters-dir <dir>] ' +
56
+ '[--target-base-url <url>] [--target-fingerprint <marker>] [--adapter-base-url <url>] ' +
57
+ '(run id/token via GATEFORGE_RUN_ID/GATEFORGE_RUN_TOKEN; verifier key via ' +
58
+ 'GATEFORGE_WITNESS_VERIFIER_KEY)';
59
+ /** Flags this bin accepts (values; `--help` is handled separately). */
60
+ const VALUE_FLAGS = new Set([
61
+ 'proxy-target',
62
+ 'mount-path',
63
+ 'state-dir',
64
+ 'classifications',
65
+ 'adapters-dir',
66
+ 'target-base-url',
67
+ 'target-fingerprint',
68
+ 'adapter-base-url',
69
+ 'adapter-read-authorization',
70
+ ]);
71
+ /**
72
+ * Parses the bin argv (`--flag value` and `--flag=value` shapes).
73
+ * Unknown flags and missing values fail closed with the usage line —
74
+ * a mis-wired harness must never silently start a half-configured
75
+ * witness.
76
+ *
77
+ * Args:
78
+ * argv: arguments after node/script.
79
+ *
80
+ * Returns:
81
+ * WitnessBinFlags: parsed flag values.
82
+ *
83
+ * Throws:
84
+ * WitnessStartupError: on any malformed argv.
85
+ */
86
+ function parseFlags(argv) {
87
+ const values = new Map();
88
+ for (let index = 0; index < argv.length; index += 1) {
89
+ const token = argv[index] ?? '';
90
+ if (!token.startsWith('--')) {
91
+ throw new WitnessStartupError(`unexpected argument '${token}'\n${WITNESS_BIN_USAGE}`);
92
+ }
93
+ const body = token.slice(2);
94
+ const eq = body.indexOf('=');
95
+ const name = eq >= 0 ? body.slice(0, eq) : body;
96
+ if (name.length === 0) {
97
+ throw new WitnessStartupError(`invalid flag '${token}'\n${WITNESS_BIN_USAGE}`);
98
+ }
99
+ if (name === 'help') {
100
+ continue; // handled by the caller before parsing matters
101
+ }
102
+ if (!VALUE_FLAGS.has(name)) {
103
+ throw new WitnessStartupError(`unknown flag '--${name}'\n${WITNESS_BIN_USAGE}`);
104
+ }
105
+ let value = eq >= 0 ? body.slice(eq + 1) : undefined;
106
+ if (value === undefined) {
107
+ const next = argv[index + 1];
108
+ if (next === undefined || next.startsWith('--')) {
109
+ throw new WitnessStartupError(`flag '--${name}' requires a value\n${WITNESS_BIN_USAGE}`);
110
+ }
111
+ value = next;
112
+ index += 1;
113
+ }
114
+ if (values.has(name)) {
115
+ throw new WitnessStartupError(`flag '--${name}' may only be given once\n${WITNESS_BIN_USAGE}`);
116
+ }
117
+ values.set(name, value);
118
+ }
119
+ return { values };
120
+ }
121
+ /** Flag value or its env fallback (undefined when neither is set). */
122
+ function flagOrEnv(flags, name, envValue) {
123
+ const fromFlags = flags.values.get(name);
124
+ if (fromFlags !== undefined && fromFlags !== '')
125
+ return fromFlags;
126
+ if (envValue !== undefined && envValue !== '')
127
+ return envValue;
128
+ return undefined;
129
+ }
130
+ /**
131
+ * The twin shape plan, or a fail-closed startup error.
132
+ *
133
+ * A malformed switch or an empty allowlist entry is the owner's
134
+ * configuration speaking nonsense; starting anyway would produce a
135
+ * run whose findings quietly mean something else.
136
+ */
137
+ function parseTwinShapePlanOrFail(input) {
138
+ try {
139
+ return parseTwinShapePlan(input);
140
+ }
141
+ catch (error) {
142
+ throw new WitnessStartupError(error.message);
143
+ }
144
+ }
145
+ /**
146
+ * Reads env + argv and starts the witness.
147
+ *
148
+ * Args:
149
+ * argv: CLI flags (see the module header; `--help` prints usage and
150
+ * returns a never-started handle).
151
+ * env: process environment.
152
+ *
153
+ * Returns:
154
+ * WitnessHandle once listening (or a handle with an empty `url` for
155
+ * `--help`; the wrapper skips its URL banner in that case).
156
+ *
157
+ * Throws:
158
+ * WitnessStartupError / AttestationError / AdapterRegistryError:
159
+ * fail-closed startup problems (exit 2 via the wrapper).
160
+ */
161
+ export async function main(argv, env) {
162
+ if (argv.includes('--help') || argv.includes('-h')) {
163
+ process.stdout.write(`${WITNESS_BIN_USAGE}\n`);
164
+ return Object.freeze({ url: '', proxyUrl: null, stop: async () => { } });
165
+ }
166
+ const flags = parseFlags(argv);
167
+ const runId = env[ENV_RUN_ID];
168
+ const token = env[ENV_RUN_TOKEN];
169
+ if (runId === undefined || runId === '') {
170
+ throw new WitnessStartupError(`${ENV_RUN_ID} is required (set by 'gateforge test-gates')`);
171
+ }
172
+ if (token === undefined || token === '') {
173
+ throw new WitnessStartupError(`${ENV_RUN_TOKEN} is required (set by 'gateforge test-gates')`);
174
+ }
175
+ // Environment-only, deliberately absent from argv (world-readable
176
+ // /proc cmdline): the suite must never see the verifier key either way.
177
+ const verifierKey = env[ENV_WITNESS_VERIFIER_KEY] ?? null;
178
+ return startWitness({
179
+ runId,
180
+ token,
181
+ proxyTarget: flagOrEnv(flags, 'proxy-target', env[ENV_PROXY_TARGET]),
182
+ // Timing chaos (E63): the seeded release plan for proxied
183
+ // responses. Environment-only (like the verifier key), absent in
184
+ // every run that did not ask for chaos, and parsed fail-closed: a
185
+ // seed the witness cannot read would produce a schedule the owner
186
+ // could never replay.
187
+ chaos: parseChaosOptions({
188
+ seed: env[ENV_CHAOS_SEED],
189
+ maxDelayMs: env[ENV_CHAOS_MAX_DELAY_MS],
190
+ reorder: env[ENV_CHAOS_REORDER],
191
+ }),
192
+ // Twin path coverage (E64): the observation-only shape recording,
193
+ // the owner's query-key allowlist, and the raw twins the supervisor
194
+ // marked observation-only. Environment-only and absent by default,
195
+ // so a run without `enforcement.twinPaths` is byte-identical; a
196
+ // malformed switch or allowlist is a startup error the owner must
197
+ // see rather than a silently key-only run.
198
+ twinShapes: parseTwinShapePlanOrFail({
199
+ shapes: env[ENV_TWIN_SHAPES],
200
+ queryKeys: env[ENV_TWIN_QUERY_KEYS],
201
+ inventoryPath: env[ENV_TWIN_INVENTORY],
202
+ }),
203
+ mountPath: flagOrEnv(flags, 'mount-path', env[ENV_MOUNT_PATH]),
204
+ stateDir: flagOrEnv(flags, 'state-dir', env[ENV_STATE_DIR]),
205
+ classificationsPath: flagOrEnv(flags, 'classifications', env[ENV_CLASSIFICATIONS]),
206
+ adaptersDir: flagOrEnv(flags, 'adapters-dir', env[ENV_ADAPTERS_DIR] ?? '.gateforge/adapters'),
207
+ targetBaseUrl: flagOrEnv(flags, 'target-base-url', env[ENV_TARGET_BASE_URL]),
208
+ targetFingerprint: flagOrEnv(flags, 'target-fingerprint', env[ENV_TARGET_FINGERPRINT]),
209
+ adapterBaseUrl: flagOrEnv(flags, 'adapter-base-url', env[ENV_ADAPTER_BASE_URL]),
210
+ adapterReadAuthorization: flagOrEnv(flags, 'adapter-read-authorization', env['GATEFORGE_ADAPTER_READ_AUTHORIZATION']) ?? null,
211
+ // Strong behavior cases mint their fixtures and actor credentials
212
+ // through the operator's approved provider, engine-side. Without one
213
+ // the witness still starts and every other surface works; the cases
214
+ // then block with a typed cause (never a suite-supplied fallback).
215
+ fixtureProvider: await loadFixtureProvider(env[ENV_FIXTURE_PROVIDER] ?? null),
216
+ // Engine-owned queue observer: the
217
+ // witness reads the delivery queue itself. Absent (no `queueObserver`
218
+ // block in .gateforge.yml) leaves the channel null and every
219
+ // `engine-task` case blocks fail-closed.
220
+ queueChannel: await openConfiguredQueueChannel(env),
221
+ verifierKey,
222
+ engineBrowserLauncher: resolveEngineBrowserLauncher(),
223
+ });
224
+ }
225
+ /**
226
+ * Resolves the engine-browser launcher for a SPAWNED witness.
227
+ *
228
+ * The library surface is runner-neutral: `startWitness` takes a
229
+ * launcher and never assumes one. This is the process entry point, and
230
+ * a `gateforge-witness` process started by a Playwright user's
231
+ * `test-gates` must launch that user's pinned Chromium exactly as
232
+ * before — the ENGINE-BROWSER proof channel is a Playwright journey,
233
+ * and losing it would be a silent downgrade of what a run can prove.
234
+ *
235
+ * The resolution is the same CONSUMER-FIRST one the supervised run uses
236
+ * for the Playwright CLI: the consumer's own installed `playwright`,
237
+ * not the engine's. When no Playwright is resolvable the witness still
238
+ * starts and serves every other surface; an engine-browser action then
239
+ * fails closed with a typed cause instead of a crash.
240
+ *
241
+ * Returns:
242
+ * EngineBrowserLauncher | undefined: the launcher, or undefined when
243
+ * no Playwright is resolvable on the module path.
244
+ */
245
+ function resolveEngineBrowserLauncher() {
246
+ try {
247
+ const consumerRequire = createRequire(import.meta.url);
248
+ return consumerRequire('playwright').chromium;
249
+ }
250
+ catch {
251
+ return undefined;
252
+ }
253
+ }
254
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/witness/bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * The engine-owned browser (plan Phase 1 item 4): Chromium contexts the
3
+ * WITNESS process creates and drives itself — one isolated context per
4
+ * supervisor-opened test session, closed when the session seals.
5
+ *
6
+ * Test code NEVER touches these pages: the worker holds no handle, no
7
+ * URL, and no capability over them. The engine executes the constrained
8
+ * surface operations (create/read/update/archive) with the
9
+ * consumer-declared locators, and observes each step itself:
10
+ * - the rendered control it clicked and the values it typed;
11
+ * - the actual application request the action caused (captured from the
12
+ * engine page's own network, app-origin only);
13
+ * - the resulting navigation and the rendered row/form it read back.
14
+ *
15
+ * Forgery resistance (why this channel is proof):
16
+ * - fabricated DOM (`page.evaluate` in the worker page) is irrelevant:
17
+ * the engine reads its OWN page;
18
+ * - mocked responses (`page.route` in the worker) are irrelevant: the
19
+ * worker cannot route the engine's traffic;
20
+ * - direct API/Node mutations bypass the engine page entirely: no
21
+ * engine action runs, so no engine-observed action/visible records
22
+ * exist for them — invented suite-submitted records never satisfy;
23
+ * - HTTP-200-while-error: the engine asserts the rendered status
24
+ * itself (created/archived values) AND captures the app response
25
+ * status — a displayed error fails the action fail-closed.
26
+ *
27
+ * Surface selectors are LOCATORS, never proof: a lying descriptor only
28
+ * makes the engine fail to find elements (fail closed).
29
+ */
30
+ import type { Browser, Page } from 'playwright';
31
+ import { type SurfaceDescriptor, type SurfaceStep } from '../surface.js';
32
+ /** The UI operations the engine can perform (constrained subset). */
33
+ export type EngineOperation = 'create' | 'read' | 'update' | 'delete';
34
+ /** One app-origin exchange the engine captured during an action. */
35
+ export interface EngineCapturedExchange {
36
+ /** Uppercase method (GET, POST, ...). */
37
+ method: string;
38
+ /** Canonical observed path (query/fragment stripped). */
39
+ path: string;
40
+ /** Response status the app answered. */
41
+ status: number;
42
+ /** Response body bytes (bounded snapshot for hashing). */
43
+ body: Buffer;
44
+ }
45
+ /** What the engine observed performing one action. */
46
+ export interface EngineActionObservation {
47
+ /** Entity id OBSERVED from the rendered list (never declared). */
48
+ entityId: string;
49
+ /** The exact input values the engine typed (exact-value echo source). */
50
+ enteredFields: Record<string, string>;
51
+ /** The rendered fields the engine read back after the action. */
52
+ renderedFields: Record<string, string>;
53
+ /** App-origin exchanges captured inside the action window. */
54
+ exchanges: EngineCapturedExchange[];
55
+ /** Engine-side pre-observation marker (filled by the witness layer). */
56
+ preObservationId?: string;
57
+ }
58
+ /** Fail-closed engine browser error (surfaced as 409/503 downstream). */
59
+ export declare class EngineBrowserError extends Error {
60
+ constructor(message: string);
61
+ }
62
+ /** The browser launcher the engine drives (default: pinned Chromium). */
63
+ export interface EngineBrowserLauncher {
64
+ launch(options?: Record<string, unknown>): Promise<Browser>;
65
+ }
66
+ /**
67
+ * The minimal page surface the wizard step driver needs. A real
68
+ * Playwright Page satisfies it structurally, and stub pages in tests
69
+ * implement exactly this — no browser required to prove the walk.
70
+ */
71
+ export interface StepPage {
72
+ goto(url: string, options?: {
73
+ timeout?: number;
74
+ }): Promise<unknown>;
75
+ waitForSelector(selector: string, options?: {
76
+ timeout?: number;
77
+ }): Promise<unknown>;
78
+ locator(selector: string): {
79
+ click(options?: {
80
+ timeout?: number;
81
+ }): Promise<void>;
82
+ fill(value: string, options?: {
83
+ timeout?: number;
84
+ }): Promise<void>;
85
+ check(options?: {
86
+ timeout?: number;
87
+ }): Promise<void>;
88
+ };
89
+ keyboard: {
90
+ press(key: string): Promise<void>;
91
+ };
92
+ }
93
+ /**
94
+ * Walks one validated wizard step list on the engine-owned page
95
+ * (surface v2 create). Every interaction runs here, engine-side: the
96
+ * test supplies intent (field values) only. A step referencing an
97
+ * input field the journey did not provide fails closed — the engine
98
+ * never invents values. Unknown shapes are unreachable post-
99
+ * validation, but still refused defensively (never silently skipped).
100
+ *
101
+ * Args:
102
+ * page: the engine-owned page (real or structural stub).
103
+ * appBase: the trusted attested subject origin (never suite input).
104
+ * steps: the validated wizard walk, in order.
105
+ * fields: the journey's declared input values, keyed by field name.
106
+ */
107
+ export declare function driveCreateSteps(page: StepPage, appBase: string, steps: readonly SurfaceStep[], fields: Record<string, string>): Promise<void>;
108
+ /**
109
+ * Owns the engine Chromium instance and its per-session contexts.
110
+ *
111
+ * Args:
112
+ * launcher: browser launcher (default: the pinned Chromium). Tests
113
+ * inject a failing launcher to prove the fail-closed path; the
114
+ * driving and observation below stay engine code regardless of
115
+ * which executable launches.
116
+ */
117
+ export declare class EngineBrowserManager {
118
+ private readonly launcher;
119
+ private browser;
120
+ private launching;
121
+ private readonly sessions;
122
+ /**
123
+ * Pinned `--host-resolver-rules` value binding every attested hostname
124
+ * to its startup-approved loopback IPs. Set once at witness startup
125
+ * (before any launch); the browser is then incapable of resolving
126
+ * those names anywhere but loopback, regardless of later DNS changes.
127
+ */
128
+ private dnsPinRules;
129
+ /**
130
+ * @param launcher - the browser launcher to use. REQUIRED: this
131
+ * package is runner-neutral and must not assume a browser. The
132
+ * Playwright-defaulting subclass lives in
133
+ * `@gate-forge/pack-playwright`.
134
+ */
135
+ constructor(launcher: EngineBrowserLauncher);
136
+ /**
137
+ * Installs the DNS pin rules for the next (first) launch.
138
+ *
139
+ * Args:
140
+ * rules: the `--host-resolver-rules` value, or null when nothing is
141
+ * pinned (plain launch, previous behavior).
142
+ *
143
+ * Throws:
144
+ * EngineBrowserError: when the browser already launched — pins must
145
+ * precede every navigation (fail closed, never silently unbound).
146
+ */
147
+ setDnsPinRules(rules: string | null): void;
148
+ /**
149
+ * Returns the engine page for one session, creating the isolated
150
+ * context on first use.
151
+ *
152
+ * Args:
153
+ * sessionId: the supervisor-opened session the context belongs to.
154
+ *
155
+ * Returns:
156
+ * Promise<Page>: the session's engine-owned page.
157
+ *
158
+ * Throws:
159
+ * EngineBrowserError: when Chromium cannot launch (fail closed —
160
+ * the capability is honestly unavailable at runtime).
161
+ */
162
+ pageFor(sessionId: string): Promise<Page>;
163
+ /**
164
+ * Closes and forgets one session's engine context (session seal).
165
+ * Late engine calls for the session then recreate nothing — callers
166
+ * must refuse sealed sessions before driving (they do: every browser
167
+ * endpoint requires an OPEN session first).
168
+ *
169
+ * Args:
170
+ * sessionId: the sealed session.
171
+ */
172
+ closeSession(sessionId: string): Promise<void>;
173
+ /** Closes every engine context and the browser (witness stop). */
174
+ closeAll(): Promise<void>;
175
+ /** Lazy Chromium launch (single flight; fail closed with the cause). */
176
+ private ensureBrowser;
177
+ }
178
+ /**
179
+ * Drives one constrained surface operation on the engine page and
180
+ * observes every step itself.
181
+ *
182
+ * Args:
183
+ * page: the session's engine-owned page.
184
+ * appBase: loopback app base the engine navigates (validated upstream).
185
+ * surface: the validated consumer descriptor (locators only).
186
+ * operation: the constrained operation to perform.
187
+ * input: entered fields (create/update) and/or the target entity id.
188
+ *
189
+ * Returns:
190
+ * Promise<EngineActionObservation>: the engine's own observation —
191
+ * observed entity id, entered + rendered fields, captured exchanges.
192
+ *
193
+ * Throws:
194
+ * EngineBrowserError: fail-closed on every untrusted outcome —
195
+ * missing rows, ambiguous creation, wrong rendered status, no
196
+ * application request, or an application error status.
197
+ */
198
+ export declare function driveEngineAction(page: Page, appBase: string, surface: SurfaceDescriptor, operation: EngineOperation, input: {
199
+ fields?: Record<string, string>;
200
+ entityId?: string;
201
+ }): Promise<EngineActionObservation>;
202
+ /**
203
+ * Re-reads the rendered result for one entity on the engine page
204
+ * (the `visible.confirm` counterpart): row read for mutations, form
205
+ * read for reads.
206
+ *
207
+ * Args:
208
+ * page: the session's engine-owned page.
209
+ * appBase: loopback app base.
210
+ * surface: the validated consumer descriptor.
211
+ * operation: the original action (decides row vs form readback).
212
+ * entityId: the engine-observed entity id.
213
+ *
214
+ * Returns:
215
+ * Promise<Record<string, string>>: the rendered fields.
216
+ *
217
+ * Throws:
218
+ * EngineBrowserError: when the UI no longer exposes the entity.
219
+ */
220
+ export declare function readEngineVisible(page: Page, appBase: string, surface: SurfaceDescriptor, operation: EngineOperation, entityId: string): Promise<Record<string, string>>;
221
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/witness/browser.ts"],"names":[],"mappings":"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"}