@gotcos/glasses-server 6.99.12 → 6.99.20
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 +124 -0
- package/package.json +1 -1
- package/server/index.ts +44 -2
- package/server/lib/ask-work-plan.ts +116 -0
- package/server/lib/batch-transcript-quality.ts +2 -0
- package/server/lib/cos-thread.ts +582 -0
- package/server/lib/drop-attachments.ts +55 -0
- package/server/lib/drop-service.ts +104 -13
- package/server/lib/drop-settings.ts +13 -2
- package/server/lib/drop-store.ts +38 -2
- package/server/lib/media-store.ts +80 -0
- package/server/lib/meeting-ask-runtime.ts +1 -1
- package/server/lib/meeting-batch-transcribe.ts +54 -2
- package/server/lib/permission-broker.ts +6 -4
- package/server/lib/phone-recording.ts +1 -1
- package/server/lib/ping-sources.ts +6 -2
- package/server/lib/prep-runtime.ts +915 -0
- package/server/lib/prep-store.ts +226 -0
- package/server/lib/stt-resolver.ts +26 -2
- package/server/lib/transcript-cleanup.ts +11 -2
- package/server/lib/work-orchestrator/runtime.ts +8 -2
- package/server/routes/ask-work-plan.ts +114 -0
- package/server/routes/cos-thread.ts +79 -0
- package/server/routes/drops.ts +4 -2
- package/server/routes/health.ts +8 -0
- package/server/routes/permission-broker.ts +2 -2
- package/server/routes/prep.ts +81 -0
- package/server/routes/transcribe-stream.ts +9 -1
- package/server/routes/welcome-context.ts +29 -1
- package/server/routes/work-orchestrator.ts +57 -0
- package/server/scripts/web-live-cls/cdp.mjs +57 -0
- package/server/scripts/web-live-cls/measure.mjs +80 -0
- package/server/scripts/web-live-cls/mock.mjs +97 -0
- package/server/scripts/web-live-cls/render.mjs +26 -0
- package/server/web-control/control.css +13 -0
- package/server/web-control/panes/cos-chat.css +39 -0
- package/server/web-control/panes/cos-chat.js +799 -41
- package/server/web-control/panes/meetings.css +91 -4
- package/server/web-control/panes/meetings.js +585 -58
- package/server/web-control/panes/messages.js +25 -18
- package/shared/meeting-ask.ts +6 -2
- package/shared/prep.ts +317 -0
|
@@ -226,10 +226,13 @@
|
|
|
226
226
|
/* ── live transcript view ─────────────────────────────── */
|
|
227
227
|
.mt-lhead { display: grid; gap: 4px; }
|
|
228
228
|
.mt-ltitle { display: flex; align-items: center; gap: 10px; min-width: 0; }
|
|
229
|
+
.mt-ltitle .mt-dtitle { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
230
|
+
/* 6.99.14: each header line is one line whatever it says (a quiet label, a longer minute count), so the header never
|
|
231
|
+
changes height while it records and the transcript box under it never moves. */
|
|
232
|
+
.mt-lstatus, .mt-lsub { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
|
|
229
233
|
.mt-lstatus { font-weight: 500; font-size: 13.5px; color: var(--ink); margin: 4px 0 0; }
|
|
230
234
|
.mt-lsub { font-size: 13px; color: var(--tertiary); margin: 0; }
|
|
231
|
-
.mt-handoff { font-size: 13px; margin: 2px 0 0; display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
|
232
|
-
.mt-lhead .mt-bar { border-bottom: 0; margin-top: 6px; }
|
|
235
|
+
.mt-handoff { font-size: 13px; margin: 2px 0 0; display: flex; flex-wrap: wrap; gap: 8px; align-items: center; min-height: 50px; }
|
|
233
236
|
/* Control's LiveMeetingFilesRow: one collapsed "Files · N" row; open, the names and the note. */
|
|
234
237
|
.mt-files { border: 1px solid var(--hairline); border-radius: 9px; margin: 6px 0 4px; max-width: 520px; min-width: 0; }
|
|
235
238
|
.mt-files-head { display: flex; align-items: center; gap: 8px; width: 100%; min-height: 36px; padding: 0 12px; font-size: 13px; font-weight: 600; color: var(--ink); text-align: left; }
|
|
@@ -243,15 +246,99 @@
|
|
|
243
246
|
.mt-files-note { padding: 8px 12px 10px; font-size: 12px; }
|
|
244
247
|
@media (prefers-reduced-motion: reduce) { .mt-files-head .icon:last-child { transition: none; } }
|
|
245
248
|
.mt-lgrid { display: grid; gap: 16px; }
|
|
246
|
-
.mt-lmain { min-width: 0; }
|
|
247
|
-
.
|
|
249
|
+
.mt-lmain { min-width: 0; position: relative; border-radius: 12px; }
|
|
250
|
+
/* 6.99.14: the transcript scrolls in its own box of fixed height (Control's ScrollView), so a new line moves only the
|
|
251
|
+
text inside it. overflow-anchor: none: the pane anchors the reader itself on every browser (iOS Safari has none), and
|
|
252
|
+
Chrome's own anchoring would correct a second time. */
|
|
253
|
+
.mt-tbox { position: relative; margin-top: 12px; }
|
|
254
|
+
.mt-turns { display: grid; gap: 22px; align-content: start; position: relative; padding: 16px 6px 14px 0; border-top: 1px solid var(--hairline);
|
|
255
|
+
height: clamp(240px, 52dvh, 640px); overflow-y: auto; overscroll-behavior: contain; overflow-anchor: none; -webkit-overflow-scrolling: touch; }
|
|
256
|
+
.mt-turns:focus { outline: none; }
|
|
257
|
+
.mt-turns:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }
|
|
258
|
+
.mt-lturn { max-width: 700px; }
|
|
248
259
|
.mt-lwho { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; }
|
|
249
260
|
.mt-lname { font-weight: 600; font-size: 12.5px; color: var(--sub); }
|
|
250
261
|
.mt-lstamp { font: 400 11px/1 var(--mono); color: var(--tertiary); }
|
|
251
262
|
.mt-lturn p { margin: 0 0 0.6em; font-size: 15px; line-height: 1.6; color: var(--ink); overflow-wrap: anywhere; }
|
|
252
263
|
.mt-lturn p:last-child { margin-bottom: 0; }
|
|
253
264
|
.mt-lempty { color: var(--sub); text-align: center; font-size: 14px; padding: 26px 8px; margin: 0; }
|
|
265
|
+
.mt-jump { position: absolute; left: 50%; bottom: 10px; transform: translateX(-50%); box-shadow: var(--shadow); background: var(--panel); }
|
|
266
|
+
.mt-jump[hidden] { display: none; }
|
|
267
|
+
/* The recording bar (Control's LiveRecordingBar): one row, 50 px, never wraps. Under 560 px of bar Add file is the
|
|
268
|
+
paperclip alone; under 340 px the still glyph takes the strip's place. */
|
|
269
|
+
.mt-lbarslot { container-type: inline-size; min-height: 50px; margin-top: 8px; }
|
|
270
|
+
.mt-lbar { display: flex; align-items: center; gap: 10px; height: 50px; padding: 0 8px 0 14px; border: 1px solid var(--panel-border);
|
|
271
|
+
border-radius: 11px; background: color-mix(in srgb, var(--panel) 70%, var(--page)); min-width: 0; }
|
|
272
|
+
.mt-lbar .mt-livedot { width: 9px; height: 9px; }
|
|
273
|
+
/* A fixed width (h:mm:ss in the mono face), so Starting, 9:59 and 1:00:00 never move the strip beside it. */
|
|
274
|
+
.mt-ltime { font: 500 12.5px/1 var(--mono); font-variant-numeric: tabular-nums; color: var(--ink); white-space: nowrap; width: 7ch; flex: none; overflow: hidden; }
|
|
275
|
+
.mt-ltime.starting { font: 400 12px/1 var(--body); color: var(--sub); }
|
|
276
|
+
.mt-meterwrap { position: relative; flex: 1 1 auto; min-width: 40px; height: 22px; display: flex; align-items: center; }
|
|
277
|
+
.mt-meter { display: block; width: 100%; height: 22px; --mt-bar: color-mix(in srgb, var(--accent) 85%, transparent); --mt-dot: color-mix(in srgb, var(--sub) 70%, transparent); }
|
|
278
|
+
/* The still glyph sits over the strip's box (no levels yet, or too narrow): shown and hidden by visibility, never by
|
|
279
|
+
display, so the switch moves nothing. */
|
|
280
|
+
.mt-glyph { position: absolute; left: 0; top: 6px; display: inline-flex; visibility: hidden; align-items: center; gap: 1.5px; height: 10px; }
|
|
281
|
+
.mt-glyph i { display: block; width: 2px; border-radius: 1px; background: color-mix(in srgb, var(--rec) 85%, transparent); }
|
|
282
|
+
.mt-glyph i:nth-child(1) { height: 6px; } .mt-glyph i:nth-child(2) { height: 9px; } .mt-glyph i:nth-child(3) { height: 7px; }
|
|
283
|
+
.mt-meterwrap.mt-nolevels .mt-meter { visibility: hidden; }
|
|
284
|
+
.mt-meterwrap.mt-nolevels .mt-glyph { visibility: visible; }
|
|
285
|
+
.mt-addfile, .mt-stopbtn { flex: none; white-space: nowrap; }
|
|
286
|
+
.mt-addfile { display: inline-flex; align-items: center; gap: 6px; }
|
|
287
|
+
.mt-addfile .icon { width: 14px; height: 14px; }
|
|
288
|
+
.mt-lbar .mt-side-note { flex: none; }
|
|
289
|
+
@container (max-width: 559px) { .mt-addlabel { display: none; } .mt-addfile { padding-left: 10px; padding-right: 10px; } }
|
|
290
|
+
@container (max-width: 339px) { .mt-meter { visibility: hidden; } .mt-glyph { visibility: visible; } .mt-meterwrap { flex: 0 0 40px; } }
|
|
291
|
+
.mt-lbarslot > .mt-stopline { margin: 8px 4px 0; }
|
|
292
|
+
.mt-lbarslot > .mt-confirm { margin-top: 8px; }
|
|
293
|
+
/* A file dragged over the pane: the column is outlined. Drawn only, so it moves nothing. */
|
|
294
|
+
.mt-lmain.dropping { outline: 2px dashed var(--accent); outline-offset: 4px; }
|
|
295
|
+
.mt-pick { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; overflow: hidden; clip: rect(0 0 0 0); }
|
|
296
|
+
#mt-lfiles:empty { display: none; }
|
|
297
|
+
#mt-lfiles { margin-top: 8px; }
|
|
298
|
+
.mt-files.live { max-width: none; }
|
|
299
|
+
.mt-files-head.quiet { color: var(--sub); font-weight: 500; cursor: default; }
|
|
300
|
+
.mt-files-head > span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
301
|
+
.mt-files-list li.mt-up { position: relative; grid-template-columns: minmax(0, 1fr) auto; column-gap: 10px; overflow: hidden; }
|
|
302
|
+
.mt-up .mt-files-name, .mt-up-meta { grid-column: 1; }
|
|
303
|
+
.mt-up-meta { font-size: 13px; line-height: 1.45; margin: 0; }
|
|
304
|
+
.mt-up-acts { grid-column: 2; grid-row: 1 / span 2; display: flex; gap: 6px; align-items: center; }
|
|
305
|
+
.mt-up-acts .mt-link { min-height: 28px; }
|
|
306
|
+
.mt-up-bar { position: absolute; left: 0; bottom: 0; height: 2px; background: var(--accent); transition: width 0.2s ease; }
|
|
307
|
+
@media (prefers-reduced-motion: reduce) { .mt-up-bar { transition: none; } }
|
|
308
|
+
#mt-lfiles .mt-files { margin-top: 0; }
|
|
309
|
+
/* 6.99.19: the area offering a prep made before the call. Its height is fixed and reserved from the first paint
|
|
310
|
+
whenever a suggestion is possible, and every state (looking, none, one prep, several, adding, added, ended) fills the
|
|
311
|
+
same box, so the answer arriving, Adding… and Added never move the footer or the Ask panel under it. */
|
|
312
|
+
#mt-lprep:empty { display: none; }
|
|
313
|
+
#mt-lprep { margin-top: 8px; }
|
|
314
|
+
.mt-prepslot { height: 96px; container-type: inline-size; }
|
|
315
|
+
.mt-prepline { display: flex; align-items: center; gap: 10px; height: 100%; box-sizing: border-box; padding: 0 6px 0 12px; border: 1px solid var(--hairline); border-radius: 9px; min-width: 0; }
|
|
316
|
+
.mt-prepline-text { flex: 1; min-width: 0; font-size: 13px; line-height: 1.35; color: var(--sub); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
|
|
317
|
+
.mt-prepline .cx-btn { flex: none; white-space: nowrap; height: 36px; }
|
|
318
|
+
/* Narrow (a phone): one prep reads as its whole sentence over the button. */
|
|
319
|
+
@container (max-width: 559px) {
|
|
320
|
+
.mt-prepline:not(.list):has(.cx-btn) { display: grid; grid-template-columns: minmax(0, 1fr); align-content: center; gap: 6px; padding: 8px 8px 8px 12px; }
|
|
321
|
+
.mt-prepline:not(.list) .cx-btn { justify-self: end; }
|
|
322
|
+
}
|
|
323
|
+
/* Several preps: a short list in the same box, each row with its own Add to this meeting; it scrolls inside. */
|
|
324
|
+
.mt-prepline.list { padding: 0; align-items: stretch; }
|
|
325
|
+
.mt-preplist { list-style: none; margin: 0; padding: 2px 6px 2px 12px; width: 100%; overflow-y: auto; overscroll-behavior: contain; }
|
|
326
|
+
.mt-preplist li { display: flex; align-items: center; gap: 10px; min-height: 44px; border-bottom: 1px solid var(--hairline); }
|
|
327
|
+
.mt-preplist li:last-child { border-bottom: 0; }
|
|
328
|
+
.mt-preplist .mt-prepline-text { -webkit-line-clamp: 2; color: var(--ink); line-height: 1.3; }
|
|
329
|
+
.mt-preplist .cx-btn { flex: none; white-space: nowrap; height: 34px; }
|
|
330
|
+
/* The saved meeting's Prep: what it focused on and its files. */
|
|
331
|
+
#mt-dprep:empty { display: none; }
|
|
332
|
+
.mt-prep { margin: 12px 0; display: grid; gap: 10px; }
|
|
333
|
+
.mt-prep-item { display: grid; gap: 6px; }
|
|
334
|
+
.mt-prep-item .mt-q { margin: 0; }
|
|
335
|
+
.mt-prep-steer p { margin: 0 0 0.5em; font-size: 14px; line-height: 1.5; color: var(--ink); white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
336
|
+
.mt-prep-steer p:last-child { margin-bottom: 0; }
|
|
337
|
+
.mt-prep-files { border: 1px solid var(--hairline); border-radius: 9px; }
|
|
338
|
+
.mt-prep-files li:last-child { border-bottom: 0; }
|
|
339
|
+
#mt-lfoot .mt-bar { border-top: 0; }
|
|
254
340
|
@media (min-width: 860px) {
|
|
341
|
+
.mt-turns { height: clamp(320px, calc(100dvh - 400px), 1100px); }
|
|
255
342
|
.mt-lgrid { grid-template-columns: minmax(0, 1fr) minmax(280px, min(380px, 38%)); align-items: start; column-gap: 24px; }
|
|
256
343
|
.mt-lgrid > .mt-side-panel { position: sticky; top: calc(62px + var(--safe-top, 0px)); max-height: calc(100vh - 80px - var(--safe-top, 0px)); overflow: auto; }
|
|
257
344
|
}
|