@shield-agent/kya 0.24.2 → 0.25.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 (86) hide show
  1. package/.cursor-plugin/plugin.json +1 -1
  2. package/.mcp.json +1 -1
  3. package/LIMITATIONS.md +3 -3
  4. package/README.md +27 -5
  5. package/amp/README.md +2 -2
  6. package/amp/settings.example.json +1 -1
  7. package/claude/claude_desktop_config.example.json +1 -1
  8. package/claude/run-stdio.mjs +1 -1
  9. package/cline/README.md +1 -1
  10. package/cline/cline_mcp_settings.example.json +1 -1
  11. package/copilot/README.md +1 -1
  12. package/copilot/mcp-config.example.json +1 -1
  13. package/dist/cli.d.ts +1 -1
  14. package/dist/cli.d.ts.map +1 -1
  15. package/dist/cli.js +14 -3
  16. package/dist/cli.js.map +1 -1
  17. package/dist/commands/discover.d.ts +21 -0
  18. package/dist/commands/discover.d.ts.map +1 -0
  19. package/dist/commands/discover.js +140 -0
  20. package/dist/commands/discover.js.map +1 -0
  21. package/dist/commands/import-traces.js +2 -2
  22. package/dist/commands/import-traces.js.map +1 -1
  23. package/dist/discover/catalog.d.ts +30 -0
  24. package/dist/discover/catalog.d.ts.map +1 -0
  25. package/dist/discover/catalog.js +166 -0
  26. package/dist/discover/catalog.js.map +1 -0
  27. package/dist/discover/push.d.ts +21 -0
  28. package/dist/discover/push.d.ts.map +1 -0
  29. package/dist/discover/push.js +40 -0
  30. package/dist/discover/push.js.map +1 -0
  31. package/dist/discover/scan.d.ts +74 -0
  32. package/dist/discover/scan.d.ts.map +1 -0
  33. package/dist/discover/scan.js +448 -0
  34. package/dist/discover/scan.js.map +1 -0
  35. package/dist/discover/snapshot.d.ts +32 -0
  36. package/dist/discover/snapshot.d.ts.map +1 -0
  37. package/dist/discover/snapshot.js +92 -0
  38. package/dist/discover/snapshot.js.map +1 -0
  39. package/dist/importers/adr-sensor.d.ts +12 -0
  40. package/dist/importers/adr-sensor.d.ts.map +1 -0
  41. package/dist/importers/adr-sensor.js +272 -0
  42. package/dist/importers/adr-sensor.js.map +1 -0
  43. package/dist/importers/formats.d.ts.map +1 -1
  44. package/dist/importers/formats.js +4 -0
  45. package/dist/importers/formats.js.map +1 -1
  46. package/dist/importers/index.d.ts.map +1 -1
  47. package/dist/importers/index.js +3 -0
  48. package/dist/importers/index.js.map +1 -1
  49. package/dist/receipt/enrich.d.ts +12 -0
  50. package/dist/receipt/enrich.d.ts.map +1 -1
  51. package/dist/receipt/enrich.js +30 -0
  52. package/dist/receipt/enrich.js.map +1 -1
  53. package/dist/receipt/live-server.d.ts +2 -0
  54. package/dist/receipt/live-server.d.ts.map +1 -1
  55. package/dist/receipt/live-server.js +28 -2
  56. package/dist/receipt/live-server.js.map +1 -1
  57. package/dist/receipt/render-receipt.d.ts +3 -1
  58. package/dist/receipt/render-receipt.d.ts.map +1 -1
  59. package/dist/receipt/render-receipt.js +48 -7
  60. package/dist/receipt/render-receipt.js.map +1 -1
  61. package/dist/trail.d.ts +1 -1
  62. package/dist/trail.d.ts.map +1 -1
  63. package/dist/trail.js +1 -1
  64. package/dist/trail.js.map +1 -1
  65. package/droid/README.md +3 -3
  66. package/droid/mcp.example.json +1 -1
  67. package/gemini/settings.example.json +1 -1
  68. package/grok/README.md +1 -1
  69. package/kilo/README.md +1 -1
  70. package/kilo/kilo.example.json +1 -1
  71. package/kimi/README.md +1 -1
  72. package/kimi/mcp.example.json +1 -1
  73. package/kiro/README.md +1 -1
  74. package/kiro/mcp.example.json +1 -1
  75. package/manifest.json +1 -1
  76. package/mastracode/README.md +1 -1
  77. package/mastracode/mcp.example.json +1 -1
  78. package/mcp.json +1 -1
  79. package/openai/codex.config.example.toml +2 -2
  80. package/openai/responses-mcp.example.json +1 -1
  81. package/opencode/README.md +1 -1
  82. package/opencode/opencode.example.json +1 -1
  83. package/package.json +2 -2
  84. package/qwen/README.md +1 -1
  85. package/qwen/settings.example.json +1 -1
  86. package/server.json +2 -2
@@ -0,0 +1,448 @@
1
+ /**
2
+ * Endpoint discovery scanner.
3
+ *
4
+ * Collects a best-effort inventory of AI agents, IDE extensions, desktop apps,
5
+ * model runtimes, and MCP servers present on the local workstation. The scanner
6
+ * only inspects paths and config files; it never executes discovered binaries
7
+ * and never connects to runtime ports.
8
+ */
9
+ import { createHash } from "node:crypto";
10
+ import { constants } from "node:fs";
11
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
12
+ import { homedir, hostname, userInfo } from "node:os";
13
+ import { join, sep } from "node:path";
14
+ import { discoveryCatalog, knownDiscoveryVendors } from "./catalog.js";
15
+ const ATTEMPTED_CATEGORIES = [
16
+ "cli-binaries",
17
+ "ide-extensions",
18
+ "desktop-apps",
19
+ "model-runtimes",
20
+ "mcp-servers",
21
+ ];
22
+ function nodeFs() {
23
+ return { existsSync, statSync, readdirSync, readFileSync };
24
+ }
25
+ function defaultPathDirs(env) {
26
+ const raw = env.PATH ?? "";
27
+ return raw
28
+ .split(process.platform === "win32" ? ";" : ":")
29
+ .map((p) => p.trim())
30
+ .filter((p) => p.length > 0);
31
+ }
32
+ function sha256(input) {
33
+ return createHash("sha256").update(input).digest("hex");
34
+ }
35
+ function detectOs(raw) {
36
+ const p = raw ?? process.platform;
37
+ if (p === "darwin")
38
+ return "darwin";
39
+ if (p === "linux")
40
+ return "linux";
41
+ if (p === "win32")
42
+ return "win32";
43
+ return "unknown";
44
+ }
45
+ function redactValue(value, home) {
46
+ if (typeof value === "string") {
47
+ const prefix = home.endsWith(sep) ? home : home + sep;
48
+ if (value === home)
49
+ return "~";
50
+ if (value.startsWith(prefix))
51
+ return "~" + sep + value.slice(prefix.length);
52
+ }
53
+ return value;
54
+ }
55
+ function redactEvidence(evidence, home) {
56
+ const out = {};
57
+ for (const [key, value] of Object.entries(evidence)) {
58
+ out[key] = redactValue(value, home);
59
+ }
60
+ return out;
61
+ }
62
+ function isExecutable(st, isWindows) {
63
+ if (!st.isFile())
64
+ return false;
65
+ if (isWindows)
66
+ return true; // extension check is done by caller
67
+ // eslint-disable-next-line no-bitwise
68
+ return (st.mode & constants.S_IXUSR) !== 0 || (st.mode & constants.S_IXOTH) !== 0;
69
+ }
70
+ function isWindowsPlatform(platformName) {
71
+ return platformName === "win32";
72
+ }
73
+ export function buildEndpointId(os) {
74
+ const host = hostname();
75
+ const user = userInfo().username;
76
+ const hostnameHash = sha256(host);
77
+ const userHash = sha256(user);
78
+ const stableId = `${os}:${hostnameHash}:${userHash}`;
79
+ return { endpointUid: sha256(stableId), hostnameHash };
80
+ }
81
+ function pathCandidates(pathDirs) {
82
+ const catalog = discoveryCatalog();
83
+ const candidates = [];
84
+ for (const [entryId, entry] of catalog) {
85
+ for (const binary of entry.binaries) {
86
+ for (const dir of pathDirs) {
87
+ candidates.push({ entryId, binary, path: join(dir, binary) });
88
+ }
89
+ }
90
+ }
91
+ return candidates;
92
+ }
93
+ function extensionRootDirs(home, platformName) {
94
+ if (isWindowsPlatform(platformName)) {
95
+ const appdata = process.env.APPDATA ?? join(home, "AppData", "Roaming");
96
+ return [
97
+ join(appdata, "Cursor", "User", "globalStorage"),
98
+ join(appdata, "Code", "User", "globalStorage"),
99
+ ];
100
+ }
101
+ if (platformName === "darwin") {
102
+ return [
103
+ join(home, "Library", "Application Support", "Cursor", "User", "globalStorage"),
104
+ join(home, "Library", "Application Support", "Code", "User", "globalStorage"),
105
+ ];
106
+ }
107
+ return [
108
+ join(home, ".config", "Cursor", "User", "globalStorage"),
109
+ join(home, ".config", "Code", "User", "globalStorage"),
110
+ ];
111
+ }
112
+ function desktopAppDirs(platformName) {
113
+ if (platformName === "darwin")
114
+ return ["/Applications"];
115
+ if (platformName === "linux")
116
+ return ["/usr/share/applications", "/usr/local/share/applications"];
117
+ if (isWindowsPlatform(platformName)) {
118
+ const pf = process.env["ProgramFiles"] ?? "C:\\Program Files";
119
+ const pf86 = process.env["ProgramFiles(x86)"] ?? "C:\\Program Files (x86)";
120
+ return [pf, pf86];
121
+ }
122
+ return [];
123
+ }
124
+ function tryReadJsonFile(fs, path) {
125
+ try {
126
+ return JSON.parse(fs.readFileSync(path, "utf8"));
127
+ }
128
+ catch {
129
+ return undefined;
130
+ }
131
+ }
132
+ export function scanCliBinaries(pathDirs, fs, platformName) {
133
+ const findings = [];
134
+ const catalog = discoveryCatalog();
135
+ const seen = new Set();
136
+ const isWin = isWindowsPlatform(platformName);
137
+ for (const { entryId, path } of pathCandidates(pathDirs)) {
138
+ const key = `${entryId}:${path}`;
139
+ if (seen.has(key))
140
+ continue;
141
+ seen.add(key);
142
+ try {
143
+ const st = fs.statSync(path);
144
+ const candidatePath = isWin && !path.toLowerCase().endsWith(".exe") ? `${path}.exe` : path;
145
+ const candidateSt = candidatePath !== path && fs.existsSync(candidatePath)
146
+ ? fs.statSync(candidatePath)
147
+ : st;
148
+ if (!isExecutable(candidateSt, isWin))
149
+ continue;
150
+ const entry = catalog.get(entryId);
151
+ findings.push({
152
+ id: entryId,
153
+ name: entry.name,
154
+ vendor: entry.vendor,
155
+ category: entry.category,
156
+ source: `PATH:${path}`,
157
+ confidence: "high",
158
+ evidence: { path: candidatePath },
159
+ });
160
+ }
161
+ catch {
162
+ /* not found or not readable */
163
+ }
164
+ }
165
+ return findings;
166
+ }
167
+ export function scanIdeExtensions(extensionRoots, fs) {
168
+ const findings = [];
169
+ const catalog = discoveryCatalog();
170
+ const vendors = knownDiscoveryVendors();
171
+ const seen = new Set();
172
+ for (const root of extensionRoots) {
173
+ let entries = [];
174
+ try {
175
+ entries = fs.readdirSync(root);
176
+ }
177
+ catch {
178
+ continue;
179
+ }
180
+ for (const extId of entries) {
181
+ const lower = extId.toLowerCase();
182
+ let matchedEntry;
183
+ let confidence = "low";
184
+ for (const [id, entry] of catalog) {
185
+ for (const marker of entry.extensionMarkers) {
186
+ if (lower.includes(marker.toLowerCase())) {
187
+ matchedEntry = { id, name: entry.name, vendor: entry.vendor, category: entry.category };
188
+ confidence = marker === entry.id ? "medium" : "low";
189
+ break;
190
+ }
191
+ }
192
+ if (matchedEntry)
193
+ break;
194
+ }
195
+ if (!matchedEntry) {
196
+ // Generic vendor match: still report as ide-extension with unknown id.
197
+ const vendor = vendors.find((v) => lower.includes(v));
198
+ if (vendor) {
199
+ matchedEntry = {
200
+ id: `ide-ext-${vendor}`,
201
+ name: `${vendor} extension`,
202
+ vendor,
203
+ category: "ide-extension",
204
+ };
205
+ confidence = "low";
206
+ }
207
+ }
208
+ if (!matchedEntry)
209
+ continue;
210
+ const key = `${matchedEntry.id}:${extId}`;
211
+ if (seen.has(key))
212
+ continue;
213
+ seen.add(key);
214
+ findings.push({
215
+ id: matchedEntry.id,
216
+ name: matchedEntry.name,
217
+ vendor: matchedEntry.vendor,
218
+ category: matchedEntry.category,
219
+ source: `IDE-EXT:${root}`,
220
+ confidence,
221
+ evidence: { path: join(root, extId) },
222
+ });
223
+ }
224
+ }
225
+ return findings;
226
+ }
227
+ export function scanDesktopApps(appDirs, fs, platformName) {
228
+ const findings = [];
229
+ const catalog = discoveryCatalog();
230
+ const seen = new Set();
231
+ for (const dir of appDirs) {
232
+ let entries = [];
233
+ try {
234
+ entries = fs.readdirSync(dir);
235
+ }
236
+ catch {
237
+ continue;
238
+ }
239
+ for (const name of entries) {
240
+ const lower = name.toLowerCase();
241
+ let matchedEntry;
242
+ for (const [id, entry] of catalog) {
243
+ for (const appName of entry.appNames) {
244
+ if (lower.includes(appName.toLowerCase())) {
245
+ matchedEntry = { id, name: entry.name, vendor: entry.vendor, category: "desktop-app" };
246
+ break;
247
+ }
248
+ }
249
+ if (matchedEntry)
250
+ break;
251
+ }
252
+ if (!matchedEntry)
253
+ continue;
254
+ const key = `${matchedEntry.id}:${name}`;
255
+ if (seen.has(key))
256
+ continue;
257
+ seen.add(key);
258
+ findings.push({
259
+ id: matchedEntry.id,
260
+ name: matchedEntry.name,
261
+ vendor: matchedEntry.vendor,
262
+ category: "desktop-app",
263
+ source: `APP:${dir}`,
264
+ confidence: platformName === "darwin" ? "high" : "medium",
265
+ evidence: { path: join(dir, name) },
266
+ });
267
+ }
268
+ }
269
+ return findings;
270
+ }
271
+ export function scanModelRuntimes(pathDirs, fs, platformName) {
272
+ const findings = [];
273
+ const catalog = discoveryCatalog();
274
+ const seen = new Set();
275
+ const isWin = isWindowsPlatform(platformName);
276
+ for (const [entryId, entry] of catalog) {
277
+ if (entry.category !== "model-runtime")
278
+ continue;
279
+ let foundPath;
280
+ for (const binary of entry.binaries) {
281
+ for (const dir of pathDirs) {
282
+ const p = join(dir, binary);
283
+ try {
284
+ const st = fs.statSync(p);
285
+ if (isExecutable(st, isWin)) {
286
+ foundPath = p;
287
+ break;
288
+ }
289
+ }
290
+ catch {
291
+ // Try .exe on Windows.
292
+ if (isWin) {
293
+ const pe = `${p}.exe`;
294
+ try {
295
+ const st = fs.statSync(pe);
296
+ if (isExecutable(st, isWin)) {
297
+ foundPath = pe;
298
+ break;
299
+ }
300
+ }
301
+ catch {
302
+ /* ignore */
303
+ }
304
+ }
305
+ }
306
+ }
307
+ if (foundPath)
308
+ break;
309
+ }
310
+ if (foundPath) {
311
+ for (const port of entry.defaultPorts) {
312
+ const key = `${entryId}:${port}`;
313
+ if (seen.has(key))
314
+ continue;
315
+ seen.add(key);
316
+ findings.push({
317
+ id: entryId,
318
+ name: entry.name,
319
+ vendor: entry.vendor,
320
+ category: "model-runtime",
321
+ source: `RUNTIME:${foundPath}`,
322
+ confidence: "medium",
323
+ evidence: { path: foundPath, port },
324
+ });
325
+ }
326
+ if (entry.defaultPorts.length === 0) {
327
+ const key = `${entryId}:${foundPath}`;
328
+ if (!seen.has(key)) {
329
+ seen.add(key);
330
+ findings.push({
331
+ id: entryId,
332
+ name: entry.name,
333
+ vendor: entry.vendor,
334
+ category: "model-runtime",
335
+ source: `RUNTIME:${foundPath}`,
336
+ confidence: "medium",
337
+ evidence: { path: foundPath },
338
+ });
339
+ }
340
+ }
341
+ }
342
+ }
343
+ return findings;
344
+ }
345
+ function collectMcpServersFromObject(obj) {
346
+ if (!obj || typeof obj !== "object")
347
+ return [];
348
+ const servers = obj["mcpServers"] ?? obj["servers"];
349
+ if (!servers || typeof servers !== "object" || Array.isArray(servers))
350
+ return [];
351
+ const out = [];
352
+ for (const [name, value] of Object.entries(servers)) {
353
+ if (!value || typeof value !== "object")
354
+ continue;
355
+ const v = value;
356
+ const command = typeof v.command === "string" ? v.command : undefined;
357
+ const url = typeof v.url === "string" ? v.url : undefined;
358
+ const args = Array.isArray(v.args)
359
+ ? v.args.filter((a) => typeof a === "string")
360
+ : undefined;
361
+ out.push({ name, command, args, url });
362
+ }
363
+ return out;
364
+ }
365
+ export function scanMcpServers(configPaths, fs) {
366
+ const findings = [];
367
+ const seen = new Set();
368
+ for (const configPath of configPaths) {
369
+ const raw = tryReadJsonFile(fs, configPath);
370
+ const servers = collectMcpServersFromObject(raw);
371
+ for (const server of servers) {
372
+ const key = `${server.name}:${configPath}`;
373
+ if (seen.has(key))
374
+ continue;
375
+ seen.add(key);
376
+ const command = server.command ?? server.url ?? "unknown";
377
+ findings.push({
378
+ id: "mcpserver",
379
+ name: server.name,
380
+ vendor: "unknown",
381
+ category: "mcp-server",
382
+ source: `MCP:${configPath}`,
383
+ confidence: "high",
384
+ evidence: {
385
+ configPath,
386
+ command,
387
+ ...(server.args ? { args: server.args.join(" ") } : {}),
388
+ },
389
+ });
390
+ }
391
+ }
392
+ return findings;
393
+ }
394
+ function mcpConfigPaths(home, cwd) {
395
+ return [
396
+ join(cwd, ".mcp.json"),
397
+ join(cwd, "mcp.json"),
398
+ join(cwd, ".cursor", "mcp.json"),
399
+ join(home, ".mcp.json"),
400
+ join(home, "mcp.json"),
401
+ join(home, ".cursor", "mcp.json"),
402
+ ];
403
+ }
404
+ export function scanEndpoint(options = {}) {
405
+ const env = options.env ?? process.env;
406
+ const cwd = options.cwd ?? process.cwd();
407
+ const platformName = options.platform ?? process.platform;
408
+ const fs = options.fs ?? nodeFs();
409
+ const home = options.homeDir ?? homedir();
410
+ const os = detectOs(platformName);
411
+ const { endpointUid, hostnameHash } = buildEndpointId(os);
412
+ const pathDirs = options.pathDirs ?? defaultPathDirs(env);
413
+ const extensionRoots = extensionRootDirs(home, platformName);
414
+ const appDirs = desktopAppDirs(platformName);
415
+ const mcpPaths = mcpConfigPaths(home, cwd);
416
+ const unavailable = [];
417
+ if (pathDirs.length === 0)
418
+ unavailable.push("cli-binaries");
419
+ const cliFindings = scanCliBinaries(pathDirs, fs, platformName);
420
+ const extFindings = scanIdeExtensions(extensionRoots, fs);
421
+ const appFindings = scanDesktopApps(appDirs, fs, platformName);
422
+ const runtimeFindings = scanModelRuntimes(pathDirs, fs, platformName);
423
+ const mcpFindings = scanMcpServers(mcpPaths, fs);
424
+ const all = [
425
+ ...cliFindings,
426
+ ...extFindings,
427
+ ...appFindings,
428
+ ...runtimeFindings,
429
+ ...mcpFindings,
430
+ ];
431
+ const inventory = all.map((f) => ({
432
+ ...f,
433
+ evidence: redactEvidence(f.evidence, home),
434
+ }));
435
+ return {
436
+ endpointUid,
437
+ hostnameHash,
438
+ os,
439
+ capturedAt: (options.now ?? new Date()).toISOString(),
440
+ inventory,
441
+ coverage: {
442
+ attempted: [...ATTEMPTED_CATEGORIES],
443
+ unavailable,
444
+ truncated: false,
445
+ },
446
+ };
447
+ }
448
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/discover/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AA0DvE,MAAM,oBAAoB,GAAG;IAC3B,cAAc;IACd,gBAAgB;IAChB,cAAc;IACd,gBAAgB;IAChB,aAAa;CACL,CAAC;AAEX,SAAS,MAAM;IACb,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,eAAe,CAAC,GAAsB;IAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAC3B,OAAO,GAAG;SACP,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAC,GAAY;IAC5B,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACpC,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAClC,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAClC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,IAAY;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;QACtD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,GAAG,CAAC;QAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,QAA2B,EAAE,IAAY;IAC/D,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAwB,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,EAAuC,EAAE,SAAkB;IAC/E,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC,CAAC,oCAAoC;IAChE,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,iBAAiB,CAAC,YAAoB;IAC7C,OAAO,YAAY,KAAK,OAAO,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAA2B;IAIzD,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACjC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;IACrD,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;AACzD,CAAC;AAQD,SAAS,cAAc,CAAC,QAA2B;IACjD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,YAAoB;IAC3D,IAAI,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxE,OAAO;YACL,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC;YAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC;SAC/C,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC;YAC/E,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC;SAC9E,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC;QACxD,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,YAAoB;IAC1C,IAAI,YAAY,KAAK,QAAQ;QAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACxD,IAAI,YAAY,KAAK,OAAO;QAAE,OAAO,CAAC,yBAAyB,EAAE,+BAA+B,CAAC,CAAC;IAClG,IAAI,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,mBAAmB,CAAC;QAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,yBAAyB,CAAC;QAC3E,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,EAAU,EAAE,IAAY;IAC/C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,QAA2B,EAC3B,EAAU,EACV,YAAoB;IAEpB,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC9C,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,aAAa,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3F,MAAM,WAAW,GAAG,aAAa,KAAK,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;gBACxE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAC5B,CAAC,CAAC,EAAE,CAAC;YACP,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC;gBAAE,SAAS;YAChD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,QAAQ,IAAI,EAAE;gBACtB,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;aAClC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,cAAiC,EACjC,EAAU;IAEV,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,OAAO,GAAsB,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,YAAmG,CAAC;YACxG,IAAI,UAAU,GAAe,KAAK,CAAC;YACnC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBAClC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;oBAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;wBACzC,YAAY,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;wBACxF,UAAU,GAAG,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;wBACpD,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,YAAY;oBAAE,MAAM;YAC1B,CAAC;YACD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,uEAAuE;gBACvE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,IAAI,MAAM,EAAE,CAAC;oBACX,YAAY,GAAG;wBACb,EAAE,EAAE,WAAW,MAAM,EAAE;wBACvB,IAAI,EAAE,GAAG,MAAM,YAAY;wBAC3B,MAAM;wBACN,QAAQ,EAAE,eAAe;qBAC1B,CAAC;oBACF,UAAU,GAAG,KAAK,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,IAAI,CAAC,YAAY;gBAAE,SAAS;YAC5B,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,YAAY,CAAC,EAAE;gBACnB,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,MAAM,EAAE,WAAW,IAAI,EAAE;gBACzB,UAAU;gBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;aACtC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAA0B,EAC1B,EAAU,EACV,YAAoB;IAEpB,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAsB,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,IAAI,YAAmG,CAAC;YACxG,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBAClC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACrC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;wBAC1C,YAAY,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;wBACvF,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,YAAY;oBAAE,MAAM;YAC1B,CAAC;YACD,IAAI,CAAC,YAAY;gBAAE,SAAS;YAC5B,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,YAAY,CAAC,EAAE;gBACnB,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,QAAQ,EAAE,aAAa;gBACvB,MAAM,EAAE,OAAO,GAAG,EAAE;gBACpB,UAAU,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;gBACzD,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAA2B,EAC3B,EAAU,EACV,YAAoB;IAEpB,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,QAAQ,KAAK,eAAe;YAAE,SAAS;QACjD,IAAI,SAA6B,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC1B,IAAI,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;wBAC5B,SAAS,GAAG,CAAC,CAAC;wBACd,MAAM;oBACR,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,uBAAuB;oBACvB,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;wBACtB,IAAI,CAAC;4BACH,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;4BAC3B,IAAI,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;gCAC5B,SAAS,GAAG,EAAE,CAAC;gCACf,MAAM;4BACR,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,YAAY;wBACd,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,SAAS;gBAAE,MAAM;QACvB,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACtC,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;gBACjC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,QAAQ,EAAE,eAAe;oBACzB,MAAM,EAAE,WAAW,SAAS,EAAE;oBAC9B,UAAU,EAAE,QAAQ;oBACpB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACd,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,OAAO;wBACX,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,QAAQ,EAAE,eAAe;wBACzB,MAAM,EAAE,WAAW,SAAS,EAAE;wBAC9B,UAAU,EAAE,QAAQ;wBACpB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;qBAC9B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AASD,SAAS,2BAA2B,CAAC,GAAY;IAC/C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAI,GAA+B,CAAC,YAAY,CAAC,IAAK,GAA+B,CAAC,SAAS,CAAC,CAAC;IAC9G,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACjF,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YAChC,CAAC,CAAE,CAAC,CAAC,IAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YACzE,CAAC,CAAC,SAAS,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,WAA8B,EAC9B,EAAU;IAEV,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;QACjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,UAAU,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,WAAW;gBACf,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,OAAO,UAAU,EAAE;gBAC3B,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE;oBACR,UAAU;oBACV,OAAO;oBACP,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxD;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,GAAW;IAC/C,OAAO;QACL,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC;QACtB,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC;QACrB,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAuB,EAAE;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAC1D,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAClC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAE5D,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,iBAAiB,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,eAAe,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEjD,MAAM,GAAG,GAAG;QACV,GAAG,WAAW;QACd,GAAG,WAAW;QACd,GAAG,WAAW;QACd,GAAG,eAAe;QAClB,GAAG,WAAW;KACf,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,GAAG,CAAC;QACJ,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC;KAC3C,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,WAAW;QACX,YAAY;QACZ,EAAE;QACF,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;QACrD,SAAS;QACT,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC,GAAG,oBAAoB,CAAC;YACpC,WAAW;YACX,SAAS,EAAE,KAAK;SACjB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Local snapshot persistence for endpoint discovery.
3
+ *
4
+ * Writes timestamped discovery JSON under ~/.kya/discovery/ and keeps a
5
+ * `latest.json` copy for the receipt card and diff comparisons.
6
+ */
7
+ import type { DiscoveryFinding, DiscoverySnapshot } from "./scan.js";
8
+ export interface SnapshotFs {
9
+ mkdirSync(path: string, options: {
10
+ recursive: boolean;
11
+ }): void;
12
+ writeFileSync(path: string, data: string, encoding: "utf8"): void;
13
+ readFileSync(path: string, encoding: "utf8"): string;
14
+ existsSync(path: string): boolean;
15
+ }
16
+ export declare function snapshotDir(env?: NodeJS.ProcessEnv): string;
17
+ export declare function writeDiscoverySnapshot(snapshot: DiscoverySnapshot, env?: NodeJS.ProcessEnv, fs?: SnapshotFs): {
18
+ path: string;
19
+ latestPath: string;
20
+ };
21
+ export declare function loadDiscoverySnapshot(path: string, fs?: Pick<SnapshotFs, "existsSync" | "readFileSync">): DiscoverySnapshot | undefined;
22
+ export declare function loadLatestDiscoverySnapshot(env?: NodeJS.ProcessEnv, fs?: Pick<SnapshotFs, "existsSync" | "readFileSync">): DiscoverySnapshot | undefined;
23
+ export interface DiscoveryDiff {
24
+ readonly added: readonly DiscoveryFinding[];
25
+ readonly removed: readonly DiscoveryFinding[];
26
+ readonly changed: readonly {
27
+ current: DiscoveryFinding;
28
+ previous: DiscoveryFinding;
29
+ }[];
30
+ }
31
+ export declare function diffDiscoverySnapshots(current: DiscoverySnapshot, previous: DiscoverySnapshot): DiscoveryDiff;
32
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/discover/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/D,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAClE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IACrD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAExE;AAMD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,EAAE,GAAE,UAAgC,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAStC;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,EAAE,GAAE,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,cAAc,CAAuB,GACxE,iBAAiB,GAAG,SAAS,CAW/B;AAED,wBAAgB,2BAA2B,CACzC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,EAAE,GAAE,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,cAAc,CAAuB,GACxE,iBAAiB,GAAG,SAAS,CAE/B;AAUD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,OAAO,EAAE,gBAAgB,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAA;KAAE,EAAE,CAAC;CACxF;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,iBAAiB,GAC1B,aAAa,CAwCf"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Local snapshot persistence for endpoint discovery.
3
+ *
4
+ * Writes timestamped discovery JSON under ~/.kya/discovery/ and keeps a
5
+ * `latest.json` copy for the receipt card and diff comparisons.
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { globalConfigDir } from "../config.js";
10
+ export function snapshotDir(env = process.env) {
11
+ return join(globalConfigDir(env), "discovery");
12
+ }
13
+ function isoTimestamp(snapshot) {
14
+ return snapshot.capturedAt.replace(/[:.]/g, "-");
15
+ }
16
+ export function writeDiscoverySnapshot(snapshot, env = process.env, fs = defaultSnapshotFs()) {
17
+ const dir = snapshotDir(env);
18
+ fs.mkdirSync(dir, { recursive: true });
19
+ const timestamped = join(dir, `${isoTimestamp(snapshot)}.json`);
20
+ const latestPath = join(dir, "latest.json");
21
+ const payload = `${JSON.stringify(snapshot, null, 2)}\n`;
22
+ fs.writeFileSync(timestamped, payload, "utf8");
23
+ fs.writeFileSync(latestPath, payload, "utf8");
24
+ return { path: timestamped, latestPath };
25
+ }
26
+ export function loadDiscoverySnapshot(path, fs = defaultSnapshotFs()) {
27
+ try {
28
+ if (!fs.existsSync(path))
29
+ return undefined;
30
+ const raw = JSON.parse(fs.readFileSync(path, "utf8"));
31
+ if (!raw || typeof raw !== "object" || !Array.isArray(raw.inventory)) {
32
+ return undefined;
33
+ }
34
+ return raw;
35
+ }
36
+ catch {
37
+ return undefined;
38
+ }
39
+ }
40
+ export function loadLatestDiscoverySnapshot(env = process.env, fs = defaultSnapshotFs()) {
41
+ return loadDiscoverySnapshot(join(snapshotDir(env), "latest.json"), fs);
42
+ }
43
+ function identityKey(f) {
44
+ return `${f.id}|${f.source}|${JSON.stringify(f.evidence)}`;
45
+ }
46
+ function sourceKey(f) {
47
+ return `${f.id}|${f.source}`;
48
+ }
49
+ export function diffDiscoverySnapshots(current, previous) {
50
+ const added = [];
51
+ const removed = [];
52
+ const changed = [];
53
+ const currentByKey = new Map();
54
+ for (const f of current.inventory)
55
+ currentByKey.set(identityKey(f), f);
56
+ const previousByKey = new Map();
57
+ for (const f of previous.inventory)
58
+ previousByKey.set(identityKey(f), f);
59
+ for (const f of current.inventory) {
60
+ if (!previousByKey.has(identityKey(f)))
61
+ added.push(f);
62
+ }
63
+ for (const f of previous.inventory) {
64
+ if (!currentByKey.has(identityKey(f)))
65
+ removed.push(f);
66
+ }
67
+ // Pair added/removed entries with the same id+source but different evidence as "changed".
68
+ let remainingAdded = added;
69
+ let remainingRemoved = removed;
70
+ if (added.length > 0 && removed.length > 0) {
71
+ const consumedRemoved = new Set();
72
+ const newAdded = [];
73
+ for (const cur of added) {
74
+ const skey = sourceKey(cur);
75
+ const idx = remainingRemoved.findIndex((p, i) => !consumedRemoved.has(i) && sourceKey(p) === skey);
76
+ if (idx !== -1) {
77
+ consumedRemoved.add(idx);
78
+ changed.push({ current: cur, previous: remainingRemoved[idx] });
79
+ }
80
+ else {
81
+ newAdded.push(cur);
82
+ }
83
+ }
84
+ remainingAdded = newAdded;
85
+ remainingRemoved = remainingRemoved.filter((_, i) => !consumedRemoved.has(i));
86
+ }
87
+ return { added: remainingAdded, removed: remainingRemoved, changed };
88
+ }
89
+ function defaultSnapshotFs() {
90
+ return { mkdirSync, writeFileSync, readFileSync, existsSync };
91
+ }
92
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/discover/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ImportResult } from "./index.js";
2
+ export interface AdrSensorImportOptions {
3
+ /** Path, for messages only. */
4
+ readonly file: string;
5
+ /** File content, already read under the shared size cap and file-type rules. */
6
+ readonly text: string;
7
+ readonly cwd: string;
8
+ readonly env?: NodeJS.ProcessEnv;
9
+ }
10
+ /** Import one ADR Sensor export. Returns errors (never throws) on a bad file. */
11
+ export declare function importAdrSensor(opts: AdrSensorImportOptions): ImportResult;
12
+ //# sourceMappingURL=adr-sensor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr-sensor.d.ts","sourceRoot":"","sources":["../../src/importers/adr-sensor.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAyM/C,MAAM,WAAW,sBAAsB;IACrC,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,YAAY,CAgE1E"}