@codemem/server 0.44.0-alpha.1 → 0.44.0

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;
@@ -1224,7 +1231,8 @@
1224
1231
  margin-top: var(--sp-2);
1225
1232
  }
1226
1233
  .projects-pagination { margin-top: var(--sp-4); }
1227
- .recipient-policy-review > h3 { margin-top: var(--sp-4); }
1234
+ .recipient-policy-review-section + .recipient-policy-review-section { margin-top: var(--sp-5); }
1235
+ .recipient-policy-review-heading { margin-bottom: var(--sp-2); }
1228
1236
  .recipient-policy-review-status:empty { display: none; }
1229
1237
  .recipient-policy-review-list { margin-top: var(--sp-3); }
1230
1238
  .recipient-policy-review-item .project-inventory-actions label {
@@ -1240,7 +1248,6 @@
1240
1248
  margin-top: var(--sp-1);
1241
1249
  padding-left: var(--sp-5);
1242
1250
  }
1243
- .recipient-policy-blocked-heading { margin-top: var(--sp-5) !important; }
1244
1251
  .project-selection-actions,
1245
1252
  .recipient-policy-management-actions,
1246
1253
  .recipient-policy-sharing-actions {
@@ -3241,6 +3248,146 @@
3241
3248
  @media (max-height: 720px) { .modal { align-items: flex-start; } }
3242
3249
  .modal-backdrop[hidden], .modal[hidden] { display: none; }
3243
3250
 
3251
+ /* ── Contextual diagnostics drawer ─────────────────────── */
3252
+ .diagnostics-drawer-overlay {
3253
+ position: fixed;
3254
+ inset: 0;
3255
+ z-index: 45;
3256
+ background: rgba(25, 24, 23, 0.42);
3257
+ backdrop-filter: blur(4px);
3258
+ animation: diagnosticsOverlayIn var(--duration-fast) var(--ease-standard);
3259
+ }
3260
+ .diagnostics-drawer {
3261
+ position: fixed;
3262
+ inset: 0 0 0 auto;
3263
+ z-index: 46;
3264
+ width: clamp(420px, 42vw, 640px);
3265
+ display: flex;
3266
+ flex-direction: column;
3267
+ gap: var(--sp-3);
3268
+ padding: var(--sp-5);
3269
+ border-left: 1px solid var(--border);
3270
+ background: var(--surface-1);
3271
+ box-shadow: var(--shadow-lg);
3272
+ color: var(--text-primary);
3273
+ animation: diagnosticsDrawerIn var(--duration-fast) var(--ease-standard);
3274
+ }
3275
+ .diagnostics-drawer-header,
3276
+ .diagnostics-secondary-controls,
3277
+ .diagnostics-notice,
3278
+ .diagnostics-event-heading,
3279
+ .diagnostics-event-context {
3280
+ display: flex;
3281
+ align-items: center;
3282
+ justify-content: space-between;
3283
+ gap: var(--sp-3);
3284
+ }
3285
+ .diagnostics-drawer-header { flex-shrink: 0; align-items: flex-start; }
3286
+ .diagnostics-drawer-header h2 { margin: 0; font-size: var(--font-size-2xl); }
3287
+ .diagnostics-drawer-header p { margin-top: var(--sp-1); color: var(--text-secondary); }
3288
+ .diagnostics-controls {
3289
+ display: grid;
3290
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto;
3291
+ gap: var(--sp-2);
3292
+ align-items: end;
3293
+ flex-shrink: 0;
3294
+ }
3295
+ .diagnostics-controls label { display: grid; gap: 5px; color: var(--text-secondary); font-size: var(--font-size-sm); }
3296
+ .diagnostics-controls select {
3297
+ width: 100%;
3298
+ min-height: 36px;
3299
+ border: 1px solid var(--border);
3300
+ border-radius: var(--radius-md);
3301
+ padding: 6px 10px;
3302
+ background: var(--input-bg);
3303
+ color: var(--text-primary);
3304
+ }
3305
+ .diagnostics-controls select:focus-visible,
3306
+ .diagnostics-new-events:focus-visible,
3307
+ .diagnostics-recovery:focus-visible {
3308
+ outline: 2px solid var(--accent);
3309
+ outline-offset: 2px;
3310
+ box-shadow: 0 0 0 4px var(--focus-ring);
3311
+ }
3312
+ .diagnostics-secondary-controls { flex-shrink: 0; }
3313
+ .diagnostics-secondary-actions { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
3314
+ .diagnostics-copy-status { min-height: 1.25em; color: var(--text-secondary); font-size: var(--font-size-sm); }
3315
+ .diagnostics-generated-at,
3316
+ .diagnostics-limit-note,
3317
+ .diagnostics-filter-context { color: var(--text-tertiary); font-size: var(--font-size-sm); }
3318
+ .diagnostics-notice {
3319
+ border: 1px solid var(--border);
3320
+ border-radius: var(--radius-md);
3321
+ padding: var(--sp-2) var(--sp-3);
3322
+ background: var(--surface-2);
3323
+ color: var(--text-secondary);
3324
+ flex-shrink: 0;
3325
+ }
3326
+ .diagnostics-notice--error { border-color: color-mix(in srgb, var(--status-attention) 42%, var(--border)); }
3327
+ .diagnostics-new-events {
3328
+ align-self: center;
3329
+ border: 1px solid var(--accent);
3330
+ border-radius: var(--radius-pill);
3331
+ padding: 7px 14px;
3332
+ background: var(--accent-subtle);
3333
+ color: var(--text-primary);
3334
+ cursor: pointer;
3335
+ font: inherit;
3336
+ font-weight: var(--font-weight-semibold);
3337
+ }
3338
+ .diagnostics-event-list { min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
3339
+ .diagnostics-event-list ul { display: grid; gap: var(--sp-2); margin: 0; padding: 0; list-style: none; }
3340
+ .diagnostics-event {
3341
+ display: grid;
3342
+ gap: var(--sp-2);
3343
+ border: 1px solid var(--border);
3344
+ border-left-width: 3px;
3345
+ border-radius: var(--radius-md);
3346
+ padding: var(--sp-3);
3347
+ background: var(--surface-0);
3348
+ }
3349
+ .diagnostics-event--info { border-left-color: var(--accent); }
3350
+ .diagnostics-event--warning { border-left-color: var(--status-degraded); }
3351
+ .diagnostics-event--error { border-left-color: var(--status-attention); }
3352
+ .diagnostics-event-heading time,
3353
+ .diagnostics-event-context,
3354
+ .diagnostics-event-meta { color: var(--text-tertiary); font-size: var(--font-size-sm); }
3355
+ .diagnostics-event-context { justify-content: flex-start; flex-wrap: wrap; }
3356
+ .diagnostics-event-context span { text-transform: capitalize; }
3357
+ .diagnostics-event p { margin: 0; line-height: 1.5; }
3358
+ .diagnostics-severity { display: inline-flex; align-items: center; gap: 6px; font-weight: var(--font-weight-semibold); }
3359
+ .diagnostics-severity-icon {
3360
+ display: inline-grid;
3361
+ place-items: center;
3362
+ width: 20px;
3363
+ height: 20px;
3364
+ border: 1px solid currentColor;
3365
+ border-radius: 50%;
3366
+ font-weight: var(--font-weight-semibold);
3367
+ }
3368
+ .diagnostics-technical-detail pre,
3369
+ .diagnostics-recovery-command code { white-space: pre-wrap; overflow-wrap: anywhere; }
3370
+ .diagnostics-technical-detail pre { margin: var(--sp-2) 0 0; color: var(--text-secondary); }
3371
+ .diagnostics-recovery { color: var(--accent); font-weight: var(--font-weight-semibold); width: fit-content; }
3372
+ .diagnostics-recovery-command { display: grid; gap: 4px; color: var(--text-secondary); }
3373
+ .diagnostics-empty { display: grid; place-items: center; gap: var(--sp-3); min-height: 220px; text-align: center; color: var(--text-secondary); }
3374
+ .diagnostics-loading { display: grid; gap: var(--sp-2); }
3375
+ .diagnostics-loading-row { display: grid; gap: var(--sp-2); padding: var(--sp-3); border: 1px solid var(--border); border-radius: var(--radius-md); }
3376
+ .diagnostics-loading-row span { height: 10px; border-radius: var(--radius-pill); background: var(--surface-2); animation: pulse var(--duration-pulse) var(--ease-standard) infinite; }
3377
+ .diagnostics-loading-row span:nth-child(2) { width: 64%; }
3378
+ .diagnostics-loading-row span:nth-child(3) { width: 82%; }
3379
+ .diagnostics-load-older { display: block; margin: var(--sp-3) auto 0; }
3380
+ .diagnostics-limit-note { padding: var(--sp-3); text-align: center; }
3381
+ @keyframes diagnosticsOverlayIn { from { opacity: 0; } to { opacity: 1; } }
3382
+ @keyframes diagnosticsDrawerIn { from { transform: translateX(24px); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
3383
+
3384
+ @media (max-width: 699px) {
3385
+ .diagnostics-drawer { inset: 0; width: 100vw; padding: var(--sp-4); border-left: 0; }
3386
+ .diagnostics-controls { grid-template-columns: 1fr 1fr; }
3387
+ .diagnostics-controls > button { grid-column: 1 / -1; }
3388
+ .diagnostics-secondary-controls { align-items: flex-start; flex-direction: column; }
3389
+ }
3390
+
3244
3391
  .legacy-upgrade-modal .modal-card { width: min(620px, 100%); }
3245
3392
  .legacy-upgrade-summary {
3246
3393
  padding: var(--sp-3);
@@ -3476,6 +3623,7 @@
3476
3623
  color: var(--text-secondary);
3477
3624
  font-size: var(--font-size-sm);
3478
3625
  }
3626
+ .viewer-reconnect-actions { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
3479
3627
  .viewer-reconnect-spinner {
3480
3628
  width: 14px;
3481
3629
  height: 14px;
@@ -3954,6 +4102,24 @@
3954
4102
  /* ── Responsive ────────────────────────────────────────── */
3955
4103
 
3956
4104
  @media (max-width: 900px) {
4105
+ .header-row { flex-wrap: nowrap; }
4106
+ .header-right { flex: 1 1 auto; justify-content: flex-end; }
4107
+ /* Diagnostic metadata yields before project scope or controls clip. */
4108
+ .header-tertiary { display: none; }
4109
+ .header-right .project-filter {
4110
+ flex: 1 1 140px;
4111
+ min-width: 96px;
4112
+ max-width: 240px;
4113
+ }
4114
+ /* Keep navigation to one compact row while preserving every destination. */
4115
+ .tab-bar {
4116
+ overflow-x: auto;
4117
+ overscroll-behavior-inline: contain;
4118
+ -webkit-overflow-scrolling: touch;
4119
+ scrollbar-width: none;
4120
+ }
4121
+ .tab-bar::-webkit-scrollbar { display: none; }
4122
+ .tab-btn { flex-shrink: 0; }
3957
4123
  .tab-panel { padding: var(--sp-4); }
3958
4124
  .summary-row { grid-template-columns: 1fr; }
3959
4125
  .feed-card-header { flex-wrap: wrap; }
@@ -3971,23 +4137,15 @@
3971
4137
  }
3972
4138
 
3973
4139
  @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; }
4140
+ .header-title { font-size: var(--font-size-xl); }
3987
4141
  }
3988
4142
 
3989
4143
  @media (max-width: 520px) {
4144
+ body { --header-sticky-offset: 117px; }
3990
4145
  header { padding: var(--sp-3) var(--sp-4); }
4146
+ .header-row { flex-wrap: wrap; }
4147
+ .header-left, .header-right { flex-basis: 100%; }
4148
+ .refresh-status[data-refresh-state="idle"] { display: none; }
3991
4149
  .tab-bar { padding: 0 var(--sp-4); }
3992
4150
  .modal { padding: var(--sp-3); }
3993
4151
  .modal-card { padding: var(--sp-4); border-radius: var(--radius-lg); }
@@ -4051,7 +4209,7 @@
4051
4209
  <span class="header-title">codemem</span>
4052
4210
  <span class="health-dot status-healthy" id="healthDot" title="Healthy"></span>
4053
4211
  </div>
4054
- <span class="refresh-status" id="refreshStatus">refreshing…</span>
4212
+ <span class="refresh-status" id="refreshStatus" data-refresh-state="refreshing">refreshing…</span>
4055
4213
  <span class="sr-only" id="refreshAnnouncer" aria-live="polite"></span>
4056
4214
  </div>
4057
4215
  <div class="header-right">
@@ -4084,6 +4242,7 @@
4084
4242
  <div id="toastRoot"></div>
4085
4243
  <div id="recipientPolicyManagementMount"></div>
4086
4244
  <div id="legacyTeamSetupMount"></div>
4245
+ <div id="diagnosticsDrawerMount"></div>
4087
4246
  <div class="viewer-reconnect-overlay" id="viewerReconnectOverlay" hidden>
4088
4247
  <div class="viewer-reconnect-card" role="status" aria-live="assertive">
4089
4248
  <div class="viewer-reconnect-eyebrow">Viewer connection</div>
@@ -4095,8 +4254,9 @@
4095
4254
  <span class="viewer-reconnect-spinner" aria-hidden="true"></span>
4096
4255
  <span>The page will recover automatically when the server responds.</span>
4097
4256
  </div>
4098
- <div>
4099
- <button class="settings-button" id="viewerReconnectRetry">Retry now</button>
4257
+ <div class="viewer-reconnect-actions">
4258
+ <button class="settings-button" id="viewerReconnectRetry" type="button">Retry now</button>
4259
+ <button class="settings-button" id="viewerReconnectDiagnostics" type="button">View connection diagnostics</button>
4100
4260
  </div>
4101
4261
  </div>
4102
4262
  </div>
@@ -4357,6 +4517,7 @@
4357
4517
  <div class="card" style="animation-delay: 0s">
4358
4518
  <div class="section-header">
4359
4519
  <h2>System health</h2>
4520
+ <button class="settings-button" id="healthOpenDiagnostics" type="button">View diagnostics</button>
4360
4521
  </div>
4361
4522
  <div class="section-meta" id="healthMeta">Assessing health signals…</div>
4362
4523
  <div class="health-actions" id="healthActions"></div>
@@ -4367,6 +4528,7 @@
4367
4528
  <div class="card" style="animation-delay: 0.05s">
4368
4529
  <h2>Stats</h2>
4369
4530
  <div class="grid-2" id="statsGrid"></div>
4531
+ <div id="automaticRecallStats" style="margin-top: var(--sp-3)"></div>
4370
4532
  </div>
4371
4533
  <div class="card" style="animation-delay: 0.1s">
4372
4534
  <h2>Current session</h2>
@@ -4572,6 +4734,7 @@
4572
4734
  <h2>Sync diagnostics</h2>
4573
4735
  </div>
4574
4736
  <div class="section-actions">
4737
+ <button class="settings-button" id="syncOpenDiagnostics" type="button">Recent sync events</button>
4575
4738
  <label class="small sync-redact-control">
4576
4739
  <span id="syncRedactMount"></span>
4577
4740
  <span id="syncRedactLabel">Redact</span>
@@ -4617,6 +4780,6 @@
4617
4780
  </div>
4618
4781
  </div>
4619
4782
 
4620
- <script src="/assets/app.js?v=91e2d42849f4"></script>
4783
+ <script src="/assets/app.js?v=07cb8aa93d50"></script>
4621
4784
  </body>
4622
4785
  </html>