Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
171 commits
Select commit Hold shift + click to select a range
1ac439a
browser: ignore the local environment and caches
AmanSwar Oct 3, 2026
ff83e95
browser: pin Python 3.12
AmanSwar Oct 3, 2026
5cb9592
browser: wally-browser package, browser-use pinned to 0.13.10
AmanSwar Oct 3, 2026
fcfe9dc
browser: lockfile
AmanSwar Oct 3, 2026
7a1bcf1
browser: turn browser-use telemetry and cloud sync off before import
AmanSwar Oct 3, 2026
dbfcec3
browser: hard stops for payment, commit clicks, sensitive fields and …
AmanSwar Oct 3, 2026
c2b4dd8
browser: traveller profile that refuses payment data
AmanSwar Oct 3, 2026
9f2c3d6
browser: compact element table, token estimate, regions for over 26
AmanSwar Oct 3, 2026
cc5b62a
browser: decision API client with retries and window refusals
AmanSwar Oct 3, 2026
a1938f4
browser: eve policy, one request per step with speculative targets
AmanSwar Oct 3, 2026
c42832e
browser: GLM for the plan and non-personal field text
AmanSwar Oct 3, 2026
7994855
browser: dismiss confirm and beforeunload dialogs instead of accepting
AmanSwar Oct 3, 2026
563813b
browser: narrowed and guarded browser-use actions, ask_user
AmanSwar Oct 3, 2026
98f1ed5
browser: EveAgent, eve picks each step and page rules stop the run
AmanSwar Oct 3, 2026
0a5ef76
browser: entry point Wally launches
AmanSwar Oct 3, 2026
962a60d
browser: python -m wally_browser
AmanSwar Oct 3, 2026
3d03a57
browser tests: package marker
AmanSwar Oct 3, 2026
23c3e71
browser tests: hard stops
AmanSwar Oct 3, 2026
76c8f23
browser tests: traveller profile
AmanSwar Oct 3, 2026
65ff4b6
browser tests: policy limits, regions, value heads, client
AmanSwar Oct 3, 2026
c3c829d
browser tests: local travel site and an over-eager fake decision API
AmanSwar Oct 3, 2026
24d15c1
browser tests: end to end in Chromium, stops at payment
AmanSwar Oct 3, 2026
470c421
guards: pay words in any label part win, wider pay and card/OTP wording
AmanSwar Oct 3, 2026
db279c5
elements: guards read the unclipped full text
AmanSwar Oct 3, 2026
90f3d2b
tools: guard every action at execute_action, refuse coordinate clicks
AmanSwar Oct 3, 2026
daf8f60
profile: a value goes only into a field whose label matches its kind
AmanSwar Oct 3, 2026
443cfbd
agent: frames from this page, outcomes back to eve, model calls off t…
AmanSwar Oct 3, 2026
c420caa
run: step timeouts long enough for a person
AmanSwar Oct 3, 2026
2ad6293
guard tests: the M1 review probes
AmanSwar Oct 3, 2026
bb942c1
tool tests: the guard survives re-registered actions
AmanSwar Oct 3, 2026
107f6ba
agent rule tests: frames, outcomes, profile fields
AmanSwar Oct 3, 2026
f052f0f
browser-use: the command, models, session check and uv launch
AmanSwar Oct 3, 2026
68f69cd
commands: register browser-use
AmanSwar Oct 3, 2026
c73f8e6
app: wire browser-use, hidden from help in this draft
AmanSwar Oct 3, 2026
e68a499
guards: normalised text, identifiers split, wider words, link and hel…
AmanSwar Oct 3, 2026
3e05b31
elements: shadow-root text, head and tail, dialog context, card-numbe…
AmanSwar Oct 3, 2026
acfd59d
tools: confirm every click on checkout pages and in attach mode, live…
AmanSwar Oct 3, 2026
1c0233f
profile: no profile value goes into a card, wallet or UPI form
AmanSwar Oct 3, 2026
b1b0b11
agent: guard context per page, breadth-first frames, tracked frames f…
AmanSwar Oct 3, 2026
9d3538f
run: attach mode confirms every click and typed value
AmanSwar Oct 3, 2026
92ad21d
e2e: the person confirms clicks on checkout pages
AmanSwar Oct 3, 2026
9a30734
guard tests: the round-2 adversarial probes
AmanSwar Oct 3, 2026
a2d9abe
tests: capture a real page as a guard fixture
AmanSwar Oct 3, 2026
8644e86
tests: real checkout and docs page fixtures (public pages, no persona…
AmanSwar Oct 3, 2026
3d2c862
tests: guards against real page markup
AmanSwar Oct 3, 2026
6d0f98a
guards: booking verbs, price buttons, money dialogs, whole-URL checko…
AmanSwar Oct 3, 2026
ff26ed2
elements: custom modals give context, eve's targets match the guard's…
AmanSwar Oct 3, 2026
384c4df
tools: confirm everything once details are typed, dropdown options ch…
AmanSwar Oct 3, 2026
52d3269
profile: no traveller details in others', marketing or misread fields
AmanSwar Oct 3, 2026
0050996
agent: no profile values into third-party frames
AmanSwar Oct 3, 2026
c168d53
run: a fresh browser profile per run; a kept one confirms everything
AmanSwar Oct 3, 2026
62cd3d7
e2e: confirmations after details are entered
AmanSwar Oct 3, 2026
d33f7fc
guard tests: the round-3 adversarial probes and structural rules
AmanSwar Oct 3, 2026
eb6a819
guards: values checked as well as fields, reservation pages are check…
AmanSwar Oct 3, 2026
2203cfb
tools: refuse card, UPI and OTP values; confirm everything after a ha…
AmanSwar Oct 3, 2026
8b0c368
agent: details-entered follows the value's source; no model guesses o…
AmanSwar Oct 3, 2026
4a30e5f
guard tests: the round-4 adversarial probes
AmanSwar Oct 3, 2026
a4e2497
guards: checkout-mode signals (booking URLs, details forms), wider va…
AmanSwar Oct 3, 2026
fd8dce4
tools: sticky checkout mode, selects rated by the real option, prompt…
AmanSwar Oct 3, 2026
72af848
agent: checkout mode sticks for the run; no model values that look pe…
AmanSwar Oct 3, 2026
8bf8aa0
profile: numbered traveller slots are asked about
AmanSwar Oct 3, 2026
5cf984a
guard tests: round-5 probes and checkout mode
AmanSwar Oct 3, 2026
d3ff73e
elements: an iframe with no src is still a frame
AmanSwar Oct 3, 2026
fb5ebe4
guards: OTP allow-list on whole words, 7-8 digit codes, card Luhn ove…
AmanSwar Oct 3, 2026
3471475
profile: more ways of naming another traveller's slot
AmanSwar Oct 3, 2026
2fa4ac5
tools: guard answers keep confirmation on, ARIA options resolved, no …
AmanSwar Oct 3, 2026
c13757b
agent: one details rule shared with the guards, one field per profile…
AmanSwar Oct 3, 2026
e27f33c
guard tests: round 4 uses the shared details rule
AmanSwar Oct 3, 2026
ac92b75
guard tests: the round-6 typing-path probes
AmanSwar Oct 3, 2026
8d45a4b
browser-use: ship the python agent and stop the dock freeze, repeat a…
Siddhesh2377 Oct 9, 2026
19a0930
browser-use: keep the session open, send the page image, and reuse Ch…
Siddhesh2377 Oct 9, 2026
eed4610
browser-use: preserve Chrome on interrupt, cancel the agent when the …
coderabbitai[bot] Oct 9, 2026
0c05baa
browser-use: run the jev loop on eve and leave the results tab open
Siddhesh2377 Oct 12, 2026
23cc6da
decisions: accept 255 options in a choice
Siddhesh2377 Oct 12, 2026
4f79304
ci: restore the swift checkout and the decisions contract
Siddhesh2377 Oct 12, 2026
0e7f22b
browser-use: stop before payment and reject a target every chunk refused
Siddhesh2377 Oct 12, 2026
782780e
browser-use: block charge and card fields without stopping a postal PIN
Siddhesh2377 Oct 12, 2026
92dacd4
browser: wally-browser package, browser-use pinned to 0.13.10
AmanSwar Oct 3, 2026
8ac0fe6
browser: lockfile
AmanSwar Oct 3, 2026
9c0fb3b
browser: turn browser-use telemetry and cloud sync off before import
AmanSwar Oct 3, 2026
8d00f23
browser: hard stops for payment, commit clicks, sensitive fields and …
AmanSwar Oct 3, 2026
f32e50c
browser: traveller profile that refuses payment data
AmanSwar Oct 3, 2026
27ac138
browser: compact element table, token estimate, regions for over 26
AmanSwar Oct 3, 2026
97c133f
browser: decision API client with retries and window refusals
AmanSwar Oct 3, 2026
76976d0
browser: eve policy, one request per step with speculative targets
AmanSwar Oct 3, 2026
b8904fb
browser: GLM for the plan and non-personal field text
AmanSwar Oct 3, 2026
34b8a6b
browser: dismiss confirm and beforeunload dialogs instead of accepting
AmanSwar Oct 3, 2026
1a6f7b4
browser: narrowed and guarded browser-use actions, ask_user
AmanSwar Oct 3, 2026
21472af
browser: EveAgent, eve picks each step and page rules stop the run
AmanSwar Oct 3, 2026
7b7d9d4
browser: entry point Wally launches
AmanSwar Oct 3, 2026
eebce5b
browser: python -m wally_browser
AmanSwar Oct 3, 2026
4ea57c5
browser tests: hard stops
AmanSwar Oct 3, 2026
7793656
browser tests: traveller profile
AmanSwar Oct 3, 2026
4b4c824
browser tests: policy limits, regions, value heads, client
AmanSwar Oct 3, 2026
e7de635
browser tests: end to end in Chromium, stops at payment
AmanSwar Oct 3, 2026
9e59540
guards: pay words in any label part win, wider pay and card/OTP wording
AmanSwar Oct 3, 2026
2fa061d
elements: guards read the unclipped full text
AmanSwar Oct 3, 2026
efb1b93
tools: guard every action at execute_action, refuse coordinate clicks
AmanSwar Oct 3, 2026
7391de9
profile: a value goes only into a field whose label matches its kind
AmanSwar Oct 3, 2026
faa3010
agent: frames from this page, outcomes back to eve, model calls off t…
AmanSwar Oct 3, 2026
c59b215
run: step timeouts long enough for a person
AmanSwar Oct 3, 2026
4207277
guard tests: the M1 review probes
AmanSwar Oct 3, 2026
5e8465d
tool tests: the guard survives re-registered actions
AmanSwar Oct 3, 2026
eb03c36
agent rule tests: frames, outcomes, profile fields
AmanSwar Oct 3, 2026
588e58a
browser-use: the command, models, session check and uv launch
AmanSwar Oct 3, 2026
d5e2c6c
commands: register browser-use
AmanSwar Oct 3, 2026
faa6c37
guards: normalised text, identifiers split, wider words, link and hel…
AmanSwar Oct 3, 2026
d7dc853
elements: shadow-root text, head and tail, dialog context, card-numbe…
AmanSwar Oct 3, 2026
2680ca4
tools: confirm every click on checkout pages and in attach mode, live…
AmanSwar Oct 3, 2026
35cb6c7
profile: no profile value goes into a card, wallet or UPI form
AmanSwar Oct 3, 2026
230a5a2
agent: guard context per page, breadth-first frames, tracked frames f…
AmanSwar Oct 3, 2026
76d34dd
run: attach mode confirms every click and typed value
AmanSwar Oct 3, 2026
cc35f2b
e2e: the person confirms clicks on checkout pages
AmanSwar Oct 3, 2026
bc7d767
guard tests: the round-2 adversarial probes
AmanSwar Oct 3, 2026
7562dfd
tests: capture a real page as a guard fixture
AmanSwar Oct 3, 2026
7dc48f1
tests: guards against real page markup
AmanSwar Oct 3, 2026
0ebfec6
guards: booking verbs, price buttons, money dialogs, whole-URL checko…
AmanSwar Oct 3, 2026
35c5bd7
elements: custom modals give context, eve's targets match the guard's…
AmanSwar Oct 3, 2026
ed13e6d
tools: confirm everything once details are typed, dropdown options ch…
AmanSwar Oct 3, 2026
83f79cd
profile: no traveller details in others', marketing or misread fields
AmanSwar Oct 3, 2026
a4c0db1
agent: no profile values into third-party frames
AmanSwar Oct 3, 2026
c7e23e1
run: a fresh browser profile per run; a kept one confirms everything
AmanSwar Oct 3, 2026
8b2306a
e2e: confirmations after details are entered
AmanSwar Oct 3, 2026
727d2a8
guard tests: the round-3 adversarial probes and structural rules
AmanSwar Oct 3, 2026
d113181
guards: values checked as well as fields, reservation pages are check…
AmanSwar Oct 3, 2026
4791403
tools: refuse card, UPI and OTP values; confirm everything after a ha…
AmanSwar Oct 3, 2026
c93cb70
agent: details-entered follows the value's source; no model guesses o…
AmanSwar Oct 3, 2026
e017a1a
guard tests: the round-4 adversarial probes
AmanSwar Oct 3, 2026
ea81b67
guards: checkout-mode signals (booking URLs, details forms), wider va…
AmanSwar Oct 3, 2026
027565d
tools: sticky checkout mode, selects rated by the real option, prompt…
AmanSwar Oct 3, 2026
49c0cf5
agent: checkout mode sticks for the run; no model values that look pe…
AmanSwar Oct 3, 2026
6479973
profile: numbered traveller slots are asked about
AmanSwar Oct 3, 2026
8d4924a
guard tests: round-5 probes and checkout mode
AmanSwar Oct 3, 2026
d18bf46
elements: an iframe with no src is still a frame
AmanSwar Oct 3, 2026
03f9df4
guards: OTP allow-list on whole words, 7-8 digit codes, card Luhn ove…
AmanSwar Oct 3, 2026
57db96a
profile: more ways of naming another traveller's slot
AmanSwar Oct 3, 2026
888981e
tools: guard answers keep confirmation on, ARIA options resolved, no …
AmanSwar Oct 3, 2026
24f0c21
agent: one details rule shared with the guards, one field per profile…
AmanSwar Oct 3, 2026
cdb3bc6
guard tests: round 4 uses the shared details rule
AmanSwar Oct 3, 2026
52c9666
guard tests: the round-6 typing-path probes
AmanSwar Oct 3, 2026
a54d9ec
browser-use: ship the python agent and stop the dock freeze, repeat a…
Siddhesh2377 Oct 9, 2026
57388cf
browser-use: keep the session open, send the page image, and reuse Ch…
Siddhesh2377 Oct 9, 2026
032de18
browser-use: preserve Chrome on interrupt, cancel the agent when the …
coderabbitai[bot] Oct 9, 2026
9706972
browser-use: run the jev loop on eve and leave the results tab open
Siddhesh2377 Oct 12, 2026
b59b16e
decisions: accept 255 options in a choice
Siddhesh2377 Oct 12, 2026
7a64fbb
swift: pin the MLX host checkout to 0.20.39
Siddhesh2377 Oct 12, 2026
cd9b6af
ci: restore the swift checkout and the decisions contract
Siddhesh2377 Oct 12, 2026
a4fe995
browser-use: stop before payment and reject a target every chunk refused
Siddhesh2377 Oct 12, 2026
7bf80f8
browser-use: block charge and card fields without stopping a postal PIN
Siddhesh2377 Oct 12, 2026
d89dba2
rebase: keep main's sdk pin and chatgpt/codex modules
Siddhesh2377 Oct 30, 2026
7054e36
package: ship jev_ultrafast in the browser bottle
Siddhesh2377 Oct 30, 2026
f33fb7a
browser-use: see and click opacity-0 checkboxes and radios
Siddhesh2377 Oct 30, 2026
e047c9a
browser-use: deepseek text model, jev-latest on another gateway, Jev …
Siddhesh2377 Oct 30, 2026
8580bbf
contracts: generate the systemone binding and check it with the others
Siddhesh2377 Oct 31, 2026
5843833
browser-use: run the agent in Rust, with iframe, shadow DOM and patte…
Siddhesh2377 Oct 31, 2026
4a2e113
browser-use: ask a final round among each group's best when every gro…
Siddhesh2377 Oct 31, 2026
20b0583
browser-use: attach to the person's own Chrome through chrome://inspe…
Siddhesh2377 Oct 31, 2026
cb16b5b
browser-use: refuse commit buttons on money pages, type only where fo…
Siddhesh2377 Oct 31, 2026
6ed10dd
browser-use: select text in code and check focus right before typing,…
Siddhesh2377 Oct 31, 2026
ee3f16d
Merge pull request #231 from RunanywhereAI/feat/browser-use-rust
Siddhesh2377 Oct 31, 2026
b762c7f
browser-use: keep prompts and fixtures LF on Windows, wait for an att…
Siddhesh2377 Oct 31, 2026
4bef2ad
tests: pass SystemRoot to browser-use runs so Windows sockets initialise
Siddhesh2377 Oct 31, 2026
32891bb
tests: pass Windows system and temp dirs to browser-use runs; give /j…
Siddhesh2377 Oct 31, 2026
edf463b
browser-use: date inputs, payment forms in any language, inner scroll…
Siddhesh2377 Oct 31, 2026
f48ebd8
browser-use: judge pay and order buttons at any length, refuse card e…
Siddhesh2377 Oct 31, 2026
7f61837
tests: probe each loopback name for the test Chrome and stop the fake…
Siddhesh2377 Oct 31, 2026
86e549c
tests: send beacons synchronously and serve cross-origin frames from …
Siddhesh2377 Oct 31, 2026
e6d448d
browser-use: refuse expiry-style date fills by label and whenever a c…
Siddhesh2377 Oct 31, 2026
f46220a
Merge pull request #232 from RunanywhereAI/feat/browser-use-complex
Siddhesh2377 Oct 31, 2026
b5e576d
tests: fake model leaves an already-checked checkbox or radio alone
Siddhesh2377 Oct 31, 2026
77d8542
browser-use: fix review findings on guards, focus, selects, dates, go…
Siddhesh2377 Nov 1, 2026
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
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,9 @@ contracts/wally-decisions-public-v1.openapi.json -text
# The golden CLI corpus is compared byte for byte (tests/cli_golden.rs and
# cli_formatter's own fixture tests); a CRLF checkout would fail every case.
tests/golden/** -text
# browser-use sends these prompts to the decision model and its tests compare
# the request byte for byte with one recorded live; a CRLF checkout would
# change both. The page scripts and recorded fixtures stay LF for the same reason.
src/browser/prompts/*.txt -text
src/browser/js/*.js -text
tests/fixtures/browser/** -text
124 changes: 120 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ sha2 = "0.10"
hex = "0.4"
getrandom = "0.3"
ctrlc = { version = "3", features = ["termination"] }
# browser-use drives Chrome over its DevTools WebSocket. Sync, and no TLS:
# DevTools listens on plain ws:// at loopback only.
tungstenite = { version = "0.30", default-features = false, features = ["handshake"] }
# Upstream response decompression (src/net/decompress.rs), matching the four
# encodings cpp-httplib's Accept-Encoding advertises and decodes: gzip and
# zlib-wrapped deflate share flate2's rust_backend (miniz_oxide) -- pure Rust,
Expand Down
24 changes: 22 additions & 2 deletions contracts/generate_console_binding.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
# Rust 2021 reserved/keyword identifiers among this contract's field names.
# Escaped as a raw identifier (`r#type`) everywhere the field is named; the
# wire key ("type") is untouched.
RUST_KEYWORDS = {"type"}
RUST_KEYWORDS = {"type", "true", "false"}


def _snake_to_pascal(name: str) -> str:
Expand All @@ -65,9 +65,11 @@ def _resolve_type(schema: dict, schemas: dict) -> tuple[str, bool]:
if "$ref" in schema:
name = schema["$ref"].split("/")[-1]
target = schemas.get(name, {})
if _is_free_form(target):
return "Value", False
# Constrained scalar aliases have no emitted type of their own -- only
# objects, unions and enums get one -- so inline their primitive.
if target.get("type") in {"string", "integer", "number", "boolean"} and "enum" not in target:
if target.get("type") in {"string", "integer", "number", "boolean", "array"} and "enum" not in target:
return _resolve_type(target, schemas)
return name, False
if "const" in schema:
Expand All @@ -88,6 +90,8 @@ def _resolve_type(schema: dict, schemas: dict) -> tuple[str, bool]:
# JSON Schema nullable form `type: ["integer", "null"]`: strip the null,
# resolve the remaining type, and mark it optional. Same meaning as an
# anyOf-with-null, just spelled the compact way OpenAPI 3.1 emits.
if _is_free_form(schema):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The free-form mapping loses the contract's allowed JSON kinds: SystemOneState and all SystemOneText* schemas reject null, but generated from_json accepts every serde_json::Value. Preserve the allowed-kind validation, permitting null only for SystemOneGuidance.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At contracts/generate_console_binding.py, line 93:

<comment>The free-form mapping loses the contract's allowed JSON kinds: `SystemOneState` and all `SystemOneText*` schemas reject null, but generated `from_json` accepts every `serde_json::Value`. Preserve the allowed-kind validation, permitting null only for `SystemOneGuidance`.</comment>

<file context>
@@ -88,6 +90,8 @@ def _resolve_type(schema: dict, schemas: dict) -> tuple[str, bool]:
     # JSON Schema nullable form `type: ["integer", "null"]`: strip the null,
     # resolve the remaining type, and mark it optional. Same meaning as an
     # anyOf-with-null, just spelled the compact way OpenAPI 3.1 emits.
+    if _is_free_form(schema):
+        return "Value", False
     if isinstance(kind, list):
</file context>

return "Value", False
if isinstance(kind, list):
non_null = [t for t in kind if t != "null"]
had_null = "null" in kind
Expand Down Expand Up @@ -126,6 +130,14 @@ def _resolve_type(schema: dict, schemas: dict) -> tuple[str, bool]:
raise SystemExit(f"unsupported schema shape: {schema}")


def _is_free_form(schema: dict) -> bool:
"""Any JSON value: `type` lists two or more non-null types (System One's
state, guidance and instructions). Carried as `serde_json::Value`; the
schema's size bounds are the server's to enforce."""
kind = schema.get("type")
return isinstance(kind, list) and len([t for t in kind if t != "null"]) > 1


def _is_enum(schema: dict) -> bool:
return "enum" in schema and schema.get("type") == "string"

Expand All @@ -137,6 +149,8 @@ def _to_value_expr(base: str, var: str, enums: set[str], objects: set[str], is_r
(de)ref either way; only `Value::from`/`Value::Bool`, which take an owned
primitive by value, need an explicit deref when `var` is a reference.
"""
if base == "Value":
return f"{var}.clone()"
if base == "String":
return f"Value::String({var}.clone())"
if base == INT:
Expand Down Expand Up @@ -164,6 +178,8 @@ def _to_value_expr(base: str, var: str, enums: set[str], objects: set[str], is_r


def _from_value_expr(base: str, var: str, enums: set[str], objects: set[str]) -> str:
if base == "Value":
return f"{var}.clone()"
if base == "String":
return f'{var}.as_str().ok_or_else(|| "expected a string".to_string())?.to_string()'
if base == INT:
Expand Down Expand Up @@ -273,6 +289,10 @@ def _emit_struct(name: str, schema: dict, schemas: dict, enums: set[str], object
props = schema.get("properties", {})
fields = []
for prop, pschema in props.items():
if pschema.get("type") == "null":
# A field the contract names only to forbid (`type: null`): never
# sent, so it gets no Rust field.
continue
base, nullable = _resolve_type(pschema, schemas)
optional = nullable or prop not in required
rust_type = f"Option<{base}>" if optional else base
Expand Down
14 changes: 14 additions & 0 deletions contracts/sync_from_inferenceinfra.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
EXTRACT = ROOT / "wally-cli-v1.openapi.json"
DECISIONS_CONTRACT = ROOT / "wally-decisions-public-v1.openapi.json"
DECISIONS_BINDING = REPO / "src" / "account" / "decisions_contract.rs"
SYSTEMONE_BINDING = REPO / "src" / "account" / "systemone_contract.rs"
CONTROL_PLANE = "contracts/control-plane-v1.openapi.json"
# The two files a sync regenerates from scratch. Named once so the destination
# guard and the error message cannot drift apart.
Expand Down Expand Up @@ -120,6 +121,19 @@ def check_local(extract: Path = EXTRACT) -> None:
"createDecisions",
]
)
_run(
[
sys.executable,
str(GENERATOR),
"--check",
"--contract",
str(DECISIONS_CONTRACT),
"--output",
str(SYSTEMONE_BINDING),
"--operation-id",
"createSystemOne",
]
)
print(f"Wally CLI lock OK ({stamp})")


Expand Down
1 change: 1 addition & 0 deletions src/account/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ pub mod decisions_contract;
pub mod decisions_output;
pub mod model_cache;
pub mod session;
pub mod systemone_contract;
pub mod usage_requests;

pub use cancel_worker::*;
Expand Down
Loading
Loading