diff --git a/CHANGELOG.md b/CHANGELOG.md
index 114bbdeb65..b58aa349d3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,25 @@
+## v1.20.0 (2026-11-04)
+
+### Requirements
+
+- Require `openadapt-flow>=2.6.0,<3.0.0` in the base install and every Flow
+ extra. `openadapt doctor` and `openadapt deploy` report older Flow releases
+ as unsupported. This supplies the persistent owed-recheck API used by
+ ledger listing.
+
+### Features
+
+- `openadapt verify ledger list` shows provisional confirmed writes whose
+ rechecks are still owed, with their due time and actor. Owed rechecks remain
+ visible after the server restarts and disappear when the recheck completes.
+ An empty ledger reports that no held writes, open writes or owed rechecks
+ remain.
+- The platform manifest and compatibility report select published component
+ releases, including Desktop 0.25.1.
+
## v1.19.0 (2026-11-02)
### Breaking Changes
diff --git a/docs/platform-compatibility-report.md b/docs/platform-compatibility-report.md
index 2c1b4199d6..3278ecc665 100644
--- a/docs/platform-compatibility-report.md
+++ b/docs/platform-compatibility-report.md
@@ -2,7 +2,7 @@
-- Generated: `2026-11-03T00:23:35+00:00`
+- Generated: `2026-11-04T22:39:52+00:00`
- Selection: `explicit-published`
- Compatibility: **dependency-compatible**
- Signature: `unsigned (signing infrastructure pending)`
@@ -11,22 +11,22 @@
| Role | Package | Version | Release source reference | Published artifacts |
|---|---|---:|---|---|
-| launcher | `openadapt` | `1.17.0` | [`v1.17.0`](https://github.com/OpenAdaptAI/OpenAdapt/tree/v1.17.0)
commit `e022d97ee8b3c3992f4a4cb6e522f1532fef0834`
tree `2e0efeaa337a26d3425320ffa8f9aa3ac31d3f9c` | `openadapt-1.17.0-py3-none-any.whl` `c33c069c8cd9c270562200339b631fb77423b5b7f24364b5f0a6a0730e5ca8b8`
`openadapt-1.17.0.tar.gz` `03926f94f4d9d37eeb8c6c9cbdc94516d43c0ace971f2282b3310d77d73b6547` |
-| flow | `openadapt-flow` | `2.5.0` | [`openadapt-flow-v2.5.0`](https://github.com/OpenAdaptAI/OpenAdapt/tree/openadapt-flow-v2.5.0/packages/flow)
commit `5a3bf49a0bf2d662430386295a1c34036c064d58`
tree `cab536c90e79fcfe887b8876e884ec2ed651f23e` | `openadapt_flow-2.5.0-py3-none-any.whl` `1dbc5d42d103cfa8a452d95805dde60c7d460035ec4d81df5cc642a32f118339`
`openadapt_flow-2.5.0.tar.gz` `54d99e77976ee7d9e6bc171b2ea148497528ead77b226fdf6fd4713b37c689b3` |
+| launcher | `openadapt` | `1.19.0` | [`v1.19.0`](https://github.com/OpenAdaptAI/OpenAdapt/tree/v1.19.0)
commit `1a64acd47bf6e60de20b7ac97993bd23122eb697`
tree `4ff3db2dc38334cd3957e66f89c95ea292abd9b8` | `openadapt-1.19.0-py3-none-any.whl` `0a6963404d5b2a83aa83f8701c017838a8d09878128264b729064515b722a8b4`
`openadapt-1.19.0.tar.gz` `fc513011804644133ba8c93d41979cf2136829316839afb870e5092079551887` |
+| flow | `openadapt-flow` | `2.6.0` | [`openadapt-flow-v2.6.0`](https://github.com/OpenAdaptAI/OpenAdapt/tree/openadapt-flow-v2.6.0/packages/flow)
commit `1c832365d11e9dbe2a166485b13f7b8effd6d8d0`
tree `954b03e36d350803bec59046ffaf56c02c3d556b` | `openadapt_flow-2.6.0-py3-none-any.whl` `43718301bdb2579b1a78c60dfc025e8d60f2be9a3bc4172894c4194e0600fa9a`
`openadapt_flow-2.6.0.tar.gz` `4f1b2b9e28ec666c0e50ef2593d985ba387efc42bfb9b8f9f24148f6c8085112` |
| capture | `openadapt-capture` | `1.2.2` | [`v1.2.2`](https://github.com/OpenAdaptAI/openadapt-capture/tree/v1.2.2)
commit `06ade22948c12dcc6608bd54b5cca5c9c306e77c`
tree `b0a3b5b53f23536e01314f36aa46fd5b2d8baba6` | `openadapt_capture-1.2.2-py3-none-any.whl` `550fffe50990fa8431d332bdd5fe4755976d83baa7ad62553f50ad9e4ddcd1ae`
`openadapt_capture-1.2.2.tar.gz` `6f4298d3daadf9cced8994207e34b3116a79209ef792e98f778a0770e2f3406c` |
| privacy | `openadapt-privacy` | `1.1.2` | [`v1.1.2`](https://github.com/OpenAdaptAI/openadapt-privacy/tree/v1.1.2)
commit `9ae96d8ed73ea5b9e445d0604b5db48788936a04`
tree `fe59ca5f04fc99d16424e9228dcd797b05115cb8` | `openadapt_privacy-1.1.2-py3-none-any.whl` `6e542b2fea44bdf8872430687946ec805fef22dc7d228a56a1e65871beebe47a`
`openadapt_privacy-1.1.2.tar.gz` `d90287edaa13470955f15d5f6eeb37b075678aeb55de324f8b8207682009bcc2` |
| types | `openadapt-types` | `0.24.0` | [`openadapt-types-v0.24.0`](https://github.com/OpenAdaptAI/OpenAdapt/tree/openadapt-types-v0.24.0/packages/types)
commit `f2f04c5b432d88b262d46103a542b0e2c3dcc8a9`
tree `38ccf341ec74a0dd0facc9f64343c27644a7ca7d` | `openadapt_types-0.24.0-py3-none-any.whl` `8025e8a4dc9235fd81d4b24ae7fa7e544120abdb8d4ee7df160e4f50d9230d75`
`openadapt_types-0.24.0.tar.gz` `16dcd1da1c2c78c08d650a19eb9cc439474f996812a87198b316d51bfac443db` |
-| desktop | `openadapt-desktop` | `0.16.0` | [`v0.16.0`](https://github.com/OpenAdaptAI/openadapt-desktop/tree/v0.16.0)
commit `7c59750d37be09a2871cd1bada8cb0bce946d363`
tree `9a1307794df6f2c77ee3dab90973845f3d08ee53` | `openadapt_desktop-0.16.0-py3-none-any.whl` `06e608a934deef56c93ee1ca8de511d6daba08459626e8245bd0db4c391e64e9`
`openadapt_desktop-0.16.0.tar.gz` `15f0c59a4d481328da76f3e5aa6a29ab8cdced8ab183c97346d69b4c14c996ff` |
+| desktop | `openadapt-desktop` | `0.25.1` | [`openadapt-desktop-v0.25.1`](https://github.com/OpenAdaptAI/OpenAdapt/tree/openadapt-desktop-v0.25.1/packages/desktop)
commit `b21a86d4a263f2bd8c4e8037e81f09457e998bdb`
tree `77acb2dfaab10e413f0d348ce98fbff9e24da752` | `openadapt_desktop-0.25.1-py3-none-any.whl` `5f55ecffe173d0f7740cbbf011c19b763a495d9e1b37054f4f6ccf16a07a7be2`
`openadapt_desktop-0.25.1.tar.gz` `5a9c22996b76a0efbcfa87d3710d88611ab2feb772de284d7233b9d38b04241b` |
| agent | `openadapt-agent` | `2.2.1` | [`openadapt-agent-v2.2.1`](https://github.com/OpenAdaptAI/OpenAdapt/tree/openadapt-agent-v2.2.1/packages/agent)
commit `8d0758b9687744b07355c6512b6a57942bec4bb4`
tree `5300b0849929dd3051c57640ba6fcd74ac483728` | `openadapt_agent-2.2.1-py3-none-any.whl` `847499c4091144cb0c1bb1d2731ef064ae9cd844867c2b603acf573c6e12928a`
`openadapt_agent-2.2.1.tar.gz` `859e6b7d464ab813aba85af7f1f227ac9afcdb60112bc564719a82d3766fb733` |
## Runtime selections
| Unit | Version | Selected or locked OpenAdapt packages |
|---|---:|---|
-| launcher_environment | `1.17.0` | `openadapt==1.17.0`
`openadapt-flow==2.5.0` |
-| customer_runner | `2.5.0` | `openadapt-flow==2.5.0`
`openadapt-types==0.24.0` |
-| desktop_sidecar | `0.16.0` | `openadapt-capture==1.2.1`
`openadapt-flow==1.34.0`
`openadapt-privacy==1.0.0`
`openadapt-types==0.10.0` |
-| agent_bridge | `2.2.1` | `openadapt-agent==2.2.1`
`openadapt-flow==2.5.0` |
+| launcher_environment | `1.19.0` | `openadapt==1.19.0`
`openadapt-flow==2.6.0` |
+| customer_runner | `2.6.0` | `openadapt-flow==2.6.0`
`openadapt-types==0.24.0` |
+| desktop_sidecar | `0.25.1` | `openadapt-capture==1.3.0`
`openadapt-flow==2.4.1`
`openadapt-privacy==1.1.3`
`openadapt-types==0.24.0` |
+| agent_bridge | `2.2.1` | `openadapt-agent==2.2.1`
`openadapt-flow==2.6.0` |
## Selected-platform dependency compatibility
@@ -34,33 +34,33 @@ These edges show whether each selected integration version satisfies its publish
| Scope | Source | Target | Constraint | Selected | Activation |
|---|---|---|---|---:|---|
-| desktop-sidecar-lock | `openadapt-desktop==0.16.0` | `openadapt-capture` | `>=1.2.1` | `1.2.1` | `always` |
-| desktop-sidecar-lock | `openadapt-desktop==0.16.0` | `openadapt-flow` | `==1.34.0` | `1.34.0` | `extra == "build"` |
-| desktop-sidecar-lock | `openadapt-desktop==0.16.0` | `openadapt-privacy` | `>=1.0.0` | `1.0.0` | `always` |
-| desktop-sidecar-lock | `openadapt-desktop==0.16.0` | `openadapt-types` | `==0.10.0` | `0.10.0` | `always` |
-| selected-platform | `openadapt-agent==2.2.1` | `openadapt-flow` | `<3,>=2.2.0` | `2.5.0` | `always`
`extra == "tutorial"` |
+| desktop-sidecar-lock | `openadapt-desktop==0.25.1` | `openadapt-capture` | `>=1.3.0` | `1.3.0` | `always` |
+| desktop-sidecar-lock | `openadapt-desktop==0.25.1` | `openadapt-flow` | `==2.4.1` | `2.4.1` | `extra == "build"` |
+| desktop-sidecar-lock | `openadapt-desktop==0.25.1` | `openadapt-privacy` | `>=1.0.0` | `1.1.3` | `always` |
+| desktop-sidecar-lock | `openadapt-desktop==0.25.1` | `openadapt-types` | `<0.25.0,>=0.24.0` | `0.24.0` | `always` |
+| selected-platform | `openadapt-agent==2.2.1` | `openadapt-flow` | `<3,>=2.2.0` | `2.6.0` | `always`
`extra == "tutorial"` |
| selected-platform | `openadapt-agent==2.2.1` | `openadapt-privacy` | `>=1.1.2` | `1.1.2` | `extra == "repair-screens"` |
| selected-platform | `openadapt-capture==1.2.2` | `openadapt-privacy` | `>=0.1.0` | `1.1.2` | `extra == "all"`
`extra == "privacy"` |
-| selected-platform | `openadapt-flow==2.5.0` | `openadapt-capture` | `>=1.2.0` | `1.2.2` | `extra == "capture"` |
-| selected-platform | `openadapt-flow==2.5.0` | `openadapt-privacy` | `>=1.0.0` | `1.1.2` | `extra == "privacy"` |
-| selected-platform | `openadapt-flow==2.5.0` | `openadapt-types` | `<0.25.0,>=0.24.0` | `0.24.0` | `always` |
-| selected-platform | `openadapt==1.17.0` | `openadapt-agent` | `<3,>=2.1.0` | `2.2.1` | `python_version < "3.13"`
`python_version < "3.13" and extra == "agent"`
`python_version < "3.13" and extra == "all"` |
-| selected-platform | `openadapt==1.17.0` | `openadapt-capture` | `<2.0.0,>=1.2.0` | `1.2.2` | `extra == "all"`
`extra == "capture"`
`extra == "core"` |
-| selected-platform | `openadapt==1.17.0` | `openadapt-flow` | `<3.0.0,>=2.0.0` | `2.5.0` | `(sys_platform == "darwin" and python_version < "3.13") and extra == "all"`
`(sys_platform == "darwin" and python_version < "3.13") and extra == "macos"`
`(sys_platform == "linux" and python_version < "3.13") and extra == "all"`
`(sys_platform == "linux" and python_version < "3.13") and extra == "linux"`
`python_version < "3.13"`
`python_version < "3.13" and extra == "all"`
`python_version < "3.13" and extra == "browser"`
`python_version < "3.13" and extra == "capture"`
`python_version < "3.13" and extra == "core"`
`python_version < "3.13" and extra == "flow"`
`python_version < "3.13" and extra == "privacy"`
`python_version < "3.13" and extra == "rdp"`
`python_version < "3.13" and extra == "windows"` |
+| selected-platform | `openadapt-flow==2.6.0` | `openadapt-capture` | `>=1.2.0` | `1.2.2` | `extra == "capture"` |
+| selected-platform | `openadapt-flow==2.6.0` | `openadapt-privacy` | `>=1.0.0` | `1.1.2` | `extra == "privacy"` |
+| selected-platform | `openadapt-flow==2.6.0` | `openadapt-types` | `<0.25.0,>=0.24.0` | `0.24.0` | `always` |
+| selected-platform | `openadapt==1.19.0` | `openadapt-agent` | `<3,>=2.1.0` | `2.2.1` | `python_version < "3.13"`
`python_version < "3.13" and extra == "agent"`
`python_version < "3.13" and extra == "all"` |
+| selected-platform | `openadapt==1.19.0` | `openadapt-capture` | `<2.0.0,>=1.2.0` | `1.2.2` | `extra == "all"`
`extra == "capture"`
`extra == "core"` |
+| selected-platform | `openadapt==1.19.0` | `openadapt-flow` | `<3.0.0,>=2.5.0` | `2.6.0` | `(sys_platform == "darwin" and python_version < "3.13") and extra == "all"`
`(sys_platform == "darwin" and python_version < "3.13") and extra == "macos"`
`(sys_platform == "linux" and python_version < "3.13") and extra == "all"`
`(sys_platform == "linux" and python_version < "3.13") and extra == "linux"`
`python_version < "3.13"`
`python_version < "3.13" and extra == "all"`
`python_version < "3.13" and extra == "browser"`
`python_version < "3.13" and extra == "capture"`
`python_version < "3.13" and extra == "core"`
`python_version < "3.13" and extra == "flow"`
`python_version < "3.13" and extra == "privacy"`
`python_version < "3.13" and extra == "rdp"`
`python_version < "3.13" and extra == "windows"` |
## Cross-component schemas
| Contract | Owner | Accepted versions | Exact source |
|---|---|---|---|
-| `workflow_bundle` | `flow` | `schema_version` [1, 2] | [`packages/flow/openadapt_flow/bundle_validation.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/bundle_validation.py) `63532fb8e49f25a8aba8dccca505362a9293b8db9cbc0f2904dd8f9a6e23fea8`
[`packages/flow/openadapt_flow/ir.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/ir.py) `efb7fdce6fa625f631901389ca767b016f4db3111caa2905321ff3da675e376d` |
+| `workflow_bundle` | `flow` | `schema_version` [1, 2] | [`packages/flow/openadapt_flow/bundle_validation.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/bundle_validation.py) `63532fb8e49f25a8aba8dccca505362a9293b8db9cbc0f2904dd8f9a6e23fea8`
[`packages/flow/openadapt_flow/ir.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/ir.py) `509e9ef8666ec65496b4b7afdd0b2bc8af4ba0663e64a4079ce1813950bf028e` |
| `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] | [`packages/types/openadapt_types/control_overlay.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/f2f04c5b432d88b262d46103a542b0e2c3dcc8a9/packages/types/openadapt_types/control_overlay.py) `3aa01f89b43e12478c9e2ff1a9e61689397370691d15247ded9dcd5b05242790`
[`packages/types/openadapt_types/control_overlay_tracking.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/f2f04c5b432d88b262d46103a542b0e2c3dcc8a9/packages/types/openadapt_types/control_overlay_tracking.py) `af8d934f0572c5f4e9c63ba720d4a1d0e73c8cdf3f7b87cc4562c01a8a551755` |
| `control_overlay_timeline` | `types` | `openadapt.control-overlay-timeline/v` [1, 2] | [`packages/types/openadapt_types/control_overlay.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/f2f04c5b432d88b262d46103a542b0e2c3dcc8a9/packages/types/openadapt_types/control_overlay.py) `3aa01f89b43e12478c9e2ff1a9e61689397370691d15247ded9dcd5b05242790`
[`packages/types/openadapt_types/control_overlay_tracking.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/f2f04c5b432d88b262d46103a542b0e2c3dcc8a9/packages/types/openadapt_types/control_overlay_tracking.py) `af8d934f0572c5f4e9c63ba720d4a1d0e73c8cdf3f7b87cc4562c01a8a551755` |
| `human_decision_task` | `types` | `openadapt.human-decision-task/v` [1, 2] | [`packages/types/openadapt_types/human_decision.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/f2f04c5b432d88b262d46103a542b0e2c3dcc8a9/packages/types/openadapt_types/human_decision.py) `0bb39a3575f511e10d01d92858b340982adee2f0fc20d2409441dbc0b2c55c4f` |
| `human_decision_receipt` | `types` | `openadapt.human-decision-receipt/v` [1] | [`packages/types/openadapt_types/human_decision.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/f2f04c5b432d88b262d46103a542b0e2c3dcc8a9/packages/types/openadapt_types/human_decision.py) `0bb39a3575f511e10d01d92858b340982adee2f0fc20d2409441dbc0b2c55c4f` |
-| `human_decision_relay` | `flow` | `openadapt.human-decision-relay/v` [2] | [`packages/flow/openadapt_flow/console/decision_relay.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/console/decision_relay.py) `d5320404d4342dbb52be1f2ead1cdb5cf0e22877feaaa1e47974b301df697292` |
-| `remote_decision_projection` | `flow` | `openadapt.remote-decision-projection/v` [1] | [`packages/flow/openadapt_flow/console/human_decisions.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/console/human_decisions.py) `02651ad8888a5c17bfff6fb47165ba861193243dc0f7c951f8b94f544ca19477` |
-| `runtime_validation` | `flow` | `openadapt.runtime-validation/v` [1, 2, 3] | [`packages/flow/openadapt_flow/runtime_validation.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/runtime_validation.py) `a5a220f570c5ee5769ac2f21d8d140bb69373d4de2ccc0ebfd08540122883f0e` |
+| `human_decision_relay` | `flow` | `openadapt.human-decision-relay/v` [2] | [`packages/flow/openadapt_flow/console/decision_relay.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/console/decision_relay.py) `d5320404d4342dbb52be1f2ead1cdb5cf0e22877feaaa1e47974b301df697292` |
+| `remote_decision_projection` | `flow` | `openadapt.remote-decision-projection/v` [1] | [`packages/flow/openadapt_flow/console/human_decisions.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/console/human_decisions.py) `02651ad8888a5c17bfff6fb47165ba861193243dc0f7c951f8b94f544ca19477` |
+| `runtime_validation` | `flow` | `openadapt.runtime-validation/v` [1, 2, 3] | [`packages/flow/openadapt_flow/runtime_validation.py`](https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/runtime_validation.py) `a5a220f570c5ee5769ac2f21d8d140bb69373d4de2ccc0ebfd08540122883f0e` |
## Host operating systems
@@ -82,5 +82,5 @@ Compatibility and delivery facts do not assign lifecycle state. Use the signed P
## 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/tree/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/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/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/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/tree/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/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/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/benchmark/effectbench/task_pack/manifest.json): Effect-verification benchmark task pack manifest used by the flow qualification harness.
diff --git a/openadapt/cli.py b/openadapt/cli.py
index cb1306fc9e..28bb728ebb 100644
--- a/openadapt/cli.py
+++ b/openadapt/cli.py
@@ -849,9 +849,9 @@ def _warn_about_launcher_conflicts() -> None:
_SECRET_REFERENCE = re.compile(r"^(?:env:[A-Z][A-Z0-9_]*|keychain:[^/\s]+/[^/\s]+)$")
# Flow 1.33 and 1.34 probe four X11 libraries in the wrong case, so on Linux
# they refuse to download Chromium on hosts that have them. 1.35.0 fixed it.
-# Launcher 1.19 requires Flow 2.5: `openadapt shadow` forwards to its shadow
-# command, and `openadapt verify serve` offers its recheck.
-_SUPPORTED_FLOW_RANGE = ">=2.5.0,<3.0.0"
+# Launcher 1.20 requires Flow 2.6: ledger listing uses its persistent
+# owed-recheck API.
+_SUPPORTED_FLOW_RANGE = ">=2.6.0,<3.0.0"
_RDP_INSTALL_COMMAND = _pip_install("openadapt[rdp]")
_CHROMIUM_SYSTEM_LIBS_COMMAND = (
f"{shlex.quote(sys.executable)} -m playwright install-deps chromium"
@@ -861,7 +861,7 @@ def _warn_about_launcher_conflicts() -> None:
def _supported_flow_version(value: str) -> bool:
"""Return whether a stable Flow version is in the launcher's supported range."""
parsed = _release_tuple(value)
- return parsed is not None and (2, 5, 0) <= parsed < (3, 0, 0)
+ return parsed is not None and (2, 6, 0) <= parsed < (3, 0, 0)
# The Python modules each native or remote Flow backend imports when its
@@ -1350,12 +1350,23 @@ def verify_ledger() -> None:
@verify_ledger.command("list")
@_LEDGER_OPTION
def verify_ledger_list(ledger_dir: Optional[str]) -> None:
- """Show held and open writes: key, state, when it began, outcome."""
+ """Show held and open writes: key, state, when it began, outcome.
+
+ Also each provisional CONFIRMED whose recheck is still owed, with its due
+ time, so a recheck isn't lost when the server that holds it restarts.
+ """
ledger = _write_ledger(ledger_dir)
rows = ledger.unresolved()
- if not rows:
- click.echo("No held or open writes.")
+ owed = ledger.rechecks_owed()
+ if not rows and not owed:
+ click.echo("No held or open writes. No rechecks owed.")
return
+ for key, attempt in owed:
+ click.echo(
+ f"{key} recheck-owed began {attempt.begun.get('at')} "
+ f"due {attempt.recheck_owed} by {attempt.begun.get('actor_kind')}:"
+ f"{attempt.begun.get('actor_id')}"
+ )
for key, attempt in rows:
outcome = (attempt.resolved or {}).get("outcome", "-")
state = "review" if attempt.review else ledger.state(attempt)
diff --git a/platform-manifest.json b/platform-manifest.json
index a59c049229..751c5b7899 100644
--- a/platform-manifest.json
+++ b/platform-manifest.json
@@ -1,7 +1,7 @@
{
"manifest_kind": "openadapt-platform-release-manifest",
"schema_version": "2.0.0",
- "generated_at": "2026-11-03T00:23:35+00:00",
+ "generated_at": "2026-11-04T22:39:52+00:00",
"generation": {
"files": [
{
@@ -19,9 +19,9 @@
"component_versions": {
"agent": "2.2.1",
"capture": "1.2.2",
- "desktop": "0.16.0",
- "flow": "2.5.0",
- "launcher": "1.17.0",
+ "desktop": "0.25.1",
+ "flow": "2.6.0",
+ "launcher": "1.19.0",
"privacy": "1.1.2",
"types": "0.24.0"
}
@@ -29,7 +29,7 @@
"components": {
"launcher": {
"package": "openadapt",
- "version": "1.17.0",
+ "version": "1.19.0",
"source": "pypi",
"requires_python": ">=3.10",
"requires": {
@@ -43,7 +43,7 @@
">=0.1.0"
],
"openadapt-flow": [
- "<3.0.0,>=2.0.0"
+ "<3.0.0,>=2.5.0"
],
"openadapt-grounding": [
">=0.1.0"
@@ -115,109 +115,109 @@
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": null,
"marker": "python_version < \"3.13\" and extra == \"all\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": null,
"marker": "python_version < \"3.13\" and extra == \"flow\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "browser",
"marker": "python_version < \"3.13\" and extra == \"all\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "browser",
"marker": "python_version < \"3.13\" and extra == \"browser\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "browser,hosted",
"marker": "python_version < \"3.13\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "capture",
"marker": "python_version < \"3.13\" and extra == \"all\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "capture",
"marker": "python_version < \"3.13\" and extra == \"capture\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "capture",
"marker": "python_version < \"3.13\" and extra == \"core\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "linux",
"marker": "(sys_platform == \"linux\" and python_version < \"3.13\") and extra == \"all\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "linux",
"marker": "(sys_platform == \"linux\" and python_version < \"3.13\") and extra == \"linux\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "macos",
"marker": "(sys_platform == \"darwin\" and python_version < \"3.13\") and extra == \"all\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "macos",
"marker": "(sys_platform == \"darwin\" and python_version < \"3.13\") and extra == \"macos\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "privacy",
"marker": "python_version < \"3.13\" and extra == \"all\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "privacy",
"marker": "python_version < \"3.13\" and extra == \"privacy\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "rdp",
"marker": "python_version < \"3.13\" and extra == \"all\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "rdp",
"marker": "python_version < \"3.13\" and extra == \"rdp\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "windows",
"marker": "python_version < \"3.13\" and extra == \"all\""
},
{
"package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
+ "requires": "<3.0.0,>=2.5.0",
"extras": "windows",
"marker": "python_version < \"3.13\" and extra == \"windows\""
},
@@ -284,29 +284,29 @@
],
"provenance": {
"repository": "OpenAdaptAI/OpenAdapt",
- "release_ref": "v1.17.0",
- "commit": "e022d97ee8b3c3992f4a4cb6e522f1532fef0834",
- "tree": "2e0efeaa337a26d3425320ffa8f9aa3ac31d3f9c",
- "url": "https://github.com/OpenAdaptAI/OpenAdapt/tree/v1.17.0"
+ "release_ref": "v1.19.0",
+ "commit": "1a64acd47bf6e60de20b7ac97993bd23122eb697",
+ "tree": "4ff3db2dc38334cd3957e66f89c95ea292abd9b8",
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/tree/v1.19.0"
},
"artifacts": [
{
"type": "bdist_wheel",
- "filename": "openadapt-1.17.0-py3-none-any.whl",
- "url": "https://files.pythonhosted.org/packages/55/aa/1184cad0892f2531fe54d24b808a3b76fafc87b77ccd865435ce2387ebef/openadapt-1.17.0-py3-none-any.whl",
- "sha256": "c33c069c8cd9c270562200339b631fb77423b5b7f24364b5f0a6a0730e5ca8b8"
+ "filename": "openadapt-1.19.0-py3-none-any.whl",
+ "url": "https://files.pythonhosted.org/packages/b4/23/925da0c3b52dde4e0eb26fed95c4c60d7e32bfe6c6678b05e85c9d9eb6ab/openadapt-1.19.0-py3-none-any.whl",
+ "sha256": "0a6963404d5b2a83aa83f8701c017838a8d09878128264b729064515b722a8b4"
},
{
"type": "sdist",
- "filename": "openadapt-1.17.0.tar.gz",
- "url": "https://files.pythonhosted.org/packages/19/8d/23723916889acfa5149e25c6eadf4aef0ca015aac72e0a9bf96a95eb4e57/openadapt-1.17.0.tar.gz",
- "sha256": "03926f94f4d9d37eeb8c6c9cbdc94516d43c0ace971f2282b3310d77d73b6547"
+ "filename": "openadapt-1.19.0.tar.gz",
+ "url": "https://files.pythonhosted.org/packages/b4/12/e9eedc624f4451f88e423591876b753f3365714510866fb2cdb0382e5788/openadapt-1.19.0.tar.gz",
+ "sha256": "fc513011804644133ba8c93d41979cf2136829316839afb870e5092079551887"
}
]
},
"flow": {
"package": "openadapt-flow",
- "version": "2.5.0",
+ "version": "2.6.0",
"source": "pypi",
"requires_python": "<3.13,>=3.10",
"requires": {
@@ -351,24 +351,24 @@
],
"provenance": {
"repository": "OpenAdaptAI/OpenAdapt",
- "release_ref": "openadapt-flow-v2.5.0",
- "commit": "5a3bf49a0bf2d662430386295a1c34036c064d58",
- "tree": "cab536c90e79fcfe887b8876e884ec2ed651f23e",
- "url": "https://github.com/OpenAdaptAI/OpenAdapt/tree/openadapt-flow-v2.5.0/packages/flow",
+ "release_ref": "openadapt-flow-v2.6.0",
+ "commit": "1c832365d11e9dbe2a166485b13f7b8effd6d8d0",
+ "tree": "954b03e36d350803bec59046ffaf56c02c3d556b",
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/tree/openadapt-flow-v2.6.0/packages/flow",
"source_root": "packages/flow"
},
"artifacts": [
{
"type": "bdist_wheel",
- "filename": "openadapt_flow-2.5.0-py3-none-any.whl",
- "url": "https://files.pythonhosted.org/packages/7d/7b/76f2027c37fd059c0c1409cd6ca6c995da13fc5891c40b138f9b0cf1362f/openadapt_flow-2.5.0-py3-none-any.whl",
- "sha256": "1dbc5d42d103cfa8a452d95805dde60c7d460035ec4d81df5cc642a32f118339"
+ "filename": "openadapt_flow-2.6.0-py3-none-any.whl",
+ "url": "https://files.pythonhosted.org/packages/8f/a8/4cdb822b1245b47cbc80a27d30ab285e0239e1bc5d69b2077ce5495dbb93/openadapt_flow-2.6.0-py3-none-any.whl",
+ "sha256": "43718301bdb2579b1a78c60dfc025e8d60f2be9a3bc4172894c4194e0600fa9a"
},
{
"type": "sdist",
- "filename": "openadapt_flow-2.5.0.tar.gz",
- "url": "https://files.pythonhosted.org/packages/b3/9e/c4b87cfdba0b1ae03d57062bad41686cb9b3affd46e901ee1749fcf1e5b8/openadapt_flow-2.5.0.tar.gz",
- "sha256": "54d99e77976ee7d9e6bc171b2ea148497528ead77b226fdf6fd4713b37c689b3"
+ "filename": "openadapt_flow-2.6.0.tar.gz",
+ "url": "https://files.pythonhosted.org/packages/7c/e6/dbe17ef0adf7c0f66e762eb30d49bdf3cb665fe43b400b6b7e6ae1b3c590/openadapt_flow-2.6.0.tar.gz",
+ "sha256": "4f1b2b9e28ec666c0e50ef2593d985ba387efc42bfb9b8f9f24148f6c8085112"
}
]
},
@@ -479,33 +479,33 @@
},
"desktop": {
"package": "openadapt-desktop",
- "version": "0.16.0",
+ "version": "0.25.1",
"source": "pypi",
"requires_python": ">=3.11",
"requires": {
"openadapt-capture": [
- ">=1.2.1"
+ ">=1.3.0"
],
"openadapt-flow": [
- "==1.34.0"
+ "==2.4.1"
],
"openadapt-privacy": [
">=1.0.0"
],
"openadapt-types": [
- "==0.10.0"
+ "<0.25.0,>=0.24.0"
]
},
"dependency_constraints": [
{
"package": "openadapt-capture",
- "requires": ">=1.2.1",
+ "requires": ">=1.3.0",
"extras": null,
"marker": null
},
{
"package": "openadapt-flow",
- "requires": "==1.34.0",
+ "requires": "==2.4.1",
"extras": "browser,console",
"marker": "extra == \"build\""
},
@@ -517,30 +517,31 @@
},
{
"package": "openadapt-types",
- "requires": "==0.10.0",
+ "requires": "<0.25.0,>=0.24.0",
"extras": null,
"marker": null
}
],
"provenance": {
- "repository": "OpenAdaptAI/openadapt-desktop",
- "release_ref": "v0.16.0",
- "commit": "7c59750d37be09a2871cd1bada8cb0bce946d363",
- "tree": "9a1307794df6f2c77ee3dab90973845f3d08ee53",
- "url": "https://github.com/OpenAdaptAI/openadapt-desktop/tree/v0.16.0"
+ "repository": "OpenAdaptAI/OpenAdapt",
+ "release_ref": "openadapt-desktop-v0.25.1",
+ "commit": "b21a86d4a263f2bd8c4e8037e81f09457e998bdb",
+ "tree": "77acb2dfaab10e413f0d348ce98fbff9e24da752",
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/tree/openadapt-desktop-v0.25.1/packages/desktop",
+ "source_root": "packages/desktop"
},
"artifacts": [
{
"type": "bdist_wheel",
- "filename": "openadapt_desktop-0.16.0-py3-none-any.whl",
- "url": "https://files.pythonhosted.org/packages/46/15/a08ec0d22de26b8ad7d38a6496ea18eaebb669f3910b7472821d851e209d/openadapt_desktop-0.16.0-py3-none-any.whl",
- "sha256": "06e608a934deef56c93ee1ca8de511d6daba08459626e8245bd0db4c391e64e9"
+ "filename": "openadapt_desktop-0.25.1-py3-none-any.whl",
+ "url": "https://files.pythonhosted.org/packages/9c/fd/02310af2344b394cbc72901d73607b9816950e2246ce59d09e869bae916e/openadapt_desktop-0.25.1-py3-none-any.whl",
+ "sha256": "5f55ecffe173d0f7740cbbf011c19b763a495d9e1b37054f4f6ccf16a07a7be2"
},
{
"type": "sdist",
- "filename": "openadapt_desktop-0.16.0.tar.gz",
- "url": "https://files.pythonhosted.org/packages/82/6b/cd9bf7928765a71dab9f58b557499e05058c9ecee3ef30fd12963bd95729/openadapt_desktop-0.16.0.tar.gz",
- "sha256": "15f0c59a4d481328da76f3e5aa6a29ab8cdced8ab183c97346d69b4c14c996ff"
+ "filename": "openadapt_desktop-0.25.1.tar.gz",
+ "url": "https://files.pythonhosted.org/packages/1e/b3/f93c118e93d03ff41f3c4db961cae256d7bbd157542e870d3afb36b8dd0f/openadapt_desktop-0.25.1.tar.gz",
+ "sha256": "5a9c22996b76a0efbcfa87d3710d88611ab2feb772de284d7233b9d38b04241b"
}
]
},
@@ -604,51 +605,51 @@
"runtime_units": {
"launcher_environment": {
"kind": "launcher-environment",
- "version": "1.17.0",
+ "version": "1.19.0",
"source_component": "launcher",
"entry_point": "openadapt",
"requirements": {
- "openadapt": "==1.17.0",
- "openadapt-flow": "<3.0.0,>=2.0.0"
+ "openadapt": "==1.19.0",
+ "openadapt-flow": "<3.0.0,>=2.5.0"
},
"selected": {
- "openadapt": "1.17.0",
- "openadapt-flow": "2.5.0"
+ "openadapt": "1.19.0",
+ "openadapt-flow": "2.6.0"
}
},
"customer_runner": {
"kind": "customer-controlled-runner",
- "version": "2.5.0",
+ "version": "2.6.0",
"source_component": "flow",
"entry_point": "openadapt-flow",
"requirements": {
- "openadapt-flow": "==2.5.0",
+ "openadapt-flow": "==2.6.0",
"openadapt-types": "<0.25.0,>=0.24.0"
},
"selected": {
- "openadapt-flow": "2.5.0",
+ "openadapt-flow": "2.6.0",
"openadapt-types": "0.24.0"
}
},
"desktop_sidecar": {
"kind": "frozen-desktop-sidecar",
- "version": "0.16.0",
+ "version": "0.25.1",
"source_component": "desktop",
- "source_ref": "v0.16.0",
- "lock_url": "https://raw.githubusercontent.com/OpenAdaptAI/openadapt-desktop/v0.16.0/uv.lock",
- "lock_sha256": "9c2a57f02b96a7b505fba2b1cde0519968bd5744cd790cdb78bf86ce60008079",
+ "source_ref": "openadapt-desktop-v0.25.1",
+ "lock_url": "https://raw.githubusercontent.com/OpenAdaptAI/OpenAdapt/openadapt-desktop-v0.25.1/packages/desktop/uv.lock",
+ "lock_sha256": "7c06835915ca3314cf7f40630c4ac45a7e8329e3565c3dc96bf251fa845903bb",
"binary": "openadapt-engine",
"requirements": {
- "openadapt-flow": "==1.34.0",
- "openadapt-capture": ">=1.2.1",
+ "openadapt-flow": "==2.4.1",
+ "openadapt-capture": ">=1.3.0",
"openadapt-privacy": ">=1.0.0",
- "openadapt-types": "==0.10.0"
+ "openadapt-types": "<0.25.0,>=0.24.0"
},
"resolved": {
- "openadapt-capture": "1.2.1",
- "openadapt-flow": "1.34.0",
- "openadapt-privacy": "1.0.0",
- "openadapt-types": "0.10.0"
+ "openadapt-capture": "1.3.0",
+ "openadapt-flow": "2.4.1",
+ "openadapt-privacy": "1.1.3",
+ "openadapt-types": "0.24.0"
}
},
"agent_bridge": {
@@ -662,7 +663,7 @@
},
"selected": {
"openadapt-agent": "2.2.1",
- "openadapt-flow": "2.5.0"
+ "openadapt-flow": "2.6.0"
}
}
},
@@ -671,11 +672,11 @@
"scope": "desktop-sidecar-lock",
"source_role": "desktop",
"source_package": "openadapt-desktop",
- "source_version": "0.16.0",
+ "source_version": "0.25.1",
"target_role": "capture",
"target_package": "openadapt-capture",
- "requires": ">=1.2.1",
- "resolved": "1.2.1",
+ "requires": ">=1.3.0",
+ "resolved": "1.3.0",
"activations": [
{
"extras": null,
@@ -687,11 +688,11 @@
"scope": "desktop-sidecar-lock",
"source_role": "desktop",
"source_package": "openadapt-desktop",
- "source_version": "0.16.0",
+ "source_version": "0.25.1",
"target_role": "flow",
"target_package": "openadapt-flow",
- "requires": "==1.34.0",
- "resolved": "1.34.0",
+ "requires": "==2.4.1",
+ "resolved": "2.4.1",
"activations": [
{
"extras": "browser,console",
@@ -703,11 +704,11 @@
"scope": "desktop-sidecar-lock",
"source_role": "desktop",
"source_package": "openadapt-desktop",
- "source_version": "0.16.0",
+ "source_version": "0.25.1",
"target_role": "privacy",
"target_package": "openadapt-privacy",
"requires": ">=1.0.0",
- "resolved": "1.0.0",
+ "resolved": "1.1.3",
"activations": [
{
"extras": null,
@@ -719,11 +720,11 @@
"scope": "desktop-sidecar-lock",
"source_role": "desktop",
"source_package": "openadapt-desktop",
- "source_version": "0.16.0",
+ "source_version": "0.25.1",
"target_role": "types",
"target_package": "openadapt-types",
- "requires": "==0.10.0",
- "resolved": "0.10.0",
+ "requires": "<0.25.0,>=0.24.0",
+ "resolved": "0.24.0",
"activations": [
{
"extras": null,
@@ -739,7 +740,7 @@
"target_role": "flow",
"target_package": "openadapt-flow",
"requires": "<3,>=2.2.0",
- "resolved": "2.5.0",
+ "resolved": "2.6.0",
"activations": [
{
"extras": null,
@@ -791,7 +792,7 @@
"scope": "selected-platform",
"source_role": "flow",
"source_package": "openadapt-flow",
- "source_version": "2.5.0",
+ "source_version": "2.6.0",
"target_role": "capture",
"target_package": "openadapt-capture",
"requires": ">=1.2.0",
@@ -807,7 +808,7 @@
"scope": "selected-platform",
"source_role": "flow",
"source_package": "openadapt-flow",
- "source_version": "2.5.0",
+ "source_version": "2.6.0",
"target_role": "privacy",
"target_package": "openadapt-privacy",
"requires": ">=1.0.0",
@@ -823,7 +824,7 @@
"scope": "selected-platform",
"source_role": "flow",
"source_package": "openadapt-flow",
- "source_version": "2.5.0",
+ "source_version": "2.6.0",
"target_role": "types",
"target_package": "openadapt-types",
"requires": "<0.25.0,>=0.24.0",
@@ -839,7 +840,7 @@
"scope": "selected-platform",
"source_role": "launcher",
"source_package": "openadapt",
- "source_version": "1.17.0",
+ "source_version": "1.19.0",
"target_role": "agent",
"target_package": "openadapt-agent",
"requires": "<3,>=2.1.0",
@@ -863,7 +864,7 @@
"scope": "selected-platform",
"source_role": "launcher",
"source_package": "openadapt",
- "source_version": "1.17.0",
+ "source_version": "1.19.0",
"target_role": "capture",
"target_package": "openadapt-capture",
"requires": "<2.0.0,>=1.2.0",
@@ -887,11 +888,11 @@
"scope": "selected-platform",
"source_role": "launcher",
"source_package": "openadapt",
- "source_version": "1.17.0",
+ "source_version": "1.19.0",
"target_role": "flow",
"target_package": "openadapt-flow",
- "requires": "<3.0.0,>=2.0.0",
- "resolved": "2.5.0",
+ "requires": "<3.0.0,>=2.5.0",
+ "resolved": "2.6.0",
"activations": [
{
"extras": null,
@@ -979,19 +980,19 @@
],
"minimum": 1,
"maximum": 2,
- "source_commit": "5a3bf49a0bf2d662430386295a1c34036c064d58",
+ "source_commit": "1c832365d11e9dbe2a166485b13f7b8effd6d8d0",
"source_files": [
{
"path": "packages/flow/openadapt_flow/bundle_validation.py",
- "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/bundle_validation.py",
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/bundle_validation.py",
"git_blob": "78c30442341699d497d934699154a72fe213791d",
"sha256": "63532fb8e49f25a8aba8dccca505362a9293b8db9cbc0f2904dd8f9a6e23fea8"
},
{
"path": "packages/flow/openadapt_flow/ir.py",
- "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/ir.py",
- "git_blob": "fd235efbebf639c3f047eb0ca7421115733cfb85",
- "sha256": "efb7fdce6fa625f631901389ca767b016f4db3111caa2905321ff3da675e376d"
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/ir.py",
+ "git_blob": "494fa4722f0c76705b3e09f982c68938c5358e9d",
+ "sha256": "509e9ef8666ec65496b4b7afdd0b2bc8af4ba0663e64a4079ce1813950bf028e"
}
]
},
@@ -1108,11 +1109,11 @@
],
"minimum": 2,
"maximum": 2,
- "source_commit": "5a3bf49a0bf2d662430386295a1c34036c064d58",
+ "source_commit": "1c832365d11e9dbe2a166485b13f7b8effd6d8d0",
"source_files": [
{
"path": "packages/flow/openadapt_flow/console/decision_relay.py",
- "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/console/decision_relay.py",
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/console/decision_relay.py",
"git_blob": "297d2f71727f83496221091a4237d704c25665d6",
"sha256": "d5320404d4342dbb52be1f2ead1cdb5cf0e22877feaaa1e47974b301df697292"
}
@@ -1126,11 +1127,11 @@
],
"minimum": 1,
"maximum": 1,
- "source_commit": "5a3bf49a0bf2d662430386295a1c34036c064d58",
+ "source_commit": "1c832365d11e9dbe2a166485b13f7b8effd6d8d0",
"source_files": [
{
"path": "packages/flow/openadapt_flow/console/human_decisions.py",
- "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/console/human_decisions.py",
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/console/human_decisions.py",
"git_blob": "caaf87396aca4770eace5eead3fdf6515e31fbfc",
"sha256": "02651ad8888a5c17bfff6fb47165ba861193243dc0f7c951f8b94f544ca19477"
}
@@ -1146,11 +1147,11 @@
],
"minimum": 1,
"maximum": 3,
- "source_commit": "5a3bf49a0bf2d662430386295a1c34036c064d58",
+ "source_commit": "1c832365d11e9dbe2a166485b13f7b8effd6d8d0",
"source_files": [
{
"path": "packages/flow/openadapt_flow/runtime_validation.py",
- "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/openadapt_flow/runtime_validation.py",
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/openadapt_flow/runtime_validation.py",
"git_blob": "fd6121209e50abcab41bb8b70f95ff2647d9303f",
"sha256": "a5a220f570c5ee5769ac2f21d8d140bb69373d4de2ccc0ebfd08540122883f0e"
}
@@ -1170,7 +1171,7 @@
">=0.1.0"
],
"openadapt-flow": [
- ">=2.5.0,<3.0.0"
+ ">=2.6.0,<3.0.0"
],
"openadapt-grounding": [
">=0.1.0"
@@ -1236,10 +1237,10 @@
"repository": "OpenAdaptAI/OpenAdapt",
"path": "packages/flow/public-demo/evidence-packs",
"description": "Versioned public evidence packs with per-pack manifest files, replay evidence, and fault-case results.",
- "source_commit": "5a3bf49a0bf2d662430386295a1c34036c064d58",
+ "source_commit": "1c832365d11e9dbe2a166485b13f7b8effd6d8d0",
"source_object_type": "tree",
"source_object_sha": "2eac2252f62349e873b461866546dd0295169a19",
- "url": "https://github.com/OpenAdaptAI/OpenAdapt/tree/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/public-demo/evidence-packs"
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/tree/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/public-demo/evidence-packs"
},
{
"id": "flow-effectbench-task-pack",
@@ -1248,10 +1249,10 @@
"repository": "OpenAdaptAI/OpenAdapt",
"path": "packages/flow/benchmark/effectbench/task_pack/manifest.json",
"description": "Effect-verification benchmark task pack manifest used by the flow qualification harness.",
- "source_commit": "5a3bf49a0bf2d662430386295a1c34036c064d58",
+ "source_commit": "1c832365d11e9dbe2a166485b13f7b8effd6d8d0",
"source_object_type": "blob",
"source_object_sha": "1c568d2289342e10e3556c5c46cd08a0e370ac84",
- "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/5a3bf49a0bf2d662430386295a1c34036c064d58/packages/flow/benchmark/effectbench/task_pack/manifest.json"
+ "url": "https://github.com/OpenAdaptAI/OpenAdapt/blob/1c832365d11e9dbe2a166485b13f7b8effd6d8d0/packages/flow/benchmark/effectbench/task_pack/manifest.json"
}
],
"signature": {
diff --git a/pyproject.toml b/pyproject.toml
index a59fbe1195..42a50f5d4d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openadapt"
-version = "1.19.0"
+version = "1.20.0"
description = "Enters approved information into the apps your team already uses, checks that it saved, and stops for a person when something doesn't match."
# The package description is README.md with its lifecycle block swapped for a
# link to the live record; see hatch_build.py.
@@ -59,10 +59,9 @@ dependencies = [
# The quickstart's terminal view (MIT). Pure Python; the engine doesn't
# depend on it. Gated like the engine: without it the quickstart can't run.
"rich>=13.0.0; python_version < '3.13'",
- # Every Flow floor is 2.5.0: `openadapt shadow` forwards to Flow's shadow
- # command, and `openadapt verify serve` offers its recheck, which 2.4 and
- # earlier lack (tests/test_flow_floor.py).
- "openadapt-flow[browser,hosted]>=2.5.0,<3.0.0; python_version < '3.13'",
+ # Every Flow floor is 2.6.0: ledger listing uses its persistent owed-recheck
+ # API (tests/test_flow_floor.py).
+ "openadapt-flow[browser,hosted]>=2.6.0,<3.0.0; python_version < '3.13'",
# Day-1 partner kit: `pip install openadapt` must expose the
# `openadapt-agent` command without a second package. 2.1.0 adds Seal checks;
# `--bundles`; the bundle-free tutorial `serve --allow-run` needs a later
@@ -77,7 +76,7 @@ browser = [
# launcher now selects this Flow contract because the bundled quickstart
# uses the browser. OpenAdapt requests Chromium on first browser use after
# the host dependency check passes.
- "openadapt-flow[browser]>=2.5.0,<3.0.0; python_version < '3.13'",
+ "openadapt-flow[browser]>=2.6.0,<3.0.0; python_version < '3.13'",
]
# Local human desktop recording. Flow owns the supported capture adapter
# contract; the direct floor prevents an already-installed pre-1.0 Capture
@@ -85,22 +84,22 @@ browser = [
# separately provisioned executable, not a Python-package dependency.
capture = [
"openadapt-capture>=1.2.0,<2.0.0",
- "openadapt-flow[capture]>=2.5.0,<3.0.0; python_version < '3.13'",
+ "openadapt-flow[capture]>=2.6.0,<3.0.0; python_version < '3.13'",
]
# Replay substrate dependencies stay separate from capture: recording observes
# the human on the local interactive desktop, while replay may target a WAA
# agent, a native app, or a remote framebuffer.
windows = [
- "openadapt-flow[windows]>=2.5.0,<3.0.0; python_version < '3.13'",
+ "openadapt-flow[windows]>=2.6.0,<3.0.0; python_version < '3.13'",
]
macos = [
- "openadapt-flow[macos]>=2.5.0,<3.0.0; sys_platform == 'darwin' and python_version < '3.13'",
+ "openadapt-flow[macos]>=2.6.0,<3.0.0; sys_platform == 'darwin' and python_version < '3.13'",
]
linux = [
- "openadapt-flow[linux]>=2.5.0,<3.0.0; sys_platform == 'linux' and python_version < '3.13'",
+ "openadapt-flow[linux]>=2.6.0,<3.0.0; sys_platform == 'linux' and python_version < '3.13'",
]
rdp = [
- "openadapt-flow[rdp]>=2.5.0,<3.0.0; python_version < '3.13'",
+ "openadapt-flow[rdp]>=2.6.0,<3.0.0; python_version < '3.13'",
]
ml = [
"openadapt-ml>=0.2.0",
@@ -118,13 +117,13 @@ retrieval = [
"openadapt-retrieval>=0.1.0",
]
privacy = [
- "openadapt-flow[privacy]>=2.5.0,<3.0.0; python_version < '3.13'",
+ "openadapt-flow[privacy]>=2.6.0,<3.0.0; python_version < '3.13'",
]
# `flow` now ships in the base install (see `dependencies` above). This
# extra is kept for backward compatibility so `pip install openadapt[flow]`
# and the `all` bundle still resolve.
flow = [
- "openadapt-flow>=2.5.0,<3.0.0; python_version < '3.13'",
+ "openadapt-flow>=2.6.0,<3.0.0; python_version < '3.13'",
]
# `openadapt-agent` also ships in the base install. Keep the extra so
# `pip install openadapt[agent]` still resolves.
diff --git a/tests/test_cli_shell_hints.py b/tests/test_cli_shell_hints.py
index 129718ff3c..4dd431f04e 100644
--- a/tests/test_cli_shell_hints.py
+++ b/tests/test_cli_shell_hints.py
@@ -95,12 +95,12 @@ def test_deploy_console_hint_is_double_quoted(monkeypatch, supported_python):
"importlib.util.find_spec",
lambda name, *args: object() if name in present else None,
)
- monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.5.1")
+ monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.6.1")
result = CliRunner().invoke(cli_main, ["deploy"])
assert result.exit_code == 0, result.output
- assert '"openadapt-flow[console]==2.5.1"' in result.output
+ assert '"openadapt-flow[console]==2.6.1"' in result.output
assert not _UNQUOTED_SPEC.search(result.output), result.output
diff --git a/tests/test_cli_smoke.py b/tests/test_cli_smoke.py
index 91f17f2afc..0b08f91c71 100644
--- a/tests/test_cli_smoke.py
+++ b/tests/test_cli_smoke.py
@@ -380,29 +380,29 @@ def test_launcher_flow_and_substrate_extras_metadata():
assert (
metadata["dependencies"].count(
- f"openadapt-flow[browser,hosted]>=2.5.0,<3.0.0; {supported}"
+ f"openadapt-flow[browser,hosted]>=2.6.0,<3.0.0; {supported}"
)
== 1
)
assert (
metadata["dependencies"].count(f"openadapt-agent>=2.1.0,<3; {supported}") == 1
)
- assert extras["flow"] == [f"openadapt-flow>=2.5.0,<3.0.0; {supported}"]
+ assert extras["flow"] == [f"openadapt-flow>=2.6.0,<3.0.0; {supported}"]
assert extras["agent"] == [f"openadapt-agent>=2.1.0,<3; {supported}"]
- assert extras["browser"] == [f"openadapt-flow[browser]>=2.5.0,<3.0.0; {supported}"]
- assert extras["privacy"] == [f"openadapt-flow[privacy]>=2.5.0,<3.0.0; {supported}"]
+ assert extras["browser"] == [f"openadapt-flow[browser]>=2.6.0,<3.0.0; {supported}"]
+ assert extras["privacy"] == [f"openadapt-flow[privacy]>=2.6.0,<3.0.0; {supported}"]
assert extras["capture"] == [
"openadapt-capture>=1.2.0,<2.0.0",
- f"openadapt-flow[capture]>=2.5.0,<3.0.0; {supported}",
+ f"openadapt-flow[capture]>=2.6.0,<3.0.0; {supported}",
]
- assert extras["windows"] == [f"openadapt-flow[windows]>=2.5.0,<3.0.0; {supported}"]
+ assert extras["windows"] == [f"openadapt-flow[windows]>=2.6.0,<3.0.0; {supported}"]
assert extras["macos"] == [
- f"openadapt-flow[macos]>=2.5.0,<3.0.0; sys_platform == 'darwin' and {supported}"
+ f"openadapt-flow[macos]>=2.6.0,<3.0.0; sys_platform == 'darwin' and {supported}"
]
assert extras["linux"] == [
- f"openadapt-flow[linux]>=2.5.0,<3.0.0; sys_platform == 'linux' and {supported}"
+ f"openadapt-flow[linux]>=2.6.0,<3.0.0; sys_platform == 'linux' and {supported}"
]
- assert extras["rdp"] == [f"openadapt-flow[rdp]>=2.5.0,<3.0.0; {supported}"]
+ assert extras["rdp"] == [f"openadapt-flow[rdp]>=2.6.0,<3.0.0; {supported}"]
assert extras["all"] == [
"openadapt[browser,core,grounding,retrieval,privacy,flow,windows,rdp,agent]",
"openadapt[macos]; sys_platform == 'darwin'",
@@ -433,7 +433,7 @@ def test_released_flow_x11_sonames_are_case_corrected(monkeypatch):
)
-@pytest.mark.parametrize("version", ["2.5.0", "2.5.1", "2.99.0"])
+@pytest.mark.parametrize("version", ["2.6.0", "2.6.1", "2.99.0"])
def test_launcher_accepts_flow_versions_in_the_supported_range(version):
assert _supported_flow_version(version)
@@ -533,7 +533,7 @@ def test_deploy_native_backend_fails_without_its_platform_extra(
monkeypatch, backend, host, modules, install
):
_host(monkeypatch, host, {"openadapt_flow"})
- monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.5.0")
+ monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.6.0")
result = CliRunner().invoke(cli_main, ["deploy", "--backend", backend])
@@ -550,7 +550,7 @@ def test_deploy_native_backend_passes_with_its_platform_extra(
monkeypatch, backend, host, modules, install
):
_host(monkeypatch, host, {"openadapt_flow"} | modules)
- monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.5.0")
+ monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.6.0")
result = CliRunner().invoke(cli_main, ["deploy", "--backend", backend])
@@ -690,7 +690,7 @@ def test_deploy_preflight_composes_existing_flow_interfaces_without_secrets(
else None
),
)
- monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.5.0")
+ monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.6.0")
monkeypatch.setenv("BYOC_CONNECTOR_TOKEN", "connector-token-value")
result = CliRunner().invoke(
cli_main,
@@ -715,13 +715,13 @@ def test_deploy_base_hosted_install_gives_conditional_console_setup(monkeypatch)
"importlib.util.find_spec",
lambda name: object() if name in {"openadapt_flow", "aardwolf"} else None,
)
- monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.5.0")
+ monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.6.0")
result = CliRunner().invoke(cli_main, ["deploy", "--backend", "rdp"])
assert result.exit_code == 0, result.output
assert "optional local operator console is not installed" in result.output
- assert 'python -m pip install "openadapt-flow[console]==2.5.0"' in result.output
+ assert 'python -m pip install "openadapt-flow[console]==2.6.0"' in result.output
assert "openadapt flow console --bundles" not in result.output
assert "Re-run this preflight" in result.output
@@ -736,13 +736,13 @@ def test_deploy_console_requires_openadapt_types(monkeypatch):
else None
),
)
- monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.5.0")
+ monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.6.0")
result = CliRunner().invoke(cli_main, ["deploy", "--backend", "rdp"])
assert result.exit_code == 0, result.output
assert "optional local operator console is not installed" in result.output
- assert 'python -m pip install "openadapt-flow[console]==2.5.0"' in result.output
+ assert 'python -m pip install "openadapt-flow[console]==2.6.0"' in result.output
assert "openadapt flow console --bundles" not in result.output
@@ -767,7 +767,7 @@ def test_deploy_preflight_fails_without_web_runtime(monkeypatch):
"importlib.util.find_spec",
lambda name: object() if name == "openadapt_flow" else None,
)
- monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.5.0")
+ monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.6.0")
result = CliRunner().invoke(cli_main, ["deploy", "--backend", "web"])
@@ -785,7 +785,7 @@ def test_deploy_preflight_fails_without_rdp_transport(monkeypatch):
"importlib.util.find_spec",
lambda name: object() if name == "openadapt_flow" else None,
)
- monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.5.0")
+ monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.6.0")
result = CliRunner().invoke(cli_main, ["deploy", "--backend", "rdp"])
@@ -807,7 +807,7 @@ def test_deploy_preflight_fails_for_unsupported_flow(monkeypatch, flow_version):
assert result.exit_code != 0
assert "[UNSUPPORTED]" in result.output
- assert ">=2.5.0,<3.0.0" in result.output
+ assert ">=2.6.0,<3.0.0" in result.output
assert "Preflight passed" not in result.output
diff --git a/tests/test_deploy_preflight_readiness.py b/tests/test_deploy_preflight_readiness.py
index d1eef428ad..12ff5ac351 100644
--- a/tests/test_deploy_preflight_readiness.py
+++ b/tests/test_deploy_preflight_readiness.py
@@ -29,7 +29,7 @@ def _deploy(monkeypatch, args, installed=READY_WEB, host=None):
"importlib.util.find_spec",
lambda name: object() if name in installed else None,
)
- monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.5.0")
+ monkeypatch.setattr("importlib.metadata.version", lambda _name: "2.6.0")
return CliRunner().invoke(cli_main, ["deploy", *args])
diff --git a/tests/test_flow_floor.py b/tests/test_flow_floor.py
index 751df09bcb..21c03b77c4 100644
--- a/tests/test_flow_floor.py
+++ b/tests/test_flow_floor.py
@@ -24,10 +24,10 @@
import tomli as tomllib
ROOT = Path(__file__).resolve().parents[1]
-# Launcher 1.19 requires Flow 2.5 (`openadapt shadow` and the recheck that
-# `openadapt verify serve` offers), so 1.x and 2.0 to 2.4 are below the floor.
-BELOW_FLOOR = ["1.29.0", "1.35.1", "2.0.0", "2.2.0", "2.4.1"]
-ACCEPTED = "2.5.0"
+# Launcher 1.20 requires Flow 2.6's persistent owed-recheck API.
+# Keep every earlier rejection case, including the former 2.5 floor.
+BELOW_FLOOR = ["1.29.0", "1.35.1", "2.0.0", "2.2.0", "2.4.1", "2.5.0", "2.5.1"]
+ACCEPTED = "2.6.0"
def _flow_requirements() -> list[Requirement]:
diff --git a/tests/test_verify_command.py b/tests/test_verify_command.py
index 088b6e00c1..9ce361a041 100644
--- a/tests/test_verify_command.py
+++ b/tests/test_verify_command.py
@@ -103,3 +103,30 @@ def test_verify_ledger_lists_and_releases_a_held_write(tmp_path) -> None:
assert released.exit_code == 0, released.output
listed = runner.invoke(main, ["verify", "ledger", "list", "--ledger", str(folder)])
assert "No held or open writes." in listed.output
+
+
+def test_verify_ledger_lists_a_recheck_owed_until_it_runs(tmp_path) -> None:
+ ledger_mod = pytest.importorskip("openadapt_flow.write_ledger")
+ folder = tmp_path / "ledger"
+ ledger = ledger_mod.Ledger(ledger_mod.FileLedger(folder))
+ key = "d" * 64
+ due = "2026-01-01T00:02:00Z"
+ ledger.begun(key, "write-2", contract="c" * 64, actor_kind="agent", actor_id="bot")
+ ledger.resolved(
+ key,
+ "write-2",
+ outcome="CONFIRMED",
+ retry_safe=False,
+ delivered=True,
+ result={"outcome": "CONFIRMED", "provisional": True, "recheck_due_at": due},
+ )
+ runner = CliRunner()
+ listed = runner.invoke(main, ["verify", "ledger", "list", "--ledger", str(folder)])
+ assert listed.exit_code == 0, listed.output
+ assert key in listed.output and "recheck-owed" in listed.output
+ assert f"due {due}" in listed.output
+
+ ledger.rechecked(key, "write-2", outcome="CONFIRMED")
+ listed = runner.invoke(main, ["verify", "ledger", "list", "--ledger", str(folder)])
+ assert "recheck-owed" not in listed.output
+ assert "No rechecks owed." in listed.output
diff --git a/uv.lock b/uv.lock
index 9b636a0e1b..48a0fc1748 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1,5 +1,5 @@
version = 1
-revision = 3
+revision = 5
requires-python = ">=3.10"
resolution-markers = [
"python_full_version >= '3.14' and sys_platform == 'win32'",
@@ -7,10 +7,10 @@ resolution-markers = [
"python_full_version == '3.13.*' and sys_platform == 'win32'",
"python_full_version == '3.13.*' and sys_platform != 'win32'",
"python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'darwin'",
- "python_full_version < '3.11' and sys_platform == 'darwin'",
"python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'linux'",
- "python_full_version < '3.11' and sys_platform == 'linux'",
"python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'darwin' and sys_platform != 'linux'",
+ "python_full_version < '3.11' and sys_platform == 'darwin'",
+ "python_full_version < '3.11' and sys_platform == 'linux'",
"python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'",
"python_full_version < '3.11' and sys_platform == 'win32'",
]
@@ -525,7 +525,7 @@ name = "build"
version = "1.5.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "colorama", marker = "(python_full_version >= '3.13' and os_name == 'nt' and sys_platform == 'darwin') or (python_full_version >= '3.13' and os_name == 'nt' and sys_platform == 'linux') or (os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux')" },
+ { name = "colorama", marker = "(python_full_version >= '3.13' and os_name == 'nt') or (os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux')" },
{ name = "importlib-metadata", marker = "python_full_version < '3.10.2'" },
{ name = "packaging" },
{ name = "pyproject-hooks" },
@@ -3132,6 +3132,7 @@ source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version < '3.11' and sys_platform == 'darwin'",
"python_full_version < '3.11' and sys_platform == 'linux'",
+ "python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'",
"python_full_version < '3.11' and sys_platform == 'win32'",
]
dependencies = [
@@ -3167,21 +3168,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b6/ca/862b1e7a639460f0ca25fd5b6135fb42cf9deea86d398a92e44dfda2279d/onnxruntime-1.23.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2b9233c4947907fd1818d0e581c049c41ccc39b2856cc942ff6d26317cee145", size = 17394184, upload-time = "2025-10-22T03:47:08.127Z" },
]
-[[package]]
-name = "onnxruntime"
-version = "1.24.3"
-source = { registry = "https://pypi.org/simple" }
-resolution-markers = [
- "python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'",
-]
-dependencies = [
- { name = "flatbuffers" },
- { name = "numpy" },
- { name = "packaging" },
- { name = "protobuf" },
- { name = "sympy" },
-]
-
[[package]]
name = "onnxruntime"
version = "1.27.0"
@@ -3245,7 +3231,7 @@ wheels = [
[[package]]
name = "openadapt"
-version = "1.19.0"
+version = "1.20.0"
source = { editable = "." }
dependencies = [
{ name = "click" },
@@ -3335,15 +3321,15 @@ requires-dist = [
{ name = "openadapt-agent", marker = "python_full_version < '3.13' and extra == 'agent'", specifier = ">=2.1.0,<3" },
{ name = "openadapt-capture", marker = "extra == 'capture'", specifier = ">=1.2.0,<2.0.0" },
{ name = "openadapt-evals", marker = "extra == 'evals'", specifier = ">=0.1.0" },
- { name = "openadapt-flow", marker = "python_full_version < '3.13' and extra == 'flow'", specifier = ">=2.5.0,<3.0.0" },
- { name = "openadapt-flow", extras = ["browser"], marker = "python_full_version < '3.13' and extra == 'browser'", specifier = ">=2.5.0,<3.0.0" },
- { name = "openadapt-flow", extras = ["browser", "hosted"], marker = "python_full_version < '3.13'", specifier = ">=2.5.0,<3.0.0" },
- { name = "openadapt-flow", extras = ["capture"], marker = "python_full_version < '3.13' and extra == 'capture'", specifier = ">=2.5.0,<3.0.0" },
- { name = "openadapt-flow", extras = ["linux"], marker = "python_full_version < '3.13' and sys_platform == 'linux' and extra == 'linux'", specifier = ">=2.5.0,<3.0.0" },
- { name = "openadapt-flow", extras = ["macos"], marker = "python_full_version < '3.13' and sys_platform == 'darwin' and extra == 'macos'", specifier = ">=2.5.0,<3.0.0" },
- { name = "openadapt-flow", extras = ["privacy"], marker = "python_full_version < '3.13' and extra == 'privacy'", specifier = ">=2.5.0,<3.0.0" },
- { name = "openadapt-flow", extras = ["rdp"], marker = "python_full_version < '3.13' and extra == 'rdp'", specifier = ">=2.5.0,<3.0.0" },
- { name = "openadapt-flow", extras = ["windows"], marker = "python_full_version < '3.13' and extra == 'windows'", specifier = ">=2.5.0,<3.0.0" },
+ { name = "openadapt-flow", marker = "python_full_version < '3.13' and extra == 'flow'", specifier = ">=2.6.0,<3.0.0" },
+ { name = "openadapt-flow", extras = ["browser"], marker = "python_full_version < '3.13' and extra == 'browser'", specifier = ">=2.6.0,<3.0.0" },
+ { name = "openadapt-flow", extras = ["browser", "hosted"], marker = "python_full_version < '3.13'", specifier = ">=2.6.0,<3.0.0" },
+ { name = "openadapt-flow", extras = ["capture"], marker = "python_full_version < '3.13' and extra == 'capture'", specifier = ">=2.6.0,<3.0.0" },
+ { name = "openadapt-flow", extras = ["linux"], marker = "python_full_version < '3.13' and sys_platform == 'linux' and extra == 'linux'", specifier = ">=2.6.0,<3.0.0" },
+ { name = "openadapt-flow", extras = ["macos"], marker = "python_full_version < '3.13' and sys_platform == 'darwin' and extra == 'macos'", specifier = ">=2.6.0,<3.0.0" },
+ { name = "openadapt-flow", extras = ["privacy"], marker = "python_full_version < '3.13' and extra == 'privacy'", specifier = ">=2.6.0,<3.0.0" },
+ { name = "openadapt-flow", extras = ["rdp"], marker = "python_full_version < '3.13' and extra == 'rdp'", specifier = ">=2.6.0,<3.0.0" },
+ { name = "openadapt-flow", extras = ["windows"], marker = "python_full_version < '3.13' and extra == 'windows'", specifier = ">=2.6.0,<3.0.0" },
{ name = "openadapt-grounding", marker = "extra == 'grounding'", specifier = ">=0.1.0" },
{ name = "openadapt-ml", marker = "extra == 'ml'", specifier = ">=0.2.0" },
{ name = "openadapt-retrieval", marker = "extra == 'retrieval'", specifier = ">=0.1.0" },
@@ -3437,7 +3423,7 @@ wheels = [
[[package]]
name = "openadapt-flow"
-version = "2.5.0"
+version = "2.6.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cryptography" },
@@ -3452,9 +3438,9 @@ dependencies = [
{ name = "rapidocr-onnxruntime" },
{ name = "tomli", marker = "python_full_version < '3.11' or python_full_version >= '3.13'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/b3/9e/c4b87cfdba0b1ae03d57062bad41686cb9b3affd46e901ee1749fcf1e5b8/openadapt_flow-2.5.0.tar.gz", hash = "sha256:54d99e77976ee7d9e6bc171b2ea148497528ead77b226fdf6fd4713b37c689b3", size = 31358408, upload-time = "2026-11-03T00:16:39.944Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/7c/e6/dbe17ef0adf7c0f66e762eb30d49bdf3cb665fe43b400b6b7e6ae1b3c590/openadapt_flow-2.6.0.tar.gz", hash = "sha256:4f1b2b9e28ec666c0e50ef2593d985ba387efc42bfb9b8f9f24148f6c8085112", size = 33981672, upload-time = "2026-11-04T22:21:34.154Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/7d/7b/76f2027c37fd059c0c1409cd6ca6c995da13fc5891c40b138f9b0cf1362f/openadapt_flow-2.5.0-py3-none-any.whl", hash = "sha256:1dbc5d42d103cfa8a452d95805dde60c7d460035ec4d81df5cc642a32f118339", size = 4335676, upload-time = "2026-11-03T00:16:37.35Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/a8/4cdb822b1245b47cbc80a27d30ab285e0239e1bc5d69b2077ce5495dbb93/openadapt_flow-2.6.0-py3-none-any.whl", hash = "sha256:43718301bdb2579b1a78c60dfc025e8d60f2be9a3bc4172894c4194e0600fa9a", size = 4390728, upload-time = "2026-11-04T22:21:30.764Z" },
]
[package.optional-dependencies]
@@ -4828,8 +4814,7 @@ version = "1.4.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy" },
- { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.13' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version >= '3.13' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32') or (python_full_version >= '3.13' and sys_platform == 'win32')" },
- { name = "onnxruntime", version = "1.24.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32') or (python_full_version >= '3.13' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" },
+ { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or python_full_version >= '3.13'" },
{ name = "onnxruntime", version = "1.27.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.13'" },
{ name = "opencv-python" },
{ name = "pillow" },