@gotcos/glasses-server 6.98.0 → 6.99.12
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 +158 -0
- package/package.json +2 -1
- package/server/index.ts +147 -9
- package/server/lib/api-auth.ts +31 -14
- package/server/lib/claude-bridge.ts +21 -2
- package/server/lib/codex-bridge.ts +21 -2
- package/server/lib/display-bus.ts +3 -0
- package/server/lib/drop-destinations.ts +134 -0
- package/server/lib/drop-history-search.ts +97 -0
- package/server/lib/drop-p2-boot.ts +60 -0
- package/server/lib/drop-p2-runtime.ts +237 -0
- package/server/lib/drop-p2-settings.ts +174 -0
- package/server/lib/drop-resolution.ts +168 -0
- package/server/lib/drop-router.ts +325 -0
- package/server/lib/drop-service.ts +739 -0
- package/server/lib/drop-settings.ts +45 -0
- package/server/lib/drop-store.ts +428 -0
- package/server/lib/drop-when.ts +265 -0
- package/server/lib/glasses-pairing.ts +15 -0
- package/server/lib/learning-needs-you.ts +111 -0
- package/server/lib/live-cues-v2-data.ts +336 -26
- package/server/lib/live-cues-v2-settings.ts +2 -1
- package/server/lib/live-cues-v2.ts +9 -5
- package/server/lib/meeting-consolidation-run.ts +169 -0
- package/server/lib/meeting-store.ts +61 -0
- package/server/lib/meeting-title-steer.ts +200 -0
- package/server/lib/network-policy.ts +84 -6
- package/server/lib/permission-broker.ts +11 -0
- package/server/lib/ping-budget.ts +149 -0
- package/server/lib/ping-engine.ts +245 -0
- package/server/lib/ping-feed-sink.ts +33 -0
- package/server/lib/ping-sources.ts +192 -0
- package/server/lib/query-job-coordinator.ts +5 -2
- package/server/lib/query-job-runtime.ts +45 -4
- package/server/lib/query-job-types.ts +10 -1
- package/server/lib/reminder-scheduler.ts +153 -0
- package/server/lib/tailnet-self-name.ts +103 -0
- package/server/lib/tailscale-nudge.ts +40 -2
- package/server/lib/task-store.ts +32 -0
- package/server/lib/web-ask-admission.ts +56 -0
- package/server/lib/web-live-chunks.ts +273 -0
- package/server/lib/web-memories-bridge.ts +323 -0
- package/server/lib/web-session-auth.ts +492 -0
- package/server/lib/web-usage-bridge.ts +154 -0
- package/server/lib/work-search.ts +14 -1
- package/server/lib/your-move-count.ts +58 -0
- package/server/routes/display.ts +11 -1
- package/server/routes/drops.ts +260 -0
- package/server/routes/health.ts +16 -0
- package/server/routes/live-cues.ts +5 -4
- package/server/routes/meeting.ts +61 -5
- package/server/routes/permission-broker.ts +23 -3
- package/server/routes/transcribe-stream.ts +34 -3
- package/server/routes/web-control.ts +569 -0
- package/server/routes/welcome-context.ts +2 -1
- package/server/web-control/app.css +519 -0
- package/server/web-control/app.js +3643 -0
- package/server/web-control/control.css +312 -0
- package/server/web-control/fonts/DMSans.ttf +0 -0
- package/server/web-control/fonts/Fraunces.ttf +0 -0
- package/server/web-control/fonts/JetBrainsMono.ttf +0 -0
- package/server/web-control/index.html +275 -0
- package/server/web-control/mark.svg +1 -0
- package/server/web-control/memories/d3.min.js +2 -0
- package/server/web-control/memories/graph-explorer.css +200 -0
- package/server/web-control/memories/graph-explorer.js +748 -0
- package/server/web-control/memories/memories-app.js +1561 -0
- package/server/web-control/memories/memories-theme.css +73 -0
- package/server/web-control/memories/memories.html +72 -0
- package/server/web-control/memories/memory-stewardship.js +63 -0
- package/server/web-control/memories/memory-workspace.js +216 -0
- package/server/web-control/panes/cos-chat.css +157 -0
- package/server/web-control/panes/cos-chat.js +973 -0
- package/server/web-control/panes/dictation.js +173 -0
- package/server/web-control/panes/meetings.css +257 -0
- package/server/web-control/panes/meetings.js +2264 -0
- package/server/web-control/panes/messages.js +711 -0
- package/server/web-control/panes/questions.css +32 -0
- package/server/web-control/panes/questions.js +275 -0
- package/server/web-control/panes/sessions.css +452 -0
- package/server/web-control/panes/settings.js +292 -0
- package/server/web-control/panes/speakers.css +269 -0
- package/server/web-control/panes/speakers.js +2755 -0
- package/server/web-control/panes/threads.js +200 -0
- package/server/web-control/panes/work.css +261 -0
- package/server/web-control/panes/work.js +1667 -0
- package/server/web-control/shell.js +294 -0
- package/server/web-control/theme.js +25 -0
- package/server/web-control/vendor/qrcode-encoder.js +10 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/* COS Control Web: Control's own chrome and pane kit, loaded after app.css.
|
|
2
|
+
Measurements follow Control 0.5.366 (ActivityWindow.swift, COSBrand.swift): the 248pt rail with a
|
|
3
|
+
story under each name from 1100px, the icon rail below that, the navigation bar off Today, and
|
|
4
|
+
the shared pane pieces (tinted hero, text switch with a gold rule, rows, tags, YOU/COS cards).
|
|
5
|
+
Phone sizes are set for reading on the iPhone Duo; the desktop steps down toward Control's. */
|
|
6
|
+
|
|
7
|
+
:root {
|
|
8
|
+
--tint: var(--accent);
|
|
9
|
+
--tertiary: #8b8378;
|
|
10
|
+
--gold: #b98a3e;
|
|
11
|
+
--green: #2f7d4f;
|
|
12
|
+
--amber: #a8641c;
|
|
13
|
+
--amber-bg: rgba(214, 140, 52, 0.14);
|
|
14
|
+
--green-bg: rgba(47, 125, 79, 0.12);
|
|
15
|
+
--gold-bg: rgba(185, 138, 62, 0.14);
|
|
16
|
+
--hairline: var(--row-border);
|
|
17
|
+
}
|
|
18
|
+
:root[data-theme='dark'] {
|
|
19
|
+
--tertiary: #8f8577;
|
|
20
|
+
--gold: #d9b06a;
|
|
21
|
+
--green: #6ccf8f;
|
|
22
|
+
--amber: #e8a46c;
|
|
23
|
+
--amber-bg: rgba(232, 164, 108, 0.16);
|
|
24
|
+
--green-bg: rgba(108, 207, 143, 0.14);
|
|
25
|
+
--gold-bg: rgba(217, 176, 106, 0.16);
|
|
26
|
+
}
|
|
27
|
+
@media (prefers-color-scheme: dark) {
|
|
28
|
+
:root:not([data-theme='light']) {
|
|
29
|
+
--tertiary: #8f8577; --gold: #d9b06a; --green: #6ccf8f; --amber: #e8a46c;
|
|
30
|
+
--amber-bg: rgba(232, 164, 108, 0.16); --green-bg: rgba(108, 207, 143, 0.14); --gold-bg: rgba(217, 176, 106, 0.16);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Section tints (ActivitySection.tint). */
|
|
35
|
+
[data-tint='messages'] { --tint: rgb(61, 122, 199); }
|
|
36
|
+
[data-tint='speakers'] { --tint: rgb(199, 87, 99); }
|
|
37
|
+
[data-tint='meetings'] { --tint: rgb(209, 133, 56); }
|
|
38
|
+
[data-tint='memories'] { --tint: rgb(122, 92, 184); }
|
|
39
|
+
[data-tint='threads'] { --tint: rgb(56, 145, 99); }
|
|
40
|
+
[data-tint='sessions'] { --tint: rgb(110, 110, 122); }
|
|
41
|
+
[data-tint='work'] { --tint: var(--gold); }
|
|
42
|
+
[data-tint='dictation'] { --tint: rgb(168, 107, 61); }
|
|
43
|
+
|
|
44
|
+
/* ── rail ─────────────────────────────────────────────── */
|
|
45
|
+
.rail-head .rail-brand, .rail-story, .server-text { display: none; }
|
|
46
|
+
.rail-text { display: flex; flex-direction: column; align-items: center; min-width: 0; }
|
|
47
|
+
.rail-settings { display: none; }
|
|
48
|
+
.server-line { display: none; }
|
|
49
|
+
.dot.bad { background: var(--hot); }
|
|
50
|
+
#section-menu .rail-story.hot { color: var(--hot); }
|
|
51
|
+
|
|
52
|
+
@media (min-width: 600px) {
|
|
53
|
+
.rail-head { display: flex; flex-direction: column; align-items: center; }
|
|
54
|
+
.rail-head .mark { width: 30px; height: 30px; margin-bottom: 10px; }
|
|
55
|
+
/* Icon mode: a hot story shows as a dot on the icon (Control's 8pt hot dot). */
|
|
56
|
+
.rail-btn.hot::after { content: ''; position: absolute; top: 7px; right: 15px; width: 8px; height: 8px; border-radius: 50%; background: var(--hot); }
|
|
57
|
+
.rail-settings { display: flex; flex-direction: column; align-items: center; gap: 3px; width: 62px; min-height: 46px; padding: 6px 0 4px; border-radius: 12px; color: var(--grey); }
|
|
58
|
+
.rail-settings .icon { width: 20px; height: 20px; }
|
|
59
|
+
.rail-settings[aria-current='page'] { background: var(--rail-active); color: var(--ink); }
|
|
60
|
+
.server-line { display: flex; align-items: center; justify-content: center; margin: 8px 0 0; }
|
|
61
|
+
}
|
|
62
|
+
@media (min-width: 600px) and (max-height: 720px) {
|
|
63
|
+
.rail-head .mark { width: 26px; height: 26px; margin-bottom: 6px; }
|
|
64
|
+
.rail-settings { min-height: 40px; }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Full rail (Control's at window width 1100 and up): name and story beside the glyph. */
|
|
68
|
+
@media (min-width: 1100px) {
|
|
69
|
+
.app-shell { grid-template-columns: 248px minmax(0, 1fr); }
|
|
70
|
+
.rail { align-items: stretch; padding: calc(var(--safe-top) + 18px) 12px 14px; gap: 2px; }
|
|
71
|
+
.rail-head { flex-direction: row; align-items: center; gap: 8px; padding: 0 8px 14px; }
|
|
72
|
+
.rail-head .mark { width: 22px; height: 22px; margin: 0; }
|
|
73
|
+
.rail-head .rail-brand { display: inline; font: 500 20px/1 var(--display); color: var(--ink); }
|
|
74
|
+
.rail-btn { width: 100%; flex-direction: row; align-items: flex-start; justify-content: flex-start; gap: 11px; padding: 8px 10px; min-height: 0; border-radius: 10px; border: 1px solid transparent; text-align: left; }
|
|
75
|
+
.rail-btn .icon { width: 18px; height: 18px; margin-top: 2px; flex: none; color: var(--ink); }
|
|
76
|
+
.rail-text { align-items: flex-start; }
|
|
77
|
+
.rail-label { font: 600 14px/1.25 var(--body); letter-spacing: 0; color: var(--ink); }
|
|
78
|
+
.rail-story { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font-size: 12.5px; line-height: 1.3; color: var(--sub); margin-top: 1px; }
|
|
79
|
+
.rail-story.hot { color: var(--hot); }
|
|
80
|
+
.rail-btn[aria-current='page'] { background: var(--rail-active); border-color: var(--panel-border); box-shadow: none; }
|
|
81
|
+
.rail-btn.hot::after { display: none; }
|
|
82
|
+
.rail-btn .badge-dot { display: none; }
|
|
83
|
+
.rail-sep { width: auto; height: 12px; background: none; margin: 0; }
|
|
84
|
+
.rail-settings { width: auto; flex-direction: row; justify-content: flex-start; gap: 8px; padding: 6px 10px; min-height: 0; font: 400 13px/1.2 var(--body); color: var(--accent); }
|
|
85
|
+
.rail-settings .icon { display: none; }
|
|
86
|
+
.rail-settings .rail-label { font: 500 13px/1.2 var(--body); color: var(--accent); }
|
|
87
|
+
.server-line { justify-content: flex-start; gap: 7px; padding: 4px 10px 0; margin: 0; }
|
|
88
|
+
.server-text { display: inline; font: 500 11.5px/1 var(--mono); color: var(--ok); }
|
|
89
|
+
.server-line.down .server-text { color: var(--hot); }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* ── navigation bar (off Today, 600px and up) ─────────── */
|
|
93
|
+
.navbar { display: none; }
|
|
94
|
+
@media (min-width: 600px) {
|
|
95
|
+
.navbar:not(.hidden) {
|
|
96
|
+
display: flex; align-items: center; gap: 6px; position: sticky; top: 0; z-index: 20;
|
|
97
|
+
height: calc(44px + var(--safe-top)); padding: var(--safe-top) calc(var(--gutter) + var(--safe-right)) 0 var(--gutter);
|
|
98
|
+
background: var(--page); border-bottom: 1px solid var(--rail-border);
|
|
99
|
+
}
|
|
100
|
+
.nav-btn { display: inline-flex; align-items: center; gap: 5px; height: 30px; padding: 0 10px; border-radius: 8px; border: 1px solid var(--panel-border); background: var(--btn-bg); color: var(--ink); font: 500 13px/1 var(--body); flex: none; }
|
|
101
|
+
.nav-btn .icon { width: 15px; height: 15px; stroke-width: 1.8; }
|
|
102
|
+
.nav-btn:disabled { opacity: 0.4; }
|
|
103
|
+
.crumbs { display: flex; align-items: center; min-width: 0; list-style: none; margin: 0 0 0 6px; padding: 0; font: 400 12.5px/1.2 var(--body); color: var(--sub); }
|
|
104
|
+
.crumb { white-space: nowrap; }
|
|
105
|
+
.crumb + .crumb::before { content: '›'; margin: 0 6px; color: var(--tertiary); }
|
|
106
|
+
.crumb.root { font-weight: 600; color: var(--ink); }
|
|
107
|
+
.crumb.current { font-weight: 600; color: var(--ink); }
|
|
108
|
+
.crumb.dim { color: var(--sub); }
|
|
109
|
+
.crumb.detail { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
|
|
110
|
+
.navbar .grow { flex: 1; }
|
|
111
|
+
body.has-navbar .workspace { padding-top: 18px; }
|
|
112
|
+
}
|
|
113
|
+
@media (min-width: 600px) and (max-width: 759px) {
|
|
114
|
+
.nav-btn span { display: none; }
|
|
115
|
+
.nav-btn { padding: 0 8px; }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* ── pane kit: hero ───────────────────────────────────── */
|
|
119
|
+
.cx { --pad: 16px; }
|
|
120
|
+
.cx-hero {
|
|
121
|
+
display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 4px 14px; align-items: center;
|
|
122
|
+
margin: 0 calc(-1 * var(--gutter)) 0; padding: 14px var(--gutter) 14px;
|
|
123
|
+
background: color-mix(in srgb, var(--tint) 4.5%, transparent); border-bottom: 1px solid var(--hairline);
|
|
124
|
+
}
|
|
125
|
+
.cx-glyph { width: 42px; height: 42px; border-radius: 11px; display: grid; place-items: center; background: color-mix(in srgb, var(--tint) 14%, transparent); color: var(--tint); flex: none; }
|
|
126
|
+
.cx-glyph .icon { width: 22px; height: 22px; }
|
|
127
|
+
.cx-hero-text { min-width: 0; }
|
|
128
|
+
.cx-title { font: 500 24px/1.15 var(--display); color: var(--ink); margin: 0; letter-spacing: -0.01em; }
|
|
129
|
+
.cx-detail-line { margin: 3px 0 0; font-size: 13px; color: var(--sub); overflow-wrap: anywhere; }
|
|
130
|
+
.cx-actions { display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; }
|
|
131
|
+
.cx-stats { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 6px 18px; margin-top: 6px; }
|
|
132
|
+
.cx-stat { display: inline-flex; align-items: baseline; gap: 6px; }
|
|
133
|
+
.cx-stat b { font: 600 15px/1 var(--body); color: var(--ink); }
|
|
134
|
+
.cx-stat span { font: 600 9.5px/1 var(--mono); letter-spacing: 0.06em; color: var(--tertiary); }
|
|
135
|
+
@media (max-width: 599px) {
|
|
136
|
+
.cx-hero { grid-template-columns: auto minmax(0, 1fr); margin-top: -4px; }
|
|
137
|
+
.cx-actions { grid-column: 1 / -1; justify-content: flex-start; }
|
|
138
|
+
.cx-glyph { width: 36px; height: 36px; border-radius: 10px; }
|
|
139
|
+
.cx-title { font-size: 22px; }
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* Quiet bordered button (Control's .bordered small). */
|
|
143
|
+
.cx-btn { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 12px; border-radius: 8px; border: 1px solid var(--btn-border); background: var(--btn-bg); color: var(--ink); font: 500 13.5px/1 var(--body); white-space: nowrap; }
|
|
144
|
+
.cx-btn .icon { width: 15px; height: 15px; stroke-width: 1.8; }
|
|
145
|
+
.cx-btn:disabled { opacity: 0.45; }
|
|
146
|
+
.cx-btn.primary { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
|
|
147
|
+
.cx-btn.quiet { border-color: var(--panel-border); }
|
|
148
|
+
@media (max-width: 599px) { .cx-btn { height: 36px; font-size: 14.5px; } }
|
|
149
|
+
|
|
150
|
+
/* ── text switch (COSBrand: words with a 2pt gold rule, never pills) ── */
|
|
151
|
+
.cx-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px; margin: 12px 0 10px; }
|
|
152
|
+
.cx-switch { display: inline-flex; align-items: baseline; gap: 14px; }
|
|
153
|
+
.cx-switch-label { font-size: 12.5px; color: var(--sub); }
|
|
154
|
+
.cx-switch button { position: relative; padding: 6px 0 7px; font: 500 14px/1 var(--body); color: var(--sub); }
|
|
155
|
+
.cx-switch button[aria-pressed='true'] { color: var(--ink); font-weight: 600; }
|
|
156
|
+
.cx-switch button[aria-pressed='true']::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 2px; border-radius: 1px; background: var(--gold); }
|
|
157
|
+
.cx-search { position: relative; flex: 1 1 220px; max-width: 320px; display: flex; align-items: center; gap: 8px; }
|
|
158
|
+
.cx-search .field { min-height: 36px; padding: 0 12px; font-size: 14px; border-radius: 9px; }
|
|
159
|
+
.cx-search .cx-clear { font-size: 13px; color: var(--accent); font-weight: 600; flex: none; }
|
|
160
|
+
.cx-check { display: inline-flex; align-items: center; gap: 7px; font-size: 13px; color: var(--ink); margin-left: auto; }
|
|
161
|
+
.cx-check input { width: 16px; height: 16px; accent-color: var(--gold); }
|
|
162
|
+
@media (max-width: 599px) {
|
|
163
|
+
.cx-search { max-width: none; flex-basis: 100%; order: 3; }
|
|
164
|
+
.cx-search .field { min-height: 40px; font-size: 16px; }
|
|
165
|
+
.cx-switch button { font-size: 15px; padding: 8px 0 9px; }
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* Crossing line: "Recent 3 · Archive 2 days ->". */
|
|
169
|
+
.cx-cross { font-size: 12.5px; color: var(--sub); margin: -2px 0 10px; display: flex; flex-wrap: wrap; gap: 4px 6px; align-items: center; }
|
|
170
|
+
.cx-cross .door { color: var(--gold); font-weight: 600; }
|
|
171
|
+
.cx-cross .door { display: inline-flex; align-items: center; gap: 2px; }
|
|
172
|
+
.cx-cross .door .icon { width: 12px; height: 12px; }
|
|
173
|
+
|
|
174
|
+
/* ── rows ─────────────────────────────────────────────── */
|
|
175
|
+
.cx-list { background: var(--panel); border: 1px solid var(--panel-border); border-radius: 14px; overflow: hidden; }
|
|
176
|
+
.cx-row { display: grid; grid-template-columns: 32px minmax(0, 1fr) 12px; gap: 12px; align-items: start; width: 100%; padding: 13px 14px; text-align: left; color: inherit; position: relative; }
|
|
177
|
+
.cx-row + .cx-row::before { content: ''; position: absolute; top: 0; left: 58px; right: 0; height: 1px; background: var(--hairline); }
|
|
178
|
+
.cx-row:hover { background: var(--qopen); }
|
|
179
|
+
.cx-row:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
|
|
180
|
+
.cx-row-glyph { width: 32px; height: 32px; border-radius: 9px; display: grid; place-items: center; color: var(--tint); background: color-mix(in srgb, var(--tint) 11%, transparent); position: relative; }
|
|
181
|
+
.cx-row-glyph .icon { width: 17px; height: 17px; }
|
|
182
|
+
.cx-row-glyph .cx-badge-icon { position: absolute; right: -4px; bottom: -4px; width: 17px; height: 17px; border-radius: 5px; background: var(--panel); border: 1px solid var(--panel-border); display: grid; place-items: center; color: var(--sub); }
|
|
183
|
+
.cx-row-glyph .cx-badge-icon .icon { width: 11px; height: 11px; }
|
|
184
|
+
.cx-row-body { min-width: 0; }
|
|
185
|
+
.cx-meta { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 9px; }
|
|
186
|
+
.cx-num { font: 600 12.5px/1.3 var(--body); color: var(--ink); }
|
|
187
|
+
.cx-time { font: 400 11px/1.3 var(--mono); color: var(--tertiary); }
|
|
188
|
+
.cx-tag { font: 600 9.5px/1.3 var(--mono); letter-spacing: 0.06em; color: var(--sub); }
|
|
189
|
+
.cx-model { font: 400 11px/1.3 var(--mono); color: var(--sub); }
|
|
190
|
+
.cx-att { display: inline-flex; align-items: center; gap: 3px; font: 400 11px/1.3 var(--mono); color: var(--sub); }
|
|
191
|
+
.cx-att .icon { width: 12px; height: 12px; }
|
|
192
|
+
.cx-row-title { margin-top: 3px; font-size: 15px; line-height: 1.35; color: var(--ink); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
|
|
193
|
+
.cx-row-title.strong { font-weight: 600; }
|
|
194
|
+
.cx-row-sub { margin-top: 3px; font-size: 13px; line-height: 1.4; color: var(--sub); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
|
|
195
|
+
.cx-row-sub.three { -webkit-line-clamp: 3; }
|
|
196
|
+
.cx-id { margin-top: 3px; font: 400 10.5px/1.3 var(--mono); color: var(--tertiary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
197
|
+
.cx-row .chev { margin-top: 12px; }
|
|
198
|
+
@media (min-width: 1100px) {
|
|
199
|
+
.cx-row-title { font-size: 13.5px; }
|
|
200
|
+
.cx-row-sub { font-size: 12px; }
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* Pills and capsules. */
|
|
204
|
+
.cx-pill { display: inline-flex; align-items: center; height: 18px; padding: 0 7px; border-radius: 5px; font: 600 9.5px/1 var(--mono); letter-spacing: 0.05em; white-space: nowrap; background: var(--qopen); color: var(--sub); }
|
|
205
|
+
.cx-pill.warn { background: var(--amber-bg); color: var(--amber); }
|
|
206
|
+
.cx-pill.ok { background: var(--green-bg); color: var(--green); }
|
|
207
|
+
.cx-pill.gold { background: var(--gold-bg); color: var(--gold); }
|
|
208
|
+
.cx-cap { display: inline-flex; align-items: center; height: 19px; padding: 0 8px; border-radius: 10px; font: 600 11px/1 var(--body); white-space: nowrap; background: var(--qopen); color: var(--sub); }
|
|
209
|
+
.cx-cap.ok { background: var(--green-bg); color: var(--green); }
|
|
210
|
+
.cx-cap.gold { background: var(--gold-bg); color: var(--gold); }
|
|
211
|
+
|
|
212
|
+
.cx-note { font-size: 12px; color: var(--tertiary); margin: 10px 2px 0; }
|
|
213
|
+
.cx-empty { padding: 22px 16px; color: var(--sub); font-size: 14.5px; line-height: 1.45; }
|
|
214
|
+
.cx-notice { display: flex; gap: 10px; align-items: flex-start; padding: 12px 14px; border-radius: 12px; background: var(--qopen); border: 1px solid var(--panel-border); color: var(--sub); font-size: 14px; margin: 8px 0; }
|
|
215
|
+
.cx-notice.warn { color: var(--amber); }
|
|
216
|
+
.cx-mark { background: color-mix(in srgb, var(--gold) 28%, transparent); color: inherit; border-radius: 3px; padding: 0 1px; }
|
|
217
|
+
|
|
218
|
+
/* ── detail ───────────────────────────────────────────── */
|
|
219
|
+
.cx-detail-head { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 10px 16px; padding: 16px 0 12px; border-bottom: 1px solid var(--hairline); margin-bottom: 14px; }
|
|
220
|
+
.cx-detail-title { font: 600 19px/1.25 var(--body); color: var(--ink); margin: 0; }
|
|
221
|
+
.cx-detail-meta { margin-top: 4px; font-size: 12.5px; color: var(--sub); }
|
|
222
|
+
.cx-card { background: var(--panel); border: 1px solid var(--panel-border); border-radius: 14px; padding: 12px 14px 14px; margin-bottom: 12px; }
|
|
223
|
+
.cx-card.you { background: var(--qopen); }
|
|
224
|
+
.cx-card-label { font: 600 9.5px/1 var(--mono); letter-spacing: 0.08em; color: var(--tertiary); margin-bottom: 8px; display: flex; justify-content: space-between; align-items: center; gap: 10px; }
|
|
225
|
+
.cx-card-body { font-size: 15px; line-height: 1.5; color: var(--ink); overflow-wrap: anywhere; }
|
|
226
|
+
/* md() keeps line breaks as text (shared with the session reader), so the body keeps them too. */
|
|
227
|
+
.cx-card-body.md { white-space: pre-wrap; }
|
|
228
|
+
.cx-card-body.md strong { font-weight: 600; }
|
|
229
|
+
.cx-card-body.md .quote { display: inline-block; padding-left: 10px; border-left: 3px solid var(--panel-border); color: var(--sub); }
|
|
230
|
+
.cx-card-body.md p { margin: 0 0 0.7em; }
|
|
231
|
+
.cx-card-body.md p:last-child { margin-bottom: 0; }
|
|
232
|
+
.cx-card-body.md ul, .cx-card-body.md ol { margin: 0 0 0.7em; padding-left: 1.3em; }
|
|
233
|
+
.cx-card-body.md h1, .cx-card-body.md h2, .cx-card-body.md h3 { font: 600 15px/1.3 var(--body); margin: 0.9em 0 0.4em; }
|
|
234
|
+
.cx-card-body.md code { font: 400 13px/1.4 var(--mono); background: var(--qopen); padding: 0 3px; border-radius: 4px; }
|
|
235
|
+
.cx-card-body.md pre { white-space: pre-wrap; font: 400 12.5px/1.45 var(--mono); background: var(--qopen); padding: 10px; border-radius: 8px; }
|
|
236
|
+
.cx-strip-label { font: 600 9.5px/1 var(--mono); letter-spacing: 0.08em; color: var(--tertiary); margin: 4px 0 8px; }
|
|
237
|
+
.cx-strip { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 14px; }
|
|
238
|
+
.cx-thumb { position: relative; width: 148px; height: 104px; border-radius: 10px; overflow: hidden; background: var(--qopen); border: 1px solid var(--panel-border); display: grid; place-items: center; color: var(--sub); }
|
|
239
|
+
.cx-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
|
240
|
+
.cx-thumb .cx-thumb-badge { position: absolute; right: 6px; bottom: 6px; font: 600 10px/1 var(--mono); padding: 3px 5px; border-radius: 4px; background: rgba(0, 0, 0, 0.55); color: #fff; }
|
|
241
|
+
.cx-thumb .cx-play { position: absolute; inset: 0; display: grid; place-items: center; color: #fff; }
|
|
242
|
+
.cx-thumb .cx-play .icon { width: 30px; height: 30px; filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.5)); }
|
|
243
|
+
.cx-figure { margin: 0 0 14px; }
|
|
244
|
+
.cx-figure img { max-width: 100%; height: auto; border-radius: 10px; border: 1px solid var(--panel-border); display: block; }
|
|
245
|
+
.cx-figure figcaption { font-size: 12.5px; color: var(--sub); margin-top: 6px; }
|
|
246
|
+
.cx-find { position: sticky; top: 52px; z-index: 5; display: flex; align-items: center; gap: 8px; padding: 8px 0; background: var(--page); }
|
|
247
|
+
.cx-find .field { min-height: 34px; font-size: 14px; padding: 0 10px; border-radius: 9px; max-width: 260px; }
|
|
248
|
+
.cx-find .cx-find-count { font: 400 11.5px/1 var(--mono); color: var(--sub); }
|
|
249
|
+
.cx-find button { width: 30px; height: 30px; border-radius: 8px; border: 1px solid var(--panel-border); display: grid; place-items: center; color: var(--ink); }
|
|
250
|
+
.cx-find button .icon { width: 14px; height: 14px; }
|
|
251
|
+
.cx-turn.match .cx-card { background: color-mix(in srgb, var(--green) 7%, var(--panel)); }
|
|
252
|
+
@media (max-width: 599px) { .cx-find { top: calc(var(--topbar-h) + var(--safe-top)); } .cx-thumb { width: 132px; height: 92px; } }
|
|
253
|
+
|
|
254
|
+
/* ── Dictation and Dictionary ─────────────────────────── */
|
|
255
|
+
.cx-pair { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; }
|
|
256
|
+
.cx-pair .heard { color: var(--sub); text-decoration: line-through; text-decoration-color: color-mix(in srgb, var(--sub) 60%, transparent); }
|
|
257
|
+
.cx-pair .written { font-weight: 600; color: var(--ink); }
|
|
258
|
+
.cx-pair .icon { width: 12px; height: 12px; color: var(--tertiary); }
|
|
259
|
+
.cx-row-static { cursor: default; grid-template-columns: 32px minmax(0, 1fr) auto; align-items: center; }
|
|
260
|
+
.cx-row-static:hover { background: none; }
|
|
261
|
+
.cx-col-title { font: 600 14px/1.2 var(--body); color: var(--ink); margin: 18px 2px 10px; }
|
|
262
|
+
.cx-dict-cols { display: grid; gap: 4px 22px; }
|
|
263
|
+
@media (min-width: 900px) { .cx-dict-cols { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: start; } }
|
|
264
|
+
.cx-inline-form { display: flex; gap: 8px; margin-bottom: 10px; }
|
|
265
|
+
.cx-inline-form .field { flex: 1; min-width: 0; min-height: 36px; font-size: 14px; padding: 0 10px; border-radius: 9px; }
|
|
266
|
+
.cx-chips { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
267
|
+
.cx-chip { display: inline-flex; align-items: center; gap: 4px; height: 28px; padding: 0 4px 0 10px; border-radius: 14px; background: var(--panel); border: 1px solid var(--panel-border); font-size: 13px; color: var(--ink); }
|
|
268
|
+
.cx-chip button, .cx-x { width: 24px; height: 24px; border-radius: 12px; color: var(--sub); font-size: 15px; line-height: 1; display: grid; place-items: center; }
|
|
269
|
+
.cx-chip.more { padding-right: 10px; color: var(--sub); }
|
|
270
|
+
@media (max-width: 599px) { .cx-inline-form .field { min-height: 40px; font-size: 16px; } .cx-chip { height: 32px; } }
|
|
271
|
+
|
|
272
|
+
/* ── Settings (Control's hub categories) ──────────────── */
|
|
273
|
+
.cx-set-cat { margin-top: 8px; }
|
|
274
|
+
.cx-set-group { margin: 10px 0 14px; }
|
|
275
|
+
.cx-set-title { font: 600 13px/1.2 var(--body); color: var(--sub); margin: 12px 2px 4px; }
|
|
276
|
+
.cx-set-blurb { font-size: 13px; color: var(--sub); margin: -4px 2px 8px; }
|
|
277
|
+
.cx-set-row { display: flex; align-items: center; gap: 12px; width: 100%; min-height: 50px; padding: 10px 14px; text-align: left; color: inherit; position: relative; }
|
|
278
|
+
.cx-set-row + .cx-set-row::before, .cx-set-row + .device-code + .cx-set-row::before { content: ''; position: absolute; top: 0; left: 14px; right: 0; height: 1px; background: var(--hairline); }
|
|
279
|
+
.cx-set-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
|
|
280
|
+
.cx-set-name { font-size: 15px; font-weight: 500; color: var(--ink); }
|
|
281
|
+
.cx-set-desc { font-size: 13px; color: var(--sub); overflow-wrap: anywhere; }
|
|
282
|
+
.cx-set-value { font: 400 13px/1.3 var(--mono); color: var(--sub); text-align: right; max-width: 55%; overflow-wrap: anywhere; }
|
|
283
|
+
.cx-set-choice .value { margin-left: auto; color: var(--accent); }
|
|
284
|
+
.cx-set-mac { font-size: 12.5px; color: var(--tertiary); margin: 2px 2px 12px; }
|
|
285
|
+
button.cx-set-row:hover { background: var(--qopen); }
|
|
286
|
+
/* 6.99.11 COS reaching out: compact fields at the end of a Settings row. 16px text keeps iOS Safari from zooming. */
|
|
287
|
+
.cx-set-row .cx-set-num, .cx-set-row .cx-set-time, .cx-set-row .cx-set-day { flex: none; width: auto; min-height: 40px; padding: 8px 10px; }
|
|
288
|
+
.cx-set-row .cx-set-num { width: 84px; text-align: right; font-variant-numeric: tabular-nums; }
|
|
289
|
+
.cx-set-row .cx-set-time { width: 148px; }
|
|
290
|
+
.cx-set-row .cx-set-day { width: 150px; padding-right: 36px; background-position: calc(100% - 20px) 17px, calc(100% - 15px) 17px; }
|
|
291
|
+
.cx-set-row .cx-set-steer { flex: none; width: 46%; min-width: 180px; min-height: 64px; }
|
|
292
|
+
@media (max-width: 599px) {
|
|
293
|
+
.cx-set-row:has(.cx-set-steer) { flex-wrap: wrap; }
|
|
294
|
+
.cx-set-row .cx-set-steer { width: 100%; min-width: 0; }
|
|
295
|
+
}
|
|
296
|
+
@media (min-width: 1100px) { .cx-set-name { font-size: 14px; } }
|
|
297
|
+
@media (min-width: 1100px) { .rail-settings[aria-current='page'] { background: var(--rail-active); border: 1px solid var(--panel-border); } }
|
|
298
|
+
|
|
299
|
+
/* Sign in another device: the QR the phone camera scans. */
|
|
300
|
+
.device-code .qr { display: block; width: 200px; height: 200px; margin: 4px 0 8px; border-radius: 8px; border: 1px solid var(--panel-border); background: #fff; }
|
|
301
|
+
.device-code .qr-hint { font-weight: 600; color: var(--ink); }
|
|
302
|
+
|
|
303
|
+
/* iOS Safari pull-to-refresh reloaded the whole app on a downward drag at the top of a pane. */
|
|
304
|
+
html, body { overscroll-behavior-y: none; }
|
|
305
|
+
|
|
306
|
+
/* Today: From today's meetings. */
|
|
307
|
+
.intake-body { padding: 4px 16px 14px; }
|
|
308
|
+
.intake-row { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0; border-top: 1px solid var(--hairline); font-size: 14.5px; }
|
|
309
|
+
.intake-row:first-child { border-top: 0; }
|
|
310
|
+
.intake-meeting { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); }
|
|
311
|
+
.intake-n { font: 600 12px/1.6 var(--mono); color: var(--sub); }
|
|
312
|
+
.intake-foot { margin: 6px 0 0; font-size: 12.5px; color: var(--tertiary); }
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
6
|
+
<meta name="color-scheme" content="light dark">
|
|
7
|
+
<meta name="theme-color" content="#f5f0e6" media="(prefers-color-scheme: light)">
|
|
8
|
+
<meta name="theme-color" content="#17120e" media="(prefers-color-scheme: dark)">
|
|
9
|
+
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
10
|
+
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
|
11
|
+
<meta name="apple-mobile-web-app-title" content="COS">
|
|
12
|
+
<title>COS Control</title>
|
|
13
|
+
<link rel="icon" href="/control/mark.svg" type="image/svg+xml">
|
|
14
|
+
<link rel="stylesheet" href="/control/app.css">
|
|
15
|
+
<link rel="stylesheet" href="/control/control.css">
|
|
16
|
+
<link rel="stylesheet" href="/control/panes/speakers.css">
|
|
17
|
+
<link rel="stylesheet" href="/control/panes/meetings.css">
|
|
18
|
+
<link rel="stylesheet" href="/control/panes/work.css">
|
|
19
|
+
<link rel="stylesheet" href="/control/panes/sessions.css">
|
|
20
|
+
<link rel="stylesheet" href="/control/panes/cos-chat.css">
|
|
21
|
+
<link rel="stylesheet" href="/control/panes/questions.css">
|
|
22
|
+
<script src="/control/theme.js"></script>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
<svg width="0" height="0" style="position:absolute" aria-hidden="true">
|
|
26
|
+
<symbol id="i-mark" viewBox="0 0 693 760"><g fill="currentColor"><circle cx="348" cy="100" r="100"/><circle cx="100" cy="240" r="100"/><circle cx="100" cy="520" r="100"/><path d="M 29.3 310.7 C 78.3 359.7 78.3 400.3 29.3 449.3 A 100 100 0 1 0 170.7 449.3 C 121.7 400.3 121.7 359.7 170.7 310.7 A 100 100 0 1 0 29.3 310.7 Z"/><circle cx="593" cy="240" r="100"/><circle cx="348" cy="380" r="100"/><path d="M 496.5 213.7 C 478.0 281.6 442.2 302.0 374.3 283.5 A 100 100 0 1 0 444.5 406.3 C 463.0 338.4 498.8 318.0 566.7 336.5 A 100 100 0 1 0 496.5 213.7 Z"/><circle cx="593" cy="520" r="100"/><circle cx="348" cy="660" r="100"/><path d="M 496.5 493.7 C 478.0 561.6 442.2 582.0 374.3 563.5 A 100 100 0 1 0 444.5 686.3 C 463.0 618.4 498.8 598.0 566.7 616.5 A 100 100 0 1 0 496.5 493.7 Z"/></g></symbol>
|
|
27
|
+
<symbol id="i-today" viewBox="0 0 24 24"><path d="M4 10.5 12 4l8 6.5V19a1.5 1.5 0 0 1-1.5 1.5H15v-6H9v6H5.5A1.5 1.5 0 0 1 4 19z"/></symbol>
|
|
28
|
+
<symbol id="i-meetings" viewBox="0 0 24 24"><rect x="3.5" y="5" width="17" height="15" rx="2.5"/><path d="M3.5 10h17M8 3v4M16 3v4"/></symbol>
|
|
29
|
+
<symbol id="i-work" viewBox="0 0 24 24"><path d="M3.5 13.5 6 6.5A2 2 0 0 1 7.9 5h8.2A2 2 0 0 1 18 6.5l2.5 7v4A2.5 2.5 0 0 1 18 20H6a2.5 2.5 0 0 1-2.5-2.5z"/><path d="M3.5 13.5H8l1 2h6l1-2h4.5M8 9h8M7.5 11.5h9"/></symbol>
|
|
30
|
+
<symbol id="i-sessions" viewBox="0 0 24 24"><rect x="3" y="4.5" width="18" height="15" rx="2.5"/><path d="m7 10 3 2.5L7 15M12.5 15H17"/></symbol>
|
|
31
|
+
<symbol id="i-more" viewBox="0 0 24 24"><circle cx="5.5" cy="12" r="1.4" fill="currentColor" stroke="none"/><circle cx="12" cy="12" r="1.4" fill="currentColor" stroke="none"/><circle cx="18.5" cy="12" r="1.4" fill="currentColor" stroke="none"/></symbol>
|
|
32
|
+
<symbol id="i-memories" viewBox="0 0 24 24"><path d="M12 3.5c.6 4.6 2.4 6.4 7 7-4.6.6-6.4 2.4-7 7-.6-4.6-2.4-6.4-7-7 4.6-.6 6.4-2.4 7-7z"/></symbol>
|
|
33
|
+
<symbol id="i-speakers" viewBox="0 0 24 24"><path d="M4 10v4M8 7v10M12 4v16M16 7v10M20 10v4"/></symbol>
|
|
34
|
+
<symbol id="i-dictation" viewBox="0 0 24 24"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21M8.5 21h7"/></symbol>
|
|
35
|
+
<symbol id="i-threads" viewBox="0 0 24 24"><circle cx="5.5" cy="17.5" r="2.2"/><circle cx="12" cy="6" r="2.2"/><circle cx="18.5" cy="17.5" r="2.2"/><path d="M6.6 15.6 10.9 7.9M13.1 7.9l4.3 7.7" stroke-dasharray="1.6 2.2"/><path d="M7.7 17.5h8.6"/></symbol>
|
|
36
|
+
<symbol id="i-refresh" viewBox="0 0 24 24"><path d="M19.5 12a7.5 7.5 0 1 1-2.2-5.3M19.5 4.5v4.2h-4.2"/></symbol>
|
|
37
|
+
<symbol id="i-chev" viewBox="0 0 24 24"><path d="m9.5 6 6 6-6 6"/></symbol>
|
|
38
|
+
<symbol id="i-photo" viewBox="0 0 24 24"><rect x="3.5" y="5" width="17" height="14" rx="2.5"/><circle cx="9" cy="10" r="1.6"/><path d="m4 17 5-4.5 3.5 3 3-2.5 4.5 4"/></symbol>
|
|
39
|
+
<symbol id="i-video" viewBox="0 0 24 24"><rect x="3.5" y="6" width="12.5" height="12" rx="2.5"/><path d="m16 10.5 4.5-2.5v8L16 13.5"/></symbol>
|
|
40
|
+
<symbol id="i-doc" viewBox="0 0 24 24"><path d="M7 3.5h6.5L18 8v12a.5.5 0 0 1-.5.5h-10.5A.5.5 0 0 1 6.5 20V4a.5.5 0 0 1 .5-.5z"/><path d="M13.5 3.5V8H18M9 12.5h6M9 15.5h6"/></symbol>
|
|
41
|
+
<symbol id="i-clip" viewBox="0 0 24 24"><path d="m15.5 7.5-6.8 6.8a1.8 1.8 0 0 0 2.5 2.5l7.3-7.3a3.5 3.5 0 0 0-5-5l-7.6 7.6a5.2 5.2 0 0 0 7.4 7.4l5.7-5.7"/></symbol>
|
|
42
|
+
<symbol id="i-messages" viewBox="0 0 24 24"><path d="M4 7a2.5 2.5 0 0 1 2.5-2.5h11A2.5 2.5 0 0 1 20 7v7a2.5 2.5 0 0 1-2.5 2.5H10L5.5 20v-3.6A2.5 2.5 0 0 1 4 14z"/></symbol>
|
|
43
|
+
<symbol id="i-usage" viewBox="0 0 24 24"><path d="M4 20h16M7 16v-4M12 16V7M17 16v-7"/></symbol>
|
|
44
|
+
<symbol id="i-settings" viewBox="0 0 24 24"><circle cx="12" cy="12" r="3.2"/><path d="M12 2.8v2.6M12 18.6v2.6M2.8 12h2.6M18.6 12h2.6M5.5 5.5l1.8 1.8M16.7 16.7l1.8 1.8M5.5 18.5l1.8-1.8M16.7 7.3l1.8-1.8"/></symbol>
|
|
45
|
+
<symbol id="i-ask" viewBox="0 0 24 24"><path d="m12 3 1.9 6.1L20 11l-6.1 1.9L12 19l-1.9-6.1L4 11l6.1-1.9z"/></symbol>
|
|
46
|
+
<symbol id="i-back" viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></symbol>
|
|
47
|
+
<symbol id="i-send" viewBox="0 0 24 24"><path d="M12 19V6M6.5 11.5 12 6l5.5 5.5"/></symbol>
|
|
48
|
+
<symbol id="i-link" viewBox="0 0 24 24"><path d="M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1"/></symbol>
|
|
49
|
+
</svg>
|
|
50
|
+
|
|
51
|
+
<main id="auth-gate" class="auth-gate hidden" aria-labelledby="auth-title">
|
|
52
|
+
<div class="auth-card">
|
|
53
|
+
<svg class="mark" aria-hidden="true"><use href="#i-mark"/></svg>
|
|
54
|
+
<h1 id="auth-title">Connect this browser</h1>
|
|
55
|
+
<p>COS runs on your Mac. Sign in once and this browser stays connected for 7 days.</p>
|
|
56
|
+
<form id="auth-form">
|
|
57
|
+
<div id="auth-code-block">
|
|
58
|
+
<label for="auth-code">Sign-in code</label>
|
|
59
|
+
<input id="auth-code" class="field code-field" type="text" inputmode="text" autocomplete="one-time-code" autocapitalize="characters" spellcheck="false" maxlength="9" placeholder="K7P3-QX9M">
|
|
60
|
+
<p class="auth-foot" style="margin-top:8px">Scan the QR with your phone's camera. A browser that is already signed in shows one under Settings, Sign in another device. COS Control on your Mac shows one under Open COS on your phone. Or type the code shown with the QR.</p>
|
|
61
|
+
<p class="auth-foot">The glasses pairing code does not work here.</p>
|
|
62
|
+
</div>
|
|
63
|
+
<div id="auth-token-block" class="hidden">
|
|
64
|
+
<label for="auth-token">Pairing token</label>
|
|
65
|
+
<input id="auth-token" class="field" type="password" autocomplete="off" autocapitalize="off" spellcheck="false" placeholder="Paste the pairing token">
|
|
66
|
+
<button type="button" class="link-btn" id="auth-token-show" aria-controls="auth-token" aria-pressed="false">Show token</button>
|
|
67
|
+
<p class="auth-foot" style="margin-top:8px">In the COS menu-bar panel on your Mac, choose Copy pairing token. The copy clears after 60 seconds, so paste within a minute.</p>
|
|
68
|
+
</div>
|
|
69
|
+
<p id="auth-error" class="status-line error hidden" role="alert"></p>
|
|
70
|
+
<button type="submit" class="btn primary block">Connect</button>
|
|
71
|
+
<button type="button" class="link-btn" id="auth-switch">Use the pairing token instead</button>
|
|
72
|
+
</form>
|
|
73
|
+
</div>
|
|
74
|
+
</main>
|
|
75
|
+
|
|
76
|
+
<div id="app-shell" class="app-shell hidden">
|
|
77
|
+
<nav class="rail" aria-label="Sections">
|
|
78
|
+
<div class="rail-head"><svg class="mark" aria-hidden="true"><use href="#i-mark"/></svg><span class="rail-brand">Control</span></div>
|
|
79
|
+
<button type="button" class="rail-btn rail-today" data-pane="today" aria-label="Today"><svg class="icon"><use href="#i-today"/></svg><span class="rail-text"><span class="rail-label">Today</span><span class="rail-story" data-story="today"></span></span><span class="badge-dot hidden" data-badge="today"></span></button>
|
|
80
|
+
<div class="rail-sep"></div>
|
|
81
|
+
<button type="button" class="rail-btn" data-pane="messages" aria-label="Messages"><svg class="icon"><use href="#i-messages"/></svg><span class="rail-text"><span class="rail-label">Messages</span><span class="rail-story" data-story="messages"></span></span><span class="badge-dot hidden" data-badge="messages"></span></button>
|
|
82
|
+
<button type="button" class="rail-btn" data-pane="speakers" aria-label="Speakers"><svg class="icon"><use href="#i-speakers"/></svg><span class="rail-text"><span class="rail-label">Speakers</span><span class="rail-story" data-story="speakers"></span></span><span class="badge-dot hidden" data-badge="speakers"></span></button>
|
|
83
|
+
<button type="button" class="rail-btn" data-pane="meetings" aria-label="Meetings"><svg class="icon"><use href="#i-meetings"/></svg><span class="rail-text"><span class="rail-label">Meetings</span><span class="rail-story" data-story="meetings"></span></span><span class="badge-dot hidden" data-badge="meetings"></span></button>
|
|
84
|
+
<button type="button" class="rail-btn" data-pane="memories" aria-label="Memories"><svg class="icon"><use href="#i-memories"/></svg><span class="rail-text"><span class="rail-label">Memories</span><span class="rail-story" data-story="memories"></span></span><span class="badge-dot hidden" data-badge="memories"></span></button>
|
|
85
|
+
<button type="button" class="rail-btn" data-pane="threads" aria-label="Threads"><svg class="icon"><use href="#i-threads"/></svg><span class="rail-text"><span class="rail-label">Threads</span><span class="rail-story" data-story="threads"></span></span><span class="badge-dot hidden" data-badge="threads"></span></button>
|
|
86
|
+
<button type="button" class="rail-btn" data-pane="sessions" aria-label="Sessions"><svg class="icon"><use href="#i-sessions"/></svg><span class="rail-text"><span class="rail-label">Sessions</span><span class="rail-story" data-story="sessions"></span></span><span class="badge-dot hidden" data-badge="sessions"></span></button>
|
|
87
|
+
<button type="button" class="rail-btn" data-pane="work" aria-label="Work"><svg class="icon"><use href="#i-work"/></svg><span class="rail-text"><span class="rail-label">Work</span><span class="rail-story" data-story="work"></span></span><span class="badge-dot hidden" data-badge="work"></span></button>
|
|
88
|
+
<button type="button" class="rail-btn" data-pane="dictation" aria-label="Dictation"><svg class="icon"><use href="#i-dictation"/></svg><span class="rail-text"><span class="rail-label">Dictation</span><span class="rail-story" data-story="dictation"></span></span><span class="badge-dot hidden" data-badge="dictation"></span></button>
|
|
89
|
+
<div class="rail-spacer"></div>
|
|
90
|
+
<button type="button" class="rail-settings" data-pane="settings" aria-label="Settings"><svg class="icon"><use href="#i-settings"/></svg><span class="rail-label">Settings</span></button>
|
|
91
|
+
<p class="server-line" data-server-line><span class="dot ok" data-host-dot></span><span class="server-text" data-server-text>Server connected</span></p>
|
|
92
|
+
</nav>
|
|
93
|
+
|
|
94
|
+
<div class="main-col">
|
|
95
|
+
<!-- Control's navigation bar (ActivityWindow navigationBar): shown off Today, from 600px. -->
|
|
96
|
+
<nav class="navbar hidden" id="navbar" aria-label="Where you are">
|
|
97
|
+
<button type="button" class="nav-btn" id="nav-home" title="Activity home"><svg class="icon"><use href="#i-today"/></svg><span>Home</span></button>
|
|
98
|
+
<button type="button" class="nav-btn" id="nav-back" title="Go back one step"><svg class="icon"><use href="#i-back"/></svg><span>Back</span></button>
|
|
99
|
+
<ol class="crumbs" id="crumbs"></ol>
|
|
100
|
+
<span class="grow"></span>
|
|
101
|
+
<button type="button" class="nav-btn" id="nav-settings" aria-label="Open Activity settings"><svg class="icon"><use href="#i-settings"/></svg><span>Settings</span></button>
|
|
102
|
+
</nav>
|
|
103
|
+
<header class="topbar" id="topbar">
|
|
104
|
+
<div class="topbar-left">
|
|
105
|
+
<button type="button" id="topbar-back" class="topbar-back hidden"><svg class="icon"><use href="#i-back"/></svg><span id="topbar-back-label">Back</span></button>
|
|
106
|
+
<button type="button" id="section-btn" class="section-btn" aria-haspopup="dialog" aria-controls="section-menu">
|
|
107
|
+
<svg class="mark" aria-hidden="true"><use href="#i-mark"/></svg><span id="section-name">Today</span><span class="caret" aria-hidden="true"></span>
|
|
108
|
+
</button>
|
|
109
|
+
</div>
|
|
110
|
+
<button type="button" class="icon-btn" data-open-ask aria-label="Ask COS or find a session"><svg class="icon"><use href="#i-ask"/></svg></button>
|
|
111
|
+
</header>
|
|
112
|
+
|
|
113
|
+
<main class="workspace" id="workspace">
|
|
114
|
+
<!-- SESSION QUESTIONS (panes/questions.js, 6.99.12): over every pane while one waits -->
|
|
115
|
+
<div id="sq-host" class="sq-host" aria-live="polite" hidden></div>
|
|
116
|
+
<!-- TODAY -->
|
|
117
|
+
<section id="pane-today" class="pane" data-title="Today">
|
|
118
|
+
<div class="pane-head with-ask">
|
|
119
|
+
<div>
|
|
120
|
+
<h1 class="pane-title">Today</h1>
|
|
121
|
+
<p id="today-date" class="today-date"></p>
|
|
122
|
+
</div>
|
|
123
|
+
<button type="button" class="ask-bar" data-open-ask>
|
|
124
|
+
<svg class="icon"><use href="#i-ask"/></svg>
|
|
125
|
+
<span class="ask-text">Ask COS or find a session</span>
|
|
126
|
+
<kbd class="kbd">⌘K</kbd>
|
|
127
|
+
</button>
|
|
128
|
+
</div>
|
|
129
|
+
<div id="today-rec"></div>
|
|
130
|
+
<div class="today-cols">
|
|
131
|
+
<div class="today-main">
|
|
132
|
+
<div id="today-story" class="story-skel" aria-live="polite"><div class="skeleton"></div><div class="skeleton" style="width:82%"></div><div class="skeleton" style="width:58%"></div></div>
|
|
133
|
+
<section class="run-panel" aria-labelledby="run-title">
|
|
134
|
+
<div class="panel-head">
|
|
135
|
+
<h2 id="run-title" class="panel-title">Running<span id="run-count" class="count"></span></h2>
|
|
136
|
+
<button type="button" class="link-btn" data-goto="sessions">All sessions</button>
|
|
137
|
+
</div>
|
|
138
|
+
<div id="run-list"><div class="run-empty">Checking your agents</div></div>
|
|
139
|
+
</section>
|
|
140
|
+
</div>
|
|
141
|
+
<div class="today-side">
|
|
142
|
+
<section class="card" aria-labelledby="needs-title">
|
|
143
|
+
<div class="panel-head">
|
|
144
|
+
<h2 id="needs-title" class="panel-title">Needs you<span id="needs-count" class="count"></span></h2>
|
|
145
|
+
</div>
|
|
146
|
+
<div id="needs-list"><div class="skel-row"><div class="skeleton" style="width:70%"></div><div class="skeleton" style="width:40%"></div></div></div>
|
|
147
|
+
</section>
|
|
148
|
+
<section class="card hidden" id="intake-card" aria-labelledby="intake-title">
|
|
149
|
+
<div class="panel-head">
|
|
150
|
+
<h2 id="intake-title" class="panel-title">From today's meetings<span id="intake-count" class="count"></span></h2>
|
|
151
|
+
<button type="button" class="link-btn" data-goto="work/sort">Review</button>
|
|
152
|
+
</div>
|
|
153
|
+
<div id="intake-body" class="intake-body"></div>
|
|
154
|
+
</section>
|
|
155
|
+
<section class="card hidden" id="next-card" aria-labelledby="next-title">
|
|
156
|
+
<div class="panel-head"><h2 id="next-title" class="panel-title">Up next</h2></div>
|
|
157
|
+
<div id="next-body" class="next-up"></div>
|
|
158
|
+
</section>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</section>
|
|
162
|
+
|
|
163
|
+
<!-- MEETINGS -->
|
|
164
|
+
<section id="pane-meetings" class="pane wide hidden" data-title="Meetings"><!-- rendered by panes/meetings.js --></section>
|
|
165
|
+
|
|
166
|
+
<!-- WORK -->
|
|
167
|
+
<section id="pane-work" class="pane hidden" data-title="Work"><!-- rendered by panes/work.js --></section>
|
|
168
|
+
|
|
169
|
+
<!-- SESSIONS -->
|
|
170
|
+
<section id="pane-sessions" class="pane wide hidden" data-title="Sessions">
|
|
171
|
+
<div class="cx sx" data-tint="sessions">
|
|
172
|
+
<header class="cx-hero sx-hero" id="sessions-hero" data-tint="sessions">
|
|
173
|
+
<span class="cx-glyph"><svg class="icon"><use href="#i-sessions"/></svg></span>
|
|
174
|
+
<div class="cx-hero-text"><h1 class="cx-title">Sessions</h1><p class="cx-detail-line">Claude · Codex · Cursor · reading the last 7 days…</p></div>
|
|
175
|
+
</header>
|
|
176
|
+
<div class="cx-controls sx-views" id="sessions-views"></div>
|
|
177
|
+
<div class="split sx-split" id="sessions-split">
|
|
178
|
+
<div class="split-list">
|
|
179
|
+
<div class="sx-tools">
|
|
180
|
+
<form class="cx-search sx-search" id="sessions-search-form" role="search">
|
|
181
|
+
<input id="sessions-q" class="field" type="search" placeholder="Search titles, transcripts…" enterkeyhint="search" autocomplete="off" aria-label="Search titles, transcripts">
|
|
182
|
+
<button type="button" class="cx-clear hidden" id="sessions-clear" data-sx="clear" aria-label="Clear search">Clear</button>
|
|
183
|
+
</form>
|
|
184
|
+
<select id="sessions-recency" class="field sx-select" aria-label="Recency">
|
|
185
|
+
<option value="newest">Newest</option>
|
|
186
|
+
<option value="oldest">Oldest</option>
|
|
187
|
+
<option value="match">Best match</option>
|
|
188
|
+
</select>
|
|
189
|
+
</div>
|
|
190
|
+
<p class="cx-note sx-hint hidden" id="sessions-hint"></p>
|
|
191
|
+
<div id="sessions-hooks"></div>
|
|
192
|
+
<div id="sessions-list"></div>
|
|
193
|
+
</div>
|
|
194
|
+
<div class="reader sx-reader" id="session-reader"><p class="reader-placeholder">Pick a session to read it and send it a turn.</p></div>
|
|
195
|
+
</div>
|
|
196
|
+
<div class="sx-usage hidden" id="sessions-usage"></div>
|
|
197
|
+
</div>
|
|
198
|
+
</section>
|
|
199
|
+
|
|
200
|
+
<!-- MESSAGES (panes/messages.js) -->
|
|
201
|
+
<section id="pane-messages" class="pane hidden" data-title="Messages"></section>
|
|
202
|
+
|
|
203
|
+
<!-- THREADS (panes/threads.js) -->
|
|
204
|
+
<section id="pane-threads" class="pane hidden" data-title="Threads"></section>
|
|
205
|
+
|
|
206
|
+
<!-- DICTATION (panes/dictation.js) -->
|
|
207
|
+
<section id="pane-dictation" class="pane hidden" data-title="Dictation"></section>
|
|
208
|
+
|
|
209
|
+
<!-- MEMORIES -->
|
|
210
|
+
<section id="pane-memories" class="pane flush hidden" data-title="Memories">
|
|
211
|
+
<iframe id="memories-frame" class="memories-frame" title="Memories" src="about:blank"></iframe>
|
|
212
|
+
</section>
|
|
213
|
+
|
|
214
|
+
<!-- SPEAKERS -->
|
|
215
|
+
<section id="pane-speakers" class="pane wide hidden" data-title="Speakers"><!-- rendered by panes/speakers.js --></section>
|
|
216
|
+
|
|
217
|
+
<!-- USAGE -->
|
|
218
|
+
<section id="pane-usage" class="pane hidden" data-title="Usage">
|
|
219
|
+
<!-- Usage is a view inside Sessions (Sessions | Usage | COS cost); this old route opens it there. -->
|
|
220
|
+
<p class="reader-placeholder">Opening Usage in Sessions…</p>
|
|
221
|
+
</section>
|
|
222
|
+
|
|
223
|
+
<!-- SETTINGS -->
|
|
224
|
+
<section id="pane-settings" class="pane hidden" data-title="Settings"><!-- rendered by panes/settings.js --></section>
|
|
225
|
+
|
|
226
|
+
</main>
|
|
227
|
+
</div>
|
|
228
|
+
|
|
229
|
+
</div>
|
|
230
|
+
|
|
231
|
+
<div id="section-menu" class="sheet-backdrop hidden" role="dialog" aria-modal="true" aria-label="Sections">
|
|
232
|
+
<div class="sheet">
|
|
233
|
+
<p class="menu-host"><span class="dot ok" data-host-dot></span><span id="host-name">Connecting</span></p>
|
|
234
|
+
<div class="list">
|
|
235
|
+
<button type="button" class="nav-row" data-goto="today"><svg class="icon"><use href="#i-today"/></svg><span class="grow">Today<span class="note rail-story" data-story="today"></span></span><span class="badge-dot hidden" data-badge="today" style="position:static"></span></button>
|
|
236
|
+
<button type="button" class="nav-row" data-goto="messages"><svg class="icon"><use href="#i-messages"/></svg><span class="grow">Messages<span class="note rail-story" data-story="messages"></span></span><span class="badge-dot hidden" data-badge="messages" style="position:static"></span></button>
|
|
237
|
+
<button type="button" class="nav-row" data-goto="speakers"><svg class="icon"><use href="#i-speakers"/></svg><span class="grow">Speakers<span class="note rail-story" data-story="speakers"></span></span><span class="badge-dot hidden" data-badge="speakers" style="position:static"></span></button>
|
|
238
|
+
<button type="button" class="nav-row" data-goto="meetings"><svg class="icon"><use href="#i-meetings"/></svg><span class="grow">Meetings<span class="note rail-story" data-story="meetings"></span></span><span class="badge-dot hidden" data-badge="meetings" style="position:static"></span></button>
|
|
239
|
+
<button type="button" class="nav-row" data-goto="memories"><svg class="icon"><use href="#i-memories"/></svg><span class="grow">Memories<span class="note rail-story" data-story="memories"></span></span><span class="badge-dot hidden" data-badge="memories" style="position:static"></span></button>
|
|
240
|
+
<button type="button" class="nav-row" data-goto="threads"><svg class="icon"><use href="#i-threads"/></svg><span class="grow">Threads<span class="note rail-story" data-story="threads"></span></span><span class="badge-dot hidden" data-badge="threads" style="position:static"></span></button>
|
|
241
|
+
<button type="button" class="nav-row" data-goto="sessions"><svg class="icon"><use href="#i-sessions"/></svg><span class="grow">Sessions<span class="note rail-story" data-story="sessions"></span></span><span class="badge-dot hidden" data-badge="sessions" style="position:static"></span></button>
|
|
242
|
+
<button type="button" class="nav-row" data-goto="work"><svg class="icon"><use href="#i-work"/></svg><span class="grow">Work<span class="note rail-story" data-story="work"></span></span><span class="badge-dot hidden" data-badge="work" style="position:static"></span></button>
|
|
243
|
+
<button type="button" class="nav-row" data-goto="dictation"><svg class="icon"><use href="#i-dictation"/></svg><span class="grow">Dictation<span class="note rail-story" data-story="dictation"></span></span><span class="badge-dot hidden" data-badge="dictation" style="position:static"></span></button>
|
|
244
|
+
<button type="button" class="nav-row" data-goto="settings"><svg class="icon"><use href="#i-settings"/></svg><span class="grow">Settings<span class="note rail-story" data-story="settings"></span></span><span class="badge-dot hidden" data-badge="settings" style="position:static"></span></button>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
|
|
249
|
+
<div id="ask-sheet" class="sheet-backdrop hidden" role="dialog" aria-modal="true" aria-label="Ask COS">
|
|
250
|
+
<div class="sheet">
|
|
251
|
+
<div class="sheet-grip"></div>
|
|
252
|
+
<form class="sheet-head" id="ask-form">
|
|
253
|
+
<input id="ask-q" class="field" type="search" placeholder="Ask COS or find a session" autocomplete="off" enterkeyhint="go">
|
|
254
|
+
<button type="button" class="link-btn" id="ask-close">Cancel</button>
|
|
255
|
+
</form>
|
|
256
|
+
<div id="ask-results"></div>
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
|
|
260
|
+
<div id="toast" class="toast hidden" role="status"></div>
|
|
261
|
+
|
|
262
|
+
<script src="/control/vendor/qrcode-encoder.js"></script>
|
|
263
|
+
<script src="/control/app.js"></script>
|
|
264
|
+
<script src="/control/shell.js"></script>
|
|
265
|
+
<script src="/control/panes/cos-chat.js"></script>
|
|
266
|
+
<script src="/control/panes/messages.js"></script>
|
|
267
|
+
<script src="/control/panes/threads.js"></script>
|
|
268
|
+
<script src="/control/panes/speakers.js"></script>
|
|
269
|
+
<script src="/control/panes/meetings.js"></script>
|
|
270
|
+
<script src="/control/panes/work.js"></script>
|
|
271
|
+
<script src="/control/panes/dictation.js"></script>
|
|
272
|
+
<script src="/control/panes/settings.js"></script>
|
|
273
|
+
<script src="/control/panes/questions.js"></script>
|
|
274
|
+
</body>
|
|
275
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 693 760" fill="#2b211a" role="img" aria-hidden="true"><circle cx="348" cy="100" r="100"/><circle cx="100" cy="240" r="100"/><circle cx="100" cy="520" r="100"/><path d="M 29.3 310.7 C 78.3 359.7 78.3 400.3 29.3 449.3 A 100 100 0 1 0 170.7 449.3 C 121.7 400.3 121.7 359.7 170.7 310.7 A 100 100 0 1 0 29.3 310.7 Z"/><circle cx="593" cy="240" r="100"/><circle cx="348" cy="380" r="100"/><path d="M 496.5 213.7 C 478.0 281.6 442.2 302.0 374.3 283.5 A 100 100 0 1 0 444.5 406.3 C 463.0 338.4 498.8 318.0 566.7 336.5 A 100 100 0 1 0 496.5 213.7 Z"/><circle cx="593" cy="520" r="100"/><circle cx="348" cy="660" r="100"/><path d="M 496.5 493.7 C 478.0 561.6 442.2 582.0 374.3 563.5 A 100 100 0 1 0 444.5 686.3 C 463.0 618.4 498.8 598.0 566.7 616.5 A 100 100 0 1 0 496.5 493.7 Z"/></svg>
|