@codemem/server 0.44.0-beta.1 → 0.44.1

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/static/app.js.br CHANGED
Binary file
package/static/app.js.gz CHANGED
Binary file
package/static/index.html CHANGED
@@ -43,6 +43,7 @@
43
43
  *, *::before, *::after { box-sizing: border-box; margin: 0; }
44
44
 
45
45
  body {
46
+ --header-sticky-offset: 73px;
46
47
  font-family: var(--font-sans);
47
48
  font-size: var(--font-size-base);
48
49
  line-height: 1.55;
@@ -108,6 +109,8 @@
108
109
  display: flex;
109
110
  align-items: center;
110
111
  gap: var(--sp-3);
112
+ min-width: 0;
113
+ overflow: hidden;
111
114
  }
112
115
 
113
116
  .logo {
@@ -127,7 +130,10 @@
127
130
  font-size: var(--font-size-2xl);
128
131
  font-weight: var(--font-weight-semibold);
129
132
  letter-spacing: -0.01em;
133
+ min-width: 0;
130
134
  white-space: nowrap;
135
+ overflow: hidden;
136
+ text-overflow: ellipsis;
131
137
  }
132
138
 
133
139
  .health-dot {
@@ -144,6 +150,7 @@
144
150
  display: flex;
145
151
  align-items: center;
146
152
  gap: var(--sp-2);
153
+ min-width: 0;
147
154
  }
148
155
 
149
156
  /* Diagnostic metadata cluster: runtime version + database path. Grouped
@@ -194,7 +201,7 @@
194
201
  -webkit-backdrop-filter: blur(10px) saturate(1.2);
195
202
  border-bottom: 1px solid var(--border);
196
203
  position: sticky;
197
- top: 73px; /* header height */
204
+ top: var(--header-sticky-offset);
198
205
  z-index: 9;
199
206
  }
200
207
 
@@ -229,7 +236,7 @@
229
236
  .tab-btn.active::after {
230
237
  content: "";
231
238
  position: absolute;
232
- bottom: -1px;
239
+ bottom: 0;
233
240
  left: var(--sp-4);
234
241
  right: var(--sp-4);
235
242
  height: 2px;
@@ -851,6 +858,30 @@
851
858
  text-transform: uppercase;
852
859
  }
853
860
 
861
+ .stat[tabindex="0"]:focus-visible {
862
+ outline: 2px solid var(--accent);
863
+ outline-offset: 2px;
864
+ }
865
+
866
+ .automatic-recall { margin-top: var(--sp-3); }
867
+ .automatic-recall > summary {
868
+ min-height: 44px;
869
+ padding: 10px 0;
870
+ cursor: pointer;
871
+ color: var(--text-secondary);
872
+ font-size: var(--font-size-md);
873
+ font-weight: var(--font-weight-medium);
874
+ }
875
+ .automatic-recall > section { margin-top: var(--sp-2); }
876
+ .automatic-recall-grid { margin-top: var(--sp-3); }
877
+ .automatic-recall-meta {
878
+ max-width: 65ch;
879
+ margin-top: var(--sp-3);
880
+ color: var(--text-tertiary);
881
+ font-size: var(--font-size-sm);
882
+ line-height: 1.5;
883
+ }
884
+
854
885
  .health-primary {
855
886
  border-width: 2px;
856
887
  }
@@ -2206,6 +2237,7 @@
2206
2237
  line-height: 1.55;
2207
2238
  color: var(--text-secondary);
2208
2239
  }
2240
+ .feed-body.narrative { max-width: 88ch; }
2209
2241
  .feed-body.clamp { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; }
2210
2242
  .feed-body.clamp-3 { -webkit-line-clamp: 3; }
2211
2243
  .feed-body.clamp-5 { -webkit-line-clamp: 5; }
@@ -3241,6 +3273,146 @@
3241
3273
  @media (max-height: 720px) { .modal { align-items: flex-start; } }
3242
3274
  .modal-backdrop[hidden], .modal[hidden] { display: none; }
3243
3275
 
3276
+ /* ── Contextual diagnostics drawer ─────────────────────── */
3277
+ .diagnostics-drawer-overlay {
3278
+ position: fixed;
3279
+ inset: 0;
3280
+ z-index: 45;
3281
+ background: rgba(25, 24, 23, 0.42);
3282
+ backdrop-filter: blur(4px);
3283
+ animation: diagnosticsOverlayIn var(--duration-fast) var(--ease-standard);
3284
+ }
3285
+ .diagnostics-drawer {
3286
+ position: fixed;
3287
+ inset: 0 0 0 auto;
3288
+ z-index: 46;
3289
+ width: clamp(420px, 42vw, 640px);
3290
+ display: flex;
3291
+ flex-direction: column;
3292
+ gap: var(--sp-3);
3293
+ padding: var(--sp-5);
3294
+ border-left: 1px solid var(--border);
3295
+ background: var(--surface-1);
3296
+ box-shadow: var(--shadow-lg);
3297
+ color: var(--text-primary);
3298
+ animation: diagnosticsDrawerIn var(--duration-fast) var(--ease-standard);
3299
+ }
3300
+ .diagnostics-drawer-header,
3301
+ .diagnostics-secondary-controls,
3302
+ .diagnostics-notice,
3303
+ .diagnostics-event-heading,
3304
+ .diagnostics-event-context {
3305
+ display: flex;
3306
+ align-items: center;
3307
+ justify-content: space-between;
3308
+ gap: var(--sp-3);
3309
+ }
3310
+ .diagnostics-drawer-header { flex-shrink: 0; align-items: flex-start; }
3311
+ .diagnostics-drawer-header h2 { margin: 0; font-size: var(--font-size-2xl); }
3312
+ .diagnostics-drawer-header p { margin-top: var(--sp-1); color: var(--text-secondary); }
3313
+ .diagnostics-controls {
3314
+ display: grid;
3315
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto;
3316
+ gap: var(--sp-2);
3317
+ align-items: end;
3318
+ flex-shrink: 0;
3319
+ }
3320
+ .diagnostics-controls label { display: grid; gap: 5px; color: var(--text-secondary); font-size: var(--font-size-sm); }
3321
+ .diagnostics-controls select {
3322
+ width: 100%;
3323
+ min-height: 36px;
3324
+ border: 1px solid var(--border);
3325
+ border-radius: var(--radius-md);
3326
+ padding: 6px 10px;
3327
+ background: var(--input-bg);
3328
+ color: var(--text-primary);
3329
+ }
3330
+ .diagnostics-controls select:focus-visible,
3331
+ .diagnostics-new-events:focus-visible,
3332
+ .diagnostics-recovery:focus-visible {
3333
+ outline: 2px solid var(--accent);
3334
+ outline-offset: 2px;
3335
+ box-shadow: 0 0 0 4px var(--focus-ring);
3336
+ }
3337
+ .diagnostics-secondary-controls { flex-shrink: 0; }
3338
+ .diagnostics-secondary-actions { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
3339
+ .diagnostics-copy-status { min-height: 1.25em; color: var(--text-secondary); font-size: var(--font-size-sm); }
3340
+ .diagnostics-generated-at,
3341
+ .diagnostics-limit-note,
3342
+ .diagnostics-filter-context { color: var(--text-tertiary); font-size: var(--font-size-sm); }
3343
+ .diagnostics-notice {
3344
+ border: 1px solid var(--border);
3345
+ border-radius: var(--radius-md);
3346
+ padding: var(--sp-2) var(--sp-3);
3347
+ background: var(--surface-2);
3348
+ color: var(--text-secondary);
3349
+ flex-shrink: 0;
3350
+ }
3351
+ .diagnostics-notice--error { border-color: color-mix(in srgb, var(--status-attention) 42%, var(--border)); }
3352
+ .diagnostics-new-events {
3353
+ align-self: center;
3354
+ border: 1px solid var(--accent);
3355
+ border-radius: var(--radius-pill);
3356
+ padding: 7px 14px;
3357
+ background: var(--accent-subtle);
3358
+ color: var(--text-primary);
3359
+ cursor: pointer;
3360
+ font: inherit;
3361
+ font-weight: var(--font-weight-semibold);
3362
+ }
3363
+ .diagnostics-event-list { min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
3364
+ .diagnostics-event-list ul { display: grid; gap: var(--sp-2); margin: 0; padding: 0; list-style: none; }
3365
+ .diagnostics-event {
3366
+ display: grid;
3367
+ gap: var(--sp-2);
3368
+ border: 1px solid var(--border);
3369
+ border-left-width: 3px;
3370
+ border-radius: var(--radius-md);
3371
+ padding: var(--sp-3);
3372
+ background: var(--surface-0);
3373
+ }
3374
+ .diagnostics-event--info { border-left-color: var(--accent); }
3375
+ .diagnostics-event--warning { border-left-color: var(--status-degraded); }
3376
+ .diagnostics-event--error { border-left-color: var(--status-attention); }
3377
+ .diagnostics-event-heading time,
3378
+ .diagnostics-event-context,
3379
+ .diagnostics-event-meta { color: var(--text-tertiary); font-size: var(--font-size-sm); }
3380
+ .diagnostics-event-context { justify-content: flex-start; flex-wrap: wrap; }
3381
+ .diagnostics-event-context span { text-transform: capitalize; }
3382
+ .diagnostics-event p { margin: 0; line-height: 1.5; }
3383
+ .diagnostics-severity { display: inline-flex; align-items: center; gap: 6px; font-weight: var(--font-weight-semibold); }
3384
+ .diagnostics-severity-icon {
3385
+ display: inline-grid;
3386
+ place-items: center;
3387
+ width: 20px;
3388
+ height: 20px;
3389
+ border: 1px solid currentColor;
3390
+ border-radius: 50%;
3391
+ font-weight: var(--font-weight-semibold);
3392
+ }
3393
+ .diagnostics-technical-detail pre,
3394
+ .diagnostics-recovery-command code { white-space: pre-wrap; overflow-wrap: anywhere; }
3395
+ .diagnostics-technical-detail pre { margin: var(--sp-2) 0 0; color: var(--text-secondary); }
3396
+ .diagnostics-recovery { color: var(--accent); font-weight: var(--font-weight-semibold); width: fit-content; }
3397
+ .diagnostics-recovery-command { display: grid; gap: 4px; color: var(--text-secondary); }
3398
+ .diagnostics-empty { display: grid; place-items: center; gap: var(--sp-3); min-height: 220px; text-align: center; color: var(--text-secondary); }
3399
+ .diagnostics-loading { display: grid; gap: var(--sp-2); }
3400
+ .diagnostics-loading-row { display: grid; gap: var(--sp-2); padding: var(--sp-3); border: 1px solid var(--border); border-radius: var(--radius-md); }
3401
+ .diagnostics-loading-row span { height: 10px; border-radius: var(--radius-pill); background: var(--surface-2); animation: pulse var(--duration-pulse) var(--ease-standard) infinite; }
3402
+ .diagnostics-loading-row span:nth-child(2) { width: 64%; }
3403
+ .diagnostics-loading-row span:nth-child(3) { width: 82%; }
3404
+ .diagnostics-load-older { display: block; margin: var(--sp-3) auto 0; }
3405
+ .diagnostics-limit-note { padding: var(--sp-3); text-align: center; }
3406
+ @keyframes diagnosticsOverlayIn { from { opacity: 0; } to { opacity: 1; } }
3407
+ @keyframes diagnosticsDrawerIn { from { transform: translateX(24px); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
3408
+
3409
+ @media (max-width: 699px) {
3410
+ .diagnostics-drawer { inset: 0; width: 100vw; padding: var(--sp-4); border-left: 0; }
3411
+ .diagnostics-controls { grid-template-columns: 1fr 1fr; }
3412
+ .diagnostics-controls > button { grid-column: 1 / -1; }
3413
+ .diagnostics-secondary-controls { align-items: flex-start; flex-direction: column; }
3414
+ }
3415
+
3244
3416
  .legacy-upgrade-modal .modal-card { width: min(620px, 100%); }
3245
3417
  .legacy-upgrade-summary {
3246
3418
  padding: var(--sp-3);
@@ -3476,6 +3648,7 @@
3476
3648
  color: var(--text-secondary);
3477
3649
  font-size: var(--font-size-sm);
3478
3650
  }
3651
+ .viewer-reconnect-actions { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
3479
3652
  .viewer-reconnect-spinner {
3480
3653
  width: 14px;
3481
3654
  height: 14px;
@@ -3954,6 +4127,24 @@
3954
4127
  /* ── Responsive ────────────────────────────────────────── */
3955
4128
 
3956
4129
  @media (max-width: 900px) {
4130
+ .header-row { flex-wrap: nowrap; }
4131
+ .header-right { flex: 1 1 auto; justify-content: flex-end; }
4132
+ /* Diagnostic metadata yields before project scope or controls clip. */
4133
+ .header-tertiary { display: none; }
4134
+ .header-right .project-filter {
4135
+ flex: 1 1 140px;
4136
+ min-width: 96px;
4137
+ max-width: 240px;
4138
+ }
4139
+ /* Keep navigation to one compact row while preserving every destination. */
4140
+ .tab-bar {
4141
+ overflow-x: auto;
4142
+ overscroll-behavior-inline: contain;
4143
+ -webkit-overflow-scrolling: touch;
4144
+ scrollbar-width: none;
4145
+ }
4146
+ .tab-bar::-webkit-scrollbar { display: none; }
4147
+ .tab-btn { flex-shrink: 0; }
3957
4148
  .tab-panel { padding: var(--sp-4); }
3958
4149
  .summary-row { grid-template-columns: 1fr; }
3959
4150
  .feed-card-header { flex-wrap: wrap; }
@@ -3971,23 +4162,15 @@
3971
4162
  }
3972
4163
 
3973
4164
  @media (max-width: 720px) {
3974
- /* Hide diagnostic metadata (runtime version + database path) when the
3975
- header would otherwise wrap. Keeps brand + project filter + theme
3976
- + settings on a single row at common split-window widths. */
3977
- .header-tertiary { display: none; }
3978
- /* Allow the tab bar to scroll horizontally rather than wrap into two
3979
- rows. Scrollbar is hidden to keep the sticky chrome compact. */
3980
- .tab-bar {
3981
- overflow-x: auto;
3982
- -webkit-overflow-scrolling: touch;
3983
- scrollbar-width: none;
3984
- }
3985
- .tab-bar::-webkit-scrollbar { display: none; }
3986
- .tab-btn { flex-shrink: 0; }
4165
+ .header-title { font-size: var(--font-size-xl); }
3987
4166
  }
3988
4167
 
3989
4168
  @media (max-width: 520px) {
4169
+ body { --header-sticky-offset: 117px; }
3990
4170
  header { padding: var(--sp-3) var(--sp-4); }
4171
+ .header-row { flex-wrap: wrap; }
4172
+ .header-left, .header-right { flex-basis: 100%; }
4173
+ .refresh-status[data-refresh-state="idle"] { display: none; }
3991
4174
  .tab-bar { padding: 0 var(--sp-4); }
3992
4175
  .modal { padding: var(--sp-3); }
3993
4176
  .modal-card { padding: var(--sp-4); border-radius: var(--radius-lg); }
@@ -4051,7 +4234,7 @@
4051
4234
  <span class="header-title">codemem</span>
4052
4235
  <span class="health-dot status-healthy" id="healthDot" title="Healthy"></span>
4053
4236
  </div>
4054
- <span class="refresh-status" id="refreshStatus">refreshing…</span>
4237
+ <span class="refresh-status" id="refreshStatus" data-refresh-state="refreshing">refreshing…</span>
4055
4238
  <span class="sr-only" id="refreshAnnouncer" aria-live="polite"></span>
4056
4239
  </div>
4057
4240
  <div class="header-right">
@@ -4084,6 +4267,7 @@
4084
4267
  <div id="toastRoot"></div>
4085
4268
  <div id="recipientPolicyManagementMount"></div>
4086
4269
  <div id="legacyTeamSetupMount"></div>
4270
+ <div id="diagnosticsDrawerMount"></div>
4087
4271
  <div class="viewer-reconnect-overlay" id="viewerReconnectOverlay" hidden>
4088
4272
  <div class="viewer-reconnect-card" role="status" aria-live="assertive">
4089
4273
  <div class="viewer-reconnect-eyebrow">Viewer connection</div>
@@ -4095,8 +4279,9 @@
4095
4279
  <span class="viewer-reconnect-spinner" aria-hidden="true"></span>
4096
4280
  <span>The page will recover automatically when the server responds.</span>
4097
4281
  </div>
4098
- <div>
4099
- <button class="settings-button" id="viewerReconnectRetry">Retry now</button>
4282
+ <div class="viewer-reconnect-actions">
4283
+ <button class="settings-button" id="viewerReconnectRetry" type="button">Retry now</button>
4284
+ <button class="settings-button" id="viewerReconnectDiagnostics" type="button">View connection diagnostics</button>
4100
4285
  </div>
4101
4286
  </div>
4102
4287
  </div>
@@ -4357,6 +4542,7 @@
4357
4542
  <div class="card" style="animation-delay: 0s">
4358
4543
  <div class="section-header">
4359
4544
  <h2>System health</h2>
4545
+ <button class="settings-button" id="healthOpenDiagnostics" type="button">View diagnostics</button>
4360
4546
  </div>
4361
4547
  <div class="section-meta" id="healthMeta">Assessing health signals…</div>
4362
4548
  <div class="health-actions" id="healthActions"></div>
@@ -4367,6 +4553,7 @@
4367
4553
  <div class="card" style="animation-delay: 0.05s">
4368
4554
  <h2>Stats</h2>
4369
4555
  <div class="grid-2" id="statsGrid"></div>
4556
+ <div id="automaticRecallStats"></div>
4370
4557
  </div>
4371
4558
  <div class="card" style="animation-delay: 0.1s">
4372
4559
  <h2>Current session</h2>
@@ -4572,6 +4759,7 @@
4572
4759
  <h2>Sync diagnostics</h2>
4573
4760
  </div>
4574
4761
  <div class="section-actions">
4762
+ <button class="settings-button" id="syncOpenDiagnostics" type="button">Recent sync events</button>
4575
4763
  <label class="small sync-redact-control">
4576
4764
  <span id="syncRedactMount"></span>
4577
4765
  <span id="syncRedactLabel">Redact</span>
@@ -4617,6 +4805,6 @@
4617
4805
  </div>
4618
4806
  </div>
4619
4807
 
4620
- <script src="/assets/app.js?v=1dbc1b498089"></script>
4808
+ <script src="/assets/app.js?v=7b6125a564c8"></script>
4621
4809
  </body>
4622
4810
  </html>