# OTO Client Flutter host application for the OTO console. The embeddable UI surface lives in `packages/flutter/oto_console` so other workspace apps, such as `../nomadcode/apps/client`, can mount OTO as a modular Flutter widget instead of depending on this host application's `main.dart`. ## Structure - `lib/main.dart` only starts the OTO client host. - `lib/src/app/bootstrap.dart` owns app startup concerns such as fullscreen system UI setup. - `lib/src/app/oto_client_app.dart` wires the host `MaterialApp` to `OtoConsoleShell`. - `../../packages/flutter/oto_console` exports the product-owned embeddable widgets. That package consumes the workspace shared `agent-shell` package. ## Embedding Add the package from another workspace Flutter app: ```yaml dependencies: oto_console: path: ../../../oto/packages/flutter/oto_console ``` Then mount any exported widget, for example `OtoConsoleShell` or `OtoAgentPanel`, inside the host application's own workbench shell. ## Local Preview The workspace frontend preview port candidate is `13020`: ```bash flutter run -d chrome --web-port=13020 ``` The preview port is separate from the OTO Core server URL. When the client needs to talk to a host-published Core server, pass the server URL with a compile-time define: ```bash flutter run -d chrome --web-port=13020 --dart-define=OTO_SERVER_HTTP_URL=http://localhost:18020 ``` Remote runner evidence uses the same preview port. When the Core server is host-published from `/Users/toki/agent-work/oto`, pass the remote host URL: ```bash make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020 ``` The current app-level fallback `http://localhost:8080` remains a local compatibility default until the runtime default is intentionally migrated.