hackmyagent 0.11.13 → 0.11.15

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 (127) hide show
  1. package/README.md +26 -3
  2. package/dist/attack-engine/feedback-loop.d.ts +36 -0
  3. package/dist/attack-engine/feedback-loop.d.ts.map +1 -0
  4. package/dist/attack-engine/feedback-loop.js +261 -0
  5. package/dist/attack-engine/feedback-loop.js.map +1 -0
  6. package/dist/attack-engine/index.d.ts +13 -0
  7. package/dist/attack-engine/index.d.ts.map +1 -0
  8. package/dist/attack-engine/index.js +21 -0
  9. package/dist/attack-engine/index.js.map +1 -0
  10. package/dist/attack-engine/payload-generator.d.ts +21 -0
  11. package/dist/attack-engine/payload-generator.d.ts.map +1 -0
  12. package/dist/attack-engine/payload-generator.js +210 -0
  13. package/dist/attack-engine/payload-generator.js.map +1 -0
  14. package/dist/attack-engine/target-reader.d.ts +15 -0
  15. package/dist/attack-engine/target-reader.d.ts.map +1 -0
  16. package/dist/attack-engine/target-reader.js +152 -0
  17. package/dist/attack-engine/target-reader.js.map +1 -0
  18. package/dist/attack-engine/training-pipeline.d.ts +57 -0
  19. package/dist/attack-engine/training-pipeline.d.ts.map +1 -0
  20. package/dist/attack-engine/training-pipeline.js +146 -0
  21. package/dist/attack-engine/training-pipeline.js.map +1 -0
  22. package/dist/attack-engine/types.d.ts +133 -0
  23. package/dist/attack-engine/types.d.ts.map +1 -0
  24. package/dist/attack-engine/types.js +22 -0
  25. package/dist/attack-engine/types.js.map +1 -0
  26. package/dist/cli.js +248 -15
  27. package/dist/cli.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +9 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/nanomind-core/analyzers/capability-analyzer.d.ts +40 -0
  33. package/dist/nanomind-core/analyzers/capability-analyzer.d.ts.map +1 -0
  34. package/dist/nanomind-core/analyzers/capability-analyzer.js +310 -0
  35. package/dist/nanomind-core/analyzers/capability-analyzer.js.map +1 -0
  36. package/dist/nanomind-core/analyzers/code-analyzer.d.ts +21 -0
  37. package/dist/nanomind-core/analyzers/code-analyzer.d.ts.map +1 -0
  38. package/dist/nanomind-core/analyzers/code-analyzer.js +350 -0
  39. package/dist/nanomind-core/analyzers/code-analyzer.js.map +1 -0
  40. package/dist/nanomind-core/analyzers/credential-analyzer.d.ts +20 -0
  41. package/dist/nanomind-core/analyzers/credential-analyzer.d.ts.map +1 -0
  42. package/dist/nanomind-core/analyzers/credential-analyzer.js +317 -0
  43. package/dist/nanomind-core/analyzers/credential-analyzer.js.map +1 -0
  44. package/dist/nanomind-core/analyzers/governance-analyzer.d.ts +22 -0
  45. package/dist/nanomind-core/analyzers/governance-analyzer.d.ts.map +1 -0
  46. package/dist/nanomind-core/analyzers/governance-analyzer.js +393 -0
  47. package/dist/nanomind-core/analyzers/governance-analyzer.js.map +1 -0
  48. package/dist/nanomind-core/analyzers/prompt-analyzer.d.ts +22 -0
  49. package/dist/nanomind-core/analyzers/prompt-analyzer.d.ts.map +1 -0
  50. package/dist/nanomind-core/analyzers/prompt-analyzer.js +486 -0
  51. package/dist/nanomind-core/analyzers/prompt-analyzer.js.map +1 -0
  52. package/dist/nanomind-core/analyzers/scope-analyzer.d.ts +20 -0
  53. package/dist/nanomind-core/analyzers/scope-analyzer.d.ts.map +1 -0
  54. package/dist/nanomind-core/analyzers/scope-analyzer.js +326 -0
  55. package/dist/nanomind-core/analyzers/scope-analyzer.js.map +1 -0
  56. package/dist/nanomind-core/compiler/semantic-compiler.d.ts +41 -0
  57. package/dist/nanomind-core/compiler/semantic-compiler.d.ts.map +1 -0
  58. package/dist/nanomind-core/compiler/semantic-compiler.js +490 -0
  59. package/dist/nanomind-core/compiler/semantic-compiler.js.map +1 -0
  60. package/dist/nanomind-core/index.d.ts +30 -0
  61. package/dist/nanomind-core/index.d.ts.map +1 -0
  62. package/dist/nanomind-core/index.js +45 -0
  63. package/dist/nanomind-core/index.js.map +1 -0
  64. package/dist/nanomind-core/ingestion/artifact-parser.d.ts +48 -0
  65. package/dist/nanomind-core/ingestion/artifact-parser.d.ts.map +1 -0
  66. package/dist/nanomind-core/ingestion/artifact-parser.js +203 -0
  67. package/dist/nanomind-core/ingestion/artifact-parser.js.map +1 -0
  68. package/dist/nanomind-core/ingestion/input-sanitizer.d.ts +49 -0
  69. package/dist/nanomind-core/ingestion/input-sanitizer.d.ts.map +1 -0
  70. package/dist/nanomind-core/ingestion/input-sanitizer.js +80 -0
  71. package/dist/nanomind-core/ingestion/input-sanitizer.js.map +1 -0
  72. package/dist/nanomind-core/scanner-bridge.d.ts +49 -0
  73. package/dist/nanomind-core/scanner-bridge.d.ts.map +1 -0
  74. package/dist/nanomind-core/scanner-bridge.js +317 -0
  75. package/dist/nanomind-core/scanner-bridge.js.map +1 -0
  76. package/dist/nanomind-core/security/defense-in-depth.d.ts +99 -0
  77. package/dist/nanomind-core/security/defense-in-depth.d.ts.map +1 -0
  78. package/dist/nanomind-core/security/defense-in-depth.js +206 -0
  79. package/dist/nanomind-core/security/defense-in-depth.js.map +1 -0
  80. package/dist/nanomind-core/security/integrity-verifier.d.ts +132 -0
  81. package/dist/nanomind-core/security/integrity-verifier.d.ts.map +1 -0
  82. package/dist/nanomind-core/security/integrity-verifier.js +437 -0
  83. package/dist/nanomind-core/security/integrity-verifier.js.map +1 -0
  84. package/dist/nanomind-core/types.d.ts +125 -0
  85. package/dist/nanomind-core/types.d.ts.map +1 -0
  86. package/dist/nanomind-core/types.js +22 -0
  87. package/dist/nanomind-core/types.js.map +1 -0
  88. package/dist/output/asff.d.ts.map +1 -1
  89. package/dist/output/asff.js +2 -1
  90. package/dist/output/asff.js.map +1 -1
  91. package/dist/semantic/index.d.ts +4 -0
  92. package/dist/semantic/index.d.ts.map +1 -1
  93. package/dist/semantic/index.js +13 -1
  94. package/dist/semantic/index.js.map +1 -1
  95. package/dist/semantic/nanomind-analyzer.d.ts +77 -0
  96. package/dist/semantic/nanomind-analyzer.d.ts.map +1 -0
  97. package/dist/semantic/nanomind-analyzer.js +165 -0
  98. package/dist/semantic/nanomind-analyzer.js.map +1 -0
  99. package/dist/semantic/nanomind-enhancer.d.ts +50 -0
  100. package/dist/semantic/nanomind-enhancer.d.ts.map +1 -0
  101. package/dist/semantic/nanomind-enhancer.js +203 -0
  102. package/dist/semantic/nanomind-enhancer.js.map +1 -0
  103. package/dist/simulation/engine.d.ts +69 -0
  104. package/dist/simulation/engine.d.ts.map +1 -0
  105. package/dist/simulation/engine.js +297 -0
  106. package/dist/simulation/engine.js.map +1 -0
  107. package/dist/simulation/index.d.ts +15 -0
  108. package/dist/simulation/index.d.ts.map +1 -0
  109. package/dist/simulation/index.js +31 -0
  110. package/dist/simulation/index.js.map +1 -0
  111. package/dist/simulation/llm-executor.d.ts +58 -0
  112. package/dist/simulation/llm-executor.d.ts.map +1 -0
  113. package/dist/simulation/llm-executor.js +297 -0
  114. package/dist/simulation/llm-executor.js.map +1 -0
  115. package/dist/simulation/mock-tools.d.ts +35 -0
  116. package/dist/simulation/mock-tools.d.ts.map +1 -0
  117. package/dist/simulation/mock-tools.js +181 -0
  118. package/dist/simulation/mock-tools.js.map +1 -0
  119. package/dist/simulation/probes.d.ts +17 -0
  120. package/dist/simulation/probes.d.ts.map +1 -0
  121. package/dist/simulation/probes.js +295 -0
  122. package/dist/simulation/probes.js.map +1 -0
  123. package/dist/simulation/types.d.ts +79 -0
  124. package/dist/simulation/types.d.ts.map +1 -0
  125. package/dist/simulation/types.js +25 -0
  126. package/dist/simulation/types.js.map +1 -0
  127. package/package.json +1 -1
@@ -0,0 +1,132 @@
1
+ /**
2
+ * NanoMind Integrity Verifier
3
+ *
4
+ * Startup integrity verification that runs BEFORE any scanning or model loading.
5
+ * Detects tampering of the CLI binary, NanoMind model files, and rule manifests.
6
+ *
7
+ * Three outcomes:
8
+ * CLEAN -- All checks pass, proceed normally
9
+ * DEGRADE -- Model integrity failed, fall back to heuristic scanning (warn user)
10
+ * QUARANTINE -- Package/dist integrity failed, refuse to output, exit code 3
11
+ *
12
+ * Design constraints:
13
+ * - Must complete in < 5ms for unmodified installations
14
+ * - Uses SHA-256 for all hashes, HMAC-SHA256 as Ed25519 fallback
15
+ * - Tamper-evident event chain (append-only JSONL with hash linking)
16
+ * - Model hash verified BEFORE loading into memory
17
+ */
18
+ export type IntegrityStatus = 'CLEAN' | 'QUARANTINE' | 'DEGRADE';
19
+ export interface IntegrityCheck {
20
+ name: string;
21
+ passed: boolean;
22
+ reason?: string;
23
+ }
24
+ export interface IntegrityResult {
25
+ status: IntegrityStatus;
26
+ checks: IntegrityCheck[];
27
+ durationMs: number;
28
+ }
29
+ export interface IntegrityManifest {
30
+ version: string;
31
+ files: Record<string, string>;
32
+ modelHash?: string;
33
+ ruleCategories?: number;
34
+ signature?: string;
35
+ }
36
+ export interface TamperEvent {
37
+ seq: number;
38
+ timestamp: string;
39
+ eventType: 'startup' | 'check_pass' | 'check_fail' | 'tamper_detected' | 'degraded' | 'quarantine';
40
+ detail: string;
41
+ prevHash: string;
42
+ }
43
+ export declare function sha256(data: string | Buffer): string;
44
+ export declare function sha256File(filePath: string): string;
45
+ /**
46
+ * HMAC-SHA256 signature (fallback when Ed25519 keys are unavailable).
47
+ * In production with Ed25519 keys, this would be replaced by Ed25519 sign/verify.
48
+ */
49
+ export declare function hmacSign(data: string, key: string): string;
50
+ export declare function hmacVerify(data: string, key: string, expectedSig: string): boolean;
51
+ /**
52
+ * Load the integrity manifest from the package root.
53
+ * Returns null if no manifest exists (first run or dev mode).
54
+ */
55
+ export declare function loadManifest(packageRoot: string): IntegrityManifest | null;
56
+ /**
57
+ * Generate a manifest from the current state of dist/ files.
58
+ * Used during build/publish to create the signed manifest.
59
+ */
60
+ export declare function generateManifest(packageRoot: string, signingKey?: string): IntegrityManifest;
61
+ export declare class EventChain {
62
+ private chainPath;
63
+ constructor(chainPath?: string);
64
+ /**
65
+ * Append an event to the chain. Each event references the hash of the
66
+ * previous event, forming a tamper-evident linked chain.
67
+ */
68
+ append(eventType: TamperEvent['eventType'], detail: string): TamperEvent;
69
+ /**
70
+ * Read all events from the chain file.
71
+ */
72
+ readAll(): TamperEvent[];
73
+ /**
74
+ * Get the last event in the chain.
75
+ */
76
+ getLastEvent(): TamperEvent | null;
77
+ /**
78
+ * Verify the entire chain is intact. Returns the index of the first
79
+ * broken link, or -1 if the chain is valid.
80
+ *
81
+ * Detects:
82
+ * - Modified events (prevHash mismatch)
83
+ * - Truncated chains (missing events break the link)
84
+ * - Inserted events (sequence number gaps or hash mismatches)
85
+ */
86
+ verify(): {
87
+ valid: boolean;
88
+ brokenAt: number;
89
+ reason?: string;
90
+ };
91
+ }
92
+ /**
93
+ * Verify package dist/ files against the manifest.
94
+ * If any file hash differs, the package has been tampered with.
95
+ */
96
+ export declare function checkPackageIntegrity(packageRoot: string, manifest: IntegrityManifest): IntegrityCheck;
97
+ /**
98
+ * Verify NanoMind GGUF model file hash BEFORE loading.
99
+ * If the model does not exist, the check passes (model is optional).
100
+ * If the model exists but hash differs, return failure (DEGRADE mode).
101
+ */
102
+ export declare function checkModelIntegrity(manifest: IntegrityManifest): IntegrityCheck;
103
+ /**
104
+ * Verify rule manifest integrity.
105
+ * If the manifest specifies a rule category count, verify it matches.
106
+ */
107
+ export declare function checkRuleManifest(manifest: IntegrityManifest): IntegrityCheck;
108
+ /**
109
+ * Verify manifest signature using HMAC-SHA256 (Ed25519 fallback).
110
+ * If no signing key is available, this check is skipped.
111
+ */
112
+ export declare function checkManifestSignature(manifest: IntegrityManifest, signingKey?: string): IntegrityCheck;
113
+ export interface VerifyOptions {
114
+ /** Package root directory (defaults to resolved from this module) */
115
+ packageRoot?: string;
116
+ /** HMAC signing key for manifest signature verification */
117
+ signingKey?: string;
118
+ /** Path to event chain file (defaults to ~/.nanomind/integrity-events.jsonl) */
119
+ eventChainPath?: string;
120
+ /** Custom manifest (for testing) */
121
+ manifest?: IntegrityManifest;
122
+ }
123
+ /**
124
+ * Run all startup integrity checks. Must complete in < 5ms for clean installations.
125
+ *
126
+ * Returns:
127
+ * CLEAN -- All checks passed
128
+ * DEGRADE -- Model integrity failed (heuristic fallback)
129
+ * QUARANTINE -- Package integrity failed (refuse to output, exit code 3)
130
+ */
131
+ export declare function verifyAll(options?: VerifyOptions): IntegrityResult;
132
+ //# sourceMappingURL=integrity-verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrity-verifier.d.ts","sourceRoot":"","sources":["../../../src/nanomind-core/security/integrity-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,437 @@
1
+ "use strict";
2
+ /**
3
+ * NanoMind Integrity Verifier
4
+ *
5
+ * Startup integrity verification that runs BEFORE any scanning or model loading.
6
+ * Detects tampering of the CLI binary, NanoMind model files, and rule manifests.
7
+ *
8
+ * Three outcomes:
9
+ * CLEAN -- All checks pass, proceed normally
10
+ * DEGRADE -- Model integrity failed, fall back to heuristic scanning (warn user)
11
+ * QUARANTINE -- Package/dist integrity failed, refuse to output, exit code 3
12
+ *
13
+ * Design constraints:
14
+ * - Must complete in < 5ms for unmodified installations
15
+ * - Uses SHA-256 for all hashes, HMAC-SHA256 as Ed25519 fallback
16
+ * - Tamper-evident event chain (append-only JSONL with hash linking)
17
+ * - Model hash verified BEFORE loading into memory
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.EventChain = void 0;
21
+ exports.sha256 = sha256;
22
+ exports.sha256File = sha256File;
23
+ exports.hmacSign = hmacSign;
24
+ exports.hmacVerify = hmacVerify;
25
+ exports.loadManifest = loadManifest;
26
+ exports.generateManifest = generateManifest;
27
+ exports.checkPackageIntegrity = checkPackageIntegrity;
28
+ exports.checkModelIntegrity = checkModelIntegrity;
29
+ exports.checkRuleManifest = checkRuleManifest;
30
+ exports.checkManifestSignature = checkManifestSignature;
31
+ exports.verifyAll = verifyAll;
32
+ const node_crypto_1 = require("node:crypto");
33
+ const node_fs_1 = require("node:fs");
34
+ const node_path_1 = require("node:path");
35
+ const node_os_1 = require("node:os");
36
+ // ============================================================================
37
+ // Constants
38
+ // ============================================================================
39
+ const NANOMIND_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.nanomind');
40
+ const MODELS_DIR = (0, node_path_1.join)(NANOMIND_DIR, 'models');
41
+ const EVENT_CHAIN_PATH = (0, node_path_1.join)(NANOMIND_DIR, 'integrity-events.jsonl');
42
+ const MANIFEST_FILENAME = '.integrity-manifest.json';
43
+ const GENESIS_PREV_HASH = '0'.repeat(64);
44
+ // ============================================================================
45
+ // SHA-256 Utilities
46
+ // ============================================================================
47
+ function sha256(data) {
48
+ return (0, node_crypto_1.createHash)('sha256').update(data).digest('hex');
49
+ }
50
+ function sha256File(filePath) {
51
+ const content = (0, node_fs_1.readFileSync)(filePath);
52
+ return sha256(content);
53
+ }
54
+ /**
55
+ * HMAC-SHA256 signature (fallback when Ed25519 keys are unavailable).
56
+ * In production with Ed25519 keys, this would be replaced by Ed25519 sign/verify.
57
+ */
58
+ function hmacSign(data, key) {
59
+ return (0, node_crypto_1.createHmac)('sha256', key).update(data).digest('hex');
60
+ }
61
+ function hmacVerify(data, key, expectedSig) {
62
+ const computed = hmacSign(data, key);
63
+ if (computed.length !== expectedSig.length)
64
+ return false;
65
+ try {
66
+ return (0, node_crypto_1.timingSafeEqual)(Buffer.from(computed, 'hex'), Buffer.from(expectedSig, 'hex'));
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ // ============================================================================
73
+ // Manifest Operations
74
+ // ============================================================================
75
+ /**
76
+ * Load the integrity manifest from the package root.
77
+ * Returns null if no manifest exists (first run or dev mode).
78
+ */
79
+ function loadManifest(packageRoot) {
80
+ const manifestPath = (0, node_path_1.join)(packageRoot, MANIFEST_FILENAME);
81
+ if (!(0, node_fs_1.existsSync)(manifestPath))
82
+ return null;
83
+ try {
84
+ const raw = (0, node_fs_1.readFileSync)(manifestPath, 'utf-8');
85
+ return JSON.parse(raw);
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ /**
92
+ * Generate a manifest from the current state of dist/ files.
93
+ * Used during build/publish to create the signed manifest.
94
+ */
95
+ function generateManifest(packageRoot, signingKey) {
96
+ const pkgJsonPath = (0, node_path_1.join)(packageRoot, 'package.json');
97
+ const pkgJson = JSON.parse((0, node_fs_1.readFileSync)(pkgJsonPath, 'utf-8'));
98
+ const distDir = (0, node_path_1.join)(packageRoot, 'dist');
99
+ const files = {};
100
+ if ((0, node_fs_1.existsSync)(distDir)) {
101
+ collectFileHashes(distDir, distDir, files);
102
+ }
103
+ const manifest = {
104
+ version: pkgJson.version,
105
+ files,
106
+ };
107
+ // Add model hash if model exists
108
+ if ((0, node_fs_1.existsSync)(MODELS_DIR)) {
109
+ const modelFiles = (0, node_fs_1.readdirSync)(MODELS_DIR).filter(f => f.endsWith('.gguf'));
110
+ if (modelFiles.length > 0) {
111
+ manifest.modelHash = sha256File((0, node_path_1.join)(MODELS_DIR, modelFiles[0]));
112
+ }
113
+ }
114
+ // Sign if key provided
115
+ if (signingKey) {
116
+ const payload = canonicalManifestPayload(manifest);
117
+ manifest.signature = hmacSign(payload, signingKey);
118
+ }
119
+ return manifest;
120
+ }
121
+ function collectFileHashes(baseDir, currentDir, out) {
122
+ const entries = (0, node_fs_1.readdirSync)(currentDir, { withFileTypes: true });
123
+ for (const entry of entries) {
124
+ const fullPath = (0, node_path_1.join)(currentDir, entry.name);
125
+ if (entry.isDirectory()) {
126
+ collectFileHashes(baseDir, fullPath, out);
127
+ }
128
+ else if (entry.isFile()) {
129
+ const relative = fullPath.slice(baseDir.length + 1);
130
+ out[relative] = sha256File(fullPath);
131
+ }
132
+ }
133
+ }
134
+ function canonicalManifestPayload(manifest) {
135
+ // Exclude the signature field itself from the payload
136
+ const { signature: _, ...rest } = manifest;
137
+ return JSON.stringify(rest, Object.keys(rest).sort());
138
+ }
139
+ // ============================================================================
140
+ // Tamper-Evident Event Chain
141
+ // ============================================================================
142
+ class EventChain {
143
+ constructor(chainPath = EVENT_CHAIN_PATH) {
144
+ this.chainPath = chainPath;
145
+ }
146
+ /**
147
+ * Append an event to the chain. Each event references the hash of the
148
+ * previous event, forming a tamper-evident linked chain.
149
+ */
150
+ append(eventType, detail) {
151
+ const lastEvent = this.getLastEvent();
152
+ const prevHash = lastEvent
153
+ ? sha256(JSON.stringify(lastEvent))
154
+ : GENESIS_PREV_HASH;
155
+ const event = {
156
+ seq: lastEvent ? lastEvent.seq + 1 : 0,
157
+ timestamp: new Date().toISOString(),
158
+ eventType,
159
+ detail,
160
+ prevHash,
161
+ };
162
+ const dir = (0, node_path_1.dirname)(this.chainPath);
163
+ if (!(0, node_fs_1.existsSync)(dir)) {
164
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
165
+ }
166
+ (0, node_fs_1.appendFileSync)(this.chainPath, JSON.stringify(event) + '\n', 'utf-8');
167
+ return event;
168
+ }
169
+ /**
170
+ * Read all events from the chain file.
171
+ */
172
+ readAll() {
173
+ if (!(0, node_fs_1.existsSync)(this.chainPath))
174
+ return [];
175
+ const raw = (0, node_fs_1.readFileSync)(this.chainPath, 'utf-8').trim();
176
+ if (!raw)
177
+ return [];
178
+ return raw.split('\n').map(line => JSON.parse(line));
179
+ }
180
+ /**
181
+ * Get the last event in the chain.
182
+ */
183
+ getLastEvent() {
184
+ const events = this.readAll();
185
+ return events.length > 0 ? events[events.length - 1] : null;
186
+ }
187
+ /**
188
+ * Verify the entire chain is intact. Returns the index of the first
189
+ * broken link, or -1 if the chain is valid.
190
+ *
191
+ * Detects:
192
+ * - Modified events (prevHash mismatch)
193
+ * - Truncated chains (missing events break the link)
194
+ * - Inserted events (sequence number gaps or hash mismatches)
195
+ */
196
+ verify() {
197
+ const events = this.readAll();
198
+ if (events.length === 0) {
199
+ return { valid: true, brokenAt: -1 };
200
+ }
201
+ // Genesis event must reference the zero hash
202
+ if (events[0].prevHash !== GENESIS_PREV_HASH) {
203
+ return { valid: false, brokenAt: 0, reason: 'Genesis event has wrong prevHash' };
204
+ }
205
+ if (events[0].seq !== 0) {
206
+ return { valid: false, brokenAt: 0, reason: 'Genesis event has wrong sequence number' };
207
+ }
208
+ for (let i = 1; i < events.length; i++) {
209
+ const expectedPrevHash = sha256(JSON.stringify(events[i - 1]));
210
+ if (events[i].prevHash !== expectedPrevHash) {
211
+ return {
212
+ valid: false,
213
+ brokenAt: i,
214
+ reason: `Event ${i}: prevHash mismatch (expected ${expectedPrevHash.slice(0, 16)}..., got ${events[i].prevHash.slice(0, 16)}...)`,
215
+ };
216
+ }
217
+ if (events[i].seq !== i) {
218
+ return {
219
+ valid: false,
220
+ brokenAt: i,
221
+ reason: `Event ${i}: sequence number mismatch (expected ${i}, got ${events[i].seq})`,
222
+ };
223
+ }
224
+ }
225
+ return { valid: true, brokenAt: -1 };
226
+ }
227
+ }
228
+ exports.EventChain = EventChain;
229
+ // ============================================================================
230
+ // Individual Integrity Checks
231
+ // ============================================================================
232
+ /**
233
+ * Verify package dist/ files against the manifest.
234
+ * If any file hash differs, the package has been tampered with.
235
+ */
236
+ function checkPackageIntegrity(packageRoot, manifest) {
237
+ const distDir = (0, node_path_1.join)(packageRoot, 'dist');
238
+ if (!(0, node_fs_1.existsSync)(distDir)) {
239
+ return { name: 'package_integrity', passed: false, reason: 'dist/ directory missing' };
240
+ }
241
+ // Verify version matches
242
+ const pkgJsonPath = (0, node_path_1.join)(packageRoot, 'package.json');
243
+ if ((0, node_fs_1.existsSync)(pkgJsonPath)) {
244
+ try {
245
+ const pkgJson = JSON.parse((0, node_fs_1.readFileSync)(pkgJsonPath, 'utf-8'));
246
+ if (pkgJson.version !== manifest.version) {
247
+ return {
248
+ name: 'package_integrity',
249
+ passed: false,
250
+ reason: `Version mismatch: package.json=${pkgJson.version}, manifest=${manifest.version}`,
251
+ };
252
+ }
253
+ }
254
+ catch {
255
+ return { name: 'package_integrity', passed: false, reason: 'Failed to read package.json' };
256
+ }
257
+ }
258
+ // Verify file hashes
259
+ for (const [relativePath, expectedHash] of Object.entries(manifest.files)) {
260
+ const fullPath = (0, node_path_1.join)(distDir, relativePath);
261
+ if (!(0, node_fs_1.existsSync)(fullPath)) {
262
+ return {
263
+ name: 'package_integrity',
264
+ passed: false,
265
+ reason: `Missing file: dist/${relativePath}`,
266
+ };
267
+ }
268
+ const actualHash = sha256File(fullPath);
269
+ if (actualHash !== expectedHash) {
270
+ return {
271
+ name: 'package_integrity',
272
+ passed: false,
273
+ reason: `Tampered file: dist/${relativePath}`,
274
+ };
275
+ }
276
+ }
277
+ return { name: 'package_integrity', passed: true };
278
+ }
279
+ /**
280
+ * Verify NanoMind GGUF model file hash BEFORE loading.
281
+ * If the model does not exist, the check passes (model is optional).
282
+ * If the model exists but hash differs, return failure (DEGRADE mode).
283
+ */
284
+ function checkModelIntegrity(manifest) {
285
+ if (!manifest.modelHash) {
286
+ return { name: 'model_integrity', passed: true, reason: 'No model hash in manifest (model optional)' };
287
+ }
288
+ if (!(0, node_fs_1.existsSync)(MODELS_DIR)) {
289
+ return { name: 'model_integrity', passed: true, reason: 'No models directory (model optional)' };
290
+ }
291
+ const modelFiles = (0, node_fs_1.readdirSync)(MODELS_DIR).filter(f => f.endsWith('.gguf'));
292
+ if (modelFiles.length === 0) {
293
+ return { name: 'model_integrity', passed: true, reason: 'No model files found (model optional)' };
294
+ }
295
+ const modelPath = (0, node_path_1.join)(MODELS_DIR, modelFiles[0]);
296
+ const actualHash = sha256File(modelPath);
297
+ if (actualHash !== manifest.modelHash) {
298
+ return {
299
+ name: 'model_integrity',
300
+ passed: false,
301
+ reason: `Model hash mismatch: expected ${manifest.modelHash.slice(0, 16)}..., got ${actualHash.slice(0, 16)}...`,
302
+ };
303
+ }
304
+ return { name: 'model_integrity', passed: true };
305
+ }
306
+ /**
307
+ * Verify rule manifest integrity.
308
+ * If the manifest specifies a rule category count, verify it matches.
309
+ */
310
+ function checkRuleManifest(manifest) {
311
+ if (manifest.ruleCategories === undefined) {
312
+ return { name: 'rule_manifest', passed: true, reason: 'No rule category count in manifest' };
313
+ }
314
+ // Count actual rule categories from the scanner rules directory
315
+ // This is a fast check: just count directories in the rules path
316
+ const rulesDir = (0, node_path_1.join)((0, node_path_1.dirname)((0, node_path_1.dirname)(__dirname)), 'rules');
317
+ if (!(0, node_fs_1.existsSync)(rulesDir)) {
318
+ // In dist/ the rules may not exist as a directory, accept the count from manifest
319
+ return { name: 'rule_manifest', passed: true, reason: 'Rules directory not found (packaged mode)' };
320
+ }
321
+ try {
322
+ const categories = (0, node_fs_1.readdirSync)(rulesDir, { withFileTypes: true })
323
+ .filter(d => d.isDirectory())
324
+ .length;
325
+ if (categories !== manifest.ruleCategories) {
326
+ return {
327
+ name: 'rule_manifest',
328
+ passed: false,
329
+ reason: `Rule category count mismatch: expected ${manifest.ruleCategories}, got ${categories}`,
330
+ };
331
+ }
332
+ }
333
+ catch {
334
+ return { name: 'rule_manifest', passed: true, reason: 'Could not enumerate rules (non-critical)' };
335
+ }
336
+ return { name: 'rule_manifest', passed: true };
337
+ }
338
+ /**
339
+ * Verify manifest signature using HMAC-SHA256 (Ed25519 fallback).
340
+ * If no signing key is available, this check is skipped.
341
+ */
342
+ function checkManifestSignature(manifest, signingKey) {
343
+ if (!manifest.signature) {
344
+ return { name: 'manifest_signature', passed: true, reason: 'No signature in manifest (unsigned)' };
345
+ }
346
+ if (!signingKey) {
347
+ return { name: 'manifest_signature', passed: true, reason: 'No signing key available (skipped)' };
348
+ }
349
+ const payload = canonicalManifestPayload(manifest);
350
+ const valid = hmacVerify(payload, signingKey, manifest.signature);
351
+ if (!valid) {
352
+ return {
353
+ name: 'manifest_signature',
354
+ passed: false,
355
+ reason: 'Manifest signature verification failed',
356
+ };
357
+ }
358
+ return { name: 'manifest_signature', passed: true };
359
+ }
360
+ /**
361
+ * Run all startup integrity checks. Must complete in < 5ms for clean installations.
362
+ *
363
+ * Returns:
364
+ * CLEAN -- All checks passed
365
+ * DEGRADE -- Model integrity failed (heuristic fallback)
366
+ * QUARANTINE -- Package integrity failed (refuse to output, exit code 3)
367
+ */
368
+ function verifyAll(options = {}) {
369
+ const start = performance.now();
370
+ const packageRoot = options.packageRoot ?? resolvePackageRoot();
371
+ const eventChain = new EventChain(options.eventChainPath);
372
+ const checks = [];
373
+ // Load manifest
374
+ const manifest = options.manifest ?? loadManifest(packageRoot);
375
+ if (!manifest) {
376
+ // No manifest = development mode or first install. Pass all checks.
377
+ const duration = performance.now() - start;
378
+ checks.push({ name: 'manifest_load', passed: true, reason: 'No manifest found (dev mode)' });
379
+ eventChain.append('startup', `Integrity check: no manifest, dev mode (${duration.toFixed(2)}ms)`);
380
+ return { status: 'CLEAN', checks, durationMs: duration };
381
+ }
382
+ // Run checks in order of severity (most severe first for early determination)
383
+ // 1. Package/dist integrity (QUARANTINE if failed)
384
+ const pkgCheck = checkPackageIntegrity(packageRoot, manifest);
385
+ checks.push(pkgCheck);
386
+ // 2. Manifest signature
387
+ const sigCheck = checkManifestSignature(manifest, options.signingKey);
388
+ checks.push(sigCheck);
389
+ // 3. Model integrity (DEGRADE if failed)
390
+ const modelCheck = checkModelIntegrity(manifest);
391
+ checks.push(modelCheck);
392
+ // 4. Rule manifest
393
+ const ruleCheck = checkRuleManifest(manifest);
394
+ checks.push(ruleCheck);
395
+ // Determine status
396
+ let status = 'CLEAN';
397
+ // QUARANTINE: package tampered or signature invalid
398
+ if (!pkgCheck.passed || !sigCheck.passed) {
399
+ status = 'QUARANTINE';
400
+ }
401
+ // DEGRADE: model tampered (but package is fine)
402
+ else if (!modelCheck.passed) {
403
+ status = 'DEGRADE';
404
+ }
405
+ // Rule manifest failure is a soft degrade
406
+ else if (!ruleCheck.passed) {
407
+ status = 'DEGRADE';
408
+ }
409
+ const duration = performance.now() - start;
410
+ // Log to event chain
411
+ const eventType = status === 'CLEAN' ? 'check_pass'
412
+ : status === 'DEGRADE' ? 'degraded'
413
+ : 'quarantine';
414
+ const failedChecks = checks.filter(c => !c.passed).map(c => c.name).join(', ');
415
+ const detail = status === 'CLEAN'
416
+ ? `All ${checks.length} checks passed (${duration.toFixed(2)}ms)`
417
+ : `Status=${status}, failed=[${failedChecks}] (${duration.toFixed(2)}ms)`;
418
+ eventChain.append(eventType, detail);
419
+ return { status, checks, durationMs: duration };
420
+ }
421
+ /**
422
+ * Resolve the package root by walking up from this file to find package.json.
423
+ */
424
+ function resolvePackageRoot() {
425
+ let dir = __dirname;
426
+ for (let i = 0; i < 10; i++) {
427
+ if ((0, node_fs_1.existsSync)((0, node_path_1.join)(dir, 'package.json'))) {
428
+ return dir;
429
+ }
430
+ const parent = (0, node_path_1.dirname)(dir);
431
+ if (parent === dir)
432
+ break;
433
+ dir = parent;
434
+ }
435
+ return process.cwd();
436
+ }
437
+ //# sourceMappingURL=integrity-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrity-verifier.js","sourceRoot":"","sources":["../../../src/nanomind-core/security/integrity-verifier.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAuDH,wBAEC;AAED,gCAGC;AAMD,4BAEC;AAED,gCAQC;AAUD,oCASC;AAMD,4CAiCC;AAsID,sDAgDC;AAOD,kDAyBC;AAMD,8CA6BC;AAMD,wDAwBC;AAyBD,8BAiEC;AAzfD,6CAAsE;AACtE,qCAA2F;AAC3F,yCAA0C;AAC1C,qCAAkC;AAoClC,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,YAAY,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,WAAW,CAAC,CAAC;AAClD,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAChD,MAAM,gBAAgB,GAAG,IAAA,gBAAI,EAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;AACtE,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AACrD,MAAM,iBAAiB,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEzC,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,SAAgB,MAAM,CAAC,IAAqB;IAC1C,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,UAAU,CAAC,QAAgB;IACzC,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAgB,QAAQ,CAAC,IAAY,EAAE,GAAW;IAChD,OAAO,IAAA,wBAAU,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,SAAgB,UAAU,CAAC,IAAY,EAAE,GAAW,EAAE,WAAmB;IACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACzD,IAAI,CAAC;QACH,OAAO,IAAA,6BAAe,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;;GAGG;AACH,SAAgB,YAAY,CAAC,WAAmB;IAC9C,MAAM,YAAY,GAAG,IAAA,gBAAI,EAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,WAAmB,EACnB,UAAmB;IAEnB,MAAM,WAAW,GAAG,IAAA,gBAAI,EAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAA,gBAAI,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,IAAI,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACxB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAsB;QAClC,OAAO,EAAE,OAAO,CAAC,OAAiB;QAClC,KAAK;KACN,CAAC;IAEF,iCAAiC;IACjC,IAAI,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAA,qBAAW,EAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,IAAA,gBAAI,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACnD,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAe,EACf,UAAkB,EAClB,GAA2B;IAE3B,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpD,GAAG,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,QAA2B;IAC3D,sDAAsD;IACtD,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E,MAAa,UAAU;IAGrB,YAAY,YAAoB,gBAAgB;QAC9C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,SAAmC,EAAE,MAAc;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,SAAS;YACxB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACnC,CAAC,CAAC,iBAAiB,CAAC;QAEtB,MAAM,KAAK,GAAgB;YACzB,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS;YACT,MAAM;YACN,QAAQ;SACT,CAAC;QAEF,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;YACrB,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,IAAA,wBAAc,EAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,YAAY;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;QACvC,CAAC;QAED,6CAA6C;QAC7C,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YAC7C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC;QACnF,CAAC;QAED,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC;QAC1F,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;gBAC5C,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,SAAS,CAAC,iCAAiC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM;iBAClI,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,SAAS,CAAC,wCAAwC,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;iBACrF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC;CACF;AA/FD,gCA+FC;AAED,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E;;;GAGG;AACH,SAAgB,qBAAqB,CACnC,WAAmB,EACnB,QAA2B;IAE3B,MAAM,OAAO,GAAG,IAAA,gBAAI,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE1C,IAAI,CAAC,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IACzF,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAG,IAAA,gBAAI,EAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,IAAA,oBAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACzC,OAAO;oBACL,IAAI,EAAE,mBAAmB;oBACzB,MAAM,EAAE,KAAK;oBACb,MAAM,EAAE,kCAAkC,OAAO,CAAC,OAAO,cAAc,QAAQ,CAAC,OAAO,EAAE;iBAC1F,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,KAAK,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1E,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAA,oBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,IAAI,EAAE,mBAAmB;gBACzB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,sBAAsB,YAAY,EAAE;aAC7C,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YAChC,OAAO;gBACL,IAAI,EAAE,mBAAmB;gBACzB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,uBAAuB,YAAY,EAAE;aAC9C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,QAA2B;IAC7D,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,4CAA4C,EAAE,CAAC;IACzG,CAAC;IAED,IAAI,CAAC,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,sCAAsC,EAAE,CAAC;IACnG,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,qBAAW,EAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,uCAAuC,EAAE,CAAC;IACpG,CAAC;IAED,MAAM,SAAS,GAAG,IAAA,gBAAI,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,UAAU,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,iCAAiC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK;SACjH,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,QAA2B;IAC3D,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC;IAC/F,CAAC;IAED,gEAAgE;IAChE,iEAAiE;IACjE,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,IAAA,mBAAO,EAAC,IAAA,mBAAO,EAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAA,oBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,kFAAkF;QAClF,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC;IACtG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAA,qBAAW,EAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC5B,MAAM,CAAC;QACV,IAAI,UAAU,KAAK,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC3C,OAAO;gBACL,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,0CAA0C,QAAQ,CAAC,cAAc,SAAS,UAAU,EAAE;aAC/F,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,0CAA0C,EAAE,CAAC;IACrG,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CACpC,QAA2B,EAC3B,UAAmB;IAEnB,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;IACrG,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC;IACpG,CAAC;IAED,MAAM,OAAO,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAElE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,wCAAwC;SACjD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACtD,CAAC;AAiBD;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,UAAyB,EAAE;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEhC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,gBAAgB;IAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;IAE/D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,oEAAoE;QACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC,CAAC;QAC7F,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,2CAA2C,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IAC3D,CAAC;IAED,8EAA8E;IAE9E,mDAAmD;IACnD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEtB,wBAAwB;IACxB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEtB,yCAAyC;IACzC,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAExB,mBAAmB;IACnB,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvB,mBAAmB;IACnB,IAAI,MAAM,GAAoB,OAAO,CAAC;IAEtC,oDAAoD;IACpD,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACzC,MAAM,GAAG,YAAY,CAAC;IACxB,CAAC;IACD,gDAAgD;SAC3C,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IACD,0CAA0C;SACrC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAE3C,qBAAqB;IACrB,MAAM,SAAS,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY;QACjD,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU;YACnC,CAAC,CAAC,YAAY,CAAC;IACjB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,MAAM,KAAK,OAAO;QAC/B,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,mBAAmB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;QACjE,CAAC,CAAC,UAAU,MAAM,aAAa,YAAY,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5E,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAErC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,IAAI,GAAG,GAAG,SAAS,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC1C,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC"}