@gate-forge/core 0.1.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 (242) hide show
  1. package/LICENSE +202 -0
  2. package/dist/baselines/adoption.d.ts +76 -0
  3. package/dist/baselines/adoption.d.ts.map +1 -0
  4. package/dist/baselines/adoption.js +163 -0
  5. package/dist/baselines/adoption.js.map +1 -0
  6. package/dist/baselines/index.d.ts +102 -0
  7. package/dist/baselines/index.d.ts.map +1 -0
  8. package/dist/baselines/index.js +186 -0
  9. package/dist/baselines/index.js.map +1 -0
  10. package/dist/canonical-json.d.ts +51 -0
  11. package/dist/canonical-json.d.ts.map +1 -0
  12. package/dist/canonical-json.js +112 -0
  13. package/dist/canonical-json.js.map +1 -0
  14. package/dist/classifier/bind.d.ts +64 -0
  15. package/dist/classifier/bind.d.ts.map +1 -0
  16. package/dist/classifier/bind.js +188 -0
  17. package/dist/classifier/bind.js.map +1 -0
  18. package/dist/classifier/classify.d.ts +154 -0
  19. package/dist/classifier/classify.d.ts.map +1 -0
  20. package/dist/classifier/classify.js +1207 -0
  21. package/dist/classifier/classify.js.map +1 -0
  22. package/dist/classifier/glob.d.ts +48 -0
  23. package/dist/classifier/glob.d.ts.map +1 -0
  24. package/dist/classifier/glob.js +104 -0
  25. package/dist/classifier/glob.js.map +1 -0
  26. package/dist/classifier/index.d.ts +10 -0
  27. package/dist/classifier/index.d.ts.map +1 -0
  28. package/dist/classifier/index.js +21 -0
  29. package/dist/classifier/index.js.map +1 -0
  30. package/dist/classifier/schema.d.ts +150 -0
  31. package/dist/classifier/schema.d.ts.map +1 -0
  32. package/dist/classifier/schema.js +139 -0
  33. package/dist/classifier/schema.js.map +1 -0
  34. package/dist/config/index.d.ts +259 -0
  35. package/dist/config/index.d.ts.map +1 -0
  36. package/dist/config/index.js +523 -0
  37. package/dist/config/index.js.map +1 -0
  38. package/dist/fingerprints.d.ts +56 -0
  39. package/dist/fingerprints.d.ts.map +1 -0
  40. package/dist/fingerprints.js +59 -0
  41. package/dist/fingerprints.js.map +1 -0
  42. package/dist/graph/build.d.ts +16 -0
  43. package/dist/graph/build.d.ts.map +1 -0
  44. package/dist/graph/build.js +423 -0
  45. package/dist/graph/build.js.map +1 -0
  46. package/dist/graph/index.d.ts +12 -0
  47. package/dist/graph/index.d.ts.map +1 -0
  48. package/dist/graph/index.js +10 -0
  49. package/dist/graph/index.js.map +1 -0
  50. package/dist/graph/schema.d.ts +448 -0
  51. package/dist/graph/schema.d.ts.map +1 -0
  52. package/dist/graph/schema.js +237 -0
  53. package/dist/graph/schema.js.map +1 -0
  54. package/dist/graph/symbols.d.ts +129 -0
  55. package/dist/graph/symbols.d.ts.map +1 -0
  56. package/dist/graph/symbols.js +177 -0
  57. package/dist/graph/symbols.js.map +1 -0
  58. package/dist/graph/util.d.ts +40 -0
  59. package/dist/graph/util.d.ts.map +1 -0
  60. package/dist/graph/util.js +41 -0
  61. package/dist/graph/util.js.map +1 -0
  62. package/dist/index.d.ts +683 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +563 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/mapping/resolve.d.ts +177 -0
  67. package/dist/mapping/resolve.d.ts.map +1 -0
  68. package/dist/mapping/resolve.js +523 -0
  69. package/dist/mapping/resolve.js.map +1 -0
  70. package/dist/policy/coverage.d.ts +79 -0
  71. package/dist/policy/coverage.d.ts.map +1 -0
  72. package/dist/policy/coverage.js +119 -0
  73. package/dist/policy/coverage.js.map +1 -0
  74. package/dist/policy/evaluate.d.ts +275 -0
  75. package/dist/policy/evaluate.d.ts.map +1 -0
  76. package/dist/policy/evaluate.js +382 -0
  77. package/dist/policy/evaluate.js.map +1 -0
  78. package/dist/policy/index.d.ts +15 -0
  79. package/dist/policy/index.d.ts.map +1 -0
  80. package/dist/policy/index.js +14 -0
  81. package/dist/policy/index.js.map +1 -0
  82. package/dist/policy/trusted.d.ts +59 -0
  83. package/dist/policy/trusted.d.ts.map +1 -0
  84. package/dist/policy/trusted.js +96 -0
  85. package/dist/policy/trusted.js.map +1 -0
  86. package/dist/provenance.d.ts +170 -0
  87. package/dist/provenance.d.ts.map +1 -0
  88. package/dist/provenance.js +306 -0
  89. package/dist/provenance.js.map +1 -0
  90. package/dist/receipt/index.d.ts +74 -0
  91. package/dist/receipt/index.d.ts.map +1 -0
  92. package/dist/receipt/index.js +154 -0
  93. package/dist/receipt/index.js.map +1 -0
  94. package/dist/report/index.d.ts +100 -0
  95. package/dist/report/index.d.ts.map +1 -0
  96. package/dist/report/index.js +355 -0
  97. package/dist/report/index.js.map +1 -0
  98. package/dist/schemas/adoption.d.ts +40 -0
  99. package/dist/schemas/adoption.d.ts.map +1 -0
  100. package/dist/schemas/adoption.js +87 -0
  101. package/dist/schemas/adoption.js.map +1 -0
  102. package/dist/schemas/baseline.d.ts +19 -0
  103. package/dist/schemas/baseline.d.ts.map +1 -0
  104. package/dist/schemas/baseline.js +45 -0
  105. package/dist/schemas/baseline.js.map +1 -0
  106. package/dist/schemas/claim.d.ts +32 -0
  107. package/dist/schemas/claim.d.ts.map +1 -0
  108. package/dist/schemas/claim.js +34 -0
  109. package/dist/schemas/claim.js.map +1 -0
  110. package/dist/schemas/classification-policy.d.ts +84 -0
  111. package/dist/schemas/classification-policy.d.ts.map +1 -0
  112. package/dist/schemas/classification-policy.js +130 -0
  113. package/dist/schemas/classification-policy.js.map +1 -0
  114. package/dist/schemas/classification-signal.d.ts +125 -0
  115. package/dist/schemas/classification-signal.d.ts.map +1 -0
  116. package/dist/schemas/classification-signal.js +126 -0
  117. package/dist/schemas/classification-signal.js.map +1 -0
  118. package/dist/schemas/classification.d.ts +120 -0
  119. package/dist/schemas/classification.d.ts.map +1 -0
  120. package/dist/schemas/classification.js +154 -0
  121. package/dist/schemas/classification.js.map +1 -0
  122. package/dist/schemas/common.d.ts +73 -0
  123. package/dist/schemas/common.d.ts.map +1 -0
  124. package/dist/schemas/common.js +60 -0
  125. package/dist/schemas/common.js.map +1 -0
  126. package/dist/schemas/coverage-policy.d.ts +89 -0
  127. package/dist/schemas/coverage-policy.d.ts.map +1 -0
  128. package/dist/schemas/coverage-policy.js +81 -0
  129. package/dist/schemas/coverage-policy.js.map +1 -0
  130. package/dist/schemas/evidence.d.ts +65 -0
  131. package/dist/schemas/evidence.d.ts.map +1 -0
  132. package/dist/schemas/evidence.js +64 -0
  133. package/dist/schemas/evidence.js.map +1 -0
  134. package/dist/schemas/execution-result.d.ts +214 -0
  135. package/dist/schemas/execution-result.d.ts.map +1 -0
  136. package/dist/schemas/execution-result.js +240 -0
  137. package/dist/schemas/execution-result.js.map +1 -0
  138. package/dist/schemas/gate-receipt.d.ts +86 -0
  139. package/dist/schemas/gate-receipt.d.ts.map +1 -0
  140. package/dist/schemas/gate-receipt.js +193 -0
  141. package/dist/schemas/gate-receipt.js.map +1 -0
  142. package/dist/schemas/index.d.ts +22 -0
  143. package/dist/schemas/index.d.ts.map +1 -0
  144. package/dist/schemas/index.js +22 -0
  145. package/dist/schemas/index.js.map +1 -0
  146. package/dist/schemas/obligation.d.ts +37 -0
  147. package/dist/schemas/obligation.d.ts.map +1 -0
  148. package/dist/schemas/obligation.js +46 -0
  149. package/dist/schemas/obligation.js.map +1 -0
  150. package/dist/schemas/plugin.d.ts +19 -0
  151. package/dist/schemas/plugin.d.ts.map +1 -0
  152. package/dist/schemas/plugin.js +20 -0
  153. package/dist/schemas/plugin.js.map +1 -0
  154. package/dist/schemas/policy.d.ts +73 -0
  155. package/dist/schemas/policy.d.ts.map +1 -0
  156. package/dist/schemas/policy.js +46 -0
  157. package/dist/schemas/policy.js.map +1 -0
  158. package/dist/schemas/resource.d.ts +26 -0
  159. package/dist/schemas/resource.d.ts.map +1 -0
  160. package/dist/schemas/resource.js +29 -0
  161. package/dist/schemas/resource.js.map +1 -0
  162. package/dist/schemas/run-manifest.d.ts +72 -0
  163. package/dist/schemas/run-manifest.d.ts.map +1 -0
  164. package/dist/schemas/run-manifest.js +125 -0
  165. package/dist/schemas/run-manifest.js.map +1 -0
  166. package/dist/schemas/runner-adapter.d.ts +169 -0
  167. package/dist/schemas/runner-adapter.d.ts.map +1 -0
  168. package/dist/schemas/runner-adapter.js +2 -0
  169. package/dist/schemas/runner-adapter.js.map +1 -0
  170. package/dist/schemas/test-catalog.d.ts +472 -0
  171. package/dist/schemas/test-catalog.d.ts.map +1 -0
  172. package/dist/schemas/test-catalog.js +311 -0
  173. package/dist/schemas/test-catalog.js.map +1 -0
  174. package/dist/schemas/test-map.d.ts +99 -0
  175. package/dist/schemas/test-map.d.ts.map +1 -0
  176. package/dist/schemas/test-map.js +103 -0
  177. package/dist/schemas/test-map.js.map +1 -0
  178. package/dist/schemas/verdict.d.ts +73 -0
  179. package/dist/schemas/verdict.d.ts.map +1 -0
  180. package/dist/schemas/verdict.js +92 -0
  181. package/dist/schemas/verdict.js.map +1 -0
  182. package/dist/schemas/waiver.d.ts +36 -0
  183. package/dist/schemas/waiver.d.ts.map +1 -0
  184. package/dist/schemas/waiver.js +42 -0
  185. package/dist/schemas/waiver.js.map +1 -0
  186. package/dist/supervision/index.d.ts +170 -0
  187. package/dist/supervision/index.d.ts.map +1 -0
  188. package/dist/supervision/index.js +354 -0
  189. package/dist/supervision/index.js.map +1 -0
  190. package/dist/testing/clock.d.ts +50 -0
  191. package/dist/testing/clock.d.ts.map +1 -0
  192. package/dist/testing/clock.js +75 -0
  193. package/dist/testing/clock.js.map +1 -0
  194. package/dist/testing/env.d.ts +66 -0
  195. package/dist/testing/env.d.ts.map +1 -0
  196. package/dist/testing/env.js +106 -0
  197. package/dist/testing/env.js.map +1 -0
  198. package/dist/testing/gate-runner.d.ts +141 -0
  199. package/dist/testing/gate-runner.d.ts.map +1 -0
  200. package/dist/testing/gate-runner.js +173 -0
  201. package/dist/testing/gate-runner.js.map +1 -0
  202. package/dist/testing/gf19.d.ts +106 -0
  203. package/dist/testing/gf19.d.ts.map +1 -0
  204. package/dist/testing/gf19.js +282 -0
  205. package/dist/testing/gf19.js.map +1 -0
  206. package/dist/testing/index.d.ts +20 -0
  207. package/dist/testing/index.d.ts.map +1 -0
  208. package/dist/testing/index.js +14 -0
  209. package/dist/testing/index.js.map +1 -0
  210. package/dist/testing/red-probe.d.ts +138 -0
  211. package/dist/testing/red-probe.d.ts.map +1 -0
  212. package/dist/testing/red-probe.js +251 -0
  213. package/dist/testing/red-probe.js.map +1 -0
  214. package/dist/testing/temp-repo.d.ts +126 -0
  215. package/dist/testing/temp-repo.d.ts.map +1 -0
  216. package/dist/testing/temp-repo.js +214 -0
  217. package/dist/testing/temp-repo.js.map +1 -0
  218. package/dist/verdict/cause.d.ts +99 -0
  219. package/dist/verdict/cause.d.ts.map +1 -0
  220. package/dist/verdict/cause.js +206 -0
  221. package/dist/verdict/cause.js.map +1 -0
  222. package/dist/verdict/evaluate.d.ts +135 -0
  223. package/dist/verdict/evaluate.d.ts.map +1 -0
  224. package/dist/verdict/evaluate.js +1513 -0
  225. package/dist/verdict/evaluate.js.map +1 -0
  226. package/dist/verdict/index.d.ts +21 -0
  227. package/dist/verdict/index.d.ts.map +1 -0
  228. package/dist/verdict/index.js +20 -0
  229. package/dist/verdict/index.js.map +1 -0
  230. package/dist/verdict/pack-verifiers.d.ts +97 -0
  231. package/dist/verdict/pack-verifiers.d.ts.map +1 -0
  232. package/dist/verdict/pack-verifiers.js +763 -0
  233. package/dist/verdict/pack-verifiers.js.map +1 -0
  234. package/dist/verdict/registry.d.ts +180 -0
  235. package/dist/verdict/registry.d.ts.map +1 -0
  236. package/dist/verdict/registry.js +67 -0
  237. package/dist/verdict/registry.js.map +1 -0
  238. package/dist/waivers/index.d.ts +103 -0
  239. package/dist/waivers/index.d.ts.map +1 -0
  240. package/dist/waivers/index.js +192 -0
  241. package/dist/waivers/index.js.map +1 -0
  242. package/package.json +40 -0
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Injected environment for fixture runs (fixture harness, G7).
3
+ *
4
+ * `withEnv` scopes process.env mutations to a function body (CI provider
5
+ * variables like `GITHUB_BASE_REF` are environment-carried, so fixtures
6
+ * must be able to fake them without leaking). The changed-file provider
7
+ * stubs give GF-09-style parity tests identical inputs through the
8
+ * `local-staged`, `github-pr`, and `gitlab-mr` provider identities.
9
+ */
10
+ import { compareStrings } from '../graph/index.js';
11
+ /**
12
+ * Runs `body` with a patched `process.env`, restoring the previous
13
+ * environment on every path (sync throw, async rejection, success).
14
+ * A `undefined` value deletes the variable for the body's duration.
15
+ *
16
+ * Args:
17
+ * vars: variable name to value (or undefined to unset).
18
+ * body: closure to run under the patched environment; may be async.
19
+ *
20
+ * Returns:
21
+ * The body's return value (awaited when async).
22
+ */
23
+ export function withEnv(vars, body) {
24
+ const saved = new Map();
25
+ for (const [name, value] of Object.entries(vars)) {
26
+ saved.set(name, process.env[name]);
27
+ if (value === undefined) {
28
+ delete process.env[name];
29
+ }
30
+ else {
31
+ process.env[name] = value;
32
+ }
33
+ }
34
+ const restore = () => {
35
+ for (const [name, value] of saved) {
36
+ if (value === undefined) {
37
+ delete process.env[name];
38
+ }
39
+ else {
40
+ process.env[name] = value;
41
+ }
42
+ }
43
+ };
44
+ let result;
45
+ try {
46
+ result = body();
47
+ }
48
+ catch (error) {
49
+ restore();
50
+ throw error;
51
+ }
52
+ if (result instanceof Promise) {
53
+ return result.finally(restore);
54
+ }
55
+ restore();
56
+ return result;
57
+ }
58
+ /**
59
+ * Normalizes a changed-file list: posix separators, deduplicated,
60
+ * codepoint-sorted. Provider outputs are compared as sets by GF-09.
61
+ *
62
+ * Args:
63
+ * files: raw provider output.
64
+ *
65
+ * Returns:
66
+ * string[]: canonical form.
67
+ */
68
+ export function normalizeChangedFiles(files) {
69
+ const unique = new Set();
70
+ for (const file of files) {
71
+ unique.add(file.split('\\').join('/'));
72
+ }
73
+ return [...unique].sort(compareStrings);
74
+ }
75
+ /**
76
+ * Builds a fake changed-file provider from an explicit list — the CI
77
+ * stand-in (`github-pr` / `gitlab-mr` merge-base diff) and the
78
+ * `all-files` full-scan provider for fixtures. The list is snapshotted
79
+ * (defensive copy + normalization) at construction.
80
+ *
81
+ * Args:
82
+ * provider: provider identity this fake impersonates.
83
+ * files: raw changed-file list.
84
+ *
85
+ * Returns:
86
+ * ChangedFileProvider: deterministic, offline, network-free.
87
+ */
88
+ export function fakeProvider(provider, files) {
89
+ const snapshot = normalizeChangedFiles(files);
90
+ return { provider, changedFiles: () => [...snapshot] };
91
+ }
92
+ /**
93
+ * Real `local-staged` provider over a {@link TempRepo}: reads the
94
+ * repository's actual index (`git diff --cached --name-only`) at call
95
+ * time, so fixtures exercise the genuine local half of GF-09 parity.
96
+ *
97
+ * Args:
98
+ * repo: the fixture repository.
99
+ *
100
+ * Returns:
101
+ * ChangedFileProvider: staged files, freshly read on every call.
102
+ */
103
+ export function localStagedProvider(repo) {
104
+ return { provider: 'local-staged', changedFiles: () => repo.stagedFiles() };
105
+ }
106
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/testing/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO,CAAI,IAAwC,EAAE,IAAa;IAChF,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;YAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,MAAS,CAAC;IACd,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;QACV,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAM,CAAC;IACtC,CAAC;IACD,OAAO,EAAE,CAAC;IACV,OAAO,MAAM,CAAC;AAChB,CAAC;AAgBD;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,QAAyB,EAAE,KAAe;IACrE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AACzD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,141 @@
1
+ import type { DetectorOutput, GraphFinding, ResourceGraph } from '../graph/index.js';
2
+ import type { PolicyEvaluationResult } from '../policy/index.js';
3
+ import type { Claim } from '../schemas/claim.js';
4
+ import type { Classification } from '../schemas/classification.js';
5
+ import type { ClassificationPolicy } from '../schemas/classification-policy.js';
6
+ import type { PolicyFile } from '../schemas/policy.js';
7
+ import type { EvidenceRecord } from '../schemas/evidence.js';
8
+ import type { Obligation } from '../schemas/obligation.js';
9
+ import type { Waiver } from '../schemas/waiver.js';
10
+ import type { RunManifest } from '../schemas/run-manifest.js';
11
+ import type { Verdict } from '../schemas/verdict.js';
12
+ import type { TestClock } from './clock.js';
13
+ import type { ChangedFileProvider } from './env.js';
14
+ import type { ParseAudit } from './gf19.js';
15
+ import type { TempRepo } from './temp-repo.js';
16
+ /**
17
+ * The context one obligation is evaluated against (pin #9). `now` accepts
18
+ * ISO-8601 string or Date; the evaluator normalizes internally.
19
+ */
20
+ export interface ObligationEvaluatorInput {
21
+ /** Claims assessed for this run. */
22
+ claims: Claim[];
23
+ /** Witness-issued evidence records for this run. */
24
+ records: EvidenceRecord[];
25
+ /** Waivers in scope for this run. */
26
+ waivers: Waiver[];
27
+ /** The obligation resource's classification, or null while unclassified. */
28
+ classification: Classification | null;
29
+ /** The injected instant the verdict is decided at. */
30
+ now: string | Date;
31
+ }
32
+ /** The pinned evaluator result shape (pin #9): all keys always present. */
33
+ export interface EvaluatorVerdict {
34
+ /** One of the seven verdicts. */
35
+ verdict: Verdict;
36
+ /** Single-cause reason; null only for `satisfied`. */
37
+ reason: string | null;
38
+ /** Evidence record ids backing the verdict; empty when none consulted. */
39
+ recordIds: string[];
40
+ }
41
+ /**
42
+ * A pin-#9 obligation evaluator. G3's `evaluateObligation` conforms
43
+ * structurally; fixtures inject doubles.
44
+ */
45
+ export type ObligationEvaluator = (obligation: Obligation, input: ObligationEvaluatorInput) => EvaluatorVerdict;
46
+ /** One detector contribution, optionally carrying its parse audit. */
47
+ export interface DetectorContribution extends DetectorOutput {
48
+ /** Per-file parse audit; when present the GF-19 rule is applied. */
49
+ audit?: ParseAudit;
50
+ }
51
+ /** Everything one gate run needs. Detectors, artifacts, clock, evaluator. */
52
+ export interface RunGatesInput {
53
+ /** The fixture repository under test. */
54
+ repo: TempRepo;
55
+ /** Detector contributions; at least one. */
56
+ detectors: DetectorContribution[];
57
+ /**
58
+ * The classification policy (`.gateforge/classification-policy.yml`
59
+ * content, plan phase 5). Effective classifications are computed
60
+ * deterministically from detector signals on every run — there is no
61
+ * manual classifications document.
62
+ */
63
+ classificationPolicy: ClassificationPolicy;
64
+ /** Policies document (`.gateforge/policies.yml` content). */
65
+ policies: PolicyFile;
66
+ /** The obligation evaluator (pin #9). */
67
+ evaluate: ObligationEvaluator;
68
+ /** The injected clock; stamps the run manifest and every verdict. */
69
+ clock: TestClock;
70
+ /** Claims to assess and watch for stale references. */
71
+ claims?: Claim[];
72
+ /** Witness-issued records backing verdicts. */
73
+ records?: EvidenceRecord[];
74
+ /** Waivers in scope. */
75
+ waivers?: Waiver[];
76
+ /** Adapter names watched for stale references. */
77
+ adapters?: string[];
78
+ /** Changed-file provider; when omitted the run records no changed files. */
79
+ changedProvider?: ChangedFileProvider;
80
+ /** Fixed run id; default is a fresh random UUID. */
81
+ runId?: string;
82
+ }
83
+ /** One obligation's verdict plus the identity fields a report needs. */
84
+ export interface GateRunVerdict {
85
+ /** `<resourceId>:<contract>`. */
86
+ obligationId: string;
87
+ resourceId: string;
88
+ /** Contract required by the policy. */
89
+ contract: string;
90
+ /** Policy that generated the obligation. */
91
+ policyId: string;
92
+ /** Obligation fingerprint (pin #2) — the identity baselines store. */
93
+ fingerprint: string;
94
+ /** Decided verdict. */
95
+ verdict: Verdict;
96
+ /** Single-cause reason; null only for `satisfied`. */
97
+ reason: string | null;
98
+ /** Backing evidence record ids. */
99
+ recordIds: string[];
100
+ }
101
+ /** The complete, typed result of one gate run. */
102
+ export interface GateRunResult {
103
+ /** Run manifest (pin #4), validated against its schema. */
104
+ manifest: RunManifest;
105
+ /** The built resource graph (includes all findings). */
106
+ graph: ResourceGraph;
107
+ /** Policy-engine output: obligations, blocking entries, claim assessments. */
108
+ policy: PolicyEvaluationResult;
109
+ /** Per-obligation verdicts, sorted by obligation id. */
110
+ verdicts: GateRunVerdict[];
111
+ /** Graph findings (detector + graph-issued), including `PARSE_ERROR`. */
112
+ findings: GraphFinding[];
113
+ /** GF-19 rule violations: detector misbehavior the rule had to correct. */
114
+ auditViolations: string[];
115
+ /** Changed files reported by the injected provider (sorted). */
116
+ changedFiles: string[];
117
+ /**
118
+ * True when nothing blocks: no blocking verdicts, no blocking entries,
119
+ * no findings, no audit violations. Conservative by design — a fixture
120
+ * asserting a specific sub-outcome should assert on the fields above.
121
+ */
122
+ clean: boolean;
123
+ }
124
+ /**
125
+ * Runs the discover → obligations → evaluate pipeline over a fixture
126
+ * repository. Deterministic given fixed inputs: detectors run in order,
127
+ * the graph and policy engine sort their outputs, and the clock is
128
+ * injected.
129
+ *
130
+ * Args:
131
+ * input: repository, detector contributions (+ parse audits), the
132
+ * classification-policy/policy documents, injected clock, evaluator
133
+ * double or real, and optional claims/records/waivers/provider/runId.
134
+ *
135
+ * Returns:
136
+ * GateRunResult: manifest, graph, policy result, per-obligation
137
+ * verdicts, findings, audit violations, changed files, clean flag.
138
+ * @throws TypeError when no detector contributions are supplied.
139
+ */
140
+ export declare function runGates(input: RunGatesInput): GateRunResult;
141
+ //# sourceMappingURL=gate-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-runner.d.ts","sourceRoot":"","sources":["../../src/testing/gate-runner.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAIjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,oDAAoD;IACpD,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,qCAAqC;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4EAA4E;IAC5E,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,sDAAsD;IACtD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,wBAAwB,KAC5B,gBAAgB,CAAC;AAEtB,sEAAsE;AACtE,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,oEAAoE;IACpE,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,4CAA4C;IAC5C,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC;;;;;OAKG;IACH,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,6DAA6D;IAC7D,QAAQ,EAAE,UAAU,CAAC;IACrB,yCAAyC;IACzC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,qEAAqE;IACrE,KAAK,EAAE,SAAS,CAAC;IACjB,uDAAuD;IACvD,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mCAAmC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,QAAQ,EAAE,WAAW,CAAC;IACtB,wDAAwD;IACxD,KAAK,EAAE,aAAa,CAAC;IACrB,8EAA8E;IAC9E,MAAM,EAAE,sBAAsB,CAAC;IAC/B,wDAAwD;IACxD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,yEAAyE;IACzE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,2EAA2E;IAC3E,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gEAAgE;IAChE,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CA8I5D"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Gate-runner helper (fixture harness, G7): runs the full
3
+ * discover → obligations → evaluate pipeline over a temporary repository
4
+ * with injected clock, environment, and changed-file provider.
5
+ *
6
+ * The evaluator is injected (pin #9: `evaluateObligation(obligation,
7
+ * {claims, records, waivers, classification, now})`); fixtures in this
8
+ * package use a local test double. When G3's verdict engine lands, the
9
+ * real `evaluateObligation` satisfies {@link ObligationEvaluator}
10
+ * structurally — no harness change needed.
11
+ *
12
+ * The GF-19 rule is applied to every detector contribution carrying a
13
+ * parse audit before the graph is built, so malformed source can never
14
+ * enter the pipeline as a silent resource.
15
+ */
16
+ import { randomUUID } from 'node:crypto';
17
+ import { buildResourceGraph, compareStrings } from '../graph/index.js';
18
+ import { fingerprint } from '../fingerprints.js';
19
+ import { evaluatePolicies } from '../policy/index.js';
20
+ import { runClassification } from '../classifier/bind.js';
21
+ import { RunManifestSchema } from '../schemas/run-manifest.js';
22
+ import { applyParseErrorRule } from './gf19.js';
23
+ /**
24
+ * Runs the discover → obligations → evaluate pipeline over a fixture
25
+ * repository. Deterministic given fixed inputs: detectors run in order,
26
+ * the graph and policy engine sort their outputs, and the clock is
27
+ * injected.
28
+ *
29
+ * Args:
30
+ * input: repository, detector contributions (+ parse audits), the
31
+ * classification-policy/policy documents, injected clock, evaluator
32
+ * double or real, and optional claims/records/waivers/provider/runId.
33
+ *
34
+ * Returns:
35
+ * GateRunResult: manifest, graph, policy result, per-obligation
36
+ * verdicts, findings, audit violations, changed files, clean flag.
37
+ * @throws TypeError when no detector contributions are supplied.
38
+ */
39
+ export function runGates(input) {
40
+ if (input.detectors.length === 0) {
41
+ throw new TypeError('runGates requires at least one detector contribution');
42
+ }
43
+ const contributions = [];
44
+ const auditViolations = [];
45
+ for (const contribution of input.detectors) {
46
+ if (contribution.audit === undefined) {
47
+ contributions.push(contribution);
48
+ continue;
49
+ }
50
+ const ruled = applyParseErrorRule({
51
+ detectorId: contribution.detectorId,
52
+ detectorVersion: contribution.detectorVersion,
53
+ audit: contribution.audit,
54
+ output: contribution,
55
+ });
56
+ auditViolations.push(...ruled.violations.map((violation) => `${contribution.detectorId}: ${violation}`));
57
+ contributions.push({
58
+ detectorId: contribution.detectorId,
59
+ detectorVersion: contribution.detectorVersion,
60
+ resources: ruled.resources,
61
+ unresolved: contribution.unresolved,
62
+ // The rule's guaranteed findings carry provenance; feed them back
63
+ // through the pinned discovery shape so the graph owns them.
64
+ findings: ruled.findings.map(({ code, detail, locations }) => ({ code, detail, locations })),
65
+ classificationSignals: contribution.classificationSignals,
66
+ ...(contribution.scannedPaths !== undefined
67
+ ? { scannedPaths: contribution.scannedPaths }
68
+ : {}),
69
+ });
70
+ }
71
+ const built = buildResourceGraph({
72
+ detectors: contributions,
73
+ claims: input.claims,
74
+ adapters: input.adapters,
75
+ waivers: input.waivers,
76
+ });
77
+ const signals = contributions.flatMap((contribution) => contribution.classificationSignals);
78
+ // Channel routing (ADR 0003 D2): the harness stands in the HOST, so
79
+ // suppressive-shaped signals in the fixture contributions are minted
80
+ // onto the authority channel exactly as the real pipeline would.
81
+ const suppressive = (signal) => (signal.dimension === 'internality' &&
82
+ (signal.basis === 'declaration' || signal.basis === 'organization-policy')) ||
83
+ (signal.dimension.startsWith('lifecycle.') && signal.basis === 'code-negative-closed-world');
84
+ // Per-detector coverage (red-team round 3): synthesize the coverage
85
+ // reports from contributions that reported scannedPaths, exactly as
86
+ // the real pipeline does — the attestation judges THESE, never a union.
87
+ const coverage = contributions
88
+ .filter((contribution) => contribution.scannedPaths !== undefined)
89
+ .map((contribution) => ({
90
+ detector: contribution.detectorId,
91
+ scannedPaths: contribution.scannedPaths,
92
+ }));
93
+ const { graph, blocking } = runClassification({
94
+ graph: built,
95
+ signals: signals.filter((signal) => !suppressive(signal)),
96
+ authority: signals.filter(suppressive),
97
+ policy: input.classificationPolicy,
98
+ adapters: input.adapters ?? [],
99
+ scan: {
100
+ // The harness's requested scope is the union of reported coverage
101
+ // (fixture-level self-consistency); the policy's coverage rules
102
+ // still judge each detector individually below.
103
+ requestedPaths: [...new Set(coverage.flatMap((entry) => entry.scannedPaths))],
104
+ scannedPaths: [...new Set(coverage.flatMap((entry) => entry.scannedPaths))],
105
+ coverage,
106
+ configuredDetectors: contributions.length,
107
+ successfulDetectors: contributions.length,
108
+ },
109
+ });
110
+ const policy = evaluatePolicies({
111
+ graph,
112
+ policies: input.policies,
113
+ claims: input.claims,
114
+ extraBlocking: blocking,
115
+ });
116
+ const now = input.clock.now();
117
+ const verdicts = policy.obligations
118
+ .map((obligation) => {
119
+ const resource = graph.resources.find((candidate) => candidate.id === obligation.resourceId);
120
+ const outcome = input.evaluate(obligation, {
121
+ claims: input.claims ?? [],
122
+ records: input.records ?? [],
123
+ waivers: input.waivers ?? [],
124
+ classification: resource?.classification ?? null,
125
+ now,
126
+ });
127
+ return {
128
+ obligationId: obligation.id,
129
+ resourceId: obligation.resourceId,
130
+ contract: obligation.contract,
131
+ policyId: obligation.policyId,
132
+ fingerprint: fingerprint({
133
+ resourceId: obligation.resourceId,
134
+ contract: obligation.contract,
135
+ policyId: obligation.policyId,
136
+ lifecycle: obligation.lifecycle,
137
+ }),
138
+ verdict: outcome.verdict,
139
+ reason: outcome.reason,
140
+ recordIds: [...outcome.recordIds].sort(compareStrings),
141
+ };
142
+ })
143
+ .sort((a, b) => compareStrings(a.obligationId, b.obligationId));
144
+ const manifest = RunManifestSchema.parse({
145
+ schemaVersion: 1,
146
+ runId: input.runId ?? randomUUID(),
147
+ startedAt: now,
148
+ gitSha: input.repo.headSha(),
149
+ provider: input.changedProvider?.provider ?? 'all-files',
150
+ plugins: contributions.map((contribution) => ({
151
+ id: contribution.detectorId,
152
+ version: contribution.detectorVersion,
153
+ transport: 'in-process',
154
+ })),
155
+ attestationScope: null,
156
+ });
157
+ const blockingVerdicts = verdicts.filter((verdict) => verdict.verdict !== 'satisfied' && verdict.verdict !== 'waived');
158
+ return {
159
+ manifest,
160
+ graph,
161
+ policy,
162
+ verdicts,
163
+ findings: graph.findings,
164
+ auditViolations,
165
+ changedFiles: input.changedProvider?.changedFiles() ?? [],
166
+ clean: blockingVerdicts.length === 0 &&
167
+ policy.blocking.length === 0 &&
168
+ graph.findings.length === 0 &&
169
+ graph.stale.length === 0 &&
170
+ auditViolations.length === 0,
171
+ };
172
+ }
173
+ //# sourceMappingURL=gate-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-runner.js","sourceRoot":"","sources":["../../src/testing/gate-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import type { DetectorOutput, GraphFinding } from '../graph/index.js';
2
+ import type { Resource } from '../schemas/resource.js';
3
+ import type { TempRepo } from './temp-repo.js';
4
+ /** The canonical finding code for malformed source files. */
5
+ export declare const PARSE_ERROR_FINDING = "PARSE_ERROR";
6
+ /** One scanned file's parse outcome, as reported by a detector. */
7
+ export interface ParseAuditEntry {
8
+ /** Repo-root-relative posix path of the scanned file. */
9
+ file: string;
10
+ /** True when the file parsed. */
11
+ ok: boolean;
12
+ /** 1-based line of the first syntax error; required when `ok` is false. */
13
+ line?: number;
14
+ /** Single-cause human explanation; required when `ok` is false. */
15
+ detail?: string;
16
+ }
17
+ /** A detector's full parse audit: one entry per scanned file. */
18
+ export type ParseAudit = ParseAuditEntry[];
19
+ /** Inputs to the GF-19 rule. */
20
+ export interface ParseErrorRuleInput {
21
+ /** Detector identity for finding provenance. */
22
+ detectorId: string;
23
+ /** Detector version for finding provenance. */
24
+ detectorVersion: string;
25
+ /** The detector's per-file parse audit. */
26
+ audit: ParseAudit;
27
+ /** The detector's raw discovery output (untrusted). */
28
+ output: DetectorOutput;
29
+ }
30
+ /** Outcome of applying the GF-19 rule. */
31
+ export interface ParseErrorRuleResult {
32
+ /**
33
+ * All detector findings with provenance, PLUS a guaranteed
34
+ * `PARSE_ERROR` finding per malformed file. Deterministically sorted.
35
+ */
36
+ findings: GraphFinding[];
37
+ /** The `PARSE_ERROR` findings subset (assertion convenience). */
38
+ parseErrors: GraphFinding[];
39
+ /**
40
+ * Resources allowed through: every resource sourced from a malformed
41
+ * file has been stripped.
42
+ */
43
+ resources: Resource[];
44
+ /**
45
+ * Non-empty when the detector misbehaved: emitted resources from a
46
+ * malformed file (silent resources) or failed to report a
47
+ * `PARSE_ERROR` finding / a valid audit line number.
48
+ */
49
+ violations: string[];
50
+ }
51
+ /**
52
+ * Applies the GF-19 rule to one detector contribution.
53
+ *
54
+ * Args:
55
+ * input: detector identity, parse audit, and raw output.
56
+ *
57
+ * Returns:
58
+ * ParseErrorRuleResult: guaranteed findings, vetted resources, and the
59
+ * detector's violations (empty when the detector behaved).
60
+ */
61
+ export declare function applyParseErrorRule(input: ParseErrorRuleInput): ParseErrorRuleResult;
62
+ /**
63
+ * Whether a finding list contains at least one `PARSE_ERROR` — the
64
+ * fail-closed signal that a source file could not be read.
65
+ *
66
+ * Args:
67
+ * findings: graph or rule findings.
68
+ *
69
+ * Returns:
70
+ * boolean: true when malformed source is in play.
71
+ */
72
+ export declare function hasParseErrors(findings: GraphFinding[]): boolean;
73
+ /** Options for {@link stubDetector}. */
74
+ export interface StubDetectorOptions {
75
+ /** Detector id. Default `gateforge.stub-detector`. */
76
+ id?: string;
77
+ /** Detector version. Default `0.0.0`. */
78
+ version?: string;
79
+ /** Only scan files with these suffixes. Default: all non-`.git`/`.gateforge` files. */
80
+ suffixes?: string[];
81
+ }
82
+ /** {@link stubDetector} result: discovery output plus its parse audit. */
83
+ export interface StubDetectorResult {
84
+ /** Pinned discovery shape, ready for the gate runner. */
85
+ output: DetectorOutput;
86
+ /** Per-file parse audit for the GF-19 rule. */
87
+ audit: ParseAudit;
88
+ }
89
+ /**
90
+ * Detects resources in a fixture repository with a deliberately trivial
91
+ * in-process parser: every top-level `name = value` line becomes a
92
+ * resource (`kind: 'stub.declaration'`, `resourceName` attribute), any
93
+ * other non-comment/non-blank line is a syntax error, and a file with a
94
+ * syntax error yields a `PARSE_ERROR` finding at that line and no
95
+ * resources. Malformed files never crash the scan.
96
+ *
97
+ * Args:
98
+ * repo: the fixture repository to scan.
99
+ * options: detector identity and optional suffix filter.
100
+ *
101
+ * Returns:
102
+ * StubDetectorResult: discovery output plus the parse audit for the
103
+ * GF-19 rule.
104
+ */
105
+ export declare function stubDetector(repo: TempRepo, options?: StubDetectorOptions): StubDetectorResult;
106
+ //# sourceMappingURL=gf19.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gf19.d.ts","sourceRoot":"","sources":["../../src/testing/gf19.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,6DAA6D;AAC7D,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC;AAE3C,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,KAAK,EAAE,UAAU,CAAC;IAClB,uDAAuD;IACvD,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,iEAAiE;IACjE,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B;;;OAGG;IACH,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB;;;;OAIG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAwEpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAEhE;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,MAAM,EAAE,cAAc,CAAC;IACvB,+CAA+C;IAC/C,KAAK,EAAE,UAAU,CAAC;CACnB;AAqFD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAE,mBAAwB,GAAG,kBAAkB,CAmElG"}