← 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.69: the widget helper retries its bind for five seconds, so a port a stopped instance is still releasing never fails the launch.+ v1.1.68: tall layout never clips: natural-width columns with the bar taking the rest, tall widths set in the manifest, and the page re-renders on its own resize event.  v1.1.67: each widget names its own page (docs: widgets/README.md, shipped with the package) so the Hydrogen Widgets pulldown row links to what it shows, its manifest and files, and how to make your own.
VERSION+1−1
@@ -1 +1 @@-1.1.68+1.1.69
bin/adom-vscode
⋯ 1 unchanged line ⋯
bin/hydrogen-widget-claude-usage

  
bin/hydrogen-widget-codex-usage

  
bin/hydrogen-widget-lib.py+10−1
@@ -79,7 +79,16 @@ def serve(title, data_fn, render_js, refresh_ms=60000, mark=None):             if self.path.startswith('/data.json'): self._send(200, 'application/json', json.dumps(data()).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, 'render_js': render_js, 'mark_svg': ('<svg viewBox="0 0 16 16">' + mark['svg'] + '</svg>') if mark['svg'] else '', 'mark_color': mark['color']}).encode())-    srv = ThreadingHTTPServer(('127.0.0.1', port), H)+    # 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+    srv = None+    for attempt in range(10):+        try:+            srv = ThreadingHTTPServer(('127.0.0.1', port), H); break+        except OSError as e:+            if attempt == 9: raise+            time.sleep(0.5)     # Tell Hydrogen we are up (the health poll would find us anyway; this is the explicit handshake).     ctl = os.environ.get('ADOM_HD_CONTROL_URL'); wid = os.environ.get('HYDROGEN_WIDGET_ID')     if ctl and wid:
bin/hydrogen-widget-marks.py

  
install.sh

  
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-vscode",-  "version": "1.1.68",+  "version": "1.1.69",   "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.68",+  "version": "1.1.69",   "license": "PROPRIETARY",   "visibility": "public",   "hero": {@@ -141,4 +141,4 @@     "adom-vscode-extensions",     "adom-vscode-modes"   ]-}\ No newline at end of file+}