yutori 0.9.3
What's Changed
- docs(README): add browse list and research list CLI examples by @dhruvbatra in #140
- docs(llms.txt): add Navigator API section for coding agents by @dhruvbatra in #141
- refactor: extract truncate_for_display CLI helper by @dhruvbatra in #142
- fix: use datetime.now(timezone.utc) in make_run_id and correct action_items join by @dhruvbatra in #143
- refactor: extract shared exception-to-returncode mapping in install_flow by @dhruvbatra in #144
- refactor: extract make_json_response() test helper to dedupe mock-response boilerplate by @dhruvbatra in #145
- refactor: extract make_status_response()/make_empty_response() test helpers by @dhruvbatra in #147
- refactor: dedupe install_flow's private truncation helper into truncate_for_display by @dhruvbatra in #148
- refactor: extract _completed_process() test helper to dedupe CompletedProcess boilerplate by @dhruvbatra in #149
- refactor: extract _print_version() to dedupe CLI version output by @dhruvbatra in #150
- refactor: migrate test_http.py to shared make_status_response fixture by @dhruvbatra in #151
- refactor: migrate test_auth.py to shared httpx.Response mock fixtures by @dhruvbatra in #152
- Remove make_empty_response, now redundant with make_status_response by @dhruvbatra in #153
- refactor: extract BrowserAgentMixin to dedupe example agent boilerplate by @dhruvbatra in #155
- refactor: dedupe _format_message_for_log into BrowserAgentMixin by @dhruvbatra in #156
- refactor: extract make_mock_chat_completion() test helper to dedupe ChatCompletion boilerplate by @dhruvbatra in #154
- refactor: dedupe _use_tmp_config fixture across test_auth.py test classes by @dhruvbatra in #157
- refactor: consolidate run_interactive_command's triplicate except blocks by @dhruvbatra in #158
- refactor(tests): rename _usage_fixtures.py to _client_fixtures.py by @dhruvbatra in #159
- refactor(examples): extract shared llm_retry decorator by @dhruvbatra in #161
- cleanup: drop redundant .keys() in dict iteration by @dhruvbatra in #160
- refactor(tests): dedupe fake_which/fake_run_command closures in test_install_flow.py by @dhruvbatra in #162
- refactor(tests): extract _invoke_cli helper to dedupe get_authenticated_client patch in test_cli.py by @dhruvbatra in #163
- refactor(tests): extract shared OAuth callback scaffold in test_auth.py by @dhruvbatra in #165
- refactor: unify _clip_image_url between examples/_common.py and replay.py by @dhruvbatra in #166
- docs: fix stale function names in examples/README.md by @dhruvbatra in #164
- refactor(tests): extract _tool_call/_tool_call_message helpers in test_navigator_replay.py by @dhruvbatra in #167
- refactor(tests): extract mocked OpenAI/AsyncOpenAI client helpers by @dhruvbatra in #168
- refactor(tests): extract CLIInstallState/SDKInstallPlan factories in test_install_flow.py by @dhruvbatra in #169
- refactor(navigator): extract TrajectoryRecorder text I/O into shared helpers by @dhruvbatra in #170
- refactor(tests): extract _invoke_login helper in test_cli_auth.py by @dhruvbatra in #171
- refactor(cli): extract _slate_line helper for installer step-line markup by @dhruvbatra in #172
- refactor(navigator): dedupe image-url/text block extraction in replay.py by @dhruvbatra in #173
- refactor(tests): consolidate duplicate CLIInstallState factory in test_install_flow.py by @dhruvbatra in #174
- refactor(examples): build Agent from Config.model_dump() in main() by @dhruvbatra in #175
- refactor(examples): extract run_example_agent() shared main() tail by @dhruvbatra in #176
- refactor(tests): extract _patched_callback_server() for OAuth callback scaffold by @dhruvbatra in #178
- refactor(examples): extract shared n1 primitive-action dispatch by @dhruvbatra in #177
- fix(examples): use UTC for memo filename timestamp in navigator_n1_memo by @dhruvbatra in #179
- refactor(examples): extract _click_coordinates() for repeated coord-resolution by @dhruvbatra in #180
- refactor(examples): dedupe primitive-action dispatch in navigator_n1_custom_tools.py by @dhruvbatra in #181
- refactor(examples): dedupe identical _predict() across n1 example agents by @dhruvbatra in #182
- refactor(examples): extract build_agent_arg_parser() for shared main() arg-parser setup by @dhruvbatra in #183
- refactor(auth): dedupe registration-state message text between auth.py and install_flow.py by @dhruvbatra in #184
- refactor(tests): extract require_examples_extra() for the loguru importorskip guard by @dhruvbatra in #185
- refactor(examples): extract shared Agent init/run bookkeeping into BrowserAgentMixin by @dhruvbatra in #186
- refactor(examples): extract shared predict/execute step loop into BrowserAgentMixin by @dhruvbatra in #187
- refactor(examples): extract run_example_main() to dedupe main() across n1 examples by @dhruvbatra in #188
- refactor(examples): extract shared browser-lifecycle run() body into BrowserAgentMixin by @dhruvbatra in #189
- refactor(examples): extract shared _execute() body into BrowserAgentMixin by @dhruvbatra in #190
- refactor(examples): extract shared _call_llm_with_tools() into BrowserAgentMixin by @dhruvbatra in #191
- refactor(tests): parametrize run_interactive_command exception-mapping tests by @dhruvbatra in #192
- refactor(examples): extract _init_common_agent_config() into BrowserAgentMixin by @dhruvbatra in #194
- refactor(examples): extract shared _call_llm() request/replay body into BrowserAgentMixin by @dhruvbatra in #195
- Extract shared BaseAgentConfig for n1 example scripts by @dhruvbatra in #196
- refactor(tests): extract make_trimmable_messages() fixture for payload-trim tests by @dhruvbatra in #197
- refactor(tests): extract make_call_llm_agent() shared by call_llm mixin tests by @dhruvbatra in #198
- refactor(examples): extract _trim_request_messages() shared by navigator_n1/n1_5 by @dhruvbatra in #199
- Extract _verification_failure() helper for repeated verification-failure handling by @dhruvbatra in #200
- refactor(tests): extract patched_npx_install() for maybe_install_mcp* tests by @dhruvbatra in #201
- refactor(examples): extract shared Agent.init into BrowserAgentMixin by @dhruvbatra in #202
- refactor(examples): extract _navigate_and_finish() for n1.5 nav actions by @dhruvbatra in #203
- refactor(tests): extract _image_message() into shared _client_fixtures by @dhruvbatra in #204
- refactor(examples): extract _move_mouse_and_finish() for n1.5 mouse actions by @dhruvbatra in #205
- refactor(examples): extract _move_with_modifier_held() for n1.5 click/scroll actions by @dhruvbatra in #206
- refactor(examples): use payload.py's canonical default constants instead of hardcoded literals by @dhruvbatra in #207
- refactor(examples): extract _press_key_and_finish() for n1.5 key_press/hold_key by @dhruvbatra in #208
- refactor(examples): extract _find_record() helper in navigator_n1_memo.py by @dhruvbatra in #209
- refactor(auth): consolidate getattr lazy-import dispatch to match n1 shim idiom by @dhruvbatra in #210
- refactor(tests): cache install/uninstall script content via fixtures by @dhruvbatra in #211
- refactor(cli): extract render_entity_table() shared by scouts/task list output by @dhruvbatra in #212
- refactor(tests): add async_client fixture mirroring the sync client fixture by @dhruvbatra in #214
- refactor(cli): extract list_and_render_tasks() shared by browse/research list by @dhruvbatra in #213
- refactor(tests): drop redundant client = async_client alias in async client tests by @dhruvbatra in #215
- refactor(tests): parametrize 401/403 auth-error tests in client test suites by @dhruvbatra in #216
- refactor(tests): parametrize 400/500 API-error tests in test_client.py by @dhruvbatra in #217
- refactor(examples): consolidate the four click-action branches in execute_n1_primitive_action by @dhruvbatra in #220
- refactor(tests): parametrize 400/500 API-error test in test_async_client.py by @dhruvbatra in #219
- refactor(tests): extract patch_async_http() for httpx.AsyncClient patching by @dhruvbatra in #221
- refactor(tests): use shared client fixture in test_client.py by @dhruvbatra in #222
- refactor(examples): dedupe navigation-settle pattern in execute_n1_primitive_action by @dhruvbatra in #223
- fix(cli): catch APIConnectionError in cli_api_errors, not just httpx.HTTPError by @dhruvbatra in #224
- refactor(tests): dedupe bash-function-body extraction in test_bash_scripts.py by @dhruvbatra in #225
- refactor(navigator): use NAVIGATOR_N1_5_MODEL constant in loop.py Protocol stubs by @dhruvbatra in #226
- refactor(chat): use NAVIGATOR_N1_5_MODEL constant for chat completions default by @dhruvbatra in #227
- refactor(tests): use NAVIGATOR_N1_MODEL/NAVIGATOR_N1_5_MODEL constants in client tests by @dhruvbatra in #228
- refactor(tests): use NAVIGATOR_N1_MODEL constant in remaining test fixtures by @dhruvbatra in #229
- refactor(client): type exit/aexit params to match httpx's own signature by @dhruvbatra in #230
- refactor(tests): use NAVIGATOR_N1_MODEL constant in test_navigator_replay.py by @dhruvbatra in #231
- refactor(navigator): rename local html vars shadowing the html import in replay.py by @dhruvbatra in #232
- refactor(cli): rename local version var shadowing the importlib.metadata import in install_flow.py by @dhruvbatra in #233
- refactor(client): hoist duplicated require_api_key import to module level by @dhruvbatra in #234
- refactor(cli): consolidate env-scoped executable lookup in install_flow by @dhruvbatra in #235
- refactor(cli): extract inspect_cli_install's paired failure return by @dhruvbatra in #236
- refactor(tests): extract _patched_successful_cli_inspect in test_install_flow by @dhruvbatra in #237
- refactor(cli): hoist function-local imports to module level in commands/init.py by @dhruvbatra in #238
- refactor(cli): hoist yutori.version import to module level in cli/main.py by @dhruvbatra in #239
- refactor(cli): type the shared CLI client helpers as YutoriClient by @dhruvbatra in #240
- refactor(http): type _BaseNamespace's client param as httpx.Client/AsyncClient by @dhruvbatra in #241
- refactor(http): narrow _request's method param to a Literal of the four dispatched HTTP verbs by @dhruvbatra in #242
- refactor(exceptions): type APIError.response as httpx.Response by @dhruvbatra in #243
- refactor(http): type _request/_request_kwargs's params/json as dict[str, Any] | None by @dhruvbatra in #244
- docs: document n2 CUA harness setup by @ksk002 in #245
- docs: update SDK positioning and Navigator copy by @ksk002 in #246
- docs: n2 README pass, retire n1 examples, add Daytona n2 example by @dhruvbatra in #248
- docs: keep n1.5 in Navigator copy by @ksk002 in #247
- docs(api.md): sync browsing.create params with today's docstring update by @dhruvbatra in #249
- feat: add stable n2 computer-use SDK by @ksk002 in #250
New Contributors
Full Changelog: v0.8.1...v0.9.3