@codemem/server 0.25.2 → 0.26.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/dist/index.js +78 -7
- package/dist/index.js.map +1 -1
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/sync.d.ts.map +1 -1
- package/package.json +2 -2
- package/static/app.js +14164 -12459
- package/static/index.html +220 -11
package/static/index.html
CHANGED
|
@@ -738,6 +738,68 @@
|
|
|
738
738
|
flex-shrink: 0;
|
|
739
739
|
}
|
|
740
740
|
|
|
741
|
+
.feed-menu-panel {
|
|
742
|
+
min-width: 180px;
|
|
743
|
+
padding: 6px;
|
|
744
|
+
border-radius: var(--radius-lg);
|
|
745
|
+
border: 1px solid var(--border);
|
|
746
|
+
background: var(--surface-1);
|
|
747
|
+
box-shadow: var(--shadow-md);
|
|
748
|
+
z-index: 24;
|
|
749
|
+
}
|
|
750
|
+
.feed-menu-trigger {
|
|
751
|
+
display: inline-flex;
|
|
752
|
+
align-items: center;
|
|
753
|
+
justify-content: center;
|
|
754
|
+
width: 30px;
|
|
755
|
+
height: 30px;
|
|
756
|
+
border: 1px solid var(--border);
|
|
757
|
+
border-radius: var(--radius-pill);
|
|
758
|
+
background: transparent;
|
|
759
|
+
color: var(--text-tertiary);
|
|
760
|
+
font-family: var(--font-sans);
|
|
761
|
+
font-size: 18px;
|
|
762
|
+
line-height: 1;
|
|
763
|
+
cursor: pointer;
|
|
764
|
+
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
|
|
765
|
+
}
|
|
766
|
+
.feed-menu-trigger:hover,
|
|
767
|
+
.feed-menu-trigger[data-state="open"] {
|
|
768
|
+
background: var(--surface-2);
|
|
769
|
+
color: var(--text-primary);
|
|
770
|
+
border-color: var(--border-hover);
|
|
771
|
+
}
|
|
772
|
+
.feed-menu-trigger:focus-visible {
|
|
773
|
+
outline: 2px solid var(--accent);
|
|
774
|
+
outline-offset: 2px;
|
|
775
|
+
}
|
|
776
|
+
.feed-menu-item {
|
|
777
|
+
display: flex;
|
|
778
|
+
align-items: center;
|
|
779
|
+
width: 100%;
|
|
780
|
+
min-height: 36px;
|
|
781
|
+
padding: 8px 10px;
|
|
782
|
+
border-radius: var(--radius-md);
|
|
783
|
+
color: var(--text-primary);
|
|
784
|
+
font-size: 13px;
|
|
785
|
+
cursor: pointer;
|
|
786
|
+
user-select: none;
|
|
787
|
+
outline: none;
|
|
788
|
+
}
|
|
789
|
+
.feed-menu-item[data-highlighted] {
|
|
790
|
+
background: var(--surface-2);
|
|
791
|
+
}
|
|
792
|
+
.feed-menu-item[data-disabled] {
|
|
793
|
+
color: var(--text-tertiary);
|
|
794
|
+
cursor: default;
|
|
795
|
+
}
|
|
796
|
+
.feed-menu-item.danger {
|
|
797
|
+
color: var(--accent-warm);
|
|
798
|
+
}
|
|
799
|
+
.feed-menu-item.danger[data-highlighted] {
|
|
800
|
+
background: rgba(212, 100, 46, 0.1);
|
|
801
|
+
}
|
|
802
|
+
|
|
741
803
|
.feed-title {
|
|
742
804
|
font-weight: 600;
|
|
743
805
|
font-size: 15px;
|
|
@@ -1361,7 +1423,38 @@
|
|
|
1361
1423
|
}
|
|
1362
1424
|
.modal-header { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); }
|
|
1363
1425
|
.modal-header h2 { margin: 0; font-size: 18px; }
|
|
1364
|
-
.modal-close {
|
|
1426
|
+
.modal-close-button {
|
|
1427
|
+
border: 1px solid color-mix(in srgb, var(--border) 88%, transparent);
|
|
1428
|
+
background: color-mix(in srgb, var(--surface-0) 78%, transparent);
|
|
1429
|
+
color: var(--text-secondary);
|
|
1430
|
+
border-radius: var(--radius-pill);
|
|
1431
|
+
min-height: 30px;
|
|
1432
|
+
padding: 0 10px;
|
|
1433
|
+
display: inline-flex;
|
|
1434
|
+
align-items: center;
|
|
1435
|
+
gap: 7px;
|
|
1436
|
+
cursor: pointer;
|
|
1437
|
+
font-family: var(--font-sans);
|
|
1438
|
+
font-size: 12px;
|
|
1439
|
+
transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
|
|
1440
|
+
}
|
|
1441
|
+
.modal-close-button:hover {
|
|
1442
|
+
border-color: var(--border-hover);
|
|
1443
|
+
background: color-mix(in srgb, var(--surface-0) 92%, var(--control-hover-bg));
|
|
1444
|
+
color: var(--text-primary);
|
|
1445
|
+
}
|
|
1446
|
+
.modal-close-button:focus-visible {
|
|
1447
|
+
outline: 2px solid var(--accent);
|
|
1448
|
+
outline-offset: 2px;
|
|
1449
|
+
}
|
|
1450
|
+
.modal-close-button-icon {
|
|
1451
|
+
font-size: 11px;
|
|
1452
|
+
color: var(--text-tertiary);
|
|
1453
|
+
}
|
|
1454
|
+
.modal-close-button-label {
|
|
1455
|
+
font-weight: 600;
|
|
1456
|
+
letter-spacing: 0.01em;
|
|
1457
|
+
}
|
|
1365
1458
|
.modal-body { display: flex; flex-direction: column; gap: var(--sp-3); flex: 1; min-height: 0; overflow-y: auto; padding-right: 6px; }
|
|
1366
1459
|
.modal-footer { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); flex-shrink: 0; padding-top: var(--sp-2); border-top: 1px solid var(--border); }
|
|
1367
1460
|
@keyframes noticeSlideIn {
|
|
@@ -1466,13 +1559,15 @@
|
|
|
1466
1559
|
cursor: pointer;
|
|
1467
1560
|
}
|
|
1468
1561
|
.settings-tab:hover { border-color: var(--border-hover); }
|
|
1469
|
-
.settings-tab.active
|
|
1562
|
+
.settings-tab.active,
|
|
1563
|
+
.settings-tab[data-state="active"] {
|
|
1470
1564
|
border-color: var(--control-hover-border);
|
|
1471
1565
|
color: var(--accent);
|
|
1472
1566
|
background: var(--accent-subtle);
|
|
1473
1567
|
}
|
|
1474
|
-
.settings-panel { display:
|
|
1475
|
-
.settings-panel
|
|
1568
|
+
.settings-panel { display: flex; flex-direction: column; gap: var(--sp-3); }
|
|
1569
|
+
.settings-panel[data-state="inactive"] { display: none; }
|
|
1570
|
+
.settings-panel[hidden] { display: none; }
|
|
1476
1571
|
.observer-status-banner {
|
|
1477
1572
|
display: flex;
|
|
1478
1573
|
flex-direction: column;
|
|
@@ -1611,6 +1706,56 @@
|
|
|
1611
1706
|
|
|
1612
1707
|
.field { display: flex; flex-direction: column; gap: 6px; font-size: 13px; }
|
|
1613
1708
|
.field input:not([type="checkbox"]), .field select, .field textarea { padding: var(--sp-2) var(--sp-3); border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--input-bg); font-family: var(--font-sans); font-size: 13px; color: var(--text-primary); }
|
|
1709
|
+
.settings-select-trigger {
|
|
1710
|
+
display: inline-flex;
|
|
1711
|
+
align-items: center;
|
|
1712
|
+
justify-content: space-between;
|
|
1713
|
+
gap: 8px;
|
|
1714
|
+
width: 100%;
|
|
1715
|
+
padding: var(--sp-2) var(--sp-3);
|
|
1716
|
+
border-radius: var(--radius-sm);
|
|
1717
|
+
border: 1px solid var(--border);
|
|
1718
|
+
background: var(--input-bg);
|
|
1719
|
+
color: var(--text-primary);
|
|
1720
|
+
font-family: var(--font-sans);
|
|
1721
|
+
font-size: 13px;
|
|
1722
|
+
text-align: left;
|
|
1723
|
+
}
|
|
1724
|
+
.settings-select-trigger:hover { border-color: var(--border-hover); }
|
|
1725
|
+
.settings-select-trigger:focus {
|
|
1726
|
+
outline: none;
|
|
1727
|
+
border-color: var(--accent);
|
|
1728
|
+
box-shadow: 0 0 0 3px var(--focus-ring);
|
|
1729
|
+
}
|
|
1730
|
+
.settings-select-content {
|
|
1731
|
+
z-index: 30;
|
|
1732
|
+
min-width: var(--radix-select-trigger-width);
|
|
1733
|
+
overflow: hidden;
|
|
1734
|
+
border: 1px solid var(--border);
|
|
1735
|
+
border-radius: var(--radius-md);
|
|
1736
|
+
background: var(--surface-1);
|
|
1737
|
+
box-shadow: var(--shadow-lg);
|
|
1738
|
+
}
|
|
1739
|
+
.settings-select-viewport { padding: 6px; }
|
|
1740
|
+
.settings-select-item {
|
|
1741
|
+
min-height: 36px;
|
|
1742
|
+
display: flex;
|
|
1743
|
+
align-items: center;
|
|
1744
|
+
justify-content: space-between;
|
|
1745
|
+
gap: 12px;
|
|
1746
|
+
padding: 8px 12px;
|
|
1747
|
+
border-radius: var(--radius-sm);
|
|
1748
|
+
color: var(--text-primary);
|
|
1749
|
+
font-family: var(--font-sans);
|
|
1750
|
+
font-size: 13px;
|
|
1751
|
+
cursor: pointer;
|
|
1752
|
+
user-select: none;
|
|
1753
|
+
}
|
|
1754
|
+
.settings-select-item[data-highlighted] {
|
|
1755
|
+
outline: none;
|
|
1756
|
+
background: var(--accent-subtle);
|
|
1757
|
+
color: var(--accent);
|
|
1758
|
+
}
|
|
1614
1759
|
.field-checkbox { flex-direction: row; align-items: center; gap: 8px; }
|
|
1615
1760
|
.field-checkbox input[type="checkbox"] { width: 14px; height: 14px; margin: 0; }
|
|
1616
1761
|
.field-checkbox label { margin: 0; }
|
|
@@ -1688,6 +1833,67 @@
|
|
|
1688
1833
|
background: rgba(182, 75, 47, 0.18);
|
|
1689
1834
|
border-color: rgba(182, 75, 47, 0.38);
|
|
1690
1835
|
}
|
|
1836
|
+
.sync-dialog-choice-list {
|
|
1837
|
+
list-style: none;
|
|
1838
|
+
margin: 0;
|
|
1839
|
+
padding: 0;
|
|
1840
|
+
display: flex;
|
|
1841
|
+
flex-direction: column;
|
|
1842
|
+
gap: var(--sp-2);
|
|
1843
|
+
}
|
|
1844
|
+
.sync-dialog-radio-list {
|
|
1845
|
+
display: grid;
|
|
1846
|
+
gap: var(--sp-2);
|
|
1847
|
+
}
|
|
1848
|
+
.sync-dialog-radio-option {
|
|
1849
|
+
display: flex;
|
|
1850
|
+
align-items: center;
|
|
1851
|
+
gap: 10px;
|
|
1852
|
+
padding: 10px 12px;
|
|
1853
|
+
border: 1px solid var(--border);
|
|
1854
|
+
border-radius: var(--radius-md);
|
|
1855
|
+
background: color-mix(in srgb, var(--surface-1) 86%, var(--surface-0));
|
|
1856
|
+
cursor: pointer;
|
|
1857
|
+
transition: border-color 0.15s ease, background 0.15s ease;
|
|
1858
|
+
}
|
|
1859
|
+
.sync-dialog-radio-option:hover {
|
|
1860
|
+
border-color: var(--border-hover);
|
|
1861
|
+
background: color-mix(in srgb, var(--surface-1) 94%, var(--surface-0));
|
|
1862
|
+
}
|
|
1863
|
+
.sync-dialog-radio-option:has(button[data-state="checked"]) {
|
|
1864
|
+
border-color: color-mix(in srgb, var(--accent) 40%, var(--border));
|
|
1865
|
+
background: color-mix(in srgb, var(--accent-subtle) 68%, var(--surface-1));
|
|
1866
|
+
}
|
|
1867
|
+
.sync-dialog-radio-option button {
|
|
1868
|
+
width: 18px;
|
|
1869
|
+
height: 18px;
|
|
1870
|
+
border-radius: 999px;
|
|
1871
|
+
border: 1px solid color-mix(in srgb, var(--text-tertiary) 42%, var(--border));
|
|
1872
|
+
background: var(--surface-0);
|
|
1873
|
+
display: inline-flex;
|
|
1874
|
+
align-items: center;
|
|
1875
|
+
justify-content: center;
|
|
1876
|
+
padding: 0;
|
|
1877
|
+
flex: 0 0 auto;
|
|
1878
|
+
}
|
|
1879
|
+
.sync-dialog-radio-option button:focus-visible {
|
|
1880
|
+
outline: 2px solid var(--accent);
|
|
1881
|
+
outline-offset: 2px;
|
|
1882
|
+
}
|
|
1883
|
+
.sync-dialog-radio-option button[data-state="checked"] {
|
|
1884
|
+
border-color: color-mix(in srgb, var(--accent) 48%, var(--border));
|
|
1885
|
+
background: color-mix(in srgb, var(--accent-subtle) 82%, var(--surface-0));
|
|
1886
|
+
}
|
|
1887
|
+
.sync-dialog-radio-indicator {
|
|
1888
|
+
width: 8px;
|
|
1889
|
+
height: 8px;
|
|
1890
|
+
border-radius: 999px;
|
|
1891
|
+
background: var(--accent);
|
|
1892
|
+
}
|
|
1893
|
+
.sync-dialog-radio-label {
|
|
1894
|
+
color: var(--text-primary);
|
|
1895
|
+
font-size: 13px;
|
|
1896
|
+
}
|
|
1691
1897
|
.settings-save:disabled { opacity: 0.6; cursor: not-allowed; }
|
|
1692
1898
|
.settings-note { color: var(--text-tertiary); font-size: 12px; }
|
|
1693
1899
|
|
|
@@ -1806,14 +2012,17 @@
|
|
|
1806
2012
|
<div class="modal-card">
|
|
1807
2013
|
<div class="modal-header">
|
|
1808
2014
|
<h2 id="settingsTitle">Memory & model settings</h2>
|
|
1809
|
-
<button class="modal-close" id="settingsClose" aria-label="Close settings">
|
|
2015
|
+
<button class="modal-close-button" id="settingsClose" aria-label="Close settings">
|
|
2016
|
+
<span class="modal-close-button-icon" aria-hidden="true">✕</span>
|
|
2017
|
+
<span class="modal-close-button-label">Close</span>
|
|
2018
|
+
</button>
|
|
1810
2019
|
</div>
|
|
1811
2020
|
<div class="modal-body">
|
|
1812
2021
|
<div class="small" id="settingsDescription">Configure connection, authentication, processing, and sync behavior.</div>
|
|
1813
2022
|
<div class="settings-tabs" role="tablist" aria-label="Settings sections">
|
|
1814
|
-
<button class="settings-tab
|
|
1815
|
-
<button class="settings-tab" id="settingsTabQueue" data-settings-tab="queue" role="tab" aria-selected="false">Processing</button>
|
|
1816
|
-
<button class="settings-tab" id="settingsTabSync" data-settings-tab="sync" role="tab" aria-selected="false">Device Sync</button>
|
|
2023
|
+
<button class="settings-tab" id="settingsTabObserver" data-settings-tab="observer" role="tab" aria-selected="true" data-state="active">Connection</button>
|
|
2024
|
+
<button class="settings-tab" id="settingsTabQueue" data-settings-tab="queue" role="tab" aria-selected="false" data-state="inactive">Processing</button>
|
|
2025
|
+
<button class="settings-tab" id="settingsTabSync" data-settings-tab="sync" role="tab" aria-selected="false" data-state="inactive">Device Sync</button>
|
|
1817
2026
|
</div>
|
|
1818
2027
|
<div class="settings-advanced-toolbar field-checkbox">
|
|
1819
2028
|
<input class="cm-checkbox" id="settingsAdvancedToggle" type="checkbox" />
|
|
@@ -1821,7 +2030,7 @@
|
|
|
1821
2030
|
<button class="help-icon" type="button" data-tooltip="Advanced controls include JSON fields, tuning values, and network overrides." aria-label="About advanced controls">?</button>
|
|
1822
2031
|
</div>
|
|
1823
2032
|
|
|
1824
|
-
<div class="settings-panel
|
|
2033
|
+
<div class="settings-panel" id="settingsPanelObserver" data-settings-panel="observer" data-state="active">
|
|
1825
2034
|
<div id="observerStatusBanner" class="observer-status-banner" hidden></div>
|
|
1826
2035
|
<div class="settings-group">
|
|
1827
2036
|
<h3 class="settings-group-title">Connection</h3>
|
|
@@ -1916,7 +2125,7 @@
|
|
|
1916
2125
|
</div>
|
|
1917
2126
|
</div>
|
|
1918
2127
|
|
|
1919
|
-
<div class="settings-panel" id="settingsPanelQueue" data-settings-panel="queue">
|
|
2128
|
+
<div class="settings-panel" id="settingsPanelQueue" data-settings-panel="queue" data-state="inactive" hidden>
|
|
1920
2129
|
<div class="settings-group">
|
|
1921
2130
|
<h3 class="settings-group-title">Processing</h3>
|
|
1922
2131
|
<div class="field">
|
|
@@ -1943,7 +2152,7 @@
|
|
|
1943
2152
|
</div>
|
|
1944
2153
|
</div>
|
|
1945
2154
|
|
|
1946
|
-
<div class="settings-panel" id="settingsPanelSync" data-settings-panel="sync">
|
|
2155
|
+
<div class="settings-panel" id="settingsPanelSync" data-settings-panel="sync" data-state="inactive" hidden>
|
|
1947
2156
|
<div class="settings-group">
|
|
1948
2157
|
<h3 class="settings-group-title">Device Sync</h3>
|
|
1949
2158
|
<div class="field field-checkbox"><input class="cm-checkbox" id="syncEnabled" type="checkbox" /><label for="syncEnabled">Enable sync</label></div>
|