tauri-agent-tools 0.5.1 → 0.6.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 (65) hide show
  1. package/.agents/skills/tauri-agent-tools/SKILL.md +105 -12
  2. package/.agents/skills/tauri-bridge-setup/SKILL.md +42 -6
  3. package/AGENTS.md +9 -7
  4. package/README.md +51 -11
  5. package/dist/bridge/client.d.ts +5 -2
  6. package/dist/bridge/client.js +38 -3
  7. package/dist/bridge/client.js.map +1 -1
  8. package/dist/cli.js +22 -0
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/capture.d.ts +3 -0
  11. package/dist/commands/capture.js +218 -0
  12. package/dist/commands/capture.js.map +1 -0
  13. package/dist/commands/check.d.ts +5 -0
  14. package/dist/commands/check.js +174 -0
  15. package/dist/commands/check.js.map +1 -0
  16. package/dist/commands/eval.js +16 -3
  17. package/dist/commands/eval.js.map +1 -1
  18. package/dist/commands/interact/click.d.ts +6 -0
  19. package/dist/commands/interact/click.js +102 -0
  20. package/dist/commands/interact/click.js.map +1 -0
  21. package/dist/commands/interact/focus.d.ts +3 -0
  22. package/dist/commands/interact/focus.js +40 -0
  23. package/dist/commands/interact/focus.js.map +1 -0
  24. package/dist/commands/interact/navigate.d.ts +3 -0
  25. package/dist/commands/interact/navigate.js +49 -0
  26. package/dist/commands/interact/navigate.js.map +1 -0
  27. package/dist/commands/interact/scroll.d.ts +11 -0
  28. package/dist/commands/interact/scroll.js +110 -0
  29. package/dist/commands/interact/scroll.js.map +1 -0
  30. package/dist/commands/interact/select.d.ts +3 -0
  31. package/dist/commands/interact/select.js +59 -0
  32. package/dist/commands/interact/select.js.map +1 -0
  33. package/dist/commands/interact/shared.d.ts +23 -0
  34. package/dist/commands/interact/shared.js +62 -0
  35. package/dist/commands/interact/shared.js.map +1 -0
  36. package/dist/commands/interact/type.d.ts +6 -0
  37. package/dist/commands/interact/type.js +59 -0
  38. package/dist/commands/interact/type.js.map +1 -0
  39. package/dist/commands/invoke.d.ts +3 -0
  40. package/dist/commands/invoke.js +53 -0
  41. package/dist/commands/invoke.js.map +1 -0
  42. package/dist/commands/probe.d.ts +2 -0
  43. package/dist/commands/probe.js +117 -0
  44. package/dist/commands/probe.js.map +1 -0
  45. package/dist/commands/shared.d.ts +10 -4
  46. package/dist/commands/shared.js +23 -3
  47. package/dist/commands/shared.js.map +1 -1
  48. package/dist/commands/storeInspect.d.ts +13 -0
  49. package/dist/commands/storeInspect.js +156 -0
  50. package/dist/commands/storeInspect.js.map +1 -0
  51. package/dist/schemas/bridge.d.ts +34 -0
  52. package/dist/schemas/bridge.js +13 -0
  53. package/dist/schemas/bridge.js.map +1 -1
  54. package/dist/schemas/commands.d.ts +126 -0
  55. package/dist/schemas/commands.js +28 -0
  56. package/dist/schemas/commands.js.map +1 -1
  57. package/dist/schemas/index.d.ts +3 -2
  58. package/dist/schemas/index.js +3 -2
  59. package/dist/schemas/index.js.map +1 -1
  60. package/dist/schemas/interact.d.ts +118 -0
  61. package/dist/schemas/interact.js +31 -0
  62. package/dist/schemas/interact.js.map +1 -0
  63. package/examples/tauri-bridge/src/dev_bridge.rs +88 -2
  64. package/package.json +1 -1
  65. package/rust-bridge/README.md +7 -5
@@ -0,0 +1,49 @@
1
+ import { Command } from 'commander';
2
+ import { resolveBridge } from '../shared.js';
3
+ import { addInteractOptions, escapeSelector } from './shared.js';
4
+ import { InteractionResultSchema } from '../../schemas/interact.js';
5
+ export function buildNavigateScript(target) {
6
+ const escaped = escapeSelector(target);
7
+ if (target.startsWith('/')) {
8
+ return `(function() {
9
+ try {
10
+ window.history.pushState({}, '', '${escaped}');
11
+ window.dispatchEvent(new PopStateEvent('popstate', { state: {} }));
12
+ return JSON.stringify({ success: true, tagName: 'window', selector: '${escaped}' });
13
+ } catch (e) {
14
+ return JSON.stringify({ success: false, error: String(e) });
15
+ }
16
+ })()`;
17
+ }
18
+ return `(function() {
19
+ try {
20
+ window.location.href = '${escaped}';
21
+ return JSON.stringify({ success: true, tagName: 'window', selector: '${escaped}' });
22
+ } catch (e) {
23
+ return JSON.stringify({ success: false, error: String(e) });
24
+ }
25
+ })()`;
26
+ }
27
+ export function registerNavigate(program) {
28
+ const cmd = new Command('navigate')
29
+ .description('Navigate to a URL or path')
30
+ .argument('<target>', 'URL or path to navigate to (paths starting with / use pushState)')
31
+ .addHelpText('after', `
32
+ Examples:
33
+ $ tauri-agent-tools navigate /dashboard
34
+ $ tauri-agent-tools navigate /settings/profile
35
+ $ tauri-agent-tools navigate https://example.com`);
36
+ addInteractOptions(cmd);
37
+ cmd.action(async (target, opts) => {
38
+ const bridge = await resolveBridge(opts);
39
+ const script = buildNavigateScript(target);
40
+ const raw = await bridge.eval(script);
41
+ const result = InteractionResultSchema.parse(JSON.parse(String(raw)));
42
+ if (!result.success) {
43
+ throw new Error(result.error ?? 'Navigate failed');
44
+ }
45
+ console.log(JSON.stringify(result, null, 2));
46
+ });
47
+ program.addCommand(cmd);
48
+ }
49
+ //# sourceMappingURL=navigate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../../src/commands/interact/navigate.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,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO;;wCAE6B,OAAO;;2EAE4B,OAAO;;;;KAI7E,CAAC;IACJ,CAAC;IAED,OAAO;;8BAEqB,OAAO;2EACsC,OAAO;;;;KAI7E,CAAC;AACN,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;SAChC,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,UAAU,EAAE,kEAAkE,CAAC;SACxF,WAAW,CAAC,OAAO,EAAE;;;;mDAIyB,CAAC,CAAC;IAEnD,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAExB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAgB,EAAE,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Command } from 'commander';
2
+ export interface ScrollOpts {
3
+ selector?: string;
4
+ by?: number;
5
+ to?: number;
6
+ toTop?: boolean;
7
+ toBottom?: boolean;
8
+ intoView?: boolean;
9
+ }
10
+ export declare function buildScrollScript(opts: ScrollOpts): string;
11
+ export declare function registerScroll(program: Command): void;
@@ -0,0 +1,110 @@
1
+ import { Command } from 'commander';
2
+ import { resolveBridge } from '../shared.js';
3
+ import { addInteractOptions, escapeSelector } from './shared.js';
4
+ import { ScrollResultSchema } from '../../schemas/interact.js';
5
+ export function buildScrollScript(opts) {
6
+ const { selector, by, to, toTop, toBottom, intoView } = opts;
7
+ if (selector && intoView) {
8
+ const escaped = escapeSelector(selector);
9
+ return `(function() {
10
+ try {
11
+ var el = document.querySelector('${escaped}');
12
+ if (!el) return JSON.stringify({ success: false, error: 'Element not found: ${escaped}' });
13
+ el.scrollIntoView({ behavior: 'smooth', block: 'center' });
14
+ return JSON.stringify({ success: true, scrollX: window.scrollX, scrollY: window.scrollY });
15
+ } catch (e) {
16
+ return JSON.stringify({ success: false, error: String(e) });
17
+ }
18
+ })()`;
19
+ }
20
+ if (selector) {
21
+ const escaped = escapeSelector(selector);
22
+ let scrollCall;
23
+ if (toTop) {
24
+ scrollCall = `el.scrollTo(0, 0)`;
25
+ }
26
+ else if (toBottom) {
27
+ scrollCall = `el.scrollTo(0, el.scrollHeight)`;
28
+ }
29
+ else if (to !== undefined) {
30
+ scrollCall = `el.scrollTo(0, ${to})`;
31
+ }
32
+ else if (by !== undefined) {
33
+ scrollCall = `el.scrollBy(0, ${by})`;
34
+ }
35
+ else {
36
+ scrollCall = `el.scrollBy(0, 0)`;
37
+ }
38
+ return `(function() {
39
+ try {
40
+ var el = document.querySelector('${escaped}');
41
+ if (!el) return JSON.stringify({ success: false, error: 'Element not found: ${escaped}' });
42
+ ${scrollCall};
43
+ return JSON.stringify({ success: true, scrollX: el.scrollLeft, scrollY: el.scrollTop });
44
+ } catch (e) {
45
+ return JSON.stringify({ success: false, error: String(e) });
46
+ }
47
+ })()`;
48
+ }
49
+ // No selector — scroll on window
50
+ let scrollCall;
51
+ if (toTop) {
52
+ scrollCall = `window.scrollTo(0, 0)`;
53
+ }
54
+ else if (toBottom) {
55
+ scrollCall = `window.scrollTo(0, document.documentElement.scrollHeight)`;
56
+ }
57
+ else if (to !== undefined) {
58
+ scrollCall = `window.scrollTo(0, ${to})`;
59
+ }
60
+ else if (by !== undefined) {
61
+ scrollCall = `window.scrollBy(0, ${by})`;
62
+ }
63
+ else {
64
+ scrollCall = `window.scrollBy(0, 0)`;
65
+ }
66
+ return `(function() {
67
+ try {
68
+ ${scrollCall};
69
+ return JSON.stringify({ success: true, scrollX: window.scrollX, scrollY: window.scrollY });
70
+ } catch (e) {
71
+ return JSON.stringify({ success: false, error: String(e) });
72
+ }
73
+ })()`;
74
+ }
75
+ export function registerScroll(program) {
76
+ const cmd = new Command('scroll')
77
+ .description('Scroll the page or a specific element')
78
+ .option('-s, --selector <css>', 'CSS selector of the element to scroll')
79
+ .option('--by <px>', 'Scroll by N pixels (vertical)', parseInt)
80
+ .option('--to <px>', 'Scroll to absolute pixel position (vertical)', parseInt)
81
+ .option('--to-top', 'Scroll to top')
82
+ .option('--to-bottom', 'Scroll to bottom')
83
+ .option('--into-view', 'Scroll element into view (requires --selector)')
84
+ .addHelpText('after', `
85
+ Examples:
86
+ $ tauri-agent-tools scroll --by 200
87
+ $ tauri-agent-tools scroll --to-bottom
88
+ $ tauri-agent-tools scroll --selector ".content" --into-view
89
+ $ tauri-agent-tools scroll --selector ".panel" --by 100`);
90
+ addInteractOptions(cmd);
91
+ cmd.action(async (opts) => {
92
+ const bridge = await resolveBridge(opts);
93
+ const script = buildScrollScript({
94
+ selector: opts.selector,
95
+ by: opts.by,
96
+ to: opts.to,
97
+ toTop: opts.toTop,
98
+ toBottom: opts.toBottom,
99
+ intoView: opts.intoView,
100
+ });
101
+ const raw = await bridge.eval(script);
102
+ const result = ScrollResultSchema.parse(JSON.parse(String(raw)));
103
+ if (!result.success) {
104
+ throw new Error(result.error ?? 'Scroll failed');
105
+ }
106
+ console.log(JSON.stringify(result, null, 2));
107
+ });
108
+ program.addCommand(cmd);
109
+ }
110
+ //# sourceMappingURL=scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll.js","sourceRoot":"","sources":["../../../src/commands/interact/scroll.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function buildSelectScript(selector: string, value?: string, toggle?: boolean): string;
3
+ export declare function registerSelect(program: Command): void;
@@ -0,0 +1,59 @@
1
+ import { Command } from 'commander';
2
+ import { resolveBridge } from '../shared.js';
3
+ import { addInteractOptions, escapeSelector } from './shared.js';
4
+ import { SelectResultSchema } from '../../schemas/interact.js';
5
+ export function buildSelectScript(selector, value, toggle = false) {
6
+ const escaped = escapeSelector(selector);
7
+ if (toggle) {
8
+ return `(function() {
9
+ try {
10
+ var el = document.querySelector('${escaped}');
11
+ if (!el) return JSON.stringify({ success: false, error: 'Element not found: ${escaped}' });
12
+ el.checked = !el.checked;
13
+ el.dispatchEvent(new Event('change', { bubbles: true }));
14
+ el.dispatchEvent(new Event('input', { bubbles: true }));
15
+ return JSON.stringify({ success: true, selector: '${escaped}', tagName: el.tagName.toLowerCase(), checked: el.checked });
16
+ } catch (e) {
17
+ return JSON.stringify({ success: false, error: String(e) });
18
+ }
19
+ })()`;
20
+ }
21
+ const escapedValue = value !== undefined ? escapeSelector(value) : '';
22
+ return `(function() {
23
+ try {
24
+ var el = document.querySelector('${escaped}');
25
+ if (!el) return JSON.stringify({ success: false, error: 'Element not found: ${escaped}' });
26
+ el.value = '${escapedValue}';
27
+ el.dispatchEvent(new Event('change', { bubbles: true }));
28
+ el.dispatchEvent(new Event('input', { bubbles: true }));
29
+ return JSON.stringify({ success: true, selector: '${escaped}', tagName: el.tagName.toLowerCase(), value: el.value });
30
+ } catch (e) {
31
+ return JSON.stringify({ success: false, error: String(e) });
32
+ }
33
+ })()`;
34
+ }
35
+ export function registerSelect(program) {
36
+ const cmd = new Command('select')
37
+ .description('Set the value of a form element or toggle a checkbox')
38
+ .argument('<selector>', 'CSS selector of the element')
39
+ .argument('[value]', 'Value to set (for inputs, selects)')
40
+ .option('--toggle', 'Toggle the checked state of a checkbox or radio')
41
+ .addHelpText('after', `
42
+ Examples:
43
+ $ tauri-agent-tools select "select#country" "US"
44
+ $ tauri-agent-tools select "input[name='agree']" --toggle
45
+ $ tauri-agent-tools select "input#search" "hello world"`);
46
+ addInteractOptions(cmd);
47
+ cmd.action(async (selector, value, opts) => {
48
+ const bridge = await resolveBridge(opts);
49
+ const script = buildSelectScript(selector, value, opts.toggle ?? false);
50
+ const raw = await bridge.eval(script);
51
+ const result = SelectResultSchema.parse(JSON.parse(String(raw)));
52
+ if (!result.success) {
53
+ throw new Error(result.error ?? 'Select failed');
54
+ }
55
+ console.log(JSON.stringify(result, null, 2));
56
+ });
57
+ program.addCommand(cmd);
58
+ }
59
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/commands/interact/select.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,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,KAAc,EAAE,SAAkB,KAAK;IACzF,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;;uCAE4B,OAAO;kFACoC,OAAO;;;;wDAIjC,OAAO;;;;KAI1D,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO;;uCAE8B,OAAO;kFACoC,OAAO;kBACvE,YAAY;;;wDAG0B,OAAO;;;;KAI1D,CAAC;AACN,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC9B,WAAW,CAAC,sDAAsD,CAAC;SACnE,QAAQ,CAAC,YAAY,EAAE,6BAA6B,CAAC;SACrD,QAAQ,CAAC,SAAS,EAAE,oCAAoC,CAAC;SACzD,MAAM,CAAC,UAAU,EAAE,iDAAiD,CAAC;SACrE,WAAW,CAAC,OAAO,EAAE;;;;0DAIgC,CAAC,CAAC;IAE1D,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAExB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,KAAyB,EAAE,IAAuC,EAAE,EAAE;QACxG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * Escapes backslashes and single quotes in CSS selectors for safe
4
+ * embedding inside JS string literals wrapped in single quotes.
5
+ */
6
+ export declare function escapeSelector(selector: string): string;
7
+ /**
8
+ * Builds a JS snippet that finds an element via querySelector and returns
9
+ * JSON `{ found: true, tagName, id, text }` or `{ found: false }`.
10
+ * Text content is truncated to 100 characters.
11
+ */
12
+ export declare function buildFindElementScript(selector: string): string;
13
+ /**
14
+ * When waitMs > 0, builds a JS snippet that polls every 100ms up to the
15
+ * deadline for the element to appear, returning the same JSON shape as
16
+ * buildFindElementScript. When waitMs <= 0, delegates to buildFindElementScript.
17
+ */
18
+ export declare function buildWaitAndFindScript(selector: string, waitMs: number): string;
19
+ /**
20
+ * Adds shared interaction options to a command: bridge options (--port, --token)
21
+ * plus --json for machine-readable output. Returns the command for chaining.
22
+ */
23
+ export declare function addInteractOptions(cmd: Command): Command;
@@ -0,0 +1,62 @@
1
+ import { addBridgeOptions } from '../shared.js';
2
+ /**
3
+ * Escapes backslashes and single quotes in CSS selectors for safe
4
+ * embedding inside JS string literals wrapped in single quotes.
5
+ */
6
+ export function escapeSelector(selector) {
7
+ return selector.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
8
+ }
9
+ /**
10
+ * Builds a JS snippet that finds an element via querySelector and returns
11
+ * JSON `{ found: true, tagName, id, text }` or `{ found: false }`.
12
+ * Text content is truncated to 100 characters.
13
+ */
14
+ export function buildFindElementScript(selector) {
15
+ const escaped = escapeSelector(selector);
16
+ return [
17
+ `(() => {`,
18
+ ` const el = document.querySelector('${escaped}');`,
19
+ ` if (!el) return JSON.stringify({ found: false });`,
20
+ ` const text = (el.textContent || '').trim().slice(0, 100);`,
21
+ ` return JSON.stringify({ found: true, tagName: el.tagName.toLowerCase(), id: el.id || undefined, text: text || undefined });`,
22
+ `})()`,
23
+ ].join('\n');
24
+ }
25
+ /**
26
+ * When waitMs > 0, builds a JS snippet that polls every 100ms up to the
27
+ * deadline for the element to appear, returning the same JSON shape as
28
+ * buildFindElementScript. When waitMs <= 0, delegates to buildFindElementScript.
29
+ */
30
+ export function buildWaitAndFindScript(selector, waitMs) {
31
+ if (waitMs <= 0) {
32
+ return buildFindElementScript(selector);
33
+ }
34
+ const escaped = escapeSelector(selector);
35
+ return [
36
+ `new Promise((resolve) => {`,
37
+ ` const deadline = Date.now() + ${waitMs};`,
38
+ ` function poll() {`,
39
+ ` const el = document.querySelector('${escaped}');`,
40
+ ` if (el) {`,
41
+ ` const text = (el.textContent || '').trim().slice(0, 100);`,
42
+ ` resolve(JSON.stringify({ found: true, tagName: el.tagName.toLowerCase(), id: el.id || undefined, text: text || undefined }));`,
43
+ ` return;`,
44
+ ` }`,
45
+ ` if (Date.now() >= deadline) {`,
46
+ ` resolve(JSON.stringify({ found: false }));`,
47
+ ` return;`,
48
+ ` }`,
49
+ ` setTimeout(poll, 100);`,
50
+ ` }`,
51
+ ` poll();`,
52
+ `})`,
53
+ ].join('\n');
54
+ }
55
+ /**
56
+ * Adds shared interaction options to a command: bridge options (--port, --token)
57
+ * plus --json for machine-readable output. Returns the command for chaining.
58
+ */
59
+ export function addInteractOptions(cmd) {
60
+ return addBridgeOptions(cmd).option('--json', 'Output result as JSON');
61
+ }
62
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Build a JS IIFE script that types text into the element matched by selector.
4
+ */
5
+ export declare function buildTypeScript(selector: string, text: string, clear: boolean): string;
6
+ export declare function registerType(program: Command): void;
@@ -0,0 +1,59 @@
1
+ import { Command } from 'commander';
2
+ import { resolveBridge } from '../shared.js';
3
+ import { addInteractOptions, escapeSelector } from './shared.js';
4
+ import { TypeResultSchema } from '../../schemas/interact.js';
5
+ /**
6
+ * Build a JS IIFE script that types text into the element matched by selector.
7
+ */
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
+ })()`;
29
+ }
30
+ export function registerType(program) {
31
+ const cmd = new Command('type')
32
+ .description('Type text into an input element in the Tauri app')
33
+ .argument('<selector>', 'CSS selector for the input element')
34
+ .argument('<text>', 'Text to type into the element')
35
+ .option('--clear', 'Clear the field before typing')
36
+ .addHelpText('after', `
37
+ Examples:
38
+ $ tauri-agent-tools type "#username" "admin"
39
+ $ tauri-agent-tools type "input[name=email]" "user@example.com" --clear
40
+ $ tauri-agent-tools type ".search-input" "hello world" --json`);
41
+ addInteractOptions(cmd);
42
+ cmd.action(async (selector, text, opts) => {
43
+ const bridge = await resolveBridge(opts);
44
+ const script = buildTypeScript(selector, text, !!opts.clear);
45
+ const raw = await bridge.eval(script);
46
+ const result = TypeResultSchema.parse(JSON.parse(String(raw)));
47
+ if (!result.success) {
48
+ throw new Error(`Type failed: ${result.error} (selector: ${result.selector})`);
49
+ }
50
+ if (opts.json) {
51
+ console.log(JSON.stringify(result, null, 2));
52
+ }
53
+ else {
54
+ console.log(`Typed into ${(result.tagName ?? 'element').toLowerCase()}: "${result.value}"`);
55
+ }
56
+ });
57
+ program.addCommand(cmd);
58
+ }
59
+ //# sourceMappingURL=type.js.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function buildInvokeScript(command: string, args: unknown): string;
3
+ export declare function registerInvoke(program: Command): void;
@@ -0,0 +1,53 @@
1
+ import { Command } from 'commander';
2
+ import { addBridgeOptions, resolveBridge } from './shared.js';
3
+ import { InvokeResultSchema } from '../schemas/interact.js';
4
+ export function buildInvokeScript(command, args) {
5
+ const commandJson = JSON.stringify(command);
6
+ const argsJson = JSON.stringify(args);
7
+ return `(async () => {
8
+ if (!window.__TAURI__ || !window.__TAURI__.core) {
9
+ return JSON.stringify({ success: false, command: ${commandJson}, error: 'window.__TAURI__.core not found' });
10
+ }
11
+ try {
12
+ var result = await window.__TAURI__.core.invoke(${commandJson}, ${argsJson});
13
+ return JSON.stringify({ success: true, command: ${commandJson}, result: result });
14
+ } catch (e) {
15
+ return JSON.stringify({ success: false, command: ${commandJson}, error: e.message });
16
+ }
17
+ })()`;
18
+ }
19
+ export function registerInvoke(program) {
20
+ const cmd = new Command('invoke')
21
+ .description('Call a Tauri IPC command via eval')
22
+ .argument('<command>', 'Tauri command name')
23
+ .argument('[args]', 'Command arguments as a JSON string')
24
+ .option('--json', 'Output as JSON');
25
+ addBridgeOptions(cmd);
26
+ cmd.action(async (command, argsStr, opts) => {
27
+ let args = {};
28
+ if (argsStr !== undefined) {
29
+ try {
30
+ args = JSON.parse(argsStr);
31
+ }
32
+ catch {
33
+ throw new Error(`Invalid JSON for args: ${argsStr}`);
34
+ }
35
+ }
36
+ const script = buildInvokeScript(command, args);
37
+ const bridge = await resolveBridge(opts);
38
+ const raw = await bridge.eval(script);
39
+ const parsed = InvokeResultSchema.parse(JSON.parse(String(raw)));
40
+ if (!parsed.success) {
41
+ throw new Error(`Tauri command "${command}" failed: ${parsed.error}`);
42
+ }
43
+ if (opts.json) {
44
+ console.log(JSON.stringify(parsed, null, 2));
45
+ }
46
+ else {
47
+ console.log(`Command: ${parsed.command}`);
48
+ console.log(`Result: ${JSON.stringify(parsed.result, null, 2)}`);
49
+ }
50
+ });
51
+ program.addCommand(cmd);
52
+ }
53
+ //# sourceMappingURL=invoke.js.map
@@ -0,0 +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;;uDAE8C,WAAW;;;sDAGZ,WAAW,KAAK,QAAQ;sDACxB,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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerProbe(program: Command): void;
@@ -0,0 +1,117 @@
1
+ import { Command } from 'commander';
2
+ import { detectDisplayServer } from '../platform/detect.js';
3
+ import { addBridgeOptions, resolveBridge } from './shared.js';
4
+ import { discoverBridgesByPid, discoverBridge } from '../bridge/tokenDiscovery.js';
5
+ export function registerProbe(program) {
6
+ const cmd = new Command('probe')
7
+ .description('Discover and report Tauri app targets and bridge health')
8
+ .option('--json', 'Output as JSON');
9
+ addBridgeOptions(cmd);
10
+ cmd.action(async (opts) => {
11
+ // 1. Discover all bridges by PID
12
+ const bridgesByPid = await discoverBridgesByPid();
13
+ const allBridges = [...bridgesByPid.entries()].map(([pid, cfg]) => ({
14
+ pid,
15
+ port: cfg.port,
16
+ }));
17
+ // 2. Resolve specific bridge (may throw if none found)
18
+ const bridge = await resolveBridge(opts);
19
+ // 3. Ping
20
+ const alive = await bridge.ping();
21
+ // 4. Get version (graceful null on 404)
22
+ const versionInfo = await bridge.version();
23
+ // 5. Get describe (graceful null on 404)
24
+ const describeInfo = await bridge.describe();
25
+ // 6. Get page info via eval (try/catch each independently)
26
+ let url = null;
27
+ let title = null;
28
+ let viewport = null;
29
+ try {
30
+ url = String(await bridge.eval('window.location.href'));
31
+ }
32
+ catch {
33
+ // bridge may be unreachable or page not loaded
34
+ }
35
+ try {
36
+ title = String(await bridge.eval('document.title'));
37
+ }
38
+ catch {
39
+ // ignore
40
+ }
41
+ try {
42
+ viewport = await bridge.getViewportSize();
43
+ }
44
+ catch {
45
+ // ignore
46
+ }
47
+ // 7. Detect platform
48
+ const platform = detectDisplayServer();
49
+ // Determine the port for the target by checking opts or discovered bridge
50
+ let targetPort = opts.port;
51
+ if (targetPort === undefined) {
52
+ if (opts.pid !== undefined) {
53
+ const pidEntry = bridgesByPid.get(opts.pid);
54
+ targetPort = pidEntry?.port;
55
+ }
56
+ if (targetPort === undefined) {
57
+ const first = await discoverBridge();
58
+ targetPort = first?.port;
59
+ }
60
+ }
61
+ const result = {
62
+ bridges: allBridges,
63
+ target: {
64
+ alive,
65
+ version: versionInfo,
66
+ describe: describeInfo,
67
+ page: { url, title, viewport },
68
+ },
69
+ platform,
70
+ };
71
+ if (opts.json) {
72
+ console.log(JSON.stringify(result, null, 2));
73
+ return;
74
+ }
75
+ // Human-readable output
76
+ console.log('=== Tauri Bridge Probe ===');
77
+ console.log('');
78
+ if (allBridges.length === 0) {
79
+ console.log('Running bridges: none');
80
+ }
81
+ else {
82
+ console.log(`Running bridges: ${allBridges.length}`);
83
+ for (const b of allBridges) {
84
+ console.log(` PID ${b.pid} port ${b.port}`);
85
+ }
86
+ }
87
+ console.log('');
88
+ console.log(`Platform: ${platform}`);
89
+ console.log(`Bridge alive: ${alive ? 'yes' : 'no'}`);
90
+ if (versionInfo) {
91
+ console.log(`Bridge version: ${versionInfo.version}`);
92
+ console.log(`Endpoints: ${versionInfo.endpoints.join(', ')}`);
93
+ }
94
+ if (describeInfo) {
95
+ if (describeInfo.app !== undefined)
96
+ console.log(`App: ${describeInfo.app}`);
97
+ if (describeInfo.pid !== undefined)
98
+ console.log(`App PID: ${describeInfo.pid}`);
99
+ if (describeInfo.windows !== undefined)
100
+ console.log(`Windows: ${describeInfo.windows.join(', ')}`);
101
+ if (describeInfo.capabilities !== undefined)
102
+ console.log(`Capabilities: ${describeInfo.capabilities.join(', ')}`);
103
+ }
104
+ console.log('');
105
+ console.log('Page:');
106
+ console.log(` URL: ${url ?? '(unavailable)'}`);
107
+ console.log(` Title: ${title ?? '(unavailable)'}`);
108
+ if (viewport) {
109
+ console.log(` Viewport: ${viewport.width}x${viewport.height}`);
110
+ }
111
+ else {
112
+ console.log(' Viewport: (unavailable)');
113
+ }
114
+ });
115
+ program.addCommand(cmd);
116
+ }
117
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/commands/probe.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,19 @@
1
1
  import type { Command } from 'commander';
2
2
  import type { z } from 'zod';
3
3
  import { BridgeClient } from '../bridge/client.js';
4
+ /**
5
+ * Options parsed from the bridge-related CLI flags.
6
+ */
7
+ export interface BridgeOpts {
8
+ port?: number;
9
+ token?: string;
10
+ pid?: number;
11
+ windowLabel?: string;
12
+ }
4
13
  /**
5
14
  * Parse a value with a Zod enum schema, throwing a human-readable error on failure.
6
15
  * Replaces raw `.parse()` calls that would surface cryptic ZodError messages.
7
16
  */
8
17
  export declare function parseEnum<T extends [string, ...string[]]>(schema: z.ZodEnum<T>, value: string, label: string): T[number];
9
18
  export declare function addBridgeOptions(cmd: Command): Command;
10
- export declare function resolveBridge(opts: {
11
- port?: number;
12
- token?: string;
13
- }): Promise<BridgeClient>;
19
+ export declare function resolveBridge(opts: BridgeOpts): Promise<BridgeClient>;