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 готов');
});