← Commit history
README.md+2
@@ -276,6 +276,8 @@ v1.1.20: /command returns errorCode command_not_found (HTTP 400) with did-you-me  v1.1.21: event-driven tab census + Claude session identity (John 2026-09-03: never poll the iframes again). GET /tabs and the SSE stream GET /tabs/events publish the extension host's own tabGroups census on every change; POST /claude/session-start ingests the Claude SessionStart hook (id + transcript path, before the jsonl is flushed) and GET /claude/sessions lists it; POST /claude/open-session opens an existing conversation by id and confirms the bind (retagging sdk-cli transcripts, which the Claude extension otherwise declines). Capability markers in /health: tabs.list, tabs.events, claude.open-session, claude.session-start, claude.sessions. +v1.1.66: widget pages have two layouts chosen by the slot height: rows stacked in the full Title Bar (like the meter), one horizontal row when it is compact.+ v1.1.65: the Claude usage widget reads the structured limits list, so model-scoped weekly limits (Fable limit 93 percent) show with their own name and the provider severity colour, next to the session and weekly bars.  v1.1.64: the usage widgets ask their provider at most once every three minutes, pause while the window is hidden, back off on errors (doubling to 15 minutes), and re-read the sign-in file only when it changes.
VERSION+1−1
@@ -1 +1 @@-1.1.65+1.1.66
bin/adom-vscode
⋯ 1 unchanged line ⋯
bin/hydrogen-widget-claude-usage

  
bin/hydrogen-widget-codex-usage

  
bin/hydrogen-widget-lib.py+26−10
@@ -10,20 +10,36 @@ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer PAGE = """<!doctype html><meta charset="utf-8"><title>%(title)s</title> <style> html,body{margin:0;height:100%%;background:transparent;color:#e6ebef;font-family:"Familjen Grotesk","Satoshi",system-ui,sans-serif;overflow:hidden}-/* Sized by the slot's height, so the same page fits the full Title Bar (30 px) and the compact one (20 px). */-.w{display:flex;align-items:center;gap:calc(20vh);height:100vh;padding:0 calc(20vh);white-space:nowrap;font-size:clamp(7px,37vh,12px);line-height:1.2}-.lbl{opacity:.75;font-size:clamp(6px,30vh,9px);letter-spacing:.04em;text-transform:uppercase}-.bar{position:relative;width:clamp(24px,130vh,40px);height:clamp(4px,20vh,6px);border-radius:3px;background:rgba(255,255,255,.14);overflow:hidden}+/* Two layouts, chosen by the slot's height (the Title Bar, full or compact), like the meter:+   tall = rows stacked to use the height; short = one horizontal row. */+.w{display:flex;align-items:center;height:100vh;padding:0 5px;gap:5px;white-space:nowrap}+.mark{display:inline-flex;flex:none;width:15px;height:15px}.mark svg{width:100%%;height:100%%}+.rows{display:flex;align-items:center;gap:8px;min-width:0;flex:1}+.row{display:flex;align-items:center;gap:4px}+.lbl{opacity:.75;letter-spacing:.04em;text-transform:uppercase}+.bar{position:relative;border-radius:3px;background:rgba(255,255,255,.14);overflow:hidden} .bar i{position:absolute;left:0;top:0;bottom:0;background:#19b3a6;border-radius:3px} .bar.warn i{background:#f0a060}.bar.hot i{background:#e5484d}-.v{font-variant-numeric:tabular-nums;min-width:2.4em;text-align:right}-.big{font-size:clamp(9px,47vh,14px);font-weight:600;font-variant-numeric:tabular-nums}-.err{color:#f0a060;font-size:clamp(7px,33vh,10px)}-.mark{display:inline-flex;flex:none;width:clamp(10px,55vh,17px);height:clamp(10px,55vh,17px)}.mark svg{width:100%%;height:100%%}-</style><body><div class="w"><span class="mark" style="color:%(mark_color)s">%(mark_svg)s</span><div class="w" id="w" style="padding-left:0">%(title)s…</div></div>+.v{font-variant-numeric:tabular-nums;text-align:right}+.big{font-weight:600;font-variant-numeric:tabular-nums}+.err{color:#f0a060}+@media (max-height:33px){+  .w{font-size:clamp(7px,37vh,12px);line-height:1.2}+  .lbl{font-size:clamp(6px,30vh,9px)}.bar{width:clamp(24px,130vh,40px);height:clamp(4px,20vh,6px)}.v{min-width:2.4em}+  .big{font-size:clamp(9px,47vh,14px)}.err{font-size:clamp(7px,33vh,10px)}+  .mark{width:clamp(10px,55vh,17px);height:clamp(10px,55vh,17px)}+}+@media (min-height:34px){+  .w{font-size:9px;line-height:1;padding:2px 6px}+  .rows{flex-direction:column;align-items:stretch;justify-content:center;gap:2px}+  .row{display:grid;grid-template-columns:2.8em 1fr 2.6em;gap:5px}+  .lbl{font-size:7.5px}.bar{width:auto;height:5px}.v{font-size:9px}+  .big{font-size:15px}.err{font-size:9px}+}+</style><body><div class="w"><span class="mark" style="color:%(mark_color)s">%(mark_svg)s</span><div class="rows" id="w">%(title)s…</div></div> <script> const R=%(refresh_ms)d;-function bar(l,p,sev){const c=(sev==='critical'||p>=90)?'hot':(sev==='warning'||p>=70)?'warn':'';return `<span class="lbl">${l}</span><span class="bar ${c}"><i style="width:${Math.max(0,Math.min(100,p))}%%"></i></span><span class="v">${Math.round(p)}%%</span>`;}+function bar(l,p,sev){const c=(sev==='critical'||p>=90)?'hot':(sev==='warning'||p>=70)?'warn':'';return `<span class="row"><span class="lbl">${l}</span><span class="bar ${c}"><i style="width:${Math.max(0,Math.min(100,p))}%%"></i></span><span class="v">${Math.round(p)}%%</span></span>`;} async function tick(){try{const r=await fetch('/data.json',{cache:'no-store'});const d=await r.json();document.getElementById('w').innerHTML=%(render_js)s;}catch(e){document.getElementById('w').innerHTML='<span class="err">no data</span>';}} let tm=null;function arm(){if(tm)return;tm=setInterval(tick,R);}function disarm(){if(tm){clearInterval(tm);tm=null;}} document.addEventListener('visibilitychange',()=>{if(document.hidden)disarm();else{tick();arm();}});
bin/hydrogen-widget-marks.py

  
install.sh

  
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-vscode",-  "version": "1.1.65",+  "version": "1.1.66",   "type": "app",   "description": "CLI + VS Code extension that lets AI assistants and the Hydrogen Desktop frontend drive VS Code from inside an Adom container: open files, live get/set of any setting/theme/font (no reload), native streamed exec, a frontend event queue, container identity (hd/hw), api-key status/inject, extension query/update, modes, paste screenshots, and any VS Code command via a local HTTP API on port 8821 (with port-file fallback discovery).",   "license": "PROPRIETARY",
page.json+2−2
@@ -4,7 +4,7 @@   "slug": "adom-vscode",   "title": "adom-vscode",   "brief": "Let Claude, Codex and Kimi drive VS Code inside your Adom container",-  "version": "1.1.65",+  "version": "1.1.66",   "license": "PROPRIETARY",   "visibility": "public",   "hero": {@@ -141,4 +141,4 @@     "adom-vscode-extensions",     "adom-vscode-modes"   ]-}\ No newline at end of file+}