tauri-agent-tools 0.9.1 → 0.9.3

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 (122) hide show
  1. package/.agents/skills/tauri-agent-tools/SKILL.md +32 -13
  2. package/.agents/skills/tauri-bridge-setup/SKILL.md +4 -3
  3. package/.agents/skills/tauri-debug-quickstart/SKILL.md +3 -1
  4. package/AGENTS.md +7 -3
  5. package/README.md +35 -14
  6. package/dist/bridge/client.d.ts +1 -0
  7. package/dist/bridge/client.js +2 -0
  8. package/dist/bridge/client.js.map +1 -1
  9. package/dist/bridge/evaluate.d.ts +11 -0
  10. package/dist/bridge/evaluate.js +33 -0
  11. package/dist/bridge/evaluate.js.map +1 -0
  12. package/dist/bridge/logReader.d.ts +27 -0
  13. package/dist/bridge/logReader.js +26 -0
  14. package/dist/bridge/logReader.js.map +1 -0
  15. package/dist/bridge/observers.d.ts +11 -0
  16. package/dist/bridge/observers.js +195 -0
  17. package/dist/bridge/observers.js.map +1 -0
  18. package/dist/cli.js +28 -8
  19. package/dist/cli.js.map +1 -1
  20. package/dist/commands/bundle.js +122 -101
  21. package/dist/commands/bundle.js.map +1 -1
  22. package/dist/commands/capture.d.ts +3 -3
  23. package/dist/commands/capture.js +167 -141
  24. package/dist/commands/capture.js.map +1 -1
  25. package/dist/commands/check.js +44 -59
  26. package/dist/commands/check.js.map +1 -1
  27. package/dist/commands/consoleMonitor.js +18 -85
  28. package/dist/commands/consoleMonitor.js.map +1 -1
  29. package/dist/commands/diagnose.js +4 -32
  30. package/dist/commands/diagnose.js.map +1 -1
  31. package/dist/commands/diff.js +28 -38
  32. package/dist/commands/diff.js.map +1 -1
  33. package/dist/commands/dom.js +2 -2
  34. package/dist/commands/dom.js.map +1 -1
  35. package/dist/commands/eval.js +11 -1
  36. package/dist/commands/eval.js.map +1 -1
  37. package/dist/commands/forensics.js +1 -7
  38. package/dist/commands/forensics.js.map +1 -1
  39. package/dist/commands/info.d.ts +2 -2
  40. package/dist/commands/info.js +3 -1
  41. package/dist/commands/info.js.map +1 -1
  42. package/dist/commands/interact/click.js +14 -44
  43. package/dist/commands/interact/click.js.map +1 -1
  44. package/dist/commands/interact/scroll.js +6 -0
  45. package/dist/commands/interact/scroll.js.map +1 -1
  46. package/dist/commands/interact/select.d.ts +6 -1
  47. package/dist/commands/interact/select.js +87 -29
  48. package/dist/commands/interact/select.js.map +1 -1
  49. package/dist/commands/interact/shared.d.ts +96 -0
  50. package/dist/commands/interact/shared.js +266 -1
  51. package/dist/commands/interact/shared.js.map +1 -1
  52. package/dist/commands/interact/type.d.ts +10 -2
  53. package/dist/commands/interact/type.js +44 -29
  54. package/dist/commands/interact/type.js.map +1 -1
  55. package/dist/commands/ipcMonitor.d.ts +3 -3
  56. package/dist/commands/ipcMonitor.js +26 -96
  57. package/dist/commands/ipcMonitor.js.map +1 -1
  58. package/dist/commands/listWindows.d.ts +2 -2
  59. package/dist/commands/listWindows.js.map +1 -1
  60. package/dist/commands/logs.d.ts +4 -27
  61. package/dist/commands/logs.js +12 -41
  62. package/dist/commands/logs.js.map +1 -1
  63. package/dist/commands/mutations.js +20 -101
  64. package/dist/commands/mutations.js.map +1 -1
  65. package/dist/commands/osLogs.js +2 -5
  66. package/dist/commands/osLogs.js.map +1 -1
  67. package/dist/commands/probe.js +18 -16
  68. package/dist/commands/probe.js.map +1 -1
  69. package/dist/commands/rustLogs.js +23 -43
  70. package/dist/commands/rustLogs.js.map +1 -1
  71. package/dist/commands/screenshot.d.ts +2 -2
  72. package/dist/commands/screenshot.js +7 -4
  73. package/dist/commands/screenshot.js.map +1 -1
  74. package/dist/commands/shared.d.ts +4 -1
  75. package/dist/commands/shared.js +34 -4
  76. package/dist/commands/shared.js.map +1 -1
  77. package/dist/commands/sidecarReplay.js +4 -0
  78. package/dist/commands/sidecarReplay.js.map +1 -1
  79. package/dist/commands/snapshot.d.ts +2 -2
  80. package/dist/commands/snapshot.js +4 -4
  81. package/dist/commands/snapshot.js.map +1 -1
  82. package/dist/commands/storeInspect.js +2 -2
  83. package/dist/commands/storeInspect.js.map +1 -1
  84. package/dist/commands/wait.d.ts +2 -2
  85. package/dist/commands/wait.js +42 -57
  86. package/dist/commands/wait.js.map +1 -1
  87. package/dist/errors.d.ts +10 -0
  88. package/dist/errors.js +26 -0
  89. package/dist/errors.js.map +1 -0
  90. package/dist/platform/detect.d.ts +2 -2
  91. package/dist/platform/detect.js +11 -2
  92. package/dist/platform/detect.js.map +1 -1
  93. package/dist/platform/x11.d.ts +1 -0
  94. package/dist/platform/x11.js +16 -5
  95. package/dist/platform/x11.js.map +1 -1
  96. package/dist/schemas/commands.d.ts +6 -0
  97. package/dist/schemas/commands.js +2 -0
  98. package/dist/schemas/commands.js.map +1 -1
  99. package/dist/schemas/interact.d.ts +58 -0
  100. package/dist/schemas/interact.js +25 -0
  101. package/dist/schemas/interact.js.map +1 -1
  102. package/dist/types.d.ts +2 -0
  103. package/dist/util/exec.d.ts +6 -0
  104. package/dist/util/exec.js +13 -1
  105. package/dist/util/exec.js.map +1 -1
  106. package/dist/util/incidentFiles.d.ts +5 -0
  107. package/dist/util/incidentFiles.js +61 -0
  108. package/dist/util/incidentFiles.js.map +1 -0
  109. package/dist/util/monitor.d.ts +11 -0
  110. package/dist/util/monitor.js +42 -0
  111. package/dist/util/monitor.js.map +1 -0
  112. package/dist/util/poll.d.ts +2 -0
  113. package/dist/util/poll.js +28 -0
  114. package/dist/util/poll.js.map +1 -0
  115. package/dist/util/redactText.d.ts +5 -2
  116. package/dist/util/redactText.js +44 -11
  117. package/dist/util/redactText.js.map +1 -1
  118. package/dist/util/tauriConfig.js +15 -18
  119. package/dist/util/tauriConfig.js.map +1 -1
  120. package/examples/tauri-bridge/Cargo.lock +4742 -0
  121. package/package.json +10 -3
  122. package/rust-bridge/README.md +7 -1
@@ -1,4 +1,4 @@
1
- import { addBridgeOptions } from '../shared.js';
1
+ import { addBridgeOptions, parseIntArg } from '../shared.js';
2
2
  /**
3
3
  * Escapes backslashes and single quotes in CSS selectors for safe
4
4
  * embedding inside JS string literals wrapped in single quotes.
@@ -59,4 +59,269 @@ export function buildWaitAndFindScript(selector, waitMs) {
59
59
  export function addInteractOptions(cmd) {
60
60
  return addBridgeOptions(cmd).option('--json', 'Output result as JSON');
61
61
  }
62
+ // === Value writing + verification (type, select) ===
63
+ /**
64
+ * Default deadline for the post-write re-read. An accepted write resolves on
65
+ * the first (synchronous) check, so it costs nothing; only a rejected write
66
+ * waits out the whole deadline.
67
+ */
68
+ export const DEFAULT_VERIFY_TIMEOUT_MS = 500;
69
+ /**
70
+ * dev_bridge.rs answers 504 after 5 s and BridgeClient.eval aborts at 5 s;
71
+ * keep at least 1 s of slack for dispatch + IPC + HTTP.
72
+ */
73
+ export const MAX_VERIFY_TIMEOUT_MS = 4000;
74
+ /**
75
+ * Poll cadence after the synchronous first check. React commits
76
+ * transition-lane updates on a Scheduler macrotask, so a microtask/rAF
77
+ * re-read would be too early.
78
+ */
79
+ export const VERIFY_INTERVAL_MS = 50;
80
+ export function resolveVerifyTimeout(opts) {
81
+ const ms = opts?.verifyTimeoutMs ?? DEFAULT_VERIFY_TIMEOUT_MS;
82
+ if (!Number.isInteger(ms) || ms < 0 || ms > MAX_VERIFY_TIMEOUT_MS) {
83
+ throw new Error(`--verify-timeout must be an integer between 0 and ${MAX_VERIFY_TIMEOUT_MS} ms (the bridge aborts evals after 5000 ms)`);
84
+ }
85
+ return ms;
86
+ }
87
+ /** Adds --verify-timeout to a value-writing interaction command. */
88
+ export function addVerifyOptions(cmd) {
89
+ return cmd.option('--verify-timeout <ms>', `Max time to wait for the written value to stick before reporting it reverted (max ${MAX_VERIFY_TIMEOUT_MS}, 0 = single check)`, parseIntArg, DEFAULT_VERIFY_TIMEOUT_MS);
90
+ }
91
+ /**
92
+ * JS snippet defining `__resolveValueWriter(node)`.
93
+ *
94
+ * React (react-dom's inputValueTracking) redefines `value` as an own accessor
95
+ * on every mounted <input>/<textarea> instance to remember what it wrote;
96
+ * assigning through that accessor makes the following input/change event a
97
+ * no-op for React (#10). Built-in form elements are therefore written through
98
+ * the prototype setter React itself captured. Custom elements are searched up
99
+ * their prototype chain (Lit/Stencil define accessors on the class prototype)
100
+ * and fall back to plain assignment for instance-defined or class-field
101
+ * `value`s. Anything else has no value setter and is refused instead of being
102
+ * silently given an expando property.
103
+ *
104
+ * The parameter is deliberately named `node` so generated scripts never
105
+ * contain the text `el.value =`.
106
+ */
107
+ export const NATIVE_VALUE_WRITER_SNIPPET = `
108
+ function __resolveValueWriter(node) {
109
+ var tag = node.tagName;
110
+ var proto = tag === 'INPUT' ? HTMLInputElement.prototype
111
+ : tag === 'TEXTAREA' ? HTMLTextAreaElement.prototype
112
+ : tag === 'SELECT' ? HTMLSelectElement.prototype
113
+ : null;
114
+ if (proto) {
115
+ var d = Object.getOwnPropertyDescriptor(proto, 'value');
116
+ if (d && typeof d.set === 'function') return { kind: 'native', set: function (v) { d.set.call(node, v); } };
117
+ return { kind: 'assign', set: function (v) { node.value = v; } };
118
+ }
119
+ if (String(node.localName || '').indexOf('-') !== -1) {
120
+ var p = Object.getPrototypeOf(node);
121
+ while (p && p !== Object.prototype) {
122
+ var cd = Object.getOwnPropertyDescriptor(p, 'value');
123
+ if (cd && typeof cd.set === 'function') return { kind: 'custom', set: function (v) { cd.set.call(node, v); } };
124
+ p = Object.getPrototypeOf(p);
125
+ }
126
+ if ('value' in node) return { kind: 'assign', set: function (v) { node.value = v; } };
127
+ }
128
+ return null;
129
+ }`;
130
+ /**
131
+ * JS snippet defining `__verify(read, expected, timeoutMs, intervalMs)`.
132
+ *
133
+ * The first read is synchronous: React restores a rejected controlled value
134
+ * inside dispatchEvent, so it is already visible. Later reads catch
135
+ * transition-lane commits and frameworks that apply values asynchronously.
136
+ * Resolves `{ ok, observed }` and never rejects. `read` is re-invoked on every
137
+ * tick so a re-mounted node is read instead of a stale reference.
138
+ */
139
+ export const VERIFY_POLL_SNIPPET = `
140
+ function __verify(read, expected, timeoutMs, intervalMs) {
141
+ return new Promise(function (resolve) {
142
+ var deadline = Date.now() + timeoutMs;
143
+ function check() {
144
+ var observed;
145
+ try { observed = read(); } catch (e) { observed = undefined; }
146
+ if (observed === expected) { resolve({ ok: true, observed: observed }); return; }
147
+ if (Date.now() >= deadline) { resolve({ ok: false, observed: observed }); return; }
148
+ setTimeout(check, intervalMs);
149
+ }
150
+ check();
151
+ });
152
+ }`;
153
+ /**
154
+ * JS snippet defining `__settle()` — resolves after two macrotasks. Used after
155
+ * focus()/--clear so that state the app changed in response (React flushes an
156
+ * onFocus setState on a microtask, an accepted clear commits synchronously, and
157
+ * a commit scheduled from the app's own zero-delay timer lands on a Scheduler
158
+ * task after the first macrotask) is visible before the pre-write baseline is
159
+ * read and the target node is re-resolved.
160
+ */
161
+ export const SETTLE_SNIPPET = `
162
+ function __settle() {
163
+ return new Promise(function (resolve) {
164
+ setTimeout(function () { setTimeout(resolve, 0); }, 0);
165
+ });
166
+ }`;
167
+ /** JS snippet defining `__selectOptionValues(node)` — option values of a <select>, [] otherwise. */
168
+ export const SELECT_OPTIONS_SNIPPET = `
169
+ function __selectOptionValues(node) {
170
+ if (!node.options || typeof node.options.length !== 'number') return [];
171
+ return Array.prototype.map.call(node.options, function (o) { return String(o.value); });
172
+ }`;
173
+ /**
174
+ * Shared script body for `type` and `select` value mode. Returns an arrow IIFE
175
+ * that resolves (via a Promise — the bridge awaits it) to a JSON string and
176
+ * never throws into the bridge.
177
+ *
178
+ * Sequence: snapshot `previousValue` → [focus] → [clear + input] → settle →
179
+ * re-resolve the target (the app may have re-mounted it) → snapshot `baseline`
180
+ * → native write → `applied` → refuse values the browser discarded or clamped
181
+ * back → input, change → verify. `reverted` means the re-read equals
182
+ * `baseline` or `previousValue`; comparing only against the pre-command value
183
+ * would let an app that accepted the clear (or changed the value on focus) but
184
+ * rejected the real write pass as `transformed`. A field the app empties after
185
+ * a non-empty write is a failure too ("cleared"): the intended value did not
186
+ * land whether the app rejected or consumed it.
187
+ */
188
+ export function buildSetValueScript(selector, value, o) {
189
+ const escapedSelector = escapeSelector(selector);
190
+ const safeValue = JSON.stringify(value);
191
+ const tagExpr = o.lowerCaseTagName ? 'el.tagName.toLowerCase()' : 'el.tagName';
192
+ const focusBlock = o.focus
193
+ ? `
194
+ if (typeof el.focus === 'function') el.focus();`
195
+ : '';
196
+ const clearBlock = o.clear
197
+ ? `
198
+ if (typeof el.select === 'function') el.select();
199
+ writer.set('');
200
+ el.dispatchEvent(new Event('input', { bubbles: true }));`
201
+ : '';
202
+ return `(() => {${NATIVE_VALUE_WRITER_SNIPPET}${VERIFY_POLL_SNIPPET}${SETTLE_SNIPPET}${SELECT_OPTIONS_SNIPPET}
203
+ var selector = '${escapedSelector}';
204
+ var requested = ${safeValue};
205
+ var clearRan = ${o.clear ? 'true' : 'false'};
206
+ var fail = function (extra) { return JSON.stringify(Object.assign({ success: false, selector: selector }, extra)); };
207
+ function describe(node) {
208
+ var t = node.tagName.toLowerCase();
209
+ var it = t === 'input' ? String(node.type || 'text').toLowerCase() : '';
210
+ return '<' + t + (it ? ' type=' + it : '') + '>';
211
+ }
212
+ function unsupported(node) {
213
+ return { error: 'Unsupported element ' + describe(node) + ': no value setter', hint: 'Supported: <input>, <textarea>, <select>, and custom elements that expose a value property. For contenteditable regions use \`eval\`.' };
214
+ }
215
+ try {
216
+ var el = document.querySelector(selector);
217
+ if (!el) return fail({ error: ${o.notFoundErrorExpr} });
218
+ var tagName = ${tagExpr};
219
+ var inputType = el.tagName === 'INPUT' ? String(el.type || 'text').toLowerCase() : '';
220
+ if (inputType === 'checkbox' || inputType === 'radio') {
221
+ return fail({ tagName: tagName, error: 'Cannot set a text value on <input type=' + inputType + '>', hint: 'Use \`select <selector> --toggle\` to change its checked state.' });
222
+ }
223
+ if (inputType === 'file') {
224
+ return fail({ tagName: tagName, error: 'Cannot set the value of <input type=file>: browsers reject scripted file values' });
225
+ }
226
+ var writer = __resolveValueWriter(el);
227
+ if (!writer) return fail(Object.assign({ tagName: tagName }, unsupported(el)));
228
+ if (el.tagName === 'SELECT') {
229
+ var options = __selectOptionValues(el);
230
+ if (options.indexOf(requested) === -1) {
231
+ return fail({ tagName: tagName, requestedValue: requested, options: options.slice(0, 50), error: 'No <option> with value ' + JSON.stringify(requested), hint: 'Pass the option value attribute, not its label. Available values: ' + options.slice(0, 20).join(', ') });
232
+ }
233
+ }
234
+ var previousValue = String(el.value);${focusBlock}${clearBlock}
235
+ var base = { selector: selector, tagName: tagName, requestedValue: requested, previousValue: previousValue };
236
+ return __settle().then(function () {
237
+ var live = document.querySelector(selector);
238
+ if (!live) {
239
+ return fail(Object.assign({ error: 'Element left the document after focus/clear (removed or re-rendered without a matching selector); nothing was written', hint: 'The app re-rendered in response to focus or the clear. Re-query the DOM and retry, or target a stable selector.' }, base));
240
+ }
241
+ if (live !== el) {
242
+ el = live;
243
+ writer = __resolveValueWriter(el);
244
+ if (!writer) return fail(Object.assign({}, base, unsupported(el)));
245
+ }
246
+ var baseline = String(el.value);
247
+ writer.set(requested);
248
+ var applied = String(el.value);
249
+ if (writer.kind === 'native' && requested !== '' && applied === '') {
250
+ // Undo our own writes only: after --clear that is the pre-clear value;
251
+ // otherwise the value the field held right before the write (which an
252
+ // app may have changed on focus).
253
+ var restored = clearRan ? previousValue : baseline;
254
+ writer.set(restored);
255
+ if (clearRan) el.dispatchEvent(new Event('input', { bubbles: true }));
256
+ return fail(Object.assign({
257
+ value: restored,
258
+ error: 'Browser discarded the value: ' + describe(el) + ' sanitized ' + JSON.stringify(requested) + ' to ""',
259
+ hint: 'Use a value the control accepts (e.g. digits for type=number, YYYY-MM-DD for type=date). The previous value was restored' + (clearRan ? ' (the field had already been cleared, so an input event was dispatched for the restore).' : ' and no events were dispatched.')
260
+ }, base));
261
+ }
262
+ if (writer.kind === 'native' && requested !== baseline && applied === baseline) {
263
+ return fail(Object.assign({
264
+ value: baseline,
265
+ error: 'Browser did not take the value: ' + describe(el) + ' still reads ' + JSON.stringify(baseline) + ' after writing ' + JSON.stringify(requested),
266
+ hint: 'The control clamped or sanitized the value back onto its current value (e.g. min/max on type=range, the format of type=color). No events were dispatched.'
267
+ }, base));
268
+ }
269
+ // Built-in controls may legitimately normalize the value (newlines stripped, numbers canonicalized): verify against what the setter kept. Custom elements may reflect asynchronously: verify against the request.
270
+ var expected = writer.kind === 'native' ? applied : requested;
271
+ el.dispatchEvent(new Event('input', { bubbles: true }));
272
+ (document.querySelector(selector) || el).dispatchEvent(new Event('change', { bubbles: true }));
273
+ return __verify(function () {
274
+ var cur = document.querySelector(selector) || (el.isConnected ? el : null);
275
+ return cur ? String(cur.value) : null;
276
+ }, expected, ${o.verifyTimeoutMs}, ${VERIFY_INTERVAL_MS}).then(function (v) {
277
+ if (v.ok) {
278
+ return JSON.stringify(Object.assign({ success: true, value: v.observed, verified: true, verification: 'matched' }, base));
279
+ }
280
+ if (v.observed === null) {
281
+ return fail(Object.assign({ value: applied, verified: false, error: 'Element left the document after the write; the value could not be verified', hint: 'The app removed or re-rendered the element without a matching selector after the input/change events (navigation, a remount). Re-query the DOM to confirm the app state.' }, base));
282
+ }
283
+ var observed = v.observed === undefined ? '' : v.observed;
284
+ if (observed === baseline || observed === previousValue) {
285
+ return fail(Object.assign({
286
+ value: observed, verified: false, verification: 'reverted',
287
+ error: 'Value reverted: wrote ' + JSON.stringify(applied) + ' but the element reads ' + JSON.stringify(observed) + ' again after ${o.verifyTimeoutMs}ms',
288
+ hint: 'The app restored the previous value: a controlled input whose change handler did not accept the write (app-side validation), or one that normalized it to the value already present. Check the app state binding; if the app applies values asynchronously, raise --verify-timeout.'
289
+ }, base));
290
+ }
291
+ if (requested !== '' && observed === '') {
292
+ return fail(Object.assign({
293
+ value: observed, verified: false, verification: 'reverted',
294
+ error: 'Value cleared: wrote ' + JSON.stringify(applied) + ' but the element is empty after ${o.verifyTimeoutMs}ms',
295
+ hint: 'The app emptied the field after the write: it rejected the value (validation reset) or consumed it (e.g. a tag/chip input). Check the app state to tell which.'
296
+ }, base));
297
+ }
298
+ return JSON.stringify(Object.assign({ success: true, value: observed, verified: false, verification: 'transformed' }, base));
299
+ });
300
+ }).catch(function (e) {
301
+ return fail({ error: 'Script error: ' + (e && e.message ? e.message : String(e)) });
302
+ });
303
+ } catch (e) {
304
+ return fail({ error: 'Script error: ' + (e && e.message ? e.message : String(e)) });
305
+ }
306
+ })()`;
307
+ }
308
+ /**
309
+ * Parses an interaction result from the bridge. dev_bridge.rs turns a thrown
310
+ * script into the string "ERROR: <message>", which JSON.parse would reject
311
+ * with an opaque SyntaxError — surface it as an actionable error instead.
312
+ */
313
+ export function parseInteractResult(raw, schema, command) {
314
+ const text = String(raw ?? '');
315
+ if (text.startsWith('ERROR: ')) {
316
+ throw new Error(`${command} failed: the bridge script threw: ${text.slice('ERROR: '.length)}`);
317
+ }
318
+ let parsed;
319
+ try {
320
+ parsed = JSON.parse(text);
321
+ }
322
+ catch {
323
+ throw new Error(`${command} failed: bridge returned a non-JSON result: ${text.slice(0, 200)}`);
324
+ }
325
+ return schema.parse(parsed);
326
+ }
62
327
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/interact/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO;QACL,UAAU;QACV,wCAAwC,OAAO,KAAK;QACpD,qDAAqD;QACrD,6DAA6D;QAC7D,+HAA+H;QAC/H,MAAM;KACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,MAAc;IACrE,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO;QACL,4BAA4B;QAC5B,mCAAmC,MAAM,GAAG;QAC5C,qBAAqB;QACrB,0CAA0C,OAAO,KAAK;QACtD,eAAe;QACf,iEAAiE;QACjE,qIAAqI;QACrI,eAAe;QACf,OAAO;QACP,mCAAmC;QACnC,kDAAkD;QAClD,eAAe;QACf,OAAO;QACP,4BAA4B;QAC5B,KAAK;QACL,WAAW;QACX,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/interact/shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE7D;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO;QACL,UAAU;QACV,wCAAwC,OAAO,KAAK;QACpD,qDAAqD;QACrD,6DAA6D;QAC7D,+HAA+H;QAC/H,MAAM;KACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,MAAc;IACrE,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO;QACL,4BAA4B;QAC5B,mCAAmC,MAAM,GAAG;QAC5C,qBAAqB;QACrB,0CAA0C,OAAO,KAAK;QACtD,eAAe;QACf,iEAAiE;QACjE,qIAAqI;QACrI,eAAe;QACf,OAAO;QACP,mCAAmC;QACnC,kDAAkD;QAClD,eAAe;QACf,OAAO;QACP,4BAA4B;QAC5B,KAAK;QACL,WAAW;QACX,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;AACzE,CAAC;AAED,sDAAsD;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAC7C;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAOrC,MAAM,UAAU,oBAAoB,CAAC,IAAoB;IACvD,MAAM,EAAE,GAAG,IAAI,EAAE,eAAe,IAAI,yBAAyB,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,qBAAqB,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,qDAAqD,qBAAqB,6CAA6C,CACxH,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,GAAG,CAAC,MAAM,CACf,uBAAuB,EACvB,qFAAqF,qBAAqB,qBAAqB,EAC/H,WAAW,EACX,yBAAyB,CAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;IAsBvC,CAAC;AAEL;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;IAa/B,CAAC;AAEL;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;IAK1B,CAAC;AAEL,oGAAoG;AACpG,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;IAIlC,CAAC;AAcL;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,KAAa,EAAE,CAAwB;IAC3F,MAAM,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,YAAY,CAAC;IAC/E,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK;QACxB,CAAC,CAAC;oDAC8C;QAChD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK;QACxB,CAAC,CAAC;;;6DAGuD;QACzD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,WAAW,2BAA2B,GAAG,mBAAmB,GAAG,cAAc,GAAG,sBAAsB;oBAC3F,eAAe;oBACf,SAAS;mBACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;;;;;;;;;;;;oCAYT,CAAC,CAAC,iBAAiB;oBACnC,OAAO;;;;;;;;;;;;;;;;2CAgBgB,UAAU,GAAG,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA0C7C,CAAC,CAAC,eAAe,KAAK,kBAAkB;;;;;;;;;;;+IAWkF,CAAC,CAAC,eAAe;;;;;;;0GAOtD,CAAC,CAAC,eAAe;;;;;;;;;;;;KAYtH,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAyB,GAAY,EAAE,MAAS,EAAE,OAAe;IAClG,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,qCAAqC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,+CAA+C,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
@@ -1,6 +1,14 @@
1
1
  import { Command } from 'commander';
2
+ import type { VerifyOptions } from './shared.js';
2
3
  /**
3
- * Build a JS IIFE script that types text into the element matched by selector.
4
+ * Build a JS IIFE that types text into the element matched by selector.
5
+ *
6
+ * Both the --clear write and the final write go through the element's native
7
+ * prototype value setter (see NATIVE_VALUE_WRITER_SNIPPET) so React-style
8
+ * instance trackers see the following input/change events as real changes
9
+ * (#10). The script then re-reads the value (synchronously, then polled up to
10
+ * verifyTimeoutMs) and reports `reverted` when the app restored the previous
11
+ * value. Returns a Promise-resolving IIFE; the bridge awaits it.
4
12
  */
5
- export declare function buildTypeScript(selector: string, text: string, clear: boolean): string;
13
+ export declare function buildTypeScript(selector: string, text: string, clear: boolean, options?: VerifyOptions): string;
6
14
  export declare function registerType(program: Command): void;
@@ -1,31 +1,25 @@
1
1
  import { Command } from 'commander';
2
2
  import { resolveBridge } from '../shared.js';
3
- import { addInteractOptions, escapeSelector } from './shared.js';
3
+ import { addInteractOptions, addVerifyOptions, buildSetValueScript, parseInteractResult, resolveVerifyTimeout, } from './shared.js';
4
4
  import { TypeResultSchema } from '../../schemas/interact.js';
5
5
  /**
6
- * Build a JS IIFE script that types text into the element matched by selector.
6
+ * Build a JS IIFE that types text into the element matched by selector.
7
+ *
8
+ * Both the --clear write and the final write go through the element's native
9
+ * prototype value setter (see NATIVE_VALUE_WRITER_SNIPPET) so React-style
10
+ * instance trackers see the following input/change events as real changes
11
+ * (#10). The script then re-reads the value (synchronously, then polled up to
12
+ * verifyTimeoutMs) and reports `reverted` when the app restored the previous
13
+ * value. Returns a Promise-resolving IIFE; the bridge awaits it.
7
14
  */
8
- export function buildTypeScript(selector, text, clear) {
9
- const escapedSelector = escapeSelector(selector);
10
- const safeText = JSON.stringify(text);
11
- const clearBlock = clear
12
- ? `
13
- el.focus();
14
- el.select();
15
- el.value = '';
16
- el.dispatchEvent(new Event('input', { bubbles: true }));`
17
- : '';
18
- return `(() => {
19
- var el = document.querySelector('${escapedSelector}');
20
- if (!el) {
21
- return JSON.stringify({ success: false, selector: '${escapedSelector}', error: 'Element not found' });
22
- }
23
- el.focus();${clearBlock}
24
- el.value = ${safeText};
25
- el.dispatchEvent(new Event('input', { bubbles: true }));
26
- el.dispatchEvent(new Event('change', { bubbles: true }));
27
- return JSON.stringify({ success: true, selector: '${escapedSelector}', tagName: el.tagName, value: el.value });
28
- })()`;
15
+ export function buildTypeScript(selector, text, clear, options) {
16
+ return buildSetValueScript(selector, text, {
17
+ focus: true,
18
+ clear,
19
+ lowerCaseTagName: false,
20
+ notFoundErrorExpr: `'Element not found'`,
21
+ verifyTimeoutMs: resolveVerifyTimeout(options),
22
+ });
29
23
  }
30
24
  export function registerType(program) {
31
25
  const cmd = new Command('type')
@@ -37,22 +31,43 @@ export function registerType(program) {
37
31
  Examples:
38
32
  $ tauri-agent-tools type "#username" "admin"
39
33
  $ tauri-agent-tools type "input[name=email]" "user@example.com" --clear
40
- $ tauri-agent-tools type ".search-input" "hello world" --json`);
34
+ $ tauri-agent-tools type ".search-input" "hello world" --json
35
+ $ tauri-agent-tools type "#q" "term" --verify-timeout 2000 # app applies the value asynchronously
36
+
37
+ The value is written through the element's native prototype setter followed by
38
+ bubbling input + change events, so React/Vue/Svelte controlled inputs see it.
39
+ The element is then re-read; the command fails with "Value reverted" when the
40
+ app restored the previous value (a controlled input that rejected the write).`);
41
41
  addInteractOptions(cmd);
42
+ addVerifyOptions(cmd);
42
43
  cmd.action(async (selector, text, opts) => {
44
+ // Build first: an invalid --verify-timeout fails before any bridge call.
45
+ const script = buildTypeScript(selector, text, !!opts.clear, { verifyTimeoutMs: opts.verifyTimeout });
43
46
  const bridge = await resolveBridge(opts);
44
- const script = buildTypeScript(selector, text, !!opts.clear);
45
47
  const raw = await bridge.eval(script);
46
- const result = TypeResultSchema.parse(JSON.parse(String(raw)));
48
+ const result = parseInteractResult(raw, TypeResultSchema, 'Type');
47
49
  if (!result.success) {
48
- throw new Error(`Type failed: ${result.error} (selector: ${result.selector})`);
50
+ // With --json the failure object (verification, hint, options, …) goes to
51
+ // stdout so scripts can branch on it; the thrown error still reaches
52
+ // stderr and sets exit code 1.
53
+ if (opts.json)
54
+ console.log(JSON.stringify(result, null, 2));
55
+ const hint = result.hint ? `\n hint: ${result.hint}` : '';
56
+ throw new Error(`Type failed: ${result.error} (selector: ${result.selector})${hint}`);
49
57
  }
50
58
  if (opts.json) {
51
59
  console.log(JSON.stringify(result, null, 2));
60
+ return;
61
+ }
62
+ const tag = (result.tagName ?? 'element').toLowerCase();
63
+ let note = '';
64
+ if (result.verification === 'transformed') {
65
+ note = ` (app transformed the requested value ${JSON.stringify(result.requestedValue)})`;
52
66
  }
53
- else {
54
- console.log(`Typed into ${(result.tagName ?? 'element').toLowerCase()}: "${result.value}"`);
67
+ else if (result.requestedValue !== undefined && result.value !== result.requestedValue) {
68
+ note = ` (browser normalized the requested value ${JSON.stringify(result.requestedValue)})`;
55
69
  }
70
+ console.log(`Typed into ${tag}: "${result.value}"${note}`);
56
71
  });
57
72
  program.addCommand(cmd);
58
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"type.js","sourceRoot":"","sources":["../../../src/commands/interact/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,IAAY,EAAE,KAAc;IAC5E,MAAM,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAG,KAAK;QACtB,CAAC,CAAC;;;;6DAIuD;QACzD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;qCAC4B,eAAe;;yDAEK,eAAe;;eAEzD,UAAU;eACV,QAAQ;;;sDAG+B,eAAe;KAChE,CAAC;AACN,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAC5B,WAAW,CAAC,kDAAkD,CAAC;SAC/D,QAAQ,CAAC,YAAY,EAAE,oCAAoC,CAAC;SAC5D,QAAQ,CAAC,QAAQ,EAAE,+BAA+B,CAAC;SACnD,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC;SAClD,WAAW,CAAC,OAAO,EAAE;;;;gEAIsC,CAAC,CAAC;IAEhE,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAExB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,IAAY,EAAE,IAAsD,EAAE,EAAE;QAC1G,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAE/D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,KAAK,eAAe,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACjF,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,cAAc,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../../src/commands/interact/type.ts"],"names":[],"mappings":"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"}
@@ -1,5 +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
+ export declare const PATCH_SCRIPT: string;
3
+ export declare const DRAIN_SCRIPT: string;
4
+ export declare const CLEANUP_SCRIPT: string;
5
5
  export declare function registerIpcMonitor(program: Command): void;
@@ -1,58 +1,13 @@
1
1
  import { Command } from 'commander';
2
+ import { ipcObserver, readObserver, closeObserver } from '../bridge/observers.js';
3
+ import { monitorFor, createSignalScope } from '../util/monitor.js';
2
4
  import { z } from 'zod';
3
- import { addBridgeOptions, resolveBridge, parseIntArg } from './shared.js';
5
+ import { addBridgeOptions, resolveBridge, parsePositiveInt } from './shared.js';
4
6
  import { IpcEntrySchema } from '../schemas/commands.js';
5
- export const PATCH_SCRIPT = `(() => {
6
- if (window.__tauriDevToolsPatched) return 'already_patched';
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) {
18
- return 'no_tauri';
19
- }
20
- window.__tauriDevToolsOriginalInvoke = target.invoke;
21
- window.__tauriDevToolsInvokeOwner = target.owner;
22
- window.__tauriDevToolsIpcLog = [];
23
- target.owner.invoke = function(cmd, args, options) {
24
- var entry = { command: cmd, args: args || {}, timestamp: Date.now() };
25
- var start = performance.now();
26
- return window.__tauriDevToolsOriginalInvoke.call(this, cmd, args, options).then(function(result) {
27
- entry.duration = Math.round(performance.now() - start);
28
- entry.result = result;
29
- window.__tauriDevToolsIpcLog.push(entry);
30
- return result;
31
- }).catch(function(err) {
32
- entry.duration = Math.round(performance.now() - start);
33
- entry.error = err && err.message ? err.message : String(err);
34
- window.__tauriDevToolsIpcLog.push(entry);
35
- throw err;
36
- });
37
- };
38
- window.__tauriDevToolsPatched = true;
39
- return 'patched';
40
- })()`;
41
- export const DRAIN_SCRIPT = `(() => {
42
- var log = window.__tauriDevToolsIpcLog || [];
43
- window.__tauriDevToolsIpcLog = [];
44
- return JSON.stringify(log);
45
- })()`;
46
- export const CLEANUP_SCRIPT = `(() => {
47
- if (window.__tauriDevToolsOriginalInvoke && window.__tauriDevToolsInvokeOwner) {
48
- window.__tauriDevToolsInvokeOwner.invoke = window.__tauriDevToolsOriginalInvoke;
49
- delete window.__tauriDevToolsOriginalInvoke;
50
- delete window.__tauriDevToolsInvokeOwner;
51
- delete window.__tauriDevToolsIpcLog;
52
- delete window.__tauriDevToolsPatched;
53
- }
54
- return 'cleaned';
55
- })()`;
7
+ const legacyScripts = ipcObserver('legacy');
8
+ export const PATCH_SCRIPT = legacyScripts.patch;
9
+ export const DRAIN_SCRIPT = legacyScripts.drain;
10
+ export const CLEANUP_SCRIPT = legacyScripts.cleanup;
56
11
  function escapeRegExp(s) {
57
12
  return s.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
58
13
  }
@@ -82,21 +37,13 @@ function renderStats(stats) {
82
37
  console.error(`# ${command.padEnd(28)} n=${s.count} max=${s.maxMs}ms avg=${avg}ms${errPart}`);
83
38
  }
84
39
  }
85
- async function cleanup(bridge) {
86
- try {
87
- await bridge.eval(CLEANUP_SCRIPT);
88
- }
89
- catch {
90
- // Best-effort cleanup
91
- }
92
- }
93
40
  export function registerIpcMonitor(program) {
94
41
  const cmd = new Command('ipc-monitor')
95
- .description('Monitor Tauri IPC calls in real-time (read-only)')
42
+ .description('Monitor Tauri IPC calls using temporary instrumentation')
96
43
  .option('--filter <command>', 'Only show specific IPC commands (supports * wildcards)')
97
- .option('--interval <ms>', 'Poll interval in milliseconds', parseIntArg, 500)
98
- .option('--duration <ms>', 'Auto-stop after N milliseconds', parseIntArg)
99
- .option('--slow <ms>', 'Flag IPC calls that completed but took ≥ N ms', parseIntArg)
44
+ .option('--interval <ms>', 'Poll interval in milliseconds', parsePositiveInt, 500)
45
+ .option('--duration <ms>', 'Auto-stop after N milliseconds', parsePositiveInt)
46
+ .option('--slow <ms>', 'Flag IPC calls that completed but took ≥ N ms', parsePositiveInt)
100
47
  .option('--stats', 'Print a per-command latency summary on exit')
101
48
  .option('--json', 'Output one JSON object per line');
102
49
  addBridgeOptions(cmd);
@@ -104,33 +51,19 @@ export function registerIpcMonitor(program) {
104
51
  const filterRegex = opts.filter ? compileWildcardFilter(opts.filter) : null;
105
52
  const stats = new Map();
106
53
  const bridge = await resolveBridge(opts);
107
- // Inject the monkey-patch
108
- const patchResult = await bridge.eval(PATCH_SCRIPT);
109
- if (patchResult === 'no_tauri') {
110
- throw new Error('Tauri invoke API not found. Expected window.__TAURI_INTERNALS__.invoke or window.__TAURI__.core.invoke.');
111
- }
112
- let stopped = false;
113
- const onSignal = () => {
114
- stopped = true;
115
- };
116
- process.on('SIGINT', onSignal);
117
- process.on('SIGTERM', onSignal);
118
- let timer;
119
- if (opts.duration) {
120
- timer = setTimeout(() => {
121
- stopped = true;
122
- }, opts.duration);
123
- }
124
- if (!opts.json) {
125
- console.error('Monitoring IPC calls... (Ctrl+C to stop)');
126
- }
54
+ const scripts = ipcObserver();
55
+ const signals = createSignalScope();
127
56
  try {
128
- while (!stopped) {
129
- await new Promise((resolve) => setTimeout(resolve, opts.interval));
130
- if (stopped)
131
- break;
132
- const raw = await bridge.eval(DRAIN_SCRIPT);
133
- const entries = z.array(IpcEntrySchema).parse(JSON.parse(String(raw)));
57
+ const patchResult = await bridge.eval(scripts.patch);
58
+ if (patchResult === 'no_tauri')
59
+ throw new Error('Tauri invoke API not found. Expected window.__TAURI_INTERNALS__.invoke or window.__TAURI__.core.invoke.');
60
+ if (patchResult !== 'patched' && patchResult !== 'already_patched')
61
+ throw new Error(`Observer setup failed: ${String(patchResult)}`);
62
+ if (!opts.json) {
63
+ console.error('Monitoring IPC calls... (Ctrl+C to stop)');
64
+ }
65
+ await monitorFor({ ...opts, signal: signals.signal }, async () => {
66
+ const entries = z.array(IpcEntrySchema).parse(await readObserver(bridge, scripts));
134
67
  for (const entry of entries) {
135
68
  if (opts.filter) {
136
69
  if (filterRegex) {
@@ -163,14 +96,11 @@ export function registerIpcMonitor(program) {
163
96
  console.log(formatEntry(entry, isSlow));
164
97
  }
165
98
  }
166
- }
99
+ });
167
100
  }
168
101
  finally {
169
- if (timer)
170
- clearTimeout(timer);
171
- process.off('SIGINT', onSignal);
172
- process.off('SIGTERM', onSignal);
173
- await cleanup(bridge);
102
+ await closeObserver(bridge, scripts);
103
+ signals.dispose();
174
104
  if (opts.stats)
175
105
  renderStats(stats);
176
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ipcMonitor.js","sourceRoot":"","sources":["../../src/commands/ipcMonitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ipcMonitor.js","sourceRoot":"","sources":["../../src/commands/ipcMonitor.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { Command } from 'commander';
2
- import type { PlatformAdapter } from '../types.js';
3
- export declare function registerListWindows(program: Command, getAdapter: () => Promise<PlatformAdapter>): void;
2
+ import type { AdapterFactory } from '../types.js';
3
+ export declare function registerListWindows(program: Command, getAdapter: AdapterFactory): void;