mobile-agent-mcp 0.1.1 → 1.0.1

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 (96) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +33 -82
  3. package/dist/cli.js +236 -7
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +43 -17
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +17 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/driver/artifacts.d.ts +17 -0
  10. package/dist/driver/artifacts.d.ts.map +1 -0
  11. package/dist/driver/artifacts.js +40 -0
  12. package/dist/driver/artifacts.js.map +1 -0
  13. package/dist/driver/diagnosis.d.ts +9 -0
  14. package/dist/driver/diagnosis.d.ts.map +1 -0
  15. package/dist/driver/diagnosis.js +72 -0
  16. package/dist/driver/diagnosis.js.map +1 -0
  17. package/dist/driver/doctor.d.ts +6 -0
  18. package/dist/driver/doctor.d.ts.map +1 -1
  19. package/dist/driver/doctor.js +20 -0
  20. package/dist/driver/doctor.js.map +1 -1
  21. package/dist/driver/exec.d.ts +1 -0
  22. package/dist/driver/exec.d.ts.map +1 -1
  23. package/dist/driver/exec.js +3 -0
  24. package/dist/driver/exec.js.map +1 -1
  25. package/dist/driver/flow-io.d.ts +8 -0
  26. package/dist/driver/flow-io.d.ts.map +1 -0
  27. package/dist/driver/flow-io.js +128 -0
  28. package/dist/driver/flow-io.js.map +1 -0
  29. package/dist/driver/flows.d.ts +3 -0
  30. package/dist/driver/flows.d.ts.map +1 -0
  31. package/dist/driver/flows.js +20 -0
  32. package/dist/driver/flows.js.map +1 -0
  33. package/dist/driver/logs.d.ts +33 -0
  34. package/dist/driver/logs.d.ts.map +1 -0
  35. package/dist/driver/logs.js +199 -0
  36. package/dist/driver/logs.js.map +1 -0
  37. package/dist/driver/maestro.d.ts +22 -2
  38. package/dist/driver/maestro.d.ts.map +1 -1
  39. package/dist/driver/maestro.js +139 -21
  40. package/dist/driver/maestro.js.map +1 -1
  41. package/dist/driver/metro.d.ts +5 -0
  42. package/dist/driver/metro.d.ts.map +1 -0
  43. package/dist/driver/metro.js +57 -0
  44. package/dist/driver/metro.js.map +1 -0
  45. package/dist/driver/screenshot.d.ts +3 -1
  46. package/dist/driver/screenshot.d.ts.map +1 -1
  47. package/dist/driver/screenshot.js +10 -1
  48. package/dist/driver/screenshot.js.map +1 -1
  49. package/dist/driver/simulator.d.ts +3 -0
  50. package/dist/driver/simulator.d.ts.map +1 -0
  51. package/dist/driver/simulator.js +66 -0
  52. package/dist/driver/simulator.js.map +1 -0
  53. package/dist/errors.d.ts +2 -2
  54. package/dist/errors.d.ts.map +1 -1
  55. package/dist/errors.js +2 -1
  56. package/dist/errors.js.map +1 -1
  57. package/dist/index.d.ts +21 -8
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +16 -7
  60. package/dist/index.js.map +1 -1
  61. package/dist/mcp/resources.d.ts +15 -0
  62. package/dist/mcp/resources.d.ts.map +1 -0
  63. package/dist/mcp/resources.js +31 -0
  64. package/dist/mcp/resources.js.map +1 -0
  65. package/dist/mcp/serialize-result.d.ts +20 -0
  66. package/dist/mcp/serialize-result.d.ts.map +1 -0
  67. package/dist/mcp/serialize-result.js +61 -0
  68. package/dist/mcp/serialize-result.js.map +1 -0
  69. package/dist/mcp/tools/definitions.d.ts +7 -0
  70. package/dist/mcp/tools/definitions.d.ts.map +1 -0
  71. package/dist/mcp/tools/definitions.js +181 -0
  72. package/dist/mcp/tools/definitions.js.map +1 -0
  73. package/dist/mcp/tools/handlers.d.ts +5 -0
  74. package/dist/mcp/tools/handlers.d.ts.map +1 -0
  75. package/dist/mcp/tools/handlers.js +132 -0
  76. package/dist/mcp/tools/handlers.js.map +1 -0
  77. package/dist/mcp/tools.d.ts +3 -11
  78. package/dist/mcp/tools.d.ts.map +1 -1
  79. package/dist/mcp/tools.js +2 -151
  80. package/dist/mcp/tools.js.map +1 -1
  81. package/dist/mcp-server.js +15 -5
  82. package/dist/mcp-server.js.map +1 -1
  83. package/dist/results/format.d.ts +16 -0
  84. package/dist/results/format.d.ts.map +1 -0
  85. package/dist/results/format.js +95 -0
  86. package/dist/results/format.js.map +1 -0
  87. package/dist/results/types.d.ts +95 -0
  88. package/dist/results/types.d.ts.map +1 -0
  89. package/dist/results/types.js +5 -0
  90. package/dist/results/types.js.map +1 -0
  91. package/dist/runtime.d.ts +26 -4
  92. package/dist/runtime.d.ts.map +1 -1
  93. package/dist/runtime.js +110 -10
  94. package/dist/runtime.js.map +1 -1
  95. package/mobile-agent.config.example.json +5 -0
  96. package/package.json +8 -4
@@ -0,0 +1,128 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { AgentError, ErrorCode } from '../errors.js';
4
+ import { commandExists, runCommand } from './exec.js';
5
+ import { resolveFlowPath } from './maestro.js';
6
+ const TEMPLATES = {
7
+ login: `appId: \${APP_ID}
8
+ ---
9
+ - launchApp
10
+ - assertVisible: "Login"
11
+ - tapOn: "Login"
12
+ `,
13
+ deeplink: `appId: \${APP_ID}
14
+ ---
15
+ - openLink: \${DEEP_LINK}
16
+ - assertVisible: "Home"
17
+ `,
18
+ smoke: `appId: \${APP_ID}
19
+ ---
20
+ - launchApp
21
+ - assertVisible: "Welcome"
22
+ `,
23
+ };
24
+ function assertFlowName(name) {
25
+ const trimmed = name.trim();
26
+ if (!trimmed || trimmed.includes('/') || trimmed.includes('\\') || trimmed.includes('..')) {
27
+ throw new AgentError(`Invalid flow name: ${name}`, ErrorCode.VALIDATION);
28
+ }
29
+ return trimmed.replace(/\.(yaml|yml)$/, '');
30
+ }
31
+ export function resolveFlowFilePath(config, flow) {
32
+ const safeName = assertFlowName(flow);
33
+ const candidate = path.resolve(config.flowsDir, `${safeName}.yaml`);
34
+ const flowsRoot = path.resolve(config.flowsDir);
35
+ if (!candidate.startsWith(`${flowsRoot}${path.sep}`) && candidate !== flowsRoot) {
36
+ throw new AgentError(`Flow path escapes flowsDir: ${flow}`, ErrorCode.VALIDATION);
37
+ }
38
+ return candidate;
39
+ }
40
+ function basicSyntaxCheck(content) {
41
+ const issues = [];
42
+ if (!content.trim()) {
43
+ issues.push('Flow file is empty');
44
+ return issues;
45
+ }
46
+ const parts = content.split(/^---\s*$/m);
47
+ if (parts.length < 2) {
48
+ issues.push('Missing YAML document separator (---)');
49
+ }
50
+ const steps = parts.slice(1).join('---').trim();
51
+ if (!steps) {
52
+ issues.push('No Maestro steps found after frontmatter');
53
+ }
54
+ return issues;
55
+ }
56
+ export function validateFlow(config, flow) {
57
+ const flowPath = resolveFlowFilePath(config, flow);
58
+ if (!fs.existsSync(flowPath)) {
59
+ throw new AgentError(`Flow not found: ${flow}`, ErrorCode.FLOW_NOT_FOUND);
60
+ }
61
+ const content = fs.readFileSync(flowPath, 'utf-8');
62
+ const syntaxIssues = basicSyntaxCheck(content);
63
+ if (syntaxIssues.length > 0) {
64
+ return {
65
+ flow: assertFlowName(flow),
66
+ flowPath,
67
+ valid: false,
68
+ method: 'syntax',
69
+ issues: syntaxIssues,
70
+ };
71
+ }
72
+ if (commandExists(config.maestroBin)) {
73
+ const dryRun = runCommand(config.maestroBin, ['test', '--dry-run', flowPath], {
74
+ cwd: config.projectRoot,
75
+ allowFailure: true,
76
+ });
77
+ if (dryRun.status === 0) {
78
+ return {
79
+ flow: assertFlowName(flow),
80
+ flowPath,
81
+ valid: true,
82
+ method: 'maestro_dry_run',
83
+ issues: [],
84
+ };
85
+ }
86
+ const issues = [dryRun.stderr, dryRun.stdout].filter(Boolean);
87
+ if (issues.length > 0) {
88
+ return {
89
+ flow: assertFlowName(flow),
90
+ flowPath,
91
+ valid: false,
92
+ method: 'maestro_dry_run',
93
+ issues,
94
+ };
95
+ }
96
+ }
97
+ return {
98
+ flow: assertFlowName(flow),
99
+ flowPath,
100
+ valid: syntaxIssues.length === 0,
101
+ method: 'syntax',
102
+ issues: syntaxIssues,
103
+ };
104
+ }
105
+ export function writeFlow(config, flow, content, template, overwrite = false) {
106
+ const safeName = assertFlowName(flow);
107
+ const flowPath = resolveFlowFilePath(config, safeName);
108
+ const existed = fs.existsSync(flowPath);
109
+ if (existed && !overwrite) {
110
+ throw new AgentError(`Flow already exists: ${flowPath}`, ErrorCode.VALIDATION);
111
+ }
112
+ const body = content ?? (template ? TEMPLATES[template] : undefined);
113
+ if (!body) {
114
+ throw new AgentError('content or template is required', ErrorCode.VALIDATION);
115
+ }
116
+ fs.mkdirSync(config.flowsDir, { recursive: true });
117
+ fs.writeFileSync(flowPath, body, 'utf-8');
118
+ return {
119
+ flow: safeName,
120
+ flowPath,
121
+ written: true,
122
+ overwritten: existed,
123
+ };
124
+ }
125
+ export function resolveExistingFlowPath(config, flow) {
126
+ return resolveFlowPath(config, flow);
127
+ }
128
+ //# sourceMappingURL=flow-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-io.js","sourceRoot":"","sources":["../../src/driver/flow-io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function listFlows(flowsDir: string): string[];
2
+ export declare function formatFlowList(flowsDir: string, flows: string[]): string;
3
+ //# sourceMappingURL=flows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flows.d.ts","sourceRoot":"","sources":["../../src/driver/flows.ts"],"names":[],"mappings":"AAIA,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAUpD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAKxE"}
@@ -0,0 +1,20 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { AgentError, ErrorCode } from '../errors.js';
4
+ export function listFlows(flowsDir) {
5
+ if (!fs.existsSync(flowsDir)) {
6
+ throw new AgentError(`flowsDir not found: ${flowsDir}`, ErrorCode.FLOW_NOT_FOUND);
7
+ }
8
+ return fs
9
+ .readdirSync(flowsDir)
10
+ .filter((name) => name.endsWith('.yaml') || name.endsWith('.yml'))
11
+ .map((name) => name.replace(/\.(yaml|yml)$/, ''))
12
+ .sort((a, b) => a.localeCompare(b));
13
+ }
14
+ export function formatFlowList(flowsDir, flows) {
15
+ if (flows.length === 0) {
16
+ return `No flows in ${flowsDir}`;
17
+ }
18
+ return flows.map((flow) => path.join(flowsDir, `${flow}.yaml`)).join('\n');
19
+ }
20
+ //# sourceMappingURL=flows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flows.js","sourceRoot":"","sources":["../../src/driver/flows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC,uBAAuB,QAAQ,EAAE,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,EAAE;SACN,WAAW,CAAC,QAAQ,CAAC;SACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACjE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;SAChD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,KAAe;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,eAAe,QAAQ,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { Platform, ResolvedConfig } from '../config.js';
2
+ import type { LogSnapshot } from '../results/types.js';
3
+ export type LogSource = 'metro' | 'logcat' | 'sim' | 'auto';
4
+ export interface TailLogsOptions {
5
+ platform: Platform;
6
+ source?: LogSource;
7
+ lines?: number;
8
+ }
9
+ export interface CollectLogsOptions extends TailLogsOptions {
10
+ durationMs?: number;
11
+ }
12
+ export declare function resolveLogSource(platform: Platform, source?: LogSource): Exclude<LogSource, 'auto'>;
13
+ export declare function applyLogFilters(text: string, filters: string[] | undefined): string;
14
+ declare function metroPort(config: ResolvedConfig): number;
15
+ export declare function isMetroPortOpen(port: number): boolean;
16
+ export declare function tailLogsSnapshot(config: ResolvedConfig, options: TailLogsOptions): LogSnapshot;
17
+ export declare function tailLogs(config: ResolvedConfig, options: TailLogsOptions): string;
18
+ export declare function collectLogs(config: ResolvedConfig, options: CollectLogsOptions): Promise<LogSnapshot>;
19
+ export declare function tailLogsFollow(config: ResolvedConfig, options: TailLogsOptions): Promise<number>;
20
+ export declare function checkMetroLog(config: ResolvedConfig): {
21
+ ok: boolean;
22
+ message: string;
23
+ };
24
+ export declare function checkLogcatAvailable(): {
25
+ ok: boolean;
26
+ message: string;
27
+ };
28
+ export declare function checkSimLogAvailable(): {
29
+ ok: boolean;
30
+ message: string;
31
+ };
32
+ export { metroPort };
33
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/driver/logs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAK5B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAQnF;AAED,iBAAS,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEjD;AAaD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKrD;AAuED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,GAAG,WAAW,CAmB9F;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CASjF;AAMD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAoBtB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BhG;AAUD,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAOtF;AAED,wBAAgB,oBAAoB,IAAI;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAUvE;AAED,wBAAgB,oBAAoB,IAAI;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAYvE;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,199 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { AgentError, ErrorCode } from '../errors.js';
3
+ import { commandExists, runCommand } from './exec.js';
4
+ const MAX_COLLECT_DURATION_MS = 10_000;
5
+ const COLLECT_POLL_MS = 500;
6
+ export function resolveLogSource(platform, source) {
7
+ if (source && source !== 'auto') {
8
+ return source;
9
+ }
10
+ return platform === 'android' ? 'logcat' : 'sim';
11
+ }
12
+ export function applyLogFilters(text, filters) {
13
+ if (!filters?.length) {
14
+ return text;
15
+ }
16
+ return text
17
+ .split('\n')
18
+ .filter((line) => filters.some((filter) => line.includes(filter)))
19
+ .join('\n');
20
+ }
21
+ function metroPort(config) {
22
+ return config.log?.metroPort ?? config.devServerUrl?.port ?? 8081;
23
+ }
24
+ function androidPackage(config) {
25
+ const pkg = config.log?.androidPackage ?? config.maestroAppIds.android;
26
+ if (!pkg) {
27
+ throw new AgentError('log.androidPackage or maestro.appId.android required for logcat', ErrorCode.NOT_CONFIGURED);
28
+ }
29
+ return pkg;
30
+ }
31
+ export function isMetroPortOpen(port) {
32
+ const result = runCommand('curl', ['-sf', `http://127.0.0.1:${port}/status`], {
33
+ allowFailure: true,
34
+ });
35
+ return result.status === 0;
36
+ }
37
+ function tailLogcatText(config, lines) {
38
+ if (!commandExists('adb')) {
39
+ throw new AgentError('adb not installed', ErrorCode.TOOL_UNAVAILABLE);
40
+ }
41
+ const pkg = androidPackage(config);
42
+ const pidResult = runCommand('adb', ['shell', 'pidof', '-s', pkg], { allowFailure: true });
43
+ const pid = pidResult.stdout.trim();
44
+ const args = ['logcat', '-d', '-t', String(lines)];
45
+ if (pid) {
46
+ args.push('--pid', pid);
47
+ }
48
+ const result = runCommand('adb', args, { allowFailure: true });
49
+ let output = [result.stdout, result.stderr].filter(Boolean).join('\n');
50
+ output = applyLogFilters(output, config.log?.filters);
51
+ if (!output.trim()) {
52
+ return `logcat: no lines matched (package ${pkg})`;
53
+ }
54
+ return output;
55
+ }
56
+ function tailSimText(lines, filters) {
57
+ if (process.platform !== 'darwin') {
58
+ throw new AgentError('iOS sim logs require macOS', ErrorCode.TOOL_UNAVAILABLE);
59
+ }
60
+ const result = runCommand('log', ['show', '--style', 'compact', '--last', '1m'], {
61
+ allowFailure: true,
62
+ timeoutMs: 15_000,
63
+ });
64
+ const rows = (result.stdout || result.stderr).split('\n').slice(-lines);
65
+ const output = applyLogFilters(rows.join('\n'), filters);
66
+ return output.trim() || 'sim: no log lines in the last minute';
67
+ }
68
+ function buildSnapshot(platform, source, text, metroReachable) {
69
+ const lines = text.split('\n').filter((line) => line.length > 0);
70
+ return {
71
+ platform,
72
+ source,
73
+ text,
74
+ lineCount: lines.length,
75
+ truncated: false,
76
+ metroReachable,
77
+ };
78
+ }
79
+ function tailMetroSnapshot(config, platform, lines) {
80
+ const port = metroPort(config);
81
+ const up = isMetroPortOpen(port);
82
+ const filters = config.log?.filters ?? ['ReactNative', 'Expo', 'Metro'];
83
+ if (!up) {
84
+ throw new AgentError(`Metro not responding on port ${port}`, ErrorCode.LOG_SOURCE_UNAVAILABLE);
85
+ }
86
+ const body = platform === 'android' ? tailLogcatText(config, lines) : tailSimText(lines, filters);
87
+ return buildSnapshot(platform, 'metro', body, true);
88
+ }
89
+ export function tailLogsSnapshot(config, options) {
90
+ const lines = options.lines ?? 100;
91
+ const source = resolveLogSource(options.platform, options.source);
92
+ if (source === 'logcat') {
93
+ if (options.platform !== 'android') {
94
+ throw new AgentError('logcat is Android only', ErrorCode.VALIDATION);
95
+ }
96
+ return buildSnapshot(options.platform, 'logcat', tailLogcatText(config, lines));
97
+ }
98
+ if (source === 'sim') {
99
+ if (options.platform !== 'ios') {
100
+ throw new AgentError('sim logs are iOS only', ErrorCode.VALIDATION);
101
+ }
102
+ return buildSnapshot(options.platform, 'sim', tailSimText(lines, config.log?.filters));
103
+ }
104
+ return tailMetroSnapshot(config, options.platform, lines);
105
+ }
106
+ export function tailLogs(config, options) {
107
+ const snapshot = tailLogsSnapshot(config, options);
108
+ if (snapshot.metroReachable === false) {
109
+ return `Metro not responding\n\n${snapshot.text}`;
110
+ }
111
+ if (snapshot.metroReachable) {
112
+ return `Metro reachable\n\n${snapshot.text}`;
113
+ }
114
+ return snapshot.text;
115
+ }
116
+ function sleep(ms) {
117
+ return new Promise((resolve) => setTimeout(resolve, ms));
118
+ }
119
+ export async function collectLogs(config, options) {
120
+ const durationMs = Math.min(options.durationMs ?? 0, MAX_COLLECT_DURATION_MS);
121
+ const lines = options.lines ?? 100;
122
+ if (durationMs <= 0) {
123
+ return tailLogsSnapshot(config, options);
124
+ }
125
+ const deadline = Date.now() + durationMs;
126
+ let latest = tailLogsSnapshot(config, { ...options, lines });
127
+ while (Date.now() < deadline) {
128
+ await sleep(COLLECT_POLL_MS);
129
+ const next = tailLogsSnapshot(config, { ...options, lines });
130
+ if (next.text !== latest.text) {
131
+ latest = { ...next, truncated: next.lineCount >= lines };
132
+ }
133
+ }
134
+ return { ...latest, truncated: latest.lineCount >= lines };
135
+ }
136
+ export function tailLogsFollow(config, options) {
137
+ const source = resolveLogSource(options.platform, options.source);
138
+ if (source === 'logcat') {
139
+ if (options.platform !== 'android') {
140
+ return Promise.reject(new AgentError('logcat is Android only', ErrorCode.VALIDATION));
141
+ }
142
+ if (!commandExists('adb')) {
143
+ return Promise.reject(new AgentError('adb not installed', ErrorCode.TOOL_UNAVAILABLE));
144
+ }
145
+ const pkg = androidPackage(config);
146
+ const pidResult = runCommand('adb', ['shell', 'pidof', '-s', pkg], { allowFailure: true });
147
+ const pid = pidResult.stdout.trim();
148
+ const args = pid ? ['logcat', '--pid', pid] : ['logcat'];
149
+ return streamCommand('adb', args);
150
+ }
151
+ if (source === 'sim') {
152
+ if (process.platform !== 'darwin') {
153
+ return Promise.reject(new AgentError('iOS sim logs require macOS', ErrorCode.TOOL_UNAVAILABLE));
154
+ }
155
+ return streamCommand('log', ['stream', '--style', 'compact']);
156
+ }
157
+ return Promise.reject(new AgentError('follow mode supports logcat or sim only', ErrorCode.VALIDATION));
158
+ }
159
+ function streamCommand(command, args) {
160
+ return new Promise((resolve, reject) => {
161
+ const child = spawn(command, args, { stdio: 'inherit' });
162
+ child.on('error', reject);
163
+ child.on('close', (code) => resolve(code ?? 1));
164
+ });
165
+ }
166
+ export function checkMetroLog(config) {
167
+ const port = metroPort(config);
168
+ const up = isMetroPortOpen(port);
169
+ return {
170
+ ok: up,
171
+ message: up ? `Metro on :${port}` : `Metro not on :${port}`,
172
+ };
173
+ }
174
+ export function checkLogcatAvailable() {
175
+ if (!commandExists('adb')) {
176
+ return { ok: false, message: 'adb not installed' };
177
+ }
178
+ const adb = runCommand('adb', ['devices'], { allowFailure: true });
179
+ const hasDevice = adb.stdout.split('\n').some((line) => line.trim().endsWith('device'));
180
+ return {
181
+ ok: hasDevice,
182
+ message: hasDevice ? 'logcat ready' : 'adb installed but no device',
183
+ };
184
+ }
185
+ export function checkSimLogAvailable() {
186
+ if (process.platform !== 'darwin') {
187
+ return { ok: false, message: 'sim logs require macOS' };
188
+ }
189
+ const booted = runCommand('xcrun', ['simctl', 'list', 'devices', 'booted'], {
190
+ allowFailure: true,
191
+ });
192
+ const hasBooted = booted.stdout.includes('Booted');
193
+ return {
194
+ ok: hasBooted,
195
+ message: hasBooted ? 'sim log stream ready' : 'no booted iOS simulator',
196
+ };
197
+ }
198
+ export { metroPort };
199
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/driver/logs.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,31 @@
1
1
  import type { Platform, ResolvedConfig } from '../config.js';
2
+ import type { FlowRunResult, SmokeRunResult } from '../results/types.js';
2
3
  export interface RunFlowOptions {
3
4
  flow: string;
4
5
  platform?: Platform;
5
6
  env?: Record<string, string>;
6
7
  captureAfter?: boolean;
7
8
  }
9
+ export interface RunFlowContextOptions extends RunFlowOptions {
10
+ logLines?: number;
11
+ }
12
+ export declare function resolveFlowPath(config: ResolvedConfig, flow: string): string;
8
13
  export declare function requireMaestro(bin: string): void;
9
- export declare function runMaestroFlow(config: ResolvedConfig, options: RunFlowOptions): string;
10
- export declare function runMaestroFlows(config: ResolvedConfig, flows: string[], options: Omit<RunFlowOptions, 'flow'>): string;
14
+ export declare function runMaestroFlowCore(config: ResolvedConfig, options: RunFlowOptions): FlowRunResult;
15
+ export declare function runMaestroFlow(config: ResolvedConfig, options: RunFlowOptions): FlowRunResult;
16
+ export declare function runMaestroFlowWithContext(config: ResolvedConfig, options: RunFlowContextOptions): {
17
+ logs: import("../results/types.js").LogSnapshot;
18
+ diagnosis: import("../results/types.js").Diagnosis | null;
19
+ flow: string;
20
+ flowPath: string;
21
+ platform: Platform;
22
+ exitCode: number;
23
+ stdout: string;
24
+ stderr: string;
25
+ env: Record<string, string>;
26
+ screenshot: import("../results/types.js").ScreenshotResult | null;
27
+ ok: boolean;
28
+ };
29
+ export declare function runMaestroFlows(config: ResolvedConfig, flows: string[], options: Omit<RunFlowOptions, 'flow'>): SmokeRunResult;
30
+ export declare function runMaestroFlowsAll(config: ResolvedConfig, flows: string[], options: Omit<RunFlowOptions, 'flow'>): SmokeRunResult;
11
31
  //# sourceMappingURL=maestro.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"maestro.d.ts","sourceRoot":"","sources":["../../src/driver/maestro.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAM7D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAsBD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOhD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAoDtF;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GACpC,MAAM,CAMR"}
1
+ {"version":3,"file":"maestro.d.ts","sourceRoot":"","sources":["../../src/driver/maestro.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAoB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO3F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAgB5E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOhD;AAgDD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,CAwBjG;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,CAU7F;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,qBAAqB;;;;;;;;;;;;EAoD/F;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GACpC,cAAc,CA6BhB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GACpC,cAAc,CA4BhB"}