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
@@ -12,27 +12,46 @@
12
12
  const tx = options.tx;
13
13
  const tr = options.tr;
14
14
 
15
+ let installIdentity = options.getExtensionCompatibilityMetadata?.()?.installIdentity || {};
16
+ function resolveInstallCommand(compatibility = {}) {
17
+ const metadata = options.getExtensionCompatibilityMetadata?.() || {};
18
+ installIdentity = { ...installIdentity, ...(metadata.installIdentity || {}), ...(compatibility.installIdentity || {}) };
19
+ if (installIdentity.managed) return Compatibility?.buildInstallCommand?.(
20
+ compatibility.recommendedVersion || Compatibility?.BUILD_TARGET_VERSION,
21
+ compatibility.native?.platform || compatibility.platform || installIdentity.platform,
22
+ metadata.extensionId, installIdentity
23
+ ) || '';
24
+ return compatibility.updateCommand || compatibility.installCommand || options.installCommand || '';
25
+ }
26
+
15
27
  function sendNative(payload) {
16
28
  return dispatch(payload, 'sendNative');
17
29
  }
18
30
 
19
- function sendBackgroundNative(payload) {
20
- return dispatch(payload, 'sendBackgroundNative');
31
+ function sendBackgroundNative(payload, context = {}) {
32
+ return dispatch(payload, 'sendBackgroundNative', context);
21
33
  }
22
34
 
23
- async function dispatch(payload, channelMethod) {
24
- const compatibilityGate = await ensureForMethod(payload?.method);
25
- if (!compatibilityGate.ok) return compatibilityGate.response;
26
- // Post-Undo cache bookkeeping must survive the ended run's cancellation.
27
- if (gatedMethods.has(payload?.method) && payload.method !== 'mirror.invalidate') {
28
- options.throwIfCancellationRequested?.();
35
+ async function dispatch(payload, channelMethod, context = {}) {
36
+ let compatibilityGate;
37
+ try {
38
+ compatibilityGate = await ensureForMethod(payload?.method, context);
39
+ if (!compatibilityGate.ok) return compatibilityGate.response;
40
+ // Post-Undo cache bookkeeping must survive the ended run's cancellation.
41
+ if (gatedMethods.has(payload?.method) && payload.method !== 'mirror.invalidate') {
42
+ options.throwIfCancellationRequested?.();
43
+ }
44
+ context.assertCurrent?.();
45
+ } catch (error) {
46
+ if (context.assertCurrent && error && typeof error === 'object') error.requestDispatched = false;
47
+ throw error;
29
48
  }
30
49
  return nativeChannel[channelMethod](
31
50
  attachEvidence(payload, compatibilityGate.compatibility)
32
51
  );
33
52
  }
34
53
 
35
- async function ensureForMethod(method) {
54
+ async function ensureForMethod(method, { assertCurrent } = {}) {
36
55
  const metadata = options.getExtensionCompatibilityMetadata?.() || {};
37
56
  const params = Compatibility?.buildBridgePingParams
38
57
  ? Compatibility.buildBridgePingParams(metadata)
@@ -41,9 +60,12 @@
41
60
  method: 'bridge.ping',
42
61
  params
43
62
  });
63
+ // A retired run must not publish even a compatibility failure into a successor.
64
+ assertCurrent?.();
44
65
  const compatibility = Compatibility?.evaluateNativeCompatibility
45
66
  ? Compatibility.evaluateNativeCompatibility(response, metadata)
46
67
  : options.fallbackNativeCompatibility(response);
68
+ const installCommand = resolveInstallCommand(compatibility);
47
69
  const allowed = !gatedMethods.has(method) ||
48
70
  (Compatibility?.isNativeMethodAllowed
49
71
  ? Compatibility.isNativeMethodAllowed(method, compatibility)
@@ -51,14 +73,14 @@
51
73
  if (allowed) return { ok: true, compatibility };
52
74
 
53
75
  const message = formatBlockedMessage(method, compatibility);
54
- const installCommand = options.installCommand;
55
76
  const error = {
56
77
  code: 'native_update_required',
57
78
  message,
58
79
  status: compatibility.status || 'unknown_native',
59
80
  classification: options.getNativeCompatibilityClassification(compatibility),
60
- installCommand: compatibility.installCommand || installCommand,
61
- updateCommand: compatibility.updateCommand || compatibility.installCommand || installCommand,
81
+ installIdentity,
82
+ installCommand,
83
+ updateCommand: installCommand,
62
84
  currentNativeVersion: compatibility.currentNativeVersion
63
85
  || compatibility.nativeVersion
64
86
  || compatibility.native?.version
@@ -102,6 +124,7 @@
102
124
  : {};
103
125
  const response = await sendBackgroundNative({ method: 'bridge.ping', params });
104
126
  const compatibility = Compatibility.evaluateNativeCompatibility(response, metadata);
127
+ resolveInstallCommand(compatibility);
105
128
  const classification = options.getNativeCompatibilityClassification(compatibility);
106
129
  if (classification === 'compatible') {
107
130
  options.setBadge?.(renderer.headerEl, { type: 'none' });
@@ -158,9 +181,7 @@
158
181
  || compatibility.nativeVersion
159
182
  || native.version
160
183
  || tx('missing', '未安装');
161
- const command = compatibility.updateCommand
162
- || compatibility.installCommand
163
- || options.installCommand;
184
+ const command = resolveInstallCommand(compatibility);
164
185
  const releaseUrl = compatibility.releaseUrl || '';
165
186
  const overlay = options.document.createElement('div');
166
187
  overlay.className = 'codex-plugin-confirm';
@@ -193,10 +214,12 @@
193
214
  `Extension v${extensionVersion} / Native v${nativeVersion}`,
194
215
  `扩展 v${extensionVersion} / Native v${nativeVersion}`
195
216
  ),
196
- tx(
197
- 'Run the platform-specific command below, reload the extension, then refresh Overleaf.',
198
- '运行下面的平台命令,重新加载扩展,然后刷新 Overleaf。'
199
- )
217
+ !command && installIdentity.managed
218
+ ? tx('Repair Managed using the original managed root, browser and extension ID with install-managed.',
219
+ '请使用原管理根目录、浏览器及扩展 ID,通过 install-managed 修复托管安装。')
220
+ : tx('Run the command below, reload the extension, then refresh Overleaf.', '运行下面的命令,重新加载扩展,然后刷新 Overleaf。')
221
+ + (installIdentity.managed && (native.platform || installIdentity.platform) === 'win32'
222
+ ? tx(' Use PowerShell.', ' 请使用 PowerShell。') : '')
200
223
  ].join('\n\n');
201
224
  const commandCode = options.document.createElement('code');
202
225
  commandCode.textContent = command;
@@ -221,7 +244,9 @@
221
244
  copy.type = 'button';
222
245
  copy.className = 'codex-plugin-confirm-confirm';
223
246
  copy.textContent = tx('Copy command', '复制命令');
247
+ copy.disabled = !command;
224
248
  copy.addEventListener('click', async () => {
249
+ if (!command) return;
225
250
  await options.navigator.clipboard.writeText(command);
226
251
  copy.textContent = tx('Copied', '已复制');
227
252
  });
@@ -237,7 +262,7 @@
237
262
  if (event.target === overlay) overlay.remove();
238
263
  });
239
264
  panel.append(overlay);
240
- copy.focus();
265
+ (command ? copy : close).focus();
241
266
  }
242
267
 
243
268
  function scheduleFirstUseOnboardingTip() {
@@ -833,7 +833,7 @@
833
833
  if (getCurrentProjectId() !== projectId) return { useExistingMirror: false, reason: 'project_changed' };
834
834
  const otWarmStart = otWarmMirrorController.canUseOtWarmStart({
835
835
  enabled: isExperimentalOtEnabled() && !otWarmMirrorState.failureActive,
836
- focusFiles,
836
+ focusFiles, focusFilesAreLiteral: true,
837
837
  mirrorStatus
838
838
  });
839
839
  if (!mirrorStatus?.exists || (!otWarmStart.ok && !isMirrorReusable(mirrorStatus))) {
@@ -858,10 +858,9 @@
858
858
  return { useExistingMirror: false, reason: 'overlay_probe_failed', mirrorStatus };
859
859
  }
860
860
  if (getCurrentProjectId() !== projectId) return { useExistingMirror: false, reason: 'project_changed' };
861
- const fileOverlays = buildSnapshotFileOverlays(overlayProject, focusFiles);
862
- if (!fileOverlays.length) {
863
- return { useExistingMirror: false, reason: 'missing_current_overlay', mirrorStatus };
864
- }
861
+ const fileOverlays = buildSnapshotFileOverlays(overlayProject, focusFiles).filter(file =>
862
+ !otWarmStart.ok || focusFiles.some(path => normalizeSnapshotPath(path) === normalizeSnapshotPath(file.path)));
863
+ if (!fileOverlays.length) return { useExistingMirror: false, reason: 'missing_current_overlay', mirrorStatus };
865
864
  if (focusFiles.length && !focusFiles.every(path => {
866
865
  const normalized = normalizeSnapshotPath(path);
867
866
  return fileOverlays.some(file => normalizeSnapshotPath(file.path) === normalized);
@@ -1,10 +1,10 @@
1
1
  (function initCodexOverleafOtWarmMirrorController(root, factory) {
2
2
  if (typeof module === 'object' && module.exports) {
3
- module.exports = factory();
3
+ module.exports = factory(require('../shared/projectFiles'));
4
4
  } else {
5
- root.CodexOverleafOtWarmMirrorController = factory();
5
+ root.CodexOverleafModuleRegistry.define('OtWarmMirrorController', ['ProjectFiles'], factory);
6
6
  }
7
- })(typeof window !== 'undefined' ? window : globalThis, function otWarmMirrorControllerFactory() {
7
+ })(typeof window !== 'undefined' ? window : globalThis, function otWarmMirrorControllerFactory(projectFiles) {
8
8
  'use strict';
9
9
 
10
10
  const OT_POLL_INTERVAL_MS = 1000;
@@ -17,6 +17,7 @@
17
17
  const OT_MAX_BATCH_BYTES = 2 * 1024 * 1024;
18
18
  const encoder = typeof TextEncoder === 'function' ? new TextEncoder() : null;
19
19
  const PAUSE_STATES = new Set(['running', 'writing', 'undoing', 'compiling']);
20
+ const normalizeLiteralPath = projectFiles.normalizeSafeProjectPath;
20
21
 
21
22
  function buildPatchFilesRequest({ projectId, events, nativeCompatibility } = {}) {
22
23
  const files = [];
@@ -24,8 +25,8 @@
24
25
  if (files.length >= OT_MAX_PATCH_BATCH) {
25
26
  break;
26
27
  }
27
- const filePath = normalizePath(event?.path);
28
- if (!isSafeRelativePath(filePath) || typeof event?.baseHash !== 'string') {
28
+ const filePath = normalizeLiteralPath(event?.path);
29
+ if (!filePath || typeof event?.baseHash !== 'string') {
29
30
  continue;
30
31
  }
31
32
  const baseHash = event.baseHash.trim();
@@ -73,7 +74,7 @@
73
74
  return { pause: false };
74
75
  }
75
76
 
76
- function canUseOtWarmStart({ enabled, focusFiles, mirrorStatus, now = Date.now() } = {}) {
77
+ function canUseOtWarmStart({ enabled, focusFiles, focusFilesAreLiteral = false, mirrorStatus, now = Date.now() } = {}) {
77
78
  if (!enabled) {
78
79
  return { ok: false, reason: 'disabled' };
79
80
  }
@@ -82,7 +83,10 @@
82
83
  }
83
84
  if (mirrorStatus.dirty === true) return { ok: false, reason: 'mirror_dirty' };
84
85
 
85
- const normalizedFocusFiles = normalizePaths(focusFiles);
86
+ if (focusFilesAreLiteral === true && Array.isArray(focusFiles) && focusFiles.some(path => !normalizeLiteralPath(path))) {
87
+ return { ok: false, reason: 'invalid_focus_paths' };
88
+ }
89
+ const normalizedFocusFiles = normalizePaths(focusFiles, focusFilesAreLiteral === true);
86
90
  if (!normalizedFocusFiles.length) {
87
91
  return { ok: false, reason: 'no_focus_files' };
88
92
  }
@@ -94,7 +98,7 @@
94
98
  }
95
99
  const age = now - Date.parse(file.observedAt ?? file.lastPatchAt ?? '');
96
100
  if (!Number.isFinite(age) || age < 0 || age > OT_FRESHNESS_MAX_AGE_MS) continue;
97
- const filePath = normalizePath(file.path);
101
+ const filePath = normalizeLiteralPath(file.path);
98
102
  if (filePath) {
99
103
  freshFiles.add(filePath);
100
104
  }
@@ -124,9 +128,9 @@
124
128
  let bytes = next.reduce((sum, event) => sum + patchBytes(event), 0);
125
129
  if (next.length > OT_MAX_PENDING_EVENTS || bytes > OT_MAX_PENDING_BYTES) return { ok: false, reason: 'ot_queue_limit' };
126
130
  for (const input of events) {
127
- const path = normalizePath(input?.path);
131
+ const path = normalizeLiteralPath(input?.path);
128
132
  const time = typeof input?.observedAt === 'number' ? input.observedAt : Date.parse(input?.observedAt || '');
129
- if (!isSafeRelativePath(path) || path.length > 1024 || typeof input?.nextContent !== 'string' ||
133
+ if (!path || path.length > 1024 || typeof input?.nextContent !== 'string' ||
130
134
  typeof input.baseHash !== 'string' || !input.baseHash || input.baseHash.length > 128) {
131
135
  return { ok: false, reason: 'ot_event_invalid' };
132
136
  }
@@ -165,7 +169,7 @@
165
169
  }
166
170
  if (!events.length || Number(result.appliedCount) !== events.length || !Array.isArray(result.appliedFiles) ||
167
171
  result.appliedFiles.length !== events.length || !result.appliedFiles.every((file, index) =>
168
- normalizePath(file?.path) === events[index].path && (!events[index].nextHash || file.hash === events[index].nextHash))) {
172
+ normalizeLiteralPath(file?.path) === events[index].path && (!events[index].nextHash || file.hash === events[index].nextHash))) {
169
173
  return { ok: false, reason: 'mirror_patch_invalid_result' };
170
174
  }
171
175
  if (events.some(event => { const time = Date.parse(event.observedAt);
@@ -220,11 +224,11 @@
220
224
  .replace(/^\/+/, '');
221
225
  }
222
226
 
223
- function normalizePaths(value) {
227
+ function normalizePaths(value, literal = false) {
224
228
  const seen = new Set();
225
229
  const paths = [];
226
230
  for (const item of Array.isArray(value) ? value : []) {
227
- const filePath = normalizePath(item);
231
+ const filePath = literal ? normalizeLiteralPath(item) : normalizePath(item);
228
232
  if (!filePath || seen.has(filePath)) {
229
233
  continue;
230
234
  }
@@ -234,13 +238,6 @@
234
238
  return paths;
235
239
  }
236
240
 
237
- function isSafeRelativePath(filePath) {
238
- if (!filePath) {
239
- return false;
240
- }
241
- return !filePath.split('/').some(part => part === '.' || part === '..');
242
- }
243
-
244
241
  function isPrimitiveMetadata(value) {
245
242
  return ['string', 'number', 'boolean'].includes(typeof value);
246
243
  }
@@ -9,7 +9,7 @@
9
9
  ['src/shared/reviewing.js', 'codex-overleaf-reviewing-script'],
10
10
  ['src/shared/projectFiles.js', 'codex-overleaf-project-files-script'],
11
11
  ['src/shared/compatibility.js', 'codex-overleaf-compatibility-page-script'],
12
- ['src/shared/pageRpcContract.js', 'codex-overleaf-page-rpc-contract-script'],
12
+ ['src/shared/pageRpcContract.js', 'codex-overleaf-page-rpc-contract-script', true],
13
13
  ['src/shared/staleGuard.js', 'codex-overleaf-stale-guard-script'],
14
14
  ['src/shared/compileAdapter.js', 'codex-overleaf-compile-adapter-script'],
15
15
  ['src/shared/sensitiveScan.js', 'codex-overleaf-sensitive-scan-script'],
@@ -21,13 +21,21 @@
21
21
  ['src/page/overleafProjectSnapshot.js', 'codex-overleaf-project-snapshot-script'],
22
22
  ['src/page/pageBridgeCapability.js', 'codex-overleaf-page-bridge-capability-script'],
23
23
  ['src/page/treeOperations.js', 'codex-overleaf-tree-operations-script', true],
24
+ ['src/page/ownedDirectoryCleanup.js', 'codex-overleaf-owned-directory-cleanup-script', true],
24
25
  ['src/page/textFileCreator.js', 'codex-overleaf-text-file-creator-script', true],
25
26
  ['src/page/binaryAssetUploader.js', 'codex-overleaf-binary-asset-uploader-script', true],
26
27
  ['src/page/snapshotRouter.js', 'codex-overleaf-snapshot-router-script'],
28
+ ['src/page/referenceProjects.js', 'codex-overleaf-reference-projects-script', true],
29
+ ['src/page/fileMover.js', 'codex-overleaf-file-mover-script', true],
27
30
  ['src/page/writeGuard.js', 'codex-overleaf-write-guard-script', true],
31
+ ['src/page/trackedChangeOwnership.js', 'codex-overleaf-tracked-change-ownership-script', true],
28
32
  ['src/page/trackedChangeCapture.js', 'codex-overleaf-tracked-change-capture-script', true],
33
+ ['src/page/trackedChangeReplay.js', 'codex-overleaf-tracked-change-replay-script', true],
34
+ ['src/page/reviewContext.js', 'codex-overleaf-review-context-script', true],
29
35
  ['src/page/trackedChangesLifecycle.js', 'codex-overleaf-tracked-changes-lifecycle-script', true],
30
36
  ['src/page/writebackRouter.js', 'codex-overleaf-writeback-router-script', true],
37
+ ['src/page/writebackReceiptJournal.js', 'codex-overleaf-writeback-receipt-script', true],
38
+ ['src/page/textCoordinates.js', 'codex-overleaf-text-coordinates-script', true],
31
39
  ['src/pageBridge.js', 'codex-overleaf-page-bridge-script', true]
32
40
  ]);
33
41
  const OPTIONAL_OT_SCRIPTS = Object.freeze([
@@ -44,6 +52,7 @@
44
52
  const Contract = options.contract;
45
53
  const Compatibility = options.compatibility;
46
54
  const timeoutOverrides = { ...(options.timeoutOverrides || {}) };
55
+ const now = options.now || Date.now;
47
56
  const revision = Contract.REVISION;
48
57
  const capability = createCapability(cryptoImpl);
49
58
  const activeCancellationHandlers = new Map();
@@ -66,11 +75,24 @@
66
75
  function send(method, params, policy = {}) {
67
76
  const id = cryptoImpl.randomUUID();
68
77
  return new Promise((resolve, reject) => {
69
- const timeoutMs = Number.isFinite(Number(policy.timeoutMs))
78
+ const requestTimeoutMs = Number.isFinite(Number(policy.timeoutMs))
70
79
  ? Number(policy.timeoutMs)
71
80
  : Contract.resolveTimeoutMs(method, timeoutOverrides);
81
+ // Review preparation and its nested writes share the transport budget.
82
+ if (Contract.getMethod(method)?.timeoutClass === 'lifecycle') {
83
+ params = { ...params, deadlineAt: params?.deadlineAt == null ? now() + requestTimeoutMs
84
+ : Number.isFinite(params.deadlineAt) ? Math.min(params.deadlineAt, now() + requestTimeoutMs) : params.deadlineAt };
85
+ }
86
+ const remainingMs = params?.deadlineAt == null ? Infinity
87
+ : Number.isFinite(params.deadlineAt) ? params.deadlineAt - now() : 0;
88
+ if (remainingMs <= 0) {
89
+ resolve({ ok: false, code: 'writeback_deadline_exceeded', changedDocument: false,
90
+ rpcMethod: method, error: 'The operation deadline expired before this request was sent.' });
91
+ return;
92
+ }
93
+ const timeoutMs = Math.min(requestTimeoutMs, remainingMs);
72
94
  const cancellable = policy.cancellation === 'content_abort';
73
- let settled = false;
95
+ let settled = false, dispatched = false;
74
96
  let timeout = null;
75
97
  function cleanup() {
76
98
  if (timeout !== null) windowRef.clearTimeout(timeout);
@@ -93,10 +115,16 @@
93
115
  const error = new Error('Codex run was cancelled by the user');
94
116
  error.code = 'codex_cancelled';
95
117
  error.cancelled = true;
118
+ error.requestDispatched = dispatched;
119
+ error.changedDocument = dispatched && Contract.getMethod(method)?.mutation === 'document';
120
+ if (dispatched && method === 'applyOperations') { error.requestId = id; error.rpcMethod = method; }
96
121
  rejectOnce(error);
97
122
  }
123
+ // Cancellation stops new requests; receipt settlement has its own non-cancellable policy.
124
+ if (cancellable && options.isCancellationRequested?.()) { cancelRequest(); return; }
98
125
  timeout = windowRef.setTimeout(() => {
99
- resolveOnce({ ok: false, error: 'Page bridge timed out' });
126
+ resolveOnce({ ok: false, error: 'Page bridge timed out',
127
+ ...(method === 'applyOperations' ? { code: 'page_bridge_timeout', rpcMethod: method, requestId: id } : {}) });
100
128
  }, timeoutMs);
101
129
  function onMessage(event) {
102
130
  if (event.source !== windowRef
@@ -111,11 +139,11 @@
111
139
  }
112
140
  if (cancellable) {
113
141
  activeCancellationHandlers.set(id, cancelRequest);
114
- if (options.isCancellationRequested?.()) windowRef.queueMicrotask(cancelRequest);
115
142
  }
116
143
  windowRef.addEventListener('message', onMessage);
117
144
  // Every low-level request remains one attempt. Higher layers must opt
118
145
  // into replay so a document mutation is never duplicated implicitly.
146
+ dispatched = true;
119
147
  windowRef.postMessage({
120
148
  source: 'codex-overleaf/content',
121
149
  id,