@gotcos/glasses-server 6.99.16 → 6.99.25

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/docs/work-orchestrator.md +20 -0
  3. package/package.json +1 -1
  4. package/server/index.ts +23 -1
  5. package/server/lib/ask-work-plan.ts +116 -0
  6. package/server/lib/batch-transcript-quality.ts +2 -0
  7. package/server/lib/drop-store.ts +16 -2
  8. package/server/lib/meeting-ask-runtime.ts +1 -1
  9. package/server/lib/meeting-batch-transcribe.ts +40 -1
  10. package/server/lib/ping-sources.ts +6 -2
  11. package/server/lib/prep-runtime.ts +915 -0
  12. package/server/lib/prep-store.ts +226 -0
  13. package/server/lib/stt-resolver.ts +26 -2
  14. package/server/lib/transcript-cleanup.ts +11 -2
  15. package/server/lib/web-control-static.ts +226 -0
  16. package/server/lib/web-memories-bridge.ts +9 -8
  17. package/server/lib/web-pet-choice.ts +225 -0
  18. package/server/lib/web-pet.ts +226 -0
  19. package/server/lib/work-lens-rounds.ts +29 -4
  20. package/server/lib/work-orchestrator/runtime.ts +8 -2
  21. package/server/routes/ask-work-plan.ts +114 -0
  22. package/server/routes/health.ts +8 -0
  23. package/server/routes/prep.ts +81 -0
  24. package/server/routes/web-control.ts +110 -7
  25. package/server/routes/welcome-context.ts +29 -1
  26. package/server/routes/work-lens-rounds.ts +19 -5
  27. package/server/routes/work-orchestrator.ts +57 -0
  28. package/server/web-control/app.css +24 -5
  29. package/server/web-control/app.js +646 -108
  30. package/server/web-control/control.css +1 -1
  31. package/server/web-control/index.html +27 -13
  32. package/server/web-control/memories/memory-workspace.js +1 -1
  33. package/server/web-control/panes/cos-chat.css +26 -0
  34. package/server/web-control/panes/cos-chat.js +641 -6
  35. package/server/web-control/panes/meetings.css +45 -2
  36. package/server/web-control/panes/meetings.js +230 -7
  37. package/server/web-control/panes/memories.css +291 -0
  38. package/server/web-control/panes/memories.js +2208 -0
  39. package/server/web-control/panes/questions.js +59 -21
  40. package/server/web-control/panes/settings.js +102 -4
  41. package/server/web-control/panes/today-actions.css +109 -0
  42. package/server/web-control/panes/today-actions.js +972 -0
  43. package/server/web-control/panes/work.css +54 -0
  44. package/server/web-control/panes/work.js +1037 -18
  45. package/server/web-control/shell.js +6 -2
  46. package/server/web-control/theme.js +0 -2
  47. package/shared/meeting-ask.ts +6 -2
  48. package/shared/prep.ts +317 -0
  49. package/server/web-control/memories/memories-app.js +0 -1561
  50. package/server/web-control/memories/memories-theme.css +0 -73
  51. package/server/web-control/memories/memories.html +0 -72
  52. package/server/web-control/memories/memory-stewardship.js +0 -63
@@ -309,7 +309,7 @@ button.cx-set-row:hover { background: var(--qopen); }
309
309
  @media (min-width: 1100px) { .cx-set-name { font-size: 14px; } }
310
310
  @media (min-width: 1100px) { .rail-settings[aria-current='page'] { background: var(--rail-active); border: 1px solid var(--panel-border); } }
311
311
 
312
- /* Sign in another device: the QR the phone camera scans. */
312
+ /* Use COS on another phone or browser: the QR the phone camera scans. */
313
313
  .device-code .qr { display: block; width: 200px; height: 200px; margin: 4px 0 8px; border-radius: 8px; border: 1px solid var(--panel-border); background: #fff; }
314
314
  .device-code .qr-hint { font-weight: 600; color: var(--ink); }
315
315
 
@@ -19,6 +19,8 @@
19
19
  <link rel="stylesheet" href="/control/panes/sessions.css">
20
20
  <link rel="stylesheet" href="/control/panes/cos-chat.css">
21
21
  <link rel="stylesheet" href="/control/panes/questions.css">
22
+ <link rel="stylesheet" href="/control/panes/memories.css">
23
+ <link rel="stylesheet" href="/control/panes/today-actions.css">
22
24
  <script src="/control/theme.js"></script>
23
25
  </head>
24
26
  <body>
@@ -57,7 +59,7 @@
57
59
  <div id="auth-code-block">
58
60
  <label for="auth-code">Sign-in code</label>
59
61
  <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>
62
+ <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, Use COS on another phone or browser. COS Control on your Mac shows one under Open COS on your phone. Or type the code shown with the QR.</p>
61
63
  <p class="auth-foot">The glasses pairing code does not work here.</p>
62
64
  </div>
63
65
  <div id="auth-token-block" class="hidden">
@@ -126,6 +128,7 @@
126
128
  <kbd class="kbd">⌘K</kbd>
127
129
  </button>
128
130
  </div>
131
+ <div id="today-pet" class="today-pet hidden"></div>
129
132
  <div id="today-rec"></div>
130
133
  <div class="today-cols">
131
134
  <div class="today-main">
@@ -148,13 +151,14 @@
148
151
  <section class="card hidden" id="intake-card" aria-labelledby="intake-title">
149
152
  <div class="panel-head">
150
153
  <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>
154
+ <button type="button" class="link-btn" data-today="intake" data-goto="work/sort">Review</button>
152
155
  </div>
153
156
  <div id="intake-body" class="intake-body"></div>
154
157
  </section>
155
158
  <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>
159
+ <div class="panel-head"><h2 id="next-title" class="panel-title">Next up</h2></div>
157
160
  <div id="next-body" class="next-up"></div>
161
+ <div id="next-actions" class="next-actions"></div>
158
162
  </section>
159
163
  </div>
160
164
  </div>
@@ -207,9 +211,7 @@
207
211
  <section id="pane-dictation" class="pane hidden" data-title="Dictation"></section>
208
212
 
209
213
  <!-- 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>
214
+ <section id="pane-memories" class="pane hidden" data-title="Memories"><!-- rendered by panes/memories.js --></section>
213
215
 
214
216
  <!-- SPEAKERS -->
215
217
  <section id="pane-speakers" class="pane wide hidden" data-title="Speakers"><!-- rendered by panes/speakers.js --></section>
@@ -263,13 +265,25 @@
263
265
  <script src="/control/app.js"></script>
264
266
  <script src="/control/shell.js"></script>
265
267
  <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
268
  <script src="/control/panes/questions.js"></script>
269
+ <!-- Loaded when first opened, then in the background once the page is idle (app.js ensurePane). -->
270
+ <script type="application/json" id="lazy-panes">{
271
+ "messages": "/control/panes/messages.js",
272
+ "threads": "/control/panes/threads.js",
273
+ "speakers": "/control/panes/speakers.js",
274
+ "meetings": "/control/panes/meetings.js",
275
+ "work": "/control/panes/work.js",
276
+ "dictation": "/control/panes/dictation.js",
277
+ "settings": "/control/panes/settings.js",
278
+ "memories": "/control/panes/memories.js",
279
+ "todayActions": "/control/panes/today-actions.js"
280
+ }</script>
281
+ <!-- The Knowledge graph explorer, loaded by panes/memories.js when the graph first opens. -->
282
+ <script type="application/json" id="memories-graph-assets">{
283
+ "css": "/control/memories/graph-explorer.css",
284
+ "d3": "/control/memories/d3.min.js",
285
+ "explorer": "/control/memories/graph-explorer.js",
286
+ "workspace": "/control/memories/memory-workspace.js"
287
+ }</script>
274
288
  </body>
275
289
  </html>
@@ -17,7 +17,7 @@
17
17
  var el=document.createElement('section');el.className='memory-investigation';
18
18
  var state={id:id(),revision:0,title:'Untitled investigation',nodes:[],links:[],anchors:[],waypoints:[],filters:{hops:3,direction:'undirected',avoid:[]},generation:null,paths:[]};
19
19
  var queuedFocus=null,editEpoch=0,lastFocus=null,selected=null,offsets={},history=[],controller=null,started=false,busy=false,requestSerial=0,saveIntents={},assertionIntent=null,separationIntent=null;
20
- el.innerHTML='<div data-role="canvas" class="cgx-host"></div><p data-role="overview-status" class="muted" role="status"></p><details class="investigation-tools" data-role="advanced"><summary>Advanced investigation</summary><div class="graph-search row"><input type="search" id="graphQuery" aria-label="Find an entity" placeholder="Find a person or idea…"><button onclick="cosApp.graphSearch()">Find points</button><span id="graphSearchStatus" class="muted"></span></div><div class="source-card"><div class="row"><input data-role="title" aria-label="Investigation title" placeholder="Investigation title"><button data-action="save">Save investigation</button><button data-action="open">Open saved</button><button data-action="new">New</button></div>'+
20
+ el.innerHTML='<div data-role="canvas" class="cgx-host"></div><p data-role="overview-status" class="muted" role="status"></p><details class="investigation-tools" data-role="advanced"><summary>Advanced investigation</summary><div class="graph-search row"><input type="search" id="graphQuery" aria-label="Find an entity" placeholder="Find a person or idea…"><button type="button" data-role="find-points">Find points</button><span id="graphSearchStatus" class="muted"></span></div><div class="source-card"><div class="row"><input data-role="title" aria-label="Investigation title" placeholder="Investigation title"><button data-action="save">Save investigation</button><button data-action="open">Open saved</button><button data-action="new">New</button></div>'+
21
21
  '<p data-role="receipt" class="muted">Draft · saved separately from standing knowledge.</p><div data-role="matches" class="row"></div>'+
22
22
  '<div class="row"><b data-role="selected">Select a point</b><button data-action="start">Set start</button><button data-action="target">Set target</button><button data-action="waypoint">Add waypoint</button><button data-action="expand">Expand point</button><button data-action="avoid">Avoid point</button><button data-action="hide">Hide point</button><button data-action="undo">Undo canvas edit</button></div>'+
23
23
  '<p data-role="anchors"></p><div data-role="waypoints" class="row"></div><div class="row"><label>Total hops <select data-role="hops" aria-label="Total hop limit"><option>3</option><option>4</option><option>5</option><option>6</option><option>7</option></select></label><label>Traversal <select data-role="direction" aria-label="Relationship direction"><option value="undirected">Undirected discovery</option><option value="directed">Known direction only</option></select></label><label>Known valid on <input data-role="valid" aria-label="Known valid on" type="date"></label><button data-action="paths">Find connections</button><button data-action="refresh">Review generation changes</button><button data-action="separate">Keep anchors separate</button></div>'+
@@ -172,3 +172,29 @@
172
172
  /* 6.99.16: the COS thread's one quiet line, under the title row. */
173
173
  .cc-thread { flex-basis: 100%; margin: 0; font-size: 12.5px; line-height: 1.35; color: var(--tertiary); }
174
174
  .cc-thread:empty { display: none; }
175
+
176
+ /* 6.99.19: the Prep composer, above the chat's own. The live meeting view's panel, Files row and composer (meetings.css
177
+ .mt-panel, .mt-files, .mt-composer), so it reads as the same tool. */
178
+ .cc-prep { padding: 10px 0 2px; }
179
+ .cc-prep-panel { display: grid; gap: 6px; }
180
+ .cc-prep-panel .mt-ask-line { margin: 0 0 4px; }
181
+ .cc-prep-title { min-width: 0; overflow-wrap: anywhere; }
182
+ .cc-prep-head-acts { display: flex; flex: none; gap: 4px 14px; flex-wrap: wrap; justify-content: flex-end; }
183
+ .cc-prep-panel .mt-files { max-width: none; margin: 0; }
184
+ .cc-prep-panel .mt-files-list li.mt-up { min-height: 44px; align-content: center; }
185
+ .cc-prep-form { margin-top: 2px; }
186
+ .cc-prep-form .field { min-height: 76px; max-height: 220px; }
187
+ .cc-prep-acts { display: flex; align-items: center; gap: 8px; justify-content: flex-end; flex-wrap: wrap; }
188
+ .cc-prep-count { flex: 1; min-width: 0; font-size: 12px; }
189
+ .cc-prep-add { position: relative; cursor: pointer; }
190
+ .cc-prep-add:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; }
191
+ .cc-prep-acts .cx-btn { height: 40px; }
192
+ @media (max-width: 480px) {
193
+ .cc-prep-acts .cx-btn { height: 44px; min-width: 44px; }
194
+ .cc-prep-head-acts button { min-height: 44px; }
195
+ }
196
+ .cc-prep-note { margin: 0; font-size: 13px; }
197
+ .cc-prep-note[hidden] { display: none; }
198
+ .cc-prep.dragging .cc-prep-panel { outline: 2px dashed var(--accent); outline-offset: 4px; }
199
+ .cc-prep { scroll-margin-top: calc(64px + var(--safe-top, 0px)); }
200
+ @media (min-width: 860px) { .msg-right .cc-prep { padding: 10px 16px 0; max-height: 55%; overflow-y: auto; flex: none; } }