codex-overleaf-link 2.4.0 → 2.5.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.
Files changed (327) hide show
  1. package/README.md +272 -311
  2. package/README.zh-CN.md +287 -326
  3. package/extension/bootstrap/background.js +47 -10
  4. package/extension/bootstrap/manifest.template.json +9 -4
  5. package/extension/bootstrap/popup.html +10 -16
  6. package/extension/bootstrap/update.js +25 -2
  7. package/extension/runtime-manifest.json +3 -1
  8. package/extension/src/background.js +28 -3
  9. package/extension/src/backgroundSharedSessions.js +380 -0
  10. package/extension/src/backgroundUpdateCoordinator.js +442 -379
  11. package/extension/src/content/activeTurnControl.js +8 -0
  12. package/extension/src/content/assetTransferBroker.js +186 -12
  13. package/extension/src/content/changeHistoryView.js +175 -0
  14. package/extension/src/content/composerAttachments.js +24 -22
  15. package/extension/src/content/composerPanel.js +23 -8
  16. package/extension/src/content/contentRuntime.js +572 -571
  17. package/extension/src/content/diagnosticsController.js +1 -2
  18. package/extension/src/content/diagnosticsExport.js +222 -0
  19. package/extension/src/content/diagnosticsPanel.js +48 -19
  20. package/extension/src/content/diffReviewPanel.js +8 -5
  21. package/extension/src/content/generated/content.bundle.js +8974 -1781
  22. package/extension/src/content/generated/content.bundle.meta.json +22 -3
  23. package/extension/src/content/legacyGlobalRegistry.js +19 -1
  24. package/extension/src/content/localSkillsPanel.js +42 -7
  25. package/extension/src/content/markdownDomRenderer.js +9 -4
  26. package/extension/src/content/modelPicker.js +1 -1
  27. package/extension/src/content/pageBridgeClient.js +18 -3
  28. package/extension/src/content/panelMaintenance.js +51 -120
  29. package/extension/src/content/panelRenderer.js +4 -0
  30. package/extension/src/content/pendingInputView.js +109 -76
  31. package/extension/src/content/providerSettingsCoordinator.js +17 -6
  32. package/extension/src/content/providerSettingsDialog.js +661 -108
  33. package/extension/src/content/recentProjects.js +364 -356
  34. package/extension/src/content/runActivitySummary.js +631 -0
  35. package/extension/src/content/runController.js +3 -1
  36. package/extension/src/content/runFailureNotice.js +14 -1
  37. package/extension/src/content/runGuidanceController.js +4 -3
  38. package/extension/src/content/runPresence.js +306 -0
  39. package/extension/src/content/runQueueScheduler.js +2 -1
  40. package/extension/src/content/runResultActions.js +123 -3
  41. package/extension/src/content/runTimelineView.js +194 -164
  42. package/extension/src/content/scopedPersistenceCoordinator.js +2 -1
  43. package/extension/src/content/scopedPersistencePanelState.js +45 -2
  44. package/extension/src/content/selectionContextView.js +300 -0
  45. package/extension/src/content/sessionPersistence.js +10 -2
  46. package/extension/src/content/settingsPanel.js +93 -54
  47. package/extension/src/content/settingsWorkbench.js +374 -0
  48. package/extension/src/content/sharedSessionViewSync.js +72 -0
  49. package/extension/src/content/subagentActivityView.js +195 -0
  50. package/extension/src/content/trackedChangeCaptureController.js +7 -3
  51. package/extension/src/content/updateNotice.js +121 -50
  52. package/extension/src/content/writebackController.js +257 -0
  53. package/extension/src/content/writebackOrchestrator.js +146 -141
  54. package/extension/src/content/writebackPlan.js +231 -0
  55. package/extension/src/content/writebackRecovery.js +122 -0
  56. package/extension/src/content/writingStyleSettings.js +576 -0
  57. package/extension/src/content/writtenChangesView.js +152 -0
  58. package/extension/src/page/binaryAssetUploader.js +97 -19
  59. package/extension/src/page/overleafProjectSnapshot.js +1 -0
  60. package/extension/src/page/referenceProjects.js +148 -0
  61. package/extension/src/page/saveState.js +58 -3
  62. package/extension/src/page/snapshotRouter.js +44 -13
  63. package/extension/src/page/textCoordinates.js +102 -0
  64. package/extension/src/page/textFileCreator.js +350 -59
  65. package/extension/src/page/trackedChangeCapture.js +42 -56
  66. package/extension/src/page/trackedChangeOwnership.js +198 -0
  67. package/extension/src/page/trackedChangeReplay.js +164 -0
  68. package/extension/src/page/trackedChangesLifecycle.js +139 -150
  69. package/extension/src/page/treeOperations.js +36 -29
  70. package/extension/src/page/writebackReceiptJournal.js +112 -0
  71. package/extension/src/page/writebackRouter.js +176 -136
  72. package/extension/src/pageBridge.js +59 -101
  73. package/extension/src/popup.js +203 -59
  74. package/extension/src/shared/agentTranscript.js +18 -4
  75. package/extension/src/shared/auditRecords.js +71 -0
  76. package/extension/src/shared/changeHistoryModel.js +94 -0
  77. package/extension/src/shared/compatibility.js +1 -1
  78. package/extension/src/shared/compileAdapter.js +42 -0
  79. package/extension/src/shared/failureReasons.js +20 -0
  80. package/extension/src/shared/globalPreferences.js +1 -1
  81. package/extension/src/shared/i18n.js +187 -65
  82. package/extension/src/shared/managedUpdateProjection.js +6 -3
  83. package/extension/src/shared/pageRpcContract.js +7 -1
  84. package/extension/src/shared/providerProfiles.js +109 -0
  85. package/extension/src/shared/runActivityModel.js +361 -0
  86. package/extension/src/shared/runExecutionSnapshot.js +8 -2
  87. package/extension/src/shared/runExecutionSnapshotCodec.js +16 -4
  88. package/extension/src/shared/scopedPersistenceBrowserAdapter.js +6 -3
  89. package/extension/src/shared/selectionContext.js +28 -0
  90. package/extension/src/shared/sessionState.js +97 -6
  91. package/extension/src/shared/sharedSessionBridge.js +288 -0
  92. package/extension/src/shared/storageDb.js +23 -55
  93. package/extension/src/shared/storageMigration.js +3 -0
  94. package/extension/src/shared/storageRunActions.js +54 -4
  95. package/extension/src/shared/storageValuePruning.js +40 -0
  96. package/extension/src/shared/subagentActivityModel.js +174 -0
  97. package/extension/src/shared/undoOperations.js +87 -0
  98. package/extension/src/shared/updateConsent.js +37 -8
  99. package/extension/src/shared/writebackIntent.js +62 -0
  100. package/extension/src/shared/writebackSettlement.js +29 -10
  101. package/extension/src/shared/writingStyle.js +33 -0
  102. package/extension/styles/panel.css +2136 -744
  103. package/extension/styles/popup.css +110 -0
  104. package/native-host/src/anthropicBridgeRequest.js +2 -1
  105. package/native-host/src/codexModelRecovery.js +107 -0
  106. package/native-host/src/codexPromptAssembly.js +2 -0
  107. package/native-host/src/codexProviderLaunch.js +3 -3
  108. package/native-host/src/codexRuntimeIdentity.js +1 -0
  109. package/native-host/src/codexSessionRunner.js +146 -177
  110. package/native-host/src/codexSessionTiming.js +71 -0
  111. package/native-host/src/managedInstall.js +5 -4
  112. package/native-host/src/nativeEnvironment.js +70 -0
  113. package/native-host/src/nativeQuotas.js +15 -8
  114. package/native-host/src/overleafWorkspaceRules.js +16 -0
  115. package/native-host/src/processStopBarrier.js +80 -0
  116. package/native-host/src/providerModelCatalog.js +4 -3
  117. package/native-host/src/providerProfile.js +13 -1
  118. package/native-host/src/providerReasoning.js +9 -5
  119. package/native-host/src/providerStore.js +4 -0
  120. package/native-host/src/readProgressGuard.js +84 -17
  121. package/native-host/src/releaseTransport.js +14 -5
  122. package/native-host/src/selectionScope.js +58 -0
  123. package/native-host/src/skills/parallel-subagents/SKILL.md +31 -3
  124. package/native-host/src/skills/writing-style-builder/SKILL.md +146 -0
  125. package/native-host/src/subagentBroker.js +102 -98
  126. package/native-host/src/subagentTelemetry.js +316 -0
  127. package/native-host/src/subagentWorkspace.js +103 -0
  128. package/native-host/src/subagentWorkspacePath.js +31 -0
  129. package/native-host/src/taskRunnerRuntime.js +55 -5
  130. package/native-host/src/turnAttachments.js +113 -0
  131. package/native-host/src/updateManager.js +122 -12
  132. package/native-host/src/updateNetworkControl.js +75 -0
  133. package/native-host/src/updateTrust.js +21 -2
  134. package/native-host/src/vendor/pdfjs/LICENSE +177 -0
  135. package/native-host/src/vendor/pdfjs/SOURCE.txt +3 -0
  136. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  137. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  138. package/native-host/src/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
  139. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  140. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  141. package/native-host/src/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
  142. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  143. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  144. package/native-host/src/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  145. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  146. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  147. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  148. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  149. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  150. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  151. package/native-host/src/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
  152. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  153. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  154. package/native-host/src/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
  155. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  156. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  157. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  158. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  159. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  160. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  161. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  162. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  163. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  164. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  165. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  166. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  167. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  168. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  169. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  170. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  171. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  172. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  173. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  174. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  175. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  176. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  177. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  178. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  179. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  180. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  181. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  182. package/native-host/src/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
  183. package/native-host/src/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
  184. package/native-host/src/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  185. package/native-host/src/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  186. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  187. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  188. package/native-host/src/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  189. package/native-host/src/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  190. package/native-host/src/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  191. package/native-host/src/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  192. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  193. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  194. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  195. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  196. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  197. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  198. package/native-host/src/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
  199. package/native-host/src/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
  200. package/native-host/src/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
  201. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  202. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  203. package/native-host/src/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
  204. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  205. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  206. package/native-host/src/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
  207. package/native-host/src/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
  208. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  209. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  210. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  211. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  212. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  213. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  214. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  215. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  216. package/native-host/src/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
  217. package/native-host/src/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
  218. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  219. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  220. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  221. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  222. package/native-host/src/vendor/pdfjs/cmaps/H.bcmap +0 -0
  223. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  224. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  225. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  226. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  227. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  228. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  229. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  230. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  231. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  232. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  233. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  234. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  235. package/native-host/src/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
  236. package/native-host/src/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
  237. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  238. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  239. package/native-host/src/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
  240. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  241. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  242. package/native-host/src/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
  243. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  244. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  245. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  246. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  247. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  248. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  249. package/native-host/src/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
  250. package/native-host/src/vendor/pdfjs/cmaps/LICENSE +36 -0
  251. package/native-host/src/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
  252. package/native-host/src/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
  253. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  254. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  255. package/native-host/src/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
  256. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  257. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  258. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  259. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  260. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  261. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  262. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  263. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  264. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  265. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  266. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  267. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  268. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  269. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  270. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  271. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  272. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  273. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  274. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  275. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  276. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  277. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  278. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  279. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  280. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  281. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  282. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  283. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  284. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  285. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  286. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  287. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  288. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  289. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  290. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  291. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  292. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  293. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  294. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  295. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  296. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  297. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  298. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  299. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  300. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  301. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  302. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  303. package/native-host/src/vendor/pdfjs/cmaps/V.bcmap +0 -0
  304. package/native-host/src/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  305. package/native-host/src/vendor/pdfjs/pdf.mjs +26740 -0
  306. package/native-host/src/vendor/pdfjs/pdf.worker.mjs +62201 -0
  307. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  308. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  309. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  310. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  311. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  312. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  313. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  314. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  315. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  316. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  317. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  318. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
  319. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  320. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  321. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  322. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  323. package/native-host/src/writingStyleEvidence.js +102 -0
  324. package/native-host/src/writingStylePdfWorker.js +35 -0
  325. package/native-host/src/writingStyleProfile.js +165 -0
  326. package/native-host/src/writingStyleRuntime.js +447 -0
  327. package/package.json +1 -1
@@ -2,19 +2,21 @@
2
2
  "schemaVersion": 1,
3
3
  "entry": "extension/entries/content-entry.mjs",
4
4
  "output": "extension/src/content/generated/content.bundle.js",
5
- "sourceDigest": "f146d7e07b67706193fa5fcff26d7c9719826ac745aec9b745dd95c52413d27c",
6
- "outputDigest": "11993fd0746a026b1e74399060e70559eb569fca492fcdec36c2fb69a78d6b80",
7
- "byteLength": 2404976,
5
+ "sourceDigest": "a96cd1d3e417ecc9e124f48d9ad6dd728256c084f09a804d809299de8e4a7da3",
6
+ "outputDigest": "09a6e2a4d4c6be0f8f8ad284c601e6cdf1843be09161f70a225abd56277b9c19",
7
+ "byteLength": 2838686,
8
8
  "inputs": [
9
9
  "extension/entries/content-entry.mjs",
10
10
  "extension/src/content/activeTurnControl.js",
11
11
  "extension/src/content/applyResultFormatters.js",
12
12
  "extension/src/content/assetTransferBroker.js",
13
+ "extension/src/content/changeHistoryView.js",
13
14
  "extension/src/content/composerAttachments.js",
14
15
  "extension/src/content/composerPanel.js",
15
16
  "extension/src/content/contentRuntime.js",
16
17
  "extension/src/content/contextTray.js",
17
18
  "extension/src/content/diagnosticsController.js",
19
+ "extension/src/content/diagnosticsExport.js",
18
20
  "extension/src/content/diagnosticsPanel.js",
19
21
  "extension/src/content/diffReviewPanel.js",
20
22
  "extension/src/content/globalPreferencesController.js",
@@ -43,10 +45,12 @@
43
45
  "extension/src/content/providerSettingsDialog.js",
44
46
  "extension/src/content/recentProjects.js",
45
47
  "extension/src/content/reviewHunks.js",
48
+ "extension/src/content/runActivitySummary.js",
46
49
  "extension/src/content/runController.js",
47
50
  "extension/src/content/runFailureNotice.js",
48
51
  "extension/src/content/runGuidanceController.js",
49
52
  "extension/src/content/runGuidanceView.js",
53
+ "extension/src/content/runPresence.js",
50
54
  "extension/src/content/runQueueScheduler.js",
51
55
  "extension/src/content/runResultActions.js",
52
56
  "extension/src/content/runScrollLayout.js",
@@ -55,20 +59,28 @@
55
59
  "extension/src/content/scopedPersistenceCoordinator.js",
56
60
  "extension/src/content/scopedPersistenceDetachedCommit.js",
57
61
  "extension/src/content/scopedPersistencePanelState.js",
62
+ "extension/src/content/selectionContextView.js",
58
63
  "extension/src/content/sessionForkController.js",
59
64
  "extension/src/content/sessionManager.js",
60
65
  "extension/src/content/sessionMenuView.js",
61
66
  "extension/src/content/sessionPanel.js",
62
67
  "extension/src/content/sessionPersistence.js",
63
68
  "extension/src/content/settingsPanel.js",
69
+ "extension/src/content/settingsWorkbench.js",
70
+ "extension/src/content/sharedSessionViewSync.js",
71
+ "extension/src/content/subagentActivityView.js",
64
72
  "extension/src/content/themeController.js",
65
73
  "extension/src/content/trackedChangeCaptureController.js",
66
74
  "extension/src/content/updateIdle.js",
67
75
  "extension/src/content/updateNotice.js",
68
76
  "extension/src/content/writebackController.js",
69
77
  "extension/src/content/writebackOrchestrator.js",
78
+ "extension/src/content/writebackPlan.js",
79
+ "extension/src/content/writingStyleSettings.js",
80
+ "extension/src/content/writtenChangesView.js",
70
81
  "extension/src/shared/agentTranscript.js",
71
82
  "extension/src/shared/auditRecords.js",
83
+ "extension/src/shared/changeHistoryModel.js",
72
84
  "extension/src/shared/compatibility.js",
73
85
  "extension/src/shared/compileAdapter.js",
74
86
  "extension/src/shared/failureReasons.js",
@@ -84,6 +96,7 @@
84
96
  "extension/src/shared/projectFiles.js",
85
97
  "extension/src/shared/providerProfiles.js",
86
98
  "extension/src/shared/reviewing.js",
99
+ "extension/src/shared/runActivityModel.js",
87
100
  "extension/src/shared/runExecutionSnapshot.js",
88
101
  "extension/src/shared/runExecutionSnapshotCodec.js",
89
102
  "extension/src/shared/runInputQueue.js",
@@ -91,21 +104,27 @@
91
104
  "extension/src/shared/scopedPersistenceQueuePolicy.js",
92
105
  "extension/src/shared/scopedPersistenceReceipt.js",
93
106
  "extension/src/shared/scopedPersistenceTransaction.js",
107
+ "extension/src/shared/selectionContext.js",
94
108
  "extension/src/shared/sensitiveScan.js",
95
109
  "extension/src/shared/sessionState.js",
96
110
  "extension/src/shared/sessionTitle.js",
97
111
  "extension/src/shared/settlementFacts.js",
112
+ "extension/src/shared/sharedSessionBridge.js",
98
113
  "extension/src/shared/staleGuard.js",
99
114
  "extension/src/shared/storageDb.js",
100
115
  "extension/src/shared/storageKeys.js",
101
116
  "extension/src/shared/storageMigration.js",
102
117
  "extension/src/shared/storageRunActions.js",
103
118
  "extension/src/shared/storageSessionClaims.js",
119
+ "extension/src/shared/storageValuePruning.js",
120
+ "extension/src/shared/subagentActivityModel.js",
104
121
  "extension/src/shared/summary.js",
105
122
  "extension/src/shared/undoOperations.js",
106
123
  "extension/src/shared/writebackEvidenceProjection.js",
124
+ "extension/src/shared/writebackIntent.js",
107
125
  "extension/src/shared/writebackOperationEvidence.js",
108
126
  "extension/src/shared/writebackSettlement.js",
127
+ "extension/src/shared/writingStyle.js",
109
128
  "extension/vendor/katex/katex.min.js",
110
129
  "extension/vendor/markdown-it/markdown-it.min.js"
111
130
  ]
@@ -17,12 +17,18 @@
17
17
  'ApplyResultFormatters',
18
18
  'AssetTransferBroker',
19
19
  'AuditRecords',
20
+ 'SelectionContext',
21
+ 'SelectionContextView',
22
+ 'WritebackIntent',
23
+ 'ChangeHistoryModel',
24
+ 'ChangeHistoryView',
20
25
  'Compatibility',
21
26
  'ComposerAttachments',
22
27
  'ComposerPanel',
23
28
  'ContentRuntime',
24
29
  'ContextTray',
25
30
  'DiagnosticsController',
31
+ 'DiagnosticsExport',
26
32
  'DiagnosticsPanel',
27
33
  'DiffReviewPanel',
28
34
  'FailureReasons',
@@ -51,6 +57,9 @@
51
57
  'ProviderSettingsCoordinator',
52
58
  'RecentProjects',
53
59
  'ReviewHunks',
60
+ 'RunActivitySummary',
61
+ 'RunPresence',
62
+ 'RunActivityModel',
54
63
  'RunController',
55
64
  'RunExecutionSnapshot',
56
65
  'RunGuidanceController',
@@ -70,9 +79,13 @@
70
79
  'SessionPersistence',
71
80
  'SessionState',
72
81
  'SettingsPanel',
82
+ 'SharedSessionBridge',
83
+ 'SharedSessionViewSync',
73
84
  'StorageDb',
74
85
  'StorageKeys',
75
86
  'StorageMigration',
87
+ 'SubagentActivityModel',
88
+ 'SubagentActivityView',
76
89
  'Summary',
77
90
  'Theme',
78
91
  'TrackedChangeCaptureController',
@@ -80,8 +93,13 @@
80
93
  'UpdateIdle',
81
94
  'UpdateNotice',
82
95
  'WritebackController',
96
+ 'WritebackIntent',
83
97
  'WritebackOrchestrator',
84
- 'WritebackSettlement'
98
+ 'WritebackPlan',
99
+ 'WritebackSettlement',
100
+ 'WritingStyle',
101
+ 'WritingStyleSettings',
102
+ 'WrittenChangesView'
85
103
  ]);
86
104
 
87
105
  const SUPPORT_MODULES = Object.freeze([
@@ -104,11 +104,26 @@
104
104
  }
105
105
  }
106
106
 
107
+ function createSkillMark(id) {
108
+ const mark = document.createElement('span');
109
+ mark.className = 'codex-local-skill-icon';
110
+ mark.setAttribute('aria-hidden', 'true');
111
+ // Static, locally owned glyphs only; skill metadata never supplies SVG.
112
+ const glyph = id === 'annotated-rewrite'
113
+ ? '<path d="M3.2 12.8 4 9.7l6.6-6.6a1.4 1.4 0 0 1 2 2L6 11.7z"/><path d="m9.6 4.1 2.3 2.3"/>'
114
+ : id === 'parallel-subagents'
115
+ ? '<circle cx="4" cy="3.5" r="1.75"/><circle cx="12" cy="3.5" r="1.75"/><circle cx="8" cy="12.5" r="1.75"/><path d="M4 5.25v1.5A1.75 1.75 0 0 0 5.75 8.5h4.5A1.75 1.75 0 0 0 12 6.75v-1.5M8 8.5v2.25"/>'
116
+ : '<rect x="3" y="2.5" width="10" height="11" rx="2"/><path d="M6 6h4M6 9h4"/>';
117
+ mark.innerHTML = '<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" focusable="false">' + glyph + '</svg>';
118
+ return mark;
119
+ }
120
+
107
121
  function renderCodexOverleafSkillRow(list, skill, masterEnabled) {
108
122
  const id = String(skill?.id || '').trim();
109
123
  if (!id) {
110
124
  return;
111
125
  }
126
+ const compact = Boolean(list.closest?.('.codex-settings-workbench'));
112
127
  const row = document.createElement('div');
113
128
  row.className = 'codex-local-skill-row';
114
129
  row.dataset.scope = 'codex-overleaf';
@@ -125,15 +140,34 @@
125
140
  const trimmedTitle = typeof skill.title === 'string' ? skill.title.trim() : '';
126
141
  text.textContent = trimmedTitle || id;
127
142
  text.title = id;
128
- row.append(text);
143
+ text.className = 'codex-local-skill-name';
144
+ const copy = document.createElement('div');
145
+ copy.className = 'codex-local-skill-copy';
146
+ copy.append(text);
147
+ const descriptions = {
148
+ 'annotated-rewrite': tx('Guided editing for document revisions.', '用于文稿修订的编辑流程。'),
149
+ 'parallel-subagents': tx('Split independent subtasks across multiple agents.', '将相互独立的子任务分配给多个 agent。')
150
+ };
151
+ const description = descriptions[id]
152
+ || (typeof skill.description === 'string' ? skill.description.replace(/\s+/g, ' ').trim() : '');
153
+ if (description) {
154
+ const help = document.createElement('span');
155
+ help.className = 'codex-local-skill-description';
156
+ help.textContent = description;
157
+ help.title = description;
158
+ copy.append(help);
159
+ }
160
+ if (compact) row.append(createSkillMark(id));
161
+ row.append(copy);
162
+ const controls = compact ? document.createElement('div') : row;
163
+ if (compact) controls.className = 'codex-local-skill-controls';
129
164
 
130
- // Per-skill enable switch — appended last so it sits on the right of the
131
- // row, after the Remove control. It remains a real checkbox input.
165
+ // Keep the same native input and callbacks; only its visual grouping changes.
132
166
  const toggle = document.createElement('input');
133
167
  toggle.type = 'checkbox';
134
168
  toggle.className = 'codex-switch';
135
169
  toggle.checked = isCodexOverleafSkillEnabled(id);
136
- toggle.setAttribute('aria-label', tr('codexOverleafSkillEnableToggle'));
170
+ toggle.setAttribute('aria-label', (trimmedTitle || id) + ': ' + tr('codexOverleafSkillEnableToggle'));
137
171
  if (!masterEnabled) {
138
172
  toggle.disabled = true;
139
173
  }
@@ -212,15 +246,16 @@
212
246
  });
213
247
 
214
248
  actions.append(removeBtn);
215
- row.append(actions);
249
+ controls.append(actions);
216
250
 
217
251
  // Store references so resetConfirmingRow can find and reset this row.
218
252
  row._exitConfirming = exitConfirming;
219
253
  row._skillId = id;
220
254
  }
221
255
 
222
- // Per-skill enable switch is always the last child (rightmost).
223
- row.append(toggle);
256
+ // The switch remains rightmost, including during removal confirmation.
257
+ controls.append(toggle);
258
+ if (compact) row.append(controls);
224
259
 
225
260
  list.append(row);
226
261
  }
@@ -454,11 +454,16 @@
454
454
  const text = String(textNode.textContent || '');
455
455
  const match = text.match(/^(\s*)(Conclusion:|结论:|Changes:|修改:)(\s*)/);
456
456
  if (!match || !textNode.parentNode) continue;
457
+ // The answer speaks for itself: older stored reports still begin with a
458
+ // "Conclusion:" prefix, which is dropped rather than labelled.
459
+ if (['Conclusion:', '结论:'].includes(match[2])) {
460
+ textNode.textContent = `${match[1]}${text.slice(match[0].length)}`;
461
+ if (!String(block.textContent || '').trim()) block.remove?.();
462
+ continue;
463
+ }
457
464
  const label = document.createElement('span');
458
465
  label.className = 'run-system-label';
459
- label.dataset.systemLabel = ['Conclusion:', '结论:'].includes(match[2])
460
- ? 'conclusion'
461
- : 'changes';
466
+ label.dataset.systemLabel = 'changes';
462
467
  label.textContent = `${match[2]}${match[3]}`;
463
468
  textNode.textContent = `${match[1]}${text.slice(match[0].length)}`;
464
469
  textNode.parentNode.insertBefore(label, textNode);
@@ -487,7 +492,7 @@
487
492
  const check = document.createElement('span');
488
493
  check.className = 'run-change-summary__check';
489
494
  check.setAttribute('aria-hidden', 'true');
490
- check.textContent = '✓';
495
+ check.innerHTML = '<svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg>';
491
496
  const text = document.createElement('span');
492
497
  text.textContent = tx(
493
498
  `${syncedFiles} ${syncedFiles === 1 ? 'file' : 'files'} synced`,
@@ -427,7 +427,7 @@
427
427
 
428
428
  const check = document.createElement('span');
429
429
  check.className = 'codex-model-config-check';
430
- check.textContent = '✓';
430
+ check.innerHTML = '<svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg>';
431
431
  check.setAttribute('aria-hidden', 'true');
432
432
  button.append(check);
433
433
  return button;
@@ -9,7 +9,7 @@
9
9
  ['src/shared/reviewing.js', 'codex-overleaf-reviewing-script'],
10
10
  ['src/shared/projectFiles.js', 'codex-overleaf-project-files-script'],
11
11
  ['src/shared/compatibility.js', 'codex-overleaf-compatibility-page-script'],
12
- ['src/shared/pageRpcContract.js', 'codex-overleaf-page-rpc-contract-script'],
12
+ ['src/shared/pageRpcContract.js', 'codex-overleaf-page-rpc-contract-script', true],
13
13
  ['src/shared/staleGuard.js', 'codex-overleaf-stale-guard-script'],
14
14
  ['src/shared/compileAdapter.js', 'codex-overleaf-compile-adapter-script'],
15
15
  ['src/shared/sensitiveScan.js', 'codex-overleaf-sensitive-scan-script'],
@@ -24,10 +24,15 @@
24
24
  ['src/page/textFileCreator.js', 'codex-overleaf-text-file-creator-script', true],
25
25
  ['src/page/binaryAssetUploader.js', 'codex-overleaf-binary-asset-uploader-script', true],
26
26
  ['src/page/snapshotRouter.js', 'codex-overleaf-snapshot-router-script'],
27
+ ['src/page/referenceProjects.js', 'codex-overleaf-reference-projects-script', true],
27
28
  ['src/page/writeGuard.js', 'codex-overleaf-write-guard-script', true],
29
+ ['src/page/trackedChangeOwnership.js', 'codex-overleaf-tracked-change-ownership-script', true],
28
30
  ['src/page/trackedChangeCapture.js', 'codex-overleaf-tracked-change-capture-script', true],
31
+ ['src/page/trackedChangeReplay.js', 'codex-overleaf-tracked-change-replay-script', true],
29
32
  ['src/page/trackedChangesLifecycle.js', 'codex-overleaf-tracked-changes-lifecycle-script', true],
30
33
  ['src/page/writebackRouter.js', 'codex-overleaf-writeback-router-script', true],
34
+ ['src/page/writebackReceiptJournal.js', 'codex-overleaf-writeback-receipt-script', true],
35
+ ['src/page/textCoordinates.js', 'codex-overleaf-text-coordinates-script', true],
31
36
  ['src/pageBridge.js', 'codex-overleaf-page-bridge-script', true]
32
37
  ]);
33
38
  const OPTIONAL_OT_SCRIPTS = Object.freeze([
@@ -44,6 +49,7 @@
44
49
  const Contract = options.contract;
45
50
  const Compatibility = options.compatibility;
46
51
  const timeoutOverrides = { ...(options.timeoutOverrides || {}) };
52
+ const now = options.now || Date.now;
47
53
  const revision = Contract.REVISION;
48
54
  const capability = createCapability(cryptoImpl);
49
55
  const activeCancellationHandlers = new Map();
@@ -66,9 +72,17 @@
66
72
  function send(method, params, policy = {}) {
67
73
  const id = cryptoImpl.randomUUID();
68
74
  return new Promise((resolve, reject) => {
69
- const timeoutMs = Number.isFinite(Number(policy.timeoutMs))
75
+ const requestTimeoutMs = Number.isFinite(Number(policy.timeoutMs))
70
76
  ? Number(policy.timeoutMs)
71
77
  : Contract.resolveTimeoutMs(method, timeoutOverrides);
78
+ const remainingMs = params?.deadlineAt == null ? Infinity
79
+ : Number.isFinite(params.deadlineAt) ? params.deadlineAt - now() : 0;
80
+ if (remainingMs <= 0) {
81
+ resolve({ ok: false, code: 'writeback_deadline_exceeded', changedDocument: false,
82
+ rpcMethod: method, error: 'The operation deadline expired before this request was sent.' });
83
+ return;
84
+ }
85
+ const timeoutMs = Math.min(requestTimeoutMs, remainingMs);
72
86
  const cancellable = policy.cancellation === 'content_abort';
73
87
  let settled = false;
74
88
  let timeout = null;
@@ -96,7 +110,8 @@
96
110
  rejectOnce(error);
97
111
  }
98
112
  timeout = windowRef.setTimeout(() => {
99
- resolveOnce({ ok: false, error: 'Page bridge timed out' });
113
+ resolveOnce({ ok: false, error: 'Page bridge timed out',
114
+ ...(method === 'applyOperations' ? { code: 'page_bridge_timeout', rpcMethod: method, requestId: id } : {}) });
100
115
  }, timeoutMs);
101
116
  function onMessage(event) {
102
117
  if (event.source !== windowRef
@@ -33,124 +33,47 @@
33
33
  StorageDb
34
34
  } = deps;
35
35
 
36
- // --- Change history (v1.7.5): the audit log finally gets a read path. ---
37
- // Loaded lazily when the Settings card is expanded; newest 50 project runs.
38
- let auditHistoryRecords = [];
39
-
40
- async function renderAuditHistoryPanel() {
41
- const container = getSettingsPanelInstance()?.container;
42
- const list = container?.querySelector('[data-history-list]');
43
- if (!list) {
44
- return;
45
- }
46
- const filterInput = container.querySelector('[data-history-filter]');
47
- if (filterInput && !filterInput.placeholder) {
48
- filterInput.placeholder = tx('Filter by file or task\u2026', '按文件名或任务过滤…');
49
- }
50
- list.textContent = tx('Loading\u2026', '正在加载…');
51
- let records = [];
52
- try {
53
- records = StorageDb?.getAllByIndex
54
- ? await StorageDb.getAllByIndex('auditLogs', 'projectId', getCurrentProjectId())
55
- : [];
56
- } catch (error) {
57
- list.textContent = tx(`Could not load change history: ${error.message}`, `无法加载变更历史:${error.message}`);
58
- return;
59
- }
60
- auditHistoryRecords = (records || [])
61
- .sort((a, b) => String(b?.createdAt || '').localeCompare(String(a?.createdAt || '')))
62
- .slice(0, 50);
63
- applyAuditHistoryFilter();
64
- }
65
-
66
- function applyAuditHistoryFilter() {
67
- const container = getSettingsPanelInstance()?.container;
68
- const list = container?.querySelector('[data-history-list]');
69
- if (!list) {
70
- return;
71
- }
72
- const query = String(container.querySelector('[data-history-filter]')?.value || '').trim().toLowerCase();
73
- const filePaths = record => []
74
- .concat(record?.appliedFiles || [], record?.changedFiles || [])
75
- .map(file => (file && typeof file === 'object') ? file.path : file)
76
- .filter(Boolean);
77
- const rows = auditHistoryRecords.filter(record => {
78
- if (!query) {
79
- return true;
80
- }
81
- return [record?.promptSummary || '', ...filePaths(record)].join(' ').toLowerCase().includes(query);
82
- });
83
- list.replaceChildren();
84
- if (!rows.length) {
85
- const empty = document.createElement('div');
86
- empty.className = 'codex-history-empty';
87
- empty.textContent = query
88
- ? tx('No recorded changes match this filter.', '没有匹配该过滤条件的变更记录。')
89
- : tx('No recorded changes for this project yet.', '本项目还没有已记录的变更。');
90
- list.append(empty);
91
- return;
92
- }
93
- for (const record of rows) {
94
- const row = document.createElement('div');
95
- row.className = 'codex-history-row';
96
- row.dataset.resultStatus = record.resultStatus || '';
97
- const when = document.createElement('div');
98
- when.className = 'codex-history-when';
99
- when.textContent = record.createdAt ? new Date(record.createdAt).toLocaleString() : '';
100
- const task = document.createElement('div');
101
- task.className = 'codex-history-task';
102
- task.textContent = record.promptSummary || '';
103
- task.title = record.promptSummary || '';
104
- const files = document.createElement('div');
105
- files.className = 'codex-history-files';
106
- const applied = (record.appliedFiles || [])
107
- .map(file => (file && typeof file === 'object') ? file.path : file)
108
- .filter(Boolean);
109
- files.textContent = applied.length
110
- ? applied.join(' \u00b7 ')
111
- : tx('No files were written.', '未写入文件。');
112
- row.append(when, task, files);
113
- // v1.8.0: rows jump to the run they describe (turnId === run.id).
114
- if (record.sessionId && record.turnId && typeof onHistoryRowJump === 'function') {
115
- row.classList.add('codex-history-row--linked');
116
- row.setAttribute('role', 'button');
117
- row.tabIndex = 0;
118
- const jump = () => onHistoryRowJump(record);
119
- row.addEventListener('click', jump);
120
- row.addEventListener('keydown', keyEvent => {
121
- if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {
122
- keyEvent.preventDefault();
123
- jump();
124
- }
125
- });
126
- }
127
- list.append(row);
128
- }
129
- }
36
+ // Read-only projection over scoped audit/session records. Prompt redaction
37
+ // remains owned by the audit writer; this view never persists task text.
38
+ const historyView = deps.ChangeHistoryView.create({
39
+ tx, StorageDb, getState, getCurrentProjectId, getSettingsPanelInstance,
40
+ getAccountScopeId: deps.getAccountScopeId,
41
+ sanitizeText: deps.sanitizeText,
42
+ onHistoryRowJump
43
+ });
44
+ function renderAuditHistoryPanel() { return historyView.load(); }
45
+ function applyAuditHistoryFilter() { historyView.filter(); }
130
46
 
131
47
  // --- History & storage (v1.7.5): usage summary + clear-all in Settings ---
132
48
  let storageUsageRequestId = 0;
133
49
  function refreshStorageUsageSummary() {
134
- const node = getSettingsPanelInstance()?.container?.querySelector('[data-storage-usage]');
135
- if (!node) {
136
- return;
137
- }
50
+ const host = getSettingsPanelInstance()?.container;
51
+ const node = host?.querySelector('[data-storage-usage]');
52
+ if (!node) return;
53
+ const estimateNode = host.querySelector('[data-storage-estimate]') || node;
138
54
  const requestId = ++storageUsageRequestId;
139
55
  const projectId = getCurrentProjectId?.();
140
- const isCurrent = () => requestId === storageUsageRequestId && projectId === getCurrentProjectId?.()
56
+ const accountScopeId = deps.getAccountScopeId?.();
57
+ const settingsScope = getPanel?.()?.dataset?.settingsScope;
58
+ const isCurrent = () => requestId === storageUsageRequestId
59
+ && projectId === getCurrentProjectId?.()
60
+ && accountScopeId === deps.getAccountScopeId?.()
61
+ && settingsScope === getPanel?.()?.dataset?.settingsScope
141
62
  && getSettingsPanelInstance()?.container?.querySelector('[data-storage-usage]') === node;
142
63
  const current = getState();
143
- const sessionCount = Array.isArray(current?.sessions) ? current.sessions.length : 0;
144
- const runCount = Array.isArray(current?.runs) ? current.runs.length : 0;
145
- const counts = tx(
146
- `${sessionCount} loaded session(s) in this project · ${runCount} run(s) in the active session`,
147
- `当前项目已加载 ${sessionCount} 个会话 · 当前会话 ${runCount} 轮运行`
148
- );
149
- // Dynamic text belongs to this renderer, not the loading-label translator.
64
+ const sessions = Array.isArray(current?.sessions) ? current.sessions : [];
65
+ const runIds = new Set(sessions.flatMap(session => session.id === current.activeSessionId
66
+ ? current.runs || [] : session.runs || []).map(run => run?.id).filter(Boolean));
67
+ const counts = settingsScope === 'account'
68
+ ? tx('Saved history across projects in this browser', '当前浏览器中跨项目保存的历史')
69
+ : tx(sessions.length + ' loaded conversations · ' + runIds.size + ' runs in this project',
70
+ '本项目已加载 ' + sessions.length + ' 个对话 · ' + runIds.size + ' 轮运行');
150
71
  node.removeAttribute?.('data-i18n');
151
72
  node.textContent = counts;
152
- const unavailable = () => {
153
- if (isCurrent()) node.textContent = tx(`${counts} · Site storage estimate unavailable`, `${counts} · 本站点容量暂无法估算`);
73
+ estimateNode.removeAttribute?.('data-i18n');
74
+ if (estimateNode !== node) estimateNode.textContent = tx('Estimating site storage…', '正在估算站点占用…');
75
+ const showEstimate = value => {
76
+ if (isCurrent()) estimateNode.textContent = estimateNode === node ? counts + ' · ' + value : value;
154
77
  };
155
78
  let timer;
156
79
  const estimate = Promise.resolve().then(() => navigator.storage?.estimate?.());
@@ -158,11 +81,16 @@
158
81
  return Promise.race([estimate, deadline]).then(info => {
159
82
  if (!isCurrent()) return;
160
83
  const usage = info?.usage;
161
- if (!Number.isFinite(usage) || usage < 0) { unavailable(); return; }
84
+ if (!Number.isFinite(usage) || usage < 0) {
85
+ showEstimate(tx('Site storage estimate unavailable; saved history is still accessible.', '暂无法估算站点容量,仍可查看已保存的历史。'));
86
+ return;
87
+ }
162
88
  const mb = usage / (1024 * 1024);
163
- const size = usage === 0 ? '0 KB' : mb >= 1 ? `${mb.toFixed(1)} MB` : `${Math.max(1, Math.round(usage / 1024))} KB`;
164
- node.textContent = tx(`${counts} · Site total ~${size}`, `${counts} · 本站点总占用约 ${size}`);
165
- }).catch(unavailable).finally(() => clearTimeout(timer));
89
+ const size = usage === 0 ? '0 KB' : mb >= 1 ? mb.toFixed(1) + ' MB' : Math.max(1, Math.round(usage / 1024)) + ' KB';
90
+ showEstimate(tx('Site total ~' + size + ' (includes Overleaf data; not extension-only usage).',
91
+ '本站点总占用约 ' + size + ',包含 Overleaf 数据,并非插件单独占用。'));
92
+ }).catch(() => showEstimate(tx('Site storage estimate unavailable.', '暂无法估算站点容量。')))
93
+ .finally(() => clearTimeout(timer));
166
94
  }
167
95
 
168
96
  async function clearAllHistoryWithConfirm() {
@@ -171,12 +99,12 @@
171
99
  return;
172
100
  }
173
101
  const confirmed = await showPluginConfirm({
174
- title: tx('Clear all history?', '清空全部历史?'),
102
+ title: tx('Clear local history?', '清理本地历史?'),
175
103
  message: tx(
176
- 'This permanently deletes every stored session, run and audit record for ALL projects — including the dashboard project list and cached project names. Project settings and rules are kept. This cannot be undone.',
177
- '将永久删除所有项目的全部会话、运行与审计记录——包括仪表盘的项目列表与缓存的项目名。项目设置与规则会保留。此操作不可撤销。'
104
+ 'This permanently removes saved conversations, run and change records, undo information, and recent-project entries for ALL projects in this browser. Overleaf project files will not be deleted or reverted. Project settings and rules are kept. Removed history cannot be recovered.',
105
+ '将永久清理当前浏览器中所有项目的对话、运行与修改记录、撤销信息及最近项目条目。Overleaf 项目文件不会被删除或还原,项目设置与规则会保留。清理后的历史无法恢复。'
178
106
  ),
179
- confirmLabel: tx('Delete everything', '全部删除'),
107
+ confirmLabel: tx('Clear local history', '清理本地历史'),
180
108
  destructive: true
181
109
  });
182
110
  if (!confirmed) {
@@ -184,6 +112,7 @@
184
112
  }
185
113
  try {
186
114
  await StorageDb?.clearAllStores?.();
115
+ historyView.invalidate();
187
116
  // v1.8.1: the dashboard's project-name cache lives in
188
117
  // chrome.storage.local, outside the IndexedDB stores — clear it too so
189
118
  // no (potentially sensitive) project titles outlive the wipe.
@@ -200,7 +129,8 @@
200
129
  await saveState();
201
130
  applyStateToPanel();
202
131
  refreshStorageUsageSummary();
203
- showPluginToast(tx('All history cleared.', '已清空全部历史。'));
132
+ void renderAuditHistoryPanel();
133
+ showPluginToast(tx('Local history cleared. Overleaf files are unchanged.', '本地历史已清理,Overleaf 文件保持不变。'));
204
134
  getPanel()?.querySelector('[data-task]')?.focus();
205
135
  }
206
136
 
@@ -230,13 +160,14 @@
230
160
  showPluginToast(tx('Nothing to refill: the original task text is unavailable.', '无法回填:原任务文本不可用。'));
231
161
  return;
232
162
  }
233
- prepareRetryReplacement?.(run || null);
163
+ prepareRetryReplacement?.(run || null, task);
234
164
  input.value = task;
235
165
  getState().task = task;
236
166
  autosizeTaskTextarea();
237
167
  syncComposerSendAvailability();
238
- saveStateSoon();
239
- input.focus();
168
+ saveStateSoon(0);
169
+ input.focus({ preventScroll: true });
170
+ input.scrollIntoView?.({ block: 'nearest' });
240
171
  try {
241
172
  input.setSelectionRange(task.length, task.length);
242
173
  } catch (error) {
@@ -334,6 +334,10 @@
334
334
  overlay.setAttribute('role', 'dialog');
335
335
  overlay.setAttribute('aria-modal', 'true');
336
336
  overlay.setAttribute('aria-label', title);
337
+ // The settings workbench is a centered top-layer dialog; center over it instead of the sidebar.
338
+ if (panel.querySelector?.('.codex-settings-workbench[open]')) {
339
+ overlay.dataset.context = 'workbench';
340
+ }
337
341
 
338
342
  const card = doc.createElement('section');
339
343
  card.className = 'codex-plugin-confirm-card';