@gotcos/glasses-server 6.98.1 → 6.99.16

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 (98) hide show
  1. package/CHANGELOG.md +227 -0
  2. package/package.json +2 -1
  3. package/server/index.ts +170 -11
  4. package/server/lib/api-auth.ts +31 -14
  5. package/server/lib/claude-bridge.ts +21 -2
  6. package/server/lib/codex-bridge.ts +21 -2
  7. package/server/lib/cos-thread.ts +582 -0
  8. package/server/lib/display-bus.ts +3 -0
  9. package/server/lib/drop-attachments.ts +55 -0
  10. package/server/lib/drop-destinations.ts +134 -0
  11. package/server/lib/drop-history-search.ts +97 -0
  12. package/server/lib/drop-p2-boot.ts +60 -0
  13. package/server/lib/drop-p2-runtime.ts +237 -0
  14. package/server/lib/drop-p2-settings.ts +174 -0
  15. package/server/lib/drop-resolution.ts +168 -0
  16. package/server/lib/drop-router.ts +325 -0
  17. package/server/lib/drop-service.ts +830 -0
  18. package/server/lib/drop-settings.ts +56 -0
  19. package/server/lib/drop-store.ts +450 -0
  20. package/server/lib/drop-when.ts +265 -0
  21. package/server/lib/glasses-pairing.ts +15 -0
  22. package/server/lib/learning-needs-you.ts +111 -0
  23. package/server/lib/live-cues-v2-settings.ts +2 -1
  24. package/server/lib/live-cues-v2.ts +6 -4
  25. package/server/lib/media-store.ts +80 -0
  26. package/server/lib/meeting-batch-transcribe.ts +15 -2
  27. package/server/lib/meeting-consolidation-run.ts +169 -0
  28. package/server/lib/meeting-store.ts +61 -0
  29. package/server/lib/meeting-title-steer.ts +200 -0
  30. package/server/lib/network-policy.ts +84 -6
  31. package/server/lib/permission-broker.ts +13 -0
  32. package/server/lib/phone-recording.ts +1 -1
  33. package/server/lib/ping-budget.ts +149 -0
  34. package/server/lib/ping-engine.ts +245 -0
  35. package/server/lib/ping-feed-sink.ts +33 -0
  36. package/server/lib/ping-sources.ts +192 -0
  37. package/server/lib/query-job-coordinator.ts +5 -2
  38. package/server/lib/query-job-runtime.ts +45 -4
  39. package/server/lib/query-job-types.ts +10 -1
  40. package/server/lib/reminder-scheduler.ts +153 -0
  41. package/server/lib/tailnet-self-name.ts +103 -0
  42. package/server/lib/tailscale-nudge.ts +40 -2
  43. package/server/lib/task-store.ts +32 -0
  44. package/server/lib/web-ask-admission.ts +56 -0
  45. package/server/lib/web-live-chunks.ts +273 -0
  46. package/server/lib/web-memories-bridge.ts +323 -0
  47. package/server/lib/web-session-auth.ts +492 -0
  48. package/server/lib/web-usage-bridge.ts +154 -0
  49. package/server/lib/work-search.ts +14 -1
  50. package/server/lib/your-move-count.ts +58 -0
  51. package/server/routes/cos-thread.ts +79 -0
  52. package/server/routes/display.ts +11 -1
  53. package/server/routes/drops.ts +262 -0
  54. package/server/routes/health.ts +16 -0
  55. package/server/routes/live-cues.ts +5 -4
  56. package/server/routes/meeting.ts +61 -5
  57. package/server/routes/permission-broker.ts +23 -3
  58. package/server/routes/transcribe-stream.ts +43 -4
  59. package/server/routes/web-control.ts +569 -0
  60. package/server/routes/welcome-context.ts +2 -1
  61. package/server/scripts/web-live-cls/cdp.mjs +57 -0
  62. package/server/scripts/web-live-cls/measure.mjs +80 -0
  63. package/server/scripts/web-live-cls/mock.mjs +97 -0
  64. package/server/scripts/web-live-cls/render.mjs +26 -0
  65. package/server/web-control/app.css +519 -0
  66. package/server/web-control/app.js +3643 -0
  67. package/server/web-control/control.css +325 -0
  68. package/server/web-control/fonts/DMSans.ttf +0 -0
  69. package/server/web-control/fonts/Fraunces.ttf +0 -0
  70. package/server/web-control/fonts/JetBrainsMono.ttf +0 -0
  71. package/server/web-control/index.html +275 -0
  72. package/server/web-control/mark.svg +1 -0
  73. package/server/web-control/memories/d3.min.js +2 -0
  74. package/server/web-control/memories/graph-explorer.css +200 -0
  75. package/server/web-control/memories/graph-explorer.js +748 -0
  76. package/server/web-control/memories/memories-app.js +1561 -0
  77. package/server/web-control/memories/memories-theme.css +73 -0
  78. package/server/web-control/memories/memories.html +72 -0
  79. package/server/web-control/memories/memory-stewardship.js +63 -0
  80. package/server/web-control/memories/memory-workspace.js +216 -0
  81. package/server/web-control/panes/cos-chat.css +174 -0
  82. package/server/web-control/panes/cos-chat.js +1118 -0
  83. package/server/web-control/panes/dictation.js +173 -0
  84. package/server/web-control/panes/meetings.css +314 -0
  85. package/server/web-control/panes/meetings.js +2568 -0
  86. package/server/web-control/panes/messages.js +718 -0
  87. package/server/web-control/panes/questions.css +32 -0
  88. package/server/web-control/panes/questions.js +275 -0
  89. package/server/web-control/panes/sessions.css +452 -0
  90. package/server/web-control/panes/settings.js +292 -0
  91. package/server/web-control/panes/speakers.css +269 -0
  92. package/server/web-control/panes/speakers.js +2755 -0
  93. package/server/web-control/panes/threads.js +200 -0
  94. package/server/web-control/panes/work.css +261 -0
  95. package/server/web-control/panes/work.js +1667 -0
  96. package/server/web-control/shell.js +294 -0
  97. package/server/web-control/theme.js +25 -0
  98. package/server/web-control/vendor/qrcode-encoder.js +10 -0
@@ -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>