clawhatch 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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +348 -0
  3. package/dist/checks/cloud-sync.d.ts +10 -0
  4. package/dist/checks/cloud-sync.d.ts.map +1 -0
  5. package/dist/checks/cloud-sync.js +62 -0
  6. package/dist/checks/cloud-sync.js.map +1 -0
  7. package/dist/checks/data-protection.d.ts +9 -0
  8. package/dist/checks/data-protection.d.ts.map +1 -0
  9. package/dist/checks/data-protection.js +197 -0
  10. package/dist/checks/data-protection.js.map +1 -0
  11. package/dist/checks/identity.d.ts +14 -0
  12. package/dist/checks/identity.d.ts.map +1 -0
  13. package/dist/checks/identity.js +327 -0
  14. package/dist/checks/identity.js.map +1 -0
  15. package/dist/checks/model.d.ts +10 -0
  16. package/dist/checks/model.d.ts.map +1 -0
  17. package/dist/checks/model.js +337 -0
  18. package/dist/checks/model.js.map +1 -0
  19. package/dist/checks/network.d.ts +9 -0
  20. package/dist/checks/network.d.ts.map +1 -0
  21. package/dist/checks/network.js +177 -0
  22. package/dist/checks/network.js.map +1 -0
  23. package/dist/checks/operational.d.ts +9 -0
  24. package/dist/checks/operational.d.ts.map +1 -0
  25. package/dist/checks/operational.js +158 -0
  26. package/dist/checks/operational.js.map +1 -0
  27. package/dist/checks/sandbox.d.ts +9 -0
  28. package/dist/checks/sandbox.d.ts.map +1 -0
  29. package/dist/checks/sandbox.js +135 -0
  30. package/dist/checks/sandbox.js.map +1 -0
  31. package/dist/checks/secrets.d.ts +9 -0
  32. package/dist/checks/secrets.d.ts.map +1 -0
  33. package/dist/checks/secrets.js +816 -0
  34. package/dist/checks/secrets.js.map +1 -0
  35. package/dist/checks/skills.d.ts +9 -0
  36. package/dist/checks/skills.d.ts.map +1 -0
  37. package/dist/checks/skills.js +303 -0
  38. package/dist/checks/skills.js.map +1 -0
  39. package/dist/checks/tools.d.ts +9 -0
  40. package/dist/checks/tools.d.ts.map +1 -0
  41. package/dist/checks/tools.js +397 -0
  42. package/dist/checks/tools.js.map +1 -0
  43. package/dist/discover.d.ts +22 -0
  44. package/dist/discover.d.ts.map +1 -0
  45. package/dist/discover.js +281 -0
  46. package/dist/discover.js.map +1 -0
  47. package/dist/fixer.d.ts +16 -0
  48. package/dist/fixer.d.ts.map +1 -0
  49. package/dist/fixer.js +361 -0
  50. package/dist/fixer.js.map +1 -0
  51. package/dist/index.d.ts +16 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +230 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/init.d.ts +14 -0
  56. package/dist/init.d.ts.map +1 -0
  57. package/dist/init.js +108 -0
  58. package/dist/init.js.map +1 -0
  59. package/dist/notify.d.ts +28 -0
  60. package/dist/notify.d.ts.map +1 -0
  61. package/dist/notify.js +217 -0
  62. package/dist/notify.js.map +1 -0
  63. package/dist/parsers/config.d.ts +16 -0
  64. package/dist/parsers/config.d.ts.map +1 -0
  65. package/dist/parsers/config.js +54 -0
  66. package/dist/parsers/config.js.map +1 -0
  67. package/dist/parsers/env.d.ts +6 -0
  68. package/dist/parsers/env.d.ts.map +1 -0
  69. package/dist/parsers/env.js +35 -0
  70. package/dist/parsers/env.js.map +1 -0
  71. package/dist/parsers/jsonl.d.ts +12 -0
  72. package/dist/parsers/jsonl.d.ts.map +1 -0
  73. package/dist/parsers/jsonl.js +61 -0
  74. package/dist/parsers/jsonl.js.map +1 -0
  75. package/dist/parsers/markdown.d.ts +17 -0
  76. package/dist/parsers/markdown.d.ts.map +1 -0
  77. package/dist/parsers/markdown.js +57 -0
  78. package/dist/parsers/markdown.js.map +1 -0
  79. package/dist/reporter-html.d.ts +9 -0
  80. package/dist/reporter-html.d.ts.map +1 -0
  81. package/dist/reporter-html.js +581 -0
  82. package/dist/reporter-html.js.map +1 -0
  83. package/dist/reporter.d.ts +10 -0
  84. package/dist/reporter.d.ts.map +1 -0
  85. package/dist/reporter.js +133 -0
  86. package/dist/reporter.js.map +1 -0
  87. package/dist/sanitize.d.ts +17 -0
  88. package/dist/sanitize.d.ts.map +1 -0
  89. package/dist/sanitize.js +83 -0
  90. package/dist/sanitize.js.map +1 -0
  91. package/dist/scanner.d.ts +18 -0
  92. package/dist/scanner.d.ts.map +1 -0
  93. package/dist/scanner.js +236 -0
  94. package/dist/scanner.js.map +1 -0
  95. package/dist/scoring.d.ts +17 -0
  96. package/dist/scoring.d.ts.map +1 -0
  97. package/dist/scoring.js +47 -0
  98. package/dist/scoring.js.map +1 -0
  99. package/dist/telemetry.d.ts +16 -0
  100. package/dist/telemetry.d.ts.map +1 -0
  101. package/dist/telemetry.js +52 -0
  102. package/dist/telemetry.js.map +1 -0
  103. package/dist/threat-feed.d.ts +14 -0
  104. package/dist/threat-feed.d.ts.map +1 -0
  105. package/dist/threat-feed.js +133 -0
  106. package/dist/threat-feed.js.map +1 -0
  107. package/dist/types.d.ts +221 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +11 -0
  110. package/dist/types.js.map +1 -0
  111. package/dist/utils.d.ts +12 -0
  112. package/dist/utils.d.ts.map +1 -0
  113. package/dist/utils.js +34 -0
  114. package/dist/utils.js.map +1 -0
  115. package/package.json +71 -0
@@ -0,0 +1,397 @@
1
+ /**
2
+ * Tool Security checks (TOOLS-001 to TOOLS-020).
3
+ *
4
+ * Checks for elevated tool risks, command injection, docker exposure,
5
+ * missing audit trails, and tool configuration hygiene.
6
+ */
7
+ import { Severity } from "../types.js";
8
+ import { readFile } from "node:fs/promises";
9
+ import { basename } from "node:path";
10
+ import { readFileCapped } from "../utils.js";
11
+ const DANGEROUS_TOOLS = ["exec", "shell", "bash", "sh", "cmd", "powershell", "terminal", "run_command"];
12
+ const EVAL_PATTERNS = [
13
+ /\beval\s*\(/,
14
+ /\bexec\s*\(/,
15
+ /\bsubprocess\b/,
16
+ /\bchild_process\b/,
17
+ /\bspawn\s*\(/,
18
+ /new\s+Function\s*\(/,
19
+ ];
20
+ const SUDO_PATTERNS = [
21
+ /\bsudo\b/,
22
+ /\bdoas\b/,
23
+ /\brunas\b/,
24
+ ];
25
+ export async function runToolChecks(config, files) {
26
+ const findings = [];
27
+ const elevated = config.tools?.elevated ?? [];
28
+ // TOOLS-001: Excessive elevated tools (>5)
29
+ if (elevated.length > 5) {
30
+ findings.push({
31
+ id: "TOOLS-001",
32
+ severity: Severity.Medium,
33
+ confidence: "high",
34
+ category: "Tool Security",
35
+ title: "Excessive elevated tools",
36
+ description: `${elevated.length} tools are elevated — large attack surface`,
37
+ risk: "Each elevated tool bypasses sandbox restrictions and increases exposure",
38
+ remediation: "Reduce elevated tools to the minimum needed (ideally ≤5)",
39
+ autoFixable: false,
40
+ });
41
+ }
42
+ // TOOLS-002: Dangerous tools elevated (exec/shell/bash)
43
+ const dangerousElevated = elevated.filter((t) => DANGEROUS_TOOLS.some((d) => t.toLowerCase().includes(d)));
44
+ if (dangerousElevated.length > 0) {
45
+ findings.push({
46
+ id: "TOOLS-002",
47
+ severity: Severity.Critical,
48
+ confidence: "high",
49
+ category: "Tool Security",
50
+ title: "Dangerous tools elevated",
51
+ description: `Shell/exec tools elevated: ${dangerousElevated.join(", ")}`,
52
+ risk: "Elevated shell access allows arbitrary command execution without sandbox",
53
+ remediation: "Remove shell/exec from elevated tools and use specific, scoped tools instead",
54
+ autoFixable: false,
55
+ });
56
+ }
57
+ // TOOLS-003: useAccessGroups not enabled
58
+ if (elevated.length > 0 && config.tools?.useAccessGroups !== true) {
59
+ findings.push({
60
+ id: "TOOLS-003",
61
+ severity: Severity.Medium,
62
+ confidence: "high",
63
+ category: "Tool Security",
64
+ title: "Tool access groups not enabled",
65
+ description: "Tools are elevated but useAccessGroups is not enabled",
66
+ risk: "All users/agents get the same tool access — no role-based control",
67
+ remediation: "Set tools.useAccessGroups: true and define access groups per role",
68
+ autoFixable: false,
69
+ });
70
+ }
71
+ // TOOLS-004: No tool allowlist
72
+ if (!config.tools?.allowlist || config.tools.allowlist.length === 0) {
73
+ findings.push({
74
+ id: "TOOLS-004",
75
+ severity: Severity.Medium,
76
+ confidence: "medium",
77
+ category: "Tool Security",
78
+ title: "No tool allowlist configured",
79
+ description: "No explicit allowlist of permitted tools — all tools may be available",
80
+ risk: "Agents can use any available tool without restriction",
81
+ remediation: "Configure tools.allowlist with only the tools your agent needs",
82
+ autoFixable: false,
83
+ });
84
+ }
85
+ // TOOLS-005: Exec tool unrestricted
86
+ const hasExec = elevated.some((t) => t.toLowerCase().includes("exec"));
87
+ if (hasExec && !config.tools?.useAccessGroups) {
88
+ findings.push({
89
+ id: "TOOLS-005",
90
+ severity: Severity.High,
91
+ confidence: "high",
92
+ category: "Tool Security",
93
+ title: "Exec tool elevated without constraints",
94
+ description: "exec/run tool is elevated with no access group restrictions",
95
+ risk: "Any agent or user can execute arbitrary commands via the exec tool",
96
+ remediation: "Add access group constraints or remove exec from elevated tools",
97
+ autoFixable: false,
98
+ });
99
+ }
100
+ // TOOLS-006: Browser relay without constraints
101
+ if (config.sandbox?.browser?.allowHostControl === true) {
102
+ findings.push({
103
+ id: "TOOLS-006",
104
+ severity: Severity.Medium,
105
+ confidence: "medium",
106
+ category: "Tool Security",
107
+ title: "Browser host control enabled",
108
+ description: "Browser relay allows host-level control without documented constraints",
109
+ risk: "Agent can navigate to arbitrary URLs, read cookies, or interact with authenticated sessions",
110
+ remediation: "Restrict browser access to specific domains or disable host control",
111
+ autoFixable: false,
112
+ });
113
+ }
114
+ // TOOLS-007: File write too broad
115
+ if (config.sandbox?.workspaceAccess === "rw" && !config.tools?.allowlist) {
116
+ findings.push({
117
+ id: "TOOLS-007",
118
+ severity: Severity.Medium,
119
+ confidence: "low",
120
+ category: "Tool Security",
121
+ title: "Unrestricted file write access",
122
+ description: "Workspace has read-write access with no tool allowlist to limit write scope",
123
+ risk: "Agent can modify any file in the workspace without restriction",
124
+ remediation: "Use a tool allowlist or restrict workspace access to read-only where possible",
125
+ autoFixable: false,
126
+ });
127
+ }
128
+ // TOOLS-008: Docker socket referenced in command files
129
+ for (const cmdFile of files.customCommandFiles) {
130
+ try {
131
+ const content = await readFile(cmdFile, "utf-8");
132
+ if (/docker\.sock/i.test(content) || /\/var\/run\/docker/i.test(content)) {
133
+ findings.push({
134
+ id: "TOOLS-008",
135
+ severity: Severity.Critical,
136
+ confidence: "high",
137
+ category: "Tool Security",
138
+ title: "Docker socket referenced in custom command",
139
+ description: `${basename(cmdFile)} references docker.sock — full host access`,
140
+ risk: "Docker socket access grants root-equivalent access to the host system",
141
+ remediation: "Remove docker.sock references from custom commands; use rootless Docker instead",
142
+ autoFixable: false,
143
+ file: cmdFile,
144
+ });
145
+ break;
146
+ }
147
+ }
148
+ catch {
149
+ // Can't read file
150
+ }
151
+ }
152
+ // TOOLS-009: Host network mode in custom commands
153
+ for (const cmdFile of files.customCommandFiles) {
154
+ try {
155
+ const content = await readFile(cmdFile, "utf-8");
156
+ if (/--net[=\s]+host/i.test(content) || /--network[=\s]+host/i.test(content)) {
157
+ findings.push({
158
+ id: "TOOLS-009",
159
+ severity: Severity.High,
160
+ confidence: "high",
161
+ category: "Tool Security",
162
+ title: "Host network mode in custom command",
163
+ description: `${basename(cmdFile)} uses --net=host — container shares host network`,
164
+ risk: "Container can access all host network interfaces and services",
165
+ remediation: "Use bridge or none network mode instead of host",
166
+ autoFixable: false,
167
+ file: cmdFile,
168
+ });
169
+ break;
170
+ }
171
+ }
172
+ catch {
173
+ // Can't read file
174
+ }
175
+ }
176
+ // TOOLS-010: Sudo/doas/runas in custom commands
177
+ for (const cmdFile of files.customCommandFiles) {
178
+ try {
179
+ const content = await readFile(cmdFile, "utf-8");
180
+ const hasSudo = SUDO_PATTERNS.some((p) => p.test(content));
181
+ if (hasSudo) {
182
+ findings.push({
183
+ id: "TOOLS-010",
184
+ severity: Severity.High,
185
+ confidence: "high",
186
+ category: "Tool Security",
187
+ title: "Privilege escalation in custom command",
188
+ description: `${basename(cmdFile)} contains sudo/doas/runas — escalates privileges`,
189
+ risk: "Custom commands running as root bypass all sandbox protections",
190
+ remediation: "Remove privilege escalation from custom commands; run with least privilege",
191
+ autoFixable: false,
192
+ file: cmdFile,
193
+ });
194
+ break;
195
+ }
196
+ }
197
+ catch {
198
+ // Can't read file
199
+ }
200
+ }
201
+ // TOOLS-011: Eval/exec in skill files
202
+ for (const skillFile of files.skillFiles) {
203
+ try {
204
+ const content = await readFile(skillFile, "utf-8");
205
+ const hasEval = EVAL_PATTERNS.some((p) => p.test(content));
206
+ if (hasEval) {
207
+ findings.push({
208
+ id: "TOOLS-011",
209
+ severity: Severity.High,
210
+ confidence: "high",
211
+ category: "Tool Security",
212
+ title: "Dynamic code execution in skill",
213
+ description: `${basename(skillFile)} uses eval/exec/subprocess — code injection risk`,
214
+ risk: "Skills with dynamic execution can run arbitrary code",
215
+ remediation: "Replace eval/exec with static, validated alternatives",
216
+ autoFixable: false,
217
+ file: skillFile,
218
+ });
219
+ break;
220
+ }
221
+ }
222
+ catch {
223
+ // Can't read file
224
+ }
225
+ }
226
+ // TOOLS-012: Custom tool override risk
227
+ if (files.customCommandFiles.length > 0 && files.skillFiles.length > 0) {
228
+ findings.push({
229
+ id: "TOOLS-012",
230
+ severity: Severity.Medium,
231
+ confidence: "medium",
232
+ category: "Tool Security",
233
+ title: "Workspace tools may override managed tools",
234
+ description: `${files.customCommandFiles.length} custom commands alongside ${files.skillFiles.length} skill files`,
235
+ risk: "Custom workspace tools can shadow managed tools, changing behavior unexpectedly",
236
+ remediation: "Review custom commands for naming conflicts with managed tools",
237
+ autoFixable: false,
238
+ });
239
+ }
240
+ // TOOLS-013: Missing tool documentation
241
+ if (elevated.length > 0) {
242
+ const hasClaudeMd = files.workspaceMarkdownFiles.some((f) => basename(f).toUpperCase() === "CLAUDE.MD");
243
+ if (!hasClaudeMd) {
244
+ findings.push({
245
+ id: "TOOLS-013",
246
+ severity: Severity.Low,
247
+ confidence: "low",
248
+ category: "Tool Security",
249
+ title: "Elevated tools lack documentation",
250
+ description: "No CLAUDE.md found to document elevated tool usage and constraints",
251
+ risk: "Undocumented tool access makes security review difficult",
252
+ remediation: "Create a CLAUDE.md that documents which tools are elevated and why",
253
+ autoFixable: false,
254
+ });
255
+ }
256
+ }
257
+ // TOOLS-014: Tool version pinning
258
+ if (files.skillPackageFiles.length > 0) {
259
+ for (const pkgFile of files.skillPackageFiles.slice(0, 5)) {
260
+ try {
261
+ const content = await readFile(pkgFile, "utf-8");
262
+ if (content.includes('"*"') || /"\^/.test(content) || /"~/.test(content)) {
263
+ findings.push({
264
+ id: "TOOLS-014",
265
+ severity: Severity.Low,
266
+ confidence: "low",
267
+ category: "Tool Security",
268
+ title: "Skill dependencies not version-pinned",
269
+ description: `${basename(pkgFile)} uses loose version ranges (^, ~, *)`,
270
+ risk: "Unpinned dependencies can introduce supply-chain vulnerabilities",
271
+ remediation: "Pin exact versions in skill package.json dependencies",
272
+ autoFixable: false,
273
+ file: pkgFile,
274
+ });
275
+ break;
276
+ }
277
+ }
278
+ catch {
279
+ // Can't read
280
+ }
281
+ }
282
+ }
283
+ // TOOLS-015: Shell command history in session logs
284
+ for (const logFile of files.sessionLogFiles.slice(0, 3)) {
285
+ try {
286
+ // FIX: Use capped read to avoid OOM on large session logs
287
+ const content = await readFileCapped(logFile, 512 * 1024);
288
+ const hasShellSecrets = /(?:password|token|secret|key)\s*[=:]\s*\S+/i.test(content) &&
289
+ /(?:bash|shell|exec|run_command)/i.test(content);
290
+ if (hasShellSecrets) {
291
+ findings.push({
292
+ id: "TOOLS-015",
293
+ severity: Severity.Medium,
294
+ confidence: "medium",
295
+ category: "Tool Security",
296
+ title: "Shell commands may contain secrets in logs",
297
+ description: `Session log ${basename(logFile)} contains shell commands with potential secret values`,
298
+ risk: "Shell command history in logs may expose passwords, tokens, or API keys",
299
+ remediation: "Use environment variables instead of inline secrets in shell commands",
300
+ autoFixable: false,
301
+ file: logFile,
302
+ });
303
+ break;
304
+ }
305
+ }
306
+ catch {
307
+ // Can't read
308
+ }
309
+ }
310
+ // TOOLS-016: Unrestricted file deletion
311
+ if (config.sandbox?.workspaceAccess === "rw" && !config.tools?.auditLog) {
312
+ findings.push({
313
+ id: "TOOLS-016",
314
+ severity: Severity.Low,
315
+ confidence: "low",
316
+ category: "Tool Security",
317
+ title: "File deletions not audited",
318
+ description: "Workspace is read-write but no audit log is configured for file operations",
319
+ risk: "Deleted files cannot be traced back to the action that removed them",
320
+ remediation: "Enable tools.auditLog to track file modifications and deletions",
321
+ autoFixable: false,
322
+ });
323
+ }
324
+ // TOOLS-017: No command audit trail
325
+ // Only fire if elevated tools are configured or exec/shell tools are present
326
+ // (no point flagging audit trail if there are no risky tools to audit)
327
+ const hasRiskyTools = elevated.length > 0 ||
328
+ dangerousElevated.length > 0 ||
329
+ config.sandbox?.workspaceAccess === "rw";
330
+ if (!config.tools?.auditLog && hasRiskyTools) {
331
+ findings.push({
332
+ id: "TOOLS-017",
333
+ severity: Severity.Medium,
334
+ confidence: "low",
335
+ category: "Tool Security",
336
+ title: "No command audit trail",
337
+ description: "Tool audit logging is not enabled — tool invocations are not tracked",
338
+ risk: "Cannot trace which tools were called, when, or with what parameters",
339
+ remediation: "Set tools.auditLog: true to enable tool invocation logging",
340
+ autoFixable: false,
341
+ });
342
+ }
343
+ // TOOLS-018: Dynamic tool loading from arbitrary paths
344
+ for (const cmdFile of files.customCommandFiles) {
345
+ try {
346
+ const content = await readFile(cmdFile, "utf-8");
347
+ if (/require\s*\(|import\s*\(|loadModule|dynamicImport/i.test(content)) {
348
+ findings.push({
349
+ id: "TOOLS-018",
350
+ severity: Severity.Medium,
351
+ confidence: "medium",
352
+ category: "Tool Security",
353
+ title: "Dynamic tool loading detected",
354
+ description: `${basename(cmdFile)} dynamically loads modules at runtime`,
355
+ risk: "Dynamically loaded tools can be swapped or injected by modifying the load path",
356
+ remediation: "Use static imports and pin tool sources to known, trusted locations",
357
+ autoFixable: false,
358
+ file: cmdFile,
359
+ });
360
+ break;
361
+ }
362
+ }
363
+ catch {
364
+ // Can't read
365
+ }
366
+ }
367
+ // TOOLS-019: Tool timeout missing
368
+ if (!config.tools?.timeout) {
369
+ findings.push({
370
+ id: "TOOLS-019",
371
+ severity: Severity.Low,
372
+ confidence: "low",
373
+ category: "Tool Security",
374
+ title: "No tool timeout configured",
375
+ description: "No timeout set for tool execution — tools can run indefinitely",
376
+ risk: "Runaway tool executions can consume resources or hang the agent",
377
+ remediation: "Set tools.timeout to a reasonable value (e.g., 30000ms)",
378
+ autoFixable: false,
379
+ });
380
+ }
381
+ // TOOLS-020: No rate limiting on tools
382
+ if (!config.tools?.rateLimit) {
383
+ findings.push({
384
+ id: "TOOLS-020",
385
+ severity: Severity.Low,
386
+ confidence: "low",
387
+ category: "Tool Security",
388
+ title: "No rate limiting on tools",
389
+ description: "No rate limit configured for tool invocations",
390
+ risk: "Agent can invoke tools at unlimited rate, risking API abuse or resource exhaustion",
391
+ remediation: "Set tools.rateLimit to limit invocations per minute",
392
+ autoFixable: false,
393
+ });
394
+ }
395
+ return findings;
396
+ }
397
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/checks/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * File discovery for OpenClaw installations.
3
+ *
4
+ * Finds all relevant files to scan, handling:
5
+ * - Default and custom paths
6
+ * - Symlink detection and boundary checking
7
+ * - Windows/macOS/Linux path differences
8
+ * - Graceful missing-file handling
9
+ */
10
+ import type { DiscoveredFiles } from "./types.js";
11
+ /**
12
+ * Auto-detect OpenClaw installation path.
13
+ */
14
+ export declare function findOpenClawDir(customPath?: string): Promise<string | null>;
15
+ /**
16
+ * Discover all scannable files in an OpenClaw installation.
17
+ */
18
+ export declare function discoverFiles(openclawDir: string, workspaceDir: string | null): Promise<{
19
+ files: DiscoveredFiles;
20
+ symlinkWarnings: string[];
21
+ }>;
22
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAsDlD;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqMhE"}