From cfb5334666251c34954a2d5b80a0a3443c15008e Mon Sep 17 00:00:00 2001 From: Pierre Gironde Date: Sun, 4 Oct 2026 12:39:38 +0200 Subject: [PATCH] Improved error feedbacks --- vscode-appdaemon/README.md | 2 + vscode-appdaemon/media/logExplorer.css | 2 + vscode-appdaemon/media/logExplorer.html | 2 +- vscode-appdaemon/media/logExplorer.js | 48 ++++++++++- vscode-appdaemon/src/extension.ts | 3 +- vscode-appdaemon/src/logExplorer.ts | 85 +++++++++++++++++-- vscode-appdaemon/src/logSource.ts | 25 ++++++ vscode-appdaemon/src/statusBar.ts | 7 ++ vscode-appdaemon/tests/logExplorer.test.js | 21 +++++ vscode-appdaemon/tests/logSource.test.js | 17 ++++ vscode-appdaemon/tests/logUi.test.js | 54 ++++++++++++ vscode-appdaemon/vscode-appdaemon-0.2.0.vsix | Bin 53205 -> 58440 bytes 12 files changed, 253 insertions(+), 13 deletions(-) create mode 100644 vscode-appdaemon/src/logSource.ts create mode 100644 vscode-appdaemon/tests/logSource.test.js diff --git a/vscode-appdaemon/README.md b/vscode-appdaemon/README.md index 9bca721..d24fa76 100644 --- a/vscode-appdaemon/README.md +++ b/vscode-appdaemon/README.md @@ -19,6 +19,8 @@ By default, it reads the existing AppDaemon text logs from the workspace: The explorer groups lines by the app name in the standard AppDaemon log format. It provides INFO/WARNING/ERROR counts, expandable app histories, relative timestamps, sorting by latest activity or app name, text/time/level filters, live updates, copy/paste, raw-log navigation, and archived-log import. Duplicate error lines found in multiple files are merged. The log reader handles file rotation, truncation, multiline exceptions, UTF-8, and legacy Windows-1252 bytes. +**AD Logs** turns red when the loaded logs contain an ERROR or CRITICAL entry. **Clear logs** empties the configured live log files and clears the current explorer history; imported archive files are left on disk. + The standard AppDaemon text logs do not contain causal links or reliable initialization boundaries. The details panel will say so for ordinary entries. Existing messages that already contain trace or initialization metadata can still be grouped or linked; the explorer does not create that metadata. **Open history** can also load archived files. No AppDaemon Python changes are needed for this raw-log view. ## Settings diff --git a/vscode-appdaemon/media/logExplorer.css b/vscode-appdaemon/media/logExplorer.css index a991b56..fc97ca9 100644 --- a/vscode-appdaemon/media/logExplorer.css +++ b/vscode-appdaemon/media/logExplorer.css @@ -6,3 +6,5 @@ .log-message.level-WARNING{color:var(--vscode-editorWarning-foreground,#f3cd80)}.log-message.level-ERROR{color:var(--vscode-editorError-foreground,#ffacac)} .block-title{font-weight:600;margin-bottom:6px;color:var(--fg);overflow-wrap:anywhere} + +#error-count{font-weight:700;font-size:14px}#error-count.has-errors{color:var(--vscode-editorError-foreground,#ffacac);border-color:currentColor;background:var(--vscode-inputValidation-errorBackground,#5b3039)} diff --git a/vscode-appdaemon/media/logExplorer.html b/vscode-appdaemon/media/logExplorer.html index c1c01da..f2a6816 100644 --- a/vscode-appdaemon/media/logExplorer.html +++ b/vscode-appdaemon/media/logExplorer.html @@ -3,7 +3,7 @@ AppDaemon · Logs -

AppDaemon Logs

Reading logs…

+

AppDaemon Logs

Reading logs…

Applications

Log details

Select a log to view its details.

The base AppDaemon log format does not include causal links.

diff --git a/vscode-appdaemon/media/logExplorer.js b/vscode-appdaemon/media/logExplorer.js index 9d83da5..0503954 100644 --- a/vscode-appdaemon/media/logExplorer.js +++ b/vscode-appdaemon/media/logExplorer.js @@ -21,6 +21,7 @@ const appFlashTokens = new Map(); let receivedInitialData = false; let pointerSelecting = false; + let errorView; const $ = id => document.getElementById(id); const node = (tag, text, cls) => { const e = document.createElement(tag); if (text !== undefined) e.textContent = text; if (cls) e.className = cls; return e; }; const normalLevel = e => e.level === 'CRITICAL' ? 'ERROR' : e.level; @@ -135,6 +136,7 @@ if (!lastLogs.has(e.app) || e.time > lastLogs.get(e.app).time) lastLogs.set(e.app, e); }); const timeOf = (app, logs) => (lastLogs.get(app) || logs[logs.length - 1]).time; + $('error-count').setAttribute('aria-pressed', String($('level').value === 'ERROR')); [...groups].sort(([a, al], [b, bl]) => { const order = $('sort').value; if (order === 'name') return a.localeCompare(b); @@ -193,7 +195,15 @@ const selectedGroup = visibleEventGroups.get(e.event_id) || [e]; container.replaceChildren(logMessages(selectedGroup, 'selected-message'), node('div', `${e.app} · ${e.timestamp} · ${selectedGroup.length} log lines`, 'metadata')); const raw = node('button', 'Open raw log'); raw.onclick = () => vscode.postMessage({ type: 'open', id: e.event_id }); container.append(raw); - if (e.source) { const source = node('button', 'Open source'); source.onclick = () => vscode.postMessage({ type: 'source', id: e.event_id }); container.append(source); } + const sourceEntries = selectedGroup.filter(entry => entry.source); + const sourceLocations = new Set(); + sourceEntries.forEach(entry => { + const location = `${entry.source.path}:${entry.source.line}`; + if (sourceLocations.has(location)) return; + sourceLocations.add(location); + const source = node('button', 'Open source'); source.title = location; + source.onclick = () => vscode.postMessage({ type: 'source', id: entry.event_id }); container.append(source); + }); if (origin && origin !== selected) { const back = node('button', 'Back to selected log'); back.onclick = () => choose(origin); container.append(back); } const byId = new Map(entries.map(e => [e.event_id, e])); const mirroredEvaluations = new Map(); @@ -315,6 +325,10 @@ $('status').title = traceCount ? 'Showing AppDaemon logs and additional records from configured history files.' : 'Reading the configured AppDaemon text logs. Causal links require additional metadata that the base log format does not contain.'; + const errorCount = entries.filter(e => (e.kind === 'log' || e.kind.startsWith('initialization_')) && normalLevel(e) === 'ERROR').length; + $('error-count').textContent = `${errorCount} error${errorCount === 1 ? '' : 's'}`; + $('error-count').classList.toggle('has-errors', errorCount > 0); + $('error-count').title = 'Errors and critical logs across all apps in loaded history. Click to show them.'; $('warnings').textContent = (message.warnings || []).join(' · '); renderApps(); renderDetail(); } function refreshLastLogAges() { @@ -325,6 +339,12 @@ function selectionActive() { return pointerSelecting || Boolean(window.getSelection()?.toString()); } window.addEventListener('message', event => { if (event.data?.type === 'copied') { $('copy').textContent = 'Copied'; setTimeout(() => $('copy').textContent = 'Copy selected log', 1200); return; } + if (event.data?.type === 'clear-result') { + $('clear').disabled = false; + $('clear').textContent = 'Clear logs'; + if (event.data.failures?.length) $('warnings').textContent = event.data.failures.join(' · '); + return; + } if (event.data?.type !== 'entries') return; latest = event.data; if (!paused && !selectionActive()) apply(latest); @@ -341,9 +361,33 @@ } }); $('copy').onclick = () => { const e = entries.find(e => e.event_id === selected); copy(window.getSelection()?.toString() || (e ? (visibleEventGroups.get(e.event_id) || [e]).map(copyText).join('\n') : '')); }; - ['search', 'period', 'level', 'sort'].forEach(id => $(id).addEventListener('input', () => { save(); renderApps(); })); + ['search', 'period', 'level', 'sort'].forEach(id => $(id).addEventListener('input', () => { + errorView = undefined; selected = undefined; origin = undefined; + save(); renderApps(); renderDetail(); + })); $('pause').onclick = () => { paused = !paused; $('pause').textContent = paused ? 'Resume' : 'Pause'; if (!paused && latest) apply(latest); else if (paused) $('status').textContent = 'Display paused · New events are still being collected'; }; + $('error-count').onclick = () => { + const leaving = $('level').value === 'ERROR'; + if (leaving) { + $('search').value = errorView?.search || ''; + $('period').value = errorView?.period || '0'; + $('level').value = errorView?.level || 'all'; + if (errorView) { expanded.clear(); errorView.expanded.forEach(app => expanded.add(app)); } + errorView = undefined; + } else { + errorView = { search: $('search').value, period: $('period').value, level: $('level').value, expanded: [...expanded] }; + $('search').value = ''; $('period').value = '0'; $('level').value = 'ERROR'; + entries.filter(e => normalLevel(e) === 'ERROR').forEach(e => expanded.add(e.app)); + } + selected = undefined; origin = undefined; + save(); renderApps(); renderDetail(); + if (!leaving) { + const first = document.querySelector('#apps .row'); + if (first) { first.click(); first.closest('.rows').scrollTop = 0; first.focus({ preventScroll: true }); } + } + }; $('import').onclick = () => vscode.postMessage({ type: 'import' }); + $('clear').onclick = () => { selected = undefined; origin = undefined; save(); $('clear').disabled = true; $('clear').textContent = 'Clearing…'; vscode.postMessage({ type: 'clear' }); }; $('graph-mode').onclick = () => { mode = 'graph'; save(); renderDetail(); }; $('tree-mode').onclick = () => { mode = 'tree'; save(); renderDetail(); }; $('sort').value = saved.sort || 'latest'; diff --git a/vscode-appdaemon/src/extension.ts b/vscode-appdaemon/src/extension.ts index a2a77b9..fd932a0 100644 --- a/vscode-appdaemon/src/extension.ts +++ b/vscode-appdaemon/src/extension.ts @@ -345,9 +345,10 @@ export async function activate(context: vscode.ExtensionContext) { haClient = new HAClient(outputChannel); adClient = new ADClient(outputChannel); errorViewer = new ErrorViewer(); - const logExplorer = new LogExplorer(context); + const logExplorer = new LogExplorer(context, count => statusBar.setLogErrorCount(count)); context.subscriptions.push(logExplorer, vscode.commands.registerCommand('appdaemon.exploreLogs', () => logExplorer.show())); statusBar = new StatusBarManager(adClient); + logExplorer.startPolling(); // Wire error count → status bar badge errorViewer.onErrorCountChanged((count) => statusBar.setErrorCount(count)); diff --git a/vscode-appdaemon/src/logExplorer.ts b/vscode-appdaemon/src/logExplorer.ts index e767d8e..0b76d1b 100644 --- a/vscode-appdaemon/src/logExplorer.ts +++ b/vscode-appdaemon/src/logExplorer.ts @@ -3,6 +3,7 @@ import * as fs from 'fs'; import * as path from 'path'; import { randomBytes } from 'crypto'; import { LogEntry, parseLine, decodeLogLine } from './logModel'; +import { findLogSource, SourceDocument } from './logSource'; type Cursor = { offset: number; identity: string; pending: Buffer; last?: LogEntry; discard: boolean; generation: string }; export class LogExplorer implements vscode.Disposable { @@ -16,7 +17,10 @@ export class LogExplorer implements vscode.Disposable { private imported = new Set(); private warnings = new Set(); private busy = false; - constructor(private context: vscode.ExtensionContext) {} + private sourceDocuments?: Promise; + private sourceDocumentsAt = 0; + private publication = 0; + constructor(private context: vscode.ExtensionContext, private onErrorCountChanged?: (count: number) => void) {} show() { if (this.view) { this.view.show(); return; } if (this.panel) { this.panel.reveal(); return; } @@ -27,7 +31,7 @@ export class LogExplorer implements vscode.Disposable { this.configureWebview(this.panel.webview); this.panel.onDidDispose(() => { this.panel = undefined; - if (!this.view) { this.stopPolling(); this.activeWebview = undefined; } + if (!this.view) { this.activeWebview = undefined; } }); this.startPolling(); } @@ -38,11 +42,11 @@ export class LogExplorer implements vscode.Disposable { localResourceRoots: [vscode.Uri.joinPath(this.context.extensionUri, 'media')] }; this.configureWebview(view.webview); - const updateVisibility = () => view.visible ? this.startPolling() : this.stopPolling(); + const updateVisibility = () => { if (view.visible) { this.startPolling(); } }; view.onDidChangeVisibility(updateVisibility, undefined, this.context.subscriptions); view.onDidDispose(() => { if (this.view === view) { this.view = undefined; } - if (!this.panel) { this.stopPolling(); this.activeWebview = undefined; } + if (!this.panel) { this.activeWebview = undefined; } }, undefined, this.context.subscriptions); updateVisibility(); } @@ -77,7 +81,7 @@ export class LogExplorer implements vscode.Disposable { const source = this.entries.get(message.id)?.source; const root = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; if (!source || !root || typeof source.path !== 'string' || !Number.isInteger(source.line)) { return; } - const target = source.path.startsWith('/conf/') ? path.resolve(root, source.path.slice(6)) : path.resolve(source.path); + const target = source.path.startsWith('/conf/') ? path.resolve(root, source.path.slice(6)) : path.resolve(root, source.path); const relative = path.relative(root, target); if (relative.startsWith('..') || path.isAbsolute(relative)) { vscode.window.showInformationMessage('The source is outside the workspace.'); return; } try { @@ -93,10 +97,11 @@ export class LogExplorer implements vscode.Disposable { files?.forEach(uri => this.imported.add(uri.fsPath)); this.poll(); } + if (message.type === 'clear') { this.clearLogs(); } }, undefined, this.context.subscriptions); this.activeWebview = webview; } - private startPolling() { + startPolling() { if (this.timer) { return; } this.poll(); this.timer = setInterval(() => this.poll(), 1000); @@ -104,12 +109,40 @@ export class LogExplorer implements vscode.Disposable { private stopPolling() { if (this.timer) { clearInterval(this.timer); this.timer = undefined; } } - private files(): string[] { + private configuredFiles(): string[] { const folder = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; - if (!folder) { return [...this.imported]; } + if (!folder) { return []; } const config = vscode.workspace.getConfiguration('appdaemon'); const configured = config.get('logExplorerPaths', ['logs/appdaemon.log', 'logs/error.log', 'logs/virtualsensors.log']); - return [...new Set([...configured.map(p => path.resolve(folder, p)), ...this.imported])]; + return [...new Set(configured.map(p => path.resolve(folder, p)))]; + } + private files(): string[] { + return [...new Set([...this.configuredFiles(), ...this.imported])]; + } + private clearLogs() { + const folder = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; + const cleared = new Set(this.imported); + const failures: string[] = []; + if (folder) { + const realRoot = fs.realpathSync(folder); + for (const file of this.configuredFiles()) { + try { + const relative = path.relative(realRoot, fs.realpathSync(file)); + if (relative.startsWith('..') || path.isAbsolute(relative)) { throw new Error('outside the workspace'); } + if (!fs.statSync(file).isFile()) { throw new Error('not a regular file'); } + fs.truncateSync(file, 0); + this.cursors.delete(file); + cleared.add(file); + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { failures.push(`${path.basename(file)}: ${String(error)}`); } + } + } + } + this.imported.clear(); + for (const [id, entry] of this.entries) { if (entry.file && cleared.has(entry.file)) { this.entries.delete(id); } } + failures.forEach(failure => this.warnings.add(`Unable to clear ${failure}`)); + this.publish(); + this.activeWebview?.postMessage({ type: 'clear-result', cleared: cleared.size, failures }); } private poll() { if (this.busy) { return; } @@ -168,7 +201,39 @@ export class LogExplorer implements vscode.Disposable { if (changed) { this.publish(); } } finally { this.busy = false; } } + private async resolveSources(entries: LogEntry[], publication: number) { + if (!entries.some(entry => !entry.source && entry.message.includes('Error parsing string')) || !vscode.workspace.findFiles) { return; } + if (!this.sourceDocuments || Date.now() - this.sourceDocumentsAt > 5000) { + this.sourceDocumentsAt = Date.now(); + this.sourceDocuments = (async () => { + const files = await vscode.workspace.findFiles('**/*.{yaml,yml}', '**/{node_modules,.git}/**'); + const documents: SourceDocument[] = []; + for (const uri of files) { + try { + const doc = await vscode.workspace.openTextDocument(uri); + documents.push({ path: uri.fsPath, text: doc.getText() }); + } catch { /* A configuration file may have been removed. */ } + } + return documents; + })(); + } + try { + const documents = await this.sourceDocuments; + if (publication !== this.publication) { return; } + let changed = false; + for (const entry of entries) { + if (entry.source) { continue; } + const source = findLogSource(entry, documents); + if (source) { entry.source = source; changed = true; } + } + if (changed) { + const zone = vscode.workspace.getConfiguration('appdaemon').get('logTimezone', 'Europe/Berlin'); + this.activeWebview?.postMessage({ type: 'entries', entries, warnings: [...this.warnings], limit: 10000, timezone: zone }); + } + } catch { this.sourceDocuments = undefined; } + } private publish() { + const publication = ++this.publication; const entries = [...this.entries.values()].sort((a, b) => { const time = a.time - b.time; if (time) { return time; } @@ -183,6 +248,7 @@ export class LogExplorer implements vscode.Disposable { const key = e.trace_id ? e.event_id : `${e.timestamp}|${e.app}|${e.level}|${e.message}`; if (seen.has(key)) { return false; } seen.add(key); return true; }); + this.onErrorCountChanged?.(unique.filter(e => (e.kind === 'log' || e.kind.startsWith('initialization_')) && (e.level === 'ERROR' || e.level === 'CRITICAL')).length); // Direct app.log() calls have no LoggerInterface tag. Infer their initialization // group while an explicit per-app initialize() scope is open. const activeInitialization = new Map(); @@ -205,6 +271,7 @@ export class LogExplorer implements vscode.Disposable { } const zone = vscode.workspace.getConfiguration('appdaemon').get('logTimezone', 'Europe/Berlin'); this.activeWebview?.postMessage({ type: 'entries', entries: unique, warnings: [...this.warnings], limit: 10000, timezone: zone }); + void this.resolveSources(unique, publication); } dispose() { this.stopPolling(); this.messageListener?.dispose(); this.panel?.dispose(); } } diff --git a/vscode-appdaemon/src/logSource.ts b/vscode-appdaemon/src/logSource.ts new file mode 100644 index 0000000..42788c4 --- /dev/null +++ b/vscode-appdaemon/src/logSource.ts @@ -0,0 +1,25 @@ +import { LogEntry } from './logModel'; + +export type SourceDocument = { path: string; text: string }; + +/** Resolve parsing failures to the expression in their app's YAML configuration. */ +export function findLogSource(entry: LogEntry, documents: SourceDocument[]): LogEntry['source'] | undefined { + const expression = entry.message.match(/Error parsing string "([^\n]+)"(?: at character|:|\n|$)/)?.[1]; + if (!expression) { return undefined; } + const matches: Array<{ path: string; line: number; app: string }> = []; + for (const document of documents) { + let app = ''; + document.text.split(/\r?\n/).forEach((line, index) => { + const key = line.match(/^([^\s#][^:]*):(?:\s|$)/); + if (key) { app = key[1].replace(/^['"]|['"]$/g, ''); } + if (!line.trimStart().startsWith('#') && line.includes(expression)) { + matches.push({ path: document.path, line: index + 1, app }); + } + }); + } + const local = matches.filter(match => match.app === entry.app); + const candidates = local.length ? local : matches; + if (candidates.length !== 1) { return undefined; } + const { path, line } = candidates[0]; + return { path, line }; +} diff --git a/vscode-appdaemon/src/statusBar.ts b/vscode-appdaemon/src/statusBar.ts index fcb0df0..21a1b97 100644 --- a/vscode-appdaemon/src/statusBar.ts +++ b/vscode-appdaemon/src/statusBar.ts @@ -96,6 +96,13 @@ export class StatusBarManager { } } + setLogErrorCount(count: number) { + this.logsItem.backgroundColor = count > 0 ? new vscode.ThemeColor('statusBarItem.errorBackground') : undefined; + this.logsItem.tooltip = count > 0 + ? `${count} error${count === 1 ? '' : 's'} in loaded AppDaemon logs — open Log Explorer` + : 'Open AppDaemon Log Explorer'; + } + dispose() { this.restartADItem.dispose(); this.restartHAItem.dispose(); diff --git a/vscode-appdaemon/tests/logExplorer.test.js b/vscode-appdaemon/tests/logExplorer.test.js index 27e7fc4..e276b05 100644 --- a/vscode-appdaemon/tests/logExplorer.test.js +++ b/vscode-appdaemon/tests/logExplorer.test.js @@ -60,3 +60,24 @@ test('groups plain app.log lines between explicit initialization markers',()=>{ assert.equal(grouped[1].group_inferred,true); assert.equal(grouped[2].group_inferred,undefined); }); + +test('clears configured live files, keeps imported archives, and updates the log error count',()=>{ + const counts=[];const e=new LogExplorer({},count=>counts.push(count)); + messages=[];const webview={postMessage:m=>messages.push(m)};e.panel={webview};e.activeWebview=webview; + const errorFile=path.join(root,'logs/error.log'); + const archive=path.join(root,'logs/history.log.1'); + fs.writeFileSync(file,'27-09-26 10:12:13 ERROR app: failed\n'); + fs.writeFileSync(errorFile,'27-09-26 10:12:13 ERROR app: failed\n'); + fs.writeFileSync(archive,'27-09-26 10:12:14 INFO app: archived\n'); + e.imported.add(archive);e.poll(); + assert.equal(counts.at(-1),1); + e.clearLogs(); + assert.equal(fs.statSync(file).size,0); + assert.equal(fs.statSync(errorFile).size,0); + assert.match(fs.readFileSync(archive,'utf8'),/archived/); + assert.equal(counts.at(-1),0); + assert.deepEqual(messages.filter(message=>message.type==='entries').at(-1).entries,[]); + fs.appendFileSync(file,'27-09-26 10:12:15 CRITICAL app: new failure\n');e.poll(); + assert.equal(counts.at(-1),1); + assert.equal(latest()[0].message,'new failure'); +}); diff --git a/vscode-appdaemon/tests/logSource.test.js b/vscode-appdaemon/tests/logSource.test.js new file mode 100644 index 0000000..4a27139 --- /dev/null +++ b/vscode-appdaemon/tests/logSource.test.js @@ -0,0 +1,17 @@ +const {test}=require('node:test'); +const assert=require('node:assert/strict'); +const {findLogSource}=require('../out/logSource'); +const expression='sensor.target_temperature_heatpump + 0.5'; +const entry={app:'living_room_heatpump',message:`Error parsing string "${expression}" at character 0:Unknown variable : sensor.target_temperature_heatpump`}; +test('resolves the failing expression inside the matching app rather than another app',()=>{ + const docs=[{path:'/conf/apps/heating.yaml',text:`bedroom_heatpump:\n target_temperature: ${expression}\nliving_room_heatpump:\n target_temperature: ${expression}\n`}]; + assert.deepEqual(findLogSource(entry,docs),{path:'/conf/apps/heating.yaml',line:4}); +}); +test('resolves a unique expression in a shared template and ignores comments',()=>{ + assert.deepEqual(findLogSource(entry,[{path:'/conf/apps/templates.yml',text:`# ${expression}\nlibrary:\n value: ${expression}`}]),{path:'/conf/apps/templates.yml',line:3}); +}); +test('does not guess when a source is missing or ambiguous',()=>{ + assert.equal(findLogSource(entry,[]),undefined); + assert.equal(findLogSource(entry,[{path:'a.yaml',text:`living_room_heatpump:\n a: ${expression}\n b: ${expression}`}]),undefined); + assert.equal(findLogSource({...entry,message:'Initialization failed'},[]),undefined); +}); diff --git a/vscode-appdaemon/tests/logUi.test.js b/vscode-appdaemon/tests/logUi.test.js index 27d44a1..950d902 100644 --- a/vscode-appdaemon/tests/logUi.test.js +++ b/vscode-appdaemon/tests/logUi.test.js @@ -157,3 +157,57 @@ test('shows consecutive logs from one explicit group as a single visible row',() assert.doesNotMatch(rows[0].textContent,/\[group=/); dom.window.close(); }); + +test('global error counter shows all loaded errors and opens them despite active filters',()=>{ + const {dom,d,entries,send}=setup(); + send([...entries,{...entries[3],event_id:'alpha-error',level:'ERROR',message:'Alpha failed'}, + {...entries[4],event_id:'beta-critical',level:'CRITICAL',message:'Beta failed'}, + {...entries[4],event_id:'supplement',kind:'evaluation',level:'ERROR',message:'Supplemental'}]); + const counter=d.getElementById('error-count'); + assert.equal(counter.textContent,'2 errors');assert.ok(counter.classList.contains('has-errors')); + d.getElementById('search').value='nothing';d.getElementById('period').value='15'; + counter.click(); + assert.equal(d.getElementById('search').value,'');assert.equal(d.getElementById('period').value,'0'); + assert.equal(d.getElementById('level').value,'ERROR'); + assert.equal(d.querySelectorAll('#apps .row').length,2); + assert.match(d.getElementById('detail').textContent,/failed/); + dom.window.close(); +}); + +test('exits errors with the counter or All levels and restores normal app sorting',()=>{ + const {dom,d,entries,send}=setup(); + send([...entries,{...entries[3],event_id:'old-alpha-error',time:entries[0].time,level:'ERROR',message:'Old error'}]); + const counter=d.getElementById('error-count'); + counter.click();assert.equal(counter.getAttribute('aria-pressed'),'true'); + assert.equal(d.querySelector('[data-app]').dataset.app,'alpha'); + counter.click(); + assert.equal(d.getElementById('level').value,'all'); + assert.equal(counter.getAttribute('aria-pressed'),'false'); + assert.equal(d.querySelector('[data-app]').dataset.app,'beta'); + counter.click(); + d.getElementById('level').value='all';d.getElementById('level').dispatchEvent(new dom.window.Event('input')); + assert.equal(d.querySelector('[data-app]').dataset.app,'beta'); + assert.equal(d.querySelectorAll('.row.selected').length,0); + assert.equal(counter.getAttribute('aria-pressed'),'false'); + dom.window.close(); +}); + +test('Open source in a group targets the parsing error even when the last entry has no source',()=>{ + const {dom,d,entries,send,sent}=setup(); + send([{...entries[0],event_id:'parse-error',level:'ERROR',source:{path:'/conf/apps/heating.yaml',line:160}}, + {...entries[1],event_id:'init-failed',level:'ERROR',message:'Initialization failed'}]); + const app=d.querySelector('[data-app="alpha"]');app.open=true;app.dispatchEvent(new dom.window.Event('toggle')); + app.querySelector('.row').click(); + const source=[...d.querySelectorAll('#detail button')].find(button=>button.textContent==='Open source'); + assert.ok(source);source.click();assert.equal(sent.at(-1).type,'source');assert.equal(sent.at(-1).id,'parse-error'); + dom.window.close(); +}); + +test('Clear logs sends a request and resets its button after completion',()=>{ + const {dom,d,sent}=setup(); + const button=d.getElementById('clear');button.click(); + assert.equal(sent.at(-1).type,'clear');assert.equal(button.disabled,true); + dom.window.dispatchEvent(new dom.window.MessageEvent('message',{data:{type:'clear-result',cleared:2,failures:[]}})); + assert.equal(button.disabled,false);assert.equal(button.textContent,'Clear logs'); + dom.window.close(); +}); diff --git a/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix b/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix index 9e2097aaea2a7929f7718ddb681a37bdcb3d05bb..4002bd389223de258abe530e1b65910420bdc08e 100644 GIT binary patch delta 36602 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

*4`dZvI?!LKaL)n|z8f7;S$ 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 MsShgb(3`mTUjUr2h5!Hn delta 31309 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