60 Commits

Author SHA1 Message Date
Michał Pierzchała 96534e860b fix: stream replay suite progress (#795)
* fix: stream replay suite progress

* fix: tighten replay progress cancellation
2026-06-12 20:51:40 +02:00
Michał Pierzchała 3f6363c951 fix: route replay path commands correctly (#778)
* fix: route replay path commands correctly

* test: cover dedicated CLI handler declines
2026-06-12 09:25:34 +02:00
Michał Pierzchała a35c444df6 feat: add perf memory diagnostics (#759)
* feat: add perf memory diagnostics

* fix: address perf memory CI findings

* fix: address perf memory review feedback

* docs: explain perf memory diagnostics benefits
2026-06-11 14:58:09 +02:00
Michał Pierzchała a89d68ddde feat: export replays to maestro yaml (#751)
* feat: export replays to maestro yaml

* refactor: simplify maestro export conversion

* fix: warn on maestro long press duration export

* fix: tighten replay export edge cases
2026-06-10 20:10:39 +02:00
Michał Pierzchała b30292d867 refactor(types): deepen type consolidation (#743)
* refactor(types): deepen type consolidation

* fix: satisfy fallow type refactor audit
2026-06-10 14:05:39 +02:00
Michał Pierzchała 8e1f8a9f8f perf: lazy load daemon handlers and report bundle size (#608)
* perf: lazy load daemon handlers

* perf: thin command metadata paths

* refactor: isolate platform inventory loading

* refactor: trim lazy loading cleanup

* test: guard daemon routing metadata drift

* ci: report startup timing with size
2026-05-30 16:49:21 +02:00
Michał Pierzchała 819d7dc8aa feat: expose structured MCP command tools (#593)
* feat: expose semantic MCP tools

* docs: remove semantic mcp prd

* refactor: deepen semantic command surface

* refactor: add mcp execution seam

* refactor: deepen command grammar

* refactor: remove legacy command definitions

* refactor: collapse semantic cli wrappers

* refactor: remove local mcp placeholders

* refactor: derive semantic cli routing

* refactor: trim mcp status metadata

* refactor: derive semantic input contracts

* refactor: split semantic grammar modules

* refactor: derive batch input schema

* refactor: centralize cli command schema catalog

* refactor: share semantic cli output projections

* refactor: remove legacy cli output paths

* refactor: consolidate command interface surface

* docs: align command contract wording

* refactor: split command projection from cli grammar

* refactor: trim projection exports

* fix: satisfy fallow command contract audit

* refactor: structure public batch steps

* chore: clean batch architecture references

* fix: keep legacy cli batch steps working

* fix: serialize mcp batches

* chore: tighten command surface cleanup

* fix: serialize mcp stdin requests

* chore: keep mcp config out of command contracts

* fix: project structured batch targets

* chore: harden command input typing

* fix: project maestro backend for replay tests

* fix: preserve session mcp request options
2026-05-28 09:20:55 +02:00
Michał Pierzchała a5fffc6e49 feat: add Maestro YAML replay compatibility (#581)
* feat: add Maestro replay compatibility

* fix: harden Maestro replay compatibility

* fix: address Maestro replay review feedback

* fix: finalize Maestro replay compatibility

* refactor: tighten Maestro replay compatibility boundary

* refactor: reduce Maestro replay quality debt

* refactor: satisfy Maestro replay fallow audit

* fix: stabilize Android provider snapshot tests
2026-05-27 21:45:51 +02:00
Michał Pierzchała 47b981c8ad feat: add gesture command coverage (#576)
* feat: add gesture command coverage

* fix: align iOS fling provider fixture

* feat: group gesture commands

* fix: clarify android gesture support

* feat: add android multitouch gestures

* fix: address gesture review feedback

* refactor: simplify gesture plumbing

* fix: keep gesture subcommands internal

* fix: update iOS provider pan transcript
2026-05-22 18:01:58 +02:00
Michał Pierzchała 67aa89af58 feat: add iOS repro evidence capabilities (#573) 2026-05-21 13:39:52 +02:00
Michał Pierzchała b0e19c9d1e perf: improve recording and interaction flows (#563)
* perf: improve recording and interaction flows

* feat: add React Native overlay dismiss command

* test: cover RedBox overlay dismissal

* fix: simplify React Native overlay snapshot hint

* fix: address daemon and scroll review feedback

* fix: unblock ci after recording polish

* chore: refresh fallow health baseline

* test: stabilize android provider suites

* test: cover rn overlay provider command
2026-05-20 20:32:08 +02:00
Michał Pierzchała 896adcc625 feat: add maestro replay compatibility (#561) 2026-05-19 20:49:34 +02:00
Michał Pierzchała 094c290703 perf: speed up iOS replay runner (#557)
* perf: speed up iOS replay runner

* fix: harden ios replay fast paths

* fix: address ci validation failures

* refactor: trim unused ios replay surface
2026-05-19 11:36:48 +02:00
Michał Pierzchała 59d28e8446 refactor: add provider-first device lab tests (#542)
* refactor: add provider-first device lab tests

* refactor: tighten device lab provider seams

* test: cover provider lab contracts

* docs: record device lab harness direction

* ci: run device lab integration tests

* test: move device lab under integration

* test: extract device lab helpers

* refactor: centralize apps filter defaults

* test: drop lab-covered unit tests

* test: fold platform happy paths into device lab

* test: reuse device lab helpers

* test: move device lab to in-process harness

* test: replace session handler cases with device lab

* test: harden device lab scenario contracts

* docs: define unit test retention policy

* test: expand provider device lab coverage

* test: harden provider device lab coverage

* test: cover manifest install and runner session contracts

* chore: remove unused provider cleanup code

* test: split android find device lab scenario

* test: track provider lab architecture progress

* test: clarify provider lab roadmap progress

* test: advance provider lab session coverage

* test: move menubar click routing to device lab

* test: move menubar snapshots to device lab

* refactor: centralize screenshot flag plumbing

* refactor: colocate screenshot flag metadata

* test: cover all public commands in device lab

* test: move macos wait success to device lab

* test: drop redundant perf and diff units

* test: move push payload paths to device lab

* test: move network parsing to device lab

* test: move log cleanup to device lab

* test: move log restart and boot to device lab

* test: move ios physical boot to device lab

* test: cover perf startup in device lab

* test: extract android and ios device lab worlds

* test: trim device lab world surface

* test: split snapshot capture unit coverage

* test: deepen device lab coverage and trim handler units

* test: clean up device lab migration scaffolding

* test: report device lab public command coverage

* refactor: make Apple provider seams semantic

* refactor: tighten device inventory and Linux provider seams

* refactor: tighten request provider scoping

* refactor: add semantic macos host provider

* test: broaden device lab find coverage

* test: cover workflow flags in device lab

* refactor: promote linux input provider seam

* test: clarify device lab flag coverage

* test: classify snapshot force-full progress

* test: enforce device lab progress in ci

* test: stabilize device lab ci

* test: move packaged metro smoke to integration

* test: drop stale provider seam coverage

* test: harden provider scope regression coverage

* refactor: remove stale platform barrels

* refactor: keep linux clipboard and screenshots semantic

* refactor: move macos host tools behind provider

* fix: honor remote artifact output paths

* test: deepen runtime coverage for daemon and runner paths

* test: share loopback test helpers

* refactor: make daemon runtime importable

* fix: honor replay target metadata

* chore: tighten final device lab quality gates

* test: share device lab setup helpers

* test: remove generic apple lab fallback

* test: deduplicate device lab helpers

* chore: tighten fallow duplication signal

* refactor: share apple diagnostic helpers

* fix: detect active android ime during fill verification

* test: consolidate provider-backed integration suite

* ci: fix fallow and iOS smoke setup

* chore: consolidate cleanup after ci fixes

* test: split vitest unit and integration projects

* docs: mention MCP discovery metadata

* docs: add agent skills context pointers

* fix: close provider recording coverage gaps

* fix: restore mcp compatibility smoke

* test: cover provider edge regressions

* test: consolidate loopback helpers

* docs: remove stale provider routing reference

* fix: harden final provider review issues

* chore: defer mcp cleanup from provider refactor
2026-05-18 14:50:52 +02:00
Michał Pierzchała dea6c3b1b2 fix: compact unchanged snapshot output (#547) 2026-05-15 19:37:27 +02:00
Michał Pierzchała 068d4c5d0a chore: remove ensure-simulator lifecycle command (#552) 2026-05-15 19:23:45 +02:00
Michał Pierzchała 60f36eff66 feat: add screenshot no-stabilize flag (#553) 2026-05-15 19:21:06 +02:00
Michał Pierzchała 7e14decce3 fix: improve Android text entry stability (#540)
* fix: improve android text entry stability

* fix: stabilize android daemon diagnostics

* chore: refresh fallow baselines

* refactor: tighten android text fallback

* fix: tighten android input ownership diagnostics

* fix: require settled android fill verification

* test: cover android fill prefix verification
2026-05-15 12:16:06 +02:00
Michał Pierzchała 83efe54407 fix: default apps listing to user-installed (#541) 2026-05-15 11:06:27 +02:00
Michał Pierzchała 4666d58f2b refactor: simplify command route catalog (#521) 2026-05-14 14:49:27 +02:00
Michał Pierzchała 24bc75bfd8 refactor: collocate session lifecycle command metadata (#518) 2026-05-14 12:49:41 +02:00
Michał Pierzchała bc7cf47bd6 refactor: add command definition foundation (#513)
* refactor: add command definition foundation

* fix: satisfy fallow for command definitions

* refactor: tighten command definition foundation
2026-05-14 11:03:09 +02:00
Michał Pierzchała fceaab9525 refactor: clarify command architecture (#512) 2026-05-13 19:53:36 +02:00
Anupam Chugh a90642544d feat: support precise location settings (#491)
* feat: support precise location settings

* fix: address location settings review

* chore: refresh fallow baselines for location settings

* fix: clean up location settings dispatch

---------

Co-authored-by: anupamchugh <anupamchugh@gmail.com>
Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
2026-05-12 12:07:59 +02:00
Michał Pierzchała 10fd292569 fix: stabilize remote DevTools and install workflow (#490)
* 0.14.6

* fix: harden remote install workflow

* fix: prevent companion startup state race

* fix: guide remote ios devtools reconnects
2026-05-01 07:27:36 -04:00
Michał Pierzchała 7d47c6796a fix: persist remote react devtools companion (#489) 2026-04-30 16:18:54 -04:00
Michał Pierzchała 7ea8d9eea3 feat: discover cloud config during connect (#488)
* feat: discover cloud config during connect

* test: isolate cloud connect profile coverage

* docs: document cloud connect discovery

* fix: honor no-login after cloud auth reuse

* fix: validate cloud connection profiles

* refactor: require object cloud profiles

* refactor: trim cloud connect compatibility code
2026-04-30 16:16:56 -04:00
Michał Pierzchała dc4a162504 fix: require explicit bridge lease for devtools tunnel (#487) 2026-04-30 14:42:01 -04:00
Michał Pierzchała 6a55d48938 fix: tunnel remote ios react devtools (#486) 2026-04-30 12:36:02 -04:00
Michał Pierzchała 72ba612e83 fix: centralize Android adb execution (#478) 2026-04-29 18:25:21 -04:00
Michał Pierzchała 0c7e48d7d5 feat: add Android frame health perf metrics (#474) 2026-04-29 16:56:37 -04:00
Michał Pierzchała 6a2bf9f626 feat: export batch orchestration helpers (#472) 2026-04-29 10:48:17 -04:00
Michał Pierzchała 40fe5e23cc fix: improve cloud remote auth UX (#452) 2026-04-26 18:42:45 -04:00
Michał Pierzchała f07e82e308 chore: add fallow quality gate (#449)
* chore: add fallow quality gate

* fix: refresh pnpm lockfile
2026-04-26 13:53:35 -04:00
Michał Pierzchała 53750084a7 refactor: finish companion tunnel naming (#446) 2026-04-26 11:42:30 -04:00
Michał Pierzchała 48264caafa refactor: extract companion tunnel core (#442) 2026-04-25 20:31:21 -04:00
Michał Pierzchała f926d2c9e1 feat: add cloud remote auth flow (#443) 2026-04-25 20:25:55 -04:00
Michał Pierzchała 5cea4dd0b1 feat: pass through GitHub Actions artifact install sources (#437) 2026-04-25 19:30:51 -04:00
Michał Pierzchała 4ddd29cb5c feat: add Metro reload command (#440) 2026-04-25 19:30:24 -04:00
Michał Pierzchała 6c7e8323e1 fix: support remote Android React DevTools tunnel (#438)
* 0.13.0

* fix: support remote android react devtools tunnel
2026-04-25 19:30:12 -04:00
Michał Pierzchała b0813cad84 feat: add react devtools passthrough (#435)
* feat: add react devtools passthrough

* docs: clarify react devtools passthrough

* fix: preserve react devtools global flags

* docs: add react devtools validation guidance

* docs: simplify react devtools validation notes
2026-04-24 18:54:14 -04:00
Kacper Mikołajczak 2062bffc64 feat: parametrise .ad replay scripts (#433)
* feat: parametrise .ad replay scripts

Support ${VAR} substitution with env header directives and CLI -e
overrides so flows can be reused across app variants, environments,
and devices without duplicating the script.

Precedence (high->low): CLI -e > AD_* shell env > file-local env >
built-ins (AD_PLATFORM, AD_SESSION, AD_FILENAME, AD_DEVICE,
AD_ARTIFACTS). Supports ${VAR:-default} fallback, \${ escape, and
fails with file:line on unresolved vars.

* refactor: harden .ad replay parametrisation

Tighten the parametrisation surface introduced in the feat commit after
an internal review pass:

- Reserve the AD_* namespace for built-ins. User env (file env, CLI -e,
  shell AD_VAR_*) can no longer define AD_* keys, which closes a built-in
  shadowing vector (e.g. AD_VAR_AD_SESSION).
- Change the shell-env prefix from AD_* to AD_VAR_* so unrelated CI
  secrets that happen to start with AD_ (AD_TOKEN, AD_SECRET_KEY) are
  not auto-imported into replay scripts.
- Extend the replay -u guard to also reject scripts with \${VAR}
  substitutions in any action, not just those with env directives, so
  the writer never silently drops substitutions on heal-rewrite.
- Reword DX-unfriendly regex errors ("must match /^[A-Z_]...$/" ->
  "must be uppercase letters, digits, and underscores, e.g. APP_ID").
- Docs rewrite with precedence table, three recipes, fallback/escape
  examples, and a Notes block covering replay -u limitation, remote
  daemon caveat, no nested fallback, and loud typo behaviour.
- Additional unit tests: namespace reservation on every path, shell
  prefix migration, \${VAR} round-trip preservation through
  writeReplayScript, green-path integration test with a fake invoke.

* fix: collect .ad replay shell env on the CLI, not the daemon

Review feedback (https://github.com/callstackincubator/agent-device/pull/433#discussion_r3130695225):
the daemon was reading AD_VAR_* from its own process.env, which meant
"AD_VAR_K=V agent-device replay" only worked if V was set when the
daemon started, and never worked for remote daemons.

The client now filters process.env for AD_VAR_* at request time and
ships the result as replayShellEnv on the DaemonRequest flags. The
daemon prefers the request value when present and falls back to its
own process.env for direct-daemon callers (internal tests).

Adds two integration tests pinning both paths and updates the docs
Notes block to reflect the new behaviour.

* fix: thread per-attempt artifacts dir into AD_ARTIFACTS under test

Review feedback (https://github.com/callstackincubator/agent-device/pull/433#discussion_r3130695235):
AD_ARTIFACTS is documented as available under "agent-device test", but
buildReplayBuiltinVars was only reading the raw flags.artifactsDir.
Under the default artifacts layout the flag is unset and \${AD_ARTIFACTS}
failed; when set with --artifacts-dir it pointed at the suite root, not
the resolved per-attempt directory the test runner actually writes to.

Plumb the attempt-level artifacts dir from session-test.ts through the
runReplay callback (via runReplayTestAttempt) down into the nested
replay request's flags.artifactsDir. The daemon side is unchanged -
buildReplayBuiltinVars just now sees the right value.

Extracts the nested-request flag merge into a testable helper
(buildNestedReplayFlags) to close the coverage gap between the test
harness and the replay runtime.

* refactor: DRY .ad replay parametrisation internals

- Share VAR_KEY_RE between session-replay-vars and session-replay-script
  instead of re-declaring the same /^[A-Z_][A-Z0-9_]*$/ in each.
- Fold resolveReplayFlags + resolveReplayRuntime into a single generic
  resolveStringProps<T>; the two were near-identical object-walkers.
- Un-export parseReplayEnvLine (was only used inside its own module).
- Table-drive the four "reject AD_* namespace" tests with test.each
  instead of four near-duplicate test blocks.
- Extract runReplayFixture helper for runReplayScriptFile integration
  tests; each test is now ~10 lines instead of ~30.

No behaviour change. 812 tests still green.

* docs: clarify replay built-in variables

* test: cover replay env serialization

---------

Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
2026-04-24 18:54:03 -04:00
Michał Pierzchała bb24567582 fix: improve android snapshot freshness (#430)
* fix: improve android snapshot freshness

* fix: tune android snapshot freshness mitigation

* fix: keep android ref refresh best-effort
2026-04-20 11:03:25 +02:00
Michał Pierzchała 57ba479e51 fix: add screenshot max-size flag (#428) 2026-04-18 19:30:39 +02:00
Michał Pierzchała ee6cc7cc5b fix: use bridge metro runtime descriptors (#425) 2026-04-17 20:01:20 +02:00
Michał Pierzchała 33083b5a86 chore: codebase cleanup pass (dedup, types, dead code, cycles) (#420)
* refactor: remove dead code and unused exports

- Delete interaction-get.ts, interaction-is.ts, interaction-selector.ts (superseded by selector-runtime dispatchers)
- Remove handleWaitCommand and its private helpers from snapshot-wait.ts (replaced by dispatchWaitViaRuntime)
- Remove unused distanceFromSafeViewportBand/isRectWithinSafeViewportBand from rect-visibility
- Trim Linux platform barrel to only the re-export still in use (snapshotLinux)

* refactor: consolidate duplicated helpers

- Move sleep() to utils/timeouts.ts; remove 6 duplicate implementations
- Use existing isApplePlatform() helper for ios||macos checks (5 sites)
- Export trimRuntimeValue from runtime-hints; drop duplicate trimRuntimeString
- Merge normalizeTextSurfaceType/normalizeType into single text-surface helper
- Remove pointless isScrollableContainerType wrapper

* refactor: consolidate accidentally-duplicated type definitions

- SnapshotDiffLine/Summary: single definition in utils/snapshot-diff, re-exported from capture-snapshot
- FindLocator: single definition in utils/finders, re-exported from client-types
- JsonRpc envelope in http-server now uses JsonRpcRequestEnvelope/JsonRpcId from contracts
- Inline 'primary'|'secondary'|'middle' literals replaced with ClickButton (internal sites only)

* refactor: strengthen weak types and fix DEVICE_IN_USE downgrade bug

- Add toAppErrorCode() validator and DEVICE_IN_USE to AppErrorCode union
- Replace 'as any' casts on wire error codes with the validator (daemon-error, daemon-client, request-router, http-server)
- Type Metro worker payload as MetroTunnelResponseMessage
- Type xctestrun plist parsing with explicit partial schema
- Narrow 'details.stderr' via typeof checks on Android error paths
- Type runner-session parseRunnerResponse with RunnerResponsePayload

Bug fix: handler emitted 'DEVICE_IN_USE' but router cast silently downgraded to
'COMMAND_FAILED' because the code was missing from AppErrorCode. Clients can now
react to same-device contention.

* refactor: collapse redundant 'ignore' comments in empty catch blocks

- Replace 16 instances of 3-line catch { // ignore } with 1-line catch {}
- Remove one self-describing 'Re-export public API' comment

Specific 'ignore shutdown races' / 'ignore malformed pid files' style comments
that name concrete failure modes are kept.

* refactor: eliminate circular dependencies by extracting shared types to leaves

Resolves all 44 cycles reported by madge. Pattern throughout: extract shared
type into a leaf module; both producer and consumer import from the leaf;
original module re-exports for API stability.

New leaf type modules:
- src/runtime-contract.ts (AgentDeviceRuntime, CommandContext, ...)
- src/metro-types.ts (MetroRuntimeHints, MetroBridgeResult, ...)
- src/commands/runtime-types.ts (CommandResult, RuntimeCommand, ...)
- src/commands/diagnostics-types.ts
- src/cli/commands/router-types.ts (ClientCommandParams, ...)
- src/core/interactor-types.ts (Interactor, BackMode, ...)
- src/platforms/ios/runner-session-types.ts (RunnerSession)
- src/utils/screenshot-diff-region-types.ts (MutableDiffRegion)
- src/daemon/handlers/record-trace-types.ts

madge --circular now reports 0 cycles (was 44). No runtime behavior changes.

* fix: preserve wire error codes verbatim (addresses codex review)

The initial weak-types pass validated wire error codes against a closed
union, silently downgrading any unknown code to COMMAND_FAILED. This
dropped signals like AMBIGUOUS_MATCH that handlers emit and clients are
documented to handle (skills/agent-device/references/exploration.md).

- Widen AppErrorCode to 'KnownAppErrorCode | (string & {})' so autocomplete
  of known codes is preserved while any wire code flows through
- toAppErrorCode now preserves any non-empty code; fallback only when
  undefined or empty
- Add AMBIGUOUS_MATCH to KnownAppErrorCode (documented public code)
- Add test coverage for preservation and fallback behavior

* refactor: address review follow-ups

- Add DEVICE_IN_USE to the batch error taxonomy in exploration.md (now
  observable by clients after earlier fix, needs agent-facing guidance)
- Delete one-line src/platforms/linux/index.ts barrel; both consumers
  (core/dispatch, daemon/handlers/snapshot-capture) now import from
  platforms/linux/snapshot directly
- Replace inline { tenantId; runId; leaseId } shapes with MetroBridgeScope
  alias at client-types, metro, and cli/commands/connection-runtime
- Consolidate remaining inline setTimeout wrappers onto utils/timeouts.ts#sleep
  (12 files, ~18 sites). Left test files and the runtime-clock aware helper
  in commands/selector-read-utils alone. Also removes the local sleepMs
  helper from daemon-client.ts.

* refactor: address low-priority review follow-ups

- daemon-client RPC error path: stringify any non-null data.code instead
  of only forwarding strings. Preserves numeric codes from hypothetical
  future proxies/servers; for first-party daemon today this is a no-op
  since handlers already emit strings.
- errors.ts: expand AppErrorCode comment to call out the exhaustiveness
  tradeoff of the '(string & {})' widening for SDK consumers.
2026-04-17 13:22:46 +02:00
Michał Pierzchała 63ab9d625c fix: propagate remote config through remote flows (#422)
* fix: propagate remote config through commands

* fix: complete remote React Native flow

* test: cover remote install source lease reuse

* fix: honor remote config session scope

* refactor: drop remote react native shortcut

* docs: simplify remote tenancy skill flow

* docs: use trusted artifact placeholders

* docs: prune remote tenancy prompt note
2026-04-17 12:26:42 +02:00
Michał Pierzchała 1b71dfee4c fix: defer remote connect lease and metro setup (#417) 2026-04-16 17:53:04 +02:00
Michał Pierzchała f0eb8c6d4f feat: add runtime admin, batch, diagnostics, and recording commands (#416)
* feat: add runtime admin and orchestration commands

* feat: add runtime diagnostics commands

* refactor: clean up runtime router surface

* refactor: remove runtime cleanup dead weight

* fix: clean up admin install temp inputs on resolve failure
2026-04-16 17:41:16 +02:00
Michał Pierzchała 8bcefb754a feat: add runtime command boundary (#412)
* feat: add runtime command boundary

* refactor: harden runtime command boundary

* fix: address runtime boundary review

* fix: preserve selector snapshot flags

* fix: preserve selector get and screenshot cleanup

* fix: harden runtime boundary follow-ups

* fix: close runtime parity gaps

* test: harden android replay navigation

* fix: close screenshot surface edge cases

* test: harden packaged runtime API smoke

* fix: close runtime review edge cases

* test: isolate CLI state dir in unit helpers
2026-04-16 13:03:31 +02:00