@revyl/verify 0.1.0 → 0.3.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.
- package/CHANGELOG.md +48 -3
- package/README.md +128 -61
- package/dist/api/client.d.ts +6 -4
- package/dist/api/client.js +64 -14
- package/dist/api/types.d.ts +7 -0
- package/dist/cli/init.js +2 -3
- package/dist/cli/install.d.ts +2 -0
- package/dist/cli/install.js +64 -0
- package/dist/cli/login.d.ts +6 -0
- package/dist/cli/login.js +200 -0
- package/dist/cli/main.js +48 -14
- package/dist/computer-session.d.ts +21 -5
- package/dist/computer-session.js +214 -35
- package/dist/config.d.ts +8 -1
- package/dist/config.js +16 -2
- package/dist/errors.d.ts +6 -1
- package/dist/errors.js +4 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +1 -1
- package/dist/open.d.ts +11 -3
- package/dist/open.js +37 -11
- package/dist/screen-readiness.d.ts +1 -0
- package/dist/screen-readiness.js +27 -0
- package/dist/session.d.ts +30 -2
- package/dist/session.js +165 -12
- package/docs/README.md +2 -2
- package/docs/agents.md +14 -9
- package/docs/api.md +86 -12
- package/docs/ci.md +1 -1
- package/docs/computers.md +28 -17
- package/docs/configuration.md +14 -12
- package/docs/end-to-end.md +105 -0
- package/docs/errors.md +31 -5
- package/docs/getting-started.md +49 -26
- package/docs/llms.txt +6 -6
- package/docs/mobile.md +6 -0
- package/docs/web.md +1 -7
- package/package.json +7 -4
- package/docs/linux-computers-contract.md +0 -107
package/docs/computers.md
CHANGED
|
@@ -1,19 +1,16 @@
|
|
|
1
|
-
# Mac computers (early access)
|
|
1
|
+
# Mac and Linux computers (early access)
|
|
2
2
|
|
|
3
|
-
Verify opens a Revyl cloud macOS computer for commands, files, processes, and screenshots. It does not open an assigned physical
|
|
3
|
+
Verify opens a Revyl cloud macOS or Linux computer for commands, files, processes, and screenshots. It does not open an assigned physical computer. Both operating systems are **early access**. Ask [support@revyl.ai](mailto:support@revyl.ai) about access.
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
export
|
|
7
|
-
export REVYL_APP_URL=https://staging.revyl.ai
|
|
8
|
-
export REVYL_API_KEY=... # staging credentials for your enabled organization
|
|
6
|
+
export REVYL_API_KEY=...
|
|
9
7
|
npx @revyl/verify init --platform mac
|
|
10
|
-
npm install --save-dev @revyl/verify
|
|
11
8
|
node verify/example.ts
|
|
12
9
|
```
|
|
13
10
|
|
|
14
|
-
`init`
|
|
11
|
+
`init` installs the package and checks credentials. Running the script starts a paid computer. No app id, build, device selector, image selector, or local Mac is needed. The generated script checks commands and a file round trip without agent steps.
|
|
15
12
|
|
|
16
|
-
`
|
|
13
|
+
`init` intentionally generates only Mac computer projects. For Linux, install the package and use `open({ platform: 'linux' })` inline, or add `linux: { platform: 'linux' }` to the `targets` in `verify.config.ts`. The methods below are shared by both operating systems; installed tools, paths, resources, and desktop dimensions are not fixed SDK guarantees.
|
|
17
14
|
|
|
18
15
|
## Commands and files
|
|
19
16
|
|
|
@@ -48,26 +45,40 @@ try {
|
|
|
48
45
|
|
|
49
46
|
Paths are relative to the computer's workspace: no leading slash, empty components, `.` or `..`, backslashes, colons, or control characters. A path is at most 1,024 UTF-8 bytes. To make a directory, run a command such as `['mkdir', '-p', 'output']` before writing into it. There is no recursive sync or snapshot API.
|
|
50
47
|
|
|
51
|
-
Operation `timeout` is milliseconds, defaults to 30,000, and must be an integer from 1 to 300,000. It is also bounded by the run's remaining lifetime. A computer
|
|
48
|
+
Operation `timeout` is milliseconds, defaults to 30,000, and must be an integer from 1 to 300,000. It is also bounded by the run's remaining lifetime. A computer has a hard 60-minute lifetime **from create**, not from readiness or last activity; `idleTimeoutSeconds` and the agent `stepTimeout` do not configure computer lifetime or commands. `expiresAt` is a `Date` when the API returns `expires_at`, and otherwise undefined (including on devices and older APIs). Verify refuses new operations after that deadline and bounds operation/screenshot observation by it; expiry does not prevent explicit close or recording retrieval. Revyl allows at most 256 operations per run.
|
|
49
|
+
|
|
50
|
+
## Recording metadata
|
|
51
|
+
|
|
52
|
+
After terminal state **and** confirmed release, `await computer.recording()` returns `{ url, durationSeconds?, startedAt? }` or `null` if the recording is unavailable or still processing. `durationSeconds` is a finite nonnegative number; `startedAt` is a `Date`. Missing or nullable optional fields are omitted. Calling before terminal state and confirmed release throws `SESSION_BUSY`; Verify does not wait for the recording or download it. The method works after `close()` and checks the report before requesting the recording.
|
|
53
|
+
|
|
54
|
+
The HTTPS URL is signed and short-lived. Keep it private, including its query string; do not log or publish it. Call `recording()` again when a fresh URL is needed. The report carries no recording URL; `viewerUrl` remains a Revyl UI link, not a download URL. Web/mobile sessions reject `recording()` locally with `NOT_AVAILABLE_ON_PLATFORM`.
|
|
52
55
|
|
|
53
56
|
## Availability and errors
|
|
54
57
|
|
|
55
|
-
Mac computers are early access
|
|
58
|
+
Mac and Linux computers are early access. A `503 runtime_unavailable` or typed `computer_not_enabled` becomes `NOT_AVAILABLE_ON_PLATFORM` with this availability guidance. A `429 computer_limit` becomes `COMPUTER_LIMIT`: queued work (including iOS) or the concurrency limit can cause it, and the response does not identify which. Verify does not retry the create or send a stop after these definite admission refusals. `operation_limit` remains `SESSION_BUSY`. Availability is determined by the server.
|
|
59
|
+
|
|
60
|
+
The default `startTimeout` remains 600000 ms; override it explicitly if needed. An unclaimed start can transition to `failed` with `failure_reason: 'no_host'` after 120 seconds from create. Verify stops readiness polling and throws `SESSION_START_FAILED` with that context, then attempts bounded cleanup. This is not a 120-second timeout for every start: claimed guests may take longer. `device_limit` also yields `SESSION_START_FAILED`, with queued-work/concurrency context. A start timeout or unconfirmed close does not prove resources were released. Inspect the session and contact support rather than blindly repeating a start or stop.
|
|
56
61
|
|
|
57
|
-
|
|
62
|
+
`instruction()` and `validation()` throw `NOT_AVAILABLE_ON_PLATFORM` on both computer operating systems without sending agent requests. Screenshots are supported, but screenshot readiness is separate from command readiness. Agent control of the screen is not part of this release. On web, iOS, and Android, shell/file/process methods throw `NOT_AVAILABLE_ON_PLATFORM`.
|
|
58
63
|
|
|
59
|
-
`
|
|
64
|
+
For the first 30 seconds after a computer becomes active, `screenshot()` retries exact structured `screen_unavailable` responses (HTTP 409 or 503) and `screen_starting` (HTTP 409). Backoff starts at 500 ms and doubles up to 2 seconds; the fixed window does not restart on each call. Cancellation, close, expiry, and the observation deadline still bound the wait. Exhausting that window yields `SESSION_BUSY` with a desktop-not-ready message, rather than requiring a caller sleep. Authentication failures, unrelated errors, malformed responses, and transport failures are not replayed. Commands and other mutations are never retried by this screenshot behavior.
|
|
60
65
|
|
|
61
|
-
Linux
|
|
66
|
+
Linux named and inline targets use the same computer surface as Mac. `init --platform linux` is intentionally unavailable; use an inline target or write its config entry.
|
|
62
67
|
|
|
63
68
|
Missing files and access denials throw `NOT_FOUND` and `ACCESS_DENIED`. An operation timeout with confirmed termination throws `TIMEOUT`; unconfirmed termination or execution throws `ACTION_UNCERTAIN`. Neither implies rollback. Execution outcome, evidence recording, and physical release are independent: an observed successful command can return its result while logging pending/failed report evidence. Do not repeat a mutation merely because its response was lost. Check the computer in Revyl before deciding what to do next. See [errors.md](errors.md).
|
|
64
69
|
|
|
65
70
|
## Lifecycle and transport
|
|
66
71
|
|
|
67
|
-
|
|
72
|
+
Use `attach(computerId)` to take cleanup ownership of an existing active computer without creating one. `computer.open(target)` starts Web/iOS children on Mac and Android on Linux; Web on Linux depends on runtime availability and currently has a runtime limitation. A child requires an existing app/build pair and inherits the parent's client and expiry. Parent close attempts child cleanup for at most five seconds before requesting computer release; the server also stops remaining children. See [the hosted API](api.md#computeropentarget) for arguments, localhost navigation, and cleanup semantics. These are app sessions, not natural-language control of the computer desktop itself.
|
|
73
|
+
|
|
74
|
+
For a computer owned by another caller, such as a CI runner, use `attach(computerId, { stopOnClose: false })`. It is not registered for automatic cleanup. Explicit close still cancels pending child starts and closes hosted children within the five-second cleanup phase, but never sends a stop for the computer. The computer's owner is responsible for releasing it; a child-cleanup failure does not authorize stopping the parent.
|
|
75
|
+
|
|
76
|
+
Verify mints a session UUID, creates `/api/v1/computer-runs` with `os: 'macos'` for `platform: 'mac'` or `os: 'linux'` for `platform: 'linux'`, then polls `GET /computer-runs/{id}/report` until `state: 'active'`, which means it is ready. `starting` alone is not readiness. The public Mac target spelling is `mac`, not `macos`.
|
|
77
|
+
|
|
78
|
+
Each command is submitted once to `/computer-runs/{id}/operations` with its own UUID `request_id` and `Prefer: respond-async`. The operation id is UUIDv5 with the computer UUID as namespace and the request UUID string as name. A `202` response has JSON `null`; Verify reads the operation by id until it settles instead of submitting it again.
|
|
68
79
|
|
|
69
|
-
|
|
80
|
+
**Breaking wire change:** Verify 0.3.0 requires the encoded-only backend, which is already live on revyl.ai. Computer arguments use `argv_b64`, one padded URL-safe base64 string per UTF-8 argument, and file paths use `path_b64`; the request omits raw `argv` and `path`. Public APIs and decoded input limits are unchanged. Existing `stdin` and file `data` fields remain standard base64, and process commands are unchanged. This encoding is not encryption. Screenshot uses standard base64 PNG.
|
|
70
81
|
|
|
71
|
-
Verify bounds operation observation and explicit stop requests to 310 seconds. This is separate from the command's `timeout`: the backend may hold the async submission for 60 seconds before returning `202`. Automatic process-exit cleanup has a shorter 15-second budget and is best effort; use explicit `await close()` in `finally` to observe confirmed release.
|
|
82
|
+
Verify bounds operation observation to the earlier of 310 seconds or the returned expiry, and explicit stop requests to 310 seconds independently of expiry. This is separate from the command's `timeout`: the backend may hold the async submission for 60 seconds before returning `202`. Automatic process-exit cleanup has a shorter 15-second budget and is best effort; use explicit `await close()` in `finally` to observe confirmed release.
|
|
72
83
|
|
|
73
|
-
`close()` posts `/computer-runs/{id}/stop
|
|
84
|
+
For an owning attachment, `close()` posts `/computer-runs/{id}/stop`, and the same automatic process cleanup as other sessions applies. A non-owning attachment never sends that stop. Always close in `finally` or use `await using` so hosted children are cleaned up. A terminal state alone is not confirmed physical release. Keep computer output and screenshots private: they can contain application data and credentials. Verify does not log file contents, argv, stdin, or command output automatically.
|
package/docs/configuration.md
CHANGED
|
@@ -7,7 +7,7 @@ import { defineConfig } from '@revyl/verify';
|
|
|
7
7
|
|
|
8
8
|
export default defineConfig({
|
|
9
9
|
targets: {
|
|
10
|
-
web: { platform: 'web', app: { appId: '…', url: 'https://
|
|
10
|
+
web: { platform: 'web', app: { appId: '…', url: 'https://example.com' }, viewport: { width: 1280, height: 800 } },
|
|
11
11
|
ios: { platform: 'ios', app: { appId: '…' }, device: { model: 'iPhone 16', osVersion: '18.5' } },
|
|
12
12
|
pixel: { platform: 'android', app: { buildId: '…' }, device: { model: 'Pixel 8' } },
|
|
13
13
|
mac: { platform: 'mac' },
|
|
@@ -20,7 +20,7 @@ Unknown keys are rejected, so a typo fails loudly instead of being ignored.
|
|
|
20
20
|
|
|
21
21
|
## Top-level options
|
|
22
22
|
|
|
23
|
-
Mac
|
|
23
|
+
Mac and Linux targets are early access. Ask support@revyl.ai about access. See [computer availability](computers.md#availability-and-errors).
|
|
24
24
|
|
|
25
25
|
| Option | Default | Meaning |
|
|
26
26
|
| --- | --- | --- |
|
|
@@ -61,8 +61,8 @@ Give exactly one of `appId`, `buildId`, `artifactUrl`, or `bundleId`.
|
|
|
61
61
|
| Option | Meaning |
|
|
62
62
|
| --- | --- |
|
|
63
63
|
| `platform: 'mac'` | A cloud macOS computer, without `app` or `device` configuration |
|
|
64
|
-
| `platform: 'linux'` |
|
|
65
|
-
| `startTimeout` | Milliseconds to wait for
|
|
64
|
+
| `platform: 'linux'` | A cloud Linux computer with the same SDK methods as Mac, without `app` or `device` configuration |
|
|
65
|
+
| `startTimeout` | Milliseconds to wait for the computer to become active; default 600000, range 10000..1800000 |
|
|
66
66
|
|
|
67
67
|
Computers do not accept `idleTimeoutSeconds`, image, provider, cwd, or lifetime selectors. The server bounds a run to one hour; per-operation timeout defaults to 30000 ms and accepts 1..300000 ms. See [computers.md](computers.md).
|
|
68
68
|
|
|
@@ -70,22 +70,24 @@ Computers do not accept `idleTimeoutSeconds`, image, provider, cwd, or lifetime
|
|
|
70
70
|
|
|
71
71
|
| Variable | Meaning |
|
|
72
72
|
| --- | --- |
|
|
73
|
-
| `REVYL_API_KEY` | API key.
|
|
74
|
-
| `REVYL_BACKEND_URL` | Optional API origin override. Defaults to production `https://backend.revyl.ai`. Optional staging access uses `https://backend-staging.revyl.ai` with staging credentials. |
|
|
75
|
-
| `REVYL_APP_URL` | Optional session-link origin override. Defaults to production `https://app.revyl.ai`. Optional staging access uses `https://staging.revyl.ai`. |
|
|
73
|
+
| `REVYL_API_KEY` | API key. Wins over a stored CLI login unless that login is usable and marked `local_auth_override`. Without an environment key, a usable stored login is used; expired access tokens fall back to a stored API key. |
|
|
76
74
|
|
|
77
75
|
## Command line
|
|
78
76
|
|
|
79
|
-
|
|
77
|
+
Hosted children use `computer.open(target)` rather than named config targets. Unlike ordinary mobile targets, they require an existing app/build pair and use the computer's fixed device profile. See [the hosted API](api.md#computeropentarget).
|
|
78
|
+
|
|
79
|
+
Use the explicitly scoped package command below. Installing `@revyl/verify` provides the `verify` and `revyl-verify` bins. The separate `revyl-verify` npm alias also provides `npx revyl-verify` with the same behavior; bare `npx verify` can fetch an unrelated package. Scripts run with `node`, not through the CLI.
|
|
80
80
|
|
|
81
81
|
```text
|
|
82
|
-
verify init [--platform web|ios|android|mac] [--app-id <id>] [--url <https-url>] [--force]
|
|
83
|
-
verify whoami
|
|
84
|
-
verify --help
|
|
82
|
+
npx @revyl/verify init [--platform web|ios|android|mac] [--app-id <id>] [--url <https-url>] [--force] [--yes] [--no-install]
|
|
83
|
+
npx @revyl/verify whoami
|
|
84
|
+
npx @revyl/verify --help
|
|
85
|
+
npx @revyl/verify --version
|
|
85
86
|
```
|
|
86
87
|
|
|
87
88
|
- `init` writes `verify.config.ts` and `verify/example.ts`, and adds `.verify/` to `.gitignore`. Without `--platform` it asks its questions interactively. It never overwrites files unless you pass `--force`.
|
|
88
|
-
- `init --platform mac` needs no app id and generates a command/file script. `--app-id` is rejected for Mac, `--url` applies only to web, and Linux init is unavailable.
|
|
89
|
+
- `npx @revyl/verify init --platform mac` needs no app id and generates a command/file script. `--app-id` is rejected for Mac, `--url` applies only to web, and Linux init is intentionally unavailable. Use `open({ platform: 'linux' })` or a Linux config target instead.
|
|
90
|
+
- `init` installs Verify from the project's lockfile when needed and signs in through the Revyl CLI's browser approval flow when no credentials are available. Use `--yes` or `--no-install` to control installation. Non-interactive runs do not prompt or open a browser and require `REVYL_API_KEY`.
|
|
89
91
|
- `whoami` prints the Revyl account and organization your credentials belong to.
|
|
90
92
|
|
|
91
93
|
Exit codes: `0` success, `1` a Revyl or file error, `2` a usage or authentication problem.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Verify working end to end
|
|
2
|
+
|
|
3
|
+
These live runs were made on **2026-10-27**. The baseline uses source commit [`6029513369f13e73914b550d0cd26ece615b4e13`](https://github.com/RevylAI/verify/tree/6029513369f13e73914b550d0cd26ece615b4e13); the separate published-package check used `@revyl/verify@0.1.0`. The [re-verification below](#re-verification-at-061e5cfa) uses `061e5cfa31c5489aa304c2b640bbaf40e3d88561`, including an unpublished packed 0.2.0 tarball. Neither is a publication announcement.
|
|
4
|
+
|
|
5
|
+
Only reviewed public scripts, sanitized transcripts, result projections, and two reviewed screenshots were used here. No private reports, device identifiers, session links, signed recording URLs, or recordings are published.
|
|
6
|
+
|
|
7
|
+
## Baseline live results
|
|
8
|
+
|
|
9
|
+
Web, iOS, Android, Mac, and Linux ran on Revyl. Computers are early access; ask support@revyl.ai about access. Durations below are observed script wall times, not performance targets.
|
|
10
|
+
|
|
11
|
+
| SDK | Platform and workload | Result | Total time | Cleanup |
|
|
12
|
+
| --- | --- | --- | --- | --- |
|
|
13
|
+
| TypeScript source | Web: add a TodoMVC task, validate it, capture PNG | Passed | 66.6 s | Stop acknowledged |
|
|
14
|
+
| TypeScript source | iOS Settings: General → About, validate OS version, capture PNG | Passed | 66.3 s | Stop acknowledged |
|
|
15
|
+
| TypeScript source | Android Settings: About, validate visible OS version, capture PNG | Passed | 88.2 s | Stop acknowledged |
|
|
16
|
+
| Go source | Web: same TodoMVC task, validation, PNG | Passed | 67.7 s | Stop acknowledged |
|
|
17
|
+
| Go source | iOS Settings: General → About, OS-version validation, PNG | Passed | 75.3 s | Stop acknowledged |
|
|
18
|
+
| TypeScript source | Mac: command, file round-trip, PNG | Passed | 18.3 s | Terminal state and release confirmed |
|
|
19
|
+
| Go source | Mac: command, file round-trip, PNG | Passed | 18.0 s | Terminal state and release confirmed |
|
|
20
|
+
|
|
21
|
+
Every passing web/mobile row includes a passing instruction and validation plus a captured screenshot. Device close acknowledges the stop request; it does not itself prove physical release. The computer reports independently recorded `state: stopped` and `release: confirmed`.
|
|
22
|
+
|
|
23
|
+
### Web proof
|
|
24
|
+
|
|
25
|
+
The instruction was `Add a task named Verify readiness proof to the todo list.` The validation was `The todo list contains an active task named Verify readiness proof.` Both SDKs passed. The TypeScript transcript records:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{"platform":"web","status":"passed","close":"acknowledged","steps":[{"type":"instruction","passed":true,"durationMs":42564},{"type":"validation","passed":true,"durationMs":14669}],"totalDurationMs":66633}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+
### Mobile proof and the Android recipe
|
|
34
|
+
|
|
35
|
+
The iOS scripts launched `com.apple.Preferences`, instructed `Open General, then About.`, then validated `The screen shows the operating system version.` TypeScript and Go both passed.
|
|
36
|
+
|
|
37
|
+
The TypeScript Android run passed the OS-version validation. The baseline Go Android run did **not**: About opened, but the version was offscreen, so `VALIDATION_FAILED` was the correct outcome. The corrected recipe explicitly scrolls or navigates until the version is visible before validating it; its passing re-verification is recorded separately below.
|
|
38
|
+
|
|
39
|
+
For example, the maintained [Settings example](https://github.com/RevylAI/verify/tree/main/examples/mobile-settings) now asks the agent to open About **and scroll or navigate until the operating system version is visible**. Validating a screen immediately after navigation is not a substitute for bringing the specific fact into view.
|
|
40
|
+
|
|
41
|
+
### Mac proof
|
|
42
|
+
|
|
43
|
+
Both SDKs opened a Mac computer, ran `uname -a` with exit code 0, wrote `Verify readiness proof\n` to a workspace-relative file, read back identical bytes, captured a PNG, and closed with confirmed release. They used argv arrays, not an implicit shell. This proves those operations for those runs; it does not establish process-control behavior or future host capacity.
|
|
44
|
+
|
|
45
|
+
## Original failures and limits
|
|
46
|
+
|
|
47
|
+
The release changes three paths. Their earlier results remain failures or caveated observations, not silently promoted to successes:
|
|
48
|
+
|
|
49
|
+
- **Generated iOS example:** published 0.1.0 failed twice with `VALIDATION_FAILED` on a blank white screen. Its screenshot came from the failed validation report because the script's later screenshot line was never reached. The new initializer first instructs the agent to wait for the app's first screen; the changed stranger path passed in the separate re-verification below.
|
|
50
|
+
- **Go Android recipe:** the OS-version validation failed while its target was offscreen. The corrected instruction's explicit scrolling/navigation passed in the separate re-verification below.
|
|
51
|
+
- **Linux screenshot:** TypeScript commands and file round-trip passed, but immediate capture returned `SESSION_BUSY` with `screen_unavailable`; release was confirmed. Go captured successfully only after a manually prescribed 15-second wait. Neither result proves the new SDK-managed retry path. Linux remains early access, and screenshot readiness is separate from command readiness.
|
|
52
|
+
|
|
53
|
+

|
|
54
|
+
|
|
55
|
+
Both SDKs now make a bounded, best-effort mobile blank-frame observation after connection/launch. It can time out or skip unavailable images without failing open; **the runtime has no rendered-readiness signal**, and non-blank pixels do not prove the app is foreground or loaded. The generated example's first instruction remains necessary. See [mobile readiness](mobile.md#steps).
|
|
56
|
+
|
|
57
|
+
Computer capture retries only structured startup screen-not-ready responses during a fixed 30-second window after active readiness, bounded by cancellation and expiry. Callers do not need a sleep. That behavior has fake-server coverage; **Linux screenshot retry has not been proven live**. See [computers](computers.md).
|
|
58
|
+
|
|
59
|
+
## Re-verification at 061e5cfa
|
|
60
|
+
|
|
61
|
+
The following checks ran on **2026-10-27** against [`061e5cfa31c5489aa304c2b640bbaf40e3d88561`](https://github.com/RevylAI/verify/tree/061e5cfa31c5489aa304c2b640bbaf40e3d88561). TypeScript used a packed 0.2.0 tarball installed into fresh projects, not workspace links or a published npm 0.2.0. Its SHA-256 was `c2791c850f80b0a9c0b16be93aea324be8e9ae5967e22d0caaed5823d79e0d33`. Go resolved the exact commit through `go get`. The rows come from reviewed public scripts, setup/terminal transcripts, and result projections.
|
|
62
|
+
|
|
63
|
+
| SDK and case | Result | Script wall time | Cleanup and report |
|
|
64
|
+
| --- | --- | --- | --- |
|
|
65
|
+
| Packed TypeScript init, iOS Settings | Passed the generated first-screen instruction and validation, then captured PNG | 44.1 s | Stop acknowledged; terminal report completed, 1/1 validations passed |
|
|
66
|
+
| Go Android, corrected visible-version recipe | Passed instruction and OS-version validation, then captured PNG | 104.4 s | Stop acknowledged; terminal report completed, 1/1 validations passed |
|
|
67
|
+
| Packed TypeScript Linux, immediate screenshot | Blocked before session creation: `COMPUTER_LIMIT` | 0.8 s; one retry 0.6 s | No session created; no screenshot requests or release required |
|
|
68
|
+
|
|
69
|
+
The iOS check ran `init --platform ios` in a fresh tarball-install project and changed only the generated app selection to `bundleId: 'com.apple.Preferences'`. It kept the generated instruction, validation, screenshot, and close sequence. This proves that sequence for that run, not that blank-frame observation guarantees readiness or caused the pass.
|
|
70
|
+
|
|
71
|
+
The Go Android instruction was `Open About phone or About device, then scroll as needed and open Android version so the operating system version number is visible on screen.` The validation was `The screen shows the operating system version.` Both returned `passed: true`; the report independently recorded zero effective failed steps and one passing validation.
|
|
72
|
+
|
|
73
|
+
Both Linux attempts were admission refusals, **not an SDK screenshot failure or a successful retry proof**. The script had no manual sleep/retry, but never reached its screenshot call. The new retry behavior remains tests-only, and Linux remains early access. No further live attempt was authorized. The original 0.1.0 iOS failures, offscreen Android failure, and immediate Linux screenshot failure above remain part of the evidence.
|
|
74
|
+
|
|
75
|
+
## Reading the verdict
|
|
76
|
+
|
|
77
|
+
Fetch a web/mobile report with:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
revyl device report --session-id <session-id> --json
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Do not infer a passing validation from `status: success`, `passed_steps`, or `failed_steps`. These can reflect successful execution of a validation whose semantic verdict is false. Read each step's **`effective_status` and `validation_result`**, and compare **`validations_passed` with `total_validations`**. Effective passed/failed step counts summarize semantic outcomes where provided. The SDK maps the actual validation verdict to `StepResult.passed` and throws `VALIDATION_FAILED` by default.
|
|
84
|
+
|
|
85
|
+
For the failed Go Android baseline, the public projection records transport counts `passed_steps: 3`, `failed_steps: 0`, but `effective_failed_steps: 1`, `total_validations: 1`, and `validations_passed: 0`; the validation step has `effective_status: failed` and projected `validationPassed: false`. The transport counts do not override that failure.
|
|
86
|
+
|
|
87
|
+
## Reproducing the workflow
|
|
88
|
+
|
|
89
|
+
Use an authorized account and the exact source revision when comparing to the baseline. These commands prepare the TypeScript source; they do not publish it:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
git clone https://github.com/RevylAI/verify.git
|
|
93
|
+
cd verify
|
|
94
|
+
git checkout 6029513369f13e73914b550d0cd26ece615b4e13
|
|
95
|
+
npm ci
|
|
96
|
+
npm run build
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
For Go, pin the same baseline with `go get github.com/RevylAI/verify/go@6029513369f13e73914b550d0cd26ece615b4e13` in your own module. Use the [TypeScript API](getting-started.md) or [Go API](https://github.com/RevylAI/verify/tree/main/go) to open the target, run an instruction, validate the visible outcome, capture a screenshot, and close in `finally` or a bounded deferred cleanup context. The web workload uses `https://demo.playwright.dev/todomvc` and a Revyl web app ID supplied privately through `REVYL_WEB_APP_ID`.
|
|
100
|
+
|
|
101
|
+
Do not use the baseline's blank-screen initializer or offscreen Android assertion as a recommended recipe. To test the fixes, use the reviewed new source revision rather than the baseline commit or the older npm package. Ask support@revyl.ai about computer access; never place credentials in argv or publish signed recording URLs.
|
|
102
|
+
|
|
103
|
+
## Limits
|
|
104
|
+
|
|
105
|
+
Fake-server tests cover contracts, observation bounds, errors, expiry, and cleanup. They do not prove live availability, app rendering, installed software, recording generation, or successful physical release. Downloaded recordings existed for the baseline runs but remain private and are not evidence published here. No claim is made about successful live Linux screenshot retries; that path could not be reached during re-verification.
|
package/docs/errors.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Errors
|
|
2
2
|
|
|
3
|
+
## Structured refusal reasons
|
|
4
|
+
|
|
5
|
+
`VerifyError.reason` is an optional typed `RefusalReason` and `httpStatus` is the HTTP status when available. They supplement, rather than replace, the existing `code`. Only recognized server codes are retained; raw error messages and unknown payloads are not exposed as reasons. Starts and navigation are never replayed automatically.
|
|
6
|
+
|
|
7
|
+
| Start refusal | Existing `code` | `reason` |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| Web HTTP 409 capacity/availability | `API_ERROR` | `web_runtime_unavailable` |
|
|
10
|
+
| Computer HTTP 429 admission | `COMPUTER_LIMIT` | `computer_limit` |
|
|
11
|
+
| Computer HTTP 503 runtime availability | `NOT_AVAILABLE_ON_PLATFORM` | `runtime_unavailable` |
|
|
12
|
+
| Hosted child capacity | `COMPUTER_LIMIT` | `computer_at_capacity` |
|
|
13
|
+
| Hosted runtime/capability | `NOT_AVAILABLE_ON_PLATFORM` | `computer_runtime_unavailable` / `computer_cannot_host_platform` / `web_runtime_not_configured` |
|
|
14
|
+
| Hosted parent no longer running | `SESSION_ENDED` | `computer_not_running` |
|
|
15
|
+
| Hosted parent inaccessible | `NOT_FOUND` | `computer_not_found` |
|
|
16
|
+
| Hosted build input | `INVALID_ARGUMENT` | `web_build_required`, `web_build_not_supported`, or corresponding `ios_` / `android_` codes |
|
|
17
|
+
| Hosted identity conflict | `SESSION_BUSY` | `web_session_conflict`, `ios_session_conflict`, `android_session_conflict` |
|
|
18
|
+
|
|
19
|
+
`web_runtime_unavailable` does not distinguish full capacity from an unavailable runtime. `computer_limit` does not distinguish queued work from concurrency exhaustion. Inspect these fields to classify refusal without parsing prose; do not infer a specific cause or automatically start a replacement session.
|
|
20
|
+
|
|
21
|
+
Ordinary start errors retain recognized safe server diagnostic codes such as `web_app_required` in the message even when they are not typed refusal reasons. Arbitrary server messages and payloads are not copied into startup diagnostics.
|
|
22
|
+
|
|
23
|
+
Web navigation timeouts expose `reason: 'request_timeout'` with HTTP 504 and `code: 'ACTION_UNCERTAIN'`: the action budget expired before navigation was confirmed, but the request may still commit and the session remains open. A normalized `protocol_error` also preserves uncertainty and its HTTP status. Neither error causes Verify to replay navigation or close the session. Inspect the live page before deciding whether to navigate again.
|
|
24
|
+
|
|
3
25
|
Everything Verify throws on purpose is a `VerifyError` with a stable `code`. Messages name the problem and, for step failures, end with the session link.
|
|
4
26
|
|
|
5
27
|
```ts
|
|
@@ -20,11 +42,13 @@ try {
|
|
|
20
42
|
| `CONFIG_INVALID` | The config failed validation or did not load | The message names the exact option and the rule |
|
|
21
43
|
| `AUTH_MISSING` | No `REVYL_API_KEY` and no Revyl CLI login | Set `REVYL_API_KEY` or run `revyl auth login` |
|
|
22
44
|
| `AUTH_REJECTED` | Revyl rejected the credentials | Create a new API key, or log in again |
|
|
45
|
+
| `EDGE_BLOCKED` | An HTTP 403 has a `text/html` content type and nonempty `cf-ray`, without a valid JSON body | Check network access or contact support; Verify does not retry the request |
|
|
23
46
|
| `API_ERROR` | Revyl returned an unexpected response | Try again; if it persists, report it with the session link |
|
|
24
|
-
| `SESSION_START_FAILED` | The browser or
|
|
25
|
-
| `SESSION_ENDED` | The session was closed,
|
|
26
|
-
| `SESSION_BUSY` |
|
|
27
|
-
| `
|
|
47
|
+
| `SESSION_START_FAILED` | The browser, device, or computer did not start | Computer `no_host` reports the 120-second unclaimed-start context; `device_limit` reports queued-work/concurrency context. Inspect the session and cleanup before starting again. |
|
|
48
|
+
| `SESSION_ENDED` | The session was closed, stopped, or expired | Close explicitly; computer expiry does not prove release |
|
|
49
|
+
| `SESSION_BUSY` | A step conflict, computer operation limit, or recording requested before terminal state and confirmed release | Inspect the state before another call; a terminal computer alone does not prove release |
|
|
50
|
+
| `COMPUTER_LIMIT` | Computer admission was refused due to queued work (including iOS) or the concurrency limit | Wait for capacity; Verify does not retry or stop a definitely refused start |
|
|
51
|
+
| `NOT_AVAILABLE_ON_PLATFORM` | The call is unavailable: computer agent steps, device shell/file/recording methods, computer access or runtime unavailable, or a backend without web steps | See [web.md](web.md) and [computers.md](computers.md#availability-and-errors) |
|
|
28
52
|
| `COMMAND_FAILED` | A computer command exited nonzero | Read its reason; use `exec(argv, { check: false })` to inspect the exit code and output instead |
|
|
29
53
|
| `NOT_FOUND` | A computer file or resource was not found | Check the workspace-relative path |
|
|
30
54
|
| `ACCESS_DENIED` | The computer refused access | Check permissions; do not assume host/root access |
|
|
@@ -33,6 +57,8 @@ try {
|
|
|
33
57
|
| `INSTRUCTION_FAILED` | Revyl's agent could not do what the instruction asked | Make the instruction more specific, or split it into smaller steps |
|
|
34
58
|
| `VALIDATION_FAILED` | The validation did not hold | The message has Revyl's reason; watch the recording at the session link |
|
|
35
59
|
| `STEP_FAILED` | Revyl could not run the step to an outcome: it errored, it was cancelled on Revyl, or a validation came back without a verdict. This says nothing about your app, and `soft` does not cover it. | Watch the session at the link, then run the step again |
|
|
36
|
-
| `TIMEOUT` | A step, a session start, or a request ran out of time |
|
|
60
|
+
| `TIMEOUT` | A step, a session start, or a request ran out of time | Inspect the session before retrying. The default 10-minute start timeout is separate from the 120-second unclaimed-start failure. See [computer availability](computers.md#availability-and-errors). |
|
|
61
|
+
|
|
62
|
+
`EDGE_BLOCKED` does not require Cloudflare branding in the HTML body. A `cf-ray` header alone is not proof of a block: any syntactically valid JSON body retains its existing error mapping, even if the content type is incorrectly `text/html`. HTTP 401 is unchanged. Edge-block errors include `httpStatus` but never copy the response body or ray ID into the error.
|
|
37
63
|
|
|
38
64
|
Computer operations use `TIMEOUT` for bounded runtime with confirmed termination, and `ACTION_UNCERTAIN` when termination, execution, or cleanup is unconfirmed. An observed successful operation can return its result while logging pending/failed evidence. Timeout never proves rollback, and failed evidence does not prove the command never ran. Never automatically retry a mutation with a fresh request id; inspect the computer first. See [computers.md](computers.md).
|
package/docs/getting-started.md
CHANGED
|
@@ -2,52 +2,67 @@
|
|
|
2
2
|
|
|
3
3
|
Verify needs Node.js 22.18 or later, which runs TypeScript files directly, and a Revyl account.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install and run
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
|
|
8
|
+
npm install @revyl/verify
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Use an inline target when you do not need a named config:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { open } from '@revyl/verify';
|
|
15
|
+
|
|
16
|
+
const session = await open({ platform: 'ios', app: { appId: 'YOUR_REVYL_APP_ID' } });
|
|
17
|
+
try {
|
|
18
|
+
await session.instruction('Open the main navigation');
|
|
19
|
+
await session.validation('The main navigation is visible');
|
|
20
|
+
} finally {
|
|
21
|
+
await session.close();
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
On the first interactive run, Verify opens the Revyl browser approval flow once and saves the shared CLI login. It prints a live session link, then ordered step results. In CI, it never prompts or opens a browser; set `REVYL_API_KEY` as a secret. Python and Go use an existing CLI login or API key; their SDKs do not open the browser themselves.
|
|
26
|
+
|
|
27
|
+
## Scaffold a config (optional)
|
|
28
|
+
|
|
29
|
+
Use `init` when you want named targets in `verify.config.ts` and a generated example script. It adds Verify with the package manager selected by its lockfile, asks what you want to open, and adds `.verify/` to `.gitignore`:
|
|
12
30
|
|
|
13
31
|
- `verify.config.ts`: the targets `open()` can start, by name
|
|
14
32
|
- `verify/example.ts`: a script that opens the target, runs steps and takes a screenshot (web/mobile) or checks commands and files (Mac), and closes
|
|
15
33
|
|
|
16
|
-
In scripts and CI, pass the answers as flags:
|
|
34
|
+
In scripts and CI, pass the answers as flags. Non-interactive runs never prompt or open a browser; provide `REVYL_API_KEY` as a secret:
|
|
17
35
|
|
|
18
36
|
```bash
|
|
19
|
-
npx @revyl/verify init --platform web --app-id <revyl-app-id> --url https://
|
|
37
|
+
npx @revyl/verify init --platform web --app-id <revyl-app-id> --url https://example.com
|
|
20
38
|
npx @revyl/verify init --platform ios --app-id <revyl-app-id>
|
|
21
39
|
npx @revyl/verify init --platform mac
|
|
22
40
|
```
|
|
23
41
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
npm install --save-dev @revyl/verify
|
|
28
|
-
```
|
|
42
|
+
Use `--yes` to accept installation without a prompt, or `--no-install` when Verify is already installed.
|
|
29
43
|
|
|
30
|
-
##
|
|
44
|
+
## Manual setup
|
|
31
45
|
|
|
32
|
-
Verify uses the same
|
|
46
|
+
Verify uses the same credential precedence as the Revyl CLI:
|
|
33
47
|
|
|
34
|
-
1. `
|
|
35
|
-
2.
|
|
48
|
+
1. A usable login in `~/.revyl/credentials.json` marked `local_auth_override` takes precedence, even when `REVYL_API_KEY` is set.
|
|
49
|
+
2. Otherwise, `REVYL_API_KEY`, an API key you create in Revyl's settings.
|
|
50
|
+
3. Otherwise, a usable login stored by the Revyl CLI (`revyl auth login`). Expired access tokens fall back to a stored API key when present.
|
|
36
51
|
|
|
37
52
|
```bash
|
|
38
53
|
export REVYL_API_KEY=... # or: revyl auth login
|
|
39
|
-
npx verify whoami
|
|
54
|
+
npx @revyl/verify whoami # checks the credentials without starting a session
|
|
40
55
|
```
|
|
41
56
|
|
|
42
|
-
##
|
|
57
|
+
## Point the config at your app
|
|
43
58
|
|
|
44
|
-
Web and mobile targets need an app. Open the app in Revyl and copy its id into `app.appId`, or set `REVYL_APP_ID`, which the generated config reads. Mac targets need no app id.
|
|
59
|
+
Web and mobile targets need an app. Open the app in Revyl and copy its id into `app.appId`, or set `REVYL_APP_ID`, which the generated config reads. Mac and Linux targets need no app id. Linux init is intentionally unavailable; use `open({ platform: 'linux' })` or add a Linux config target.
|
|
45
60
|
|
|
46
|
-
- **Web:** set `app.url` to a public HTTPS URL
|
|
61
|
+
- **Web:** set `app.url` to a public HTTPS URL. Revyl's cloud browser cannot reach `localhost`. See [web.md](web.md).
|
|
47
62
|
- **iOS and Android:** upload a build to the app in Revyl, for example with `revyl build upload`; each session installs the newest one. See [mobile.md](mobile.md).
|
|
48
|
-
- **Mac
|
|
63
|
+
- **Mac and Linux:** computers are early access; ask support@revyl.ai about access. Agent instruction/validation are unavailable. See [computers.md](computers.md#availability-and-errors).
|
|
49
64
|
|
|
50
|
-
##
|
|
65
|
+
## Run the script
|
|
51
66
|
|
|
52
67
|
```bash
|
|
53
68
|
node verify/example.ts
|
|
@@ -55,14 +70,19 @@ node verify/example.ts
|
|
|
55
70
|
|
|
56
71
|
If Node warns that the module type is not specified, add `"type": "module"` to your `package.json` or rename the script to `example.mts`.
|
|
57
72
|
|
|
73
|
+
Illustrative output (durations vary):
|
|
74
|
+
|
|
58
75
|
```text
|
|
59
76
|
[verify] ios: starting ios session https://app.revyl.ai/sessions/…
|
|
60
77
|
[verify] ios: ready
|
|
78
|
+
[verify] ios: ✓ instruction "Wait for the app to finish opening and show its first screen" (12.0s)
|
|
61
79
|
[verify] ios: ✓ validation "The app has opened and shows its first screen without an error" (9.8s)
|
|
62
80
|
[verify] ios: closed
|
|
63
81
|
```
|
|
64
82
|
|
|
65
|
-
Open the link to watch the session live. After the session ends, the link keeps its recording
|
|
83
|
+
Open the link to watch the session live. After the session ends, the link keeps its report and any available recording. The Revyl CLI prints the stored report with `revyl device report --session-id <id>` for web/mobile, or `revyl computer report <id>` for computers. Computer recordings can be absent or still processing after release; `recording()` retrieves optional private metadata without waiting or downloading.
|
|
84
|
+
|
|
85
|
+
For validation verdicts in device reports, inspect each step's `effective_status` and `validation_result`, and compare `validations_passed` with `total_validations`. `passed_steps`, `failed_steps`, and transport `status: success` can describe successful execution of a validation whose verdict is false. See the [live example](end-to-end.md#reading-the-verdict).
|
|
66
86
|
|
|
67
87
|
## The whole API
|
|
68
88
|
|
|
@@ -70,10 +90,13 @@ Open the link to watch the session live. After the session ends, the link keeps
|
|
|
70
90
|
import { open } from '@revyl/verify';
|
|
71
91
|
|
|
72
92
|
const session = await open('ios'); // a target from verify.config.ts
|
|
73
|
-
|
|
74
|
-
await session.
|
|
75
|
-
await session.
|
|
76
|
-
await session.
|
|
93
|
+
try {
|
|
94
|
+
await session.instruction('Add the first product to the cart'); // Revyl's agent does it
|
|
95
|
+
await session.validation('The cart badge shows 1'); // throws if it does not hold
|
|
96
|
+
await session.screenshot({ path: '.verify/cart.png' });
|
|
97
|
+
} finally {
|
|
98
|
+
await session.close();
|
|
99
|
+
}
|
|
77
100
|
```
|
|
78
101
|
|
|
79
|
-
A failed instruction or validation throws a `VerifyError`.
|
|
102
|
+
A failed instruction or validation throws a `VerifyError`. An uncaught error in a plain script exits non-zero. Automatic cleanup is best effort, bounded to 15 seconds, and skips signal/error handlers that already have listeners. Always close in `try/finally`; a successful web/mobile close acknowledges the stop request, not confirmed physical release. Computer close requires confirmed terminal release. See [api.md](api.md) for cleanup details and every option, and [ci.md](ci.md) for calling Verify from a test runner.
|
package/docs/llms.txt
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# Verify
|
|
2
2
|
|
|
3
|
-
> Verify (@revyl/verify) is an open-source TypeScript library for Revyl. It opens cloud browsers and iOS/Android devices for agent instruction/validation steps, or Mac computers for commands, files, processes,
|
|
3
|
+
> Verify (@revyl/verify) is an open-source TypeScript library for Revyl. It opens cloud browsers and iOS/Android devices for agent instruction/validation steps, or Mac and Linux computers for commands, files, processes, screenshots, and optional private recording metadata after release. Call it from a plain script, coding agent, CI, or any test runner. It has no test runner of its own.
|
|
4
4
|
|
|
5
5
|
## Docs
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Both computer operating systems are early access; ask support@revyl.ai about access. Linux init remains intentionally unavailable; use an inline target or config entry. See computers.md#availability-and-errors.
|
|
8
8
|
|
|
9
9
|
- [Getting started](getting-started.md): install, authenticate, init, run a script
|
|
10
|
-
- [API](api.md): open(), agent steps, screenshot(), exec(), file/process methods, close()
|
|
10
|
+
- [API](api.md): open(), attach(), hosted children, navigate(), report(), agent steps, screenshot(), exec(), file/process methods, close()
|
|
11
11
|
- [Configuration](configuration.md): verify.config.ts targets, environment variables, the init and whoami commands
|
|
12
|
-
- [Web](web.md): Revyl web sessions, URLs and builds, sign-in,
|
|
12
|
+
- [Web](web.md): Revyl web sessions, URLs and builds, sign-in, and steps
|
|
13
13
|
- [Mobile](mobile.md): iOS and Android devices and installing apps
|
|
14
|
-
- [Computers](computers.md#availability-and-errors):
|
|
15
|
-
- [
|
|
14
|
+
- [Computers](computers.md#availability-and-errors): Mac/Linux early access, expiry, capacity errors, recording metadata, and confirmed release
|
|
15
|
+
- [Verify working end to end](end-to-end.md): live verification scope, observed outcomes, and limits of the evidence
|
|
16
16
|
- [CI and test runners](ci.md): GitHub Actions, node:test, Vitest, Jest, Playwright Test
|
|
17
17
|
- [Errors](errors.md): every error code and what to do about it
|
|
18
18
|
- [For coding agents](agents.md): the workflow and rules for agents using Verify
|
package/docs/mobile.md
CHANGED
|
@@ -41,3 +41,9 @@ for (const name of ['iphone-se', 'iphone-16']) {
|
|
|
41
41
|
## Steps
|
|
42
42
|
|
|
43
43
|
`instruction` and `validation` run as live steps on the device. Verify polls each step until Revyl reports it done, and cancels it on Revyl if it runs past its timeout.
|
|
44
|
+
|
|
45
|
+
After connection and any explicit bundle launch, `open()` makes a best-effort first-screen observation for up to 10 seconds, bounded by `startTimeout`. It looks for different RGB pixels in the central 80% of a PNG, excluding status and navigation bars. This is a blank-frame heuristic, not proof that the requested app is foreground or finished rendering: the runtime exposes no rendered-readiness signal. A timeout, unavailable screenshot, or undecodable image does not fail `open()`; it emits a `debug:` progress note through the configured logger and continues. `log: false` suppresses that note.
|
|
46
|
+
|
|
47
|
+
The generated mobile example starts with an instruction to wait for the first screen before validating it. For your own scripts, make the first instruction describe the screen or action you actually need; a screenshot with content can still show a loading screen or another app.
|
|
48
|
+
|
|
49
|
+
For Android Settings, instruct the agent to scroll or navigate until the OS version is visible before validating it. Opening About alone can leave the version offscreen.
|
package/docs/web.md
CHANGED
|
@@ -30,13 +30,7 @@ signIn: { path: '/__test/sign-in', secret: 'E2E_SIGN_IN_TOKEN', persona: 'admin'
|
|
|
30
30
|
|
|
31
31
|
`instruction` and `validation` use the same Revyl endpoints on web as on iOS and Android, and each step shows up in the session's report.
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
export REVYL_BACKEND_URL=https://backend-staging.revyl.ai
|
|
37
|
-
export REVYL_APP_URL=https://staging.revyl.ai
|
|
38
|
-
export REVYL_API_KEY=... # a key from your Revyl staging organization
|
|
39
|
-
```
|
|
33
|
+
The default Revyl service is used for normal setup. Authenticate with a matching API key or CLI login.
|
|
40
34
|
|
|
41
35
|
A Revyl backend that does not run steps on web yet answers with `step_output_not_available`, which Verify reports as `NOT_AVAILABLE_ON_PLATFORM`. The same script works there with no change once it does. `open`, `screenshot`, `viewerUrl`, and `close` work on web everywhere.
|
|
42
36
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revyl/verify",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Open Revyl cloud browsers and mobile devices for agent steps, or Mac computers for commands and files, from TypeScript.",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Open Revyl cloud browsers and mobile devices for agent steps, or Mac and Linux computers for commands and files, from TypeScript.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"e2e",
|
|
7
7
|
"end-to-end",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"android",
|
|
11
11
|
"web",
|
|
12
12
|
"macos",
|
|
13
|
+
"linux",
|
|
13
14
|
"ai",
|
|
14
15
|
"agent",
|
|
15
16
|
"revyl"
|
|
@@ -54,13 +55,15 @@
|
|
|
54
55
|
"build": "rm -rf dist && tsc -p tsconfig.build.json && chmod +x dist/cli/main.js",
|
|
55
56
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
56
57
|
"test": "vitest run",
|
|
57
|
-
"prepack": "npm run build &&
|
|
58
|
+
"prepack": "npm run build && node ../../scripts/prepare-package.mjs"
|
|
58
59
|
},
|
|
59
60
|
"dependencies": {
|
|
60
|
-
"jiti": "^2.6.0"
|
|
61
|
+
"jiti": "^2.6.0",
|
|
62
|
+
"pngjs": "^7.0.0"
|
|
61
63
|
},
|
|
62
64
|
"devDependencies": {
|
|
63
65
|
"@types/node": "^22.10.0",
|
|
66
|
+
"@types/pngjs": "^6.0.5",
|
|
64
67
|
"typescript": "^5.9.0",
|
|
65
68
|
"vitest": "^5.0.5"
|
|
66
69
|
},
|