tauri-agent-tools 0.5.1 → 0.7.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 (128) hide show
  1. package/.agents/skills/tauri-agent-tools/SKILL.md +195 -13
  2. package/.agents/skills/tauri-bridge-setup/SKILL.md +82 -14
  3. package/.agents/skills/tauri-debug-quickstart/SKILL.md +80 -0
  4. package/AGENTS.md +9 -7
  5. package/README.md +119 -11
  6. package/dist/bridge/client.d.ts +21 -2
  7. package/dist/bridge/client.js +119 -3
  8. package/dist/bridge/client.js.map +1 -1
  9. package/dist/cli.js +47 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/appPaths.d.ts +2 -0
  12. package/dist/commands/appPaths.js +97 -0
  13. package/dist/commands/appPaths.js.map +1 -0
  14. package/dist/commands/capabilitiesAudit.d.ts +2 -0
  15. package/dist/commands/capabilitiesAudit.js +105 -0
  16. package/dist/commands/capabilitiesAudit.js.map +1 -0
  17. package/dist/commands/capture.d.ts +3 -0
  18. package/dist/commands/capture.js +218 -0
  19. package/dist/commands/capture.js.map +1 -0
  20. package/dist/commands/check.d.ts +5 -0
  21. package/dist/commands/check.js +174 -0
  22. package/dist/commands/check.js.map +1 -0
  23. package/dist/commands/configInspect.d.ts +2 -0
  24. package/dist/commands/configInspect.js +223 -0
  25. package/dist/commands/configInspect.js.map +1 -0
  26. package/dist/commands/diagnose.d.ts +2 -0
  27. package/dist/commands/diagnose.js +311 -0
  28. package/dist/commands/diagnose.js.map +1 -0
  29. package/dist/commands/eval.js +16 -3
  30. package/dist/commands/eval.js.map +1 -1
  31. package/dist/commands/forensics.d.ts +2 -0
  32. package/dist/commands/forensics.js +331 -0
  33. package/dist/commands/forensics.js.map +1 -0
  34. package/dist/commands/health.d.ts +2 -0
  35. package/dist/commands/health.js +39 -0
  36. package/dist/commands/health.js.map +1 -0
  37. package/dist/commands/interact/click.d.ts +6 -0
  38. package/dist/commands/interact/click.js +102 -0
  39. package/dist/commands/interact/click.js.map +1 -0
  40. package/dist/commands/interact/focus.d.ts +3 -0
  41. package/dist/commands/interact/focus.js +40 -0
  42. package/dist/commands/interact/focus.js.map +1 -0
  43. package/dist/commands/interact/navigate.d.ts +3 -0
  44. package/dist/commands/interact/navigate.js +49 -0
  45. package/dist/commands/interact/navigate.js.map +1 -0
  46. package/dist/commands/interact/scroll.d.ts +11 -0
  47. package/dist/commands/interact/scroll.js +110 -0
  48. package/dist/commands/interact/scroll.js.map +1 -0
  49. package/dist/commands/interact/select.d.ts +3 -0
  50. package/dist/commands/interact/select.js +59 -0
  51. package/dist/commands/interact/select.js.map +1 -0
  52. package/dist/commands/interact/shared.d.ts +23 -0
  53. package/dist/commands/interact/shared.js +62 -0
  54. package/dist/commands/interact/shared.js.map +1 -0
  55. package/dist/commands/interact/type.d.ts +6 -0
  56. package/dist/commands/interact/type.js +59 -0
  57. package/dist/commands/interact/type.js.map +1 -0
  58. package/dist/commands/invoke.d.ts +3 -0
  59. package/dist/commands/invoke.js +53 -0
  60. package/dist/commands/invoke.js.map +1 -0
  61. package/dist/commands/osLogs.d.ts +2 -0
  62. package/dist/commands/osLogs.js +130 -0
  63. package/dist/commands/osLogs.js.map +1 -0
  64. package/dist/commands/probe.d.ts +2 -0
  65. package/dist/commands/probe.js +117 -0
  66. package/dist/commands/probe.js.map +1 -0
  67. package/dist/commands/processTree.d.ts +2 -0
  68. package/dist/commands/processTree.js +45 -0
  69. package/dist/commands/processTree.js.map +1 -0
  70. package/dist/commands/shared.d.ts +10 -4
  71. package/dist/commands/shared.js +23 -3
  72. package/dist/commands/shared.js.map +1 -1
  73. package/dist/commands/sidecarReplay.d.ts +7 -0
  74. package/dist/commands/sidecarReplay.js +93 -0
  75. package/dist/commands/sidecarReplay.js.map +1 -0
  76. package/dist/commands/sidecarTap.d.ts +2 -0
  77. package/dist/commands/sidecarTap.js +118 -0
  78. package/dist/commands/sidecarTap.js.map +1 -0
  79. package/dist/commands/storeInspect.d.ts +13 -0
  80. package/dist/commands/storeInspect.js +156 -0
  81. package/dist/commands/storeInspect.js.map +1 -0
  82. package/dist/commands/webviewAttach.d.ts +2 -0
  83. package/dist/commands/webviewAttach.js +64 -0
  84. package/dist/commands/webviewAttach.js.map +1 -0
  85. package/dist/platform/oslog/darwin.d.ts +21 -0
  86. package/dist/platform/oslog/darwin.js +72 -0
  87. package/dist/platform/oslog/darwin.js.map +1 -0
  88. package/dist/platform/oslog/linux.d.ts +16 -0
  89. package/dist/platform/oslog/linux.js +47 -0
  90. package/dist/platform/oslog/linux.js.map +1 -0
  91. package/dist/platform/oslog/windows.d.ts +15 -0
  92. package/dist/platform/oslog/windows.js +16 -0
  93. package/dist/platform/oslog/windows.js.map +1 -0
  94. package/dist/schemas/bridge.d.ts +256 -0
  95. package/dist/schemas/bridge.js +57 -0
  96. package/dist/schemas/bridge.js.map +1 -1
  97. package/dist/schemas/commands.d.ts +126 -0
  98. package/dist/schemas/commands.js +28 -0
  99. package/dist/schemas/commands.js.map +1 -1
  100. package/dist/schemas/index.d.ts +3 -2
  101. package/dist/schemas/index.js +3 -2
  102. package/dist/schemas/index.js.map +1 -1
  103. package/dist/schemas/interact.d.ts +118 -0
  104. package/dist/schemas/interact.js +31 -0
  105. package/dist/schemas/interact.js.map +1 -0
  106. package/dist/schemas/osLog.d.ts +34 -0
  107. package/dist/schemas/osLog.js +18 -0
  108. package/dist/schemas/osLog.js.map +1 -0
  109. package/dist/schemas/sidecar.d.ts +33 -0
  110. package/dist/schemas/sidecar.js +17 -0
  111. package/dist/schemas/sidecar.js.map +1 -0
  112. package/dist/schemas/tauriConfig.d.ts +825 -0
  113. package/dist/schemas/tauriConfig.js +102 -0
  114. package/dist/schemas/tauriConfig.js.map +1 -0
  115. package/dist/util/ndjson.d.ts +37 -0
  116. package/dist/util/ndjson.js +82 -0
  117. package/dist/util/ndjson.js.map +1 -0
  118. package/dist/util/tauriConfig.d.ts +63 -0
  119. package/dist/util/tauriConfig.js +235 -0
  120. package/dist/util/tauriConfig.js.map +1 -0
  121. package/examples/frontend-stub/index.html +1 -0
  122. package/examples/tauri-bridge/Cargo.toml +6 -0
  123. package/examples/tauri-bridge/build.rs +3 -0
  124. package/examples/tauri-bridge/icons/icon.png +0 -0
  125. package/examples/tauri-bridge/src/dev_bridge.rs +509 -10
  126. package/examples/tauri-bridge/tauri.conf.json +25 -0
  127. package/package.json +3 -1
  128. package/rust-bridge/README.md +7 -5
@@ -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":"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;AAW/D,MAAM,UAAU,iBAAiB,CAAC,IAAgB;IAChD,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAE7D,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO;;uCAE4B,OAAO;kFACoC,OAAO;;;;;;KAMpF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,UAAkB,CAAC;QACvB,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,GAAG,mBAAmB,CAAC;QACnC,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,UAAU,GAAG,iCAAiC,CAAC;QACjD,CAAC;aAAM,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YAC5B,UAAU,GAAG,kBAAkB,EAAE,GAAG,CAAC;QACvC,CAAC;aAAM,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YAC5B,UAAU,GAAG,kBAAkB,EAAE,GAAG,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,mBAAmB,CAAC;QACnC,CAAC;QACD,OAAO;;uCAE4B,OAAO;kFACoC,OAAO;MACnF,UAAU;;;;;KAKX,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAkB,CAAC;IACvB,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,GAAG,uBAAuB,CAAC;IACvC,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,UAAU,GAAG,2DAA2D,CAAC;IAC3E,CAAC;SAAM,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC5B,UAAU,GAAG,sBAAsB,EAAE,GAAG,CAAC;IAC3C,CAAC;SAAM,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC5B,UAAU,GAAG,sBAAsB,EAAE,GAAG,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,uBAAuB,CAAC;IACvC,CAAC;IAED,OAAO;;MAEH,UAAU;;;;;KAKX,CAAC;AACN,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC9B,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,sBAAsB,EAAE,uCAAuC,CAAC;SACvE,MAAM,CAAC,WAAW,EAAE,+BAA+B,EAAE,QAAQ,CAAC;SAC9D,MAAM,CAAC,WAAW,EAAE,8CAA8C,EAAE,QAAQ,CAAC;SAC7E,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC;SACnC,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC;SACzC,MAAM,CAAC,aAAa,EAAE,gDAAgD,CAAC;SACvE,WAAW,CAAC,OAAO,EAAE;;;;;0DAKgC,CAAC,CAAC;IAE1D,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAExB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAOjB,EAAE,EAAE;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,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,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 registerOsLogs(program: Command): void;
@@ -0,0 +1,130 @@
1
+ import { Command } from 'commander';
2
+ import { spawn } from 'node:child_process';
3
+ import * as darwin from '../platform/oslog/darwin.js';
4
+ import * as linux from '../platform/oslog/linux.js';
5
+ import * as windows from '../platform/oslog/windows.js';
6
+ import { resolveTauriProject } from '../util/tauriConfig.js';
7
+ import { LineFramer } from '../util/ndjson.js';
8
+ const LEVEL_RANK = { debug: 0, info: 1, warn: 2, error: 3 };
9
+ export function registerOsLogs(program) {
10
+ const cmd = new Command('os-logs')
11
+ .description("Tail the host OS's log stream filtered to a Tauri bundle id")
12
+ .option('--config <path>', 'Path to tauri.conf.json (or its directory). Auto-detected if omitted.')
13
+ .option('--identifier <id>', 'Bundle identifier override')
14
+ .option('--product-name <name>', 'Product name override (used for log-source matching)')
15
+ .option('--since <duration>', 'How far back to start (e.g., 5m, 1h). Linux only.')
16
+ .option('--level <level>', 'Minimum level: debug | info | warn | error')
17
+ .option('--source <source>', 'Filter source: main | webview | sidecar | all', 'all')
18
+ .option('--duration <ms>', 'Stop after N milliseconds', parseIntOrInfinity)
19
+ .option('--json', 'Output as one NDJSON envelope per line (default)')
20
+ .action(async (opts) => {
21
+ const minLevel = opts.level ? validateLevel(opts.level) : null;
22
+ const sourceFilter = opts.source ?? 'all';
23
+ let identifier;
24
+ let productName;
25
+ if (opts.identifier) {
26
+ identifier = opts.identifier;
27
+ productName = opts.productName ?? opts.identifier;
28
+ }
29
+ else {
30
+ const resolved = await resolveTauriProject({ configPath: opts.config });
31
+ identifier = resolved.identifier;
32
+ productName = opts.productName ?? resolved.productName;
33
+ }
34
+ const adapter = pickAdapter();
35
+ const args = adapter.buildArgs({
36
+ identifier,
37
+ productName,
38
+ since: opts.since,
39
+ });
40
+ const child = spawn(adapter.command, args, {
41
+ stdio: ['ignore', 'pipe', 'pipe'],
42
+ });
43
+ const framer = new LineFramer();
44
+ child.stdout.setEncoding('utf-8');
45
+ child.stdout.on('data', (chunk) => {
46
+ for (const line of framer.push(chunk)) {
47
+ handleLine(line, adapter, minLevel, sourceFilter);
48
+ }
49
+ });
50
+ let stderrBuf = '';
51
+ child.stderr.setEncoding('utf-8');
52
+ child.stderr.on('data', (chunk) => {
53
+ stderrBuf += chunk;
54
+ if (stderrBuf.length > 1024 * 16)
55
+ stderrBuf = stderrBuf.slice(-1024 * 16);
56
+ });
57
+ let timeoutHandle = null;
58
+ if (opts.duration && Number.isFinite(opts.duration)) {
59
+ timeoutHandle = setTimeout(() => child.kill('SIGTERM'), opts.duration);
60
+ }
61
+ await new Promise((resolve, reject) => {
62
+ child.on('error', (err) => {
63
+ if (timeoutHandle)
64
+ clearTimeout(timeoutHandle);
65
+ if (err.code === 'ENOENT') {
66
+ reject(new Error(`${adapter.command} not found on PATH. ` +
67
+ `os-logs needs the host OS's log streaming tool.`));
68
+ return;
69
+ }
70
+ reject(err);
71
+ });
72
+ child.on('close', (code) => {
73
+ if (timeoutHandle)
74
+ clearTimeout(timeoutHandle);
75
+ const trailing = framer.flush();
76
+ if (trailing)
77
+ handleLine(trailing, adapter, minLevel, sourceFilter);
78
+ // Non-zero exits from `log stream` on SIGTERM are expected; only fail
79
+ // if we got nothing meaningful and stderr has content.
80
+ if (code && code !== 0 && code !== 143 /* SIGTERM */) {
81
+ const detail = stderrBuf.trim();
82
+ reject(new Error(`${adapter.command} exited with code ${code}${detail ? `: ${detail}` : ''}`));
83
+ return;
84
+ }
85
+ resolve();
86
+ });
87
+ });
88
+ });
89
+ program.addCommand(cmd);
90
+ }
91
+ function pickAdapter() {
92
+ if (process.platform === 'darwin') {
93
+ return { command: darwin.COMMAND, buildArgs: darwin.buildArgs, parseLine: darwin.parseLine };
94
+ }
95
+ if (process.platform === 'linux') {
96
+ return { command: linux.COMMAND, buildArgs: linux.buildArgs, parseLine: linux.parseLine };
97
+ }
98
+ if (process.platform === 'win32') {
99
+ return { command: windows.COMMAND, buildArgs: windows.buildArgs, parseLine: windows.parseLine };
100
+ }
101
+ throw new Error(`os-logs is not supported on platform: ${process.platform}`);
102
+ }
103
+ function handleLine(line, adapter, minLevel, sourceFilter) {
104
+ if (line.length === 0)
105
+ return;
106
+ const entry = adapter.parseLine(line);
107
+ if (!entry)
108
+ return;
109
+ if (minLevel && LEVEL_RANK[entry.level] < LEVEL_RANK[minLevel])
110
+ return;
111
+ if (sourceFilter !== 'all' && entry.source !== sourceFilter)
112
+ return;
113
+ console.log(JSON.stringify(entry));
114
+ }
115
+ function validateLevel(input) {
116
+ if (input === 'debug' || input === 'info' || input === 'warn' || input === 'error') {
117
+ return input;
118
+ }
119
+ throw new Error(`Invalid --level: ${input}. Expected one of: debug, info, warn, error.`);
120
+ }
121
+ function parseIntOrInfinity(value) {
122
+ if (value === 'infinity' || value === 'inf')
123
+ return Number.POSITIVE_INFINITY;
124
+ const n = parseInt(value, 10);
125
+ if (!Number.isFinite(n) || n <= 0) {
126
+ throw new Error(`--duration must be a positive integer (milliseconds), got: ${value}`);
127
+ }
128
+ return n;
129
+ }
130
+ //# sourceMappingURL=osLogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osLogs.js","sourceRoot":"","sources":["../../src/commands/osLogs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerProbe(program: Command): void;