codex-overleaf-link 2.3.6 → 2.4.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.
Files changed (52) hide show
  1. package/README.md +62 -34
  2. package/README.zh-CN.md +546 -0
  3. package/extension/bootstrap/manifest.template.json +1 -1
  4. package/extension/src/background.js +3 -0
  5. package/extension/src/content/activeTurnControl.js +1 -0
  6. package/extension/src/content/assetTransferBroker.js +2 -0
  7. package/extension/src/content/contentRuntime.js +122 -118
  8. package/extension/src/content/contextTray.js +4 -0
  9. package/extension/src/content/diagnosticsController.js +4 -0
  10. package/extension/src/content/diagnosticsPanel.js +128 -4
  11. package/extension/src/content/generated/content.bundle.js +1233 -550
  12. package/extension/src/content/generated/content.bundle.meta.json +4 -3
  13. package/extension/src/content/legacyGlobalRegistry.js +1 -0
  14. package/extension/src/content/modelPicker.js +21 -9
  15. package/extension/src/content/modelPickerSupport.js +38 -1
  16. package/extension/src/content/nativeCompatibilityController.js +4 -1
  17. package/extension/src/content/otWarmMirror.js +34 -30
  18. package/extension/src/content/otWarmMirrorController.js +20 -0
  19. package/extension/src/content/pageBridgeClient.js +2 -0
  20. package/extension/src/content/panelMaintenance.js +8 -4
  21. package/extension/src/content/recentProjects.js +354 -355
  22. package/extension/src/content/runResultActions.js +16 -1
  23. package/extension/src/content/runTimelineView.js +9 -11
  24. package/extension/src/content/scopedPersistenceCoordinator.js +2 -1
  25. package/extension/src/content/scopedPersistencePanelState.js +45 -2
  26. package/extension/src/content/sessionForkController.js +20 -11
  27. package/extension/src/content/sessionPersistence.js +4 -1
  28. package/extension/src/content/settingsPanel.js +16 -2
  29. package/extension/src/content/trackedChangeCaptureController.js +153 -0
  30. package/extension/src/content/writebackOrchestrator.js +31 -0
  31. package/extension/src/page/binaryAssetUploader.js +101 -29
  32. package/extension/src/page/overleafRealtimeObserver.js +4 -1
  33. package/extension/src/page/saveState.js +44 -1
  34. package/extension/src/page/textFileCreator.js +493 -0
  35. package/extension/src/page/trackedChangeCapture.js +342 -0
  36. package/extension/src/page/trackedChangesLifecycle.js +149 -150
  37. package/extension/src/page/treeOperations.js +40 -29
  38. package/extension/src/page/writebackRouter.js +95 -49
  39. package/extension/src/pageBridge.js +65 -25
  40. package/extension/src/shared/compatibility.js +1 -1
  41. package/extension/src/shared/i18n.js +94 -40
  42. package/extension/src/shared/pageRpcContract.js +2 -1
  43. package/extension/src/shared/sessionState.js +6 -2
  44. package/extension/src/shared/storageDb.js +11 -12
  45. package/extension/src/shared/storageRunActions.js +73 -1
  46. package/extension/src/shared/writebackSettlement.js +19 -5
  47. package/extension/styles/panel.css +254 -405
  48. package/native-host/src/codexSessionRunner.js +41 -38
  49. package/native-host/src/codexSessionTiming.js +68 -0
  50. package/native-host/src/readProgressGuard.js +84 -17
  51. package/native-host/src/taskRunnerRuntime.js +25 -0
  52. package/package.json +5 -1
@@ -1029,11 +1029,21 @@
1029
1029
  }
1030
1030
 
1031
1031
  #codex-overleaf-panel .codex-diagnostics-menu {
1032
- position: absolute;
1032
+ position: fixed;
1033
1033
  z-index: 2147483647;
1034
- top: 30px;
1035
- right: 0;
1036
- width: 260px;
1034
+ top: 44px;
1035
+ right: 12px;
1036
+ bottom: auto;
1037
+ left: auto;
1038
+ margin: 0;
1039
+ box-sizing: border-box;
1040
+ width: min(300px, calc(100vw - 24px));
1041
+ max-width: calc(100vw - 24px);
1042
+ max-height: calc(100vh - 24px);
1043
+ overflow: auto;
1044
+ overscroll-behavior: contain;
1045
+ overflow-wrap: anywhere;
1046
+ color: var(--tl-fg-2);
1037
1047
  border: 1px solid var(--tl-border-strong);
1038
1048
  border-radius: 6px;
1039
1049
  background: var(--tl-surface-2);
@@ -1084,15 +1094,30 @@
1084
1094
  z-index: 2147483647;
1085
1095
  top: 44px;
1086
1096
  right: 12px;
1087
- width: min(316px, calc(var(--codex-overleaf-panel-width) - 24px));
1088
- max-height: min(520px, calc(100vh - 64px));
1097
+ bottom: auto;
1098
+ left: auto;
1099
+ margin: 0;
1100
+ padding: 0;
1101
+ box-sizing: border-box;
1102
+ width: min(560px, calc(100vw - 24px));
1103
+ max-width: calc(100vw - 24px);
1104
+ max-height: min(640px, calc(100vh - 24px));
1089
1105
  overflow: auto;
1106
+ overscroll-behavior: contain;
1107
+ overflow-wrap: anywhere;
1108
+ color: var(--tl-fg-2);
1090
1109
  border: 1px solid var(--tl-border-strong);
1091
1110
  border-radius: 8px;
1092
1111
  background: var(--tl-surface-1);
1093
1112
  box-shadow: 0 14px 34px rgba(0, 0, 0, 0.48);
1094
1113
  }
1095
1114
 
1115
+ #codex-overleaf-panel .codex-diagnostics-menu::backdrop,
1116
+ #codex-overleaf-panel .codex-diagnostics-result::backdrop {
1117
+ background: transparent;
1118
+ pointer-events: none;
1119
+ }
1120
+
1096
1121
  #codex-overleaf-panel .codex-diagnostics-result[hidden] {
1097
1122
  display: none;
1098
1123
  }
@@ -1821,9 +1846,12 @@
1821
1846
  #codex-overleaf-panel .codex-plugin-confirm::backdrop { background: transparent; }
1822
1847
 
1823
1848
  #codex-overleaf-panel .codex-plugin-confirm-card {
1849
+ display: flex;
1850
+ flex-direction: column;
1851
+ box-sizing: border-box;
1824
1852
  width: 100%;
1825
1853
  max-height: min(520px, calc(100vh - 28px));
1826
- overflow: hidden;
1854
+ overflow: auto;
1827
1855
  border: 1px solid var(--tl-border-strong);
1828
1856
  border-radius: 8px;
1829
1857
  background: var(--tl-surface-1);
@@ -1832,6 +1860,7 @@
1832
1860
 
1833
1861
  #codex-overleaf-panel .codex-plugin-confirm-head {
1834
1862
  display: flex;
1863
+ flex: 0 0 auto;
1835
1864
  align-items: center;
1836
1865
  gap: 10px;
1837
1866
  padding: 14px 14px 12px;
@@ -1860,6 +1889,8 @@
1860
1889
  }
1861
1890
 
1862
1891
  #codex-overleaf-panel .codex-plugin-confirm-body {
1892
+ flex: 0 1 auto;
1893
+ min-height: 0;
1863
1894
  max-height: 300px;
1864
1895
  overflow: auto;
1865
1896
  padding: 12px 14px;
@@ -1872,6 +1903,9 @@
1872
1903
 
1873
1904
  #codex-overleaf-panel .codex-plugin-confirm-actions {
1874
1905
  display: flex;
1906
+ flex: 0 0 auto;
1907
+ flex-wrap: wrap;
1908
+ align-items: stretch;
1875
1909
  justify-content: flex-end;
1876
1910
  gap: 8px;
1877
1911
  padding: 12px 14px 14px;
@@ -1879,12 +1913,23 @@
1879
1913
  }
1880
1914
 
1881
1915
  #codex-overleaf-panel .codex-plugin-confirm-actions button {
1882
- min-width: 72px;
1883
- height: 30px;
1916
+ display: flex;
1917
+ flex: 1 1 auto;
1918
+ align-items: center;
1919
+ justify-content: center;
1920
+ box-sizing: border-box;
1921
+ min-width: min(72px, 100%);
1922
+ max-width: 100%;
1923
+ min-height: 34px;
1924
+ height: auto;
1884
1925
  border: 1px solid var(--tl-border-strong);
1885
1926
  border-radius: 6px;
1886
- padding: 0 12px;
1927
+ padding: 7px 12px;
1887
1928
  font-weight: 650;
1929
+ line-height: 1.35;
1930
+ text-align: center;
1931
+ white-space: normal;
1932
+ overflow-wrap: anywhere;
1888
1933
  }
1889
1934
 
1890
1935
  #codex-overleaf-panel .codex-plugin-confirm-cancel {
@@ -4749,425 +4794,240 @@
4749
4794
  flex-direction: column;
4750
4795
  min-height: 0;
4751
4796
  overflow-y: auto;
4752
- padding: 14px 12px 12px;
4753
- gap: 12px;
4754
- }
4755
-
4756
- #codex-overleaf-panel .recent-projects-welcome {
4757
- display: flex;
4758
- flex-direction: column;
4759
- gap: 4px;
4760
- padding-bottom: 4px;
4761
- border-bottom: 1px solid var(--tl-border);
4762
- }
4763
-
4764
- #codex-overleaf-panel .recent-projects-welcome-title {
4765
- color: var(--tl-fg-1);
4766
- font-size: 14px;
4767
- font-weight: 650;
4768
- letter-spacing: 0;
4797
+ padding: 22px 18px 16px;
4798
+ gap: 20px;
4769
4799
  }
4770
4800
 
4771
- #codex-overleaf-panel .recent-projects-welcome-subtitle {
4801
+ #codex-overleaf-panel .recent-projects-welcome { display: grid; gap: 5px; padding: 0 4px; }
4802
+ #codex-overleaf-panel .recent-projects-eyebrow {
4772
4803
  color: var(--tl-fg-3);
4773
- font-size: 12px;
4774
- line-height: 1.4;
4775
- }
4776
-
4777
- #codex-overleaf-panel [data-recent-projects-list] {
4778
- display: flex;
4779
- flex-direction: column;
4780
- gap: 0;
4804
+ font-size: 10px;
4805
+ font-weight: 550;
4806
+ letter-spacing: 0.09em;
4807
+ margin-bottom: 3px;
4781
4808
  }
4782
-
4809
+ #codex-overleaf-panel .recent-projects-welcome-title { color: var(--tl-fg-1); font-size: 16px; font-weight: 600; line-height: 1.4; }
4810
+ #codex-overleaf-panel .recent-projects-welcome-subtitle { color: var(--tl-fg-3); font-size: 11.5px; line-height: 1.5; }
4811
+ #codex-overleaf-panel [data-recent-projects-list] { min-width: 0; }
4783
4812
  #codex-overleaf-panel .recent-projects-empty,
4784
4813
  #codex-overleaf-panel .recent-projects-degraded {
4785
- border: 1px dashed var(--tl-border-strong);
4786
- border-radius: 6px;
4787
- background: var(--tl-surface-1);
4788
- color: var(--tl-fg-3);
4789
- font-size: 12px;
4790
- line-height: 1.45;
4791
- padding: 14px 12px;
4792
- }
4793
-
4794
- /* Dashboard per-project session management: expand a row to list, rename, or
4795
- delete that project's sessions without entering it. */
4796
- #codex-overleaf-panel .recent-projects-row-wrap {
4797
- position: relative;
4798
- display: grid;
4799
- gap: 0;
4800
- border-bottom: 1px solid rgba(128, 128, 128, 0.12);
4801
- }
4802
-
4803
- #codex-overleaf-panel .recent-projects-row-wrap::before {
4804
- content: "";
4805
- position: absolute;
4806
- top: 14px;
4807
- bottom: 14px;
4808
- left: 0;
4809
- width: 2px;
4810
- border-radius: 999px;
4811
- background: var(--tl-border-strong);
4812
- opacity: 0.65;
4813
- }
4814
-
4815
- #codex-overleaf-panel .recent-projects-row-wrap:has(.badge-completed)::before,
4816
- #codex-overleaf-panel .recent-projects-row-wrap:has(.badge-accepted)::before,
4817
- #codex-overleaf-panel .recent-projects-row-wrap:has(.badge-background-completed)::before {
4818
- background: var(--tl-ok);
4819
- }
4820
-
4821
- #codex-overleaf-panel .recent-projects-row-wrap:has(.badge-stale)::before,
4822
- #codex-overleaf-panel .recent-projects-row-wrap:has(.badge-interrupted)::before,
4823
- #codex-overleaf-panel .recent-projects-row-wrap:has(.badge-needs-review)::before,
4824
- #codex-overleaf-panel .recent-projects-row-wrap:has(.badge-needs-review-after-navigation)::before {
4825
- background: var(--tl-review);
4826
- }
4827
-
4828
- #codex-overleaf-panel .recent-projects-row-wrap:has(.badge-failed)::before,
4829
- #codex-overleaf-panel .recent-projects-row-wrap:has(.badge-abandoned-after-navigation)::before {
4830
- background: var(--tl-fail);
4831
- }
4832
-
4833
- #codex-overleaf-panel .recent-projects-row-head {
4834
- position: relative;
4835
- display: block;
4836
- }
4837
-
4838
- #codex-overleaf-panel .recent-projects-row-head [data-recent-projects-row] {
4839
- width: 100%;
4840
- min-width: 0;
4841
- }
4842
-
4843
- #codex-overleaf-panel .recent-projects-row-cleanup {
4844
- flex: 0 0 auto;
4845
- width: 26px;
4846
- border-radius: var(--tl-r-sm);
4847
- color: var(--tl-fg-4);
4814
+ padding: 12px 4px;
4815
+ color: var(--tl-fg-2);
4848
4816
  font-size: 13px;
4817
+ line-height: 1.6;
4849
4818
  }
4850
-
4851
- #codex-overleaf-panel .recent-projects-row-cleanup:hover {
4852
- background: var(--tl-hover);
4853
- color: var(--tl-fail);
4854
- }
4855
-
4856
- #codex-overleaf-panel .recent-projects-row-clear {
4857
- position: absolute;
4858
- top: 8px;
4859
- right: 8px;
4860
- z-index: 2;
4861
- width: 24px;
4862
- height: 24px;
4863
- border-radius: var(--tl-r-sm);
4864
- color: var(--tl-fg-4);
4865
- font-size: 16px;
4866
- line-height: 1;
4867
- opacity: 0;
4868
- transform: translateX(4px);
4869
- transition: color 120ms ease, background 120ms ease, opacity 120ms ease, transform 120ms ease;
4870
- }
4871
-
4872
- #codex-overleaf-panel .recent-projects-row-wrap:hover .recent-projects-row-clear,
4873
- #codex-overleaf-panel .recent-projects-row-clear:focus-visible {
4874
- opacity: 1;
4875
- transform: translateX(0);
4876
- }
4877
-
4878
- #codex-overleaf-panel .recent-projects-row-clear:hover {
4879
- background: var(--tl-hover);
4880
- color: var(--tl-fail);
4881
- }
4882
-
4883
- #codex-overleaf-panel .recent-projects-loading {
4884
- padding: 10px 12px;
4885
- color: var(--tl-fg-3);
4886
- font-size: 12px;
4887
- }
4888
-
4889
- #codex-overleaf-panel .recent-projects-row-expand {
4890
- position: absolute;
4891
- right: 8px;
4892
- bottom: 10px;
4893
- z-index: 1;
4894
- display: inline-flex;
4895
- align-items: center;
4896
- justify-content: center;
4897
- width: auto;
4898
- min-width: 0;
4899
- height: 18px;
4900
- padding: 0 2px;
4819
+ #codex-overleaf-panel .recent-projects-loading { display: block; padding: 10px 4px; color: var(--tl-fg-3); font-size: 12px; }
4820
+ #codex-overleaf-panel .recent-projects-filter { display: flex; align-items: center; gap: 10px; min-width: 0; padding: 0 4px; }
4821
+ #codex-overleaf-panel .recent-projects-filter > button {
4822
+ flex: 0 0 auto;
4823
+ padding: 3px 0;
4901
4824
  border: 0;
4902
- border-radius: 0;
4903
- color: var(--tl-accent);
4904
- font-size: 11px;
4905
- font-weight: 550;
4906
- background: transparent;
4907
- opacity: 0;
4908
- transform: translateX(4px);
4909
- transition: opacity 120ms ease, transform 120ms ease, color 120ms ease;
4910
- }
4911
-
4912
- #codex-overleaf-panel .recent-projects-row-wrap:hover .recent-projects-row-expand,
4913
- #codex-overleaf-panel .recent-projects-row-expand:focus-visible,
4914
- #codex-overleaf-panel .recent-projects-row-wrap[data-expanded="true"] .recent-projects-row-expand {
4915
- opacity: 1;
4916
- transform: translateX(0);
4917
- }
4918
-
4919
- #codex-overleaf-panel .recent-projects-row-expand:hover {
4920
- background: transparent;
4921
- color: var(--tl-accent);
4922
- text-decoration: underline;
4923
- }
4924
-
4925
- #codex-overleaf-panel .recent-projects-row-wrap[data-expanded="true"] .recent-projects-row-expand {
4926
- color: var(--tl-accent);
4927
4825
  background: transparent;
4826
+ color: var(--tl-ok);
4827
+ font-size: 12px;
4828
+ cursor: pointer;
4928
4829
  }
4929
-
4930
- #codex-overleaf-panel .recent-projects-sessions {
4931
- display: grid;
4932
- gap: 2px;
4933
- border-left: 2px solid var(--tl-border);
4934
- margin: 2px 0 6px 10px;
4935
- padding-left: 8px;
4936
- }
4937
-
4938
- #codex-overleaf-panel .recent-projects-sessions-empty {
4939
- color: var(--tl-fg-4);
4940
- font-size: 11px;
4941
- padding: 4px 2px;
4942
- }
4943
-
4830
+ #codex-overleaf-panel .recent-projects-filter > button::before { content: "\2190"; margin-inline-end: 5px; }
4831
+ #codex-overleaf-panel .recent-projects-filter > span { min-width: 0; color: var(--tl-fg-3); font-size: 11px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
4944
4832
  #codex-overleaf-panel .recent-projects-session-row {
4945
- display: flex;
4833
+ position: relative;
4834
+ display: grid;
4835
+ grid-template-columns: minmax(0, 1fr) 24px;
4946
4836
  align-items: center;
4947
- gap: 6px;
4837
+ gap: 4px;
4948
4838
  min-width: 0;
4949
- border-radius: var(--tl-r-sm);
4950
- padding: 3px 4px;
4951
- }
4952
-
4953
- #codex-overleaf-panel .recent-projects-session-row:hover {
4954
- background: var(--tl-hover);
4955
- }
4956
-
4957
- #codex-overleaf-panel .recent-projects-session-row[data-running="true"] .recent-projects-session-title::before {
4958
- content: "";
4959
- display: inline-block;
4960
- width: 7px;
4961
- height: 7px;
4962
- margin-right: 6px;
4963
- border: 2px solid rgba(78, 201, 176, 0.25);
4964
- border-top-color: var(--tl-run);
4965
- border-radius: 50%;
4966
- vertical-align: -1px;
4967
- animation: codex-session-spin 800ms linear infinite;
4839
+ padding: 9px 5px;
4840
+ border-radius: 6px;
4968
4841
  }
4969
-
4842
+ #codex-overleaf-panel .recent-projects-session-copy { display: grid; gap: 4px; min-width: 0; }
4970
4843
  #codex-overleaf-panel .recent-projects-session-title {
4971
- flex: 1 1 auto;
4844
+ display: block;
4972
4845
  min-width: 0;
4973
4846
  overflow: hidden;
4974
- color: var(--tl-fg-2);
4975
- font-size: 12px;
4847
+ color: var(--tl-fg-1);
4848
+ font-size: 13px;
4849
+ font-weight: 500;
4850
+ line-height: 1.6;
4976
4851
  text-overflow: ellipsis;
4977
4852
  white-space: nowrap;
4978
4853
  }
4979
-
4980
- #codex-overleaf-panel .recent-projects-session-time {
4981
- flex: 0 0 auto;
4982
- color: var(--tl-fg-4);
4983
- font-size: 11px;
4984
- white-space: nowrap;
4985
- }
4986
-
4987
- #codex-overleaf-panel .recent-projects-session-action {
4988
- flex: 0 0 auto;
4989
- width: 22px;
4990
- height: 22px;
4991
- border-radius: var(--tl-r-sm);
4992
- color: var(--tl-fg-3);
4993
- opacity: 0.75;
4994
- }
4995
-
4996
- #codex-overleaf-panel .recent-projects-session-action:hover {
4997
- background: var(--tl-hover);
4998
- opacity: 1;
4999
- }
5000
-
5001
- #codex-overleaf-panel .recent-projects-session-action--delete:hover {
5002
- color: var(--tl-fail);
5003
- }
5004
-
5005
- #codex-overleaf-panel .recent-projects-session-action:disabled {
5006
- cursor: not-allowed;
5007
- opacity: 0.3;
4854
+ #codex-overleaf-panel .recent-projects-session-title[hidden] { display: none; }
4855
+ #codex-overleaf-panel .recent-projects-session-meta { display: flex; align-items: baseline; gap: 7px; min-width: 0; color: var(--tl-fg-3); font-size: 11px; line-height: 1.5; }
4856
+ #codex-overleaf-panel .recent-projects-row-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 400; }
4857
+ #codex-overleaf-panel .recent-projects-session-time { flex: 0 0 auto; margin-inline-start: auto; color: var(--tl-fg-3); font-size: 10.5px; white-space: nowrap; }
4858
+ #codex-overleaf-panel .recent-projects-session-attention { flex: 0 0 auto; color: var(--tl-review); font-size: 10.5px; }
4859
+ #codex-overleaf-panel .recent-projects-session-attention::before { content: "\00b7"; margin-inline-end: 4px; }
4860
+ #codex-overleaf-panel .recent-projects-session-row[aria-busy="true"] { cursor: progress; }
4861
+ #codex-overleaf-panel .recent-projects-session-row[data-running="true"]:not(.recent-projects-focus) .recent-projects-session-title::before {
4862
+ content: "";
4863
+ display: inline-block;
4864
+ width: 5px;
4865
+ height: 5px;
4866
+ margin-inline-end: 6px;
4867
+ border-radius: 50%;
4868
+ background: var(--tl-run);
5008
4869
  }
5009
-
5010
- #codex-overleaf-panel .recent-projects-session-rename-input {
5011
- flex: 1 1 auto;
5012
- min-width: 0;
5013
- border: 1px solid var(--tl-accent);
5014
- border-radius: var(--tl-r-sm);
5015
- background: var(--tl-surface-0);
5016
- color: var(--tl-fg-1);
5017
- font-size: 12px;
5018
- padding: 2px 6px;
4870
+ #codex-overleaf-panel .recent-projects-focus {
4871
+ display: flex;
4872
+ flex-direction: column;
4873
+ align-items: stretch;
4874
+ gap: 9px;
4875
+ padding: 12px;
4876
+ margin-bottom: 20px;
4877
+ border-radius: 8px;
4878
+ background: var(--tl-ok-wash);
4879
+ background: color-mix(in srgb, var(--tl-ok-wash) 65%, var(--tl-surface-0));
4880
+ }
4881
+ #codex-overleaf-panel .recent-projects-focus-eyebrow { flex: 0 0 auto; color: var(--tl-fg-3); font-size: 10.5px; font-weight: 400; line-height: 1.5; }
4882
+ #codex-overleaf-panel .recent-projects-focus-eyebrow::after { content: "\00b7"; margin-inline-start: 6px; }
4883
+ #codex-overleaf-panel .recent-projects-focus .recent-projects-session-copy { gap: 6px; }
4884
+ #codex-overleaf-panel .recent-projects-focus .recent-projects-session-meta { justify-content: flex-start; gap: 6px; padding-inline-end: 18px; font-size: 11px; }
4885
+ #codex-overleaf-panel .recent-projects-focus .recent-projects-session-time { margin-inline-start: 0; font-size: inherit; }
4886
+ #codex-overleaf-panel .recent-projects-focus .recent-projects-session-time:not(:empty)::before { content: "\00b7"; margin-inline-end: 7px; }
4887
+ #codex-overleaf-panel .recent-projects-focus .recent-projects-session-title {
4888
+ display: -webkit-box;
4889
+ -webkit-line-clamp: 2;
4890
+ -webkit-box-orient: vertical;
4891
+ white-space: normal;
4892
+ overflow-wrap: anywhere;
4893
+ font-size: 14.5px;
4894
+ font-weight: 500;
4895
+ line-height: 1.5;
5019
4896
  }
5020
-
5021
- #codex-overleaf-panel [data-recent-projects-row] {
5022
- display: grid;
5023
- grid-template-columns: minmax(0, 1fr) auto;
5024
- grid-template-areas:
5025
- "name time"
5026
- "badge sessions";
5027
- align-items: baseline;
5028
- gap: 6px 12px;
5029
- width: 100%;
4897
+ #codex-overleaf-panel .recent-projects-focus .recent-projects-session-title[hidden] { display: none; }
4898
+ #codex-overleaf-panel .recent-projects-focus .recent-projects-row-badge { flex: 1 1 auto; min-width: 0; font-size: 11.5px; line-height: 1.45; }
4899
+ #codex-overleaf-panel .recent-projects-focus-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-width: 0; }
4900
+ #codex-overleaf-panel .recent-projects-focus > .recent-projects-menu { position: absolute; top: 6px; inset-inline-end: 6px; }
4901
+ #codex-overleaf-panel .recent-projects-continue {
4902
+ flex: 0 0 auto;
4903
+ display: inline-flex;
4904
+ align-items: center;
4905
+ justify-content: center;
4906
+ gap: 8px;
4907
+ min-height: 28px;
4908
+ padding: 5px 10px;
5030
4909
  border: 0;
5031
4910
  border-radius: 6px;
5032
- background: transparent;
5033
- color: var(--tl-fg-2);
5034
- padding: 14px 86px 14px 14px;
5035
- cursor: pointer;
5036
- text-align: left;
5037
- }
5038
-
5039
- #codex-overleaf-panel [data-recent-projects-row]:hover:not(:disabled) {
5040
- background: linear-gradient(90deg, rgba(128, 128, 128, 0.08), transparent 72%);
5041
- }
5042
-
5043
- #codex-overleaf-panel [data-recent-projects-row]:disabled,
5044
- #codex-overleaf-panel [data-recent-projects-row][aria-disabled="true"] {
5045
- cursor: default;
5046
- opacity: 0.55;
5047
- }
5048
-
5049
- #codex-overleaf-panel .recent-projects-row-name {
5050
- grid-area: name;
5051
- color: var(--tl-fg-1);
5052
- font-weight: 650;
5053
- font-size: 13.5px;
5054
- overflow: hidden;
5055
- text-overflow: ellipsis;
5056
- white-space: nowrap;
5057
- }
5058
-
5059
- #codex-overleaf-panel .recent-projects-row-time {
5060
- grid-area: time;
5061
- color: var(--tl-fg-3);
5062
- font-size: 11px;
5063
- letter-spacing: 0.01em;
5064
- white-space: nowrap;
5065
- }
5066
-
5067
- #codex-overleaf-panel .recent-projects-row-summary {
5068
- grid-area: summary;
5069
- color: var(--tl-fg-2);
4911
+ background: #357347;
4912
+ color: #fff;
5070
4913
  font-size: 12px;
4914
+ font-weight: 400;
5071
4915
  line-height: 1.4;
5072
- word-break: break-word;
5073
- }
5074
-
5075
- #codex-overleaf-panel .recent-projects-row-summary:empty {
5076
- display: none;
5077
- }
5078
-
5079
- #codex-overleaf-panel .recent-projects-row-warning {
5080
- grid-area: badge;
5081
- color: var(--tl-review);
5082
- font-size: 11px;
5083
- margin-top: 2px;
4916
+ cursor: pointer;
5084
4917
  }
5085
-
4918
+ #codex-overleaf-panel .recent-projects-continue::after { content: "\2192"; }
4919
+ #codex-overleaf-panel .recent-projects-continue:hover:not(:disabled) { text-decoration: underline; text-underline-offset: 3px; }
4920
+ #codex-overleaf-panel .recent-projects-continue:disabled { opacity: 0.55; cursor: progress; }
5086
4921
  #codex-overleaf-panel .recent-projects-row-badge {
5087
- grid-area: badge;
5088
- justify-self: start;
5089
4922
  display: inline-flex;
5090
- align-items: center;
5091
- gap: 5px;
4923
+ align-items: baseline;
4924
+ gap: 6px;
4925
+ min-width: 0;
5092
4926
  padding: 0;
5093
- margin-top: 0;
5094
4927
  border: 0;
5095
- border-radius: 0;
5096
- font-size: 10.5px;
5097
- letter-spacing: 0.03em;
5098
- line-height: 1.4;
5099
- font-weight: 500;
5100
- text-transform: uppercase;
5101
- opacity: 0.92;
5102
- }
5103
-
5104
- #codex-overleaf-panel .recent-projects-row-badge::before {
5105
- content: "";
5106
- display: inline-block;
5107
- width: 6px;
5108
- height: 6px;
5109
- border-radius: 999px;
5110
- background: currentColor;
5111
- opacity: 0.85;
5112
- }
5113
-
5114
- /* Status badge palette. All ten values from spec §5.10 — reuses the
5115
- existing per-project run-card hues so the dashboard reads identically to
5116
- the in-project surface. */
5117
- #codex-overleaf-panel .recent-projects-row-badge.badge-running {
5118
- color: var(--tl-run);
5119
- }
5120
-
5121
- #codex-overleaf-panel .recent-projects-row-badge.badge-pending {
4928
+ background: transparent;
5122
4929
  color: var(--tl-fg-3);
5123
- }
5124
-
5125
- #codex-overleaf-panel .recent-projects-row-badge.badge-accepted,
5126
- #codex-overleaf-panel .recent-projects-row-badge.badge-completed,
5127
- #codex-overleaf-panel .recent-projects-row-badge.badge-background-completed {
5128
- color: var(--tl-ok);
5129
- }
5130
-
5131
- #codex-overleaf-panel .recent-projects-row-badge.badge-rejected {
5132
- color: var(--tl-fg-2);
5133
- }
5134
-
5135
- #codex-overleaf-panel .recent-projects-row-badge.badge-needs-review,
5136
- #codex-overleaf-panel .recent-projects-row-badge.badge-interrupted,
5137
- #codex-overleaf-panel .recent-projects-row-badge.badge-needs-review-after-navigation,
5138
- #codex-overleaf-panel .recent-projects-row-badge.badge-stale {
5139
- color: var(--tl-review);
5140
- }
5141
-
5142
- #codex-overleaf-panel .recent-projects-row-badge.badge-failed,
5143
- #codex-overleaf-panel .recent-projects-row-badge.badge-abandoned-after-navigation {
5144
- color: var(--tl-fail);
5145
- }
5146
-
5147
- #codex-overleaf-panel .recent-projects-settings-entry {
4930
+ font-size: 11px;
4931
+ font-weight: 400;
4932
+ line-height: 1.6;
4933
+ overflow-wrap: anywhere;
4934
+ text-transform: none;
4935
+ letter-spacing: normal;
4936
+ }
4937
+ #codex-overleaf-panel .recent-projects-row-badge[data-status]::before { content: "\00b7"; flex: 0 0 auto; color: var(--tl-fg-3); }
4938
+ #codex-overleaf-panel .recent-projects-row-badge:is(.badge-completed, .badge-accepted, .badge-background-completed)::before { content: "\2713"; color: var(--tl-ok); }
4939
+ #codex-overleaf-panel .recent-projects-row-badge:is(.badge-failed, .badge-abandoned-after-navigation)::before { content: "!"; color: var(--tl-fail); }
4940
+ #codex-overleaf-panel .recent-projects-row-badge:is(.badge-stale, .badge-interrupted, .badge-needs-review, .badge-needs-review-after-navigation)::before { content: "!"; color: var(--tl-review); }
4941
+ #codex-overleaf-panel .recent-projects-row-badge.badge-running::before { color: var(--tl-run); }
4942
+ #codex-overleaf-panel .recent-projects-history-heading { display: flex; justify-content: space-between; gap: 10px; margin: 0 5px 7px; color: var(--tl-fg-3); font-size: 11px; line-height: 1.5; }
4943
+ #codex-overleaf-panel .recent-projects-history-heading > :last-child { font-size: 10px; }
4944
+ #codex-overleaf-panel .recent-projects-history-list { display: grid; gap: 1px; min-width: 0; }
4945
+ #codex-overleaf-panel .recent-projects-drafts { margin: 18px 5px 0; min-width: 0; }
4946
+ #codex-overleaf-panel .recent-projects-drafts > summary { padding: 5px 0; color: var(--tl-fg-3); font-size: 11px; line-height: 1.5; cursor: pointer; list-style: none; }
4947
+ #codex-overleaf-panel .recent-projects-drafts > summary::-webkit-details-marker { display: none; }
4948
+ #codex-overleaf-panel .recent-projects-drafts > summary::before { content: "\203a"; display: inline-block; margin-inline-end: 6px; font-size: 13px; }
4949
+ #codex-overleaf-panel .recent-projects-drafts[open] > summary::before { transform: rotate(90deg); }
4950
+ #codex-overleaf-panel .recent-projects-drafts-hint { display: block; margin: 3px 0 7px; color: var(--tl-fg-3); font-size: 10.5px; line-height: 1.6; }
4951
+ #codex-overleaf-panel .recent-projects-unavailable-row { display: grid; grid-template-columns: minmax(0, 1fr) 24px; align-items: center; gap: 8px; margin: 10px 5px 0; }
4952
+ #codex-overleaf-panel .recent-projects-unavailable-row .recent-projects-row { min-width: 0; padding: 0; border: 0; background: transparent; color: var(--tl-fg-3); font-size: 12px; text-align: start; }
4953
+ #codex-overleaf-panel .recent-projects-menu { position: relative; justify-self: end; flex: 0 0 auto; }
4954
+ #codex-overleaf-panel .recent-projects-menu > summary {
5148
4955
  display: flex;
5149
4956
  align-items: center;
5150
- justify-content: space-between;
5151
- margin-top: auto;
5152
- padding: 10px 12px;
5153
- border: 1px solid var(--tl-border);
5154
- border-radius: 6px;
4957
+ justify-content: center;
4958
+ width: 24px;
4959
+ height: 28px;
4960
+ padding: 0;
4961
+ border-radius: 5px;
4962
+ color: var(--tl-fg-3);
4963
+ font-size: 18px;
4964
+ line-height: 1;
4965
+ cursor: pointer;
4966
+ list-style: none;
4967
+ }
4968
+ #codex-overleaf-panel .recent-projects-menu > summary::-webkit-details-marker { display: none; }
4969
+ #codex-overleaf-panel .recent-projects-menu > summary:hover { background: var(--tl-hover); color: var(--tl-fg-1); }
4970
+ #codex-overleaf-panel .recent-projects-menu [data-recent-menu-actions] {
4971
+ position: absolute;
4972
+ top: calc(100% + 5px);
4973
+ inset-inline-end: 0;
4974
+ z-index: 20;
4975
+ display: grid;
4976
+ min-width: 180px;
4977
+ max-width: min(260px, calc(var(--codex-overleaf-panel-width, 380px) - 56px));
4978
+ padding: 4px;
4979
+ border: 1px solid var(--tl-border-strong);
4980
+ border-radius: 8px;
5155
4981
  background: var(--tl-surface-1);
4982
+ box-shadow: 0 7px 24px rgba(0, 0, 0, 0.18);
4983
+ }
4984
+ #codex-overleaf-panel .recent-projects-menu:not([open]) > [data-recent-menu-actions] { display: none; }
4985
+ #codex-overleaf-panel .recent-projects-menu [data-recent-menu-actions] > button {
4986
+ display: block;
4987
+ width: 100%;
4988
+ min-height: 32px;
4989
+ padding: 8px 10px;
4990
+ border: 0;
4991
+ border-radius: 4px;
4992
+ background: transparent;
5156
4993
  color: var(--tl-fg-2);
5157
4994
  font-size: 12px;
4995
+ line-height: 1.4;
4996
+ text-align: start;
4997
+ white-space: normal;
4998
+ overflow-wrap: anywhere;
5158
4999
  cursor: pointer;
5159
5000
  }
5160
-
5161
- #codex-overleaf-panel .recent-projects-settings-entry:hover {
5162
- border-color: var(--tl-border-strong);
5163
- background: var(--tl-surface-2);
5001
+ #codex-overleaf-panel .recent-projects-menu [data-recent-menu-actions] > button:hover:not(:disabled) { background: var(--tl-hover); }
5002
+ #codex-overleaf-panel .recent-projects-menu [data-recent-menu-actions] > :is([data-project-clear], [data-row-cleanup], [data-session-delete-dash]) { color: var(--tl-fail); }
5003
+ #codex-overleaf-panel .recent-projects-menu [data-recent-menu-actions] > [data-project-conversations] { margin-top: 4px; border-top: 1px solid var(--tl-border); border-radius: 0 0 4px 4px; }
5004
+ #codex-overleaf-panel .recent-projects-menu [data-recent-menu-actions] > button:disabled { opacity: 0.45; cursor: not-allowed; }
5005
+ #codex-overleaf-panel .recent-projects-session-rename-input {
5006
+ width: 100%;
5007
+ min-width: 0;
5008
+ padding: 4px 6px;
5009
+ border: 1px solid var(--tl-accent);
5010
+ border-radius: 4px;
5011
+ background: var(--tl-surface-0);
5012
+ color: var(--tl-fg-1);
5013
+ font-size: 13px;
5164
5014
  }
5165
-
5166
- #codex-overleaf-panel .recent-projects-settings-entry-label::after {
5167
- content: "›";
5168
- margin-left: 8px;
5015
+ #codex-overleaf-panel .recent-projects-settings-entry {
5016
+ display: inline-flex;
5017
+ align-items: center;
5018
+ align-self: flex-start;
5019
+ margin-top: auto;
5020
+ padding: 8px 4px 0;
5021
+ border: 0;
5022
+ background: transparent;
5169
5023
  color: var(--tl-fg-3);
5024
+ font-size: 11px;
5025
+ line-height: 1.5;
5026
+ cursor: pointer;
5170
5027
  }
5028
+ #codex-overleaf-panel .recent-projects-settings-entry:hover { color: var(--tl-fg-1); }
5029
+ #codex-overleaf-panel .recent-projects-settings-entry-label::after { content: "\203a"; margin-inline-start: 8px; }
5030
+ #codex-overleaf-panel .recent-projects-root :is(button, summary, [role="button"]):focus-visible { outline: 2px solid var(--tl-accent); outline-offset: 3px; }
5171
5031
 
5172
5032
  /* Spec §5.9 — when the panel opens settings in account scope, hide the
5173
5033
  project-only sections so only locale / display / global skills + the
@@ -5180,20 +5040,18 @@
5180
5040
 
5181
5041
  /* v1.7.5: dashboard "Show all projects" expander below the 10-row fold. */
5182
5042
  #codex-overleaf-panel .recent-projects-show-all {
5183
- display: block;
5184
- width: 100%;
5185
- margin-top: 6px;
5186
- padding: 6px 10px;
5043
+ align-self: flex-start;
5044
+ padding: 8px 0;
5045
+ border: 0;
5187
5046
  background: transparent;
5188
- border: 1px dashed var(--tl-border, #2a2a2a);
5189
- border-radius: 6px;
5190
- color: var(--tl-fg-3, #8a8a8a);
5191
- font-size: 11.5px;
5047
+ color: var(--tl-fg-3);
5048
+ font-size: 12px;
5192
5049
  cursor: pointer;
5193
5050
  }
5051
+
5194
5052
  #codex-overleaf-panel .recent-projects-show-all:hover {
5195
- color: var(--tl-fg-1, #e4e4e4);
5196
- border-color: var(--tl-fg-3, #8a8a8a);
5053
+ color: var(--tl-fg-1);
5054
+ text-decoration: underline;
5197
5055
  }
5198
5056
 
5199
5057
  /* v1.7.5: jump-to-turn dropdown pinned above the run history. */
@@ -5315,15 +5173,6 @@
5315
5173
  border-radius: 50%;
5316
5174
  animation: tl-spin 800ms linear infinite;
5317
5175
  }
5318
- /* v1.8.2: the expand toggle stays a slim icon strip — modestly wider than
5319
- the original 26px for the miss-click fix, but proportionate to the row. */
5320
- #codex-overleaf-panel .recent-projects-row-expand {
5321
- width: 32px;
5322
- }
5323
- #codex-overleaf-panel .recent-projects-row-sessions {
5324
- color: var(--tl-fg-3);
5325
- font-size: 10.5px;
5326
- }
5327
5176
  #codex-overleaf-panel .recent-projects-session-row--linked {
5328
5177
  cursor: pointer;
5329
5178
  }