more-compute 0.4.4__py3-none-any.whl → 0.5.0__py3-none-any.whl

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 (57) hide show
  1. frontend/app/globals.css +734 -27
  2. frontend/app/layout.tsx +13 -3
  3. frontend/components/Notebook.tsx +2 -14
  4. frontend/components/cell/MonacoCell.tsx +99 -5
  5. frontend/components/layout/Sidebar.tsx +39 -4
  6. frontend/components/panels/ClaudePanel.tsx +461 -0
  7. frontend/components/popups/ComputePopup.tsx +738 -447
  8. frontend/components/popups/FilterPopup.tsx +305 -189
  9. frontend/components/popups/MetricsPopup.tsx +20 -1
  10. frontend/components/popups/ProviderConfigModal.tsx +322 -0
  11. frontend/components/popups/ProviderDropdown.tsx +398 -0
  12. frontend/components/popups/SettingsPopup.tsx +1 -1
  13. frontend/contexts/ClaudeContext.tsx +392 -0
  14. frontend/contexts/PodWebSocketContext.tsx +16 -21
  15. frontend/hooks/useInlineDiff.ts +269 -0
  16. frontend/lib/api.ts +323 -12
  17. frontend/lib/settings.ts +5 -0
  18. frontend/lib/websocket-native.ts +4 -8
  19. frontend/lib/websocket.ts +1 -2
  20. frontend/package-lock.json +733 -36
  21. frontend/package.json +2 -0
  22. frontend/public/assets/icons/providers/lambda_labs.svg +22 -0
  23. frontend/public/assets/icons/providers/prime_intellect.svg +18 -0
  24. frontend/public/assets/icons/providers/runpod.svg +9 -0
  25. frontend/public/assets/icons/providers/vastai.svg +1 -0
  26. frontend/settings.md +54 -0
  27. frontend/tsconfig.tsbuildinfo +1 -0
  28. frontend/types/claude.ts +194 -0
  29. kernel_run.py +13 -0
  30. {more_compute-0.4.4.dist-info → more_compute-0.5.0.dist-info}/METADATA +53 -11
  31. {more_compute-0.4.4.dist-info → more_compute-0.5.0.dist-info}/RECORD +56 -37
  32. {more_compute-0.4.4.dist-info → more_compute-0.5.0.dist-info}/WHEEL +1 -1
  33. morecompute/__init__.py +1 -1
  34. morecompute/__version__.py +1 -1
  35. morecompute/execution/executor.py +24 -67
  36. morecompute/execution/worker.py +6 -72
  37. morecompute/models/api_models.py +62 -0
  38. morecompute/notebook.py +11 -0
  39. morecompute/server.py +641 -133
  40. morecompute/services/claude_service.py +392 -0
  41. morecompute/services/pod_manager.py +168 -67
  42. morecompute/services/pod_monitor.py +67 -39
  43. morecompute/services/prime_intellect.py +0 -4
  44. morecompute/services/providers/__init__.py +92 -0
  45. morecompute/services/providers/base_provider.py +336 -0
  46. morecompute/services/providers/lambda_labs_provider.py +394 -0
  47. morecompute/services/providers/provider_factory.py +194 -0
  48. morecompute/services/providers/runpod_provider.py +504 -0
  49. morecompute/services/providers/vastai_provider.py +407 -0
  50. morecompute/utils/cell_magics.py +0 -3
  51. morecompute/utils/config_util.py +93 -3
  52. morecompute/utils/special_commands.py +5 -32
  53. morecompute/utils/version_check.py +117 -0
  54. frontend/styling_README.md +0 -23
  55. {more_compute-0.4.4.dist-info/licenses → more_compute-0.5.0.dist-info}/LICENSE +0 -0
  56. {more_compute-0.4.4.dist-info → more_compute-0.5.0.dist-info}/entry_points.txt +0 -0
  57. {more_compute-0.4.4.dist-info → more_compute-0.5.0.dist-info}/top_level.txt +0 -0
frontend/app/globals.css CHANGED
@@ -454,7 +454,7 @@ body {
454
454
  .cell-status-indicator .status-timer {
455
455
  margin-left: 0;
456
456
  font-size: 9px;
457
- color: #6b7280;
457
+ color: var(--text-secondary);
458
458
  min-width: auto;
459
459
  text-align: center;
460
460
  line-height: 1;
@@ -855,8 +855,8 @@ body {
855
855
  right: auto;
856
856
  opacity: 1;
857
857
  padding: 8px 12px;
858
- background: #f9fafb;
859
- border-bottom: 1px solid #e5e7eb;
858
+ background: var(--mc-cell-background);
859
+ border-bottom: 1px solid var(--mc-border);
860
860
  justify-content: flex-end;
861
861
  }
862
862
  }
@@ -864,6 +864,7 @@ body {
864
864
  /* Sidebar Styles */
865
865
  .sidebar {
866
866
  width: 60px;
867
+ height: 100vh;
867
868
  background: var(--mc-sidebar-background);
868
869
  border-right: 1px solid var(--mc-border);
869
870
  display: flex;
@@ -1089,13 +1090,13 @@ body {
1089
1090
  padding: 8px 0;
1090
1091
  margin-bottom: 12px;
1091
1092
  font-size: 12px;
1092
- color: #6b7280;
1093
- border-bottom: 1px solid #e5e7eb;
1093
+ color: var(--text-secondary);
1094
+ border-bottom: 1px solid var(--mc-border);
1094
1095
  }
1095
1096
 
1096
1097
  .file-path-label {
1097
1098
  font-weight: 600;
1098
- color: #4b5563;
1099
+ color: var(--mc-sidebar-foreground);
1099
1100
  }
1100
1101
 
1101
1102
  .popup-body {
@@ -1138,7 +1139,7 @@ body {
1138
1139
  width: 18px;
1139
1140
  height: 18px;
1140
1141
  margin-right: 10px;
1141
- color: #4b5563;
1142
+ color: var(--mc-sidebar-foreground);
1142
1143
  }
1143
1144
 
1144
1145
  .file-meta {
@@ -1153,22 +1154,22 @@ body {
1153
1154
 
1154
1155
  .file-details {
1155
1156
  font-size: 11px;
1156
- color: #6b7280;
1157
+ color: var(--text-secondary);
1157
1158
  }
1158
1159
 
1159
1160
  .file-preview {
1160
1161
  display: flex;
1161
1162
  flex-direction: column;
1162
1163
  flex: 1;
1163
- border: 1px solid #e5e7eb;
1164
+ border: 1px solid var(--mc-border);
1164
1165
  border-radius: 8px;
1165
1166
  overflow: hidden;
1166
1167
  }
1167
1168
 
1168
1169
  .file-preview-header {
1169
1170
  padding: 12px 16px;
1170
- background: #f9fafb;
1171
- border-bottom: 1px solid #e5e7eb;
1171
+ background: var(--mc-cell-background);
1172
+ border-bottom: 1px solid var(--mc-border);
1172
1173
  }
1173
1174
 
1174
1175
  .file-preview-body {
@@ -1182,7 +1183,7 @@ body {
1182
1183
  }
1183
1184
 
1184
1185
  .file-preview-loading {
1185
- color: #94a3b8;
1186
+ color: var(--text-secondary);
1186
1187
  font-size: 13px;
1187
1188
  }
1188
1189
 
@@ -1195,7 +1196,7 @@ body {
1195
1196
  }
1196
1197
 
1197
1198
  .file-tree.empty {
1198
- color: #6b7280;
1199
+ color: var(--text-secondary);
1199
1200
  font-style: italic;
1200
1201
  padding: 8px;
1201
1202
  }
@@ -1235,12 +1236,12 @@ body {
1235
1236
 
1236
1237
  .env-name {
1237
1238
  font-weight: 500;
1238
- color: #1f2937;
1239
+ color: var(--mc-text-color);
1239
1240
  }
1240
1241
 
1241
1242
  .env-path {
1242
1243
  font-size: 12px;
1243
- color: #6b7280;
1244
+ color: var(--text-secondary);
1244
1245
  margin-top: 2px;
1245
1246
  }
1246
1247
 
@@ -1304,6 +1305,39 @@ body {
1304
1305
  font-size: 14px;
1305
1306
  }
1306
1307
 
1308
+ .metrics-provider-badge {
1309
+ display: flex;
1310
+ align-items: center;
1311
+ gap: 6px;
1312
+ padding: 6px 10px;
1313
+ margin-bottom: 10px;
1314
+ border-radius: 6px;
1315
+ font-size: 11px;
1316
+ font-weight: 500;
1317
+ }
1318
+
1319
+ .metrics-provider-badge.ssh-provider {
1320
+ background: rgba(16, 185, 129, 0.15);
1321
+ color: #10b981;
1322
+ }
1323
+
1324
+ .metrics-provider-badge.modal-provider {
1325
+ background: rgba(245, 158, 11, 0.15);
1326
+ color: #f59e0b;
1327
+ }
1328
+
1329
+ .metrics-provider-badge .provider-dot {
1330
+ width: 6px;
1331
+ height: 6px;
1332
+ border-radius: 50%;
1333
+ background-color: currentColor;
1334
+ }
1335
+
1336
+ .metrics-provider-badge .provider-note {
1337
+ opacity: 0.7;
1338
+ font-size: 10px;
1339
+ }
1340
+
1307
1341
  .metrics-grid {
1308
1342
  display: grid;
1309
1343
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -1357,19 +1391,19 @@ body {
1357
1391
  display: flex;
1358
1392
  align-items: center;
1359
1393
  justify-content: space-between;
1360
- color: #6b7280;
1394
+ color: var(--text-secondary);
1361
1395
  }
1362
1396
 
1363
1397
  .metrics-placeholder {
1364
1398
  text-align: center;
1365
1399
  padding: 40px 20px;
1366
- color: #6b7280;
1400
+ color: var(--text-secondary);
1367
1401
  }
1368
1402
 
1369
1403
  .metrics-placeholder h3 {
1370
1404
  font-size: 24px;
1371
1405
  margin-bottom: 16px;
1372
- color: #1f2937;
1406
+ color: var(--mc-text-color);
1373
1407
  }
1374
1408
 
1375
1409
  .metrics-placeholder p {
@@ -1378,8 +1412,8 @@ body {
1378
1412
  }
1379
1413
 
1380
1414
  .coming-soon {
1381
- background: #f9fafb;
1382
- border: 1px solid #e5e7eb;
1415
+ background: var(--mc-cell-background);
1416
+ border: 1px solid var(--mc-border);
1383
1417
  border-radius: 8px;
1384
1418
  padding: 24px;
1385
1419
  margin: 20px 0;
@@ -1397,7 +1431,7 @@ body {
1397
1431
  display: flex;
1398
1432
  align-items: center;
1399
1433
  font-size: 14px;
1400
- color: #374151;
1434
+ color: var(--mc-text-color);
1401
1435
  }
1402
1436
 
1403
1437
  .coming-soon li:last-child {
@@ -1447,7 +1481,7 @@ body {
1447
1481
  }
1448
1482
 
1449
1483
  .packages-search-icon {
1450
- color: #6b7280;
1484
+ color: var(--text-secondary);
1451
1485
  }
1452
1486
 
1453
1487
  .packages-subtext {
@@ -1455,7 +1489,7 @@ body {
1455
1489
  align-items: center;
1456
1490
  gap: 6px;
1457
1491
  font-size: 12px;
1458
- color: #6b7280;
1492
+ color: var(--text-secondary);
1459
1493
  }
1460
1494
 
1461
1495
  .packages-table {
@@ -1525,7 +1559,7 @@ body {
1525
1559
  }
1526
1560
 
1527
1561
  .package-version {
1528
- color: #374151;
1562
+ color: var(--mc-text-color);
1529
1563
  }
1530
1564
 
1531
1565
  .file-tree-container {
@@ -1607,7 +1641,7 @@ body {
1607
1641
 
1608
1642
  .monaco-editor .margin-view-overlays {
1609
1643
  background: var(--mc-cell-background) !important;
1610
- border-right: 1px solid #e5e7eb !important;
1644
+ border-right: 1px solid var(--mc-border) !important;
1611
1645
  }
1612
1646
 
1613
1647
  /* Remove all line highlights */
@@ -1656,7 +1690,7 @@ body {
1656
1690
 
1657
1691
  /* Monaco hover widget styling */
1658
1692
  .monaco-editor .monaco-hover {
1659
- border: 1px solid #e5e7eb !important;
1693
+ border: 1px solid var(--mc-border) !important;
1660
1694
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
1661
1695
  border-radius: 6px !important;
1662
1696
  background: white !important;
@@ -1665,7 +1699,7 @@ body {
1665
1699
 
1666
1700
  /* Monaco parameter hints */
1667
1701
  .monaco-editor .parameter-hints-widget {
1668
- border: 1px solid #e5e7eb !important;
1702
+ border: 1px solid var(--mc-border) !important;
1669
1703
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
1670
1704
  border-radius: 6px !important;
1671
1705
  z-index: 100000 !important;
@@ -1689,3 +1723,676 @@ body {
1689
1723
  padding: 0 !important;
1690
1724
  overflow: visible;
1691
1725
  }
1726
+
1727
+ /* ============================================================================
1728
+ Claude AI Panel Styles
1729
+ ============================================================================ */
1730
+
1731
+ /* Sidebar spacer to push Claude icon to bottom */
1732
+ /* Claude sidebar item - follows standard theming */
1733
+ .sidebar-item.claude-item.active .sidebar-icon-wrapper {
1734
+ color: var(--mc-primary);
1735
+ }
1736
+
1737
+ /* Claude Panel - Right Side */
1738
+ .claude-panel {
1739
+ position: fixed;
1740
+ right: 0;
1741
+ top: 0;
1742
+ width: 400px;
1743
+ height: 100vh;
1744
+ background: var(--mc-background);
1745
+ border-left: 1px solid var(--mc-border);
1746
+ box-shadow: -2px 0 10px rgba(0, 0, 0, 0.1);
1747
+ z-index: 45;
1748
+ display: flex;
1749
+ flex-direction: column;
1750
+ }
1751
+
1752
+ .claude-panel-header {
1753
+ display: flex;
1754
+ align-items: center;
1755
+ justify-content: space-between;
1756
+ padding: 16px 20px;
1757
+ border-bottom: 1px solid var(--mc-border);
1758
+ background: var(--mc-cell-background);
1759
+ }
1760
+
1761
+ .claude-panel-title {
1762
+ display: flex;
1763
+ align-items: center;
1764
+ gap: 8px;
1765
+ font-weight: 600;
1766
+ font-size: 14px;
1767
+ color: var(--mc-text-color);
1768
+ }
1769
+
1770
+ .claude-panel-title svg {
1771
+ color: var(--mc-primary);
1772
+ }
1773
+
1774
+ /* Model selector segmented control */
1775
+ .claude-model-selector {
1776
+ display: flex;
1777
+ background: var(--mc-secondary);
1778
+ border-radius: 6px;
1779
+ padding: 2px;
1780
+ gap: 2px;
1781
+ }
1782
+
1783
+ .claude-model-option {
1784
+ padding: 4px 8px;
1785
+ font-size: 11px;
1786
+ font-weight: 500;
1787
+ background: transparent;
1788
+ color: var(--mc-text-color);
1789
+ border: none;
1790
+ border-radius: 4px;
1791
+ cursor: pointer;
1792
+ transition: all 0.15s ease;
1793
+ opacity: 0.7;
1794
+ }
1795
+
1796
+ .claude-model-option:hover {
1797
+ opacity: 1;
1798
+ background: var(--mc-secondary-hover);
1799
+ }
1800
+
1801
+ .claude-model-option.active {
1802
+ background: var(--mc-cell-background);
1803
+ color: var(--mc-text-color);
1804
+ opacity: 1;
1805
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
1806
+ }
1807
+
1808
+ /* Model row at bottom */
1809
+ .claude-model-row {
1810
+ display: flex;
1811
+ align-items: center;
1812
+ gap: 8px;
1813
+ padding: 8px 12px;
1814
+ border-top: 1px solid var(--mc-border);
1815
+ }
1816
+
1817
+ .claude-model-label {
1818
+ font-size: 11px;
1819
+ color: var(--mc-text-color);
1820
+ opacity: 0.6;
1821
+ }
1822
+
1823
+ .claude-panel-actions {
1824
+ display: flex;
1825
+ gap: 4px;
1826
+ }
1827
+
1828
+ .claude-panel-btn {
1829
+ background: transparent;
1830
+ border: none;
1831
+ padding: 6px;
1832
+ border-radius: 6px;
1833
+ cursor: pointer;
1834
+ color: var(--mc-text-color);
1835
+ opacity: 0.6;
1836
+ transition: all 0.2s ease;
1837
+ }
1838
+
1839
+ .claude-panel-btn:hover {
1840
+ background: var(--mc-secondary);
1841
+ opacity: 1;
1842
+ }
1843
+
1844
+ /* API Key Configuration */
1845
+ .claude-config-banner {
1846
+ padding: 14px 16px;
1847
+ margin: 0 16px 12px;
1848
+ background: var(--mc-cell-background);
1849
+ border: 1px solid var(--mc-border);
1850
+ border-radius: 10px;
1851
+ display: flex;
1852
+ flex-direction: column;
1853
+ gap: 10px;
1854
+ font-size: 12px;
1855
+ color: var(--mc-text-color);
1856
+ }
1857
+
1858
+ .claude-config-title {
1859
+ display: flex;
1860
+ align-items: center;
1861
+ gap: 8px;
1862
+ font-weight: 600;
1863
+ }
1864
+
1865
+ .claude-config-form {
1866
+ display: flex;
1867
+ gap: 8px;
1868
+ }
1869
+
1870
+ .claude-config-input {
1871
+ flex: 1;
1872
+ padding: 8px 12px;
1873
+ border: 1px solid var(--mc-border);
1874
+ border-radius: 8px;
1875
+ font-size: 12px;
1876
+ background: var(--mc-input-background);
1877
+ color: var(--mc-text-color);
1878
+ }
1879
+
1880
+ .claude-config-btn {
1881
+ padding: 8px 16px;
1882
+ background: var(--mc-primary);
1883
+ color: var(--mc-button-foreground);
1884
+ border: none;
1885
+ border-radius: 8px;
1886
+ font-weight: 600;
1887
+ cursor: pointer;
1888
+ transition: background 0.2s ease;
1889
+ }
1890
+
1891
+ .claude-config-btn:hover:not(:disabled) {
1892
+ background: var(--mc-primary-hover);
1893
+ }
1894
+
1895
+ .claude-config-btn:disabled {
1896
+ opacity: 0.6;
1897
+ cursor: not-allowed;
1898
+ }
1899
+
1900
+ /* Error Banner */
1901
+ .claude-error-banner {
1902
+ padding: 12px 20px;
1903
+ background: #fef2f2;
1904
+ border-bottom: 1px solid #fecaca;
1905
+ display: flex;
1906
+ align-items: center;
1907
+ gap: 8px;
1908
+ font-size: 13px;
1909
+ color: #dc2626;
1910
+ }
1911
+
1912
+ /* Messages Container */
1913
+ .claude-messages {
1914
+ flex: 1;
1915
+ overflow-y: auto;
1916
+ padding: 16px;
1917
+ display: flex;
1918
+ flex-direction: column;
1919
+ gap: 16px;
1920
+ }
1921
+
1922
+ /* Empty State */
1923
+ .claude-empty-state {
1924
+ display: flex;
1925
+ flex-direction: column;
1926
+ align-items: center;
1927
+ justify-content: center;
1928
+ height: 100%;
1929
+ color: var(--mc-text-color);
1930
+ opacity: 0.6;
1931
+ text-align: center;
1932
+ gap: 12px;
1933
+ }
1934
+
1935
+ .claude-empty-state svg {
1936
+ color: var(--mc-primary);
1937
+ opacity: 0.6;
1938
+ }
1939
+
1940
+ .claude-empty-hint {
1941
+ font-size: 12px;
1942
+ opacity: 0.7;
1943
+ }
1944
+
1945
+ /* Message Bubbles */
1946
+ .claude-message {
1947
+ display: flex;
1948
+ flex-direction: column;
1949
+ }
1950
+
1951
+ .claude-message.user {
1952
+ align-items: flex-end;
1953
+ }
1954
+
1955
+ .claude-message.assistant {
1956
+ align-items: flex-start;
1957
+ }
1958
+
1959
+ .claude-message-content {
1960
+ max-width: 90%;
1961
+ padding: 12px 16px;
1962
+ border-radius: 12px;
1963
+ font-size: 13px;
1964
+ line-height: 1.5;
1965
+ }
1966
+
1967
+ .claude-message.user .claude-message-content {
1968
+ background: var(--mc-primary);
1969
+ color: var(--mc-button-foreground);
1970
+ border-bottom-right-radius: 4px;
1971
+ }
1972
+
1973
+ .claude-message.assistant .claude-message-content {
1974
+ background: var(--mc-cell-background);
1975
+ border: 1px solid var(--mc-border);
1976
+ color: var(--mc-text-color);
1977
+ border-bottom-left-radius: 4px;
1978
+ }
1979
+
1980
+ .claude-message-text {
1981
+ white-space: normal;
1982
+ word-wrap: break-word;
1983
+ }
1984
+
1985
+ /* Claude Markdown Rendering */
1986
+ .claude-markdown h1,
1987
+ .claude-markdown h2,
1988
+ .claude-markdown h3 {
1989
+ margin: 12px 0 8px 0;
1990
+ font-weight: 600;
1991
+ color: var(--mc-text-color);
1992
+ }
1993
+
1994
+ .claude-markdown h1 { font-size: 1.25em; }
1995
+ .claude-markdown h2 { font-size: 1.1em; }
1996
+ .claude-markdown h3 { font-size: 1em; }
1997
+
1998
+ .claude-markdown p {
1999
+ margin: 8px 0;
2000
+ }
2001
+
2002
+ .claude-markdown ul,
2003
+ .claude-markdown ol {
2004
+ margin: 8px 0;
2005
+ padding-left: 20px;
2006
+ }
2007
+
2008
+ .claude-markdown li {
2009
+ margin: 4px 0;
2010
+ }
2011
+
2012
+ .claude-markdown strong {
2013
+ font-weight: 600;
2014
+ }
2015
+
2016
+ .claude-markdown em {
2017
+ font-style: italic;
2018
+ }
2019
+
2020
+ .claude-markdown a {
2021
+ color: var(--mc-primary);
2022
+ text-decoration: none;
2023
+ }
2024
+
2025
+ .claude-markdown a:hover {
2026
+ text-decoration: underline;
2027
+ }
2028
+
2029
+ /* Inline code */
2030
+ .claude-inline-code {
2031
+ background: var(--mc-secondary);
2032
+ padding: 2px 6px;
2033
+ border-radius: 4px;
2034
+ font-family: 'Fira', 'SF Mono', Monaco, monospace;
2035
+ font-size: 0.9em;
2036
+ }
2037
+
2038
+ /* Code blocks in Claude messages */
2039
+ .claude-code-block {
2040
+ margin: 12px 0;
2041
+ border-radius: 8px;
2042
+ overflow: hidden;
2043
+ background: var(--mc-cell-background);
2044
+ border: 1px solid var(--mc-border);
2045
+ }
2046
+
2047
+ .claude-code-header {
2048
+ display: flex;
2049
+ align-items: center;
2050
+ justify-content: space-between;
2051
+ padding: 6px 12px;
2052
+ background: var(--mc-secondary);
2053
+ border-bottom: 1px solid var(--mc-border);
2054
+ }
2055
+
2056
+ .claude-code-lang {
2057
+ font-size: 11px;
2058
+ font-weight: 500;
2059
+ color: var(--mc-text-color);
2060
+ opacity: 0.7;
2061
+ text-transform: lowercase;
2062
+ }
2063
+
2064
+ .claude-code-block pre {
2065
+ margin: 0;
2066
+ padding: 12px;
2067
+ overflow-x: auto;
2068
+ background: var(--mc-cell-background);
2069
+ }
2070
+
2071
+ .claude-code-block code {
2072
+ font-family: 'Fira', 'SF Mono', Monaco, monospace;
2073
+ font-size: 12px;
2074
+ line-height: 1.5;
2075
+ color: var(--mc-text-color);
2076
+ }
2077
+
2078
+ /* Streaming indicator */
2079
+ .claude-streaming {
2080
+ white-space: normal;
2081
+ }
2082
+
2083
+ .claude-cursor {
2084
+ animation: blink 1s infinite;
2085
+ }
2086
+
2087
+ @keyframes cursor-blink {
2088
+ 0%, 50% { opacity: 1; }
2089
+ 51%, 100% { opacity: 0; }
2090
+ }
2091
+
2092
+ /* Edit Cards */
2093
+ .claude-edits {
2094
+ margin-top: 12px;
2095
+ display: flex;
2096
+ flex-direction: column;
2097
+ gap: 8px;
2098
+ }
2099
+
2100
+ .claude-edit-card {
2101
+ background: var(--mc-background);
2102
+ border: 1px solid var(--mc-border);
2103
+ border-radius: 8px;
2104
+ overflow: hidden;
2105
+ }
2106
+
2107
+ .claude-edit-card.applied {
2108
+ border-color: #22c55e;
2109
+ background: rgba(34, 197, 94, 0.05);
2110
+ }
2111
+
2112
+ .claude-edit-card.rejected {
2113
+ border-color: #ef4444;
2114
+ background: rgba(239, 68, 68, 0.05);
2115
+ opacity: 0.6;
2116
+ }
2117
+
2118
+ .claude-edit-header {
2119
+ display: flex;
2120
+ align-items: center;
2121
+ justify-content: space-between;
2122
+ padding: 8px 12px;
2123
+ border-bottom: 1px solid var(--mc-border);
2124
+ background: var(--mc-secondary);
2125
+ }
2126
+
2127
+ .claude-edit-cell {
2128
+ font-size: 11px;
2129
+ font-weight: 600;
2130
+ color: var(--mc-text-color);
2131
+ opacity: 0.8;
2132
+ }
2133
+
2134
+ .claude-edit-actions {
2135
+ display: flex;
2136
+ gap: 4px;
2137
+ }
2138
+
2139
+ .claude-edit-btn {
2140
+ display: flex;
2141
+ align-items: center;
2142
+ gap: 4px;
2143
+ padding: 4px 8px;
2144
+ border: none;
2145
+ border-radius: 4px;
2146
+ font-size: 11px;
2147
+ font-weight: 500;
2148
+ cursor: pointer;
2149
+ transition: all 0.2s ease;
2150
+ }
2151
+
2152
+ .claude-edit-btn.accept {
2153
+ background: #22c55e;
2154
+ color: white;
2155
+ }
2156
+
2157
+ .claude-edit-btn.accept:hover {
2158
+ background: #16a34a;
2159
+ }
2160
+
2161
+ .claude-edit-btn.reject {
2162
+ background: var(--mc-cell-background);
2163
+ color: var(--mc-text-color);
2164
+ border: 1px solid var(--mc-border);
2165
+ }
2166
+
2167
+ .claude-edit-btn.reject:hover {
2168
+ background: #fef2f2;
2169
+ border-color: #ef4444;
2170
+ color: #ef4444;
2171
+ }
2172
+
2173
+ .claude-edit-status {
2174
+ font-size: 11px;
2175
+ font-weight: 500;
2176
+ padding: 2px 8px;
2177
+ border-radius: 4px;
2178
+ }
2179
+
2180
+ .claude-edit-status.applied {
2181
+ background: #dcfce7;
2182
+ color: #16a34a;
2183
+ }
2184
+
2185
+ .claude-edit-status.rejected {
2186
+ background: #fef2f2;
2187
+ color: #dc2626;
2188
+ }
2189
+
2190
+ .claude-edit-explanation {
2191
+ padding: 8px 12px;
2192
+ font-size: 12px;
2193
+ color: var(--mc-text-color);
2194
+ opacity: 0.8;
2195
+ border-bottom: 1px solid var(--mc-border);
2196
+ }
2197
+
2198
+ .claude-edit-preview {
2199
+ max-height: 300px;
2200
+ overflow-y: auto;
2201
+ background: var(--mc-cell-background);
2202
+ }
2203
+
2204
+ .claude-edit-code {
2205
+ margin: 0;
2206
+ padding: 12px;
2207
+ font-family: 'Fira', 'SF Mono', Monaco, monospace;
2208
+ font-size: 12px;
2209
+ line-height: 1.5;
2210
+ white-space: pre;
2211
+ overflow-x: auto;
2212
+ color: var(--mc-text-color);
2213
+ background: transparent;
2214
+ }
2215
+
2216
+ .claude-edit-code code {
2217
+ font-family: inherit;
2218
+ background: transparent;
2219
+ }
2220
+
2221
+ /* Copy button in edit card */
2222
+ .claude-edit-btn.copy {
2223
+ background: transparent;
2224
+ color: var(--mc-text-color);
2225
+ opacity: 0.6;
2226
+ padding: 4px 6px;
2227
+ }
2228
+
2229
+ .claude-edit-btn.copy:hover {
2230
+ opacity: 1;
2231
+ background: var(--mc-secondary);
2232
+ }
2233
+
2234
+ /* Input Container */
2235
+ .claude-input-container {
2236
+ display: flex;
2237
+ gap: 8px;
2238
+ padding: 16px;
2239
+ border-top: 1px solid var(--mc-border);
2240
+ background: var(--mc-cell-background);
2241
+ }
2242
+
2243
+ .claude-input {
2244
+ flex: 1;
2245
+ padding: 10px 14px;
2246
+ border: 1px solid var(--mc-border);
2247
+ border-radius: 8px;
2248
+ font-size: 13px;
2249
+ background: var(--mc-background);
2250
+ color: var(--mc-text-color);
2251
+ resize: none;
2252
+ min-height: 40px;
2253
+ max-height: 120px;
2254
+ font-family: inherit;
2255
+ }
2256
+
2257
+ .claude-input:focus {
2258
+ outline: none;
2259
+ border-color: var(--mc-primary);
2260
+ }
2261
+
2262
+ .claude-input:disabled {
2263
+ opacity: 0.6;
2264
+ cursor: not-allowed;
2265
+ }
2266
+
2267
+ .claude-send-btn {
2268
+ padding: 10px 14px;
2269
+ background: var(--mc-primary);
2270
+ color: var(--mc-button-foreground);
2271
+ border: none;
2272
+ border-radius: 8px;
2273
+ cursor: pointer;
2274
+ transition: background 0.2s ease;
2275
+ display: flex;
2276
+ align-items: center;
2277
+ justify-content: center;
2278
+ }
2279
+
2280
+ .claude-send-btn:hover:not(:disabled) {
2281
+ background: var(--mc-primary-hover);
2282
+ }
2283
+
2284
+ .claude-send-btn:disabled {
2285
+ opacity: 0.6;
2286
+ cursor: not-allowed;
2287
+ }
2288
+
2289
+ .claude-loading-spinner {
2290
+ width: 16px;
2291
+ height: 16px;
2292
+ border: 2px solid rgba(255, 255, 255, 0.3);
2293
+ border-radius: 50%;
2294
+ border-top-color: white;
2295
+ animation: spin 1s linear infinite;
2296
+ }
2297
+
2298
+ @keyframes spin {
2299
+ to { transform: rotate(360deg); }
2300
+ }
2301
+
2302
+ /* ============================================================================
2303
+ Monaco Inline Diff Styles
2304
+ ============================================================================ */
2305
+
2306
+ /* Added lines - green */
2307
+ .monaco-diff-added {
2308
+ background: rgba(34, 197, 94, 0.15) !important;
2309
+ border-left: 3px solid #22c55e !important;
2310
+ }
2311
+
2312
+ .monaco-diff-added-glyph {
2313
+ background: #22c55e;
2314
+ width: 4px !important;
2315
+ margin-left: 2px;
2316
+ }
2317
+
2318
+ /* Removed lines glyph indicator */
2319
+ .monaco-diff-removed-glyph {
2320
+ background: #ef4444;
2321
+ width: 4px !important;
2322
+ margin-left: 2px;
2323
+ }
2324
+
2325
+ /* Removed lines indicator */
2326
+ .monaco-diff-removed-indicator {
2327
+ background: rgba(239, 68, 68, 0.15);
2328
+ color: #ef4444;
2329
+ padding: 0 4px;
2330
+ border-radius: 2px;
2331
+ font-size: 10px;
2332
+ font-weight: 500;
2333
+ margin-left: 4px;
2334
+ }
2335
+
2336
+ /* Diff widget overlay - accept/reject buttons */
2337
+ .diff-widget-overlay {
2338
+ display: flex;
2339
+ gap: 8px;
2340
+ padding: 8px 12px;
2341
+ background: var(--mc-cell-background);
2342
+ border: 1px solid var(--mc-border);
2343
+ border-radius: 8px;
2344
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
2345
+ z-index: 1000;
2346
+ }
2347
+
2348
+ .diff-widget-btn {
2349
+ display: flex;
2350
+ align-items: center;
2351
+ gap: 8px;
2352
+ padding: 6px 12px;
2353
+ border: none;
2354
+ border-radius: 6px;
2355
+ font-size: 12px;
2356
+ font-weight: 500;
2357
+ cursor: pointer;
2358
+ transition: all 0.2s ease;
2359
+ }
2360
+
2361
+ .diff-widget-btn kbd {
2362
+ background: rgba(0, 0, 0, 0.1);
2363
+ padding: 2px 4px;
2364
+ border-radius: 3px;
2365
+ font-size: 10px;
2366
+ font-family: inherit;
2367
+ }
2368
+
2369
+ .diff-widget-btn.accept {
2370
+ background: #22c55e;
2371
+ color: white;
2372
+ }
2373
+
2374
+ .diff-widget-btn.accept:hover {
2375
+ background: #16a34a;
2376
+ }
2377
+
2378
+ .diff-widget-btn.accept kbd {
2379
+ background: rgba(255, 255, 255, 0.2);
2380
+ }
2381
+
2382
+ .diff-widget-btn.reject {
2383
+ background: var(--mc-background);
2384
+ color: var(--mc-text-color);
2385
+ border: 1px solid var(--mc-border);
2386
+ }
2387
+
2388
+ .diff-widget-btn.reject:hover {
2389
+ background: #fef2f2;
2390
+ border-color: #ef4444;
2391
+ color: #ef4444;
2392
+ }
2393
+
2394
+ /* Cell with pending diff */
2395
+ .cell.has-pending-diff {
2396
+ border-color: var(--mc-primary) !important;
2397
+ box-shadow: 0 0 0 2px rgba(var(--mc-primary-rgb, 139, 92, 246), 0.2) !important;
2398
+ }