anycoder-8bf5e0d3 / index.js
Dmang69's picture
Upload index.js with huggingface_hub
a1a5e32 verified
Raw
History Blame Contribute Delete
16.5 kB
/**
* Device Recovery & Diagnostics Assistant
* Built with Transformers.js for AI simulation
*/
// Import Transformers.js from CDN
import { pipeline, env } from 'https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.8.0';
// Set up a Web Worker for model loading to prevent UI blocking
env.allowLocalModels = false;
env.useBrowserCache = true;
class DeviceRecoveryApp {
constructor() {
this.currentTab = 'dashboard';
this.isTesting = false;
this.aiPipeline = null;
this.initApp();
}
async initApp() {
this.setupEventListeners();
this.updateStatus("Initializing System...");
// Load AI Model in background
try {
this.updateStatus("Loading AI Diagnostic Model (q8_0)...");
await this.loadAIModel();
this.updateStatus("AI Assistant Ready");
} catch (error) {
console.error("AI Model loading error:", error);
this.updateStatus("AI Model Loading Failed (Using Fallback)");
}
}
async loadAIModel() {
// Using a lightweight question-answering model for simulation
// In a real production app, you might use a text-generation model
this.aiPipeline = await pipeline('question-answering', 'Xenova/distilbert-base-uncased-distilled-squad');
}
setupEventListeners() {
// Navigation
document.querySelectorAll('.nav-item').forEach(item => {
item.addEventListener('click', (e) => {
this.switchTab(e.target.dataset.target);
});
});
// Keyboard shortcut for chat
document.getElementById('userInput').addEventListener('keypress', (e) => {
if (e.key === 'Enter') this.sendToAI();
});
}
switchTab(tabId) {
// Hide all tabs
document.querySelectorAll('.tab-content').forEach(tab => {
tab.classList.remove('active');
});
// Show selected tab
document.getElementById(tabId).classList.add('active');
// Update sidebar active state
document.querySelectorAll('.nav-item').forEach(item => {
item.classList.remove('active');
if (item.dataset.target === tabId) {
item.classList.add('active');
}
});
this.currentTab = tabId;
this.updateStatus(`Switched to ${tabId.replace('-', ' ').toUpperCase()}`);
}
updateStatus(message) {
document.getElementById('systemStatus').textContent = message;
}
// AI Chat Logic
async sendToAI() {
const input = document.getElementById('userInput');
const question = input.value.trim();
if (!question) return;
// Add user message to chat
this.addChatMessage('user', question);
input.value = '';
// Show loading state
const loadingId = this.addChatMessage('ai', 'Processing request...');
try {
// Simulate AI response if model failed to load, or use actual model
let answer = "";
if (this.aiPipeline) {
// Context for the AI to answer questions about recovery
const context = `
Factory reset removes all user data and restores the device to its original state.
Soft brick refers to a device that cannot boot properly but can be recovered via software.
Hard brick refers to hardware-level failure requiring professional repair.
ADB commands allow device management and recovery operations.
ISO tools are used for creating and writing disk images for recovery purposes.
`;
answer = await this.aiPipeline(question, context);
} else {
// Fallback responses
const responses = {
"reset": "To perform a factory reset, navigate to Settings > System > Reset Options. This will delete all data.",
"brick": "Soft bricks can often be fixed with recovery mode or ADB commands. Hard bricks require hardware repair.",
"iso": "ISO tools allow you to create disk images for OS installation or recovery purposes."
};
// Simple keyword matching for fallback
for (const [key, value] of Object.entries(responses)) {
if (question.toLowerCase().includes(key)) {
answer = { answer: value };
break;
}
}
if (!answer) {
answer = { answer: "I can assist with device recovery, factory resets, diagnostics, and ISO tools. How can I help?" };
}
}
// Remove loading message and show answer
document.getElementById(loadingId).remove();
this.addChatMessage('ai', answer.answer);
} catch (error) {
document.getElementById(loadingId).remove();
this.addChatMessage('ai', "I'm having trouble accessing the diagnostic database. Please try rephrasing.");
console.error("AI Error:", error);
}
}
addChatMessage(sender, text) {
const container = document.getElementById('chatContainer');
const id = 'msg-' + Date.now();
const messageDiv = document.createElement('div');
messageDiv.className = `message ${sender}-message`;
messageDiv.id = id;
const contentDiv = document.createElement('div');
contentDiv.className = 'message-content';
contentDiv.innerHTML = `<p>${text}</p>`;
messageDiv.appendChild(contentDiv);
container.appendChild(messageDiv);
// Auto scroll to bottom
container.scrollTop = container.scrollHeight;
return id;
}
// Recovery Tools Logic
async initiateRecovery(type) {
const modal = document.createElement('div');
modal.className = 'modal-overlay';
modal.innerHTML = `
<div class="modal-content">
<h3>Recovery Process Initiated</h3>
<div class="progress-container">
<div class="progress-bar">
<div class="progress-fill" style="width: 0%"></div>
</div>
<p id="recoveryStatus">Starting ${type} procedure...</p>
</div>
<button class="btn btn-danger" onclick="this.parentElement.parentElement.remove()">Cancel</button>
</div>
`;
document.body.appendChild(modal);
// Simulate recovery process
const progress = document.querySelector('.progress-fill');
const status = document.getElementById('recoveryStatus');
let step = 0;
const steps = [
"Analyzing system logs...",
"Identifying failure points...",
"Downloading recovery firmware...",
"Verifying firmware integrity...",
"Writing recovery image...",
"Rebooting system..."
];
const interval = setInterval(() => {
step++;
const percent = (step / steps.length) * 100;
progress.style.width = `${percent}%`;
if (step < steps.length) {
status.textContent = steps[step];
} else {
clearInterval(interval);
status.textContent = "Recovery process completed successfully.";
setTimeout(() => modal.remove(), 2000);
this.addChatMessage('ai', `I have initiated the ${type} recovery process. The system has been restored.`);
}
}, 1000);
}
executeReset(type) {
// Safety confirmation
if (confirm("Are you sure you want to execute " + type + "? This will erase all data.")) {
this.initiateRecovery(type);
}
}
runTool(toolName) {
const modal = document.createElement('div');
modal.className = 'modal-overlay';
modal.innerHTML = `
<div class="modal-content">
<h3>${toolName.replace('-', ' ').toUpperCase()}</h3>
<div class="terminal-window">
<div class="terminal-header">
<span class="terminal-dot red"></span>
<span class="terminal-dot yellow"></span>
<span class="terminal-dot green"></span>
<span class="terminal-title">root@device:~# ${toolName}</span>
</div>
<div class="terminal-body" id="terminalBody"></div>
</div>
<button class="btn btn-primary" onclick="this.parentElement.parentElement.remove()">Close Tool</button>
</div>
`;
document.body.appendChild(modal);
this.runTerminalSimulation(toolName);
}
runTerminalSimulation(toolName) {
const terminalBody = document.getElementById('terminalBody');
const commands = {
'adb-cmd': [
"root@device:~# adb devices",
"List of devices attached",
"0123456789ABCDEF device",
"root@device:~# adb reboot recovery",
"Recovery mode initiated...",
"root@device:~# adb push recovery.img /sdcard/",
"1 file pushed. 0 files skipped.",
"root@device:~# adb shell",
"device:/ $ su",
"root@device:/ #"
],
'flash-tool': [
"root@device:~# fastboot devices",
"0123456789ABCDEF fastboot",
"root@device:~# fastboot flash system system.img",
"target max-sparse-size: 256MB",
"flash system: [===================>] 100%",
"finished. total time: 12.456s",
"root@device:~# fastboot reboot",
"Rebooting..."
],
'log-viewer': [
"root@device:~# dmesg | grep -i error",
"[ 123.456789] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000",
"[ 123.567890] Unable to mount root fs on unknown-block(0,0)",
"[ 123.678901] Rebooting system...",
"root@device:~# logcat -d | grep -i android",
"01-01 00:00:00.000 1000 1000 I AndroidRuntime: VM exiting."
]
};
const lines = commands[toolName] || ["Tool initialized...", "Processing...", "Complete."];
let i = 0;
const interval = setInterval(() => {
if (i >= lines.length) {
clearInterval(interval);
return;
}
const line = document.createElement('div');
line.textContent = lines[i];
terminalBody.appendChild(line);
terminalBody.scrollTop = terminalBody.scrollHeight;
i++;
}, 300);
}
// Stress Test Logic
startStressTest() {
this.isTesting = true;
const testResults = document.getElementById('testResults');
const progressBar = document.getElementById('progressBar');
const progressFill = document.getElementById('progressFill');
const progressText = document.getElementById('progressText');
testResults.innerHTML = '<div class="test-log" id="testLog">Starting stress test sequence...</div>';
const tests = [
{ name: "CPU Load Test", duration: 2000, type: "cpu" },
{ name: "Memory Allocation", duration: 3000, type: "memory" },
{ name: "Storage I/O", duration: 2500, type: "storage" },
{ name: "Network Stability", duration: 1500, type: "network" },
{ name: "Thermal Analysis", duration: 2000, type: "thermal" }
];
let currentTest = 0;
let totalProgress = 0;
const runNextTest = () => {
if (currentTest >= tests.length || !this.isTesting) {
this.isTesting = false;
progressFill.style.width = '100%';
progressText.textContent = 'Stress Test Completed';
testResults.innerHTML += '<div class="test-pass">All tests passed successfully.</div>';
return;
}
const test = tests[currentTest];
progressText.textContent = `Running ${test.name}...`;
// Update progress bar based on completed tests
const testProgress = 100 / tests.length;
totalProgress += (testProgress / 5); // Add partial progress
progressFill.style.width = `${totalProgress}%`;
// Add test log
const logEntry = document.createElement('div');
logEntry.className = 'test-log';
logEntry.innerHTML = `<span class="timestamp">${new Date().toLocaleTimeString()}</span> Starting ${test.name}`;
document.getElementById('testLog').appendChild(logEntry);
setTimeout(() => {
if (this.isTesting) {
totalProgress += (testProgress / 5);
progressFill.style.width = `${totalProgress}%`;
const resultEntry = document.createElement('div');
resultEntry.className = 'test-log test-pass';
resultEntry.innerHTML = `<span class="timestamp">${new Date().toLocaleTimeString()}</span> ${test.name}: PASSED (0ms latency)`;
document.getElementById('testLog').appendChild(resultEntry);
currentTest++;
runNextTest();
}
}, test.duration);
};
runNextTest();
}
abortTest() {
this.isTesting = false;
document.getElementById('progressText').textContent = 'Test Aborted by User';
alert("Stress test aborted by user.");
}
// ISO Tools Logic
processISO() {
const fileInput = document.getElementById('isoFileInput');
const writeMethod = document.getElementById('writeMethod').value;
if (fileInput.files.length === 0) {
alert("Please select an ISO file first.");
return;
}
const file = fileInput.files[0];
const modal = document.createElement('div');
modal.className = 'modal-overlay';
modal.innerHTML = `
<div class="modal-content">
<h3>ISO Processing: ${file.name}</h3>
<div class="terminal-window">
<div class="terminal-header">
<span class="terminal-dot red"></span>
<span class="terminal-dot yellow"></span>
<span class="terminal-dot green"></span>
<span class="terminal-title">root@device:~# dd if="${file.name}" of=/dev/sda bs=4M</span>
</div>
<div class="terminal-body" id="isoTerminal"></div>
</div>
<button class="btn btn-danger" onclick="this.parentElement.parentElement.remove()">Cancel</button>
</div>
`;
document.body.appendChild(modal);
const terminalBody = document.getElementById('isoTerminal');
const steps = [
`Reading ${file.name}...`,
`Block size set to 4M`,
`Writing image to /dev/sda...`,
`[===================>] 95%`,
`[====================] 100%`,
`Syncing filesystem...`,
`Verification complete. Image written successfully.`
];
let step = 0;
const interval = setInterval(() => {
if (step >= steps.length) {
clearInterval(interval);
return;
}
const line = document.createElement('div');
line.textContent = steps[step];
terminalBody.appendChild(line);
terminalBody.scrollTop = terminalBody.scrollHeight;
step++;
}, 800);
}
}
// Initialize the app when the document is loaded
const app = new DeviceRecoveryApp();