feat: add android codex remote control actions

This commit is contained in:
AI Bot
2026-06-04 17:26:19 +08:00
parent 025e749618
commit 6f143ea6f9
7 changed files with 176 additions and 3 deletions

View File

@@ -544,6 +544,18 @@ public class BossApiClient {
return updateDevice(deviceId, payload);
}
public ApiResponse queueCodexRemoteControl(String deviceId, String action, String reason) throws IOException, JSONException {
JSONObject payload = new JSONObject();
payload.put("action", action);
payload.put("confirmed", true);
payload.put("reason", reason == null ? "" : reason);
return requestWithRestore(
"POST",
"/api/v1/devices/" + encode(deviceId) + "/codex-remote-control",
payload
);
}
public ApiResponse getDeviceSkills(String deviceId) throws IOException, JSONException {
return requestWithRestore("GET", "/api/v1/devices/" + encode(deviceId) + "/skills", null);
}

View File

@@ -270,6 +270,30 @@ public class DeviceDetailActivity extends BossScreenActivity {
null,
v -> showPreferredExecutionModeDialog(device)
));
appendContent(BossUi.buildWechatMenuRow(
this,
"Codex 远程控制",
"默认走 Codex Computer Use失效时回退 boss-agent 本机控制",
null,
null,
null
));
appendContent(BossUi.buildWechatMenuRow(
this,
"启动远控",
"拉起本机 Codex Remote Control 守护进程",
"需在线设备",
null,
v -> showCodexRemoteControlConfirmDialog("start")
));
appendContent(BossUi.buildWechatMenuRow(
this,
"停止远控",
"停止本机 Codex Remote Control 守护进程",
"需在线设备",
null,
v -> showCodexRemoteControlConfirmDialog("stop")
));
if (primaryPolicy != null) {
appendContent(BossUi.buildWechatMenuRow(
this,
@@ -367,6 +391,19 @@ public class DeviceDetailActivity extends BossScreenActivity {
.show();
}
private void showCodexRemoteControlConfirmDialog(String action) {
String normalizedAction = "stop".equals(action) ? "stop" : "start";
boolean startAction = "start".equals(normalizedAction);
new AlertDialog.Builder(this)
.setTitle(startAction ? "启动 Codex 远控" : "停止 Codex 远控")
.setMessage("该操作会由这台电脑的 boss-agent 本机执行,并进入权限审计。")
.setNegativeButton("取消", null)
.setPositiveButton(startAction ? "确认启动" : "确认停止", (dialog, which) ->
queueCodexRemoteControl(normalizedAction)
)
.show();
}
private void openEditDialog() {
executor.execute(() -> {
try {
@@ -382,6 +419,34 @@ public class DeviceDetailActivity extends BossScreenActivity {
});
}
private void queueCodexRemoteControl(String action) {
if (deviceId == null || deviceId.trim().isEmpty()) {
showMessage("缺少设备 ID");
return;
}
boolean startAction = "start".equals(action);
setRefreshing(true);
executor.execute(() -> {
try {
BossApiClient.ApiResponse response = apiClient.queueCodexRemoteControl(
deviceId,
action,
startAction ? "APP 设备详情页确认启动 Codex 远控" : "APP 设备详情页确认停止 Codex 远控"
);
if (!response.ok()) throw new IllegalStateException(response.message());
runOnUiThread(() -> {
showMessage(startAction ? "已提交启动远控" : "已提交停止远控");
reload();
});
} catch (Exception error) {
runOnUiThread(() -> {
setRefreshing(false);
showMessage((startAction ? "启动远控失败:" : "停止远控失败:") + error.getMessage());
});
}
});
}
private void savePreferredExecutionMode(String preferredExecutionMode) {
setRefreshing(true);
executor.execute(() -> {