@gotcos/glasses-server 6.99.29 → 6.99.33
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/CHANGELOG.md +58 -0
- package/package.json +1 -1
- package/server/web-control/app.css +40 -9
- package/server/web-control/app.js +245 -20
- package/server/web-control/control.css +12 -6
- package/server/web-control/index.html +1 -0
- package/server/web-control/panes/cos-chat.css +10 -4
- package/server/web-control/panes/cos-chat.js +1 -1
- package/server/web-control/panes/meetings.css +5 -2
- package/server/web-control/panes/meetings.js +1 -1
- package/server/web-control/panes/memories.css +1 -1
- package/server/web-control/panes/memories.js +3 -8
- package/server/web-control/panes/questions.css +20 -4
- package/server/web-control/panes/questions.js +102 -21
- package/server/web-control/panes/sessions.css +18 -7
- package/server/web-control/panes/speakers.css +3 -5
- package/server/web-control/panes/speakers.js +7 -4
- package/server/web-control/panes/threads.js +3 -2
- package/server/web-control/panes/today-actions.css +38 -18
- package/server/web-control/panes/today-actions.js +176 -42
- package/server/web-control/panes/work.css +1 -1
- package/server/web-control/shell.js +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,61 @@
|
|
|
1
|
+
## 6.99.33 - Duo follow-ups: a hung Mac, and the Other field under the keyboard
|
|
2
|
+
|
|
3
|
+
2026-11-07. On 6.99.30 (a90f024, installed privately 17:20). 6.99.32 (98f3cde) was the same work installed privately at 18:09 without the small-frames keyboard fix below; 6.99.33 replaces it. Server only (Control Web); no route changed, so it works with any COS Control that runs 6.99.29. The first public build with the 6.99.30 Duo layout work below; npm goes from 6.99.29 straight to 6.99.33.
|
|
4
|
+
|
|
5
|
+
**Default-on changes:**
|
|
6
|
+
- **A Mac that hangs is marked not answering.** Before, a Mac that neither answered nor refused (asleep, a stale Tailscale route) kept "Server connected" up, and one hung question read stopped the 10 s question check for good. Now the question check gives up after 15 s, says the Mac is not answering (the rail, an open session sheet, and Submit, Allow and Deny waiting with the reason), and checks again. Any read api() makes that times out says the same; a write that times out does not (a slow save is not a Mac that went away). The next answer marks it up again.
|
|
7
|
+
- **A focused field comes back into view when the keyboard rises.** Unfolded, a question card's Other field could sit under the on-screen keyboard (the keyboard rises after the focus, so the first scroll landed too early). Once the layout has the keyboard, the focused field (or the reply box) is scrolled into view again, each time the keyboard rises or grows.
|
|
8
|
+
|
|
9
|
+
- **The Stop button's row is 46 px on phones under 600 px wide**, so the 44 px Stop is no longer clipped top and bottom (6.99.30 made every button there 44 px and left the row at 38).
|
|
10
|
+
|
|
11
|
+
**How the two fixes decide (QA 6.99.32 Skeptic):**
|
|
12
|
+
- The question check's 15 s limit covers the reply's body too. A Mac that answers the headers and then stalls frees the check without being marked down, since it did answer.
|
|
13
|
+
- A read that times out marks the Mac down only if nothing has answered since that read went out. A slow image whose headers came, or a busy Mac whose question check keeps answering, never flaps the status. Write timeouts (POST, PUT, PATCH, DELETE) never mark it down. The Sessions reader's own transport keeps its timeouts to itself.
|
|
14
|
+
- A keyboard "rise" is what covers the bottom growing, by any amount, while the keyboard layout is on: a keyboard that animates up in small frames reveals on each, so its last frame leaves the field in view, and a 120 px bottom bar already holding the layout still reveals when the keyboard comes. Shrinking never reveals, and the scroll moves only as far as needed. The field revealed is the one focused when the frame runs; the reply box reveals its whole form.
|
|
15
|
+
|
|
16
|
+
**Known limits:**
|
|
17
|
+
- Not yet accepted on a physical iPhone Duo. Every check so far is the full suite, code review and headless renders at Duo sizes.
|
|
18
|
+
- At the private install of 6.99.30, the provider check skipped Cursor once ("process exited 1"). A live re-check on the installed server passed in 8 s. The cause of that one exit is not known.
|
|
19
|
+
|
|
20
|
+
**Tests:** web-parity (a hung read gives up at 15 s, marks down, frees the poll and checks again; a body that hangs frees the poll without a down mark; an answer in time clears the limit), duo-layout-630-web (a read timeout marks down; write timeouts do not; a read timeout after another answer does not), today-actions (the reveal after a keyboard or strip rise, only on a rise, the reply form, focus at frame time, never with the sheet closed or focus gone). Each guard was mutation-checked.
|
|
21
|
+
|
|
22
|
+
## 6.99.30 - Duo layout fixes (private)
|
|
23
|
+
|
|
24
|
+
2026-11-07. Private build on 6.99.29 (c925353). Server only (Control Web). Works with COS Control 0.5.376 as installed.
|
|
25
|
+
|
|
26
|
+
Miles tests on an iPhone Duo (folded about 382x678, unfolded about 1430x1000 landscape and 1000x1430 portrait), in Comet as well as Safari, sometimes with a Bluetooth keyboard. Three QA rounds on 6.99.29 (skeptic, design, user canary) found where the layout assumed Safari or a width. Nothing here assumes a browser now: every size comes from what the browser reports.
|
|
27
|
+
|
|
28
|
+
**Default-on changes:**
|
|
29
|
+
- **Today weather moves to the top** (Miles, 15:18, IMG_0504): the weather now sits under the date at the top left of Today, and shows even when no meeting is next; Next up keeps only the meeting.
|
|
30
|
+
- **Today's session sheet is the visible part of the page, keyboard up or down, in any browser.** Its top and height come from visualViewport (100dvh where there is none), so whatever covers the bottom (an on-screen keyboard, a hardware keyboard's strip, Comet's or Chrome's or Safari's bar) stays below the reply box and Send. Only the dim and the sheet's colour reach on to the physical bottom. This replaces 6.99.29's whole-screen layer with the keyboard closed, which put the composer under a bottom bar the page shows through (IMG_0503's 106 px may be Comet's bar).
|
|
31
|
+
- **A hardware keyboard's strip** (55 to 70 px) with a field in the sheet focused is followed too (light layout: the header stays, the reply box drops the home indicator inset). A bar or strip under 120 px never folds the header (Comet's folded bar measured about 110 px); 120 px or more does, focused or not. A strip counts from 24 px, so desktop zoom or a scrollbar never reads as one.
|
|
32
|
+
- **The sheet refits** on window resize, orientationchange, pageshow, the page coming back into view, and focus moving in or out of a field; a turned screen measures the room for the conversation again.
|
|
33
|
+
- **Pinch zoom** is no inset: one shared reading of the visible viewport (Today's sheet and the question card's footer), with the layout height kept from before the zoom.
|
|
34
|
+
- **Every text field is 16 px on a touch screen at every width** (no zoom on focus), and **below 600 px every .cx-btn and .field is at least 44 px**; on touch the small controls the canary measured (nav, switches, chip remove, Retry, camera, clip, Send, question steps, calendar days) reach 44 px.
|
|
35
|
+
- **In session and reply boxes, Return sends only with a keyboard and a fine pointer** (`(hover: hover) and (pointer: fine)`), never mid-composition. On the unfolded Duo, Return is a new line. **Cmd-Return or Ctrl-Return sends on every device**, so a Bluetooth keyboard on the Duo or an iPad has a send key. Ask COS keeps Return-asks on touch as before, but never on an IME's composing key.
|
|
36
|
+
- **"Could not reach COS on your Mac. Check that it is awake and on Tailscale, then try again."** replaces the browser's own "Failed to fetch" or "Load failed" everywhere (api() and the Sessions reader's transport), code `unreachable`.
|
|
37
|
+
- **Server status at once:** a request that never reaches the Mac marks it down; any HTTP answer, whatever its status, marks it up (COS sends its own 502s, so a 502 is never "down"). The question poll that keeps running on Sessions and Meetings reports too, so a down mark never strands the question cards. The rail's server line, an open session sheet ("Your Mac is not answering. This is the last state it sent.") and the question cards (Submit, Allow and Deny wait, with the reason) follow immediately, not on the five-minute check.
|
|
38
|
+
- **The session card's one state uses the Mac's clock** for this page's own moments (a write gate answer, a Stop), learned from each answer's Date header, so a phone a minute off no longer shows Idle over a fresher Working. A probe that never answers gives up after 15 s, so a busy gate is always asked again.
|
|
39
|
+
- **Layout breadcrumbs** go to the existing client diagnostics log (`POST /api/diag/client`, `event: web.layout`; 10 MB with one rotation, 30 lines per 10 s): on opening the sheet and on each keyboard change, the browser family (Comet, Safari, Chrome, CriOS, Firefox), layout and visible heights, offsetTop, zoom, orientation and the sheet's state. Numbers and a few fixed labels (browser family, OS, orientation); never the user agent string, text or ids; at most 40 a page load.
|
|
40
|
+
- **Folded, a waiting question is one line** ("1 question for you. Answer") until tapped, instead of a full card over every pane. Its copy on the page hides while Today's sheet shows it.
|
|
41
|
+
- **Desktop windows under 721 px tall** (a 1366x768 laptop, a short Mac window) show the compact rail instead of the labelled one, the same height clause as the phone step.
|
|
42
|
+
- **Question picks and Other words survive a reload** (this tab only), and typed Other words go into every copy of the card.
|
|
43
|
+
- **A refused or expired queued message** shows "Not sent: <reason>" in Today's sheet for that session and a "Not sent" chip on its Sessions row.
|
|
44
|
+
- **Five files no longer push the reply box off the sheet:** the chips scroll in a capped box (one row with the keyboard up).
|
|
45
|
+
- **Light-mode contrast:** `--tertiary` #6e675d (was #8b8378, 3.29:1), a day with nothing to open in --sub, provider badge words about 25 to 30% darker. Dark mode unchanged.
|
|
46
|
+
- **Today with the Mac not answering** shows one row, "Your Mac is not answering. Try again.", with no empty gap above it.
|
|
47
|
+
- **Plain dates** ("Today", "Nov 7") on Meetings and Speakers rows; no raw thread ids ("t1") on Threads rows.
|
|
48
|
+
- **Settings and Dictation stop at 720 px** on the unfolded Duo; prose lines at about 68 characters.
|
|
49
|
+
|
|
50
|
+
**Also**
|
|
51
|
+
- Back from a tab opened inside the sheet no longer lands on a dead entry (a session opened off the pet's list unwinds its list entry first), and the sheet's own Back steps stop waiting after 700 ms, so they can never swallow a real Back.
|
|
52
|
+
- The live clock and the turn watch skip a hidden page (the watch's three minutes count only visible time); back from the back-forward cache, the sheet and the Sessions reader open their live stream again and read the session again.
|
|
53
|
+
- 100vh to 100dvh with a 100vh fallback (Messages, Meetings, Memories, the Ask sheet). The full rail needs a 721 px tall window too, the same clause as the desktop step.
|
|
54
|
+
- `[hidden]` always hides ("Retry image" showed under loaded images). The attachment limits line wraps inside its row. Under 430 px the Sessions reader's words get their own row above Fork, the clip and Send. With a keyboard up, the question card's footer scrolls with the card.
|
|
55
|
+
- Removed the unread `--ta-kb` variable; comments now give the Duo's real sizes and assume no browser.
|
|
56
|
+
|
|
57
|
+
**Tests:** duo-layout-630-web.test.ts (new, 38) and today-actions.test.ts (the layer, the reply box and the backdrop worked out from the stylesheet and the page's variables for Safari, Chrome iOS, Comet 56 to 110 px bars, a 60 px strip, the keyboard, a panned page, pinch zoom 1.5, rotation and five files; history, hidden timers, server down, refused messages, question cards). 73 mutations, each landed exactly once from a green baseline, all killed (six first survived and got their own test).
|
|
58
|
+
|
|
1
59
|
## 6.99.29 - Verified glasses and phone turns carry a footer; Control Web turns are recorded, not yet vouched; one state on the session card (private)
|
|
2
60
|
|
|
3
61
|
2026-11-07. Private build on 6.99.28 (642921b). Server only. Works with COS Control 0.5.376 as installed.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gotcos/glasses-server",
|
|
3
|
-
"version": "6.99.
|
|
3
|
+
"version": "6.99.33",
|
|
4
4
|
"description": "COS Glasses: self-hosted AI heads-up-display server for Even G2 smart glasses, powered by Claude Code, Codex, Cursor Agent CLI, or local Ollama",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -190,16 +190,17 @@ select.field {
|
|
|
190
190
|
.pane-title { font: 500 40px/1.02 var(--display); letter-spacing: -0.015em; margin: 0; }
|
|
191
191
|
.pane-sub { color: var(--sub); margin: 6px 0 0; font-size: 15px; }
|
|
192
192
|
|
|
193
|
-
/* No bottom bar, on purpose. On
|
|
194
|
-
|
|
193
|
+
/* No bottom bar, on purpose. On a phone the browser owns the bottom edge (Safari's floating
|
|
194
|
+
address pill, Comet's and Chrome's own bars), and iOS 26 WebKit stops drawing the page under
|
|
195
195
|
its bar while any fixed element sits within ~60px of it. Navigation lives in the top bar
|
|
196
|
-
(
|
|
196
|
+
(folded screen) or the left rail (unfolded screen and up). */
|
|
197
197
|
.badge-dot { position: absolute; width: 7px; height: 7px; border-radius: 50%; background: var(--hot); }
|
|
198
198
|
|
|
199
199
|
.rail { display: none; }
|
|
200
200
|
|
|
201
201
|
/* ── Today ───────────────────────────────────────────────── */
|
|
202
202
|
.today-date { color: var(--sub); font-size: 15px; margin: 6px 0 0; }
|
|
203
|
+
.today-weather { color: var(--sub); font-size: 15px; margin: 2px 0 0; }
|
|
203
204
|
/* The session pet on Today: the pet COS Control shows, in the pose the Mac would pick. */
|
|
204
205
|
.today-pet { display: flex; flex-direction: column; align-items: center; margin: 6px 0 14px; min-height: 166px; }
|
|
205
206
|
.today-pet.hidden { display: none; }
|
|
@@ -421,11 +422,13 @@ select.field {
|
|
|
421
422
|
.pane:not(#pane-today) .pane-head .pane-sub { margin-top: 0; }
|
|
422
423
|
}
|
|
423
424
|
|
|
424
|
-
/* ── Short screens: the
|
|
425
|
-
|
|
425
|
+
/* ── Short screens: the folded Duo is about 382x678 with the browser's own bar under that, and
|
|
426
|
+
landscape tablets and laptop windows are often under 720px tall. Height is the scarce axis, so
|
|
427
|
+
the type steps down here, not by width. */
|
|
426
428
|
@media (max-height: 720px) {
|
|
427
429
|
.pane-title { font-size: 34px; }
|
|
428
430
|
.today-date { font-size: 14px; margin-top: 4px; }
|
|
431
|
+
.today-weather { font-size: 14px; }
|
|
429
432
|
.ask-bar { min-height: 46px; margin-top: 12px; }
|
|
430
433
|
.story { font-size: 21px; line-height: 1.3; margin: 18px 2px; }
|
|
431
434
|
.run-panel { padding-top: 8px; }
|
|
@@ -436,8 +439,8 @@ select.field {
|
|
|
436
439
|
.rec-banner { margin-top: 10px; padding: 8px 8px 8px 14px; }
|
|
437
440
|
}
|
|
438
441
|
|
|
439
|
-
/* ──
|
|
440
|
-
axis there is plenty of. */
|
|
442
|
+
/* ── Unfolded Duo (about 1430x1000 landscape, 1000x1430 portrait), tablets, desktop: a labelled
|
|
443
|
+
left rail costs width, which is the axis there is plenty of. */
|
|
441
444
|
@media (min-width: 600px) {
|
|
442
445
|
:root { --gutter: 24px; }
|
|
443
446
|
.topbar { display: none; }
|
|
@@ -468,11 +471,11 @@ select.field {
|
|
|
468
471
|
.run-title, .run-meta { grid-column: 2; }
|
|
469
472
|
.composer { position: sticky; bottom: calc(var(--safe-bottom) + 12px); }
|
|
470
473
|
.toast { top: auto; bottom: 24px; }
|
|
471
|
-
.sheet-backdrop { padding-top: 8vh; }
|
|
474
|
+
.sheet-backdrop { padding-top: 8vh; padding-top: 8dvh; }
|
|
472
475
|
.sheet { max-width: 620px; border-radius: 18px; padding: 16px 18px 18px; max-height: 80dvh; box-shadow: 0 24px 60px rgba(0, 0, 0, 0.25); }
|
|
473
476
|
}
|
|
474
477
|
|
|
475
|
-
/*
|
|
478
|
+
/* Wide but short (a landscape tablet, a short window): keep the rail's nine sections inside 720px. */
|
|
476
479
|
@media (min-width: 600px) and (max-height: 720px) {
|
|
477
480
|
.pane:not(#pane-today) .pane-head .pane-title { display: none; }
|
|
478
481
|
.pane:not(#pane-today) .pane-head { margin: 0 0 12px; }
|
|
@@ -538,3 +541,31 @@ select.field {
|
|
|
538
541
|
.live-prose { margin-top: 8px; font-size: 15px; line-height: 1.45; white-space: pre-wrap; overflow-wrap: anywhere; max-height: 14em; overflow: auto; color: var(--run-title); }
|
|
539
542
|
#session-status .link-btn { min-height: 0; padding: 0; }
|
|
540
543
|
.turn.user.pending { opacity: 0.72; }
|
|
544
|
+
|
|
545
|
+
/* ── Touch screens (6.99.30) ────────────────────────────── */
|
|
546
|
+
/* Every field that types is 16 px on a touch screen, at every width: under 16 px a phone browser zooms the page in on
|
|
547
|
+
focus (the unfolded Duo did it on Sessions' selects, Search, Find and the model picker, 600 px and up). A floor, not
|
|
548
|
+
a size: no field anywhere is set above 16 px. !important because each pane sets its own compact size with more
|
|
549
|
+
specific selectors; this one rule beats them all only on touch. */
|
|
550
|
+
@media (any-pointer: coarse) {
|
|
551
|
+
input:not([type='checkbox']):not([type='radio']):not([type='range']):not([type='color']):not([type='file']):not([type='button']):not([type='submit']):not([type='reset']):not([type='image']):not([type='hidden']),
|
|
552
|
+
select, textarea { font-size: 16px !important; }
|
|
553
|
+
}
|
|
554
|
+
/* Folded phones: every button and field is at least 44 px tall (design QA: .cx-btn came in six heights from 30 px). A
|
|
555
|
+
minimum only, so it grows the compact ones and leaves the taller ones; the per-pane phone heights that fought it are
|
|
556
|
+
gone. */
|
|
557
|
+
@media (max-width: 599px) {
|
|
558
|
+
.cx-btn, .field { min-height: 44px !important; }
|
|
559
|
+
}
|
|
560
|
+
/* Touch screens: the small controls the canary measured under 44 px (nav 30, switches 30, a chip's remove and Retry 36,
|
|
561
|
+
camera and clip 38, Send 38, the question strip's steps 36, the calendar's days 34) reach 44. Floors only (min-*),
|
|
562
|
+
!important because each pane sizes its own with more specific rules. A text switch keeps its look and grows only its
|
|
563
|
+
hit area, so its gold rule stays under the word. */
|
|
564
|
+
@media (any-pointer: coarse) {
|
|
565
|
+
.nav-btn, .btn.small, .cc-chip-retry, .sq-step, .mt-day { min-height: 44px !important; }
|
|
566
|
+
.cc-chip-x, .cc-attach, .cc-camera { min-width: 44px !important; min-height: 44px !important; }
|
|
567
|
+
.cx-switch button::before { content: ''; position: absolute; inset: -7px -4px; }
|
|
568
|
+
}
|
|
569
|
+
/* 6.99.30 (QA): an element with the hidden attribute is hidden, whatever display its classes give it ("Retry image"
|
|
570
|
+
showed under loaded images: .link-btn's inline-flex beat [hidden]). */
|
|
571
|
+
[hidden] { display: none !important; }
|