app
adom-vscode
Public Made by Adomby adom
Let Claude, Codex and Kimi drive VS Code inside your Adom container
← Commit history
release 1.1.101
9 files changed
+15−11
VERSION+1−1@@ -1 +1 @@-1.1.100+1.1.101
bin/adom-vscode⋯ 1 unchanged line ⋯
bin/hydrogen-widget-claude-usage+1−1@@ -45,4 +45,4 @@ def data(): return {'items': bars} RENDER = r"""(d.error?`<span class="err">${d.error}</span>`:(d.items||[]).map(b=>bar(b.label,b.pct,b.severity)).join(''))"""-lib.serve('Claude usage', data, RENDER, 180000, mark=marks.MARKS['claude'])+lib.serve('Claude usage', data, RENDER, 180000, mark=marks.MARKS['claude'], default_view='nums')
bin/hydrogen-widget-codex-usage+1−1@@ -25,4 +25,4 @@ def data(): return {'plan': u.get('plan_type'), 'items': items} RENDER = r"""(d.error?`<span class="err">${d.error}</span>`:(d.items||[]).map(b=>bar(b.label,b.pct,b.severity)).join(''))"""-lib.serve('Codex usage', data, RENDER, 180000, mark=marks.MARKS['codex'])+lib.serve('Codex usage', data, RENDER, 180000, mark=marks.MARKS['codex'], default_view='big:1')
bin/hydrogen-widget-lib.py+9−5@@ -100,7 +100,8 @@ function viewsFor(items){const n=items.length;const v=[{id:'rows',name:'all mete for(let i=0;i<n;i++)for(let j=i+1;j<n;j++)v.push({id:'duo:'+i+','+j,name:items[i].label+' + '+items[j].label}); if(n>1){v.push({id:'nums',name:'all as numbers'});v.push({id:'rings',name:'all as rings'});} return v;}-let curView=(function(){try{return localStorage.getItem('hw.view')||'rows';}catch(e){return 'rows';}})();+const DEF_VIEW='%(default_view)s';+let curView=(function(){try{return localStorage.getItem('hw.view')||DEF_VIEW;}catch(e){return DEF_VIEW;}})(); function renderItems(items,id){const [kind,arg]=String(id).split(':');const at=(k)=>items[Math.max(0,Math.min(items.length-1,+k||0))]; switch(kind){ case 'big':return cell(at(arg));@@ -114,7 +115,7 @@ function renderItems(items,id){const [kind,arg]=String(id).split(':');const at=( function render(d0){const d=d0&&d0.stale?d0.stale:d0;const el=document.getElementById('w');const wrap=document.getElementById('wrap'); el.classList.toggle('stale',!!(d0&&d0.stale));let tip=(d0&&d0.stale)?String(d0.error||''):''; if(d0&&d0.view&&d0.view!==curView){curView=d0.view;try{localStorage.setItem('hw.view',curView);}catch(e){}}- if(d&&Array.isArray(d.items)&&d.items.length){const vs=viewsFor(d.items);let k=vs.findIndex(v=>v.id===curView);if(k<0){k=0;curView='rows';}+ if(d&&Array.isArray(d.items)&&d.items.length){const vs=viewsFor(d.items);let k=vs.findIndex(v=>v.id===curView);if(k<0){k=vs.findIndex(v=>v.id===DEF_VIEW);if(k<0)k=0;curView=vs[k].id;} el.classList.toggle('hz',curView!=='rows');el.innerHTML=renderItems(d.items,curView); tip=(tip?tip+'. ':'')+'%(title)s: '+vs[k].name+'. Click for the next view ('+(k+1)+' of '+vs.length+').';} else{el.classList.remove('hz');el.innerHTML=%(render_js)s;tip=(d0&&d0.error?String(d0.error)+'. ':'')+'Click to check again now.';}@@ -179,7 +180,7 @@ def _save_state(title, st): json.dump(st, open(tmp, 'w')); os.replace(tmp, p) except Exception: pass -def serve(title, data_fn, render_js, refresh_ms=60000, mark=None, align_ms=0):+def serve(title, data_fn, render_js, refresh_ms=60000, mark=None, align_ms=0, default_view='rows'): mark = mark or {'svg': '', 'color': 'currentColor'} port = int(os.environ.get('HYDROGEN_WIDGET_PORT') or (sys.argv[sys.argv.index('--port')+1] if '--port' in sys.argv else 8930)) provider = 'Anthropic' if 'Claude' in title else ('OpenAI' if 'Codex' in title else 'the provider')@@ -187,7 +188,10 @@ def serve(title, data_fn, render_js, refresh_ms=60000, mark=None, align_ms=0): # the next tries come at 5, 15, 45, 90 s, then minutes, capped at 15; back to normal on the # next success. The last good numbers live on disk so a restart shows them at once, dimmed. st = _load_state(title)- cache = {'t': 0, 'v': {'error': 'starting'}, 'wait': refresh_ms/1000, 'good': None, 'fails': 0, 'view': str(st.get('view') or 'rows')}+ # The view a fresh install opens on: the widget's choice (Claude: the three percents in a+ # row; Codex: the week only, John 2026-09-19), until the user clicks to another one, which+ # is remembered on disk and wins from then on.+ cache = {'t': 0, 'v': {'error': 'starting'}, 'wait': refresh_ms/1000, 'good': None, 'fails': 0, 'view': str(st.get('view') or default_view)} if isinstance(st.get('good'), dict) and st['good'].get('items') is not None: cache['good'] = st['good'] when = time.strftime('%H:%M', time.localtime(st.get('at') or 0)) if st.get('at') else 'earlier'@@ -278,7 +282,7 @@ def serve(title, data_fn, render_js, refresh_ms=60000, mark=None, align_ms=0): 'const f=document.getElementById("w");f.dataset.w=m.width;if(!fixed)f.style.width=Math.max(48,Math.min(640,m.width))+"px";});</script></body>') % (title, w, h, 'true' if fixed else 'false') self._send(200, 'text/html; charset=utf-8', page.encode()) elif self.path.startswith('/health'): self._send(200, 'application/json', b'{"ok":true}')- else: self._send(200, 'text/html; charset=utf-8', (PAGE % {'title': title, 'refresh_ms': refresh_ms, 'align_ms': int(align_ms), 'render_js': render_js, 'mark_html': ('<span class="mark" style="color:%s"><svg viewBox="0 0 16 16">%s</svg></span>' % (mark.get('color', 'currentColor'), mark.get('svg', ''))) if mark.get('svg') else ''}).encode())+ else: self._send(200, 'text/html; charset=utf-8', (PAGE % {'title': title, 'default_view': default_view, 'refresh_ms': refresh_ms, 'align_ms': int(align_ms), 'render_js': render_js, 'mark_html': ('<span class="mark" style="color:%s"><svg viewBox="0 0 16 16">%s</svg></span>' % (mark.get('color', 'currentColor'), mark.get('svg', ''))) if mark.get('svg') else ''}).encode()) # Bind with retries: a previous instance Hydrogen just stopped may still be releasing the # port for a moment. Ten tries over five seconds, then give up loudly (the log says why). ThreadingHTTPServer.allow_reuse_address = True
bin/hydrogen-widget-marks.pyinstall.shpackage.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-vscode",- "version": "1.1.100",+ "version": "1.1.101", "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.100",+ "version": "1.1.101", "license": "PROPRIETARY", "visibility": "public", "hero": {@@ -141,4 +141,4 @@ "adom-vscode-extensions", "adom-vscode-modes" ]-}+}