swipium 1.2.0 → 1.4.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 (50) hide show
  1. package/README.md +11 -11
  2. package/dist/appMap/featureIndex.js +183 -0
  3. package/dist/appMap/featureIndex.js.map +1 -0
  4. package/dist/featureTesting/executionBootstrap.js +14 -10
  5. package/dist/featureTesting/executionBootstrap.js.map +1 -1
  6. package/dist/featureTesting/featureMap.js +53 -0
  7. package/dist/featureTesting/featureMap.js.map +1 -0
  8. package/dist/featureTesting/featureScope.js +354 -0
  9. package/dist/featureTesting/featureScope.js.map +1 -0
  10. package/dist/featureTesting/mapFeatureScope.js +143 -0
  11. package/dist/featureTesting/mapFeatureScope.js.map +1 -0
  12. package/dist/featureTesting/objectiveModel.js +129 -0
  13. package/dist/featureTesting/objectiveModel.js.map +1 -0
  14. package/dist/featureTesting/resultMerge.js +112 -0
  15. package/dist/featureTesting/resultMerge.js.map +1 -0
  16. package/dist/featureTesting/sources.js +96 -0
  17. package/dist/featureTesting/sources.js.map +1 -0
  18. package/dist/featureTesting/suiteBridge.js +51 -0
  19. package/dist/featureTesting/suiteBridge.js.map +1 -0
  20. package/dist/featureTesting/synonyms.js +73 -0
  21. package/dist/featureTesting/synonyms.js.map +1 -0
  22. package/dist/featureTesting/testCaseFactory.js +107 -0
  23. package/dist/featureTesting/testCaseFactory.js.map +1 -0
  24. package/dist/featureTesting/testPlan.js +50 -0
  25. package/dist/featureTesting/testPlan.js.map +1 -0
  26. package/dist/server.js +11 -0
  27. package/dist/server.js.map +1 -1
  28. package/dist/tools/agent.js +12 -0
  29. package/dist/tools/agent.js.map +1 -1
  30. package/dist/tools/appMap.js +123 -1
  31. package/dist/tools/appMap.js.map +1 -1
  32. package/dist/tools/build.js +172 -0
  33. package/dist/tools/build.js.map +1 -0
  34. package/dist/tools/bundletool.js +145 -0
  35. package/dist/tools/bundletool.js.map +1 -0
  36. package/dist/tools/capabilities.js +24 -0
  37. package/dist/tools/capabilities.js.map +1 -1
  38. package/dist/tools/featureTesting.js +344 -0
  39. package/dist/tools/featureTesting.js.map +1 -0
  40. package/dist/tools/resolveArtifact.js +80 -0
  41. package/dist/tools/resolveArtifact.js.map +1 -0
  42. package/dist/tools/resolveTarget.js +67 -0
  43. package/dist/tools/resolveTarget.js.map +1 -0
  44. package/dist/tools/snapshot.js +41 -1
  45. package/dist/tools/snapshot.js.map +1 -1
  46. package/dist/version.js +16 -2
  47. package/dist/version.js.map +1 -1
  48. package/docs/mcp-server.md +1 -1
  49. package/docs/tools.md +52 -3
  50. package/package.json +1 -1
@@ -0,0 +1,172 @@
1
+ // qa_build_plan + qa_build (roadmap §4.5).
2
+ //
3
+ // qa_build_plan: side-effect-free. Proposes the exact prerequisite + build commands and the
4
+ // artifact globs the build will produce. An agent shows this and asks before compiling.
5
+ //
6
+ // qa_build: consent-gated. Runs the planned prerequisites + build as a JOB (returns a jobId;
7
+ // poll with qa_job_status), captures a combined build log artifact, and classifies a failure
8
+ // (GRADLE_FAILED / XCODEBUILD_FAILED / FLUTTER_BUILD_FAILED / BUILD_TIMED_OUT). On success it
9
+ // re-resolves the produced artifact so the next step (qa_prepare_target / qa_test_this) has it.
10
+ import { z } from 'zod';
11
+ import { qaOk, qaError } from '../lib/result.js';
12
+ import { qaFail } from '../oracle/failures.js';
13
+ import { requireConsent, consumeConsent } from '../consent/consent.js';
14
+ import { resolveProjectRoot } from '../context/projectRoot.js';
15
+ import { buildPlan } from '../build/plan.js';
16
+ import { executeBuild } from '../services/build.js';
17
+ const DEFAULT_BUILD_TIMEOUT_MS = 20 * 60_000; // 20 min — native builds are slow
18
+ async function rootFrom(server, sessions, sessionId, projectRoot) {
19
+ if (sessionId) {
20
+ const r = sessions.get(sessionId)?.root;
21
+ if (r)
22
+ return r;
23
+ }
24
+ const resolved = await resolveProjectRoot(server, projectRoot);
25
+ if (!resolved.root)
26
+ return { error: qaError({ what: 'Could not resolve a project root', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot or call qa_start_session.'], clientHint: resolved.hint }) };
27
+ return resolved.root;
28
+ }
29
+ function planSummary(plan) {
30
+ const pre = plan.prerequisites.map((s) => ` - ${s.label}: ${s.command}`).join('\n');
31
+ return (`Build plan: ${plan.framework} / ${plan.platform} / ${plan.variant}\n` +
32
+ (plan.prerequisites.length ? `prerequisites:\n${pre}\n` : '') +
33
+ `build: ${plan.build ? plan.build.command + ` (cwd: ${plan.build.cwd})` : '(none)'}\n` +
34
+ `expects: ${plan.expectedArtifactGlobs.join(', ')}\n` +
35
+ `toolchain: ${plan.toolchainOk ? 'ok' : 'MISSING ' + plan.missingToolchain.join(', ')}` +
36
+ (plan.notes.length ? `\nnotes:\n - ${plan.notes.join('\n - ')}` : ''));
37
+ }
38
+ export function registerBuild(server, sessions) {
39
+ server.registerTool('qa_build_plan', {
40
+ title: 'Plan a build from source',
41
+ description: 'Propose the exact prerequisite + build commands to produce an installable artifact for a platform, per framework (Expo/RN/native/Flutter). Side-effect free. Returns prerequisites (deps install, Expo prebuild, pod install), the main build command + cwd, expected artifact globs, and toolchain status. Typed blockers: UNSUPPORTED_FRAMEWORK, BUILD_COMMAND_UNAVAILABLE. Run qa_build to actually execute.',
42
+ inputSchema: {
43
+ sessionId: z.string().optional(),
44
+ projectRoot: z.string().optional(),
45
+ platform: z.enum(['android', 'ios']),
46
+ variant: z.enum(['debug', 'release']).optional(),
47
+ },
48
+ }, async ({ sessionId, projectRoot, platform, variant }) => {
49
+ const root = await rootFrom(server, sessions, sessionId, projectRoot);
50
+ if (typeof root !== 'string')
51
+ return root.error;
52
+ const plan = await buildPlan({ projectRoot: root, platform: platform, variant });
53
+ if (plan.failureCode) {
54
+ return qaFail(plan.failureCode, { what: plan.notes[0] ?? `Cannot plan a ${platform} build for ${plan.framework}`, extra: { plan } });
55
+ }
56
+ return qaOk({ plan }, planSummary(plan));
57
+ });
58
+ server.registerTool('qa_build', {
59
+ title: 'Build the app from source',
60
+ description: 'Run the planned prerequisites + build (consent-gated) as a background job. Captures a combined build log artifact and, on success, re-resolves the produced artifact (path/appId/installability). On failure returns a typed blocker (GRADLE_FAILED/XCODEBUILD_FAILED/FLUTTER_BUILD_FAILED/BUILD_TIMED_OUT/DEPENDENCY_INSTALL_REQUIRED) with the log — a build failure is NOT a test failure. Returns a jobId; poll qa_job_status. Requires a session (for artifacts/log storage).',
61
+ inputSchema: {
62
+ sessionId: z.string().describe('A session from qa_start_session (build log is stored as a session artifact).'),
63
+ platform: z.enum(['android', 'ios']),
64
+ variant: z.enum(['debug', 'release']).optional(),
65
+ timeoutMs: z.number().optional().describe(`Per-step timeout (default ${DEFAULT_BUILD_TIMEOUT_MS}).`),
66
+ consentId: z.string().optional(),
67
+ approve: z.boolean().optional(),
68
+ },
69
+ }, async ({ sessionId, platform, variant, timeoutMs, consentId, approve }) => {
70
+ const session = sessions.get(sessionId);
71
+ if (!session)
72
+ return qaError({ what: `Unknown sessionId "${sessionId}"`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first.'] });
73
+ const plan = await buildPlan({ projectRoot: session.root, platform: platform, variant });
74
+ if (plan.failureCode)
75
+ return qaFail(plan.failureCode, { what: plan.notes[0] ?? 'Cannot build', extra: { plan } });
76
+ if (!plan.toolchainOk)
77
+ return qaFail('BUILD_COMMAND_UNAVAILABLE', { what: `Missing toolchain: ${plan.missingToolchain.join(', ')}`, extra: { plan } });
78
+ if (!plan.build)
79
+ return qaFail('BUILD_COMMAND_UNAVAILABLE', { extra: { plan } });
80
+ // Consent: building from source spends minutes + writes into the project tree.
81
+ const steps = [...plan.prerequisites, plan.build];
82
+ const affects = { commands: steps.map((s) => s.command), cwd: plan.build.cwd };
83
+ const gate = consumeConsent(consentId, approve, { action: 'build_from_source', affects });
84
+ if (!gate.approved) {
85
+ sessions.recordMutation(session, {
86
+ tool: 'qa_build',
87
+ action: 'build_from_source',
88
+ risk: 'medium',
89
+ target: affects,
90
+ consent: { required: true, approved: false },
91
+ status: 'requested',
92
+ });
93
+ return requireConsent({
94
+ action: 'build_from_source',
95
+ risk: 'medium',
96
+ exactCommand: steps.map((s) => `(${s.cwd}) ${s.command}`).join('\n'),
97
+ affects,
98
+ explain: `Build ${plan.framework}/${platform}/${plan.variant} from source. This runs:\n${steps.map((s) => `• ${s.label}: ${s.command}`).join('\n')}`,
99
+ });
100
+ }
101
+ sessions.recordMutation(session, {
102
+ tool: 'qa_build',
103
+ action: 'build_from_source',
104
+ risk: 'medium',
105
+ target: affects,
106
+ consent: { required: true, consentId, approved: true },
107
+ status: 'approved',
108
+ });
109
+ const job = sessions.createJob(session, `build:${platform}`);
110
+ void runBuild(sessions, session, job, plan, timeoutMs ?? DEFAULT_BUILD_TIMEOUT_MS, { affects, consentId });
111
+ return qaOk({ jobId: job.jobId, status: 'running', kind: job.kind, plan }, `Started ${plan.framework}/${platform} build as job ${job.jobId}. Poll qa_job_status { sessionId:"${session.id}", jobId:"${job.jobId}" }.`);
112
+ });
113
+ }
114
+ async function runBuild(sessions, session, job, plan, timeoutMs, mutation) {
115
+ const signal = sessions.abortSignal(session, job.jobId);
116
+ const upd = (patch) => sessions.updateJobIfRunning(session, job, patch);
117
+ const res = await executeBuild(sessions, session, plan, { signal, timeoutMs, onProgress: (p) => upd({ progress: p }) });
118
+ if (res.aborted)
119
+ return;
120
+ if (!res.ok) {
121
+ const info = res.failureCode ? qaFail(res.failureCode) : undefined;
122
+ if (mutation) {
123
+ sessions.recordMutation(session, {
124
+ tool: 'qa_build',
125
+ action: 'build_from_source',
126
+ risk: 'medium',
127
+ target: mutation.affects,
128
+ consent: { required: true, consentId: mutation.consentId, approved: true },
129
+ status: 'blocked',
130
+ ledgerUri: res.logUri,
131
+ detail: `${res.failureCode}: ${res.error}`,
132
+ });
133
+ }
134
+ upd({
135
+ status: 'failed',
136
+ error: `${res.failureCode}: ${res.error}`,
137
+ result: { failureCode: res.failureCode, step: res.step, logUri: res.logUri, tail: res.tail, nextSteps: info?.structuredContent.nextSteps },
138
+ resultText: `❌ ${res.failureCode} during "${res.step}". Build failure ≠ test failure. Log: ${res.logUri}`,
139
+ endedAt: Date.now(),
140
+ });
141
+ return;
142
+ }
143
+ if (!res.artifact) {
144
+ if (mutation) {
145
+ sessions.recordMutation(session, {
146
+ tool: 'qa_build',
147
+ action: 'build_from_source',
148
+ risk: 'medium',
149
+ target: mutation.affects,
150
+ consent: { required: true, consentId: mutation.consentId, approved: true },
151
+ status: 'blocked',
152
+ ledgerUri: res.logUri,
153
+ detail: res.warning ?? 'build finished but no artifact was located',
154
+ });
155
+ }
156
+ upd({ status: 'done', progress: 'done', result: { built: true, artifact: null, logUri: res.logUri, warning: res.warning, searchedLocations: res.searchedLocations }, resultText: `⚠️ Build finished but Swipium could not locate the artifact. Log: ${res.logUri}`, endedAt: Date.now() });
157
+ return;
158
+ }
159
+ if (mutation) {
160
+ sessions.recordMutation(session, {
161
+ tool: 'qa_build',
162
+ action: 'build_from_source',
163
+ risk: 'medium',
164
+ target: { ...mutation.affects, artifact: res.artifact.path },
165
+ consent: { required: true, consentId: mutation.consentId, approved: true },
166
+ status: 'executed',
167
+ ledgerUri: res.logUri,
168
+ });
169
+ }
170
+ upd({ status: 'done', progress: 'done', result: { built: true, artifact: res.artifact, logUri: res.logUri }, resultText: `✅ Built ${res.artifact.type.toUpperCase()} at ${res.artifact.path}${res.artifact.appId ? ` (appId ${res.artifact.appId})` : ''}. Next: qa_prepare_target.`, endedAt: Date.now() });
171
+ }
172
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ // qa_bundletool (hardening P0.2) — convert an .aab to an installable universal .apk via bundletool,
2
+ // cached under .swipium/artifacts/. Runs as a job (conversion can take a minute). Returns a typed
3
+ // AAB_NEEDS_BUNDLETOOL / AAB_BUILD_APKS_FAILED blocker when it cannot, never a generic error.
4
+ import { z } from 'zod';
5
+ import { qaOk, qaError } from '../lib/result.js';
6
+ import { qaFail } from '../oracle/failures.js';
7
+ import { requireConsent, consumeConsent } from '../consent/consent.js';
8
+ import { resolveArtifact } from '../artifacts/resolve.js';
9
+ import { convertAabToApk, findBundletool, buildAndInstallApkSet } from '../artifacts/bundletool.js';
10
+ import { startProgress } from '../session/progress.js';
11
+ import { log } from '../lib/logger.js';
12
+ export function registerBundletool(server, sessions) {
13
+ server.registerTool('qa_bundletool', {
14
+ title: 'Convert .aab → installable .apk',
15
+ description: 'Convert an Android App Bundle (.aab) into an installable APK set using bundletool, cached under .swipium/artifacts/. An .aab is NOT directly installable — this is the conversion step before qa_prepare_target. Default mode builds a UNIVERSAL .apk (works on any device). Pass connectedDevice:true to build a DEVICE-SPECIFIC APK set (--connected-device) and install:true to push it via bundletool install-apks. Uses the debug keystore by default (emulator/dev OK). Returns typed blockers (BUNDLETOOL_MISSING/AAB_NEEDS_BUNDLETOOL, AAB_BUILD_APKS_FAILED, AAB_DEVICE_SPEC_FAILED, AAB_INSTALL_FAILED, ANDROID_SIGNING_FAILED). Runs as a job; poll qa_job_status.',
16
+ inputSchema: {
17
+ sessionId: z.string(),
18
+ aab: z.string().optional().describe('Path to the .aab (default: the best .aab resolved under the project).'),
19
+ force: z.boolean().optional().describe('Rebuild even if a cached APK/APK set exists.'),
20
+ connectedDevice: z.boolean().optional().describe('Build a device-specific APK set for a connected device (bundletool --connected-device) instead of a universal APK.'),
21
+ install: z.boolean().optional().describe('With connectedDevice, also install the APK set on the device (bundletool install-apks). Requires an online adb device. Consent-gated (installs app code on a real device/emulator).'),
22
+ deviceId: z.string().optional().describe('adb serial to target for connectedDevice build/install (defaults to the only connected device).'),
23
+ consentId: z.string().optional(),
24
+ approve: z.boolean().optional(),
25
+ },
26
+ }, async ({ sessionId, aab, force, connectedDevice, install, deviceId, consentId, approve }) => {
27
+ const session = sessions.get(sessionId);
28
+ if (!session)
29
+ return qaError({ what: `Unknown sessionId "${sessionId}"`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first.'] });
30
+ // Resolve the .aab if not given.
31
+ let aabPath = aab;
32
+ if (!aabPath) {
33
+ const r = await resolveArtifact({ projectRoot: session.root, platform: 'android' }, false);
34
+ const found = [r.best, ...r.candidates].find((c) => c?.type === 'aab');
35
+ if (!found)
36
+ return qaFail('NO_BUILD_ARTIFACT', { what: 'No .aab found to convert', nextSteps: ['Pass aab=, or build an APK directly with qa_build.'] });
37
+ aabPath = found.path;
38
+ }
39
+ // Installing an APK set runs app code on a real device/emulator → consent-gated (build-only
40
+ // is safe and ungated). Confirm intent BEFORE any work, regardless of whether bundletool is
41
+ // installed. Mirrors qa_prepare_target / qa_prepare_ios_real_target.
42
+ let mutationConsent;
43
+ if (connectedDevice && install) {
44
+ const affects = { aab: aabPath, device: deviceId ?? '(only connected device)' };
45
+ const gate = consumeConsent(consentId, approve, { action: 'install_app', affects });
46
+ if (!gate.approved) {
47
+ sessions.recordMutation(session, { tool: 'qa_bundletool', action: 'install_app', risk: 'medium', target: affects, consent: { required: true, approved: false }, status: 'requested' });
48
+ return requireConsent({
49
+ action: 'install_app', risk: 'medium',
50
+ exactCommand: `bundletool build-apks --connected-device${deviceId ? ` --device-id ${deviceId}` : ''} --bundle ${aabPath} && bundletool install-apks --apks <set>`,
51
+ affects,
52
+ explain: `Build a device-specific APK set from ${aabPath} and INSTALL it on ${deviceId ?? 'the connected device'}? It pushes app code to the device.`,
53
+ });
54
+ }
55
+ mutationConsent = { required: true, consentId, approved: true };
56
+ }
57
+ // Fail fast + honestly when bundletool is unavailable (no job needed).
58
+ const launcher = await findBundletool();
59
+ if (!launcher) {
60
+ return qaFail('AAB_NEEDS_BUNDLETOOL', {
61
+ what: `bundletool is not installed — cannot convert ${aabPath}`,
62
+ nextSteps: [
63
+ 'Install bundletool (brew install bundletool) or set $BUNDLETOOL_JAR to bundletool.jar.',
64
+ 'Or build an APK directly: qa_build { platform: "android", variant: "debug" } (./gradlew assembleDebug).',
65
+ ],
66
+ extra: { aab: aabPath },
67
+ });
68
+ }
69
+ const job = sessions.createJob(session, 'bundletool:convert');
70
+ if (connectedDevice) {
71
+ void runDeviceApkSet(sessions, session, job, aabPath, { install: !!install, deviceId, force: !!force, mutationConsent });
72
+ return qaOk({ jobId: job.jobId, status: 'running', kind: job.kind, aab: aabPath, mode: 'connected-device', install: !!install, bundletool: launcher.describe }, `Building${install ? ' + installing' : ''} a device-specific APK set from ${aabPath} as job ${job.jobId} (${launcher.describe}). Poll qa_job_status.`);
73
+ }
74
+ void runConvert(sessions, session, job, aabPath, !!force);
75
+ return qaOk({ jobId: job.jobId, status: 'running', kind: job.kind, aab: aabPath, mode: 'universal', bundletool: launcher.describe }, `Converting ${aabPath} → universal APK as job ${job.jobId} (${launcher.describe}). Poll qa_job_status.`);
76
+ });
77
+ }
78
+ async function runDeviceApkSet(sessions, session, job, aabPath, opts) {
79
+ const signal = sessions.abortSignal(session, job.jobId);
80
+ const upd = (patch) => sessions.updateJobIfRunning(session, job, patch);
81
+ const prog = startProgress(sessions, session, job, 'building_apk_set', { statusText: 'Building a device-specific APK set with bundletool --connected-device.', nextExpected: opts.install ? 'Install the APK set on the device.' : 'Cache the APK set.' });
82
+ try {
83
+ const result = await buildAndInstallApkSet(aabPath, session.root, { deviceId: opts.deviceId, install: opts.install, signal, force: opts.force });
84
+ if (signal?.aborted)
85
+ return;
86
+ const logUri = result.logText ? sessions.saveArtifact(session, 'logs', `bundletool-apks-${job.jobId}.log`, result.logText, 'text/plain', 'bundletool device APK set log') : undefined;
87
+ if (!result.ok) {
88
+ if (opts.install) {
89
+ sessions.recordMutation(session, { tool: 'qa_bundletool', action: 'install_app', risk: 'medium', target: { aab: aabPath, device: opts.deviceId ?? null, apksPath: result.apksPath ?? null }, consent: opts.mutationConsent ?? { required: true, approved: true }, status: 'blocked', detail: `${result.failureCode}: ${result.error}` });
90
+ }
91
+ upd({ status: 'failed', error: `${result.failureCode}: ${result.error}`, result: { failureCode: result.failureCode, apksPath: result.apksPath ?? null, command: result.buildCommand ?? null, logUri, aab: aabPath }, resultText: `❌ ${result.failureCode}: ${result.error}`, endedAt: Date.now() });
92
+ return;
93
+ }
94
+ if (result.installed) {
95
+ sessions.addEnvChange(session, `installed APK set from ${aabPath} on ${opts.deviceId ?? 'connected device'}`);
96
+ sessions.recordMutation(session, { tool: 'qa_bundletool', action: 'install_app', risk: 'medium', target: { aab: aabPath, device: opts.deviceId ?? null, apksPath: result.apksPath ?? null }, consent: opts.mutationConsent ?? { required: true, approved: true }, status: 'executed' });
97
+ }
98
+ prog.done(result.installed ? 'Device APK set built + installed.' : 'Device APK set built.');
99
+ sessions.addWorkaround(session, `built device-specific APK set via bundletool${result.installed ? ' + installed' : ''}`);
100
+ upd({
101
+ status: 'done', progress: 'done',
102
+ result: { converted: true, mode: 'connected-device', installed: !!result.installed, originalArtifact: aabPath, apksPath: result.apksPath ?? null, buildCommand: result.buildCommand ?? null, installCommand: result.installCommand ?? null, logUri },
103
+ resultText: result.installed
104
+ ? `✅ Device-specific APK set installed from ${aabPath}. The app is on the device; continue with qa_prepare_target { bindOnly: true } or qa_smoke.`
105
+ : `✅ Device-specific APK set: ${result.apksPath}. Install it with qa_bundletool { connectedDevice: true, install: true } or bundletool install-apks.`,
106
+ endedAt: Date.now(),
107
+ });
108
+ }
109
+ catch (e) {
110
+ if (signal?.aborted)
111
+ return;
112
+ log('error', 'bundletool device APK set job failed', { jobId: job.jobId, err: String(e) });
113
+ upd({ status: 'failed', error: String(e), result: { failureCode: 'AAB_DEVICE_SPEC_FAILED' }, resultText: `❌ bundletool error: ${String(e)}`, endedAt: Date.now() });
114
+ }
115
+ }
116
+ async function runConvert(sessions, session, job, aabPath, force) {
117
+ const signal = sessions.abortSignal(session, job.jobId);
118
+ const upd = (patch) => sessions.updateJobIfRunning(session, job, patch);
119
+ const prog = startProgress(sessions, session, job, 'converting_aab', { statusText: 'Building a universal APK from the .aab with bundletool.', nextExpected: 'Extract universal.apk and cache it.' });
120
+ try {
121
+ const result = await convertAabToApk(aabPath, session.root, { signal, force });
122
+ if (signal?.aborted)
123
+ return;
124
+ if (!result.ok) {
125
+ const logUri = result.error ? sessions.saveArtifact(session, 'logs', `bundletool-${Date.now()}.log`, `${result.command ?? ''}\n${result.error}`, 'text/plain', 'bundletool conversion log') : undefined;
126
+ upd({ status: 'failed', error: `${result.failureCode}: ${result.error}`, result: { failureCode: result.failureCode, command: result.command, logUri, aab: aabPath }, resultText: `❌ ${result.failureCode}: ${result.error}`, endedAt: Date.now() });
127
+ return;
128
+ }
129
+ prog.done('Universal APK ready.');
130
+ sessions.addWorkaround(session, `converted .aab → universal .apk via bundletool (${result.fromCache ? 'cached' : 'built'})`);
131
+ upd({
132
+ status: 'done', progress: 'done',
133
+ result: { converted: true, fromCache: !!result.fromCache, originalArtifact: aabPath, generatedApk: result.apkPath, apksPath: result.apksPath ?? null, command: result.command ?? null },
134
+ resultText: `✅ ${result.fromCache ? 'Using cached' : 'Built'} universal APK: ${result.apkPath}. Next: qa_prepare_target { apk: "${result.apkPath}" }.`,
135
+ endedAt: Date.now(),
136
+ });
137
+ }
138
+ catch (e) {
139
+ if (signal?.aborted)
140
+ return;
141
+ log('error', 'bundletool job failed', { jobId: job.jobId, err: String(e) });
142
+ upd({ status: 'failed', error: String(e), result: { failureCode: 'AAB_BUILD_APKS_FAILED' }, resultText: `❌ bundletool error: ${String(e)}`, endedAt: Date.now() });
143
+ }
144
+ }
145
+ //# sourceMappingURL=bundletool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundletool.js","sourceRoot":"","sources":["../../src/tools/bundletool.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ export const CAPABILITY_GROUPS = [
14
14
  { name: 'qa_status', summary: 'Compact session status and current next action.' },
15
15
  { name: 'qa_explain_blocker', summary: 'Explain a typed blocker and the owner of the fix.' },
16
16
  { name: 'qa_continue_from_blocker', summary: 'Resume after user input, with secret redaction.' },
17
+ { name: 'qa_next_best_action', summary: 'Deterministic recommendation of the single best next tool to call, and why.' },
17
18
  { name: 'qa_get_artifact', summary: 'Fetch Swipium artifact metadata or contents by URI.' },
18
19
  ],
19
20
  },
@@ -31,6 +32,17 @@ export const CAPABILITY_GROUPS = [
31
32
  { name: 'qa_wda', summary: 'WebDriverAgent attach/build/start for structured iOS Simulator automation.' },
32
33
  ],
33
34
  },
35
+ {
36
+ group: 'build',
37
+ purpose: 'Resolve a device and an installable artifact, or build one from source locally.',
38
+ tools: [
39
+ { name: 'qa_resolve_target', summary: 'Pick the best device/simulator (online > boot; honors platform/device).' },
40
+ { name: 'qa_resolve_artifact', summary: 'Find the best installable .apk/.aab/.ipa/.app and explain where it looked.' },
41
+ { name: 'qa_build_plan', summary: 'Propose exact build commands per framework/platform (side-effect free).' },
42
+ { name: 'qa_build', summary: 'Build from source (consent-gated job); captures a log and re-resolves the artifact.' },
43
+ { name: 'qa_bundletool', summary: 'Convert an .aab to an installable APK (universal or device-specific set).' },
44
+ ],
45
+ },
34
46
  {
35
47
  group: 'device',
36
48
  purpose: 'Inspect and control the device/app environment without raw adb or simctl.',
@@ -51,6 +63,7 @@ export const CAPABILITY_GROUPS = [
51
63
  purpose: 'Observe, act, and make deterministic health assertions.',
52
64
  tools: [
53
65
  { name: 'qa_snapshot', summary: 'Capture compact structured UI elements.' },
66
+ { name: 'qa_inspect', summary: 'Return the full attributes of a single @eN element from the latest snapshot.' },
54
67
  { name: 'qa_act', summary: 'Tap, type, clear, swipe, scroll, press, open URL, or wait, then observe.' },
55
68
  { name: 'qa_clear_overlay', summary: 'Dismiss common overlays blocking a target.' },
56
69
  { name: 'qa_check_health', summary: 'Detect crash, ANR, error boundaries, and foreground health.' },
@@ -94,9 +107,20 @@ export const CAPABILITY_GROUPS = [
94
107
  { name: 'qa_app_map_read', summary: 'Read compact app map sections.' },
95
108
  { name: 'qa_app_map_query', summary: 'Search screens, features, tests, and code links.' },
96
109
  { name: 'qa_app_map_feature_scope', summary: 'Resolve a feature query to a focused test scope.' },
110
+ { name: 'qa_app_map_update', summary: 'Targeted provenance-tracked map updates: note, test cases, automation suite, environment, coverage.' },
111
+ { name: 'qa_app_map_diff', summary: 'Diff two app-map snapshots: screen/coverage/locator/test changes and new untested code.' },
97
112
  { name: 'qa_app_map_validate', summary: 'Validate schema, provenance, and map links.' },
98
113
  ],
99
114
  },
115
+ {
116
+ group: 'feature',
117
+ purpose: 'Test a specific feature by name, backed by the app knowledge map.',
118
+ tools: [
119
+ { name: 'qa_feature_scope', summary: 'Map a natural-language feature to code/screens/routes/runtime/tests + objective + strategy (read-only).' },
120
+ { name: 'qa_feature_test_plan', summary: 'Feature test plan: scope + objective + generated cases + fixtures + automation readiness (read-only).' },
121
+ { name: 'qa_test_feature', summary: 'Focused feature test: scope, targeted exploration toward the feature, record cases, update the map and report.' },
122
+ ],
123
+ },
100
124
  {
101
125
  group: 'flows',
102
126
  purpose: 'Create, plan, run, and repair durable simulator flows and POM suites.',
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/tools/capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/tools/capabilities.ts"],"names":[],"mappings":"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"}