aboutsummaryrefslogtreecommitdiff
path: root/modules/core/terminal.js
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-10-22 01:23:47 +0200
committerAgando <roduccomm@gmail.com>2026-10-22 01:23:47 +0200
commit8dd236e7a03b3cfe3cfb4a0d77b62ce112e4d418 (patch)
tree807a8736b0c711b8d7d9a3b667df67d78165ca5d /modules/core/terminal.js
parent70b9a2f8cc2b249362ca4893fdbb6703c0ea7b8a (diff)
fix(newos4): dashboard shows the real world model and stops dying after 10 s (v4.6.51)
Two defects, both verified live before/after: 1. The World Model panel always said "Not synthesized yet". The page had a renderer for data.worldModel and _collectDashboardData() never set it -- the model was right there in WorldModelModule._model. Now collected and mapped to the renderer's exact keys (model has modules.loaded/skills.count/memory.nodes, the page reads modules/skills/memoryNodes), plus changesSinceLastSnapshot and the recent-error sample, with an honest "not synthesized" fallback. 2. The page discarded any payload older than 10 s and its own 5 s auto-refresh then showed "Cannot connect to newOS4". Stale payloads are now rendered with their age ("Data as of 1:20:14 AM - 3m ago"), labelled amber past 5 min. Also: the Refresh button wrote a localStorage key nobody read -> the terminal now listens for it and re-collects (page says "No terminal tab answered" when no terminal tab is open); storage events repaint instantly; the dead /api/dashboard fetch (404 on all three paths, 5 s stall) is gone; `dashboard --watch` / `--stop` re-collects every 5 s; header says the data is this browser's instance. Verified v4.6.51: panel rows "Synthesized 34s ago / v4.6.51 / 46-22 / 136-3 / 1 nodes 0 edges / OK / none recorded"; 130 s-old payload still renders with "- 3m ago" and no banner (previously "Cannot connect"); storage event moves the footer 13s -> 0s; watch timer advances the payload, --stop clears it; mobile 360/390 px all OK; 0 console errors.
Diffstat (limited to 'modules/core/terminal.js')
-rw-r--r--modules/core/terminal.js42
1 files changed, 31 insertions, 11 deletions
diff --git a/modules/core/terminal.js b/modules/core/terminal.js
index 425c5d6..c586538 100644
--- a/modules/core/terminal.js
+++ b/modules/core/terminal.js
@@ -479,6 +479,16 @@
this.hideAutocomplete();
}
});
+ // 2026-10-22: dashboard.html wrote this key on ⟳ Refresh and nothing listened.
+ window.addEventListener('storage', function (ev) {
+ if (ev.key !== 'webx11_dashboard_data_request') return;
+ const aiMod = this.moduleManager && this.moduleManager.modules
+ ? this.moduleManager.modules.WebX11AIAssistantModule : null;
+ if (aiMod && typeof aiMod._collectDashboardData === 'function') {
+ aiMod._collectDashboardData();
+ }
+ }.bind(this));
+
window.addEventListener('online', () => this.updateNetworkStatus());
window.addEventListener('offline', () => this.updateNetworkStatus());
document.getElementById('file-upload-input').addEventListener('change', (e) => {
@@ -1575,18 +1585,28 @@
if (cmd === 'smart-prompt') { const val = args[0] && args[0] === 'off' ? 'off' : 'on'; localStorage.setItem('webx11_smart_prompt', val); this.print('Smart prompt ' + val, 'success'); this.updatePrompt(); return; }
if (cmd === 'mem') { this.printMemoryStats(); return; }
if (cmd === 'dashboard') {
- // Collect dashboard data and open the dashboard page
- const aiMod = this.moduleManager?.modules?.WebX11AIAssistantModule;
- if (aiMod && typeof aiMod._collectDashboardData === 'function') {
- aiMod._collectDashboardData().then(function() {
- this.print('📊 Dashboard data collected — opening dashboard...', 'success');
- window.open('/spaces/newos4/downloads/dashboard.html', 'newOS4 Dashboard', 'width=1200,height=800');
- }.bind(this));
- } else {
- // Fallback: just open the page (it will try localStorage)
- this.print('📊 Opening dashboard...', 'info');
- window.open('/spaces/newos4/downloads/dashboard.html', 'newOS4 Dashboard', 'width=1200,height=800');
+ const aiMod = this.moduleManager && this.moduleManager.modules
+ ? this.moduleManager.modules.WebX11AIAssistantModule : null;
+ const collect = function () {
+ if (aiMod && typeof aiMod._collectDashboardData === 'function') return aiMod._collectDashboardData();
+ return Promise.resolve(null);
+ };
+ if (args.indexOf('--stop') !== -1) {
+ if (this._dashTimer) { clearInterval(this._dashTimer); this._dashTimer = null; this.print('📊 Dashboard watch stopped', 'info'); }
+ else this.print('📊 Dashboard watch is not running', 'warning');
+ return;
}
+ if (args.indexOf('--watch') !== -1) {
+ if (this._dashTimer) clearInterval(this._dashTimer);
+ collect();
+ this._dashTimer = setInterval(collect, 5000);
+ this.print('📊 Dashboard watch on (5s) — open the dashboard tab; `dashboard --stop` to stop', 'success');
+ return;
+ }
+ collect().then(function () {
+ this.print('📊 Dashboard data collected — opening dashboard...', 'success');
+ window.open('/spaces/newos4/downloads/dashboard.html', 'newOS4 Dashboard', 'width=1200,height=800');
+ }.bind(this));
return;
}
if (cmd === 'config') {