Conversation
…RL, SSH package (#37, #38) - Fix Ctrl+Arrow/Home/End/PgUp/PgDn sending raw sequences instead of xterm Ctrl-modified variants (e.g. \x1b[1;5A for Ctrl+Up) - Make gateway dashboard URL clickable (opens WebDashboardScreen) with primary color + underline styling and open_in_new icon button - Add "Configure" quick action card running `openclaw configure` in terminal - Add OpenSSH as optional package (apt-get install openssh-client openssh-server) Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
- Add AiProvider data model with 7 built-in providers (Anthropic, OpenAI, Google Gemini, OpenRouter, NVIDIA NIM, DeepSeek, xAI) - Add ProviderConfigService to read/write provider config in openclaw.json using Node.js safe-merge pattern - Add ProvidersScreen listing all providers with Active/Configured badges - Add ProviderDetailScreen with API key form and model dropdown - Add SshService for sshd lifecycle (start/stop, password, IP discovery) - Add SshScreen with service control, password management, and connection info with copyable ssh commands - Add AI Providers and SSH Access cards to dashboard Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
After upgrading to v1.7.3, Android may clear the app's files directory. writeResolvConf() only created the config/ directory but other required directories (tmp/, home/, lib/, proc/sys fakes) were missing, causing proot bind-mount failures. Call setupDirectories() instead of a bare mkdirs() so the entire directory tree is recreated before writing resolv.conf. Also use the two-argument File constructor for correctness. Fixes #40 Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
This was referenced Mar 1, 2026
On a normal app launch (setup already complete), setupDirs was never called. If Android cleared the files directory after an upgrade, the config/ directory was missing when writeResolv ran. Now both init() and start() call setupDirs() first, matching the bootstrap flow. The Kotlin-side writeResolvConf() also calls setupDirectories() internally as a safety net. Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
#40) setupDirectories() also runs setupLibtalloc() and setupFakeSysdata() which can fail during first-time setup when rootfs hasn't been extracted yet. writeResolvConf() only needs the config/ directory to exist. The Dart-side gateway_service.dart still calls setupDirs() before writeResolv() for the upgrade/restart case where directories may have been cleared by Android. Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
After an app update, Android may clear all files. The background GatewayService only called writeResolvConf() which creates config/ dir, but proot also needs tmp/, home/, lib/libtalloc.so.2, and proc/sys fakes for bind mounts. Now setupDirectories() runs before writeResolvConf() in the Android service, matching the Dart-side fix in gateway_service.dart. All paths now covered: - First-time setup: bootstrap calls setupDirs then writeResolv - App open (Dart): init/start call setupDirs then writeResolv - Background service (Kotlin): setupDirectories then writeResolvConf - writeResolvConf itself: mkdirs config dir as safety net Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
The previous implementation used single-shot runInProot() which can't run daemons — proot uses --kill-on-exit so sshd dies when the command finishes. Also pgrep/hostname -I don't work reliably inside proot. Changes: - Add SshForegroundService.kt: runs sshd -D (foreground mode) in a persistent proot process with wake lock and notification - Add native bridge methods: startSshd, stopSshd, isSshdRunning, getSshdPort, getDeviceIps, setRootPassword - getDeviceIps uses Android NetworkInterface (not proot hostname -I) - setRootPassword runs chpasswd via processManager.runInProotSync - Register SshForegroundService in AndroidManifest.xml - Rewrite ssh_service.dart to use native methods - Update ssh_screen.dart to fetch IPs from Android Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
CTRL/ALT toolbar buttons only worked with other toolbar buttons (arrows, etc.), not with soft keyboard input. Keyboard chars went directly through terminal.onOutput → pty.write(), bypassing the toolbar's modifier state. Fix: Share CTRL/ALT state via ValueNotifier between toolbar and screen. The onOutput handler now checks if modifiers are active and transforms keyboard input (e.g., Ctrl+C sends byte 0x03). Both terminal_screen.dart and configure_screen.dart are fixed. Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
… imports Add ctrlNotifier/altNotifier to TerminalToolbar usage in onboarding_screen.dart and package_install_screen.dart (build errors). Remove unnecessary dart:typed_data imports (already provided by package:flutter/services.dart). Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
) - writeResolvConf() now uses context.filesDir (Android-guaranteed path) instead of the String configDir which could point to a cleared directory - gateway_service init() wraps writeResolv() in try-catch since it's non-critical when gateway is already running Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
Previously these only ran when the gateway was already running. After an app update, the gateway is not running but Android may have cleared the files directory. Moving setupDirs/writeResolv before the isGatewayRunning check ensures resolv.conf always exists before any terminal or gateway operation. Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
getProotShellConfig() is called by all screens before starting proot (terminal, configure, onboarding, package install). Adding setupDirs and writeResolv here guarantees resolv.conf exists regardless of which screen the user opens first after an app update. Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
The splash screen is the first screen on every app open — reinstall, update, or normal launch. Running setupDirs + writeResolv here guarantees the files exist before any screen can use proot. Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
…onf fix - Bump version to 1.8.0 (pubspec.yaml, constants.dart) - Update CHANGELOG with all new features and bug fixes - Update README with new features, file structure, and OpenSSH package Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Combined PR covering issues #36–#40:
Ctrl key & Configure menu (#37, #38)
AI Providers & SSH Access (new feature)
~/.openclaw/openclaw.jsonvia Node.js safe-mergeFix resolv.conf ENOENT after upgrade (#40)
writeResolvConf()now callssetupDirectories()to recreate the entire directory treeFile(parent, child)constructor for correctnessNew Files
lib/models/ai_provider.dart— Provider data model with 7 built-in providerslib/services/provider_config_service.dart— Read/write provider configlib/screens/providers_screen.dart— Provider list with Active/Configured badgeslib/screens/provider_detail_screen.dart— API key + model selection formlib/services/ssh_service.dart— SSH server lifecycle operationslib/screens/ssh_screen.dart— SSH management UITest plan
openclaw configureFixes #37, #38, #40