@codemem/server 0.22.0-alpha.5 → 0.22.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/index.html CHANGED
@@ -346,6 +346,13 @@
346
346
  max-width: 300px;
347
347
  }
348
348
 
349
+ .runtime-label {
350
+ font-size: 11px;
351
+ color: var(--text-tertiary);
352
+ opacity: 0.8;
353
+ white-space: nowrap;
354
+ }
355
+
349
356
  /* ── Tab bar ───────────────────────────────────────────── */
350
357
 
351
358
  .tab-bar {
@@ -531,6 +538,58 @@
531
538
  outline-offset: 2px;
532
539
  }
533
540
 
541
+ .sync-redact-control {
542
+ display: inline-flex;
543
+ align-items: center;
544
+ gap: 6px;
545
+ }
546
+
547
+ .sync-redact-switch {
548
+ width: 34px;
549
+ height: 20px;
550
+ border: 1px solid color-mix(in srgb, var(--text-tertiary) 42%, var(--control-border));
551
+ border-radius: var(--radius-pill);
552
+ background: color-mix(in srgb, var(--surface-1) 82%, var(--surface-0));
553
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--text-tertiary) 8%, transparent);
554
+ cursor: pointer;
555
+ flex-shrink: 0;
556
+ padding: 1px;
557
+ transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
558
+ }
559
+
560
+ .sync-redact-switch:hover {
561
+ border-color: color-mix(in srgb, var(--accent) 38%, var(--control-hover-border));
562
+ }
563
+
564
+ .sync-redact-switch:focus-visible {
565
+ outline: 2px solid var(--accent);
566
+ outline-offset: 2px;
567
+ }
568
+
569
+ .sync-redact-switch[data-state="checked"] {
570
+ background: color-mix(in srgb, var(--accent) 18%, var(--surface-1));
571
+ border-color: color-mix(in srgb, var(--accent) 54%, var(--control-hover-border));
572
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 30%, transparent);
573
+ }
574
+
575
+ .sync-redact-switch-thumb {
576
+ display: block;
577
+ width: 16px;
578
+ height: 16px;
579
+ border-radius: 50%;
580
+ background: color-mix(in srgb, var(--surface-0) 88%, white);
581
+ border: 1px solid color-mix(in srgb, var(--text-tertiary) 24%, transparent);
582
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
583
+ transition: transform 0.15s ease, background 0.15s ease;
584
+ transform: translateX(0);
585
+ }
586
+
587
+ .sync-redact-switch[data-state="checked"] .sync-redact-switch-thumb {
588
+ transform: translateX(14px);
589
+ background: color-mix(in srgb, var(--accent) 88%, white);
590
+ border-color: color-mix(in srgb, var(--accent) 42%, transparent);
591
+ }
592
+
534
593
  /* ── Selects / inputs ──────────────────────────────────── */
535
594
 
536
595
  .project-filter,
@@ -883,6 +942,7 @@
883
942
  border-radius: var(--radius-sm);
884
943
  background: var(--surface-2);
885
944
  }
945
+ .sync-action + .sync-action { margin-top: var(--sp-2); }
886
946
 
887
947
  .health-action-text, .sync-action-text { font-size: 13px; color: var(--text-primary); flex: 1; min-width: 0; }
888
948
  .health-action-command, .sync-action-command { display: block; margin-top: 2px; font-family: var(--font-mono); font-size: 12px; color: var(--text-tertiary); }
@@ -1051,11 +1111,81 @@
1051
1111
  color: var(--text-secondary);
1052
1112
  font-feature-settings: 'tnum' 1;
1053
1113
  }
1054
- .sync-legacy-claim-row { margin-top: 12px; gap: 12px; align-items: center; flex-wrap: wrap; }
1055
- .sync-legacy-select {
1114
+ .sync-radix-select-host {
1115
+ min-width: 0;
1116
+ max-width: 100%;
1117
+ }
1118
+ .sync-actor-select-host {
1119
+ min-width: 220px;
1120
+ max-width: 100%;
1121
+ flex: 1 1 220px;
1122
+ }
1123
+ .sync-legacy-select-host {
1056
1124
  min-width: 320px;
1057
1125
  max-width: 100%;
1058
1126
  flex: 1 1 320px;
1127
+ }
1128
+ .sync-radix-select-trigger {
1129
+ display: inline-flex;
1130
+ align-items: center;
1131
+ justify-content: space-between;
1132
+ gap: 8px;
1133
+ width: 100%;
1134
+ text-align: left;
1135
+ }
1136
+ .sync-radix-select-trigger > span:first-child {
1137
+ min-width: 0;
1138
+ overflow: hidden;
1139
+ text-overflow: ellipsis;
1140
+ white-space: nowrap;
1141
+ }
1142
+ .sync-radix-select-icon {
1143
+ color: var(--text-tertiary);
1144
+ flex: 0 0 auto;
1145
+ }
1146
+ .sync-radix-select-content {
1147
+ z-index: 30;
1148
+ min-width: var(--radix-select-trigger-width);
1149
+ max-width: min(420px, calc(100vw - 24px));
1150
+ overflow: hidden;
1151
+ border: 1px solid var(--border);
1152
+ border-radius: var(--radius-md);
1153
+ background: var(--surface-1);
1154
+ box-shadow: var(--shadow-lg);
1155
+ }
1156
+ .sync-radix-select-viewport {
1157
+ padding: 6px;
1158
+ }
1159
+ .sync-radix-select-item {
1160
+ position: relative;
1161
+ display: flex;
1162
+ align-items: center;
1163
+ justify-content: space-between;
1164
+ gap: 12px;
1165
+ min-height: 36px;
1166
+ padding: 8px 12px;
1167
+ border-radius: var(--radius-sm);
1168
+ color: var(--text-primary);
1169
+ font-family: var(--font-sans);
1170
+ font-size: 13px;
1171
+ cursor: pointer;
1172
+ user-select: none;
1173
+ }
1174
+ .sync-radix-select-item[data-highlighted] {
1175
+ outline: none;
1176
+ background: var(--accent-subtle);
1177
+ color: var(--accent);
1178
+ }
1179
+ .sync-radix-select-item[data-disabled] {
1180
+ opacity: 0.45;
1181
+ cursor: default;
1182
+ }
1183
+ .sync-radix-select-indicator {
1184
+ color: var(--accent);
1185
+ flex: 0 0 auto;
1186
+ }
1187
+ .sync-legacy-claim-row { margin-top: 12px; gap: 12px; align-items: center; flex-wrap: wrap; }
1188
+ .sync-legacy-select {
1059
1189
  padding: 8px 12px;
1060
1190
  border-radius: var(--radius-md);
1061
1191
  border: 1px solid var(--border);
@@ -1098,9 +1228,6 @@
1098
1228
  transform: none;
1099
1229
  }
1100
1230
  .sync-actor-select {
1101
- min-width: 220px;
1102
- max-width: 100%;
1103
- flex: 1 1 220px;
1104
1231
  padding: 8px 12px;
1105
1232
  border-radius: var(--radius-md);
1106
1233
  border: 1px solid var(--border);
@@ -1397,6 +1524,38 @@
1397
1524
  transition: background 0.15s ease;
1398
1525
  }
1399
1526
  .settings-save:hover { background: var(--control-hover-bg); }
1527
+ .sync-dialog-card {
1528
+ width: min(560px, 100%);
1529
+ }
1530
+ .sync-dialog-actions {
1531
+ display: flex;
1532
+ gap: var(--sp-2);
1533
+ align-items: center;
1534
+ }
1535
+ .sync-dialog-input {
1536
+ width: 100%;
1537
+ padding: var(--sp-2) var(--sp-3);
1538
+ border-radius: var(--radius-sm);
1539
+ border: 1px solid var(--border);
1540
+ background: var(--input-bg);
1541
+ color: var(--text-primary);
1542
+ font-family: var(--font-sans);
1543
+ font-size: 13px;
1544
+ }
1545
+ .sync-dialog-input:focus {
1546
+ outline: none;
1547
+ border-color: var(--accent);
1548
+ box-shadow: 0 0 0 3px var(--focus-ring);
1549
+ }
1550
+ .sync-dialog-confirm.danger {
1551
+ background: rgba(182, 75, 47, 0.12);
1552
+ border-color: rgba(182, 75, 47, 0.28);
1553
+ color: var(--accent-warm);
1554
+ }
1555
+ .sync-dialog-confirm.danger:hover {
1556
+ background: rgba(182, 75, 47, 0.18);
1557
+ border-color: rgba(182, 75, 47, 0.38);
1558
+ }
1400
1559
  .settings-save:disabled { opacity: 0.6; cursor: not-allowed; }
1401
1560
  .settings-note { color: var(--text-tertiary); font-size: 12px; }
1402
1561
 
@@ -1473,6 +1632,7 @@
1473
1632
  <span class="sr-only" id="refreshAnnouncer" aria-live="polite"></span>
1474
1633
  </div>
1475
1634
  <div class="header-right">
1635
+ <span class="runtime-label" id="runtimeLabel" hidden></span>
1476
1636
  <span class="meta-line" id="metaLine"></span>
1477
1637
  <select class="project-filter" id="projectFilter" aria-label="Project filter">
1478
1638
  <option value="">All Projects</option>
@@ -1493,8 +1653,8 @@
1493
1653
  <div class="app-notice" id="globalNotice" hidden aria-live="polite"></div>
1494
1654
 
1495
1655
  <!-- ── Settings modal ──────────────────────────────────── -->
1496
- <div class="modal-backdrop" id="settingsBackdrop" hidden></div>
1497
- <div class="modal" id="settingsModal" hidden role="dialog" aria-modal="true" aria-labelledby="settingsTitle" aria-describedby="settingsDescription" tabindex="-1">
1656
+ <div id="settingsDialogMount"></div>
1657
+ <template id="settingsDialogTemplate">
1498
1658
  <div class="modal-card">
1499
1659
  <div class="modal-header">
1500
1660
  <h2 id="settingsTitle">Memory & model settings</h2>
@@ -1673,7 +1833,7 @@
1673
1833
  <button class="settings-save" id="settingsSave">Save</button>
1674
1834
  </div>
1675
1835
  </div>
1676
- </div>
1836
+ </template>
1677
1837
 
1678
1838
  <!-- ── Tab: Feed ───────────────────────────────────────── -->
1679
1839
  <div class="tab-panel" id="tab-feed">
@@ -1748,28 +1908,7 @@
1748
1908
  </div>
1749
1909
  </div>
1750
1910
  <div id="syncAdminSection">
1751
- <button class="sync-toggle-admin" id="syncToggleAdmin" aria-expanded="false" aria-controls="syncInvitePanel">Set up a new team instead…</button>
1752
- <div id="syncInvitePanel" hidden>
1753
- <h3 class="settings-group-title" style="margin-top:12px">Create a team</h3>
1754
- <div class="section-meta">Generate an invite to share with teammates.</div>
1755
- <div class="actor-create-row">
1756
- <label for="syncInviteGroup" class="sr-only">Team name</label>
1757
- <input class="peer-scope-input" id="syncInviteGroup" placeholder="Team name (e.g. my-team)" />
1758
- <label for="syncInvitePolicy" class="sr-only">Join policy</label>
1759
- <select class="sync-actor-select" id="syncInvitePolicy">
1760
- <option value="auto_admit">Auto-admit</option>
1761
- <option value="approval_required">Approval required</option>
1762
- </select>
1763
- <div class="sync-ttl-group">
1764
- <label for="syncInviteTtl">Expires in</label>
1765
- <input class="peer-scope-input" id="syncInviteTtl" type="number" min="1" value="24" style="width:64px" />
1766
- <label>hours</label>
1767
- </div>
1768
- <button class="settings-button" id="syncCreateInviteButton">Create invite</button>
1769
- </div>
1770
- <label for="syncInviteOutput" class="sr-only">Generated invite</label>
1771
- <textarea class="feed-search" id="syncInviteOutput" placeholder="Invite will appear here" readonly hidden></textarea>
1772
- </div>
1911
+ <div id="syncAdminDisclosureMount" style="display: contents"></div>
1773
1912
  </div>
1774
1913
  </div>
1775
1914
  <h3 class="settings-group-title" style="margin-top: 20px">Team status</h3>
@@ -1818,7 +1957,7 @@
1818
1957
  <div class="peer-meta" id="syncLegacyClaimsMeta"></div>
1819
1958
  <div class="peer-actions sync-legacy-claim-row">
1820
1959
  <label for="syncLegacyDeviceSelect" class="sr-only">Legacy device</label>
1821
- <select class="sync-legacy-select" id="syncLegacyDeviceSelect"></select>
1960
+ <div class="sync-radix-select-host sync-legacy-select-host" id="syncLegacyDeviceSelectMount"></div>
1822
1961
  <button class="sync-legacy-button" id="syncLegacyClaimButton">Attach device history</button>
1823
1962
  </div>
1824
1963
  </div>
@@ -1829,10 +1968,10 @@
1829
1968
  <div class="section-header">
1830
1969
  <h2>Advanced diagnostics</h2>
1831
1970
  <div class="section-actions">
1832
- <button class="settings-button" id="syncPairingToggle">Show pairing</button>
1833
- <label class="small" style="display:inline-flex;align-items:center;gap:6px;">
1834
- <input id="syncRedact" type="checkbox" checked />
1835
- Redact
1971
+ <div id="syncPairingDisclosureMount" style="display: contents"></div>
1972
+ <label class="small sync-redact-control">
1973
+ <span id="syncRedactMount"></span>
1974
+ <span id="syncRedactLabel">Redact</span>
1836
1975
  </label>
1837
1976
  </div>
1838
1977
  </div>
@@ -1845,16 +1984,7 @@
1845
1984
  <div class="sync-actions" id="syncActions"></div>
1846
1985
  <div class="grid-2" id="syncStatusGrid"></div>
1847
1986
 
1848
- <div class="pairing-card" id="syncPairing" hidden>
1849
- <div class="peer-title">
1850
- <strong>Pairing command</strong>
1851
- <div class="peer-actions"><button id="pairingCopy">Copy command</button></div>
1852
- </div>
1853
- <div class="pairing-body">
1854
- <pre id="pairingPayload" style="user-select:all">Loading…</pre>
1855
- </div>
1856
- <div class="peer-meta" id="pairingHint">Copy and run on the other device. Use --include/--exclude to control which projects sync.</div>
1857
- </div>
1987
+ <div id="syncPairingPanelMount" style="display: contents"></div>
1858
1988
 
1859
1989
  <h3 class="settings-group-title" style="margin-top: 20px">Recent sync attempts</h3>
1860
1990
  <div class="attempts-list" id="syncAttempts"></div>