From 36b21f71bc848a5de6f676743eb0692dc78a5f57 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80?=
<78488229+viktor138irk@users.noreply.github.com>
Date: Mon, 11 May 2026 23:56:48 +0900
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20ru?=
=?UTF-8?q?ntime-=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20=D0=B8=20Android?=
=?UTF-8?q?=20runtime=20UI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/workspace.js | 110 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 109 insertions(+), 1 deletion(-)
diff --git a/frontend/workspace.js b/frontend/workspace.js
index d4734be..cef6308 100644
--- a/frontend/workspace.js
+++ b/frontend/workspace.js
@@ -25,6 +25,105 @@ async function workspaceApi(url, payload = {}, method = 'POST') {
return await response.json();
}
+function getSelectedDevice() {
+ const select = document.getElementById('deviceSelect');
+
+ if (!select) {
+ return null;
+ }
+
+ return select.value || null;
+}
+
+async function loadRuntimeCommands() {
+ const container = document.getElementById('runtimeButtons');
+
+ if (!container) {
+ return;
+ }
+
+ const data = await workspaceApi('/api/runtime/commands', {}, 'GET');
+
+ const commands = data.commands || [];
+
+ container.innerHTML = commands.map(command => `
+
+ `).join('');
+}
+
+async function runRuntimeCommand(command) {
+ const workspace = document.getElementById('workspacePath').value;
+
+ if (!workspace) {
+ appendLog('Workspace не выбран');
+ return;
+ }
+
+ appendLog(`Запуск runtime команды: ${command}`);
+
+ const data = await workspaceApi('/api/runtime/command', {
+ workspace,
+ command,
+ device: getSelectedDevice()
+ });
+
+ if (data.result?.stdout) {
+ appendLog(data.result.stdout);
+ }
+
+ if (data.result?.stderr) {
+ appendLog(data.result.stderr);
+ }
+
+ appendLog(data.success
+ ? `Команда выполнена: ${data.label}`
+ : `Ошибка runtime команды: ${data.label}`
+ );
+}
+
+async function installLatestApk() {
+ const workspace = document.getElementById('workspacePath').value;
+
+ const data = await workspaceApi('/api/runtime/install-latest-apk', {
+ workspace,
+ device: getSelectedDevice()
+ });
+
+ if (data.result?.stdout) {
+ appendLog(data.result.stdout);
+ }
+
+ if (data.result?.stderr) {
+ appendLog(data.result.stderr);
+ }
+}
+
+async function restartCurrentApp() {
+ const workspace = document.getElementById('workspacePath').value;
+ const packageName = document.getElementById('packageName').value;
+
+ if (!packageName) {
+ appendLog('Укажите package name');
+ return;
+ }
+
+ const data = await workspaceApi('/api/runtime/restart-app', {
+ workspace,
+ device: getSelectedDevice(),
+ package_name: packageName
+ });
+
+ if (data.result?.stdout) {
+ appendLog(data.result.stdout);
+ }
+
+ if (data.result?.stderr) {
+ appendLog(data.result.stderr);
+ }
+}
+
async function loadProjects() {
const container = document.getElementById('projectsList');
@@ -143,8 +242,9 @@ async function loadDevices() {
const data = await workspaceApi('/api/android/devices');
const container = document.getElementById('devices');
+ const select = document.getElementById('deviceSelect');
- if (!container) {
+ if (!container || !select) {
return;
}
@@ -156,6 +256,7 @@ async function loadDevices() {
if (devices.length === 0) {
container.innerHTML = 'Устройства не подключены';
+ select.innerHTML = '';
return;
}
@@ -168,10 +269,17 @@ async function loadDevices() {
`;
}).join('');
+
+ select.innerHTML = devices.map(device => {
+ const id = device.split(/\s+/)[0];
+
+ return ``;
+ }).join('');
}
window.addEventListener('load', () => {
loadDevices();
loadProjects();
+ loadRuntimeCommands();
appendLog('DevConsole workspace runtime готов');
});