refactor: archive GUI clients; keep minimal TUI with hooks/API
Move Qt/Tauri/full Web SPA under archive/, ship hermit as CLI/TUI plus libcstcore and cst-webui/1 HTTP+SSE (turn lifecycle hooks, capabilities). Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+13
-12
@@ -1,10 +1,11 @@
|
||||
# CST-agent on Android
|
||||
|
||||
The engine runs on the phone as a plain bionic binary -- no Termux, no proot,
|
||||
no second process for the UI to talk to. It is the same C core the CLI, the
|
||||
TUI and the WebUI use, cross-compiled with the NDK; on the phone the Qt front
|
||||
end (app/) will link `libcstcore.a` in-process and register its own platform
|
||||
tools under the owner `app:android`.
|
||||
no second process for the UI to talk to. It is the same C core the CLI/TUI and
|
||||
`--web` API use, cross-compiled with the NDK. The archived Qt front end
|
||||
(`archive/qt-app/`) can link `libcstcore.a` in-process and register platform
|
||||
tools under the owner `app:android`. Prefer a remote client on `cst-webui/1`
|
||||
for new work.
|
||||
|
||||
Two scripts cover the engine side:
|
||||
|
||||
@@ -163,7 +164,7 @@ have, so the script rewrites the shebang of the build-tools wrappers.
|
||||
provider's environment variable, `CST_API_KEY`), so the phone answers without
|
||||
being asked for the key again. Rotation keeps the session; the sidebar
|
||||
appears in landscape.
|
||||
* Platform tools behind `app:android` (`app/src/platform/android/AndroidTools.cpp`):
|
||||
* Platform tools behind `app:android` (`archive/qt-app/src/platform/android/AndroidTools.cpp`):
|
||||
`notification_send`, `clipboard_get` / `clipboard_set` under the engine's
|
||||
own tool names and `share` (`ACTION_SEND` + chooser) all work on the device.
|
||||
The file
|
||||
@@ -176,20 +177,20 @@ have, so the script rewrites the shebang of the build-tools wrappers.
|
||||
the tool could only say "failed: no exception detail", because Qt clears a
|
||||
Java exception before C++ gets to look at it. The one step that has to fail
|
||||
visibly (a builder, a `PendingIntent`, `build()`, `notify()`) now lives in
|
||||
`app/android/src/xyz/whcself/cstagent/Notifier.java`, which catches the
|
||||
`archive/qt-app/android/src/xyz/whcself/cstagent/Notifier.java`, which catches the
|
||||
throwable and hands the text back for the tool result; the device then
|
||||
reported `notification sent` and the shade had it. androiddeployqt copies
|
||||
`app/android/` with the rest of the package source and Qt's Gradle template
|
||||
`archive/qt-app/android/` with the rest of the package source and Qt's Gradle template
|
||||
puts its `src/` on `java.srcDirs`, so **a class dropped in that directory
|
||||
needs no build-script change** -- the front service of the next step goes
|
||||
there too.
|
||||
* A session's transcript replays a delivered file (`deliver_file`) as a card
|
||||
with Open and Share -- the copy lives next to the session, marked `for_user`
|
||||
so no request ever contains it (see `app/README.md`, "Files the agent
|
||||
so no request ever contains it (see `archive/qt-archive/qt-app/README.md`, "Files the agent
|
||||
delivers").
|
||||
* **A turn survives the app leaving the screen**: `AgentCore::send()` calls
|
||||
`app::holdForeground()`, which starts `CstService`
|
||||
(`app/android/src/xyz/whcself/cstagent/CstService.java`) as a foreground
|
||||
(`archive/qt-app/android/src/xyz/whcself/cstagent/CstService.java`) as a foreground
|
||||
service and takes a partial wake lock; `finishTurn()` stops it again. On the
|
||||
NX789J: with the app sent home and the screen off, the service showed
|
||||
`isForeground=true` with its `CST-agent is working` notification (id 2, the
|
||||
@@ -205,17 +206,17 @@ have, so the script rewrites the shebang of the build-tools wrappers.
|
||||
the foreground the same two hooks wait two minutes (a permission) or five
|
||||
(a question) and then answer "no" with a reason instead of waiting for good.
|
||||
The GUI hop a platform tool makes (`onGuiThread()` in
|
||||
`app/src/platform/android/AndroidTools.cpp`) pings first and gives up after
|
||||
`archive/qt-app/src/platform/android/AndroidTools.cpp`) pings first and gives up after
|
||||
three seconds, and the header shows what the turn is doing
|
||||
(`shell: make -j8`) so a long turn is not mistaken for a stuck one.
|
||||
`--uitest` covers the window side of all this.
|
||||
* **Documents**: `md_to_pdf` (the window's own tool,
|
||||
`app/src/core/PdfTools.cpp`, owner `app:qt`) lays markdown or a workspace
|
||||
`archive/qt-app/src/core/PdfTools.cpp`, owner `app:qt`) lays markdown or a workspace
|
||||
`.md`/`.html` out as an A4 PDF with 15 mm margins and hands it over as a file
|
||||
card, exactly the way `deliver_file` does; `QPrinter`/PrintSupport is not
|
||||
used, so the phone gets it too. Qt's PDF engine embeds a font *subset*, which
|
||||
is why a Chinese page is a few KB rather than the few MB a whole CJK font
|
||||
would cost (see `app/README.md`).
|
||||
would cost (see `archive/qt-archive/qt-app/README.md`).
|
||||
* Still to come: the back gesture, and the icon glyphs -- `ThemeIcon` finds no
|
||||
icon files on the phone and draws empty boxes where the desktop shows Breeze
|
||||
icons.
|
||||
|
||||
Reference in New Issue
Block a user