tauri-agent-tools 0.7.1 → 0.9.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 (82) hide show
  1. package/.agents/skills/tauri-agent-tools/SKILL.md +59 -14
  2. package/.agents/skills/tauri-bridge-setup/SKILL.md +10 -4
  3. package/.agents/skills/tauri-debug-quickstart/SKILL.md +10 -6
  4. package/AGENTS.md +13 -3
  5. package/README.md +33 -5
  6. package/dist/bridge/client.d.ts +21 -0
  7. package/dist/bridge/client.js +38 -2
  8. package/dist/bridge/client.js.map +1 -1
  9. package/dist/bridge/tokenDiscovery.js +5 -2
  10. package/dist/bridge/tokenDiscovery.js.map +1 -1
  11. package/dist/cli.js +5 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/bundle.d.ts +2 -0
  14. package/dist/commands/bundle.js +212 -0
  15. package/dist/commands/bundle.js.map +1 -0
  16. package/dist/commands/capabilitiesAudit.js +14 -1
  17. package/dist/commands/capabilitiesAudit.js.map +1 -1
  18. package/dist/commands/capture.d.ts +11 -0
  19. package/dist/commands/capture.js +161 -156
  20. package/dist/commands/capture.js.map +1 -1
  21. package/dist/commands/check.js +2 -2
  22. package/dist/commands/check.js.map +1 -1
  23. package/dist/commands/consoleMonitor.js +3 -3
  24. package/dist/commands/consoleMonitor.js.map +1 -1
  25. package/dist/commands/dom.js +2 -2
  26. package/dist/commands/dom.js.map +1 -1
  27. package/dist/commands/health.js +19 -1
  28. package/dist/commands/health.js.map +1 -1
  29. package/dist/commands/interact/click.js +2 -2
  30. package/dist/commands/interact/click.js.map +1 -1
  31. package/dist/commands/interact/scroll.js +3 -3
  32. package/dist/commands/interact/scroll.js.map +1 -1
  33. package/dist/commands/ipcMonitor.js +41 -7
  34. package/dist/commands/ipcMonitor.js.map +1 -1
  35. package/dist/commands/logs.d.ts +30 -0
  36. package/dist/commands/logs.js +279 -0
  37. package/dist/commands/logs.js.map +1 -0
  38. package/dist/commands/mutations.js +3 -3
  39. package/dist/commands/mutations.js.map +1 -1
  40. package/dist/commands/probe.js +49 -9
  41. package/dist/commands/probe.js.map +1 -1
  42. package/dist/commands/processTree.js +116 -4
  43. package/dist/commands/processTree.js.map +1 -1
  44. package/dist/commands/rustLogs.js +3 -3
  45. package/dist/commands/rustLogs.js.map +1 -1
  46. package/dist/commands/screenshot.js +2 -2
  47. package/dist/commands/screenshot.js.map +1 -1
  48. package/dist/commands/shared.d.ts +37 -0
  49. package/dist/commands/shared.js +62 -3
  50. package/dist/commands/shared.js.map +1 -1
  51. package/dist/commands/sidecarReplay.js +46 -1
  52. package/dist/commands/sidecarReplay.js.map +1 -1
  53. package/dist/commands/sidecarTap.js +23 -8
  54. package/dist/commands/sidecarTap.js.map +1 -1
  55. package/dist/commands/snapshot.js +2 -2
  56. package/dist/commands/snapshot.js.map +1 -1
  57. package/dist/commands/storeInspect.js +2 -2
  58. package/dist/commands/storeInspect.js.map +1 -1
  59. package/dist/commands/wait.js +3 -3
  60. package/dist/commands/wait.js.map +1 -1
  61. package/dist/commands/webviewAttach.js +17 -1
  62. package/dist/commands/webviewAttach.js.map +1 -1
  63. package/dist/platform/macos.js +35 -15
  64. package/dist/platform/macos.js.map +1 -1
  65. package/dist/schemas/bridge.d.ts +14 -0
  66. package/dist/schemas/bridge.js +3 -0
  67. package/dist/schemas/bridge.js.map +1 -1
  68. package/dist/util/logMerge.d.ts +42 -0
  69. package/dist/util/logMerge.js +133 -0
  70. package/dist/util/logMerge.js.map +1 -0
  71. package/dist/util/mergeByTimestamp.d.ts +18 -0
  72. package/dist/util/mergeByTimestamp.js +30 -0
  73. package/dist/util/mergeByTimestamp.js.map +1 -0
  74. package/dist/util/psTree.d.ts +28 -0
  75. package/dist/util/psTree.js +76 -0
  76. package/dist/util/psTree.js.map +1 -0
  77. package/dist/util/redactText.d.ts +23 -0
  78. package/dist/util/redactText.js +377 -0
  79. package/dist/util/redactText.js.map +1 -0
  80. package/examples/tauri-bridge/src/dev_bridge.rs +199 -12
  81. package/package.json +3 -2
  82. package/rust-bridge/README.md +2 -2
@@ -0,0 +1,377 @@
1
+ import { readdir, readFile, stat, writeFile } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { Buffer } from 'node:buffer';
5
+ const REDACTED = '[REDACTED]';
6
+ /**
7
+ * Generated-artifact filenames that may legitimately look high-entropy
8
+ * (timestamped report/capture names embedded in logs or markdown). Matches
9
+ * are exempt from the residual-secret entropy gate. App-specific artifact
10
+ * name patterns can be added per call via `scanResidualSecrets` opts.
11
+ */
12
+ const DEFAULT_ARTIFACT_NAME_ALLOWLIST = [
13
+ /^\d{8}-\d{6}-[a-z0-9][a-z0-9.-]*\.(?:md|html|json|ndjson|jsonl)$/i,
14
+ ];
15
+ /**
16
+ * Agent-CLI config dirs masked as a pre-pass before the generic home-path
17
+ * pattern (catches them even in contexts the tilde/absolute pattern misses).
18
+ */
19
+ const AGENT_HOME_DIRS = ['.claude', '.codex'];
20
+ const TEXT_FILE_RE = /\.(json|ndjson|txt|md|log|html)$/i;
21
+ const IMAGE_FILE_RE = /\.(png|jpe?g|webp|gif|bmp|tiff?)$/i;
22
+ const SECRET_KEY_RE = /token|secret|password|api[_-]?key|authorization|cookie|email|credential|(?:_key|_token|_secret|_password|_credential)$/i;
23
+ const TEXT_PATTERNS = [
24
+ {
25
+ re: /\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi,
26
+ replacement: 'Bearer [REDACTED]',
27
+ },
28
+ {
29
+ re: /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,
30
+ replacement: REDACTED,
31
+ },
32
+ {
33
+ re: /([?&](?:token|api[_-]?key|secret|password|authorization)=)[^&\s"'<>]+/gi,
34
+ replacement: '$1[REDACTED]',
35
+ },
36
+ {
37
+ re: /(^|[^A-Za-z0-9])((?:(?:[A-Za-z0-9]+_)*(?:API_KEY|ACCESS_KEY|SECRET_ACCESS_KEY|KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL)|token|api[_-]?key|secret|password|cookie)\s*[:=]\s*)["']?[^"',\s<>&]+["']?/gi,
38
+ replacement: (_match, prefix, key) => `${prefix}${key}${REDACTED}`,
39
+ },
40
+ {
41
+ re: /(["'](?:[^"']*(?:token|api[_-]?key|secret|password|authorization|cookie|credential|email)[^"']*)["']\s*:\s*")[^"]*(")/gi,
42
+ replacement: '$1[REDACTED]$2',
43
+ },
44
+ {
45
+ re: /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/g,
46
+ replacement: '[REDACTED_AWS_ACCESS_KEY]',
47
+ },
48
+ {
49
+ re: /(?<!\d)(?:\d{1,3}\.){3}\d{1,3}(?!\d)/g,
50
+ replacement: '[REDACTED_IP]',
51
+ },
52
+ {
53
+ // HH:MM:SS clock times (incl. inside ISO-8601 timestamps) share the
54
+ // colon-group shape, so only redact candidates that look like real IPv6:
55
+ // a `::`, a hex letter, or a group longer than 2 digits.
56
+ re: /(?<![A-F0-9:])(?:[A-F0-9]{1,4}:){2,7}:?(?:[A-F0-9]{1,4})?(?![A-F0-9:])/gi,
57
+ replacement: (match) => match.includes('::') || /[a-f]/i.test(match) || match.split(':').some((group) => group.length > 2)
58
+ ? '[REDACTED_IP]'
59
+ : match,
60
+ },
61
+ {
62
+ re: /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi,
63
+ replacement: '[REDACTED_EMAIL]',
64
+ },
65
+ {
66
+ re: /(?<!\d)(?:\+?1[-.\s]?)?(?:\(?\d{3}\)?[-.\s]?)\d{3}[-.\s]?\d{4}(?!\d)/g,
67
+ replacement: '[REDACTED_PHONE]',
68
+ },
69
+ {
70
+ // A tilde only counts as a home path when it starts one (`~/...`) —
71
+ // bare `~` is common in prose ("~10s", "~~strikethrough~~").
72
+ re: /(?:~(?=\/)|\/Users\/[^/\s"'<>]+|\/home\/[^/\s"'<>]+)(?:\/[^\s"'<>]*)?/g,
73
+ replacement: '[HOME]',
74
+ },
75
+ ];
76
+ const RESIDUAL_SECRET_PATTERNS = [
77
+ { prefix: 'sk-ant-', re: /sk-ant-[A-Za-z0-9_-]{12,}/g },
78
+ { prefix: 'sk-', re: /sk-[A-Za-z0-9_-]{16,}/g },
79
+ { prefix: 'ghp_', re: /ghp_[A-Za-z0-9_]{16,}/g },
80
+ { prefix: 'xoxb-', re: /xoxb-[A-Za-z0-9-]{16,}/g },
81
+ { prefix: 'AKIA', re: /AKIA[A-Z0-9]{16}/g },
82
+ { prefix: 'ASIA', re: /ASIA[A-Z0-9]{16}/g },
83
+ { prefix: 'Authorization:', re: /Authorization:\s*(?:Bearer\s+)?[A-Za-z0-9._~+/-]{8,}=*/gi },
84
+ ];
85
+ export function redactText(input) {
86
+ return redactTextWithStats(input).value;
87
+ }
88
+ export function redactJson(value) {
89
+ return redactJsonWithStats(value).value;
90
+ }
91
+ export async function redactDir(dir) {
92
+ const result = { redactions: 0, failures: [], warnings: [] };
93
+ const entries = await readdir(dir).catch((error) => {
94
+ result.warnings.push({ path: dir, reason: 'readdir_failed', message: errorMessage(error) });
95
+ return null;
96
+ });
97
+ if (entries == null)
98
+ return result;
99
+ for (const name of entries) {
100
+ const full = join(dir, name);
101
+ const st = await stat(full).catch((error) => {
102
+ result.warnings.push({ path: full, reason: 'stat_failed', message: errorMessage(error) });
103
+ return null;
104
+ });
105
+ if (!st)
106
+ continue;
107
+ if (st.isDirectory()) {
108
+ mergeRedactDirResult(result, await redactDir(full));
109
+ continue;
110
+ }
111
+ if (!TEXT_FILE_RE.test(name)) {
112
+ if (IMAGE_FILE_RE.test(name)) {
113
+ result.warnings.push({ path: full, reason: 'image_unredacted' });
114
+ }
115
+ continue;
116
+ }
117
+ const original = await readFile(full, 'utf-8').catch((error) => {
118
+ result.warnings.push({ path: full, reason: 'read_failed', message: errorMessage(error) });
119
+ return null;
120
+ });
121
+ if (original == null)
122
+ continue;
123
+ const structured = redactStructuredText(original, name);
124
+ const redacted = structured.structured
125
+ ? { value: structured.value, redactions: 0 }
126
+ : redactTextWithStats(structured.value);
127
+ const next = redacted.value;
128
+ const redactionCount = structured.redactions + redacted.redactions;
129
+ if (next !== original) {
130
+ try {
131
+ await writeFile(full, next, 'utf-8');
132
+ result.redactions += redactionCount;
133
+ }
134
+ catch (error) {
135
+ result.failures.push({ path: full, reason: 'write_failed', message: errorMessage(error) });
136
+ }
137
+ }
138
+ }
139
+ return result;
140
+ }
141
+ export function scanResidualSecrets(input, path, opts = {}) {
142
+ const allowNames = [...DEFAULT_ARTIFACT_NAME_ALLOWLIST, ...(opts.allowNames ?? [])];
143
+ const hits = [];
144
+ const ranges = [];
145
+ for (const { prefix, re } of RESIDUAL_SECRET_PATTERNS) {
146
+ for (const match of input.matchAll(re)) {
147
+ const value = match[0];
148
+ const offset = match.index ?? 0;
149
+ if (ranges.some((range) => offset < range.end && offset + value.length > range.start))
150
+ continue;
151
+ hits.push({
152
+ path,
153
+ prefix,
154
+ offset,
155
+ sample: sampleSecret(value),
156
+ });
157
+ ranges.push({ start: offset, end: offset + value.length });
158
+ }
159
+ }
160
+ for (const match of input.matchAll(/[A-Za-z0-9+_=.-]{40,}/g)) {
161
+ const value = match[0];
162
+ const offset = match.index ?? 0;
163
+ if (ranges.some((range) => offset < range.end && offset + value.length > range.start))
164
+ continue;
165
+ if (allowNames.some((re) => re.test(value)))
166
+ continue;
167
+ if (!looksHighEntropy(value))
168
+ continue;
169
+ hits.push({
170
+ path,
171
+ prefix: 'high-entropy',
172
+ offset,
173
+ sample: sampleSecret(value),
174
+ });
175
+ }
176
+ return hits.sort((a, b) => a.offset - b.offset || a.prefix.localeCompare(b.prefix));
177
+ }
178
+ function redactStructuredText(content, name) {
179
+ if (/\.json$/i.test(name)) {
180
+ try {
181
+ const parsed = JSON.parse(content);
182
+ const redacted = redactJsonWithStats(parsed);
183
+ return {
184
+ value: JSON.stringify(redacted.value),
185
+ redactions: redacted.redactions,
186
+ structured: true,
187
+ };
188
+ }
189
+ catch {
190
+ return { value: content, redactions: 0, structured: false };
191
+ }
192
+ }
193
+ if (/\.ndjson$/i.test(name)) {
194
+ let redactions = 0;
195
+ const hadTrailingNewline = content.endsWith('\n');
196
+ const lines = content
197
+ .split(/\r?\n/)
198
+ .filter((line, index, all) => line !== '' || index < all.length - 1)
199
+ .map((line) => {
200
+ if (line.trim() === '')
201
+ return line;
202
+ try {
203
+ const parsed = JSON.parse(line);
204
+ const redacted = redactJsonWithStats(parsed);
205
+ redactions += redacted.redactions;
206
+ return JSON.stringify(redacted.value);
207
+ }
208
+ catch {
209
+ const redacted = redactTextWithStats(line);
210
+ redactions += redacted.redactions;
211
+ return redacted.value;
212
+ }
213
+ });
214
+ return {
215
+ value: `${lines.join('\n')}${hadTrailingNewline ? '\n' : ''}`,
216
+ redactions,
217
+ structured: true,
218
+ };
219
+ }
220
+ return { value: content, redactions: 0, structured: false };
221
+ }
222
+ function redactTextWithStats(input) {
223
+ let value = maskKnownHomePath(input);
224
+ let redactions = value === input ? 0 : 1;
225
+ const encoded = maskBase64HomePaths(value);
226
+ value = encoded.value;
227
+ redactions += encoded.redactions;
228
+ for (const { re, replacement } of TEXT_PATTERNS) {
229
+ const result = replaceAndCount(value, re, replacement);
230
+ value = result.value;
231
+ redactions += result.redactions;
232
+ }
233
+ return { value, redactions };
234
+ }
235
+ function replaceAndCount(input, re, replacement) {
236
+ if (typeof replacement === 'string') {
237
+ const matches = Array.from(input.matchAll(re));
238
+ if (matches.length === 0)
239
+ return { value: input, redactions: 0 };
240
+ return { value: input.replace(re, replacement), redactions: matches.length };
241
+ }
242
+ // Function replacements may decline a match (return it unchanged); only
243
+ // count the ones that actually redacted something.
244
+ let redactions = 0;
245
+ const value = input.replace(re, (match, ...groups) => {
246
+ const replaced = replacement(match, ...groups);
247
+ if (replaced !== match)
248
+ redactions += 1;
249
+ return replaced;
250
+ });
251
+ return { value, redactions };
252
+ }
253
+ function mergeRedactDirResult(target, source) {
254
+ target.redactions += source.redactions;
255
+ target.failures.push(...source.failures);
256
+ target.warnings.push(...source.warnings);
257
+ }
258
+ function redactJsonWithStats(value) {
259
+ if (typeof value === 'string') {
260
+ return redactTextWithStats(value);
261
+ }
262
+ if (Array.isArray(value)) {
263
+ let redactions = 0;
264
+ const items = value.map((item) => {
265
+ const redacted = redactJsonWithStats(item);
266
+ redactions += redacted.redactions;
267
+ return redacted.value;
268
+ });
269
+ return { value: items, redactions };
270
+ }
271
+ if (isRecord(value)) {
272
+ let redactions = 0;
273
+ const next = {};
274
+ for (const [key, child] of Object.entries(value)) {
275
+ if (SECRET_KEY_RE.test(key)) {
276
+ const masked = maskJsonValue(child);
277
+ redactions += masked.redactions;
278
+ next[key] = masked.value;
279
+ }
280
+ else {
281
+ const redacted = redactJsonWithStats(child);
282
+ redactions += redacted.redactions;
283
+ next[key] = redacted.value;
284
+ }
285
+ }
286
+ return { value: next, redactions };
287
+ }
288
+ return { value, redactions: 0 };
289
+ }
290
+ function maskJsonValue(value) {
291
+ if (Array.isArray(value)) {
292
+ let redactions = 0;
293
+ const items = value.map((item) => {
294
+ const masked = maskJsonValue(item);
295
+ redactions += masked.redactions;
296
+ return masked.value;
297
+ });
298
+ return { value: items, redactions };
299
+ }
300
+ if (isRecord(value)) {
301
+ let redactions = 0;
302
+ const next = {};
303
+ for (const [key, child] of Object.entries(value)) {
304
+ const masked = maskJsonValue(child);
305
+ redactions += masked.redactions;
306
+ next[key] = masked.value;
307
+ }
308
+ return { value: next, redactions };
309
+ }
310
+ return { value: REDACTED, redactions: 1 };
311
+ }
312
+ function maskKnownHomePath(input) {
313
+ const home = homedir();
314
+ if (!home)
315
+ return input;
316
+ let value = input;
317
+ for (const dir of AGENT_HOME_DIRS) {
318
+ value = value.split(`${home}/${dir}`).join('[HOME]');
319
+ }
320
+ return value;
321
+ }
322
+ function maskBase64HomePaths(input) {
323
+ let redactions = 0;
324
+ const value = input.replace(/\b(?:L1VzZXJz|L2hvbWU)[A-Za-z0-9+_=-]{20,}\b/g, (candidate) => {
325
+ const decoded = decodeBase64Candidate(candidate);
326
+ if (decoded == null)
327
+ return candidate;
328
+ if (!/^(?:\/Users\/|\/home\/|~\/)/.test(decoded))
329
+ return candidate;
330
+ redactions += 1;
331
+ return '[REDACTED_BASE64_PATH]';
332
+ });
333
+ return { value, redactions };
334
+ }
335
+ function decodeBase64Candidate(candidate) {
336
+ const normalized = candidate.replace(/-/g, '+').replace(/_/g, '/');
337
+ const padding = normalized.length % 4 === 0 ? '' : '='.repeat(4 - (normalized.length % 4));
338
+ try {
339
+ const decoded = Buffer.from(`${normalized}${padding}`, 'base64').toString('utf-8');
340
+ return decoded.includes('\uFFFD') ? null : decoded;
341
+ }
342
+ catch {
343
+ return null;
344
+ }
345
+ }
346
+ function errorMessage(error) {
347
+ return error instanceof Error ? error.message : String(error);
348
+ }
349
+ function sampleSecret(value) {
350
+ return value.length <= 16 ? value : `${value.slice(0, 8)}...${value.slice(-4)}`;
351
+ }
352
+ function looksHighEntropy(value) {
353
+ const classes = [
354
+ /[a-z]/.test(value),
355
+ /[A-Z]/.test(value),
356
+ /\d/.test(value),
357
+ /[+/=_-]/.test(value),
358
+ ].filter(Boolean).length;
359
+ if (classes < 3)
360
+ return false;
361
+ return shannonEntropy(value) >= 4.3;
362
+ }
363
+ function shannonEntropy(value) {
364
+ const counts = new Map();
365
+ for (const char of value)
366
+ counts.set(char, (counts.get(char) ?? 0) + 1);
367
+ let entropy = 0;
368
+ for (const count of counts.values()) {
369
+ const probability = count / value.length;
370
+ entropy -= probability * Math.log2(probability);
371
+ }
372
+ return entropy;
373
+ }
374
+ function isRecord(value) {
375
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
376
+ }
377
+ //# sourceMappingURL=redactText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactText.js","sourceRoot":"","sources":["../../src/util/redactText.ts"],"names":[],"mappings":"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"}