Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,23 +37,19 @@ state, the run stops for review.
## Try it locally

OpenAdapt requires Python 3.10–3.12. Easiest install (creates its own
environment and includes the browser capability for the bundled tutorial):
environment):

```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
curl -fsSL https://raw.githubusercontent.com/OpenAdaptAI/openadapt-flow/main/scripts/install.sh | sh
```

Manual path with pip — install the browser capability for the bundled
tutorial:
Manual path with pip:

```bash
python -m pip install --upgrade 'openadapt[browser]'
python -m pip install --upgrade openadapt
```

On Windows `cmd.exe`, use double quotes:
`python -m pip install --upgrade "openadapt[browser]"`.

Run the complete bundled tutorial with one command. It needs no account,
target application, API key, or operating-system automation permissions:

Expand Down Expand Up @@ -89,8 +85,9 @@ effect verifiers, fault cases, and deployment policy. Continue with the

## Record your workflow

The browser path is an explicit capability, so native and remote-only installs
do not carry the Playwright driver:
The base package includes the Playwright driver for the bundled tutorial.
Chromium downloads only when the first browser action starts. Native and
remote workflows do not start or download Chromium:

```bash
openadapt flow record --backend web --url https://your-app.example --out rec
Expand Down
18 changes: 6 additions & 12 deletions docs/getting-started/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,12 @@
OpenAdapt supports Python 3.10, 3.11, and 3.12. Use a virtual environment for
an isolated install.

## Browser tutorial
## Install and run the browser tutorial

Install the launcher with the browser capability:
Install the launcher:

```bash
python -m pip install --upgrade 'openadapt[browser]'
openadapt quickstart
```

On Windows `cmd.exe`, use double quotes:

```bat
python -m pip install --upgrade "openadapt[browser]"
python -m pip install --upgrade openadapt
openadapt quickstart
```

Expand All @@ -34,8 +27,9 @@ profile with no model or Cloud call.

## Capability-specific installs

The base install includes the launcher and the Flow engine. Add only the
capabilities that the target workflow needs:
The base install includes the launcher, the Flow engine, and the Playwright
driver for the browser tutorial. Chromium downloads only on the first browser
action. Add the applicable capability for a native or remote workflow:

```bash
python -m pip install 'openadapt[capture]' # local human demonstration
Expand Down
4 changes: 1 addition & 3 deletions docs/getting-started/quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@
Use Python 3.10, 3.11, or 3.12:

```bash
python -m pip install --upgrade 'openadapt[browser]'
python -m pip install --upgrade openadapt
openadapt quickstart
```

On Windows `cmd.exe`, use double quotes around the install target.

The command runs one complete local lifecycle against synthetic MockMed data:

1. It records a demonstrated browser workflow.
Expand Down
4 changes: 2 additions & 2 deletions docs/packages/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ cockpit, privacy tools, and optional managed control plane.
| `openadapt-privacy` | Local privacy and sanitization support | `pip install 'openadapt[privacy]'` |
| `openadapt-desktop` | Beta visual authoring and operator application | [Download an installer](https://openadapt.ai/download) |

Install the browser tutorial path:
Install the launcher and run the browser tutorial:

```bash
python -m pip install --upgrade 'openadapt[browser]'
python -m pip install --upgrade openadapt
openadapt quickstart
```

Expand Down
32 changes: 16 additions & 16 deletions docs/platform-compatibility-report.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<!-- Generated by scripts/render_platform_versions.py. Do not edit. -->

- Generated: `2026-08-22T22:03:24+00:00`
- Generated: `2026-08-26T14:19:29+00:00`
- Release channel: **beta**
- Selection: `latest-published`
- Compatibility: **dependency-compatible**
Expand All @@ -13,7 +13,7 @@
| Role | Package | Version | Release source reference | Published artifacts |
|---|---|---:|---|---|
| launcher | `openadapt` | `1.14.0` | [`v1.14.0`](https://github.com/OpenAdaptAI/OpenAdapt/tree/v1.14.0)<br>commit `b9e096535224e0cb4b62d89f097a6b09c318bfe5`<br>tree `27a7d4ed881d97cf58aa7d1d83a912e52eecc124` | `openadapt-1.14.0-py3-none-any.whl` `ac79ccb3b502f6a6c309fd05fa965ed874bee3470e45cf9ac919ef4df6c0bc8f`<br>`openadapt-1.14.0.tar.gz` `0a5456faa6769a2186cd653050134bb3c91cb202e9a147fcd611b0671c52370f` |
| flow | `openadapt-flow` | `1.32.0` | [`v1.32.0`](https://github.com/OpenAdaptAI/openadapt-flow/tree/v1.32.0)<br>commit `d1b054c718d60465fb8a2e1853e6a84c7f26dec2`<br>tree `191b54985409034933b57e10fd08a17739277a47` | `openadapt_flow-1.32.0-py3-none-any.whl` `d58dcf8b7e54c8a45199db4390a588dc261bb754c5ab2af0fdb540e44cb6bb8a`<br>`openadapt_flow-1.32.0.tar.gz` `c3125f16c1b12420dff4a3af4c3d676e1d267cd961cb9e5f4825beb372b7f97e` |
| flow | `openadapt-flow` | `1.33.0` | [`v1.33.0`](https://github.com/OpenAdaptAI/openadapt-flow/tree/v1.33.0)<br>commit `80dc49b7296e5e6999b04124f26a647047a14b95`<br>tree `3074fd53f7a1673b51d610d178825a23676de644` | `openadapt_flow-1.33.0-py3-none-any.whl` `1d54ccffe3a554ecff82f69917f63f55233bd54ac1cb737058e096e4582aa494`<br>`openadapt_flow-1.33.0.tar.gz` `8f85bc5a9e3a8eb1c1d69178e7cfd03fc9de4d0d31832f117eacc0cc2052fd1c` |
| capture | `openadapt-capture` | `1.2.2` | [`v1.2.2`](https://github.com/OpenAdaptAI/openadapt-capture/tree/v1.2.2)<br>commit `06ade22948c12dcc6608bd54b5cca5c9c306e77c`<br>tree `b0a3b5b53f23536e01314f36aa46fd5b2d8baba6` | `openadapt_capture-1.2.2-py3-none-any.whl` `550fffe50990fa8431d332bdd5fe4755976d83baa7ad62553f50ad9e4ddcd1ae`<br>`openadapt_capture-1.2.2.tar.gz` `6f4298d3daadf9cced8994207e34b3116a79209ef792e98f778a0770e2f3406c` |
| privacy | `openadapt-privacy` | `1.0.3` | [`v1.0.3`](https://github.com/OpenAdaptAI/openadapt-privacy/tree/v1.0.3)<br>commit `43228e2b8d2e308083a9266f4bb6b247b5abdd93`<br>tree `d3ed6ebefca797cf36d83292be97de407bd9b1d8` | `openadapt_privacy-1.0.3-py3-none-any.whl` `ca0a92bce80be441240b3382812b001c99326a3ae3665e5d3026dee588ee3e07`<br>`openadapt_privacy-1.0.3.tar.gz` `2e0f201c206c67f936dd8c53a1ddfeb0effc6ca14175d97e0413be0a0d16668b` |
| types | `openadapt-types` | `0.10.1` | [`v0.10.1`](https://github.com/OpenAdaptAI/openadapt-types/tree/v0.10.1)<br>commit `9e0336ee92a807912338db570855a98d15919725`<br>tree `b63af56d5e639af1cfa7f1d008883c955e1b6ddf` | `openadapt_types-0.10.1-py3-none-any.whl` `c90a5a03721bf686895ae7212c88f178b96294d431edd37aebe9e5617fccc477`<br>`openadapt_types-0.10.1.tar.gz` `e39f850587ce05481c39bee87ecd266df1ddfd335cabdca23c4e2adc1df1c590` |
Expand All @@ -24,10 +24,10 @@

| Unit | Version | Selected or locked OpenAdapt packages |
|---|---:|---|
| launcher_environment | `1.14.0` | `openadapt==1.14.0`<br>`openadapt-flow==1.32.0` |
| customer_runner | `1.32.0` | `openadapt-flow==1.32.0`<br>`openadapt-types==0.10.1` |
| launcher_environment | `1.14.0` | `openadapt==1.14.0`<br>`openadapt-flow==1.33.0` |
| customer_runner | `1.33.0` | `openadapt-flow==1.33.0`<br>`openadapt-types==0.10.1` |
| desktop_sidecar | `0.15.0` | `openadapt-capture==1.2.1`<br>`openadapt-flow==1.27.1`<br>`openadapt-privacy==1.0.0`<br>`openadapt-types==0.7.0` |
| agent_bridge | `2.0.1` | `openadapt-agent==2.0.1`<br>`openadapt-flow==1.32.0` |
| agent_bridge | `2.0.1` | `openadapt-agent==2.0.1`<br>`openadapt-flow==1.33.0` |

## Selected-platform dependency compatibility

Expand All @@ -39,27 +39,27 @@ These edges show whether each selected integration version satisfies its publish
| desktop-sidecar-lock | `openadapt-desktop==0.15.0` | `openadapt-flow` | `==1.27.1` | `1.27.1` | `extra == "build"` |
| desktop-sidecar-lock | `openadapt-desktop==0.15.0` | `openadapt-privacy` | `>=1.0.0` | `1.0.0` | `always` |
| desktop-sidecar-lock | `openadapt-desktop==0.15.0` | `openadapt-types` | `==0.7.0` | `0.7.0` | `always` |
| selected-platform | `openadapt-agent==2.0.1` | `openadapt-flow` | `<2,>=1.18.1` | `1.32.0` | `always` |
| selected-platform | `openadapt-agent==2.0.1` | `openadapt-flow` | `<2,>=1.18.1` | `1.33.0` | `always` |
| selected-platform | `openadapt-capture==1.2.2` | `openadapt-privacy` | `>=0.1.0` | `1.0.3` | `extra == "all"`<br>`extra == "privacy"` |
| selected-platform | `openadapt-flow==1.32.0` | `openadapt-capture` | `>=1.2.0` | `1.2.2` | `extra == "capture"` |
| selected-platform | `openadapt-flow==1.32.0` | `openadapt-privacy` | `>=1.0.0` | `1.0.3` | `extra == "privacy"` |
| selected-platform | `openadapt-flow==1.32.0` | `openadapt-types` | `<0.11.0,>=0.10.0` | `0.10.1` | `extra == "console"`<br>`extra == "dev"`<br>`extra == "interop"` |
| selected-platform | `openadapt-flow==1.33.0` | `openadapt-capture` | `>=1.2.0` | `1.2.2` | `extra == "capture"` |
| selected-platform | `openadapt-flow==1.33.0` | `openadapt-privacy` | `>=1.0.0` | `1.0.3` | `extra == "privacy"` |
| selected-platform | `openadapt-flow==1.33.0` | `openadapt-types` | `<0.11.0,>=0.10.0` | `0.10.1` | `extra == "console"`<br>`extra == "dev"`<br>`extra == "interop"` |
| selected-platform | `openadapt==1.14.0` | `openadapt-capture` | `<2.0.0,>=1.2.0` | `1.2.2` | `extra == "all"`<br>`extra == "capture"`<br>`extra == "core"` |
| selected-platform | `openadapt==1.14.0` | `openadapt-flow` | `<2.0.0,>=1.29.0` | `1.32.0` | `always`<br>`extra == "all"`<br>`extra == "browser"`<br>`extra == "capture"`<br>`extra == "core"`<br>`extra == "flow"`<br>`extra == "privacy"`<br>`extra == "rdp"`<br>`extra == "windows"`<br>`sys_platform == "darwin" and extra == "all"`<br>`sys_platform == "darwin" and extra == "macos"`<br>`sys_platform == "linux" and extra == "all"`<br>`sys_platform == "linux" and extra == "linux"` |
| selected-platform | `openadapt==1.14.0` | `openadapt-flow` | `<2.0.0,>=1.29.0` | `1.33.0` | `always`<br>`extra == "all"`<br>`extra == "browser"`<br>`extra == "capture"`<br>`extra == "core"`<br>`extra == "flow"`<br>`extra == "privacy"`<br>`extra == "rdp"`<br>`extra == "windows"`<br>`sys_platform == "darwin" and extra == "all"`<br>`sys_platform == "darwin" and extra == "macos"`<br>`sys_platform == "linux" and extra == "all"`<br>`sys_platform == "linux" and extra == "linux"` |

## Cross-component schemas

| Contract | Owner | Accepted versions | Exact source |
|---|---|---|---|
| `workflow_bundle` | `flow` | `schema_version` [1, 2] | [`openadapt_flow/bundle_validation.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/d1b054c718d60465fb8a2e1853e6a84c7f26dec2/openadapt_flow/bundle_validation.py) `fe1e5ec441183adf1aa2209f1669f779043fb4ad1f41a651ca0f96123778240f`<br>[`openadapt_flow/ir.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/d1b054c718d60465fb8a2e1853e6a84c7f26dec2/openadapt_flow/ir.py) `e01b5bc70341e423782765241716890840d2874139fd17a4ca9e70d6d9930739` |
| `workflow_bundle` | `flow` | `schema_version` [1, 2] | [`openadapt_flow/bundle_validation.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/openadapt_flow/bundle_validation.py) `fe1e5ec441183adf1aa2209f1669f779043fb4ad1f41a651ca0f96123778240f`<br>[`openadapt_flow/ir.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/openadapt_flow/ir.py) `e01b5bc70341e423782765241716890840d2874139fd17a4ca9e70d6d9930739` |
| `capture_structural_observation` | `capture` | `openadapt.capture.structural-observation/v` [1] | [`openadapt_capture/structural.py`](https://github.com/OpenAdaptAI/openadapt-capture/blob/06ade22948c12dcc6608bd54b5cca5c9c306e77c/openadapt_capture/structural.py) `8f8bce37148a3357ace147c46a7c45e6d5501b70622b24b1ac2490f2def304fc` |
| `control_overlay_frame` | `types` | `openadapt.control-overlay-frame/v` [1, 2] | [`openadapt_types/control_overlay.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/9e0336ee92a807912338db570855a98d15919725/openadapt_types/control_overlay.py) `3aa01f89b43e12478c9e2ff1a9e61689397370691d15247ded9dcd5b05242790`<br>[`openadapt_types/control_overlay_tracking.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/9e0336ee92a807912338db570855a98d15919725/openadapt_types/control_overlay_tracking.py) `af8d934f0572c5f4e9c63ba720d4a1d0e73c8cdf3f7b87cc4562c01a8a551755` |
| `control_overlay_timeline` | `types` | `openadapt.control-overlay-timeline/v` [1, 2] | [`openadapt_types/control_overlay.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/9e0336ee92a807912338db570855a98d15919725/openadapt_types/control_overlay.py) `3aa01f89b43e12478c9e2ff1a9e61689397370691d15247ded9dcd5b05242790`<br>[`openadapt_types/control_overlay_tracking.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/9e0336ee92a807912338db570855a98d15919725/openadapt_types/control_overlay_tracking.py) `af8d934f0572c5f4e9c63ba720d4a1d0e73c8cdf3f7b87cc4562c01a8a551755` |
| `human_decision_task` | `types` | `openadapt.human-decision-task/v` [1, 2] | [`openadapt_types/human_decision.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/9e0336ee92a807912338db570855a98d15919725/openadapt_types/human_decision.py) `6ed5d2db82f5c73dfab568868f13f7a2cbfde6fb7b3f05b027b40c503ab04e29` |
| `human_decision_receipt` | `types` | `openadapt.human-decision-receipt/v` [1] | [`openadapt_types/human_decision.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/9e0336ee92a807912338db570855a98d15919725/openadapt_types/human_decision.py) `6ed5d2db82f5c73dfab568868f13f7a2cbfde6fb7b3f05b027b40c503ab04e29` |
| `human_decision_relay` | `flow` | `openadapt.human-decision-relay/v` [2] | [`openadapt_flow/console/decision_relay.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/d1b054c718d60465fb8a2e1853e6a84c7f26dec2/openadapt_flow/console/decision_relay.py) `d5320404d4342dbb52be1f2ead1cdb5cf0e22877feaaa1e47974b301df697292` |
| `remote_decision_projection` | `flow` | `openadapt.remote-decision-projection/v` [1] | [`openadapt_flow/console/human_decisions.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/d1b054c718d60465fb8a2e1853e6a84c7f26dec2/openadapt_flow/console/human_decisions.py) `02651ad8888a5c17bfff6fb47165ba861193243dc0f7c951f8b94f544ca19477` |
| `runtime_validation` | `flow` | `openadapt.runtime-validation/v` [1, 2, 3] | [`openadapt_flow/runtime_validation.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/d1b054c718d60465fb8a2e1853e6a84c7f26dec2/openadapt_flow/runtime_validation.py) `69a27484f625e78b826291adba517cc00ec6c9a89477d09c703af90cc6d6b73e` |
| `human_decision_relay` | `flow` | `openadapt.human-decision-relay/v` [2] | [`openadapt_flow/console/decision_relay.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/openadapt_flow/console/decision_relay.py) `d5320404d4342dbb52be1f2ead1cdb5cf0e22877feaaa1e47974b301df697292` |
| `remote_decision_projection` | `flow` | `openadapt.remote-decision-projection/v` [1] | [`openadapt_flow/console/human_decisions.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/openadapt_flow/console/human_decisions.py) `02651ad8888a5c17bfff6fb47165ba861193243dc0f7c951f8b94f544ca19477` |
| `runtime_validation` | `flow` | `openadapt.runtime-validation/v` [1, 2, 3] | [`openadapt_flow/runtime_validation.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/openadapt_flow/runtime_validation.py) `69a27484f625e78b826291adba517cc00ec6c9a89477d09c703af90cc6d6b73e` |

## Host operating systems

Expand All @@ -80,5 +80,5 @@ These edges show whether each selected integration version satisfies its publish
## Qualification evidence

- [openadapt-public-status](https://openadapt.ai/status.json): Canonical machine-readable release, capability, and substrate qualification status, maintained in openadapt-web (public/status.json).
- [flow-public-demo-evidence-packs](https://github.com/OpenAdaptAI/openadapt-flow/tree/d1b054c718d60465fb8a2e1853e6a84c7f26dec2/public-demo/evidence-packs): Versioned public evidence packs with per-pack manifest files, replay evidence, and fault-case results.
- [flow-effectbench-task-pack](https://github.com/OpenAdaptAI/openadapt-flow/blob/d1b054c718d60465fb8a2e1853e6a84c7f26dec2/benchmark/effectbench/task_pack/manifest.json): Effect-verification benchmark task pack manifest used by the flow qualification harness.
- [flow-public-demo-evidence-packs](https://github.com/OpenAdaptAI/openadapt-flow/tree/80dc49b7296e5e6999b04124f26a647047a14b95/public-demo/evidence-packs): Versioned public evidence packs with per-pack manifest files, replay evidence, and fault-case results.
- [flow-effectbench-task-pack](https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/benchmark/effectbench/task_pack/manifest.json): Effect-verification benchmark task pack manifest used by the flow qualification harness.
16 changes: 7 additions & 9 deletions openadapt/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def main():

\b
Quick Start:
python -m pip install --upgrade 'openadapt[browser]'
python -m pip install --upgrade openadapt
openadapt quickstart

\b
Expand Down Expand Up @@ -112,7 +112,7 @@ def _run_flow(argv: list[str]) -> None:
_PYTHON_REMEDY = (
"OpenAdapt needs Python 3.10\u20133.12. Easiest fix: "
"curl -LsSf https://astral.sh/uv/install.sh | sh && "
"uv venv --python 3.12 && uv pip install 'openadapt[browser]'\n"
"uv venv --python 3.12 && uv pip install openadapt\n"
"Or use the installer script: https://raw.githubusercontent.com/"
"OpenAdaptAI/openadapt-flow/main/scripts/install.sh"
)
Expand Down Expand Up @@ -366,8 +366,8 @@ def deploy(backend: str, secret_ref: tuple[str, ...]) -> None:
else:
failures.append("browser")
click.echo(
" [SETUP] install the web extra before recording or replay: "
"python -m pip install 'openadapt[browser]'"
" [MISSING] the base OpenAdapt install does not contain "
"Playwright. Run: python -m pip install --upgrade openadapt"
)
elif backend == "rdp":
if find_spec("aardwolf") is not None:
Expand Down Expand Up @@ -1034,11 +1034,9 @@ def doctor(backend: str | None):
else:
playwright = find_spec("playwright") is not None
if not playwright:
prefix = "[SETUP]" if backend == "web" else "[--]"
click.echo(
f" {prefix} Browser: optional and not installed. Run "
"`python -m pip install 'openadapt[browser]'` before a web "
"recording or replay."
" [MISSING] Browser: the base install does not contain "
"Playwright. Run `python -m pip install --upgrade openadapt`."
)
else:
try:
Expand All @@ -1060,6 +1058,7 @@ def doctor(backend: str | None):
click.echo("\nCore packages (installed with `pip install openadapt`):")
core = [
"openadapt_flow",
"playwright",
]
for pkg in core:
# find_spec checks installability without executing package code
Expand All @@ -1078,7 +1077,6 @@ def doctor(backend: str | None):
# install it rather than flagging it. Maps import name -> extra name.
click.echo("\nOptional packages (install with `pip install openadapt[...]`):")
optional = [
("playwright", "browser"),
("openadapt_capture", "capture"),
("openadapt_ml", "ml"),
("openadapt_evals", "evals"),
Expand Down
Loading