Commit Graph
19 Commits
Author SHA1 Message Date
pj 8961aadda8 feat(sdk-android): throwaway sample app for SDK validation
Single-activity Android app that calls Uatu.start() in
SampleApplication.onCreate and registers three extractors
(app_state, click_count, uptime_millis). MainActivity has a
button so click_count exercises non-trivial state.
2026-04-17 23:39:05 +07:00
pj 1700160077 feat(sdk-android): Uatu public API over SocketClient + Pauser
Uatu singleton owns an internal UatuRuntime that wires the socket
client, pauser, and extractor registry. start() sends HELLO on
connect, responds to PAUSE by running extractors inside the pause
window and replying with STATE, and releases the gate on RESUME.

LinkedHashMap preserves extractor registration order so trace
output is deterministic. Failed extractors log a warning and
record null rather than aborting the whole snapshot.
2026-04-17 22:57:12 +07:00
pj 8560d32cfe chore(sdk-android): return default values for Android stubs in unit tests 2026-04-17 22:57:08 +07:00
pj 52944b1aa6 feat(sdk-android): Pauser with frame-callback-gated extractors
Worker thread calls pauseAndSnapshot with an extractor closure;
the Pauser posts a frame callback that runs extractors on the
main thread and then blocks that thread on a semaphore until
release() fires. FrameCallbackPoster abstracts Choreographer so
JVM unit tests drive it with a single-thread executor, while the
Android runtime uses ChoreographerPoster.
2026-04-17 22:55:06 +07:00
pj ac49818283 feat(sdk-android): SocketClient with reconnect + LocalSocket transport
SocketClient owns a background reader thread, dispatches incoming
messages to a handler, and auto-reconnects with exponential backoff
when the transport drops. AgentTransport abstracts the socket so
JVM unit tests drive the client through piped streams while the
Android runtime uses LocalSocket over the abstract namespace.

Send is exposed to consumers via a MessageSender passed to
onConnected. Writes are serialized under the output stream lock.
2026-04-17 22:53:13 +07:00
pj b9511c0718 feat(agent): socket server with PAUSE/STATE/RESUME flow
Accept waits for an SDK HELLO then hands back a Conn. Conn.Snapshot
sends a PAUSE, blocks on the matching STATE (id-correlated), and
leaves the SDK paused until Release sends RESUME. Conn.Close sends
GOODBYE best-effort.

v0.1 supports one client at a time; transport is left to the caller
so tests can use TCP loopback while production wires via adb reverse
to localabstract:uatu-agent.
2026-04-17 22:50:54 +07:00
pj 2cc7617590 feat(sdk-android): Kotlin wire protocol matching the Go encoder
Uses org.json (already on Android; org.json:json test dep for JVM
unit tests). Field names and framing mirror internal/agent/protocol.go
so Go-encoded frames decode on the SDK without a shared schema file.
2026-04-17 22:48:10 +07:00
pj ca92bb1492 feat(agent): Go wire protocol with length-prefixed JSON framing
Six message types: HELLO, PAUSE, RESUME, STATE, EXTRACT_RESULT,
GOODBYE. 4-byte big-endian length + JSON payload. 16MB frame cap.
Typed constructors per message; snapshots carry json.RawMessage so
downstream goja evaluation sees exact types.
2026-04-17 22:48:07 +07:00
pj 9cea3b66f0 feat(sdk-android): scaffold Android library module
AGP 8.11.0, Kotlin 2.1.21, minSdk 24, compileSdk 35, JDK 17
bytecode, no Compose dep. Uatu object exposes start/extract as
stubs; real implementation in tasks #6–8.
2026-04-17 22:38:04 +07:00
pj 9a792e20ce feat(sidecar): scaffold Kotlin JVM module with Shadow fat JAR
Kotlin 2.1.21 (deviation from plan's 1.9, forced by Gradle 9
compatibility), JDK 17 toolchain, application plugin with main
entry dev.uatu.sidecar.MainKt. Shadow 9.0.0-rc2 for the fat JAR.
Actual gRPC server wires in with task #10.
2026-04-17 22:38:01 +07:00
pj b594108595 chore(gradle): add root settings for uatu multi-project build
Links :sidecar and :sdk-android under one wrapper. Root build.gradle
provides a clean task that wipes the root build dir.
2026-04-17 22:37:53 +07:00
pj ac80114b2d chore(gradle): add Gradle wrapper 9.4.1
Committed so the repo builds reproducibly without a host gradle.
2026-04-17 22:37:51 +07:00
pj 32cd729f9d chore: add .gitignore for gradle, IDE, and run outputs 2026-04-17 22:37:46 +07:00
pj 1c4b0dd00f feat(cli): scaffold uatu CLI with test and doctor subcommands
Wires the flag surface from plan §3 (--spec, --bundle-id, --platform,
--avd, --duration, --seed, --output). Subcommand bodies are stubs;
actual work lands with runner/doctor tasks.
2026-04-17 22:29:09 +07:00
pj d73192b235 test(proto): cover driver service surface
Asserts the eight v0.1 RPCs are exactly the ones present and
that message fields round-trip through generated getters.
2026-04-17 22:27:32 +07:00
pj 7c988b53dd chore(proto): generate Go stubs for driver service
Brings in google.golang.org/grpc and protobuf dependencies.
2026-04-17 22:27:31 +07:00
pj 9d62ba963d feat(proto): define driver v0.1 service contract
Eight RPCs needed for v0.1 per plan: Launch, Terminate, Tap,
InputText, Screenshot, Hierarchy, WaitForIdle, Health.
Defers Swipe/LongPress/OpenLink/etc until a spec needs them.
2026-04-17 22:27:27 +07:00
pj ee78371566 chore(proto): add buf config for codegen and lint
Relaxes STANDARD lint rules that conflict with the terse service
shape from ARCHITECTURE.md §7.2 (shared Empty, no Service suffix).
2026-04-17 22:26:23 +07:00
pj 8d5b32c10b init project with readme 2026-04-17 22:07:09 +07:00