@nockdev/hsa 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dashboard.html CHANGED
@@ -1490,6 +1490,7 @@
1490
1490
  let selectedSessionId = "";
1491
1491
  let selectedIde = "";
1492
1492
  let selectedProject = "";
1493
+ let sessionSSERetryMs = 1000;
1493
1494
 
1494
1495
  document.getElementById("endpointInput").value = endpoint;
1495
1496
 
@@ -1718,20 +1719,28 @@
1718
1719
  )
1719
1720
  .join("");
1720
1721
 
1721
- if (stack.buildSystem) {
1722
+ // B7: Show ALL build systems, not just primary
1723
+ const systems =
1724
+ stack.buildSystems && stack.buildSystems.length > 0
1725
+ ? stack.buildSystems
1726
+ : stack.buildSystem
1727
+ ? [stack.buildSystem]
1728
+ : [];
1729
+
1730
+ if (systems.length > 0) {
1722
1731
  buildEl.style.display = "flex";
1723
- buildEl.innerHTML = [
1724
- stack.buildSystem.buildCommand
1725
- ? `<span>Build: <code>${stack.buildSystem.buildCommand}</code></span>`
1726
- : "",
1727
- stack.buildSystem.testCommand
1728
- ? `<span>Test: <code>${stack.buildSystem.testCommand}</code></span>`
1729
- : "",
1730
- stack.buildSystem.devCommand
1731
- ? `<span>Dev: <code>${stack.buildSystem.devCommand}</code></span>`
1732
- : "",
1733
- ]
1734
- .filter(Boolean)
1732
+ buildEl.innerHTML = systems
1733
+ .map((bs) => {
1734
+ const name = bs.name || "unknown";
1735
+ const parts = [];
1736
+ if (bs.buildCommand)
1737
+ parts.push(`Build: <code>${bs.buildCommand}</code>`);
1738
+ if (bs.testCommand)
1739
+ parts.push(`Test: <code>${bs.testCommand}</code>`);
1740
+ if (bs.devCommand)
1741
+ parts.push(`Dev: <code>${bs.devCommand}</code>`);
1742
+ return `<span title="${name}"><strong style="color:var(--cat-build-tool)">${name}</strong> ${parts.join(" · ")}</span>`;
1743
+ })
1735
1744
  .join("");
1736
1745
  } else {
1737
1746
  buildEl.style.display = "none";
@@ -2119,8 +2128,8 @@
2119
2128
  const deltas = [];
2120
2129
  for (let i = 1; i < cacheHistory.length; i++) {
2121
2130
  deltas.push({
2122
- hits: cacheHistory[i].hits - cacheHistory[i - 1].hits,
2123
- misses: cacheHistory[i].misses - cacheHistory[i - 1].misses,
2131
+ hits: Math.max(0, cacheHistory[i].hits - cacheHistory[i - 1].hits),
2132
+ misses: Math.max(0, cacheHistory[i].misses - cacheHistory[i - 1].misses),
2124
2133
  });
2125
2134
  }
2126
2135
  const maxVal = Math.max(
@@ -2221,9 +2230,17 @@
2221
2230
  }
2222
2231
  } catch {}
2223
2232
  };
2233
+ // FE-02: Auto-reconnect with exponential backoff
2224
2234
  sessionSSE.onerror = () => {
2225
2235
  sessionSSE.close();
2226
2236
  sessionSSE = null;
2237
+ setTimeout(() => {
2238
+ connectSessionSSE();
2239
+ sessionSSERetryMs = Math.min(sessionSSERetryMs * 2, 30000);
2240
+ }, sessionSSERetryMs);
2241
+ };
2242
+ sessionSSE.onopen = () => {
2243
+ sessionSSERetryMs = 1000;
2227
2244
  };
2228
2245
  } catch {}
2229
2246
  }
@@ -2323,7 +2340,8 @@
2323
2340
  .replace(/&/g, "&amp;")
2324
2341
  .replace(/</g, "&lt;")
2325
2342
  .replace(/>/g, "&gt;")
2326
- .replace(/"/g, "&quot;");
2343
+ .replace(/"/g, "&quot;")
2344
+ .replace(/'/g, "&#39;");
2327
2345
  }
2328
2346
  function fmtUptime(ms) {
2329
2347
  const s = Math.floor(ms / 1000);