@gate-forge/pack-playwright 0.7.1 → 0.8.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 (202) hide show
  1. package/README.md +31 -0
  2. package/dist/constants.d.ts +13 -140
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +13 -148
  5. package/dist/constants.js.map +1 -1
  6. package/dist/cypress/plugin.d.ts +53 -0
  7. package/dist/cypress/plugin.d.ts.map +1 -0
  8. package/dist/cypress/plugin.js +369 -0
  9. package/dist/cypress/plugin.js.map +1 -0
  10. package/dist/cypress/spec-scan.d.ts +39 -0
  11. package/dist/cypress/spec-scan.d.ts.map +1 -0
  12. package/dist/cypress/spec-scan.js +301 -0
  13. package/dist/cypress/spec-scan.js.map +1 -0
  14. package/dist/diagnosis.d.ts +39 -0
  15. package/dist/diagnosis.d.ts.map +1 -0
  16. package/dist/diagnosis.js +63 -0
  17. package/dist/diagnosis.js.map +1 -0
  18. package/dist/discovery/adapter-projection.d.ts +13 -0
  19. package/dist/discovery/adapter-projection.d.ts.map +1 -0
  20. package/dist/discovery/adapter-projection.js +84 -0
  21. package/dist/discovery/adapter-projection.js.map +1 -0
  22. package/dist/discovery/config-locations.d.ts +5 -0
  23. package/dist/discovery/config-locations.d.ts.map +1 -0
  24. package/dist/discovery/config-locations.js +19 -0
  25. package/dist/discovery/config-locations.js.map +1 -0
  26. package/dist/discovery/cypress-runner-adapter.d.ts +112 -0
  27. package/dist/discovery/cypress-runner-adapter.d.ts.map +1 -0
  28. package/dist/discovery/cypress-runner-adapter.js +501 -0
  29. package/dist/discovery/cypress-runner-adapter.js.map +1 -0
  30. package/dist/discovery/discover.d.ts +53 -1
  31. package/dist/discovery/discover.d.ts.map +1 -1
  32. package/dist/discovery/discover.js +100 -3
  33. package/dist/discovery/discover.js.map +1 -1
  34. package/dist/discovery/git-ignore.d.ts +13 -0
  35. package/dist/discovery/git-ignore.d.ts.map +1 -0
  36. package/dist/discovery/git-ignore.js +62 -0
  37. package/dist/discovery/git-ignore.js.map +1 -0
  38. package/dist/discovery/index.d.ts +9 -0
  39. package/dist/discovery/index.d.ts.map +1 -1
  40. package/dist/discovery/index.js +9 -0
  41. package/dist/discovery/index.js.map +1 -1
  42. package/dist/discovery/playwright-runner-adapter.d.ts +108 -0
  43. package/dist/discovery/playwright-runner-adapter.d.ts.map +1 -0
  44. package/dist/discovery/playwright-runner-adapter.js +185 -0
  45. package/dist/discovery/playwright-runner-adapter.js.map +1 -0
  46. package/dist/discovery/prepare-barrier.d.ts +522 -0
  47. package/dist/discovery/prepare-barrier.d.ts.map +1 -0
  48. package/dist/discovery/prepare-barrier.js +739 -0
  49. package/dist/discovery/prepare-barrier.js.map +1 -0
  50. package/dist/discovery/pytest-adapter.d.ts.map +1 -1
  51. package/dist/discovery/pytest-adapter.js +6 -2
  52. package/dist/discovery/pytest-adapter.js.map +1 -1
  53. package/dist/discovery/pytest-runner-adapter.d.ts +124 -0
  54. package/dist/discovery/pytest-runner-adapter.d.ts.map +1 -0
  55. package/dist/discovery/pytest-runner-adapter.js +454 -0
  56. package/dist/discovery/pytest-runner-adapter.js.map +1 -0
  57. package/dist/discovery/reconcile.d.ts +80 -11
  58. package/dist/discovery/reconcile.d.ts.map +1 -1
  59. package/dist/discovery/reconcile.js +395 -78
  60. package/dist/discovery/reconcile.js.map +1 -1
  61. package/dist/discovery/runner-env.d.ts +88 -2
  62. package/dist/discovery/runner-env.d.ts.map +1 -1
  63. package/dist/discovery/runner-env.js +142 -4
  64. package/dist/discovery/runner-env.js.map +1 -1
  65. package/dist/discovery/static-discovery.d.ts +38 -3
  66. package/dist/discovery/static-discovery.d.ts.map +1 -1
  67. package/dist/discovery/static-discovery.js +454 -15
  68. package/dist/discovery/static-discovery.js.map +1 -1
  69. package/dist/discovery/supervised-run.d.ts +199 -10
  70. package/dist/discovery/supervised-run.d.ts.map +1 -1
  71. package/dist/discovery/supervised-run.js +350 -39
  72. package/dist/discovery/supervised-run.js.map +1 -1
  73. package/dist/discovery/trusted-config.d.ts +180 -6
  74. package/dist/discovery/trusted-config.d.ts.map +1 -1
  75. package/dist/discovery/trusted-config.js +279 -10
  76. package/dist/discovery/trusted-config.js.map +1 -1
  77. package/dist/discovery/vitest-runner-adapter.d.ts +172 -0
  78. package/dist/discovery/vitest-runner-adapter.d.ts.map +1 -0
  79. package/dist/discovery/vitest-runner-adapter.js +607 -0
  80. package/dist/discovery/vitest-runner-adapter.js.map +1 -0
  81. package/dist/fixture/consumer-runner.d.ts +4 -0
  82. package/dist/fixture/consumer-runner.d.ts.map +1 -0
  83. package/dist/fixture/consumer-runner.js +38 -0
  84. package/dist/fixture/consumer-runner.js.map +1 -0
  85. package/dist/fixture/evidence.d.ts +27 -0
  86. package/dist/fixture/evidence.d.ts.map +1 -1
  87. package/dist/fixture/evidence.js +12 -0
  88. package/dist/fixture/evidence.js.map +1 -1
  89. package/dist/fixture/fixture.d.ts +2 -1
  90. package/dist/fixture/fixture.d.ts.map +1 -1
  91. package/dist/fixture/fixture.js +1 -17
  92. package/dist/fixture/fixture.js.map +1 -1
  93. package/dist/fixture/witness-client.d.ts +6 -174
  94. package/dist/fixture/witness-client.d.ts.map +1 -1
  95. package/dist/fixture/witness-client.js +6 -267
  96. package/dist/fixture/witness-client.js.map +1 -1
  97. package/dist/index.d.ts +9 -6
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +5 -4
  100. package/dist/index.js.map +1 -1
  101. package/dist/json.d.ts +6 -12
  102. package/dist/json.d.ts.map +1 -1
  103. package/dist/json.js +6 -17
  104. package/dist/json.js.map +1 -1
  105. package/dist/reporter/project-graph-reporter.d.ts +92 -0
  106. package/dist/reporter/project-graph-reporter.d.ts.map +1 -0
  107. package/dist/reporter/project-graph-reporter.js +92 -0
  108. package/dist/reporter/project-graph-reporter.js.map +1 -0
  109. package/dist/reporter/reporter.cjs.map +1 -1
  110. package/dist/reporter/reporter.d.ts +93 -4
  111. package/dist/reporter/reporter.d.ts.map +1 -1
  112. package/dist/reporter/reporter.js +174 -18
  113. package/dist/reporter/reporter.js.map +1 -1
  114. package/dist/runner-claims.d.ts +13 -0
  115. package/dist/runner-claims.d.ts.map +1 -0
  116. package/dist/runner-claims.js +46 -0
  117. package/dist/runner-claims.js.map +1 -0
  118. package/dist/runner-resolution.d.ts +3 -0
  119. package/dist/runner-resolution.d.ts.map +1 -0
  120. package/dist/runner-resolution.js +14 -0
  121. package/dist/runner-resolution.js.map +1 -0
  122. package/dist/supervisor/client.d.ts +23 -1
  123. package/dist/supervisor/client.d.ts.map +1 -1
  124. package/dist/supervisor/client.js +49 -0
  125. package/dist/supervisor/client.js.map +1 -1
  126. package/dist/supervisor/drain.d.ts +65 -0
  127. package/dist/supervisor/drain.d.ts.map +1 -1
  128. package/dist/supervisor/drain.js +353 -9
  129. package/dist/supervisor/drain.js.map +1 -1
  130. package/dist/supervisor/index.d.ts +7 -3
  131. package/dist/supervisor/index.d.ts.map +1 -1
  132. package/dist/supervisor/index.js +7 -3
  133. package/dist/supervisor/index.js.map +1 -1
  134. package/dist/supervisor/spool.d.ts +65 -2
  135. package/dist/supervisor/spool.d.ts.map +1 -1
  136. package/dist/supervisor/spool.js +47 -0
  137. package/dist/supervisor/spool.js.map +1 -1
  138. package/dist/surface.d.ts +6 -207
  139. package/dist/surface.d.ts.map +1 -1
  140. package/dist/surface.js +6 -264
  141. package/dist/surface.js.map +1 -1
  142. package/dist/vitest/index.d.ts +23 -0
  143. package/dist/vitest/index.d.ts.map +1 -0
  144. package/dist/vitest/index.js +356 -0
  145. package/dist/vitest/index.js.map +1 -0
  146. package/dist/vitest/reporter.d.ts +83 -0
  147. package/dist/vitest/reporter.d.ts.map +1 -0
  148. package/dist/vitest/reporter.js +211 -0
  149. package/dist/vitest/reporter.js.map +1 -0
  150. package/dist/vitest/worker-slot.d.ts +36 -0
  151. package/dist/vitest/worker-slot.d.ts.map +1 -0
  152. package/dist/vitest/worker-slot.js +51 -0
  153. package/dist/vitest/worker-slot.js.map +1 -0
  154. package/dist/witness/adapter-registry.d.ts +6 -50
  155. package/dist/witness/adapter-registry.d.ts.map +1 -1
  156. package/dist/witness/adapter-registry.js +6 -257
  157. package/dist/witness/adapter-registry.js.map +1 -1
  158. package/dist/witness/behavior-request.d.ts +6 -76
  159. package/dist/witness/behavior-request.d.ts.map +1 -1
  160. package/dist/witness/behavior-request.js +6 -273
  161. package/dist/witness/behavior-request.js.map +1 -1
  162. package/dist/witness/behavior.d.ts +6 -48
  163. package/dist/witness/behavior.d.ts.map +1 -1
  164. package/dist/witness/behavior.js +6 -114
  165. package/dist/witness/behavior.js.map +1 -1
  166. package/dist/witness/bin.d.ts +6 -17
  167. package/dist/witness/bin.d.ts.map +1 -1
  168. package/dist/witness/bin.js +6 -168
  169. package/dist/witness/bin.js.map +1 -1
  170. package/dist/witness/browser.d.ts +14 -206
  171. package/dist/witness/browser.d.ts.map +1 -1
  172. package/dist/witness/browser.js +15 -654
  173. package/dist/witness/browser.js.map +1 -1
  174. package/dist/witness/classifications.d.ts +6 -38
  175. package/dist/witness/classifications.d.ts.map +1 -1
  176. package/dist/witness/classifications.js +6 -83
  177. package/dist/witness/classifications.js.map +1 -1
  178. package/dist/witness/env-attestation.d.ts +6 -94
  179. package/dist/witness/env-attestation.d.ts.map +1 -1
  180. package/dist/witness/env-attestation.js +6 -198
  181. package/dist/witness/env-attestation.js.map +1 -1
  182. package/dist/witness/fixture-provider.d.ts +6 -82
  183. package/dist/witness/fixture-provider.d.ts.map +1 -1
  184. package/dist/witness/fixture-provider.js +6 -105
  185. package/dist/witness/fixture-provider.js.map +1 -1
  186. package/dist/witness/loopback-pins.d.ts +6 -75
  187. package/dist/witness/loopback-pins.d.ts.map +1 -1
  188. package/dist/witness/loopback-pins.js +6 -240
  189. package/dist/witness/loopback-pins.js.map +1 -1
  190. package/dist/witness/server.d.ts +8 -26
  191. package/dist/witness/server.d.ts.map +1 -1
  192. package/dist/witness/server.js +24 -3761
  193. package/dist/witness/server.js.map +1 -1
  194. package/dist/witness/types.d.ts +6 -882
  195. package/dist/witness/types.d.ts.map +1 -1
  196. package/dist/witness/types.js +9 -1
  197. package/dist/witness/types.js.map +1 -1
  198. package/examples/overlay-proof.spec.js +75 -0
  199. package/package.json +8 -2
  200. package/python/__pycache__/gateforge_persistence_intents.cpython-312.pyc +0 -0
  201. package/python/__pycache__/gateforge_persistence_intents.cpython-314.pyc +0 -0
  202. package/python/gateforge_pytest_plugin.py +462 -0
@@ -1,109 +1,10 @@
1
1
  /**
2
- * Trusted fixture/actor provider (plan 2026-09-19 §4.5): the ONLY source
3
- * of fixture namespaces, authoritative subject identities, and actor
4
- * credentials for strong behavior cases. Loaded ONLY from the approved
5
- * engine-owned bundle — never from suite-supplied callbacks, never from
6
- * `AdapterContext.get` or `probeServer`.
2
+ * Compatibility re-export: `witness/fixture-provider` now lives in the runner-neutral
3
+ * `@gate-forge/witness` package (plan 2026-09-25 phase 1).
7
4
  *
8
- * - `prepare` mints a fresh isolated lease per case (unique namespace);
9
- * sequence steps share only their own case lease.
10
- * - Actor material resolves privately inside the controller/engine
11
- * request driver. Cookie/header bytes never appear in suite-visible
12
- * results, signed public reports, argv, or logs — the lease carries a
13
- * `credentialRef` (an engine-side handle), never token bytes.
14
- * - `release` cleans the lease namespace; cleanup runs on errors without
15
- * flipping the case verdict to success.
5
+ * The move is physical, not behavioural: this module forwards every
6
+ * export unchanged so `@gate-forge/pack-playwright`'s published import
7
+ * paths — which consumers pin — keep resolving to the same values.
16
8
  */
17
- import { randomUUID } from 'node:crypto';
18
- import { existsSync } from 'node:fs';
19
- import { join } from 'node:path';
20
- import { pathToFileURL } from 'node:url';
21
- /**
22
- * Loads the approved fixture provider from the engine-owned bundle
23
- * directory (a `fixture-provider.mjs` default export implementing the
24
- * interface). Returns null when the bundle provides none — strong cases
25
- * then block with a missing-provider cause instead of falling back to
26
- * suite-supplied fixtures.
27
- *
28
- * Args:
29
- * bundleDir: absolute engine-owned bundle directory, or null.
30
- *
31
- * Returns:
32
- * Promise<FixtureProvider | null>: the approved provider or null.
33
- *
34
- * Throws:
35
- * Error: when the module exists but does not implement the interface
36
- * (fail closed — a half-shaped provider is never used).
37
- */
38
- export async function loadFixtureProvider(bundleDir) {
39
- if (bundleDir === null)
40
- return null;
41
- const entry = join(bundleDir, 'fixture-provider.mjs');
42
- if (!existsSync(entry))
43
- return null;
44
- const module = (await import(pathToFileURL(entry).href));
45
- const provider = module.default;
46
- if (provider === undefined ||
47
- typeof provider.prepare !== 'function' ||
48
- typeof provider.release !== 'function') {
49
- throw new Error('approved fixture provider is malformed: default export must implement {prepare, release} (fail closed)');
50
- }
51
- return provider;
52
- }
53
- /** In-memory provider for witness tests (engine-side only, never a worker API). */
54
- export function createMemoryFixtureProvider(options = {}) {
55
- const live = new Map();
56
- let counter = 0;
57
- const actors = options.actors ?? {};
58
- const credentials = options.credentials ?? {};
59
- const subjects = options.subjects ?? {};
60
- const credentialFor = (credentialRef) => {
61
- const match = /^credref:([^:]+):(.+)$/.exec(credentialRef);
62
- if (match === null)
63
- return null;
64
- const profile = match[2];
65
- if (!live.has(match[1]))
66
- return null;
67
- const headers = credentials[profile];
68
- if (headers === undefined)
69
- return null;
70
- return { headers: { ...headers } };
71
- };
72
- return {
73
- prepare(input) {
74
- counter += 1;
75
- const leaseId = randomUUID();
76
- const namespace = `fixture-${input.runId}-${input.caseId}-${String(counter)}`
77
- .toLowerCase()
78
- .replace(/[^a-z0-9-]/g, '-');
79
- const leasedActors = {};
80
- for (const [name, template] of Object.entries(actors)) {
81
- leasedActors[name] = {
82
- principalId: template.principalId,
83
- tenantId: template.tenantId,
84
- roles: [...template.roles],
85
- credentialRef: `credref:${leaseId}:${name}`,
86
- };
87
- }
88
- const recipeSubjects = subjects[input.recipe];
89
- const lease = {
90
- leaseId,
91
- namespace,
92
- subjects: recipeSubjects === undefined ? {} : JSON.parse(JSON.stringify(recipeSubjects)),
93
- actors: leasedActors,
94
- };
95
- live.set(leaseId, lease);
96
- return lease;
97
- },
98
- release(leaseId) {
99
- live.delete(leaseId);
100
- },
101
- resolveCredential(credentialRef) {
102
- return credentialFor(credentialRef);
103
- },
104
- leases() {
105
- return [...live.values()];
106
- },
107
- };
108
- }
9
+ export * from '@gate-forge/witness/witness/fixture-provider';
109
10
  //# sourceMappingURL=fixture-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixture-provider.js","sourceRoot":"","sources":["../../src/witness/fixture-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fixture-provider.js","sourceRoot":"","sources":["../../src/witness/fixture-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,8CAA8C,CAAC"}
@@ -1,79 +1,10 @@
1
- /** DNS lookup signature (injectable for tests; default: OS resolver). */
2
- export type PinDnsLookup = (host: string) => Promise<ReadonlyArray<{
3
- address: string;
4
- family: number;
5
- }>>;
6
- /** Whether one address is loopback (127.0.0.0/8 or ::1). */
7
- export declare function isLoopbackAddress(address: string): boolean;
8
- /** Clears all pins (tests only — production paths pin once and bind). */
9
- export declare function clearPinnedLoopbackForTests(): void;
10
1
  /**
11
- * Resolves a hostname and pins ALL-loopback addresses, or rejects.
12
- * The first successful pinning wins for the process lifetime: later
13
- * resolutions (including hostile mid-run DNS changes) never replace
14
- * it — connections bind to the startup-approved set.
2
+ * Compatibility re-export: `witness/loopback-pins` now lives in the runner-neutral
3
+ * `@gate-forge/witness` package (plan 2026-09-25 phase 1).
15
4
  *
16
- * Args:
17
- * hostname: the operator-provided hostname to attest.
18
- * lookupFn: DNS lookup (default: OS resolver, all records).
19
- *
20
- * Returns:
21
- * The pinned loopback IP list (IPv4 first, then IPv6, stable order).
22
- *
23
- * Throws:
24
- * Error: on empty/mixed/public/unresolvable answers.
25
- */
26
- export declare function pinLoopbackIps(hostname: string, lookupFn?: PinDnsLookup): Promise<string[]>;
27
- /**
28
- * Snapshot copy of current pins (hostname → approved IPs).
29
- *
30
- * Returns:
31
- * A detached copy for launch-arg construction.
32
- */
33
- export declare function pinnedLoopbackIps(): Map<string, string[]>;
34
- /**
35
- * Builds the Chromium `--host-resolver-rules` value binding every
36
- * pinned hostname to its approved IPs (`MAP host ip`, comma-separated,
37
- * deterministic order). IP literals are emitted bare (brackets are URL
38
- * syntax and would break rule parsing).
39
- *
40
- * Args:
41
- * pins: hostname → approved IPs (default: live snapshot).
42
- *
43
- * Returns:
44
- * The rules string, or null when nothing is pinned (no flag then).
45
- */
46
- export declare function hostResolverRules(pins?: ReadonlyMap<string, readonly string[]>): string | null;
47
- /** Pinned GET result (fetch-compatible subset used by adapter/probe reads). */
48
- export interface PinnedGetResult {
49
- status: number;
50
- headers: Headers;
51
- json(): Promise<unknown>;
52
- text(): Promise<string>;
53
- }
54
- /**
55
- * GET through the startup pins: when the URL's hostname is pinned, the
56
- * TCP connection goes to the pinned IP while the original Host header
57
- * (host + non-default port) and path are preserved — tenant routing
58
- * intact, destination bound. Unpinned hostnames use plain global fetch
59
- * (previous behavior, unchanged).
60
- *
61
- * Args:
62
- * url: absolute http(s) URL.
63
- * options: timeout, headers, abort signal, redirect budget.
64
- *
65
- * Returns:
66
- * Status + headers + body readers.
67
- *
68
- * Throws:
69
- * Error: on transport failure, redirect overflow, or (https) the
70
- * pinned IP failing certificate verification — fail closed, never
71
- * plaintext fallback.
5
+ * The move is physical, not behavioural: this module forwards every
6
+ * export unchanged so `@gate-forge/pack-playwright`'s published import
7
+ * paths — which consumers pin — keep resolving to the same values.
72
8
  */
73
- export declare function pinnedGet(url: string, options: {
74
- timeoutMs: number;
75
- headers?: Record<string, string>;
76
- signal?: AbortSignal;
77
- maxRedirects?: number;
78
- }): Promise<PinnedGetResult>;
9
+ export * from '@gate-forge/witness/witness/loopback-pins';
79
10
  //# sourceMappingURL=loopback-pins.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loopback-pins.d.ts","sourceRoot":"","sources":["../../src/witness/loopback-pins.ts"],"names":[],"mappings":"AA4BA,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAEjE,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAKD,yEAAyE;AACzE,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,YAAoE,GAC7E,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAEzD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAuB,GAAG,MAAM,GAAG,IAAI,CAQnH;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACA,OAAO,CAAC,eAAe,CAAC,CAgC1B"}
1
+ {"version":3,"file":"loopback-pins.d.ts","sourceRoot":"","sources":["../../src/witness/loopback-pins.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,2CAA2C,CAAC"}
@@ -1,244 +1,10 @@
1
1
  /**
2
- * Loopback egress binding (GF-10 follow-up): approving a hostname is not
3
- * enough — every later connection must STAY on the approved loopback
4
- * addresses even if resolution changes mid-run (DNS rebinding). This
5
- * module pins operator-attested hostnames to their startup-resolved
6
- * loopback IPs and binds all three strict-flow egresses to the pins:
2
+ * Compatibility re-export: `witness/loopback-pins` now lives in the runner-neutral
3
+ * `@gate-forge/witness` package (plan 2026-09-25 phase 1).
7
4
  *
8
- * - the engine Chromium launches with `--host-resolver-rules` mapping
9
- * each attested hostname to its approved IPs (the browser is then
10
- * incapable of leaving loopback for those names);
11
- * - witness adapter/probe reads go through `pinnedGet`, which connects
12
- * to the pinned IP while preserving the original Host header (tenant
13
- * routing intact) and port; same-hostname redirects are followed on
14
- * the Location header's actual port with the matching Host header,
15
- * while cross-host and cross-scheme hops reject (never a silent
16
- * re-request of a different destination than the one named);
17
- * - the observation-proxy upstream keeps startup resolve-or-reject only
18
- * (that topology is unused by the strict spawned flow; documented).
19
- *
20
- * Fail-closed throughout: unresolvable/mixed/public resolutions reject
21
- * at pin time; https reads against a pinned IP fail on certificate
22
- * mismatch (no insecure override exists here); unpinned hostnames keep
23
- * the previous plain-fetch behavior.
24
- */
25
- import { lookup } from 'node:dns/promises';
26
- import { request as httpRequest } from 'node:http';
27
- import { request as httpsRequest } from 'node:https';
28
- /** Whether one address is loopback (127.0.0.0/8 or ::1). */
29
- export function isLoopbackAddress(address) {
30
- return address === '::1' || /^127(\.\d{1,3}){3}$/.test(address);
31
- }
32
- /** Hostname → startup-approved loopback IPs (first resolution wins). */
33
- const pinnedIps = new Map();
34
- /** Clears all pins (tests only — production paths pin once and bind). */
35
- export function clearPinnedLoopbackForTests() {
36
- pinnedIps.clear();
37
- }
38
- /**
39
- * Resolves a hostname and pins ALL-loopback addresses, or rejects.
40
- * The first successful pinning wins for the process lifetime: later
41
- * resolutions (including hostile mid-run DNS changes) never replace
42
- * it — connections bind to the startup-approved set.
43
- *
44
- * Args:
45
- * hostname: the operator-provided hostname to attest.
46
- * lookupFn: DNS lookup (default: OS resolver, all records).
47
- *
48
- * Returns:
49
- * The pinned loopback IP list (IPv4 first, then IPv6, stable order).
50
- *
51
- * Throws:
52
- * Error: on empty/mixed/public/unresolvable answers.
53
- */
54
- export async function pinLoopbackIps(hostname, lookupFn = (host) => lookup(host, { all: true, verbatim: true })) {
55
- const existing = pinnedIps.get(hostname);
56
- if (existing !== undefined)
57
- return [...existing];
58
- let records;
59
- try {
60
- records = await lookupFn(hostname);
61
- }
62
- catch {
63
- throw new Error(`hostname '${hostname}' does not resolve to loopback (lookup failed)`);
64
- }
65
- if (records.length === 0 || !records.every((record) => isLoopbackAddress(record.address))) {
66
- throw new Error(`hostname '${hostname}' does not resolve exclusively to loopback`);
67
- }
68
- const v4 = records.filter((record) => record.family === 4).map((record) => record.address);
69
- const v6 = records.filter((record) => record.family !== 4).map((record) => record.address);
70
- const pinned = [...new Set([...v4, ...v6])];
71
- pinnedIps.set(hostname, pinned);
72
- return [...pinned];
73
- }
74
- /**
75
- * Snapshot copy of current pins (hostname → approved IPs).
76
- *
77
- * Returns:
78
- * A detached copy for launch-arg construction.
79
- */
80
- export function pinnedLoopbackIps() {
81
- return new Map([...pinnedIps].map(([host, ips]) => [host, [...ips]]));
82
- }
83
- /**
84
- * Builds the Chromium `--host-resolver-rules` value binding every
85
- * pinned hostname to its approved IPs (`MAP host ip`, comma-separated,
86
- * deterministic order). IP literals are emitted bare (brackets are URL
87
- * syntax and would break rule parsing).
88
- *
89
- * Args:
90
- * pins: hostname → approved IPs (default: live snapshot).
91
- *
92
- * Returns:
93
- * The rules string, or null when nothing is pinned (no flag then).
94
- */
95
- export function hostResolverRules(pins = pinnedLoopbackIps()) {
96
- const rules = [];
97
- for (const host of [...pins.keys()].sort()) {
98
- for (const ip of pins.get(host) ?? []) {
99
- rules.push(`MAP ${host} ${ip}`);
100
- }
101
- }
102
- return rules.length > 0 ? rules.join(', ') : null;
103
- }
104
- /**
105
- * GET through the startup pins: when the URL's hostname is pinned, the
106
- * TCP connection goes to the pinned IP while the original Host header
107
- * (host + non-default port) and path are preserved — tenant routing
108
- * intact, destination bound. Unpinned hostnames use plain global fetch
109
- * (previous behavior, unchanged).
110
- *
111
- * Args:
112
- * url: absolute http(s) URL.
113
- * options: timeout, headers, abort signal, redirect budget.
114
- *
115
- * Returns:
116
- * Status + headers + body readers.
117
- *
118
- * Throws:
119
- * Error: on transport failure, redirect overflow, or (https) the
120
- * pinned IP failing certificate verification — fail closed, never
121
- * plaintext fallback.
5
+ * The move is physical, not behavioural: this module forwards every
6
+ * export unchanged so `@gate-forge/pack-playwright`'s published import
7
+ * paths — which consumers pin — keep resolving to the same values.
122
8
  */
123
- export async function pinnedGet(url, options) {
124
- const pins = pinnedLoopbackIps();
125
- const parsed = new URL(url);
126
- const pinned = pins.get(parsed.hostname);
127
- if (pinned === undefined || pinned.length === 0) {
128
- const response = await fetch(url, {
129
- method: 'GET',
130
- headers: { accept: 'application/json, text/html', ...options.headers },
131
- signal: options.signal,
132
- redirect: 'follow',
133
- });
134
- return {
135
- status: response.status,
136
- headers: response.headers,
137
- json: () => response.json(),
138
- text: () => response.text(),
139
- };
140
- }
141
- const ip = preferIpv4(pinned);
142
- const port = parsed.port !== '' ? parsed.port : parsed.protocol === 'https:' ? '443' : '80';
143
- const hostHeader = isDefaultPort(parsed.protocol, port) ? parsed.hostname : `${parsed.hostname}:${port}`;
144
- return requestPinned({
145
- protocol: parsed.protocol,
146
- ip,
147
- port: Number(port),
148
- path: `${parsed.pathname}${parsed.search}`,
149
- hostHeader,
150
- headers: options.headers ?? {},
151
- timeoutMs: options.timeoutMs,
152
- signal: options.signal,
153
- maxRedirects: options.maxRedirects ?? 5,
154
- });
155
- }
156
- /** Prefers an IPv4 loopback pin, else the first approved IP. */
157
- function preferIpv4(ips) {
158
- return ips.find((ip) => /^127(\.\d{1,3}){3}$/.test(ip)) ?? ips[0];
159
- }
160
- /** Whether the port is the protocol default (Host header omits it then). */
161
- function isDefaultPort(protocol, port) {
162
- return (protocol === 'http:' && port === '80') || (protocol === 'https:' && port === '443');
163
- }
164
- async function requestPinned(input) {
165
- if (input.protocol !== 'http:' && input.protocol !== 'https:') {
166
- throw new Error(`pinned egress supports http(s) only (got '${input.protocol}')`);
167
- }
168
- // eslint-disable-next-line no-await-in-loop -- redirect hops are sequential by construction
169
- for (let redirect = 0; redirect <= input.maxRedirects; redirect += 1) {
170
- const response = await singleRequest(input);
171
- const location = response.headers.get('location');
172
- if (response.status >= 300 && response.status < 400 && location !== null) {
173
- const next = new URL(location, `${input.protocol}//${input.hostHeader}${input.path}`);
174
- // Redirects stay on pinned egress: only same-hostname hops are
175
- // followed through the pins; anything else fails closed (the
176
- // browser path enforces the same origin rule in captureExchanges).
177
- if (next.hostname !== input.hostHeader.split(':')[0]) {
178
- throw new Error(`pinned egress refuses cross-host redirect to '${next.hostname}'`);
179
- }
180
- // Same-host hops follow the Location's ACTUAL origin: protocol,
181
- // port, and Host header all update, and the connection stays bound
182
- // to the pinned IP. Re-requesting the previous origin (old port)
183
- // with the new path — or silently trusting the header while
184
- // keeping the old transport — would read a different destination
185
- // than the one the service named. A scheme change is rejected
186
- // outright: https against the pinned loopback IP can never verify
187
- // a certificate here, so it fails closed with the precise cause.
188
- if (next.protocol !== input.protocol) {
189
- throw new Error(`pinned egress refuses cross-scheme redirect (${input.protocol} → ${next.protocol} '${location}')`);
190
- }
191
- const port = next.port !== '' ? next.port : next.protocol === 'https:' ? '443' : '80';
192
- input = {
193
- ...input,
194
- port: Number(port),
195
- path: `${next.pathname}${next.search}`,
196
- hostHeader: isDefaultPort(next.protocol, port) ? next.hostname : `${next.hostname}:${port}`,
197
- };
198
- continue;
199
- }
200
- return response;
201
- }
202
- throw new Error('pinned egress exceeded redirect budget');
203
- }
204
- function singleRequest(input) {
205
- return new Promise((resolve, reject) => {
206
- const requestFn = input.protocol === 'https:' ? httpsRequest : httpRequest;
207
- const request = requestFn({
208
- hostname: input.ip,
209
- port: input.port,
210
- path: input.path,
211
- method: 'GET',
212
- headers: { accept: 'application/json, text/html', ...input.headers, host: input.hostHeader },
213
- timeout: input.timeoutMs,
214
- }, (response) => {
215
- const chunks = [];
216
- response.on('data', (chunk) => chunks.push(chunk));
217
- response.on('end', () => {
218
- const body = Buffer.concat(chunks);
219
- const headers = new Headers();
220
- for (const [name, value] of Object.entries(response.headersDistinct ?? {})) {
221
- const values = Array.isArray(value) ? value : [value ?? ''];
222
- for (const item of values)
223
- headers.append(name, item);
224
- }
225
- resolve({
226
- status: response.statusCode ?? 0,
227
- headers,
228
- json: () => Promise.resolve(JSON.parse(body.toString('utf8'))),
229
- text: () => Promise.resolve(body.toString('utf8')),
230
- });
231
- });
232
- });
233
- request.on('timeout', () => request.destroy(new Error('pinned egress timed out')));
234
- if (input.signal !== undefined) {
235
- if (input.signal.aborted)
236
- request.destroy(new Error('pinned egress aborted'));
237
- else
238
- input.signal.addEventListener('abort', () => request.destroy(new Error('pinned egress aborted')), { once: true });
239
- }
240
- request.on('error', reject);
241
- request.end();
242
- });
243
- }
9
+ export * from '@gate-forge/witness/witness/loopback-pins';
244
10
  //# sourceMappingURL=loopback-pins.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loopback-pins.js","sourceRoot":"","sources":["../../src/witness/loopback-pins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loopback-pins.js","sourceRoot":"","sources":["../../src/witness/loopback-pins.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,2CAA2C,CAAC"}
@@ -1,34 +1,16 @@
1
- import { recordIdOf } from '@gate-forge/core';
2
- import type { WitnessHandle, WitnessOptions } from './types.js';
3
- /** Fail-closed witness configuration/startup error. */
4
- export declare class WitnessStartupError extends Error {
5
- constructor(message: string);
6
- }
1
+ import { type WitnessHandle } from '@gate-forge/witness/witness/server';
2
+ import type { WitnessOptions } from '@gate-forge/witness/witness/types';
3
+ export * from '@gate-forge/witness/witness/server';
7
4
  /**
8
- * The service-issued recordId comes from the frozen core primitive
9
- * (`recordIdOf`, pin #1/#7): sha256 over GF-canonical JSON of the record
10
- * identity. Sharing one implementation with the engine's provenance
11
- * verifier guarantees the witness issues exactly what evaluation can
12
- * recompute — an entry that never passed through the service has no
13
- * matching hash, so shape-level fabrication (a hex string the service
14
- * never issued) cannot line up with the ledger the reporter copies.
15
- */
16
- export { recordIdOf };
17
- /**
18
- * Starts the witness service.
5
+ * Starts the loopback witness with the engine browser defaulted to
6
+ * pinned Chromium.
19
7
  *
20
8
  * Args:
21
- * options: run identity + token (required), state dir, adapters dir,
22
- * classifications path, target/attestation config, timeout, clock.
9
+ * options: witness options; `engineBrowserLauncher` defaults to
10
+ * Playwright's `chromium` when absent.
23
11
  *
24
12
  * Returns:
25
- * WitnessHandle: {url, stop} once the server listens.
26
- *
27
- * Throws:
28
- * WitnessStartupError / AdapterRegistryError / AttestationError:
29
- * fail-closed startup problems (GF-10 blocks non-loopback targets
30
- * HERE, before any adapter request can be constructed).
13
+ * Promise<WitnessHandle>: the running witness handle.
31
14
  */
32
15
  export declare function startWitness(options: WitnessOptions): Promise<WitnessHandle>;
33
- export type { WitnessHandle } from './types.js';
34
16
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/witness/server.ts"],"names":[],"mappings":"AA+HA,OAAO,EASL,UAAU,EAOX,MAAM,kBAAkB,CAAC;AAgC1B,OAAO,KAAK,EAuCV,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAC;AAyDpB,uDAAuD;AACvD,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AA6aD;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,CAAC;AA6BtB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAyJlF;AAwuHD,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/witness/server.ts"],"names":[],"mappings":"AAiBA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAExE,cAAc,oCAAoC,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAK5E"}