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
@@ -20,10 +20,47 @@ if (!globalThis.CodexOverleafGlobalPreferences) {
20
20
  importScripts(runtimeBase ? chrome.runtime.getURL(`${runtimeBase}/src/shared/globalPreferences.js`) : 'shared/globalPreferences.js');
21
21
  }
22
22
  globalThis.CodexOverleafGlobalPreferences?.installBackground(chrome);
23
+ if (!globalThis.CodexOverleafStorageRunActions) {
24
+ const runtimeBase = String(globalThis.__CODEX_OVERLEAF_RUNTIME_BASE__ || '');
25
+ // The service worker has its own loading graph; the content bundle's
26
+ // registry and shared-module imports do not exist in this context.
27
+ const storageDependencies = [
28
+ ['CodexOverleafModuleRegistry', 'content/moduleRegistryKernel.js'],
29
+ ['CodexOverleafProjectFiles', 'shared/projectFiles.js'],
30
+ ['CodexOverleafDirectoryCleanupProof', 'shared/directoryCleanupProof.js'],
31
+ ['CodexOverleafUndoOperations', 'shared/undoOperations.js'],
32
+ ['CodexOverleafSelectionContext', 'shared/selectionContext.js'],
33
+ ['CodexOverleafWritebackIntent', 'shared/writebackIntent.js'],
34
+ ['CodexOverleafWritingStyle', 'shared/writingStyle.js'],
35
+ ['CodexOverleafStorageRunActions', 'shared/storageRunActions.js']
36
+ ];
37
+ for (const [globalName, scriptPath] of storageDependencies) {
38
+ if (!globalThis[globalName]) {
39
+ importScripts(runtimeBase ? chrome.runtime.getURL(`${runtimeBase}/src/${scriptPath}`) : scriptPath);
40
+ }
41
+ }
42
+ }
43
+ if (!globalThis.CodexOverleafSharedSessionTransfer) {
44
+ const runtimeBase = String(globalThis.__CODEX_OVERLEAF_RUNTIME_BASE__ || '');
45
+ importScripts(runtimeBase ? chrome.runtime.getURL(`${runtimeBase}/src/shared/sharedSessionTransfer.js`) : 'shared/sharedSessionTransfer.js');
46
+ }
47
+ if (!globalThis.CodexOverleafSharedSessionsBackground) {
48
+ const runtimeBase = String(globalThis.__CODEX_OVERLEAF_RUNTIME_BASE__ || '');
49
+ importScripts(runtimeBase ? chrome.runtime.getURL(`${runtimeBase}/src/backgroundSharedSessions.js`) : 'backgroundSharedSessions.js');
50
+ }
51
+ globalThis.CodexOverleafSharedSessionsBackground.installBackground(chrome);
23
52
  if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
24
53
  const runtimeBase = String(globalThis.__CODEX_OVERLEAF_RUNTIME_BASE__ || '');
25
54
  importScripts(runtimeBase ? chrome.runtime.getURL(`${runtimeBase}/src/shared/updateRuntimeIdentity.js`) : 'shared/updateRuntimeIdentity.js');
26
55
  }
56
+ if (!globalThis.CodexOverleafBootstrapMigration) {
57
+ const runtimeBase = String(globalThis.__CODEX_OVERLEAF_RUNTIME_BASE__ || '');
58
+ importScripts(runtimeBase ? chrome.runtime.getURL(`${runtimeBase}/src/backgroundBootstrapMigration.js`) : 'backgroundBootstrapMigration.js');
59
+ }
60
+ if (!globalThis.CodexOverleafBackgroundUpdateSafety) {
61
+ const runtimeBase = String(globalThis.__CODEX_OVERLEAF_RUNTIME_BASE__ || '');
62
+ importScripts(runtimeBase ? chrome.runtime.getURL(`${runtimeBase}/src/backgroundUpdateSafety.js`) : 'backgroundUpdateSafety.js');
63
+ }
27
64
 
28
65
  (function initBackground() {
29
66
  'use strict';
@@ -35,8 +72,10 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
35
72
  const MANAGED_OVERLEAF_MATCHES = [
36
73
  'https://www.overleaf.com/project',
37
74
  'https://overleaf.com/project',
75
+ 'https://cn.overleaf.com/project',
38
76
  'https://www.overleaf.com/project/*',
39
- 'https://overleaf.com/project/*'
77
+ 'https://overleaf.com/project/*',
78
+ 'https://cn.overleaf.com/project/*'
40
79
  ];
41
80
  const COMPATIBILITY_REQUIRED_METHODS = new Set([
42
81
  'codex.run',
@@ -58,7 +97,12 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
58
97
  'codex.providers.delete',
59
98
  'skills.list',
60
99
  'skills.install',
61
- 'skills.remove'
100
+ 'skills.remove',
101
+ 'writing-style.get',
102
+ 'writing-style.set',
103
+ 'codex.thread.fork',
104
+ 'asset.readChunk',
105
+ 'asset.release'
62
106
  ]);
63
107
  const RECOVERABLE_COMPATIBILITY_METHODS = new Set([
64
108
  'bridge.ping',
@@ -74,12 +118,38 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
74
118
  const pending = new Map();
75
119
  const runJournals = new Map();
76
120
  const journalWrites = new Map();
121
+ const journalLoads = new Map();
77
122
  const ownerBindings = new Map();
78
123
  const ownerCancelTimers = new Map();
79
124
  const RUN_JOURNAL_PREFIX = 'codex-overleaf:run-journal:';
80
125
  const RUN_JOURNAL_MAX_EVENTS = 300;
81
126
  const RUN_JOURNAL_MAX_BYTES = 512 * 1024;
82
127
  const managedBootstrapRuntime = isManagedBootstrapRuntime();
128
+ const migrationSafety = globalThis.CodexOverleafBackgroundUpdateSafety.create({
129
+ request: payload => sendNativeRequest(payload, null, { skipCompatibility: true }),
130
+ isExecutionLocked: () => managedBootstrapRuntime && managedUpdateExecutionLocked
131
+ });
132
+ let extensionInstallIdentity = { managed: managedBootstrapRuntime };
133
+ let installIdentityRead;
134
+ function readExtensionInstallIdentity() {
135
+ if (!managedBootstrapRuntime) return Promise.resolve(extensionInstallIdentity);
136
+ if (!installIdentityRead) installIdentityRead = (async () => {
137
+ try {
138
+ const response = await fetch(chrome.runtime.getURL('.codex-overleaf-managed-extension.json'));
139
+ const marker = response.ok ? await response.json() : null;
140
+ if (marker?.managedBy === 'codex-overleaf-link' && marker.kind === 'extension'
141
+ && marker.installIdentity?.extensionId === getCurrentExtensionId())
142
+ extensionInstallIdentity = { ...marker.installIdentity, managed: true };
143
+ } catch (_) { /* Old or missing marker: never guess the installation root. */ }
144
+ return extensionInstallIdentity;
145
+ })();
146
+ return installIdentityRead;
147
+ }
148
+ async function withExtensionInstallIdentity(request, response) {
149
+ return request?.method === 'bridge.ping'
150
+ ? { ...response, extensionInstallIdentity: await readExtensionInstallIdentity() } : response;
151
+ }
152
+
83
153
  globalThis.CodexOverleafNativeBridge = Object.freeze({
84
154
  requestInternal: payload => requestManagedInternal(payload),
85
155
  getPendingState: () => ({
@@ -89,6 +159,14 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
89
159
  });
90
160
 
91
161
  if (managedBootstrapRuntime) {
162
+ globalThis.CodexOverleafBootstrapMigration.init({
163
+ request: payload => sendNativeRequest(payload, null, { skipCompatibility: true }),
164
+ verifySafety: verifyManagedUpdateSafety,
165
+ protectReloadTabs: transaction => migrationSafety.protectReloadTabs(transaction),
166
+ releaseReloadTabs: (transaction, state) => migrationSafety.releaseReloadTabs(transaction, state),
167
+ hasReplacedReloadDocument: transaction => migrationSafety.hasReplacedReloadDocument(transaction),
168
+ setExecutionLocked: value => { managedUpdateExecutionLocked = value; }
169
+ });
92
170
  chrome.storage?.onChanged?.addListener((changes, area) => {
93
171
  if (area !== 'local' || !changes[MANAGED_UPDATE_STATE_KEY]?.newValue) {
94
172
  return;
@@ -168,13 +246,11 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
168
246
  }
169
247
 
170
248
  sendNativeRequest(message.payload, sender)
249
+ .then(result => withExtensionInstallIdentity(message.payload, result))
171
250
  .then(result => sendResponse(result))
172
251
  .catch(error => {
173
252
  const userFacingError = toUserFacingNativeError(error);
174
- sendResponse({
175
- ok: false,
176
- error: userFacingError
177
- });
253
+ withExtensionInstallIdentity(message.payload, { ok: false, error: userFacingError }).then(sendResponse);
178
254
  });
179
255
 
180
256
  return true;
@@ -196,13 +272,24 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
196
272
  return;
197
273
  }
198
274
  if (message.type === 'bind') {
199
- ownerBindings.set(portConnection, {
275
+ const binding = {
200
276
  requestId,
201
277
  projectKey: String(message.projectKey || ''),
202
- documentId: String(portConnection.sender?.documentId || '')
203
- });
204
- clearTimeout(ownerCancelTimers.get(requestId));
205
- ownerCancelTimers.delete(requestId);
278
+ documentId: String(portConnection.sender?.documentId || ''),
279
+ tabId: portConnection.sender?.tab?.id,
280
+ clientRunId: String(message.clientRunId || ''),
281
+ sessionId: String(message.sessionId || '')
282
+ };
283
+ ownerBindings.set(portConnection, binding);
284
+ restoreRunJournal(binding).then(journal => {
285
+ if (ownerBindings.get(portConnection) !== binding || !journal || runJournals.get(requestId) !== journal) return;
286
+ clearTimeout(ownerCancelTimers.get(requestId));
287
+ ownerCancelTimers.delete(requestId);
288
+ if (!journal.ownerLost) return;
289
+ journal.ownerLost = false;
290
+ journal.updatedAt = new Date().toISOString();
291
+ return queueJournalWrite(requestId);
292
+ }).catch(() => {});
206
293
  }
207
294
  });
208
295
  portConnection.onDisconnect.addListener(() => {
@@ -281,6 +368,7 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
281
368
  resolve,
282
369
  reject,
283
370
  tabId: sender?.tab?.id,
371
+ documentId: String(sender?.documentId || ''),
284
372
  request,
285
373
  method: request.method,
286
374
  retryClass: getNativeRetryClass(request.method),
@@ -303,6 +391,10 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
303
391
  }
304
392
 
305
393
  async function requestManagedInternal(payload) {
394
+ if (managedBootstrapRuntime && ['update.status', 'update.confirm'].includes(payload?.method)) {
395
+ payload = { ...payload, params: { ...payload.params,
396
+ bootstrapRevision: String(globalThis.__CODEX_OVERLEAF_BOOTSTRAP_REVISION__ || '') } };
397
+ }
306
398
  if (managedBootstrapRuntime && payload?.method === 'update.apply') {
307
399
  const gate = await verifyManagedUpdateSafety();
308
400
  if (!gate.ok) {
@@ -320,15 +412,25 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
320
412
  throw error;
321
413
  }
322
414
  }
323
- return sendNativeRequest(payload, null, { skipCompatibility: true });
415
+ const response = await sendNativeRequest(payload, null, { skipCompatibility: true });
416
+ if (payload?.method === 'update.confirm') {
417
+ globalThis.CodexOverleafBootstrapMigration.observeConfirmation(payload.params, response);
418
+ }
419
+ return response;
324
420
  }
325
421
 
326
- async function verifyManagedUpdateSafety() {
327
- const tabs = await chrome.tabs.query({ url: MANAGED_OVERLEAF_MATCHES }).catch(() => []);
328
- const editorTabs = tabs.filter(tab => (
422
+ async function verifyManagedUpdateSafety(migrationOwner) {
423
+ const tabs = await chrome.tabs.query({ url: MANAGED_OVERLEAF_MATCHES }).catch(() => null);
424
+ const editorTabs = (Array.isArray(tabs) ? tabs : []).filter(tab => (
329
425
  isManagedEditorTab(tab) && !tab.discarded && tab.status !== 'unloaded'
330
426
  ));
331
- const probes = await Promise.all(editorTabs.map(tab => probeManagedUpdateTab(tab.id)));
427
+ const probes = await Promise.all(editorTabs.map(async tab => {
428
+ const result = await probeManagedUpdateTab(tab.id);
429
+ return migrationOwner && result?.blockers?.includes('tab_probe_unavailable')
430
+ ? migrationSafety.probe(tab, migrationOwner) : result;
431
+ }));
432
+ // An unknown inventory cannot establish an idle safe point, even when Native is idle.
433
+ if (!Array.isArray(tabs)) probes.push({ idle: false, blockers: ['tab_inventory_unavailable'] });
332
434
  const nativeGate = await sendNativeRequest({
333
435
  id: crypto.randomUUID(),
334
436
  method: 'update.canApply',
@@ -340,6 +442,12 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
340
442
  message: getErrorMessage(error, 'Native Host update safety check failed.')
341
443
  }
342
444
  }));
445
+ if (migrationOwner) {
446
+ const after = await chrome.tabs.query({ url: MANAGED_OVERLEAF_MATCHES }).catch(() => null);
447
+ const inventory = values => JSON.stringify((values || []).map(tab => [tab.id, tab.url, tab.discarded, tab.status]).sort());
448
+ if (!after || inventory(after) !== inventory(tabs)) probes.push({ idle: false, blockers: ['tab_probe_unavailable'] });
449
+ else if (!await migrationSafety.revalidate(editorTabs, migrationOwner)) probes.push({ idle: false, blockers: ['tab_probe_unavailable'] });
450
+ }
343
451
  const pendingState = globalThis.CodexOverleafNativeBridge?.getPendingState?.() || {};
344
452
  const backgroundBlockers = Number(pendingState.executionRequests || 0) > 0
345
453
  ? ['background_execution_pending']
@@ -366,13 +474,15 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
366
474
  return { idle: false, blockers: ['tab_unavailable'] };
367
475
  }
368
476
  try {
369
- return await Promise.race([
477
+ const response = await Promise.race([
370
478
  chrome.tabs.sendMessage(tabId, { type: 'codex-overleaf/update-idle-probe' }),
371
479
  new Promise(resolve => setTimeout(() => resolve({
372
480
  idle: false,
373
481
  blockers: ['tab_probe_timeout']
374
482
  }), 3500))
375
483
  ]);
484
+ return typeof response?.idle === 'boolean' ? response
485
+ : { idle: false, blockers: ['tab_probe_unavailable'] };
376
486
  } catch (_error) {
377
487
  return { idle: false, blockers: ['tab_probe_unavailable'] };
378
488
  }
@@ -382,7 +492,7 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
382
492
  try {
383
493
  const url = new URL(tab?.url || '');
384
494
  return url.protocol === 'https:' &&
385
- (url.hostname === 'www.overleaf.com' || url.hostname === 'overleaf.com') &&
495
+ (['overleaf.com', 'www.overleaf.com', 'cn.overleaf.com'].includes(url.hostname)) &&
386
496
  /^\/project\/[^/]+(?:\/|$)/.test(url.pathname);
387
497
  } catch (_error) {
388
498
  return false;
@@ -409,6 +519,11 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
409
519
  }
410
520
 
411
521
  async function reconcileManagedUpdateTransaction() {
522
+ const migration = await globalThis.CodexOverleafBootstrapMigration.ready();
523
+ if (!migration.continueInitialization) return;
524
+ await globalThis.__CODEX_OVERLEAF_BOOTSTRAP_READY__;
525
+ const coordinator = globalThis.CodexOverleafUpdateCoordinator;
526
+ const recoveryOwner = await coordinator?.captureRecoveryOwner?.();
412
527
  const response = await sendNativeRequest({
413
528
  id: crypto.randomUUID(),
414
529
  method: 'update.status',
@@ -420,22 +535,7 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
420
535
 
421
536
  const transaction = response.result?.transaction || null;
422
537
  if (transaction?.state === 'superseded') {
423
- const activeVersion = response.result?.activeVersion || chrome.runtime.getManifest().version;
424
- await chrome.storage.local.remove([
425
- MANAGED_UPDATE_CONSENT_KEY,
426
- MANAGED_UPDATE_TABS_KEY
427
- ]);
428
- await setManagedUpdateState({
429
- state: 'idle',
430
- managed: true,
431
- currentVersion: activeVersion,
432
- latestVersion: activeVersion,
433
- transactionId: '',
434
- blocker: '',
435
- blockers: [],
436
- code: '',
437
- message: ''
438
- });
538
+ await coordinator?.settleSupersededTransaction?.(response.result, recoveryOwner);
439
539
  return;
440
540
  }
441
541
  const state = await getManagedUpdateState();
@@ -496,6 +596,16 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
496
596
  return null;
497
597
  }
498
598
 
599
+ const params = request.params || {};
600
+ if (request.method === 'codex.run' && params.focusFilesAreLiteral === true
601
+ && (params.restrictToFocusFiles === true || (Array.isArray(params.focusFiles) && params.focusFiles.length))
602
+ && evidence?.native?.capabilities?.literalProjectPaths !== true) {
603
+ return { ...createNativeUpdateRequiredBlock(request.method, {
604
+ ...evidence, status: 'native_capability_missing', classification: 'incompatible'
605
+ }), message: 'This Native Host does not support literal project paths. Reload the extension after installing the coordinated build.',
606
+ missingCapabilities: ['literalProjectPaths'] };
607
+ }
608
+
499
609
  if (isNativeMethodAllowedByCompatibility(request.method, evidence)) {
500
610
  return null;
501
611
  }
@@ -596,12 +706,13 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
596
706
  const command = CodexOverleafCompatibility?.buildInstallCommand?.(
597
707
  getNativeRecommendedVersion(evidence),
598
708
  evidence.native?.platform || evidence.platform,
599
- getCurrentExtensionId()
709
+ getCurrentExtensionId(),
710
+ extensionInstallIdentity
600
711
  );
601
712
  if (command) {
602
713
  return command;
603
714
  }
604
- return evidence.updateCommand || evidence.installCommand;
715
+ return managedBootstrapRuntime ? '' : evidence.updateCommand || evidence.installCommand;
605
716
  }
606
717
 
607
718
  function getCurrentExtensionId() {
@@ -853,7 +964,7 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
853
964
  try {
854
965
  const url = new URL(senderUrl);
855
966
  return url.protocol === 'https:' && (
856
- url.hostname === 'www.overleaf.com' || url.hostname === 'overleaf.com'
967
+ ['overleaf.com', 'www.overleaf.com', 'cn.overleaf.com'].includes(url.hostname)
857
968
  );
858
969
  } catch (_error) {
859
970
  return false;
@@ -886,6 +997,8 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
886
997
  task: sanitizeJournalString(params.task).slice(0, 12000),
887
998
  mode: String(params.mode || ''),
888
999
  model: String(params.model || ''),
1000
+ ownerTabId: pendingRequest.tabId,
1001
+ ownerDocumentId: pendingRequest.documentId,
889
1002
  createdAt: new Date().toISOString(),
890
1003
  updatedAt: new Date().toISOString(),
891
1004
  terminal: false,
@@ -893,6 +1006,7 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
893
1006
  nextSequence: 1,
894
1007
  events: []
895
1008
  };
1009
+ invalidateJournalLoad(id);
896
1010
  runJournals.set(id, journal);
897
1011
  pruneInMemoryRunJournals();
898
1012
  return queueJournalWrite(id);
@@ -957,9 +1071,9 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
957
1071
  }
958
1072
 
959
1073
  function sanitizeJournalString(value) {
1074
+ // Journal replay is conversation recovery. Credential configuration is not
1075
+ // copied by createRunJournal; quoted values in model events stay intact.
960
1076
  return String(value || '')
961
- .replace(/\b(?:sk|hf|glpat|npm|ghp|github_pat|AKIA|AIza)[_-]?[A-Za-z0-9_-]{12,}\b/g, '[REDACTED]')
962
- .replace(/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g, '[REDACTED]')
963
1077
  .replace(/(?:file:\/\/)?\/(?:Users|home|private|var|opt|Library)\/[^\s"'<>]+/g, '[local path]')
964
1078
  .slice(0, 131072);
965
1079
  }
@@ -969,11 +1083,15 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
969
1083
  if (!storage || !runJournals.has(id)) {
970
1084
  return Promise.resolve();
971
1085
  }
1086
+ const journal = runJournals.get(id);
1087
+ const snapshot = JSON.parse(JSON.stringify(journal));
1088
+ return queueJournalStorage(id, () => runJournals.get(id) === journal
1089
+ ? storage.set({ [RUN_JOURNAL_PREFIX + id]: snapshot }) : undefined);
1090
+ }
1091
+
1092
+ function queueJournalStorage(id, operation) {
972
1093
  const previous = journalWrites.get(id) || Promise.resolve();
973
- const snapshot = JSON.parse(JSON.stringify(runJournals.get(id)));
974
- const next = previous.catch(() => {}).then(() => storage.set({
975
- [RUN_JOURNAL_PREFIX + id]: snapshot
976
- }));
1094
+ const next = previous.catch(() => {}).then(operation);
977
1095
  journalWrites.set(id, next);
978
1096
  return next.finally(() => {
979
1097
  if (journalWrites.get(id) === next) {
@@ -982,7 +1100,67 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
982
1100
  });
983
1101
  }
984
1102
 
1103
+ function invalidateJournalLoad(id) {
1104
+ const load = journalLoads.get(id);
1105
+ if (load) load.cancelled = true;
1106
+ journalLoads.delete(id);
1107
+ }
1108
+
1109
+ function journalMatchesBinding(journal, binding) {
1110
+ return journal?.requestId === binding.requestId && Boolean(binding.projectKey)
1111
+ && journal.projectKey === binding.projectKey
1112
+ && (!Number.isInteger(journal.ownerTabId) || journal.ownerTabId === binding.tabId)
1113
+ && (!journal.ownerDocumentId || journal.ownerDocumentId === binding.documentId)
1114
+ && (!binding.clientRunId || journal.clientRunId === binding.clientRunId)
1115
+ && (!binding.sessionId || journal.sessionId === binding.sessionId);
1116
+ }
1117
+
1118
+ function hasRunOwner(binding) {
1119
+ return Array.from(ownerBindings.values()).some(owner => owner.requestId === binding.requestId
1120
+ && owner.projectKey === binding.projectKey && owner.tabId === binding.tabId
1121
+ && owner.documentId === binding.documentId && owner.clientRunId === binding.clientRunId
1122
+ && owner.sessionId === binding.sessionId);
1123
+ }
1124
+
1125
+ async function restoreRunJournal(binding) {
1126
+ const id = binding.requestId;
1127
+ if (runJournals.has(id)) {
1128
+ const journal = runJournals.get(id);
1129
+ return journalMatchesBinding(journal, binding) ? journal : null;
1130
+ }
1131
+ if (!chrome.storage?.session || !binding.projectKey) return null;
1132
+ let load = journalLoads.get(id);
1133
+ if (!load) {
1134
+ load = { cancelled: false };
1135
+ load.promise = (async () => {
1136
+ await (journalWrites.get(id) || Promise.resolve()).catch(() => {});
1137
+ if (load.cancelled) return null;
1138
+ const values = await chrome.storage.session.get(RUN_JOURNAL_PREFIX + id);
1139
+ const stored = values?.[RUN_JOURNAL_PREFIX + id];
1140
+ if (load.cancelled || !journalMatchesBinding(stored, binding) || !Array.isArray(stored.events)) return null;
1141
+ const journal = runJournals.get(id) || stored;
1142
+ trimRunJournal(journal);
1143
+ runJournals.set(id, journal);
1144
+ return journal;
1145
+ })().finally(() => {
1146
+ if (journalLoads.get(id) === load) journalLoads.delete(id);
1147
+ });
1148
+ journalLoads.set(id, load);
1149
+ }
1150
+ const journal = await load.promise;
1151
+ return journalMatchesBinding(journal, binding) ? journal : null;
1152
+ }
1153
+
1154
+ function removeRunJournal(id) {
1155
+ invalidateJournalLoad(id);
1156
+ runJournals.delete(id);
1157
+ // Retain the chain until removal completes; old queued writes cannot follow it.
1158
+ return queueJournalStorage(id, () => !runJournals.has(id)
1159
+ ? chrome.storage?.session?.remove?.(RUN_JOURNAL_PREFIX + id) : undefined);
1160
+ }
1161
+
985
1162
  async function listRunJournals(projectKey) {
1163
+ await Promise.allSettled(Array.from(journalLoads.values(), load => load.promise));
986
1164
  await Promise.allSettled(Array.from(journalWrites.values()));
987
1165
  const storage = chrome.storage?.session;
988
1166
  if (!storage) {
@@ -992,7 +1170,8 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
992
1170
  const entries = Object.entries(values || {})
993
1171
  .filter(([key, value]) => key.startsWith(RUN_JOURNAL_PREFIX)
994
1172
  && (!projectKey || value?.projectKey === projectKey)
995
- && (value?.terminal || value?.ownerLost))
1173
+ && (value?.terminal || value?.ownerLost)
1174
+ && !Array.from(ownerBindings.values()).some(binding => journalMatchesBinding(value, binding)))
996
1175
  .sort((a, b) => String(a[1]?.createdAt || '').localeCompare(String(b[1]?.createdAt || '')));
997
1176
  return entries.slice(-16).map(([_key, value]) => value);
998
1177
  }
@@ -1006,9 +1185,7 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
1006
1185
  .sort((a, b) => String(a.createdAt || '').localeCompare(String(b.createdAt || '')))
1007
1186
  .slice(0, runJournals.size - 16);
1008
1187
  for (const journal of oldest) {
1009
- runJournals.delete(journal.requestId);
1010
- journalWrites.delete(journal.requestId);
1011
- chrome.storage?.session?.remove?.(RUN_JOURNAL_PREFIX + journal.requestId).catch?.(() => {});
1188
+ removeRunJournal(journal.requestId).catch(() => {});
1012
1189
  }
1013
1190
  }
1014
1191
 
@@ -1016,27 +1193,26 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
1016
1193
  if (!id) {
1017
1194
  return;
1018
1195
  }
1019
- await (journalWrites.get(id) || Promise.resolve()).catch(() => {});
1020
- runJournals.delete(id);
1021
- journalWrites.delete(id);
1022
- await chrome.storage?.session?.remove?.(RUN_JOURNAL_PREFIX + id);
1196
+ await removeRunJournal(id);
1023
1197
  }
1024
1198
 
1025
1199
  async function interruptOwnerlessRun(binding) {
1026
1200
  ownerCancelTimers.delete(binding.requestId);
1027
- if (Array.from(ownerBindings.values()).some(value => value.requestId === binding.requestId)) {
1201
+ if (hasRunOwner(binding)) {
1028
1202
  return;
1029
1203
  }
1030
- const journal = runJournals.get(binding.requestId);
1204
+ const journal = await restoreRunJournal(binding).catch(() => null);
1205
+ if (hasRunOwner(binding)) return;
1206
+ if (journal && runJournals.get(binding.requestId) !== journal) return;
1031
1207
  if (journal) {
1032
1208
  journal.ownerLost = true;
1033
1209
  journal.updatedAt = new Date().toISOString();
1034
1210
  await queueJournalWrite(binding.requestId).catch(() => {});
1035
1211
  }
1036
- if (!pending.has(binding.requestId)) {
1037
- return;
1038
- }
1212
+ if (hasRunOwner(binding)) return;
1213
+ if (journal && runJournals.get(binding.requestId) !== journal) return;
1039
1214
  try {
1215
+ if (!pending.has(binding.requestId) || !journalMatchesBinding(journal, binding)) return;
1040
1216
  sendNativeCancel({
1041
1217
  method: 'codex.cancel',
1042
1218
  params: {
@@ -1046,6 +1222,8 @@ if (!globalThis.CodexOverleafUpdateRuntimeIdentity) {
1046
1222
  });
1047
1223
  } catch (_error) {
1048
1224
  // The original request disconnect path will settle the journal.
1225
+ } finally {
1226
+ pruneInMemoryRunJournals();
1049
1227
  }
1050
1228
  }
1051
1229
  })();