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
@@ -372,6 +372,7 @@
372
372
  status: 'running',
373
373
  streamKey: getCodexStreamKey(method, params),
374
374
  streamRole: method === 'item/agentMessage/delta' ? 'assistant' : 'reasoning',
375
+ streamPhase: params.phase || '',
375
376
  appendText: true
376
377
  };
377
378
  }
@@ -412,12 +413,13 @@
412
413
  };
413
414
  }
414
415
  if (method === 'warning' || method === 'guardianWarning' || method === 'configWarning') {
415
- const title = cleanVisibleText(params.message || params.warning || '');
416
+ const title = cleanVisibleText(params.message || params.warning || params.summary || '');
417
+ if (!title) return technicalOnly(event, locale);
416
418
  return {
417
419
  kind: 'activity',
418
420
  visible: true,
419
- title: title || textFor(locale, 'Codex 返回了一条运行提示。', 'Codex returned a runtime notice.'),
420
- status: 'running',
421
+ title,
422
+ status: event.status === 'failed' ? 'failed' : method === 'guardianWarning' ? 'warning' : 'info',
421
423
  technicalDetail: normalizeRawEvent(event)
422
424
  };
423
425
  }
@@ -459,6 +461,7 @@
459
461
  status,
460
462
  streamKey: getItemStreamKey('agent', item),
461
463
  streamRole: 'assistant',
464
+ streamPhase: item.phase || '',
462
465
  replaceText: true
463
466
  };
464
467
  }
@@ -500,6 +503,10 @@
500
503
  status,
501
504
  detail: {
502
505
  command: item.command,
506
+ itemId: item.id,
507
+ threadId: event.detail?.params?.threadId,
508
+ turnId: event.detail?.params?.turnId,
509
+ commandActions: item.commandActions,
503
510
  output: item.aggregatedOutput,
504
511
  exitCode: item.exitCode
505
512
  }
@@ -863,6 +870,11 @@
863
870
  : textFor(locale, '本轮没有可撤销的写入', 'this run has no reversible writes');
864
871
  }
865
872
 
873
+ if (input.saveVerification && input.saveVerification.state !== 'not_checked') {
874
+ report.saveState = input.saveVerification.state === 'verified_saved'
875
+ ? textFor(locale, '已确认保存', 'Saved')
876
+ : textFor(locale, '待确认,可检查保存状态', 'Pending confirmation; check save status');
877
+ }
866
878
  const failed = input.status === 'failed' || input.status === 'blocked';
867
879
  return {
868
880
  title: textFor(locale, '本轮完成报告', 'Task report'),
@@ -946,6 +958,7 @@
946
958
  });
947
959
  }
948
960
 
961
+ if (report.saveState) meta.push({ key: 'saveState', label: textFor(locale, '保存', 'Save'), value: report.saveState });
949
962
  return { conclusion, body: bodySections.join('\n\n'), meta };
950
963
  }
951
964
 
@@ -976,6 +989,7 @@
976
989
  if (nextStep) {
977
990
  sections.push(textFor(locale, `下一步:${nextStep}`, `Next: ${nextStep}`));
978
991
  }
992
+ if (report.saveState) sections.push(textFor(locale, `保存:${report.saveState}`, `Save: ${report.saveState}`));
979
993
  return sections.join('\n\n');
980
994
  }
981
995
 
@@ -1045,7 +1059,7 @@
1045
1059
  if (input.mode === 'ask' || input.status === '只问不改') {
1046
1060
  return textFor(locale, '这轮是只问不改。', 'This run was Ask mode.');
1047
1061
  }
1048
- if (input.status === 'rejected') {
1062
+ if (input.status === 'cancelled' || input.status === 'rejected') {
1049
1063
  return textFor(locale, '你取消了这轮修改。', 'You cancelled this change.');
1050
1064
  }
1051
1065
  return '';
@@ -75,6 +75,7 @@
75
75
  mirror: summarizeMirror(input.mirror),
76
76
  auditLogs: summarizeAuditLogList(input.auditLogs),
77
77
  run: summarizeRun(input.run),
78
+ ...(Array.isArray(input.recentRuns) ? { recentRuns: input.recentRuns.slice(0, 8).map(summarizeRun) } : {}),
78
79
  governance: summarizeGovernance(input.governance),
79
80
  projectIdHash: hashString(stringField(input.projectId))
80
81
  };
@@ -272,9 +273,22 @@
272
273
  }
273
274
 
274
275
  function summarizeRun(run = {}) {
276
+ run = run && typeof run === 'object' && !Array.isArray(run) ? run : {};
277
+ const captures = Array.isArray(run.trackedChangeCaptures) ? run.trackedChangeCaptures : [];
275
278
  return removeEmptySummaryFields({
276
279
  id: redactSecretLikeText(stringField(run.id)),
277
280
  status: redactSecretLikeText(stringField(run.status)),
281
+ startedAt: redactSecretLikeText(stringField(run.startedAt)),
282
+ finishedAt: redactSecretLikeText(stringField(run.finishedAt)),
283
+ requireReviewing: typeof run.executionSnapshot?.requireReviewing === 'boolean'
284
+ ? run.executionSnapshot.requireReviewing : undefined,
285
+ trackedChangeStatus: diagnosticToken(run.trackedChangeStatus),
286
+ undoStatus: diagnosticToken(run.undoStatus),
287
+ appliedOperationCount: Array.isArray(run.appliedOperations) ? run.appliedOperations.length : undefined,
288
+ undoTrackedChangeCount: Array.isArray(run.undoTrackedChanges) ? run.undoTrackedChanges.length : undefined,
289
+ captureCount: Array.isArray(run.trackedChangeCaptures) ? captures.length : undefined,
290
+ capturesTruncated: captures.length > 20 ? true : undefined,
291
+ trackedChangeCaptures: captures.slice(0, 20).map(summarizeTrackedCapture),
278
292
  errorCode: redactSecretLikeText(stringField(run.errorCode)),
279
293
  errorCategory: categorizeError(run.errorCode || run.message || run.error),
280
294
  events: (Array.isArray(run.events) ? run.events : []).map(event => removeEmptyFields({
@@ -287,6 +301,63 @@
287
301
  });
288
302
  }
289
303
 
304
+ // Export only proof metadata, never document text, prompts, labels or raw IDs.
305
+ function diagnosticToken(value) {
306
+ const text = redactSecretLikeText(stringField(value));
307
+ return /^[a-z][a-z0-9_]{0,79}$/.test(text) ? text : undefined;
308
+ }
309
+
310
+ function diagnosticNumbers(value, keys) {
311
+ const source = value && typeof value === 'object' ? value : {};
312
+ const result = {};
313
+ for (const key of keys) {
314
+ if (Number.isSafeInteger(source[key]) && source[key] >= 0) result[key] = source[key];
315
+ }
316
+ return result;
317
+ }
318
+
319
+ function diagnosticFingerprint(value) {
320
+ return typeof value === 'string' && /^\d{1,16}:[a-f0-9]{1,8}:[a-f0-9]{1,8}$/.test(value)
321
+ ? value : undefined;
322
+ }
323
+
324
+ function summarizeTrackedCapture(value) {
325
+ const capture = value && typeof value === 'object' && !Array.isArray(value) ? value : {};
326
+ const before = Array.isArray(capture.before) ? capture.before : [];
327
+ const refs = Array.isArray(capture.refs) ? capture.refs : [];
328
+ const ranges = Array.isArray(capture.ranges) ? capture.ranges : [];
329
+ const diagnostics = capture.diagnostics || {};
330
+ const refSummary = ref => removeEmptySummaryFields({
331
+ idHash: stringField(ref?.id) ? hashString(ref.id) : undefined,
332
+ kind: diagnosticToken(ref?.kind),
333
+ ...diagnosticNumbers(ref, ['from', 'to', 'textLength']),
334
+ textHash: diagnosticFingerprint(ref?.textHash)
335
+ });
336
+ return removeEmptySummaryFields({
337
+ pathHash: stringField(capture.path) ? hashString(capture.path) : undefined,
338
+ nativeDocIdHash: stringField(capture.nativeDocId) ? hashString(capture.nativeDocId) : undefined,
339
+ state: diagnosticToken(capture.state), reason: diagnosticToken(capture.reason),
340
+ source: diagnosticToken(capture.source),
341
+ ...diagnosticNumbers(capture, ['startedAt', 'expiresAt']),
342
+ expectedFingerprint: diagnosticFingerprint(capture.expected),
343
+ beforeCount: before.length, refCount: refs.length, rangeCount: ranges.length,
344
+ truncated: before.length > 1200 || refs.length > 1200 || ranges.length > 1000 ? true : undefined,
345
+ before: before.slice(0, 1200).map(refSummary),
346
+ refs: refs.slice(0, 1200).map(refSummary),
347
+ ranges: ranges.slice(0, 1000).map(range => removeEmptySummaryFields({
348
+ ...diagnosticNumbers(range, ['from', 'to', 'start', 'end', 'removedLength']),
349
+ removedHash: diagnosticFingerprint(range?.removedHash)
350
+ })),
351
+ diagnostics: removeEmptySummaryFields({
352
+ ...diagnosticNumbers(diagnostics, ['beforeCount', 'afterCount', 'capturedCount',
353
+ 'filteredCount', 'polls', 'elapsedMs', 'waitMs']),
354
+ reason: diagnosticToken(diagnostics.reason),
355
+ source: diagnosticToken(diagnostics.source),
356
+ sourceReason: diagnosticToken(diagnostics.sourceReason)
357
+ })
358
+ });
359
+ }
360
+
290
361
  function summarizeGovernance(rules = {}) {
291
362
  return {
292
363
  readonlyPatternCount: Array.isArray(rules.readonlyPatterns) ? rules.readonlyPatterns.length : 0,
@@ -0,0 +1,94 @@
1
+ (function initChangeHistoryModel(root, factory) {
2
+ if (typeof module === 'object' && module.exports) {
3
+ module.exports = factory(require('./settlementFacts'), require('./sessionState'));
4
+ } else root.CodexOverleafModuleRegistry.define('ChangeHistoryModel', ['SettlementFacts', 'SessionState'], factory);
5
+ })(typeof globalThis !== 'undefined' ? globalThis : window, function changeHistoryModelFactory(SettlementFacts, SessionState) {
6
+ 'use strict';
7
+ const array = value => Array.isArray(value) ? value : [];
8
+ const text = value => typeof value === 'string' ? value : '';
9
+ const opaque = value => /^\[.*(?:omitted|redacted|chars=\d+|hash=).*?\]$/i.test(text(value).trim());
10
+
11
+ function project(records, options = {}) {
12
+ const { projectId, accountScopeId } = options;
13
+ if (!projectId || !accountScopeId) return [];
14
+ const sanitize = options.sanitizeText || text;
15
+ const safe = value => text(sanitize(text(value))).trim();
16
+ const sessions = new Map();
17
+ const live = new Map();
18
+ for (const session of array(options.storedSessions)) {
19
+ if (session?.projectId === projectId && session.accountScopeId === accountScopeId) sessions.set(session.id, session);
20
+ }
21
+ // In-memory sessions already passed the runtime's account/project hydrate
22
+ // boundary. Their review state is newer than the persisted audit snapshot.
23
+ for (const session of array(options.sessions)) {
24
+ if (!session?.id) continue;
25
+ const prior = sessions.get(session.id);
26
+ const runs = new Map(array(prior?.runs).map(run => [run.id, run]));
27
+ const current = session.id === options.activeSessionId ? array(options.activeRuns) : array(session.runs);
28
+ for (const run of current) if (run?.id) runs.set(run.id, run);
29
+ sessions.set(session.id, { ...prior, ...session, runs: [...runs.values()] });
30
+ live.set(session.id, new Set(current.filter(run => run?.id && (!run.runProjectId || run.runProjectId === projectId)).map(run => run.id)));
31
+ }
32
+ function path(value) {
33
+ const raw = text(value).replace(/\\/g, '/').replace(/^\.\//, '');
34
+ if (/(^|\/)\.codex-overleaf-(subagents|attachments)(\/|$)/.test(raw)) return '';
35
+ const result = safe(raw);
36
+ if (!result || /^\[.*\]$/.test(result)) return '';
37
+ return result.slice(0, 320);
38
+ }
39
+ const seen = new Set();
40
+ return array(records).filter(record => record?.projectId === projectId
41
+ && (!record.accountScopeId || record.accountScopeId === accountScopeId)
42
+ && sessions.has(record.sessionId))
43
+ .slice().sort((a, b) => String(b.createdAt || '').localeCompare(String(a.createdAt || '')))
44
+ .filter(record => {
45
+ const key = JSON.stringify([record.sessionId, record.turnId || record.id]);
46
+ if (seen.has(key)) return false;
47
+ seen.add(key); return true;
48
+ }).slice(0, 50).map(record => {
49
+ const session = sessions.get(record.sessionId);
50
+ const candidate = array(session.runs).find(run => run.id === record.turnId);
51
+ const run = candidate && (!candidate.runProjectId || candidate.runProjectId === projectId) ? candidate : null;
52
+ const facts = SettlementFacts.compactSettlementFacts(run?.settlement || run?.settlementFacts || {});
53
+ const projection = run ? SettlementFacts.projectRunSettlement(run) : null;
54
+ const applied = array(record.appliedFiles).filter(file => path(typeof file === 'string' ? file : file?.path));
55
+ const review = text(run?.trackedChangeStatus);
56
+ const hasWrites = applied.length > 0 || run?.changedDocument === true
57
+ || ['changed', 'possibly-changed'].includes(facts.documentEffect)
58
+ || ['pending', 'accepted', 'rejected', 'needs_review'].includes(review)
59
+ || run?.undoStatus === 'applied';
60
+ let files = applied.slice();
61
+ files.push(...facts.fileSettlements.filter(file => ['complete', 'partial'].includes(file.applied)
62
+ || ['changed', 'possibly-changed'].includes(file.documentEffect)));
63
+ if (!files.length && hasWrites) files = array(record.changedFiles);
64
+ const paths = [...new Set(files.flatMap(file => typeof file === 'string'
65
+ ? [path(file)] : [path(file?.path), path(file?.destinationPath)]).filter(Boolean))];
66
+ const unsafeSave = record.saveVerification?.ok === false
67
+ || ['failed', 'unavailable'].includes(record.saveVerification?.state);
68
+ let status;
69
+ if (review === 'accepted') status = 'accepted';
70
+ else if (review === 'rejected' || run?.undoStatus === 'applied') status = 'undone';
71
+ else if (review === 'needs_review' || projection?.terminalState === 'needs_review'
72
+ || facts.documentEffect === 'possibly-changed'
73
+ || ['partial', 'needs-review'].includes(facts.evidence.settled)
74
+ || hasWrites && (unsafeSave || ['failed', 'interrupted', 'needs_review_after_navigation'].includes(run?.status))) status = 'attention';
75
+ else if (run?.status === 'running' || record.resultStatus === 'draft' && !record.completedAt) status = 'running';
76
+ else if (review === 'pending') status = 'pending';
77
+ else if (!hasWrites) status = 'unchanged';
78
+ else status = run ? 'written' : 'unknown';
79
+ const suppliedSummary = safe(run?.safeTaskSummary || '');
80
+ const summary = suppliedSummary && !opaque(suppliedSummary)
81
+ ? SessionState.computeSafeTaskSummary(suppliedSummary) : '';
82
+ // Audit promptSummary deliberately stores a privacy marker. Never
83
+ // recover it, render it, or turn it into an apparent task summary.
84
+ return {
85
+ key: JSON.stringify([record.sessionId, record.turnId || record.id]),
86
+ projectId, accountScopeId, sessionId: record.sessionId, turnId: record.turnId,
87
+ createdAt: text(record.createdAt), paths, hasWrites, status, summary,
88
+ operation: paths.length === 1 ? text(files[0]?.type) : '',
89
+ canJump: Boolean(run && live.get(record.sessionId)?.has(record.turnId))
90
+ };
91
+ });
92
+ }
93
+ return { project };
94
+ });
@@ -12,7 +12,7 @@
12
12
  const MIN_NATIVE_VERSION = '1.0.0';
13
13
  const MIN_COMPATIBLE_NATIVE_VERSION = '1.0.0';
14
14
  const MIN_COMPATIBLE_EXTENSION_VERSION = '1.0.0';
15
- const BUILD_TARGET_VERSION = '2.4.1';
15
+ const BUILD_TARGET_VERSION = '2.5.0';
16
16
  const DEFAULT_CHROME_EXTENSION_ID = 'illdpneeeopfffmiepaejglgmhpmdhdc';
17
17
  const REQUIRED_CAPABILITIES = Object.freeze([
18
18
  'bridgePing',
@@ -163,7 +163,49 @@
163
163
  return result;
164
164
  }
165
165
 
166
+ function buildPostWriteCompileSummary({ result = null, logResult = null, error = null } = {}) {
167
+ const logAvailable = logResult?.ok === true;
168
+ const errors = logAvailable && Array.isArray(logResult.errors)
169
+ ? logResult.errors.slice(0, 5).map(formatCompileDiagnosticForSummary)
170
+ : [];
171
+ const warnings = logAvailable && Array.isArray(logResult.warnings)
172
+ ? logResult.warnings.slice(0, 5).map(formatCompileDiagnosticForSummary)
173
+ : [];
174
+ if (error) {
175
+ return {
176
+ status: 'failed',
177
+ reason: error?.message || 'Post-write compile failed.',
178
+ errors,
179
+ warnings,
180
+ logAvailable
181
+ };
182
+ }
183
+ if (!result?.ok) {
184
+ return {
185
+ status: 'failed',
186
+ reason: result?.reason || 'Post-write compile did not succeed.',
187
+ errors,
188
+ warnings,
189
+ logAvailable
190
+ };
191
+ }
192
+ return {
193
+ status: result.compile?.status || 'triggered',
194
+ reason: result.reason || '',
195
+ errors,
196
+ warnings,
197
+ logAvailable
198
+ };
199
+ }
200
+
201
+ function formatCompileDiagnosticForSummary(value) {
202
+ const text = String(value || '').replace(/\s+/g, ' ').trim();
203
+ return text.length > 180 ? `${text.slice(0, 179)}...` : text;
204
+ }
205
+
166
206
  return {
207
+ buildPostWriteCompileSummary,
208
+ formatCompileDiagnosticForSummary,
167
209
  COMPILABLE_EXTENSIONS,
168
210
  MAX_LOG_BYTES,
169
211
  extractErrorBlocks,
@@ -158,6 +158,26 @@
158
158
  fallbackUserMessage: 'Create/delete/rename/move did not appear in the file tree as expected.',
159
159
  fallbackNextAction: 'Inspect the file tree and retry if needed.'
160
160
  },
161
+ source_zip_unavailable: {
162
+ stage: 'preflight', severity: 'blocked', defaultRetryable: true,
163
+ fallbackUserMessage: 'The project could not be checked before uploading this file.',
164
+ fallbackNextAction: 'Retry sync; only missing files will be uploaded.'
165
+ },
166
+ file_upload_unconfirmed: {
167
+ stage: 'verify', severity: 'warning', defaultRetryable: true,
168
+ fallbackUserMessage: 'The file was submitted, but its saved content is not yet confirmed.',
169
+ fallbackNextAction: 'Check the file before retrying; matching content will not be uploaded twice.'
170
+ },
171
+ subagent_unfinished_output: {
172
+ stage: 'preflight', severity: 'blocked', defaultRetryable: false,
173
+ fallbackUserMessage: 'A subagent stopped before finishing this file; the main agent must review and adopt it.',
174
+ fallbackNextAction: 'Have the main agent complete and adopt the pending file.'
175
+ },
176
+ subagent_unauthorized_edit: {
177
+ stage: 'preflight', severity: 'blocked', defaultRetryable: false,
178
+ fallbackUserMessage: 'A file changed outside the subagent ownership boundary and was not synced.',
179
+ fallbackNextAction: 'Review the ownership violation; it cannot be cleared through output adoption.'
180
+ },
161
181
  partial_write_needs_review: {
162
182
  stage: 'verify', severity: 'warning', defaultRetryable: false,
163
183
  fallbackUserMessage: 'Some operations wrote, some were skipped.',
@@ -112,7 +112,7 @@
112
112
  try {
113
113
  const url = new URL(sender?.tab?.url || '');
114
114
  allowed = sender.id === chromeApi.runtime.id && url.protocol === 'https:'
115
- && ['overleaf.com', 'www.overleaf.com'].includes(url.hostname)
115
+ && ['overleaf.com', 'www.overleaf.com', 'cn.overleaf.com'].includes(url.hostname)
116
116
  && /^\/project(?:\/|$)/.test(url.pathname);
117
117
  } catch (_error) { /* reject unrelated contexts */ }
118
118
  if (!allowed) {
@@ -150,10 +150,10 @@
150
150
  undoTrackedTitle: 'Reject this run\'s Overleaf tracked changes?',
151
151
  undoNativeTitle: 'Undo this run\'s Overleaf writes?',
152
152
  undoTrackedMessage: 'This will use Overleaf Reject to undo {files}.\n\nIt will not rewrite files with text patches. If the extension cannot verify the matching tracked changes, it will stop and let you handle them in Overleaf review tools.',
153
- undoNativeMessage: 'This will use Overleaf Undo to roll back {files}.\n\nBefore running, Codex verifies the current content still matches this run\'s written content. If you edited it afterward, Codex stops to avoid undoing your new changes.',
153
+ undoNativeMessage: 'Undo this run\'s changes in {files}.',
154
154
  undoTrackedConfirm: 'Reject this run',
155
155
  undoTrackedStarted: 'Starting rejection of this run\'s Overleaf tracked changes',
156
- undoNativeStarted: 'Starting Overleaf native undo for this run',
156
+ undoNativeStarted: 'Undoing this run\'s changes',
157
157
  undoTrackedResult: 'Undo result: rejected {applied} tracked change(s), skipped {skipped}',
158
158
  undoNativeResult: 'Undo result: undone {applied} file(s), skipped {skipped}',
159
159
  undoSwitchedEditing: 'Switched to Editing for undo and left Editing active afterward.',
@@ -272,6 +272,24 @@
272
272
  personalizationHelp: 'Style, terminology, and LaTeX conventions Codex should follow in this project.',
273
273
  settingsSaved: 'Saved',
274
274
  appearanceTitle: 'Appearance',
275
+ settingsWorkbenchTitle: 'Settings',
276
+ settingsWorkbenchSubtitle: 'Preferences, project rules, and local tools.',
277
+ settingsWorkbenchGeneral: 'General & appearance',
278
+ settingsWorkbenchModels: 'Models & connections',
279
+ settingsWorkbenchContext: 'Project context',
280
+ settingsWorkbenchInstructions: 'Instructions & skills',
281
+ settingsWorkbenchProtection: 'Protection & privacy',
282
+ settingsWorkbenchHistory: 'History & storage',
283
+ settingsWorkbenchAll: 'All settings',
284
+ settingsWorkbenchFilter: 'Filter settings by scope',
285
+ settingsWorkbenchCategories: 'Settings categories',
286
+ settingsWorkbenchProjectFilter: 'Show only settings that apply to this project.',
287
+ settingsWorkbenchOpenProject: 'Open a project to configure its settings.',
288
+ settingsWorkbenchClose: 'Close settings',
289
+ settingsWorkbenchEnableSkills: 'Enable Overleaf skills',
290
+ settingsWorkbenchSkillsHelp: 'Turn off all skills without changing individual selections.',
291
+ settingsWorkbenchSkillsList: 'Available skills',
292
+ settingsWorkbenchProviderOpenFailed: 'Could not open provider settings.',
275
293
  themeLabel: 'Theme',
276
294
  themeDark: 'Dark',
277
295
  themeLight: 'Light',
@@ -300,22 +318,30 @@
300
318
  runsTruncatedNote: 'Showing the most recent 20 runs — older runs were trimmed.',
301
319
  eventsTruncatedNote: 'Earlier steps of this run were trimmed.',
302
320
  newSessionTooltip: 'Start a fresh conversation — the current session\u2019s context will not carry over',
303
- storageTitle: 'History & storage',
321
+ storageTitle: 'Local data',
322
+ storageSavedData: 'Saved conversations & records',
304
323
  softwareUpdatesTitle: 'Software updates',
305
324
  softwareUpdatesHelp: 'Automatically checks signed stable releases for the Extension and Native Host.',
306
325
  checkForUpdates: 'Check for updates',
307
326
  providerSettingsTitle: 'Model providers',
308
327
  providerSettingsExperimental: 'Third-party experimental',
309
- providerSettingsHelp: 'Configure experimental third-party model APIs. Compatibility varies by provider and gateway.',
328
+ providerSettingsHelp: 'Manage model API connections.',
310
329
  providerSettingsConfigure: 'Configure',
311
330
  providerSettingsBuiltin: 'Built-in Codex is active',
312
331
  providerSettingsLoading: 'Checking current project provider…',
313
- storageUsageLoading: 'Calculating usage\u2026',
314
- storageClearAll: 'Clear all history\u2026',
315
- storageClearAllHelp: 'Removes every stored session, run and audit record for all projects. Project settings and rules are kept.',
332
+ storageUsageLoading: 'Loading saved history\u2026',
333
+ storageClearAll: 'Clear local history\u2026',
334
+ storageClearAllHelp: 'Clearing removes local conversations, change records and their undo information for all projects. Overleaf files, project settings and rules stay unchanged.',
316
335
  runTurnNavLabel: 'Jump to a turn\u2026',
317
- historyTitle: 'Change history',
318
- historyHelp: 'What Codex wrote to this project, per run. Filter by file name or task text.',
336
+ historyTitle: 'File changes',
337
+ historyHelp: 'Review file changes from the latest 50 recorded runs and open the matching conversation.',
338
+ historyStatusLabel: 'Change status',
339
+ historyStatusAll: 'All statuses',
340
+ historyStatusPending: 'Pending review',
341
+ historyStatusAccepted: 'Accepted',
342
+ historyStatusUndone: 'Undone',
343
+ historyStatusAttention: 'Needs attention',
344
+ historyStatusWritten: 'Written',
319
345
  runSearchPlaceholder: 'Search this session\u2019s runs\u2026',
320
346
  undoFileSelectTitle: 'Undo which files?',
321
347
  undoFileSelectConfirm: 'Undo selected',
@@ -335,8 +361,8 @@
335
361
  speedLabel: 'Speed',
336
362
  requireReviewing: 'Track',
337
363
  requireReviewingTitle: 'When enabled, Codex checks or switches Overleaf Reviewing/Track Changes before writing. Deletes still require confirmation.',
338
- autoCompile: 'Compile',
339
- autoCompileTitle: 'After Codex writes, click Overleaf Recompile and record the compile result for this task. Ask mode will not trigger it.',
364
+ autoCompile: 'Auto compile',
365
+ autoCompileTitle: 'Automatically recompile in Overleaf after Codex writes and record the result. Toggling this setting does not compile immediately. Ask mode does not trigger compilation.',
340
366
  experimentalOtWarmMirror: 'OT warm mirror',
341
367
  experimentalOtWarmMirrorShort: 'OT',
342
368
  experimentalOtWarmMirrorTitle: 'Read-only local text warming. File scope and freshness are checked before reuse; normal project reading remains the fallback.',
@@ -376,7 +402,15 @@
376
402
  queuedInputPaused: 'Queue paused',
377
403
  queuedInputGuiding: 'Sending guidance',
378
404
  queuedInputExecuting: 'Running',
379
- queuedInputGuide: 'Guide',
405
+ queuedInputGuide: 'Steer now',
406
+ queuedInputUpNext: 'Up next · sends after this run',
407
+ queuedInputUpNextMany: 'Up next · sends in order after this run',
408
+ queuedInputSteering: 'Steering the current turn…',
409
+ queuedInputMore: '{count} more queued',
410
+ queuedInputShowLess: 'Show less',
411
+ queuedInputEdit: 'Edit in the composer',
412
+ queuedInputEditBlocked: 'Send or clear the current draft before editing a queued message.',
413
+ queuedInputGuideHint: 'Steer is available once the current tool step finishes.',
380
414
  queuedInputGuideTitle: 'Send this message into the active Codex turn now.',
381
415
  queuedInputGuideUnavailable: 'The active turn is not ready for guidance yet.',
382
416
  queuedInputGuideFailed: 'Guidance could not be delivered. The message remains queued.',
@@ -717,10 +751,10 @@
717
751
  undoTrackedTitle: '拒绝本轮 Overleaf 留痕改动?',
718
752
  undoNativeTitle: '撤销本轮 Overleaf 写入?',
719
753
  undoTrackedMessage: '将通过 Overleaf 自己的 Reject/拒绝功能撤销 {files}。\n\n这不会用文本补丁重写文件;如果插件不能确认对应留痕记录,会停止并让你在 Overleaf 审阅面板手动处理。',
720
- undoNativeMessage: '将通过 Overleaf 自己的 Undo/撤销功能回退 {files}。\n\n执行前会确认当前内容仍是本轮写入后的内容;如果你已经手动改过,Codex 会停止,避免撤掉你的新修改。',
754
+ undoNativeMessage: '撤销本轮在 {files} 中的改动。',
721
755
  undoTrackedConfirm: '拒绝本轮改动',
722
756
  undoTrackedStarted: '开始拒绝本轮 Overleaf 留痕改动',
723
- undoNativeStarted: '开始用 Overleaf 原生撤销回退本轮写入',
757
+ undoNativeStarted: '正在撤销本轮改动',
724
758
  undoTrackedResult: '撤销结果:已拒绝 {applied} 条留痕,跳过 {skipped} 条',
725
759
  undoNativeResult: '撤销结果:已撤销 {applied} 个文件,跳过 {skipped} 项',
726
760
  undoSwitchedEditing: '撤销时已切到 Editing;撤销后保持 Editing。',
@@ -839,6 +873,24 @@
839
873
  personalizationHelp: 'Codex 在本项目中应遵循的风格、术语和 LaTeX 约定。',
840
874
  settingsSaved: '已保存',
841
875
  appearanceTitle: '外观',
876
+ settingsWorkbenchTitle: '设置',
877
+ settingsWorkbenchSubtitle: '偏好设置、项目规则与本地工具。',
878
+ settingsWorkbenchGeneral: '常规与外观',
879
+ settingsWorkbenchModels: '模型与连接',
880
+ settingsWorkbenchContext: '项目上下文',
881
+ settingsWorkbenchInstructions: '指令与技能',
882
+ settingsWorkbenchProtection: '文件保护与隐私',
883
+ settingsWorkbenchHistory: '历史与存储',
884
+ settingsWorkbenchAll: '全部设置',
885
+ settingsWorkbenchFilter: '按作用范围筛选设置',
886
+ settingsWorkbenchCategories: '设置分类',
887
+ settingsWorkbenchProjectFilter: '仅显示作用于当前项目的设置。',
888
+ settingsWorkbenchOpenProject: '进入项目后可配置项目设置。',
889
+ settingsWorkbenchClose: '关闭设置',
890
+ settingsWorkbenchEnableSkills: '启用 Overleaf 技能',
891
+ settingsWorkbenchSkillsHelp: '关闭总开关时,各技能的单独选择会保留。',
892
+ settingsWorkbenchSkillsList: '可用技能',
893
+ settingsWorkbenchProviderOpenFailed: '无法打开模型服务设置。',
842
894
  themeLabel: '主题',
843
895
  themeDark: '深色',
844
896
  themeLight: '浅色',
@@ -867,22 +919,30 @@
867
919
  runsTruncatedNote: '仅显示最近 20 轮——更早的轮次已精简。',
868
920
  eventsTruncatedNote: '本轮更早的步骤已精简。',
869
921
  newSessionTooltip: '开启全新对话——当前会话的上下文不会带入',
870
- storageTitle: '历史与存储',
922
+ storageTitle: '本地数据',
923
+ storageSavedData: '已保存的对话与记录',
871
924
  softwareUpdatesTitle: '软件更新',
872
925
  softwareUpdatesHelp: '自动检查 Extension 与 Native Host 的签名稳定版本。',
873
926
  checkForUpdates: '检查更新',
874
927
  providerSettingsTitle: '模型服务',
875
928
  providerSettingsExperimental: '第三方实验性',
876
- providerSettingsHelp: '配置实验性第三方模型 API;兼容性取决于具体模型服务与网关。',
929
+ providerSettingsHelp: '管理模型 API 连接。',
877
930
  providerSettingsConfigure: '配置',
878
931
  providerSettingsBuiltin: '当前使用内置 Codex',
879
932
  providerSettingsLoading: '正在读取当前项目的模型服务…',
880
- storageUsageLoading: '正在计算占用…',
881
- storageClearAll: '清空全部历史…',
882
- storageClearAllHelp: '删除所有项目已存储的全部会话、运行与审计记录。项目设置与规则会保留。',
933
+ storageUsageLoading: '正在读取已保存的历史…',
934
+ storageClearAll: '清理本地历史…',
935
+ storageClearAllHelp: '清理会移除所有项目的本地对话、修改记录及撤销信息。Overleaf 文件、项目设置与规则保持不变。',
883
936
  runTurnNavLabel: '跳到某一轮…',
884
- historyTitle: '变更历史',
885
- historyHelp: 'Codex 每一轮写入本项目的记录。可按文件名或任务内容过滤。',
937
+ historyTitle: '文件修改记录',
938
+ historyHelp: '查看最近 50 轮的文件修改及处理状态,可跳转到对应对话。',
939
+ historyStatusLabel: '修改状态',
940
+ historyStatusAll: '所有状态',
941
+ historyStatusPending: '待接受',
942
+ historyStatusAccepted: '已接受',
943
+ historyStatusUndone: '已撤销',
944
+ historyStatusAttention: '需检查',
945
+ historyStatusWritten: '已写入',
886
946
  runSearchPlaceholder: '搜索本会话的轮次…',
887
947
  undoFileSelectTitle: '撤销哪些文件?',
888
948
  undoFileSelectConfirm: '撤销所选',
@@ -902,8 +962,8 @@
902
962
  speedLabel: '速度',
903
963
  requireReviewing: '留痕',
904
964
  requireReviewingTitle: '开启后,写入前会确认并尝试切到 Overleaf Reviewing/Track Changes;删除仍需确认。',
905
- autoCompile: '编译',
906
- autoCompileTitle: 'Codex 写入后自动点击 Overleaf Recompile,并把编译结果记录到本轮任务。只问不改时不会触发。',
965
+ autoCompile: '自动编译',
966
+ autoCompileTitle: 'Codex 写入后自动触发 Overleaf Recompile,并记录编译结果。切换此开关不会立即编译;只问不改时不触发编译。',
907
967
  experimentalOtWarmMirror: 'OT 预热镜像',
908
968
  experimentalOtWarmMirrorShort: 'OT',
909
969
  experimentalOtWarmMirrorTitle: '只读本地文本预热;复用前校验文件范围和新鲜度,常规项目读取作为回退路径。',
@@ -943,13 +1003,21 @@
943
1003
  queuedInputPaused: '队列已暂停',
944
1004
  queuedInputGuiding: '正在发送引导',
945
1005
  queuedInputExecuting: '正在运行',
946
- queuedInputGuide: '立即引导',
1006
+ queuedInputGuide: '现在插入',
1007
+ queuedInputUpNext: '下一条 · 本轮结束后发送',
1008
+ queuedInputUpNextMany: '接下来 · 本轮结束后依次发送',
1009
+ queuedInputSteering: '正在插入当前回合…',
1010
+ queuedInputMore: '还有 {count} 条待发送',
1011
+ queuedInputShowLess: '收起',
1012
+ queuedInputEdit: '拉回输入框编辑',
1013
+ queuedInputEditBlocked: '请先发送或清空当前输入框里的内容,再编辑排队消息。',
1014
+ queuedInputGuideHint: '当前工具步骤结束后才能插入。',
947
1015
  queuedInputGuideTitle: '立即把这条消息发送到当前 Codex turn。',
948
1016
  queuedInputGuideUnavailable: '当前 turn 尚未进入可引导状态。',
949
1017
  queuedInputGuideFailed: '引导消息未送达,消息已保留在队列中。',
950
1018
  queuedInputGuided: '后续引导已发送到当前 Codex turn。',
951
1019
  queuedInputAdded: '后续任务已排队,将在当前任务完整结束后执行。',
952
- queuedInputResume: '恢复队列',
1020
+ queuedInputResume: '继续',
953
1021
  queuedInputRemove: '删除',
954
1022
  queuedInputAttachmentsUnsupported: '当前排队消息支持文本和 @context;请先移除二进制附件。',
955
1023
  queuedInputError_empty_input: '请先输入后续任务。',
@@ -13,6 +13,7 @@
13
13
  'up_to_date',
14
14
  'checking',
15
15
  'update_available',
16
+ 'manual_install_required',
16
17
  'downloading',
17
18
  'staged',
18
19
  'waiting_for_idle',
@@ -27,7 +28,7 @@
27
28
 
28
29
  const PHASE_TIMEOUTS = Object.freeze({
29
30
  checking: 60 * 1000,
30
- downloading: 2 * 60 * 1000,
31
+ downloading: 6 * 60 * 1000,
31
32
  applying: 90 * 1000,
32
33
  awaiting_health: 2 * 60 * 1000,
33
34
  rolling_back: 60 * 1000
@@ -75,9 +76,11 @@
75
76
  const TRANSITIONS = Object.freeze({
76
77
  idle: Object.freeze(['checking']),
77
78
  up_to_date: Object.freeze(['checking', 'idle']),
78
- checking: Object.freeze(['idle', 'up_to_date', 'update_available', 'failed']),
79
+ checking: Object.freeze(['idle', 'up_to_date', 'update_available', 'manual_install_required', 'failed']),
80
+ // Only a reinstall resolves it; leave by checking again or going idle.
81
+ manual_install_required: Object.freeze(['checking', 'idle', 'update_available', 'failed']),
79
82
  update_available: Object.freeze(['checking', 'downloading', 'deferred', 'failed']),
80
- downloading: Object.freeze(['staged', 'failed']),
83
+ downloading: Object.freeze(['staged', 'failed', 'update_available', 'idle']),
81
84
  staged: Object.freeze(['waiting_for_idle', 'applying', 'update_available', 'deferred', 'failed']),
82
85
  waiting_for_idle: Object.freeze(['applying', 'update_available', 'deferred', 'failed']),
83
86
  applying: Object.freeze(['staged', 'awaiting_health', 'rolling_back', 'failed']),
@@ -5,21 +5,27 @@
5
5
  })(typeof window !== 'undefined' ? window : (typeof globalThis !== 'undefined' ? globalThis : this), function () {
6
6
  'use strict';
7
7
 
8
- var REVISION = '2026-09-14-native-text-upload-v28';
8
+ var REVISION = '2026-09-27-writing-style-references-v33';
9
9
  var METHODS = freezeCatalog({
10
10
  initializeCapability: entry('bridge.initialize', 'control', 'none', 'default', false, 'none'),
11
11
  probe: entry('bridge.probe', 'read', 'none', 'default', false, 'safe'),
12
12
  cancelActiveWrite: entry('write.cancel', 'control', 'none', 'default', false, 'idempotent'),
13
13
  getProjectSnapshot: entry('snapshot.read', 'read', 'none', 'snapshot', true, 'safe'),
14
14
  getProjectFileList: entry('snapshot.list', 'read', 'none', 'file_list', true, 'safe'),
15
+ listReferenceProjects: entry('reference.list', 'read', 'none', 'file_list', false, 'safe'),
16
+ getReferenceProjectSnapshot: entry('reference.read', 'read', 'none', 'snapshot', false, 'safe'),
17
+ cancelReferenceRead: entry('reference.cancel', 'control', 'none', 'default', false, 'idempotent'),
15
18
  invalidateProjectSnapshot: entry('snapshot.invalidate', 'cache', 'none', 'default', false, 'idempotent'),
16
19
  createCheckpoint: entry('checkpoint.create', 'page_state', 'none', 'default', false, 'no_retry'),
17
20
  ensureReviewing: entry('reviewing.enable', 'page_state', 'optional', 'default', true, 'idempotent'),
18
21
  ensureEditing: entry('reviewing.disable', 'page_state', 'optional', 'default', true, 'idempotent'),
19
22
  applyOperations: entry('document.write', 'document', 'required', 'writeback', true, 'no_retry'),
23
+ getWritebackReceipt: entry('writeback.receipt', 'read', 'required', 'default', true, 'safe'),
24
+ getSelectionContext: entry('editor.selection', 'read', 'required', 'default', true, 'safe'),
20
25
  binaryUploadBegin: entry('asset.stage', 'cache', 'required', 'default', false, 'no_retry'),
21
26
  binaryUploadAppend: entry('asset.stage', 'cache', 'none', 'writeback', true, 'no_retry'),
22
27
  binaryUploadCommit: entry('asset.write', 'document', 'required', 'writeback', true, 'no_retry'),
28
+ binaryUploadStatus: entry('asset.receipt', 'read', 'required', 'default', true, 'safe'),
23
29
  binaryUploadAbort: entry('asset.stage', 'cache', 'none', 'default', false, 'idempotent'),
24
30
  jumpToPosition: entry('editor.navigate', 'navigation', 'required', 'default', false, 'idempotent'),
25
31
  reconcileTrackedChangeCapture: entry('tracked_changes.read', 'read', 'required', 'default', false, 'safe'),