Commit aaa8d0b
authored
* Fix Ctrl key for arrows/special keys, add Configure menu, clickable URL, 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 multi-provider AI model selection and SSH remote access
- 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>
* Fix resolv.conf ENOENT after app upgrade (#40)
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>
* Call setupDirs before writeResolv in gateway init and start (#40)
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>
* Fix writeResolvConf: only mkdirs config dir, not full setupDirectories (#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>
* Call setupDirectories in GatewayService before proot starts (#40)
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>
* Rewrite SSH to use native foreground service for persistent sshd
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>
* Fix Ctrl key for soft keyboard input in terminal and configure screens
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>
* Fix Ctrl key in onboarding and package install screens, remove unused 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>
* Fix resolv.conf ENOENT: use context.filesDir, make init() resilient (#40)
- 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>
* Run setupDirs + writeResolv unconditionally on app open (#40)
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>
* Ensure dirs + resolv.conf exist before every proot operation (#40)
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>
* Ensure dirs + resolv.conf on every app launch via splash screen (#40)
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>
* v1.8.0: AI Providers, SSH Access, Ctrl keys, Configure menu, resolv.conf 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>
1 parent 58ce979 commit aaa8d0b
File tree
28 files changed
+2126
-40
lines changed- flutter_app
- android/app/src/main
- kotlin/com/nxg/openclawproot
- lib
- models
- screens
- services
- widgets
28 files changed
+2126
-40
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
3 | 24 | | |
4 | 25 | | |
5 | 26 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
59 | 62 | | |
60 | 63 | | |
61 | 64 | | |
62 | 65 | | |
63 | 66 | | |
64 | | - | |
| 67 | + | |
65 | 68 | | |
66 | 69 | | |
67 | 70 | | |
| |||
74 | 77 | | |
75 | 78 | | |
76 | 79 | | |
| 80 | + | |
77 | 81 | | |
78 | 82 | | |
79 | 83 | | |
| |||
222 | 226 | | |
223 | 227 | | |
224 | 228 | | |
225 | | - | |
| 229 | + | |
| 230 | + | |
226 | 231 | | |
227 | 232 | | |
228 | 233 | | |
| |||
233 | 238 | | |
234 | 239 | | |
235 | 240 | | |
| 241 | + | |
236 | 242 | | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
237 | 246 | | |
238 | 247 | | |
239 | 248 | | |
| |||
248 | 257 | | |
249 | 258 | | |
250 | 259 | | |
| 260 | + | |
| 261 | + | |
251 | 262 | | |
252 | 263 | | |
253 | 264 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
69 | 74 | | |
70 | 75 | | |
71 | 76 | | |
| |||
Lines changed: 10 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1213 | 1213 | | |
1214 | 1214 | | |
1215 | 1215 | | |
1216 | | - | |
1217 | | - | |
1218 | | - | |
1219 | | - | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + | |
| 1222 | + | |
| 1223 | + | |
| 1224 | + | |
| 1225 | + | |
1220 | 1226 | | |
1221 | 1227 | | |
1222 | 1228 | | |
| |||
Lines changed: 4 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
83 | | - | |
84 | | - | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
85 | 86 | | |
| 87 | + | |
86 | 88 | | |
87 | 89 | | |
88 | 90 | | |
| |||
Lines changed: 44 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
162 | 162 | | |
163 | 163 | | |
164 | 164 | | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
165 | 209 | | |
166 | 210 | | |
167 | 211 | | |
| |||
Lines changed: 213 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
0 commit comments