codex-overleaf-link 2.4.1 → 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 (324) hide show
  1. package/README.md +272 -314
  2. package/README.zh-CN.md +287 -329
  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 +507 -507
  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 +8330 -1349
  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 +48 -121
  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 +10 -1
  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 +186 -154
  42. package/extension/src/content/selectionContextView.js +300 -0
  43. package/extension/src/content/sessionPersistence.js +6 -1
  44. package/extension/src/content/settingsPanel.js +77 -52
  45. package/extension/src/content/settingsWorkbench.js +374 -0
  46. package/extension/src/content/sharedSessionViewSync.js +72 -0
  47. package/extension/src/content/subagentActivityView.js +195 -0
  48. package/extension/src/content/trackedChangeCaptureController.js +7 -3
  49. package/extension/src/content/updateNotice.js +121 -50
  50. package/extension/src/content/writebackController.js +257 -0
  51. package/extension/src/content/writebackOrchestrator.js +146 -141
  52. package/extension/src/content/writebackPlan.js +231 -0
  53. package/extension/src/content/writebackRecovery.js +122 -0
  54. package/extension/src/content/writingStyleSettings.js +576 -0
  55. package/extension/src/content/writtenChangesView.js +152 -0
  56. package/extension/src/page/binaryAssetUploader.js +97 -19
  57. package/extension/src/page/overleafProjectSnapshot.js +1 -0
  58. package/extension/src/page/referenceProjects.js +148 -0
  59. package/extension/src/page/saveState.js +14 -2
  60. package/extension/src/page/snapshotRouter.js +44 -13
  61. package/extension/src/page/textCoordinates.js +102 -0
  62. package/extension/src/page/textFileCreator.js +350 -59
  63. package/extension/src/page/trackedChangeCapture.js +42 -56
  64. package/extension/src/page/trackedChangeOwnership.js +198 -0
  65. package/extension/src/page/trackedChangeReplay.js +164 -0
  66. package/extension/src/page/trackedChangesLifecycle.js +135 -149
  67. package/extension/src/page/treeOperations.js +26 -2
  68. package/extension/src/page/writebackReceiptJournal.js +112 -0
  69. package/extension/src/page/writebackRouter.js +175 -135
  70. package/extension/src/pageBridge.js +56 -101
  71. package/extension/src/popup.js +203 -59
  72. package/extension/src/shared/agentTranscript.js +18 -4
  73. package/extension/src/shared/auditRecords.js +71 -0
  74. package/extension/src/shared/changeHistoryModel.js +94 -0
  75. package/extension/src/shared/compatibility.js +1 -1
  76. package/extension/src/shared/compileAdapter.js +42 -0
  77. package/extension/src/shared/failureReasons.js +20 -0
  78. package/extension/src/shared/globalPreferences.js +1 -1
  79. package/extension/src/shared/i18n.js +93 -25
  80. package/extension/src/shared/managedUpdateProjection.js +6 -3
  81. package/extension/src/shared/pageRpcContract.js +7 -1
  82. package/extension/src/shared/providerProfiles.js +109 -0
  83. package/extension/src/shared/runActivityModel.js +361 -0
  84. package/extension/src/shared/runExecutionSnapshot.js +8 -2
  85. package/extension/src/shared/runExecutionSnapshotCodec.js +16 -4
  86. package/extension/src/shared/scopedPersistenceBrowserAdapter.js +6 -3
  87. package/extension/src/shared/selectionContext.js +28 -0
  88. package/extension/src/shared/sessionState.js +97 -6
  89. package/extension/src/shared/sharedSessionBridge.js +288 -0
  90. package/extension/src/shared/storageDb.js +22 -55
  91. package/extension/src/shared/storageMigration.js +3 -0
  92. package/extension/src/shared/storageRunActions.js +10 -4
  93. package/extension/src/shared/storageValuePruning.js +40 -0
  94. package/extension/src/shared/subagentActivityModel.js +174 -0
  95. package/extension/src/shared/undoOperations.js +87 -0
  96. package/extension/src/shared/updateConsent.js +37 -8
  97. package/extension/src/shared/writebackIntent.js +62 -0
  98. package/extension/src/shared/writebackSettlement.js +29 -10
  99. package/extension/src/shared/writingStyle.js +33 -0
  100. package/extension/styles/panel.css +1972 -384
  101. package/extension/styles/popup.css +110 -0
  102. package/native-host/src/anthropicBridgeRequest.js +2 -1
  103. package/native-host/src/codexModelRecovery.js +107 -0
  104. package/native-host/src/codexPromptAssembly.js +2 -0
  105. package/native-host/src/codexProviderLaunch.js +3 -3
  106. package/native-host/src/codexRuntimeIdentity.js +1 -0
  107. package/native-host/src/codexSessionRunner.js +106 -140
  108. package/native-host/src/codexSessionTiming.js +3 -0
  109. package/native-host/src/managedInstall.js +5 -4
  110. package/native-host/src/nativeEnvironment.js +70 -0
  111. package/native-host/src/nativeQuotas.js +15 -8
  112. package/native-host/src/overleafWorkspaceRules.js +16 -0
  113. package/native-host/src/processStopBarrier.js +80 -0
  114. package/native-host/src/providerModelCatalog.js +4 -3
  115. package/native-host/src/providerProfile.js +13 -1
  116. package/native-host/src/providerReasoning.js +9 -5
  117. package/native-host/src/providerStore.js +4 -0
  118. package/native-host/src/releaseTransport.js +14 -5
  119. package/native-host/src/selectionScope.js +58 -0
  120. package/native-host/src/skills/parallel-subagents/SKILL.md +31 -3
  121. package/native-host/src/skills/writing-style-builder/SKILL.md +146 -0
  122. package/native-host/src/subagentBroker.js +102 -98
  123. package/native-host/src/subagentTelemetry.js +316 -0
  124. package/native-host/src/subagentWorkspace.js +103 -0
  125. package/native-host/src/subagentWorkspacePath.js +31 -0
  126. package/native-host/src/taskRunnerRuntime.js +55 -5
  127. package/native-host/src/turnAttachments.js +113 -0
  128. package/native-host/src/updateManager.js +122 -12
  129. package/native-host/src/updateNetworkControl.js +75 -0
  130. package/native-host/src/updateTrust.js +21 -2
  131. package/native-host/src/vendor/pdfjs/LICENSE +177 -0
  132. package/native-host/src/vendor/pdfjs/SOURCE.txt +3 -0
  133. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  134. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  135. package/native-host/src/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
  136. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  137. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  138. package/native-host/src/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
  139. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  140. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  141. package/native-host/src/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  142. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  143. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  144. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  145. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  146. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  147. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  148. package/native-host/src/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
  149. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  150. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  151. package/native-host/src/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
  152. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  153. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  154. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  155. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  156. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  157. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  158. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  159. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  160. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  161. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  162. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  163. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  164. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  165. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  166. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  167. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  168. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  169. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  170. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  171. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  172. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  173. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  174. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  175. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  176. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  177. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  178. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  179. package/native-host/src/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
  180. package/native-host/src/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
  181. package/native-host/src/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  182. package/native-host/src/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  183. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  184. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  185. package/native-host/src/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  186. package/native-host/src/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  187. package/native-host/src/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  188. package/native-host/src/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  189. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  190. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  191. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  192. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  193. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  194. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  195. package/native-host/src/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
  196. package/native-host/src/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
  197. package/native-host/src/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
  198. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  199. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  200. package/native-host/src/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
  201. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  202. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  203. package/native-host/src/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
  204. package/native-host/src/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
  205. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  206. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  207. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  208. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  209. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  210. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  211. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  212. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  213. package/native-host/src/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
  214. package/native-host/src/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
  215. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  216. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  217. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  218. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  219. package/native-host/src/vendor/pdfjs/cmaps/H.bcmap +0 -0
  220. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  221. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  222. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  223. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  224. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  225. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  226. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  227. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  228. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  229. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  230. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  231. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  232. package/native-host/src/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
  233. package/native-host/src/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
  234. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  235. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  236. package/native-host/src/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
  237. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  238. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  239. package/native-host/src/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
  240. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  241. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  242. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  243. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  244. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  245. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  246. package/native-host/src/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
  247. package/native-host/src/vendor/pdfjs/cmaps/LICENSE +36 -0
  248. package/native-host/src/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
  249. package/native-host/src/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
  250. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  251. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  252. package/native-host/src/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
  253. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  254. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  255. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  256. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  257. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  258. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  259. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  260. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  261. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  262. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  263. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  264. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  265. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  266. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  267. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  268. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  269. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  270. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  271. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  272. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  273. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  274. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  275. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  276. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  277. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  278. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  279. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  280. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  281. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  282. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  283. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  284. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  285. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  286. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  287. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  288. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  289. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  290. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  291. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  292. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  293. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  294. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  295. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  296. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  297. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  298. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  299. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  300. package/native-host/src/vendor/pdfjs/cmaps/V.bcmap +0 -0
  301. package/native-host/src/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  302. package/native-host/src/vendor/pdfjs/pdf.mjs +26740 -0
  303. package/native-host/src/vendor/pdfjs/pdf.worker.mjs +62201 -0
  304. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  305. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  306. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  307. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  308. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  309. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  310. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  311. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  312. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  313. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  314. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  315. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
  316. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  317. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  318. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  319. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  320. package/native-host/src/writingStyleEvidence.js +102 -0
  321. package/native-host/src/writingStylePdfWorker.js +35 -0
  322. package/native-host/src/writingStyleProfile.js +165 -0
  323. package/native-host/src/writingStyleRuntime.js +447 -0
  324. 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": "b19a018ab6eb9c7bdca8cfad8ff6efcc4a30e80f81c3c0a2e89a7f78b6361d97",
6
- "outputDigest": "7640649ee012b3224d696703c2a1ab323d549418a3fcc31e2219bf14399416b5",
7
- "byteLength": 2422231,
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,128 +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?.();
56
+ const accountScopeId = deps.getAccountScopeId?.();
140
57
  const settingsScope = getPanel?.()?.dataset?.settingsScope;
141
- const isCurrent = () => requestId === storageUsageRequestId && projectId === getCurrentProjectId?.()
58
+ const isCurrent = () => requestId === storageUsageRequestId
59
+ && projectId === getCurrentProjectId?.()
60
+ && accountScopeId === deps.getAccountScopeId?.()
142
61
  && settingsScope === getPanel?.()?.dataset?.settingsScope
143
62
  && getSettingsPanelInstance()?.container?.querySelector('[data-storage-usage]') === node;
144
63
  const current = getState();
145
- const sessionCount = Array.isArray(current?.sessions) ? current.sessions.length : 0;
146
- const runCount = Array.isArray(current?.runs) ? current.runs.length : 0;
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));
147
67
  const counts = settingsScope === 'account'
148
- ? tx('All projects in this browser', '当前浏览器中的所有项目')
149
- : tx(
150
- `${sessionCount} loaded session(s) in this project · ${runCount} run(s) in the active session`,
151
- `当前项目已加载 ${sessionCount} 个会话 · 当前会话 ${runCount} 轮运行`
152
- );
153
- // Dynamic text belongs to this renderer, not the loading-label translator.
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 + ' 轮运行');
154
71
  node.removeAttribute?.('data-i18n');
155
72
  node.textContent = counts;
156
- const unavailable = () => {
157
- 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;
158
77
  };
159
78
  let timer;
160
79
  const estimate = Promise.resolve().then(() => navigator.storage?.estimate?.());
@@ -162,11 +81,16 @@
162
81
  return Promise.race([estimate, deadline]).then(info => {
163
82
  if (!isCurrent()) return;
164
83
  const usage = info?.usage;
165
- 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
+ }
166
88
  const mb = usage / (1024 * 1024);
167
- const size = usage === 0 ? '0 KB' : mb >= 1 ? `${mb.toFixed(1)} MB` : `${Math.max(1, Math.round(usage / 1024))} KB`;
168
- node.textContent = tx(`${counts} · Site total ~${size}`, `${counts} · 本站点总占用约 ${size}`);
169
- }).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));
170
94
  }
171
95
 
172
96
  async function clearAllHistoryWithConfirm() {
@@ -175,12 +99,12 @@
175
99
  return;
176
100
  }
177
101
  const confirmed = await showPluginConfirm({
178
- title: tx('Clear all history?', '清空全部历史?'),
102
+ title: tx('Clear local history?', '清理本地历史?'),
179
103
  message: tx(
180
- '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.',
181
- '将永久删除所有项目的全部会话、运行与审计记录——包括仪表盘的项目列表与缓存的项目名。项目设置与规则会保留。此操作不可撤销。'
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 项目文件不会被删除或还原,项目设置与规则会保留。清理后的历史无法恢复。'
182
106
  ),
183
- confirmLabel: tx('Delete everything', '全部删除'),
107
+ confirmLabel: tx('Clear local history', '清理本地历史'),
184
108
  destructive: true
185
109
  });
186
110
  if (!confirmed) {
@@ -188,6 +112,7 @@
188
112
  }
189
113
  try {
190
114
  await StorageDb?.clearAllStores?.();
115
+ historyView.invalidate();
191
116
  // v1.8.1: the dashboard's project-name cache lives in
192
117
  // chrome.storage.local, outside the IndexedDB stores — clear it too so
193
118
  // no (potentially sensitive) project titles outlive the wipe.
@@ -204,7 +129,8 @@
204
129
  await saveState();
205
130
  applyStateToPanel();
206
131
  refreshStorageUsageSummary();
207
- showPluginToast(tx('All history cleared.', '已清空全部历史。'));
132
+ void renderAuditHistoryPanel();
133
+ showPluginToast(tx('Local history cleared. Overleaf files are unchanged.', '本地历史已清理,Overleaf 文件保持不变。'));
208
134
  getPanel()?.querySelector('[data-task]')?.focus();
209
135
  }
210
136
 
@@ -234,13 +160,14 @@
234
160
  showPluginToast(tx('Nothing to refill: the original task text is unavailable.', '无法回填:原任务文本不可用。'));
235
161
  return;
236
162
  }
237
- prepareRetryReplacement?.(run || null);
163
+ prepareRetryReplacement?.(run || null, task);
238
164
  input.value = task;
239
165
  getState().task = task;
240
166
  autosizeTaskTextarea();
241
167
  syncComposerSendAvailability();
242
- saveStateSoon();
243
- input.focus();
168
+ saveStateSoon(0);
169
+ input.focus({ preventScroll: true });
170
+ input.scrollIntoView?.({ block: 'nearest' });
244
171
  try {
245
172
  input.setSelectionRange(task.length, task.length);
246
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';