tauri-agent-tools 0.7.0 → 0.8.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.
- package/.agents/skills/tauri-agent-tools/SKILL.md +50 -13
- package/.agents/skills/tauri-bridge-setup/SKILL.md +5 -3
- package/.agents/skills/tauri-debug-quickstart/SKILL.md +9 -6
- package/AGENTS.md +13 -3
- package/README.md +26 -5
- package/dist/bridge/client.d.ts +8 -0
- package/dist/bridge/client.js +20 -0
- package/dist/bridge/client.js.map +1 -1
- package/dist/bridge/tokenDiscovery.js +29 -29
- package/dist/bridge/tokenDiscovery.js.map +1 -1
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/bundle.d.ts +2 -0
- package/dist/commands/bundle.js +251 -0
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/capabilitiesAudit.js +14 -1
- package/dist/commands/capabilitiesAudit.js.map +1 -1
- package/dist/commands/capture.js +1 -1
- package/dist/commands/health.js +19 -1
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/invoke.js +14 -4
- package/dist/commands/invoke.js.map +1 -1
- package/dist/commands/ipcMonitor.d.ts +3 -0
- package/dist/commands/ipcMonitor.js +60 -14
- package/dist/commands/ipcMonitor.js.map +1 -1
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.js +193 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/pageState.d.ts +1 -0
- package/dist/commands/pageState.js +2 -2
- package/dist/commands/pageState.js.map +1 -1
- package/dist/commands/processTree.js +116 -4
- package/dist/commands/processTree.js.map +1 -1
- package/dist/commands/shared.d.ts +31 -0
- package/dist/commands/shared.js +52 -1
- package/dist/commands/shared.js.map +1 -1
- package/dist/commands/snapshot.js +1 -1
- package/dist/commands/webviewAttach.js +17 -1
- package/dist/commands/webviewAttach.js.map +1 -1
- package/dist/platform/macos.js +35 -15
- package/dist/platform/macos.js.map +1 -1
- package/dist/util/logMerge.d.ts +42 -0
- package/dist/util/logMerge.js +133 -0
- package/dist/util/logMerge.js.map +1 -0
- package/dist/util/mergeByTimestamp.d.ts +18 -0
- package/dist/util/mergeByTimestamp.js +30 -0
- package/dist/util/mergeByTimestamp.js.map +1 -0
- package/dist/util/psTree.d.ts +28 -0
- package/dist/util/psTree.js +76 -0
- package/dist/util/psTree.js.map +1 -0
- package/examples/tauri-bridge/src/dev_bridge.rs +112 -32
- package/package.json +1 -1
- package/rust-bridge/README.md +10 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { mkdir, writeFile, readFile, readdir, stat } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { addBridgeOptions } from './shared.js';
|
|
6
|
+
import { exec } from '../util/exec.js';
|
|
7
|
+
export function registerBundle(program) {
|
|
8
|
+
const cmd = new Command('bundle')
|
|
9
|
+
.description('Collect a shareable incident bundle: merged logs, deep process tree, app paths, forensics ' +
|
|
10
|
+
'(and optionally a UI capture) into one redacted directory + .tar.gz. Best-effort — degrades cleanly.')
|
|
11
|
+
.option('--config <path>', 'Path to tauri.conf.json (or its directory). Auto-detected if omitted.')
|
|
12
|
+
.option('--identifier <id>', 'Bundle identifier override')
|
|
13
|
+
.option('-o, --out <dir>', 'Output directory (default: ./bundle-<timestamp>)')
|
|
14
|
+
.option('--since <duration>', 'How far back to pull from app log files (forensics phase, default: 10m)')
|
|
15
|
+
.option('--with-capture', 'Also capture a UI snapshot (screenshot + DOM); needs a live bridge')
|
|
16
|
+
.option('--no-archive', 'Skip the final .tar.gz (leave the directory only)')
|
|
17
|
+
.option('--json', 'Print the summary as JSON in addition to writing it to disk');
|
|
18
|
+
addBridgeOptions(cmd);
|
|
19
|
+
cmd.action(async (opts) => {
|
|
20
|
+
const outDir = opts.out ?? `./bundle-${timestampSlug()}`;
|
|
21
|
+
await mkdir(outDir, { recursive: true });
|
|
22
|
+
const outcomes = [];
|
|
23
|
+
// ── Merged logs (bridge-optional + on-disk files) ───────────────────────
|
|
24
|
+
{
|
|
25
|
+
const args = ['logs', '--json'];
|
|
26
|
+
if (opts.config)
|
|
27
|
+
args.push('--config', opts.config);
|
|
28
|
+
if (opts.identifier)
|
|
29
|
+
args.push('--identifier', opts.identifier);
|
|
30
|
+
forwardBridge(args, opts);
|
|
31
|
+
outcomes.push(await runCapturingStdout(args, join(outDir, 'logs.ndjson')));
|
|
32
|
+
}
|
|
33
|
+
// ── Deep OS process tree ────────────────────────────────────────────────
|
|
34
|
+
{
|
|
35
|
+
const args = ['process-tree', '--deep', '--json'];
|
|
36
|
+
forwardBridge(args, opts);
|
|
37
|
+
outcomes.push(await runCapturingStdout(args, join(outDir, 'process-tree.json')));
|
|
38
|
+
}
|
|
39
|
+
// ── App paths ───────────────────────────────────────────────────────────
|
|
40
|
+
{
|
|
41
|
+
const args = ['app-paths', '--platform', 'all', '--exists', '--json'];
|
|
42
|
+
if (opts.config)
|
|
43
|
+
args.push('--config', opts.config);
|
|
44
|
+
if (opts.identifier)
|
|
45
|
+
args.push('--identifier', opts.identifier);
|
|
46
|
+
outcomes.push(await runCapturingStdout(args, join(outDir, 'app-paths.json')));
|
|
47
|
+
}
|
|
48
|
+
// ── Forensics bundle (bridge-free; works on a dead app) ─────────────────
|
|
49
|
+
{
|
|
50
|
+
const args = ['forensics', '-o', join(outDir, 'forensics')];
|
|
51
|
+
if (opts.config)
|
|
52
|
+
args.push('--config', opts.config);
|
|
53
|
+
if (opts.identifier)
|
|
54
|
+
args.push('--identifier', opts.identifier);
|
|
55
|
+
if (opts.since)
|
|
56
|
+
args.push('--since', opts.since);
|
|
57
|
+
outcomes.push(await runToDir('forensics', args));
|
|
58
|
+
}
|
|
59
|
+
// ── Optional UI capture (needs a live bridge + screenshot tools) ────────
|
|
60
|
+
if (opts.withCapture) {
|
|
61
|
+
const args = ['capture', '-o', join(outDir, 'capture'), '--json'];
|
|
62
|
+
forwardBridge(args, opts);
|
|
63
|
+
outcomes.push(await runToDir('capture', args));
|
|
64
|
+
}
|
|
65
|
+
// ── Redact obvious secrets across all collected text files ──────────────
|
|
66
|
+
const redacted = await redactDir(outDir);
|
|
67
|
+
outcomes.push({ phase: 'redact', ok: true, detail: `redacted ${redacted} value(s)` });
|
|
68
|
+
// ── Summary ─────────────────────────────────────────────────────────────
|
|
69
|
+
const summary = {
|
|
70
|
+
outDir,
|
|
71
|
+
createdPhases: outcomes,
|
|
72
|
+
ok: outcomes.filter((o) => o.ok).length,
|
|
73
|
+
total: outcomes.length,
|
|
74
|
+
};
|
|
75
|
+
await writeFile(join(outDir, 'summary.json'), JSON.stringify(summary, null, 2));
|
|
76
|
+
await writeFile(join(outDir, 'summary.md'), renderSummary(outDir, outcomes));
|
|
77
|
+
// ── Archive ─────────────────────────────────────────────────────────────
|
|
78
|
+
let archivePath = null;
|
|
79
|
+
if (opts.archive !== false) {
|
|
80
|
+
archivePath = `${outDir.replace(/\/+$/, '')}.tar.gz`;
|
|
81
|
+
try {
|
|
82
|
+
await exec('tar', ['-czf', archivePath, '-C', dirnameOf(outDir), basenameOf(outDir)]);
|
|
83
|
+
outcomes.push({ phase: 'archive', ok: true, detail: `→ ${archivePath}` });
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
archivePath = null;
|
|
87
|
+
outcomes.push({
|
|
88
|
+
phase: 'archive',
|
|
89
|
+
ok: false,
|
|
90
|
+
detail: e instanceof Error ? e.message : String(e),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (opts.json) {
|
|
95
|
+
console.log(JSON.stringify({ ...summary, archive: archivePath }, null, 2));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.log(`✓ Incident bundle written to ${outDir}`);
|
|
99
|
+
console.log(` ${summary.ok}/${summary.total} phases succeeded`);
|
|
100
|
+
if (archivePath)
|
|
101
|
+
console.log(` Archive: ${archivePath}`);
|
|
102
|
+
console.log(` Open ${join(outDir, 'summary.md')} first.`);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
program.addCommand(cmd);
|
|
106
|
+
}
|
|
107
|
+
function forwardBridge(args, opts) {
|
|
108
|
+
if (opts.port !== undefined)
|
|
109
|
+
args.push('--port', String(opts.port));
|
|
110
|
+
if (opts.token !== undefined)
|
|
111
|
+
args.push('--token', opts.token);
|
|
112
|
+
if (opts.pid !== undefined)
|
|
113
|
+
args.push('--pid', String(opts.pid));
|
|
114
|
+
if (opts.windowLabel !== undefined)
|
|
115
|
+
args.push('--window-label', opts.windowLabel);
|
|
116
|
+
}
|
|
117
|
+
function timestampSlug() {
|
|
118
|
+
return new Date().toISOString().replace(/[:.]/g, '-');
|
|
119
|
+
}
|
|
120
|
+
function dirnameOf(p) {
|
|
121
|
+
const norm = p.replace(/\/+$/, '');
|
|
122
|
+
const idx = norm.lastIndexOf('/');
|
|
123
|
+
return idx <= 0 ? '.' : norm.slice(0, idx);
|
|
124
|
+
}
|
|
125
|
+
function basenameOf(p) {
|
|
126
|
+
const norm = p.replace(/\/+$/, '');
|
|
127
|
+
const idx = norm.lastIndexOf('/');
|
|
128
|
+
return idx < 0 ? norm : norm.slice(idx + 1);
|
|
129
|
+
}
|
|
130
|
+
/** Spawn this same CLI binary, capturing stdout into `outFile`. */
|
|
131
|
+
function runCapturingStdout(args, outFile) {
|
|
132
|
+
return new Promise((resolve) => {
|
|
133
|
+
const cliPath = process.argv[1];
|
|
134
|
+
if (!cliPath) {
|
|
135
|
+
resolve({ phase: args[0] ?? 'phase', ok: false, detail: 'could not locate CLI binary' });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const child = spawn(process.execPath, [cliPath, ...args], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
139
|
+
let stdout = '';
|
|
140
|
+
let stderr = '';
|
|
141
|
+
child.stdout.setEncoding('utf-8');
|
|
142
|
+
child.stdout.on('data', (c) => (stdout += c));
|
|
143
|
+
child.stderr.setEncoding('utf-8');
|
|
144
|
+
child.stderr.on('data', (c) => (stderr += c));
|
|
145
|
+
child.on('error', (err) => resolve({ phase: args[0] ?? 'phase', ok: false, detail: err.message }));
|
|
146
|
+
child.on('close', async (code) => {
|
|
147
|
+
try {
|
|
148
|
+
await writeFile(outFile, stdout);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
/* ignore write failure */
|
|
152
|
+
}
|
|
153
|
+
resolve({
|
|
154
|
+
phase: args[0] ?? 'phase',
|
|
155
|
+
ok: code === 0,
|
|
156
|
+
detail: code === 0 ? `→ ${outFile}` : `exit ${code}${stderr ? ': ' + stderr.trim().slice(0, 200) : ''}`,
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/** Spawn this CLI binary for a command that writes its own output directory. */
|
|
162
|
+
function runToDir(phase, args) {
|
|
163
|
+
return new Promise((resolve) => {
|
|
164
|
+
const cliPath = process.argv[1];
|
|
165
|
+
if (!cliPath) {
|
|
166
|
+
resolve({ phase, ok: false, detail: 'could not locate CLI binary' });
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const child = spawn(process.execPath, [cliPath, ...args], { stdio: ['ignore', 'ignore', 'pipe'] });
|
|
170
|
+
let stderr = '';
|
|
171
|
+
child.stderr.setEncoding('utf-8');
|
|
172
|
+
child.stderr.on('data', (c) => (stderr += c));
|
|
173
|
+
child.on('error', (err) => resolve({ phase, ok: false, detail: err.message }));
|
|
174
|
+
child.on('close', (code) => resolve({
|
|
175
|
+
phase,
|
|
176
|
+
ok: code === 0,
|
|
177
|
+
detail: code === 0 ? 'ok' : `exit ${code}${stderr ? ': ' + stderr.trim().slice(0, 200) : ''}`,
|
|
178
|
+
}));
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
const REDACT_PATTERNS = [
|
|
182
|
+
[/("token"\s*:\s*")[^"]+(")/gi, '$1***$2'],
|
|
183
|
+
[/\btoken=([\w.-]+)/gi, 'token=***'],
|
|
184
|
+
[/("(?:authorization|api[_-]?key|secret|password)"\s*:\s*")[^"]+(")/gi, '$1***$2'],
|
|
185
|
+
];
|
|
186
|
+
/** Walk the bundle dir and redact obvious secrets from text files. Returns count of redactions. */
|
|
187
|
+
async function redactDir(dir) {
|
|
188
|
+
let total = 0;
|
|
189
|
+
const entries = await readdir(dir).catch(() => []);
|
|
190
|
+
for (const name of entries) {
|
|
191
|
+
const full = join(dir, name);
|
|
192
|
+
const st = await stat(full).catch(() => null);
|
|
193
|
+
if (!st)
|
|
194
|
+
continue;
|
|
195
|
+
if (st.isDirectory()) {
|
|
196
|
+
total += await redactDir(full);
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (!/\.(json|ndjson|txt|md|log)$/i.test(name))
|
|
200
|
+
continue;
|
|
201
|
+
let content;
|
|
202
|
+
try {
|
|
203
|
+
content = await readFile(full, 'utf-8');
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
let changed = false;
|
|
209
|
+
for (const [re, repl] of REDACT_PATTERNS) {
|
|
210
|
+
const next = content.replace(re, (...a) => {
|
|
211
|
+
total += 1;
|
|
212
|
+
return interpolate(repl, a);
|
|
213
|
+
});
|
|
214
|
+
if (next !== content) {
|
|
215
|
+
content = next;
|
|
216
|
+
changed = true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (changed)
|
|
220
|
+
await writeFile(full, content).catch(() => { });
|
|
221
|
+
}
|
|
222
|
+
return total;
|
|
223
|
+
}
|
|
224
|
+
function interpolate(template, matchArgs) {
|
|
225
|
+
return template.replace(/\$(\d)/g, (_, d) => String(matchArgs[Number(d)] ?? ''));
|
|
226
|
+
}
|
|
227
|
+
function renderSummary(outDir, outcomes) {
|
|
228
|
+
const rows = outcomes.map((o) => `- ${o.ok ? '✓' : '✗'} **${o.phase}** — ${o.detail}`).join('\n');
|
|
229
|
+
return `# Incident bundle
|
|
230
|
+
|
|
231
|
+
- **Output:** \`${outDir}\`
|
|
232
|
+
|
|
233
|
+
## Contents
|
|
234
|
+
|
|
235
|
+
- \`logs.ndjson\` — merged, timestamp-ordered logs (bridge ring buffer + on-disk log files)
|
|
236
|
+
- \`process-tree.json\` — full OS process descendant tree (sidecars + grandchildren)
|
|
237
|
+
- \`app-paths.json\` — resolved per-platform data/log/cache/config dirs (with existence)
|
|
238
|
+
- \`forensics/\` — post-mortem bundle (app-log tail, panic markers, OS-log tail, app-data listing)
|
|
239
|
+
- \`capture/\` — UI snapshot (only when \`--with-capture\` and a bridge were available)
|
|
240
|
+
|
|
241
|
+
## Phases
|
|
242
|
+
|
|
243
|
+
${rows}
|
|
244
|
+
|
|
245
|
+
## Notes
|
|
246
|
+
|
|
247
|
+
Secrets (\`token\`, \`api_key\`, \`password\`, …) were redacted from text artifacts on write.
|
|
248
|
+
Re-run any individual command directly for live/interactive inspection.
|
|
249
|
+
`;
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/commands/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import { addBridgeOptions, resolveBridge } from './shared.js';
|
|
2
|
+
import { addBridgeOptions, resolveBridge, endpointAvailable, endpointUnavailableNote, } from './shared.js';
|
|
3
3
|
const OVERBROAD_PERMISSIONS = new Set([
|
|
4
4
|
'fs:allow-all',
|
|
5
5
|
'fs:default',
|
|
@@ -17,6 +17,19 @@ export function registerCapabilitiesAudit(program) {
|
|
|
17
17
|
addBridgeOptions(sub);
|
|
18
18
|
sub.action(async (opts) => {
|
|
19
19
|
const bridge = await resolveBridge(opts);
|
|
20
|
+
// Graceful degradation: older bridges (pre-v0.7) have no /capabilities
|
|
21
|
+
// endpoint. Point the user at the bridge-free static auditor instead.
|
|
22
|
+
if (!(await endpointAvailable(bridge, '/capabilities', opts))) {
|
|
23
|
+
const note = endpointUnavailableNote('/capabilities', (await bridge.version())?.version) +
|
|
24
|
+
' For a bridge-free audit, run `tauri-agent-tools config inspect`.';
|
|
25
|
+
if (opts.json) {
|
|
26
|
+
console.log(JSON.stringify({ endpoint: '/capabilities', available: false, note }, null, 2));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.error(`note: ${note}`);
|
|
30
|
+
}
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
20
33
|
const caps = await bridge.capabilities();
|
|
21
34
|
const findings = audit(caps);
|
|
22
35
|
const out = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilitiesAudit.js","sourceRoot":"","sources":["../../src/commands/capabilitiesAudit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"capabilitiesAudit.js","sourceRoot":"","sources":["../../src/commands/capabilitiesAudit.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/capture.js
CHANGED
|
@@ -13,7 +13,7 @@ const PAGE_STATE_SCRIPT = `(() => {
|
|
|
13
13
|
viewport: { width: window.innerWidth, height: window.innerHeight },
|
|
14
14
|
scroll: { x: Math.round(window.scrollX), y: Math.round(window.scrollY) },
|
|
15
15
|
document: { width: document.documentElement.scrollWidth, height: document.documentElement.scrollHeight },
|
|
16
|
-
hasTauri: !!(window.__TAURI__)
|
|
16
|
+
hasTauri: !!(window.__TAURI_INTERNALS__ || window.__TAURI__)
|
|
17
17
|
});
|
|
18
18
|
})()`;
|
|
19
19
|
const STORAGE_SCRIPT = `(() => {
|
package/dist/commands/health.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import { addBridgeOptions, resolveBridge } from './shared.js';
|
|
2
|
+
import { addBridgeOptions, resolveBridge, endpointAvailable, endpointUnavailableNote, } from './shared.js';
|
|
3
3
|
export function registerHealth(program) {
|
|
4
4
|
const cmd = new Command('health')
|
|
5
5
|
.description('Quick "is this Tauri app sick" check (requires bridge v0.7.0+)')
|
|
@@ -7,6 +7,24 @@ export function registerHealth(program) {
|
|
|
7
7
|
addBridgeOptions(cmd);
|
|
8
8
|
cmd.action(async (opts) => {
|
|
9
9
|
const bridge = await resolveBridge(opts);
|
|
10
|
+
// Graceful degradation: older bridges (pre-v0.7) have no /health endpoint.
|
|
11
|
+
// Fall back to a basic liveness ping instead of throwing.
|
|
12
|
+
if (!(await endpointAvailable(bridge, '/health', opts))) {
|
|
13
|
+
const note = endpointUnavailableNote('/health', (await bridge.version())?.version);
|
|
14
|
+
const alive = await bridge.ping();
|
|
15
|
+
if (opts.json) {
|
|
16
|
+
console.log(JSON.stringify({ endpoint: '/health', available: false, note, bridge_alive: alive }, null, 2));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.error(`note: ${note}`);
|
|
20
|
+
console.log(`Bridge alive: ${alive ? 'yes' : 'NO'}`);
|
|
21
|
+
console.log(`Webview ready: (unknown — needs bridge v0.7.0+)`);
|
|
22
|
+
console.log(`Sidecars alive: (unknown — needs bridge v0.7.0+)`);
|
|
23
|
+
}
|
|
24
|
+
// A missing endpoint is not itself "unhealthy" — keep exit code 0 so it
|
|
25
|
+
// doesn't break CI gates that tolerate older bridges.
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
10
28
|
const h = await bridge.health();
|
|
11
29
|
if (opts.json) {
|
|
12
30
|
console.log(JSON.stringify(h, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/invoke.js
CHANGED
|
@@ -5,14 +5,24 @@ export function buildInvokeScript(command, args) {
|
|
|
5
5
|
const commandJson = JSON.stringify(command);
|
|
6
6
|
const argsJson = JSON.stringify(args);
|
|
7
7
|
return `(async () => {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
function getTauriInvoke() {
|
|
9
|
+
if (window.__TAURI_INTERNALS__ && typeof window.__TAURI_INTERNALS__.invoke === 'function') {
|
|
10
|
+
return window.__TAURI_INTERNALS__.invoke.bind(window.__TAURI_INTERNALS__);
|
|
11
|
+
}
|
|
12
|
+
if (window.__TAURI__ && window.__TAURI__.core && typeof window.__TAURI__.core.invoke === 'function') {
|
|
13
|
+
return window.__TAURI__.core.invoke.bind(window.__TAURI__.core);
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
var invoke = getTauriInvoke();
|
|
18
|
+
if (!invoke) {
|
|
19
|
+
return JSON.stringify({ success: false, command: ${commandJson}, error: 'Tauri invoke API not found: expected window.__TAURI_INTERNALS__.invoke or window.__TAURI__.core.invoke' });
|
|
10
20
|
}
|
|
11
21
|
try {
|
|
12
|
-
var result = await
|
|
22
|
+
var result = await invoke(${commandJson}, ${argsJson});
|
|
13
23
|
return JSON.stringify({ success: true, command: ${commandJson}, result: result });
|
|
14
24
|
} catch (e) {
|
|
15
|
-
return JSON.stringify({ success: false, command: ${commandJson}, error: e.message });
|
|
25
|
+
return JSON.stringify({ success: false, command: ${commandJson}, error: e && e.message ? e.message : String(e) });
|
|
16
26
|
}
|
|
17
27
|
})()`;
|
|
18
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAa;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAa;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO;;;;;;;;;;;;uDAY8C,WAAW;;;gCAGlC,WAAW,KAAK,QAAQ;sDACF,WAAW;;uDAEV,WAAW;;KAE7D,CAAC;AACN,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC9B,WAAW,CAAC,mCAAmC,CAAC;SAChD,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;SAC3C,QAAQ,CAAC,QAAQ,EAAE,oCAAoC,CAAC;SACxD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAEtC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEtB,GAAG,CAAC,MAAM,CACR,KAAK,EAAE,OAAe,EAAE,OAA2B,EAAE,IAAqC,EAAE,EAAE;QAC5F,IAAI,IAAI,GAAY,EAAE,CAAC;QACvB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAiB,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAE/E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
export declare const PATCH_SCRIPT = "(() => {\n if (window.__tauriDevToolsPatched) return 'already_patched';\n function getInvokeTarget() {\n if (window.__TAURI_INTERNALS__ && typeof window.__TAURI_INTERNALS__.invoke === 'function') {\n return { owner: window.__TAURI_INTERNALS__, invoke: window.__TAURI_INTERNALS__.invoke };\n }\n if (window.__TAURI__ && window.__TAURI__.core && typeof window.__TAURI__.core.invoke === 'function') {\n return { owner: window.__TAURI__.core, invoke: window.__TAURI__.core.invoke };\n }\n return null;\n }\n var target = getInvokeTarget();\n if (!target) {\n return 'no_tauri';\n }\n window.__tauriDevToolsOriginalInvoke = target.invoke;\n window.__tauriDevToolsInvokeOwner = target.owner;\n window.__tauriDevToolsIpcLog = [];\n target.owner.invoke = function(cmd, args, options) {\n var entry = { command: cmd, args: args || {}, timestamp: Date.now() };\n var start = performance.now();\n return window.__tauriDevToolsOriginalInvoke.call(this, cmd, args, options).then(function(result) {\n entry.duration = Math.round(performance.now() - start);\n entry.result = result;\n window.__tauriDevToolsIpcLog.push(entry);\n return result;\n }).catch(function(err) {\n entry.duration = Math.round(performance.now() - start);\n entry.error = err && err.message ? err.message : String(err);\n window.__tauriDevToolsIpcLog.push(entry);\n throw err;\n });\n };\n window.__tauriDevToolsPatched = true;\n return 'patched';\n})()";
|
|
3
|
+
export declare const DRAIN_SCRIPT = "(() => {\n var log = window.__tauriDevToolsIpcLog || [];\n window.__tauriDevToolsIpcLog = [];\n return JSON.stringify(log);\n})()";
|
|
4
|
+
export declare const CLEANUP_SCRIPT = "(() => {\n if (window.__tauriDevToolsOriginalInvoke && window.__tauriDevToolsInvokeOwner) {\n window.__tauriDevToolsInvokeOwner.invoke = window.__tauriDevToolsOriginalInvoke;\n delete window.__tauriDevToolsOriginalInvoke;\n delete window.__tauriDevToolsInvokeOwner;\n delete window.__tauriDevToolsIpcLog;\n delete window.__tauriDevToolsPatched;\n }\n return 'cleaned';\n})()";
|
|
2
5
|
export declare function registerIpcMonitor(program: Command): void;
|
|
@@ -2,17 +2,28 @@ import { Command } from 'commander';
|
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { addBridgeOptions, resolveBridge } from './shared.js';
|
|
4
4
|
import { IpcEntrySchema } from '../schemas/commands.js';
|
|
5
|
-
const PATCH_SCRIPT = `(() => {
|
|
5
|
+
export const PATCH_SCRIPT = `(() => {
|
|
6
6
|
if (window.__tauriDevToolsPatched) return 'already_patched';
|
|
7
|
-
|
|
7
|
+
function getInvokeTarget() {
|
|
8
|
+
if (window.__TAURI_INTERNALS__ && typeof window.__TAURI_INTERNALS__.invoke === 'function') {
|
|
9
|
+
return { owner: window.__TAURI_INTERNALS__, invoke: window.__TAURI_INTERNALS__.invoke };
|
|
10
|
+
}
|
|
11
|
+
if (window.__TAURI__ && window.__TAURI__.core && typeof window.__TAURI__.core.invoke === 'function') {
|
|
12
|
+
return { owner: window.__TAURI__.core, invoke: window.__TAURI__.core.invoke };
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
var target = getInvokeTarget();
|
|
17
|
+
if (!target) {
|
|
8
18
|
return 'no_tauri';
|
|
9
19
|
}
|
|
10
|
-
window.__tauriDevToolsOriginalInvoke =
|
|
20
|
+
window.__tauriDevToolsOriginalInvoke = target.invoke;
|
|
21
|
+
window.__tauriDevToolsInvokeOwner = target.owner;
|
|
11
22
|
window.__tauriDevToolsIpcLog = [];
|
|
12
|
-
|
|
23
|
+
target.owner.invoke = function(cmd, args, options) {
|
|
13
24
|
var entry = { command: cmd, args: args || {}, timestamp: Date.now() };
|
|
14
25
|
var start = performance.now();
|
|
15
|
-
return window.__tauriDevToolsOriginalInvoke.call(this, cmd, args).then(function(result) {
|
|
26
|
+
return window.__tauriDevToolsOriginalInvoke.call(this, cmd, args, options).then(function(result) {
|
|
16
27
|
entry.duration = Math.round(performance.now() - start);
|
|
17
28
|
entry.result = result;
|
|
18
29
|
window.__tauriDevToolsIpcLog.push(entry);
|
|
@@ -27,15 +38,16 @@ const PATCH_SCRIPT = `(() => {
|
|
|
27
38
|
window.__tauriDevToolsPatched = true;
|
|
28
39
|
return 'patched';
|
|
29
40
|
})()`;
|
|
30
|
-
const DRAIN_SCRIPT = `(() => {
|
|
41
|
+
export const DRAIN_SCRIPT = `(() => {
|
|
31
42
|
var log = window.__tauriDevToolsIpcLog || [];
|
|
32
43
|
window.__tauriDevToolsIpcLog = [];
|
|
33
44
|
return JSON.stringify(log);
|
|
34
45
|
})()`;
|
|
35
|
-
const CLEANUP_SCRIPT = `(() => {
|
|
36
|
-
if (window.__tauriDevToolsOriginalInvoke) {
|
|
37
|
-
window.
|
|
46
|
+
export const CLEANUP_SCRIPT = `(() => {
|
|
47
|
+
if (window.__tauriDevToolsOriginalInvoke && window.__tauriDevToolsInvokeOwner) {
|
|
48
|
+
window.__tauriDevToolsInvokeOwner.invoke = window.__tauriDevToolsOriginalInvoke;
|
|
38
49
|
delete window.__tauriDevToolsOriginalInvoke;
|
|
50
|
+
delete window.__tauriDevToolsInvokeOwner;
|
|
39
51
|
delete window.__tauriDevToolsIpcLog;
|
|
40
52
|
delete window.__tauriDevToolsPatched;
|
|
41
53
|
}
|
|
@@ -50,11 +62,25 @@ function compileWildcardFilter(filter) {
|
|
|
50
62
|
const pattern = '^' + filter.split('*').map(escapeRegExp).join('.*') + '$';
|
|
51
63
|
return new RegExp(pattern);
|
|
52
64
|
}
|
|
53
|
-
function formatEntry(entry) {
|
|
65
|
+
function formatEntry(entry, slow = false) {
|
|
54
66
|
const time = new Date(entry.timestamp).toISOString().slice(11, 23);
|
|
55
67
|
const dur = entry.duration !== undefined ? ` ${entry.duration}ms` : '';
|
|
56
68
|
const status = entry.error ? `ERR: ${entry.error}` : 'OK';
|
|
57
|
-
|
|
69
|
+
const slowMark = slow ? ' SLOW' : '';
|
|
70
|
+
return `[${time}]${dur} ${entry.command} ${status}${slowMark}`;
|
|
71
|
+
}
|
|
72
|
+
function renderStats(stats) {
|
|
73
|
+
if (stats.size === 0) {
|
|
74
|
+
console.error('# no IPC calls observed');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const rows = [...stats.entries()].sort((a, b) => b[1].maxMs - a[1].maxMs);
|
|
78
|
+
console.error('# IPC summary (by slowest):');
|
|
79
|
+
for (const [command, s] of rows) {
|
|
80
|
+
const avg = s.count > 0 ? Math.round(s.totalMs / s.count) : 0;
|
|
81
|
+
const errPart = s.errors > 0 ? ` errors=${s.errors}` : '';
|
|
82
|
+
console.error(`# ${command.padEnd(28)} n=${s.count} max=${s.maxMs}ms avg=${avg}ms${errPart}`);
|
|
83
|
+
}
|
|
58
84
|
}
|
|
59
85
|
async function cleanup(bridge) {
|
|
60
86
|
try {
|
|
@@ -70,15 +96,18 @@ export function registerIpcMonitor(program) {
|
|
|
70
96
|
.option('--filter <command>', 'Only show specific IPC commands (supports * wildcards)')
|
|
71
97
|
.option('--interval <ms>', 'Poll interval in milliseconds', parseInt, 500)
|
|
72
98
|
.option('--duration <ms>', 'Auto-stop after N milliseconds', parseInt)
|
|
99
|
+
.option('--slow <ms>', 'Flag IPC calls that completed but took ≥ N ms', parseInt)
|
|
100
|
+
.option('--stats', 'Print a per-command latency summary on exit')
|
|
73
101
|
.option('--json', 'Output one JSON object per line');
|
|
74
102
|
addBridgeOptions(cmd);
|
|
75
103
|
cmd.action(async (opts) => {
|
|
76
104
|
const filterRegex = opts.filter ? compileWildcardFilter(opts.filter) : null;
|
|
105
|
+
const stats = new Map();
|
|
77
106
|
const bridge = await resolveBridge(opts);
|
|
78
107
|
// Inject the monkey-patch
|
|
79
108
|
const patchResult = await bridge.eval(PATCH_SCRIPT);
|
|
80
109
|
if (patchResult === 'no_tauri') {
|
|
81
|
-
throw new Error('
|
|
110
|
+
throw new Error('Tauri invoke API not found. Expected window.__TAURI_INTERNALS__.invoke or window.__TAURI__.core.invoke.');
|
|
82
111
|
}
|
|
83
112
|
let stopped = false;
|
|
84
113
|
const onSignal = () => {
|
|
@@ -112,11 +141,26 @@ export function registerIpcMonitor(program) {
|
|
|
112
141
|
continue;
|
|
113
142
|
}
|
|
114
143
|
}
|
|
144
|
+
if (opts.stats) {
|
|
145
|
+
const s = stats.get(entry.command) ?? { count: 0, errors: 0, totalMs: 0, maxMs: 0 };
|
|
146
|
+
s.count += 1;
|
|
147
|
+
if (entry.error)
|
|
148
|
+
s.errors += 1;
|
|
149
|
+
if (entry.duration !== undefined) {
|
|
150
|
+
s.totalMs += entry.duration;
|
|
151
|
+
if (entry.duration > s.maxMs)
|
|
152
|
+
s.maxMs = entry.duration;
|
|
153
|
+
}
|
|
154
|
+
stats.set(entry.command, s);
|
|
155
|
+
}
|
|
156
|
+
const isSlow = opts.slow !== undefined &&
|
|
157
|
+
entry.duration !== undefined &&
|
|
158
|
+
entry.duration >= opts.slow;
|
|
115
159
|
if (opts.json) {
|
|
116
|
-
console.log(JSON.stringify(entry));
|
|
160
|
+
console.log(JSON.stringify(isSlow ? { ...entry, slow: true } : entry));
|
|
117
161
|
}
|
|
118
162
|
else {
|
|
119
|
-
console.log(formatEntry(entry));
|
|
163
|
+
console.log(formatEntry(entry, isSlow));
|
|
120
164
|
}
|
|
121
165
|
}
|
|
122
166
|
}
|
|
@@ -127,6 +171,8 @@ export function registerIpcMonitor(program) {
|
|
|
127
171
|
process.off('SIGINT', onSignal);
|
|
128
172
|
process.off('SIGTERM', onSignal);
|
|
129
173
|
await cleanup(bridge);
|
|
174
|
+
if (opts.stats)
|
|
175
|
+
renderStats(stats);
|
|
130
176
|
}
|
|
131
177
|
});
|
|
132
178
|
program.addCommand(cmd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipcMonitor.js","sourceRoot":"","sources":["../../src/commands/ipcMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,MAAM,YAAY,GAAG
|
|
1
|
+
{"version":3,"file":"ipcMonitor.js","sourceRoot":"","sources":["../../src/commands/ipcMonitor.ts"],"names":[],"mappings":"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"}
|