codex-overleaf-link 2.4.1 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/README.md +275 -305
  2. package/README.zh-CN.md +290 -320
  3. package/extension/bootstrap/background.js +99 -19
  4. package/extension/bootstrap/manifest.template.json +9 -4
  5. package/extension/bootstrap/popup.html +11 -16
  6. package/extension/bootstrap/popupFallback.js +55 -0
  7. package/extension/bootstrap/update.js +25 -2
  8. package/extension/bootstrap/updateStatus.js +1 -0
  9. package/extension/runtime-manifest.json +3 -1
  10. package/extension/src/background.js +234 -56
  11. package/extension/src/backgroundBootstrapMigration.js +181 -0
  12. package/extension/src/backgroundSharedSessions.js +440 -0
  13. package/extension/src/backgroundUpdateCoordinator.js +541 -381
  14. package/extension/src/backgroundUpdateSafety.js +173 -0
  15. package/extension/src/content/activeTurnControl.js +16 -2
  16. package/extension/src/content/applyResultFormatters.js +46 -73
  17. package/extension/src/content/assetTransferBroker.js +244 -12
  18. package/extension/src/content/changeHistoryView.js +175 -0
  19. package/extension/src/content/composerAttachments.js +117 -67
  20. package/extension/src/content/composerPanel.js +41 -8
  21. package/extension/src/content/contentRuntime.js +1084 -1099
  22. package/extension/src/content/diagnosticsController.js +122 -97
  23. package/extension/src/content/diagnosticsExport.js +236 -0
  24. package/extension/src/content/diagnosticsPanel.js +78 -19
  25. package/extension/src/content/diffReviewPanel.js +8 -5
  26. package/extension/src/content/directoryCleanupRecovery.js +54 -0
  27. package/extension/src/content/generated/content.bundle.js +14680 -3606
  28. package/extension/src/content/generated/content.bundle.meta.json +30 -3
  29. package/extension/src/content/globalPreferencesController.js +1 -1
  30. package/extension/src/content/legacyGlobalRegistry.js +25 -1
  31. package/extension/src/content/localSkillsPanel.js +141 -16
  32. package/extension/src/content/markdownDomRenderer.js +9 -4
  33. package/extension/src/content/markdownText.js +5 -6
  34. package/extension/src/content/modelPicker.js +8 -5
  35. package/extension/src/content/nativeCompatibilityController.js +45 -20
  36. package/extension/src/content/otWarmMirror.js +4 -5
  37. package/extension/src/content/otWarmMirrorController.js +17 -20
  38. package/extension/src/content/pageBridgeClient.js +33 -5
  39. package/extension/src/content/panelMaintenance.js +87 -132
  40. package/extension/src/content/panelRenderer.js +10 -0
  41. package/extension/src/content/pendingInputView.js +109 -76
  42. package/extension/src/content/projectProviderSelection.js +13 -4
  43. package/extension/src/content/projectSessionCleanup.js +109 -62
  44. package/extension/src/content/projectSettingsCoordinator.js +39 -2
  45. package/extension/src/content/providerSettingsCoordinator.js +63 -14
  46. package/extension/src/content/providerSettingsDialog.js +724 -113
  47. package/extension/src/content/recentProjects.js +21 -6
  48. package/extension/src/content/runActivitySummary.js +665 -0
  49. package/extension/src/content/runCompletionMeta.js +344 -0
  50. package/extension/src/content/runController.js +40 -15
  51. package/extension/src/content/runFailureNotice.js +34 -12
  52. package/extension/src/content/runGuidanceController.js +76 -30
  53. package/extension/src/content/runGuidanceView.js +59 -10
  54. package/extension/src/content/runPresence.js +306 -0
  55. package/extension/src/content/runQueueScheduler.js +150 -43
  56. package/extension/src/content/runRecoveryActions.js +146 -0
  57. package/extension/src/content/runResultActions.js +11 -8
  58. package/extension/src/content/runReviewController.js +574 -0
  59. package/extension/src/content/runScrollLayout.js +21 -2
  60. package/extension/src/content/runTimelineView.js +315 -290
  61. package/extension/src/content/scopedPersistencePanelState.js +51 -6
  62. package/extension/src/content/selectionContextView.js +300 -0
  63. package/extension/src/content/sensitivePreflight.js +140 -0
  64. package/extension/src/content/sessionForkController.js +80 -17
  65. package/extension/src/content/sessionManager.js +1 -1
  66. package/extension/src/content/sessionPersistence.js +6 -1
  67. package/extension/src/content/settingsPanel.js +84 -55
  68. package/extension/src/content/settingsWorkbench.js +379 -0
  69. package/extension/src/content/sharedSessionViewSync.js +109 -0
  70. package/extension/src/content/subagentActivityView.js +195 -0
  71. package/extension/src/content/trackedChangeCaptureController.js +7 -3
  72. package/extension/src/content/updateIdle.js +4 -1
  73. package/extension/src/content/updateNotice.js +179 -56
  74. package/extension/src/content/updateSafetyReceiver.js +58 -0
  75. package/extension/src/content/writebackController.js +308 -2
  76. package/extension/src/content/writebackOrchestrator.js +213 -199
  77. package/extension/src/content/writebackPlan.js +231 -0
  78. package/extension/src/content/writebackRecovery.js +122 -0
  79. package/extension/src/content/writingStyleSettings.js +600 -0
  80. package/extension/src/content/writtenChangesView.js +152 -0
  81. package/extension/src/page/binaryAssetUploader.js +223 -23
  82. package/extension/src/page/fileMover.js +256 -0
  83. package/extension/src/page/overleafProjectSnapshot.js +1 -0
  84. package/extension/src/page/ownedDirectoryCleanup.js +94 -0
  85. package/extension/src/page/referenceProjects.js +149 -0
  86. package/extension/src/page/reviewContext.js +113 -0
  87. package/extension/src/page/saveState.js +20 -6
  88. package/extension/src/page/snapshotRouter.js +124 -48
  89. package/extension/src/page/textCoordinates.js +102 -0
  90. package/extension/src/page/textFileCreator.js +442 -71
  91. package/extension/src/page/trackedChangeCapture.js +53 -57
  92. package/extension/src/page/trackedChangeOwnership.js +216 -0
  93. package/extension/src/page/trackedChangeReplay.js +184 -0
  94. package/extension/src/page/trackedChangesLifecycle.js +343 -339
  95. package/extension/src/page/treeOperations.js +33 -12
  96. package/extension/src/page/updateSafetyProbe.js +41 -0
  97. package/extension/src/page/writebackReceiptJournal.js +114 -0
  98. package/extension/src/page/writebackRouter.js +242 -201
  99. package/extension/src/pageBridge.js +73 -102
  100. package/extension/src/popup.js +261 -65
  101. package/extension/src/shared/agentTranscript.js +41 -4
  102. package/extension/src/shared/auditRecords.js +73 -0
  103. package/extension/src/shared/changeHistoryModel.js +94 -0
  104. package/extension/src/shared/compatibility.js +22 -6
  105. package/extension/src/shared/compileAdapter.js +101 -37
  106. package/extension/src/shared/composerAttachmentDraft.js +151 -0
  107. package/extension/src/shared/directoryCleanupProof.js +43 -0
  108. package/extension/src/shared/failureReasons.js +329 -3
  109. package/extension/src/shared/globalPreferences.js +31 -14
  110. package/extension/src/shared/governanceRules.js +4 -37
  111. package/extension/src/shared/i18n.js +389 -25
  112. package/extension/src/shared/managedUpdateProjection.js +8 -5
  113. package/extension/src/shared/nativeRequestIdentity.js +1 -0
  114. package/extension/src/shared/pageRpcContract.js +9 -2
  115. package/extension/src/shared/projectFiles.js +21 -44
  116. package/extension/src/shared/providerProfiles.js +114 -3
  117. package/extension/src/shared/runActivityModel.js +361 -0
  118. package/extension/src/shared/runExecutionSnapshot.js +8 -2
  119. package/extension/src/shared/runExecutionSnapshotCodec.js +16 -4
  120. package/extension/src/shared/runInputQueue.js +48 -5
  121. package/extension/src/shared/scopedPersistenceBrowserAdapter.js +6 -3
  122. package/extension/src/shared/selectionContext.js +37 -0
  123. package/extension/src/shared/sessionState.js +166 -30
  124. package/extension/src/shared/settlementFacts.js +10 -2
  125. package/extension/src/shared/sharedSessionBridge.js +311 -0
  126. package/extension/src/shared/sharedSessionTransfer.js +140 -0
  127. package/extension/src/shared/staleGuard.js +118 -13
  128. package/extension/src/shared/storageDb.js +77 -78
  129. package/extension/src/shared/storageMigration.js +74 -111
  130. package/extension/src/shared/storageRunActions.js +211 -22
  131. package/extension/src/shared/storageValuePruning.js +40 -0
  132. package/extension/src/shared/subagentActivityModel.js +174 -0
  133. package/extension/src/shared/undoOperations.js +216 -6
  134. package/extension/src/shared/updateConsent.js +42 -11
  135. package/extension/src/shared/updateRuntimeIdentity.js +1 -1
  136. package/extension/src/shared/writebackIntent.js +78 -0
  137. package/extension/src/shared/writebackOperationEvidence.js +4 -15
  138. package/extension/src/shared/writebackSettlement.js +67 -48
  139. package/extension/src/shared/writingStyle.js +33 -0
  140. package/extension/styles/panel.css +1987 -385
  141. package/extension/styles/popup.css +110 -0
  142. package/native-host/src/anthropicBridgeRequest.js +6 -3
  143. package/native-host/src/anthropicBridgeResponse.js +6 -2
  144. package/native-host/src/anthropicMessagesBridge.js +24 -16
  145. package/native-host/src/bootstrapMigration.js +296 -0
  146. package/native-host/src/bootstrapMigrationContract.js +101 -0
  147. package/native-host/src/bootstrapUpdate.js +233 -0
  148. package/native-host/src/bootstrapUpdateWatchdog.js +44 -0
  149. package/native-host/src/chatBridgeResponse.js +10 -0
  150. package/native-host/src/chatCompletionsBridge.js +21 -15
  151. package/native-host/src/codexConfigPaths.js +106 -0
  152. package/native-host/src/codexHome.js +66 -73
  153. package/native-host/src/codexHomeScope.js +124 -0
  154. package/native-host/src/codexInheritedAuth.js +90 -0
  155. package/native-host/src/codexLocalSkills.js +301 -0
  156. package/native-host/src/codexModelRecovery.js +107 -0
  157. package/native-host/src/codexPromptAssembly.js +33 -12
  158. package/native-host/src/codexProviderLaunch.js +3 -3
  159. package/native-host/src/codexProviderTest.js +24 -26
  160. package/native-host/src/codexRuntimeIdentity.js +1 -0
  161. package/native-host/src/codexSessionRunner.js +211 -318
  162. package/native-host/src/codexSessionTiming.js +21 -8
  163. package/native-host/src/codexSkillIsolation.js +170 -0
  164. package/native-host/src/codexThreadFork.js +19 -3
  165. package/native-host/src/index.js +19 -7
  166. package/native-host/src/managedInstall.js +115 -39
  167. package/native-host/src/managedInstallRecovery.js +140 -0
  168. package/native-host/src/managedRuntimeEvidence.js +57 -0
  169. package/native-host/src/mirrorWorkspace.js +92 -22
  170. package/native-host/src/nativeDoctor.js +15 -0
  171. package/native-host/src/nativeEnvironment.js +70 -0
  172. package/native-host/src/nativeHelperLifecycle.js +21 -0
  173. package/native-host/src/nativeHostRegistration.js +33 -0
  174. package/native-host/src/nativeQuotas.js +15 -8
  175. package/native-host/src/nativeRunLifecycle.js +71 -0
  176. package/native-host/src/overleafWorkspaceRules.js +16 -0
  177. package/native-host/src/processStopBarrier.js +115 -0
  178. package/native-host/src/projectPathPlatform.js +30 -0
  179. package/native-host/src/providerHttp.js +80 -0
  180. package/native-host/src/providerModelCatalog.js +4 -3
  181. package/native-host/src/providerProfile.js +17 -3
  182. package/native-host/src/providerReasoning.js +10 -11
  183. package/native-host/src/providerRuntime.js +1 -0
  184. package/native-host/src/providerStore.js +76 -14
  185. package/native-host/src/releaseTransport.js +14 -5
  186. package/native-host/src/responsesPassthroughBridge.js +266 -52
  187. package/native-host/src/runtimeInstaller.js +21 -1
  188. package/native-host/src/selectionScope.js +86 -0
  189. package/native-host/src/skills/parallel-subagents/SKILL.md +31 -3
  190. package/native-host/src/skills/writing-style-builder/SKILL.md +146 -0
  191. package/native-host/src/subagentAdmission.js +26 -0
  192. package/native-host/src/subagentBroker.js +176 -159
  193. package/native-host/src/subagentTelemetry.js +325 -0
  194. package/native-host/src/subagentWorkspace.js +103 -0
  195. package/native-host/src/subagentWorkspacePath.js +34 -0
  196. package/native-host/src/taskRunnerRuntime.js +130 -57
  197. package/native-host/src/tomlStatements.js +140 -0
  198. package/native-host/src/turnAttachments.js +113 -0
  199. package/native-host/src/updateManager.js +406 -38
  200. package/native-host/src/updateNetworkControl.js +75 -0
  201. package/native-host/src/updateTrust.js +21 -2
  202. package/native-host/src/vendor/pdfjs/LICENSE +177 -0
  203. package/native-host/src/vendor/pdfjs/SOURCE.txt +3 -0
  204. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  205. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  206. package/native-host/src/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
  207. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  208. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  209. package/native-host/src/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
  210. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  211. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  212. package/native-host/src/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  213. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  214. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  215. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  216. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  217. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  218. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  219. package/native-host/src/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
  220. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  221. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  222. package/native-host/src/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
  223. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  224. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  225. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  226. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  227. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  228. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  229. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  230. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  231. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  232. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  233. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  234. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  235. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  236. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  237. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  238. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  239. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  240. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  241. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  242. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  243. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  244. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  245. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  246. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  247. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  248. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  249. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  250. package/native-host/src/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
  251. package/native-host/src/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
  252. package/native-host/src/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  253. package/native-host/src/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  254. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  255. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  256. package/native-host/src/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  257. package/native-host/src/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  258. package/native-host/src/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  259. package/native-host/src/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  260. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  261. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  262. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  263. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  264. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  265. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  266. package/native-host/src/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
  267. package/native-host/src/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
  268. package/native-host/src/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
  269. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  270. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  271. package/native-host/src/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
  272. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  273. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  274. package/native-host/src/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
  275. package/native-host/src/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
  276. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  277. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  278. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  279. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  280. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  281. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  282. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  283. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  284. package/native-host/src/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
  285. package/native-host/src/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
  286. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  287. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  288. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  289. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  290. package/native-host/src/vendor/pdfjs/cmaps/H.bcmap +0 -0
  291. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  292. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  293. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  294. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  295. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  296. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  297. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  298. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  299. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  300. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  301. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  302. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  303. package/native-host/src/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
  304. package/native-host/src/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
  305. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  306. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  307. package/native-host/src/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
  308. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  309. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  310. package/native-host/src/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
  311. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  312. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  313. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  314. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  315. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  316. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  317. package/native-host/src/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
  318. package/native-host/src/vendor/pdfjs/cmaps/LICENSE +36 -0
  319. package/native-host/src/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
  320. package/native-host/src/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
  321. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  322. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  323. package/native-host/src/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
  324. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  325. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  326. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  327. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  328. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  329. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  330. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  331. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  332. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  333. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  334. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  335. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  336. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  337. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  338. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  339. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  340. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  341. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  342. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  343. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  344. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  345. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  346. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  347. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  348. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  349. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  350. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  351. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  352. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  353. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  354. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  355. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  356. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  357. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  358. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  359. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  360. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  361. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  362. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  363. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  364. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  365. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  366. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  367. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  368. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  369. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  370. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  371. package/native-host/src/vendor/pdfjs/cmaps/V.bcmap +0 -0
  372. package/native-host/src/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  373. package/native-host/src/vendor/pdfjs/pdf.mjs +26740 -0
  374. package/native-host/src/vendor/pdfjs/pdf.worker.mjs +62201 -0
  375. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  376. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  377. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  378. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  379. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  380. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  381. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  382. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  383. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  384. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  385. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  386. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
  387. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  388. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  389. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  390. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  391. package/native-host/src/writingStyleEvidence.js +102 -0
  392. package/native-host/src/writingStylePdfWorker.js +35 -0
  393. package/native-host/src/writingStyleProfile.js +165 -0
  394. package/native-host/src/writingStyleRuntime.js +475 -0
  395. package/native-host/src/writingStyleStore.js +73 -0
  396. package/package.json +1 -1
  397. package/scripts/install-managed.mjs +1 -0
@@ -0,0 +1,173 @@
1
+ (function installBackgroundUpdateSafety(root) {
2
+ 'use strict';
3
+ const blocked = () => ({ idle: false, saved: false, blockers: ['tab_probe_unavailable'] });
4
+ // Chrome storage serializes object keys independently of insertion order.
5
+ // Preserve every key/value and array position when comparing readback.
6
+ function sameStored(left, right) {
7
+ if (left === right) return true;
8
+ if (!left || !right || typeof left !== 'object' || typeof right !== 'object') return false;
9
+ if (Array.isArray(left) || Array.isArray(right)) {
10
+ return Array.isArray(left) && Array.isArray(right) && left.length === right.length
11
+ && left.every((value, index) => sameStored(value, right[index]));
12
+ }
13
+ const leftKeys = Object.keys(left), rightKeys = Object.keys(right);
14
+ return leftKeys.length === rightKeys.length
15
+ && leftKeys.every(key => Object.prototype.hasOwnProperty.call(right, key) && sameStored(left[key], right[key]));
16
+ }
17
+ function create(options) {
18
+ const bindings = new Map();
19
+ const tabsKey = 'codex-overleaf-managed-update-tabs-v1';
20
+ const guardKey = 'codex-overleaf-managed-update-guarded-tabs-v1';
21
+ async function ownerMatches(binding) {
22
+ if (!options.isExecutionLocked()) return false;
23
+ const response = await options.request({ id: crypto.randomUUID(), method: 'update.status',
24
+ params: { bootstrapRevision: String(root.__CODEX_OVERLEAF_BOOTSTRAP_REVISION__ || '') } });
25
+ const tx = response?.ok && response.result?.transaction;
26
+ return tx?.id === binding.transactionId && tx.targetVersion === binding.targetVersion
27
+ && tx.sourceVersion === binding.sourceVersion && tx.state === binding.expectedState;
28
+ }
29
+ async function snapshot(tabId, documentId) {
30
+ const results = await chrome.scripting.executeScript({ target: documentId ? { tabId, documentIds: [documentId] }
31
+ : { tabId, frameIds: [0] }, world: 'ISOLATED', func: () => ({ url: location.href }) });
32
+ const item = results?.length === 1 && results[0];
33
+ return item?.frameId === 0 && item.documentId && typeof item.result?.url === 'string'
34
+ ? { documentId: item.documentId, url: item.result.url } : null;
35
+ }
36
+ async function saveProbe(message, sender) {
37
+ const binding = bindings.get(sender?.tab?.id);
38
+ if (!binding || sender.id !== chrome.runtime.id || sender.frameId !== 0 || sender.documentId !== binding.documentId
39
+ || sender.url !== binding.url || message.token !== binding.token || message.transactionId !== binding.transactionId
40
+ || message.nonce !== binding.nonce || !await ownerMatches(binding)) return { ok: false };
41
+ const before = await snapshot(binding.tabId, binding.documentId);
42
+ if (before?.url !== binding.url) return { ok: false };
43
+ const results = await chrome.scripting.executeScript({ target: { tabId: binding.tabId, documentIds: [binding.documentId] },
44
+ world: 'MAIN', func: url => globalThis.CodexOverleafUpdateSafetyProbe?.probe(url), args: [binding.url] });
45
+ const after = await snapshot(binding.tabId, binding.documentId);
46
+ if (after?.url !== binding.url || message.nonce !== binding.nonce || !await ownerMatches(binding)
47
+ || results?.length !== 1 || results[0].documentId !== binding.documentId || results[0].frameId !== 0) return { ok: false };
48
+ return { ok: true, nonce: message.nonce, result: results[0].result };
49
+ }
50
+ chrome.runtime.onMessage.addListener((message, sender, respond) => {
51
+ if (message?.type !== 'codex-overleaf/migration-save-probe') return undefined;
52
+ saveProbe(message, sender).then(respond).catch(() => respond({ ok: false }));
53
+ return true;
54
+ });
55
+ async function probe(tab, owner) {
56
+ try {
57
+ const current = await snapshot(tab.id);
58
+ if (!current || current.url !== tab.url) return blocked();
59
+ let binding = bindings.get(tab.id);
60
+ if (binding && (binding.documentId !== current.documentId || binding.url !== current.url
61
+ || binding.transactionId !== owner.transactionId)) return blocked();
62
+ if (!binding) {
63
+ binding = { ...owner, ...current, tabId: tab.id, token: crypto.randomUUID(), nonce: '' };
64
+ if (!await ownerMatches(binding)) return blocked();
65
+ bindings.set(tab.id, binding);
66
+ }
67
+ binding.expectedState = owner.expectedState;
68
+ if (!binding.installed) {
69
+ const target = { tabId: tab.id, documentIds: [binding.documentId] };
70
+ await chrome.scripting.executeScript({ target, world: 'MAIN',
71
+ files: ['runtime/src/page/saveState.js', 'runtime/src/page/updateSafetyProbe.js'] });
72
+ await chrome.scripting.executeScript({ target, world: 'ISOLATED',
73
+ files: ['runtime/src/shared/pageRpcContract.js', 'runtime/src/content/updateIdle.js', 'runtime/src/content/updateSafetyReceiver.js'] });
74
+ const installed = await chrome.scripting.executeScript({ target, world: 'ISOLATED',
75
+ func: value => globalThis.CodexOverleafUpdateSafetyReceiver?.install(value, {
76
+ UpdateIdle: globalThis.CodexOverleafUpdateIdle, PageRpcContract: globalThis.CodexOverleafPageRpcContract
77
+ }), args: [binding] });
78
+ if (installed?.length !== 1 || installed[0].documentId !== binding.documentId
79
+ || installed[0].result?.ok !== true || installed[0].result.url !== binding.url) return blocked();
80
+ binding.installed = true;
81
+ }
82
+ if (!await ownerMatches(binding)) return blocked();
83
+ binding.nonce = crypto.randomUUID();
84
+ const nonce = binding.nonce;
85
+ let timer;
86
+ const response = await Promise.race([
87
+ chrome.tabs.sendMessage(tab.id, { type: 'codex-overleaf/migration-idle-probe', ...binding },
88
+ { documentId: binding.documentId }),
89
+ new Promise(resolve => { timer = setTimeout(() => resolve(null), 3500); })
90
+ ]).finally(() => clearTimeout(timer));
91
+ const after = await snapshot(tab.id, binding.documentId);
92
+ if (!response?.safetyOnly || response.token !== binding.token || response.transactionId !== binding.transactionId
93
+ || response.targetVersion !== binding.targetVersion || response.nonce !== nonce || response.url !== binding.url
94
+ || after?.url !== binding.url || !await ownerMatches(binding)) return blocked();
95
+ return response;
96
+ } catch (_) { return blocked(); }
97
+ }
98
+ async function protectReloadTabs(transaction) {
99
+ const owner = { transactionId: transaction.id, sourceVersion: transaction.sourceVersion,
100
+ targetVersion: transaction.targetVersion, expectedState: 'bootstrap_pending' };
101
+ if (!await ownerMatches(owner)) return false;
102
+ const stored = await chrome.storage.local.get([tabsKey, guardKey]);
103
+ if (stored[guardKey]?.transactionId === transaction.id && !stored[tabsKey]?.length) return true;
104
+ if (stored[guardKey]?.state === 'guarded' && stored[guardKey].transactionId !== transaction.id) {
105
+ const open = new Set((await chrome.tabs.query({})).map(tab => tab.id));
106
+ for (const entry of stored[guardKey].entries || []) {
107
+ if (!open.has(entry.tabId)) continue;
108
+ const current = await snapshot(entry.tabId).catch(() => null);
109
+ if (!entry.documentId || !current || current.documentId === entry.documentId) return false;
110
+ }
111
+ }
112
+ const entries = await Promise.all((stored[tabsKey] || []).map(async tabId => ({ tabId,
113
+ ...await snapshot(tabId).catch(() => null) })));
114
+ const guard = { transactionId: transaction.id, sourceVersion: transaction.sourceVersion,
115
+ targetVersion: transaction.targetVersion, state: 'guarded', entries };
116
+ const current = await chrome.storage.local.get([tabsKey, guardKey]);
117
+ if (!sameStored(current, stored) || !await ownerMatches(owner)) return false;
118
+ await chrome.storage.local.set({ [guardKey]: guard, [tabsKey]: [] });
119
+ const readback = await chrome.storage.local.get([tabsKey, guardKey]);
120
+ return sameStored(readback[guardKey], guard) && readback[tabsKey]?.length === 0;
121
+ }
122
+ async function releaseReloadTabs(transaction, expectedState = 'bootstrap_pending') {
123
+ const owner = { transactionId: transaction.id, sourceVersion: transaction.sourceVersion,
124
+ targetVersion: transaction.targetVersion, expectedState };
125
+ if (!await ownerMatches(owner)) return false;
126
+ const stored = await chrome.storage.local.get([tabsKey, guardKey]);
127
+ const guard = stored[guardKey];
128
+ if (guard?.transactionId !== transaction.id || guard.state !== 'guarded' || stored[tabsKey]?.length) return false;
129
+ const open = new Set((await chrome.tabs.query({})).map(tab => tab.id));
130
+ const ids = [];
131
+ for (const entry of guard.entries) {
132
+ if (!open.has(entry.tabId)) continue;
133
+ if (!entry.documentId || !entry.url) return false;
134
+ const current = await snapshot(entry.tabId, entry.documentId).catch(() => null);
135
+ if (current?.documentId !== entry.documentId || current?.url !== entry.url) return false;
136
+ ids.push(entry.tabId);
137
+ }
138
+ const again = await chrome.storage.local.get([tabsKey, guardKey]);
139
+ if (!sameStored(again[guardKey], guard) || again[tabsKey]?.length || !await ownerMatches(owner)) return false;
140
+ await chrome.storage.local.set({ [tabsKey]: ids, [guardKey]: { ...guard, state: 'ready' } });
141
+ return true;
142
+ }
143
+ async function revalidate(tabs, owner) {
144
+ if (!await ownerMatches(owner)) return false;
145
+ for (const tab of tabs) {
146
+ const binding = bindings.get(tab.id);
147
+ if (!binding || binding.transactionId !== owner.transactionId) continue;
148
+ if ((await probe(tab, owner)).idle !== true) return false;
149
+ }
150
+ return ownerMatches(owner);
151
+ }
152
+ async function hasReplacedReloadDocument(transaction) {
153
+ const owner = { transactionId: transaction.id, sourceVersion: transaction.sourceVersion,
154
+ targetVersion: transaction.targetVersion, expectedState: 'rolled_back' };
155
+ if (!await ownerMatches(owner)) return false;
156
+ const stored = await chrome.storage.local.get([tabsKey, guardKey]);
157
+ const guard = stored[guardKey];
158
+ if (guard?.transactionId !== transaction.id || guard.state !== 'guarded' || stored[tabsKey]?.length) return false;
159
+ const open = new Set((await chrome.tabs.query({})).map(tab => tab.id));
160
+ for (const entry of guard.entries) {
161
+ if (!open.has(entry.tabId) || !entry.documentId) continue;
162
+ const current = await snapshot(entry.tabId).catch(() => null);
163
+ if (current && current.documentId !== entry.documentId) {
164
+ const again = await chrome.storage.local.get([tabsKey, guardKey]);
165
+ return sameStored(again, stored) && await ownerMatches(owner);
166
+ }
167
+ }
168
+ return false;
169
+ }
170
+ return Object.freeze({ probe, protectReloadTabs, releaseReloadTabs, revalidate, hasReplacedReloadDocument });
171
+ }
172
+ root.CodexOverleafBackgroundUpdateSafety = Object.freeze({ create });
173
+ })(globalThis);
@@ -94,12 +94,19 @@
94
94
  const journals = await listJournals(projectKey).catch(() => []);
95
95
  let changed = false;
96
96
  const acknowledgeIds = [];
97
+ const recoveredRuns = [];
97
98
  for (const journal of journals) {
98
99
  if (!journal?.terminal && !journal?.ownerLost) {
99
100
  continue;
100
101
  }
102
+ // Native completion can precede the owner's writeback and durable
103
+ // session save. A passive shared-history reader must not settle it.
104
+ if (options.requireOwnerLost === true && journal.ownerLost !== true) {
105
+ continue;
106
+ }
101
107
  const session = options.findSession?.(journal.sessionId);
102
- if (!session) {
108
+ if (!session || (session.projectId && session.projectId !== projectKey)
109
+ || (options.accountScopeId && session.accountScopeId && session.accountScopeId !== options.accountScopeId)) {
103
110
  continue;
104
111
  }
105
112
  let record = (session.runs || []).find(run => run.id === journal.clientRunId);
@@ -112,6 +119,11 @@
112
119
  if (!record) {
113
120
  continue;
114
121
  }
122
+ if (record.runProjectId && record.runProjectId !== projectKey) continue;
123
+ if (!record.runProjectId) record.runProjectId = projectKey;
124
+ if (record.status === 'running') {
125
+ options.normalizeInterruptedRun?.(record);
126
+ }
115
127
  const reloadReports = (record.events || []).filter(event => event?.failure?.source === 'panel_reload');
116
128
  record.events = (record.events || []).filter(event => event?.failure?.source !== 'panel_reload');
117
129
  const lastSequence = Number(record.nativeEventSeq || 0);
@@ -155,8 +167,10 @@
155
167
  options.pauseSessionQueue?.(session, 'page_reload');
156
168
  changed = true;
157
169
  acknowledgeIds.push(journal.requestId);
170
+ recoveredRuns.push({ sessionId: session.id, runId: record.id,
171
+ projectId: projectKey, accountScopeId: options.accountScopeId });
158
172
  }
159
- return { changed, acknowledgeIds };
173
+ return { changed, acknowledgeIds, recoveredRuns };
160
174
  }
161
175
 
162
176
  function destroy() {
@@ -85,7 +85,8 @@
85
85
  */
86
86
  function normalizeSkippedFailure(item) {
87
87
  if (!FailureReasons || !FailureReasons.normalizeFailureReason) return null;
88
- const failure = FailureReasons.normalizeFailureReason(item?.result, item?.operation || {}, { locale: getLocale() });
88
+ const normalize = FailureReasons.normalizeWritebackFailure || FailureReasons.normalizeFailureReason;
89
+ const failure = normalize(item?.result, item?.operation || {}, { locale: getLocale() });
89
90
  if (!failure || !failure.code) return null;
90
91
  const localized = FailureReasons.localizeFailureReason
91
92
  ? FailureReasons.localizeFailureReason(failure, getLocale(), failureReasonI18nLookup)
@@ -98,7 +99,7 @@
98
99
 
99
100
  function pickPrimarySkippedFailure(failures) {
100
101
  if (!FailureReasons || !FailureReasons.selectPrimaryFailure) return null;
101
- return FailureReasons.selectPrimaryFailure(failures);
102
+ return (FailureReasons.selectPrimaryWritebackFailure || FailureReasons.selectPrimaryFailure)(failures);
102
103
  }
103
104
 
104
105
  function failureReasonI18nLookup(key) {
@@ -134,6 +135,8 @@
134
135
  const code = result.code || '';
135
136
  const filePath = result.reasonParams?.filePath || operation.path || operation.from || operation.to || '';
136
137
  const withDebug = reason => appendApplyResultDebug(reason, result);
138
+ const catalogReason = formatCatalogFailureReason(result, filePath);
139
+ if (catalogReason) return withDebug(catalogReason);
137
140
  if (key === 'missingBaseFile' || code === 'missing_base_file') {
138
141
  const target = filePath || tx('this file', '这个文件');
139
142
  return withDebug(tx(
@@ -236,82 +239,52 @@
236
239
  return parts.join(', ');
237
240
  }
238
241
 
242
+ function formatCatalogFailureReason(result, path) {
243
+ if (!FailureReasons?.formatFailureReasonForDisplay) return '';
244
+ // Compact historical settlements can omit canonical validation fields.
245
+ // Their display is still recoverable without re-normalizing stored facts.
246
+ const failure = result.failure && typeof result.failure === 'object'
247
+ ? { ...result.failure, file: result.failure.file || result.file || path }
248
+ : FailureReasons.normalizeFailureReason(result, { path: result.file || path });
249
+ const display = FailureReasons.formatFailureReasonForDisplay(failure, getLocale(), failureReasonI18nLookup);
250
+ return display.localized ? display.message : '';
251
+ }
252
+
239
253
  function formatBridgeResultReason(result = {}, fallbackPath = '') {
240
- const code = result.code || '';
241
- const path = result.path || fallbackPath || '';
242
- if (getLocale() !== 'en') {
243
- return localizeVisibleReason(result.reason || result.error || result.code || tr('unknownReason'));
244
- }
245
- if (code === 'missing_tracked_changes') {
246
- return 'No matching Overleaf tracked-change records were found for this run, so Codex did not undo with text patches.';
247
- }
248
- if (code === 'tracked_change_file_open_failed') {
249
- return path
250
- ? `Could not open ${path} to find this run's tracked changes. Handle them manually in the Overleaf review tools.`
251
- : 'Could not open the file to find this run\'s tracked changes. Handle them manually in the Overleaf review tools.';
252
- }
253
- if (code === 'tracked_change_not_found') {
254
- return 'No matching tracked changes were found on the Overleaf page for this run.';
255
- }
256
- if (code === 'tracked_change_reject_control_not_found') {
257
- return path
258
- ? `Some tracked changes in ${path} remain, but the matching Reject button was not found. Reject them manually in Overleaf.`
259
- : 'Some tracked changes remain, but the matching Reject button was not found. Reject them manually in Overleaf.';
260
- }
261
- if (code === 'tracked_change_reject_not_confirmed') {
262
- return 'Codex clicked Reject, but Overleaf still shows this tracked change. Reject it manually in the Overleaf review panel.';
263
- }
264
- if (code === 'tracked_change_accept_control_not_found') {
265
- return path
266
- ? `Some tracked changes in ${path} remain, but the matching Accept button was not found. Accept them manually in Overleaf.`
267
- : 'Some tracked changes remain, but the matching Accept button was not found. Accept them manually in Overleaf.';
268
- }
269
- if (code === 'tracked_change_accept_not_confirmed') {
270
- return 'Codex clicked Accept, but Overleaf still shows this tracked change. Accept it manually in the Overleaf review panel.';
271
- }
272
- if (code === 'tracked_change_editor_undo_open_failed') {
273
- return path ? `Could not open ${path} for Overleaf native undo.` : 'Could not open the file for Overleaf native undo.';
274
- }
275
- if (code === 'tracked_change_editor_undo_current_mismatch') {
276
- return path
277
- ? `${path} no longer matches this run's written content, so Codex did not use Overleaf native undo.`
278
- : 'The current content no longer matches this run\'s written content, so Codex did not use Overleaf native undo.';
279
- }
280
- if (code === 'editor_undo_control_not_found') {
281
- return path
282
- ? `Could not find Overleaf's editor Undo button to undo this run in ${path}.`
283
- : 'Could not find Overleaf\'s editor Undo button to undo this run.';
284
- }
285
- if (code === 'editor_undo_no_progress') {
286
- return path
287
- ? `Codex clicked Overleaf Undo, but ${path} did not change.`
288
- : 'Codex clicked Overleaf Undo, but the file did not change.';
289
- }
290
- if (code === 'editor_undo_max_iterations') {
291
- return path
292
- ? `${path} did not return to its pre-run content after repeated Overleaf native undo steps. Codex stopped to avoid undoing other edits.`
293
- : 'The file did not return to its pre-run content after repeated Overleaf native undo steps. Codex stopped to avoid undoing other edits.';
294
- }
295
- if (code === 'tracked_change_undo_max_iterations') {
296
- return path
297
- ? `${path} still has tracked changes left. Codex stopped to avoid rejecting unrelated edits.`
298
- : 'Tracked changes are still left. Codex stopped to avoid rejecting unrelated edits.';
299
- }
300
- if (code === 'tracked_change_undo_verify_open_failed') {
301
- return path
302
- ? `Could not open ${path} after undo to verify content. Reload Overleaf and check manually.`
303
- : 'Could not open the file after undo to verify content. Reload Overleaf and check manually.';
304
- }
305
- if (code === 'tracked_change_undo_verify_failed') {
306
- return path
307
- ? `${path} did not return to its pre-run content after rejecting tracked changes. Check this run's changes in the Overleaf review panel.`
308
- : 'The file did not return to its pre-run content after rejecting tracked changes. Check this run\'s changes in the Overleaf review panel.';
309
- }
310
- return localizeVisibleReason(result.reason || result.error || result.code || tr('unknownReason'));
254
+ const path = result.file || result.path || fallbackPath || '';
255
+ return formatCatalogFailureReason(result, path)
256
+ || localizeVisibleReason(result.reason || result.error || result.code || tr('unknownReason'));
311
257
  }
312
258
 
259
+ const runtimeOwnedReasonPairs = [
260
+ ['The selected provider no longer exists.', '所选模型服务已不存在。'],
261
+ ['The selected provider has no usable revision.', '所选模型服务没有可用的配置版本。'],
262
+ ['The selected provider revision was not captured for this run.', '本轮任务未记录所选模型服务的配置版本。'],
263
+ ['The selected provider changed after this run was submitted.', '本轮任务提交后,所选模型服务的配置已发生变化。'],
264
+ ['The captured selection is invalid. Attach it again.', '已记录的选区无效,请重新添加。'],
265
+ ['Provider revision must be a finite non-negative integer.', '模型服务配置版本必须是有效的非负整数。'],
266
+ ['A stable matching Overleaf account is required for shared history.', '共享历史需要稳定且匹配的 Overleaf 账号。'],
267
+ ['The background storage connection was lost.', '后台存储连接已断开。'],
268
+ ['Shared history is unavailable. Reload the extension and this page.', '共享历史不可用,请重新加载扩展和当前页面。'],
269
+ ['The shared history lock disconnected.', '共享历史的存储锁连接已断开。'],
270
+ ['Another page is saving history. Retry after it finishes.', '其他页面正在保存历史,请待保存完成后重试。'],
271
+ ['The shared history lock was lost before completion.', '操作完成前,共享历史的存储锁已丢失。'],
272
+ ['A stable account scope is required for durable persistence.', '持久保存需要稳定的账号范围。'],
273
+ ['A cross-realm browser lock is required for durable persistence.', '持久保存需要能够跨页面协调的浏览器锁。'],
274
+ ['Shared session storage is unavailable.', '共享会话存储不可用。'],
275
+ ['Native host request failed.', '本地主机请求失败。'],
276
+ ['Native host disconnected', '本地主机连接已断开。']
277
+ ];
278
+
313
279
  function localizeVisibleReason(reason) {
314
280
  const text = String(reason || '').trim();
281
+ for (const [en, zh] of runtimeOwnedReasonPairs) {
282
+ if (text === en || text === zh) return tx(en, zh);
283
+ }
284
+ const scoped = /^(?:Scoped persistence failed: |限定范围的持久保存失败:)(invalid_commit|stale_view|revision_conflict|queue_revision_conflict|invalid_queue_mutation|queue_claim_conflict)$/.exec(text);
285
+ if (scoped) return tx(`Scoped persistence failed: ${scoped[1]}`, `限定范围的持久保存失败:${scoped[1]}`);
286
+ const localized = FailureReasons?.localizeFailureMessage?.(text, getLocale(), failureReasonI18nLookup);
287
+ if (localized && localized !== text) return localized;
315
288
  if (!text || getLocale() !== 'en') {
316
289
  return text;
317
290
  }