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.
- package/README.md +275 -305
- package/README.zh-CN.md +290 -320
- package/extension/bootstrap/background.js +99 -19
- package/extension/bootstrap/manifest.template.json +9 -4
- package/extension/bootstrap/popup.html +11 -16
- package/extension/bootstrap/popupFallback.js +55 -0
- package/extension/bootstrap/update.js +25 -2
- package/extension/bootstrap/updateStatus.js +1 -0
- package/extension/runtime-manifest.json +3 -1
- package/extension/src/background.js +234 -56
- package/extension/src/backgroundBootstrapMigration.js +181 -0
- package/extension/src/backgroundSharedSessions.js +440 -0
- package/extension/src/backgroundUpdateCoordinator.js +541 -381
- package/extension/src/backgroundUpdateSafety.js +173 -0
- package/extension/src/content/activeTurnControl.js +16 -2
- package/extension/src/content/applyResultFormatters.js +46 -73
- package/extension/src/content/assetTransferBroker.js +244 -12
- package/extension/src/content/changeHistoryView.js +175 -0
- package/extension/src/content/composerAttachments.js +117 -67
- package/extension/src/content/composerPanel.js +41 -8
- package/extension/src/content/contentRuntime.js +1084 -1099
- package/extension/src/content/diagnosticsController.js +122 -97
- package/extension/src/content/diagnosticsExport.js +236 -0
- package/extension/src/content/diagnosticsPanel.js +78 -19
- package/extension/src/content/diffReviewPanel.js +8 -5
- package/extension/src/content/directoryCleanupRecovery.js +54 -0
- package/extension/src/content/generated/content.bundle.js +14680 -3606
- package/extension/src/content/generated/content.bundle.meta.json +30 -3
- package/extension/src/content/globalPreferencesController.js +1 -1
- package/extension/src/content/legacyGlobalRegistry.js +25 -1
- package/extension/src/content/localSkillsPanel.js +141 -16
- package/extension/src/content/markdownDomRenderer.js +9 -4
- package/extension/src/content/markdownText.js +5 -6
- package/extension/src/content/modelPicker.js +8 -5
- package/extension/src/content/nativeCompatibilityController.js +45 -20
- package/extension/src/content/otWarmMirror.js +4 -5
- package/extension/src/content/otWarmMirrorController.js +17 -20
- package/extension/src/content/pageBridgeClient.js +33 -5
- package/extension/src/content/panelMaintenance.js +87 -132
- package/extension/src/content/panelRenderer.js +10 -0
- package/extension/src/content/pendingInputView.js +109 -76
- package/extension/src/content/projectProviderSelection.js +13 -4
- package/extension/src/content/projectSessionCleanup.js +109 -62
- package/extension/src/content/projectSettingsCoordinator.js +39 -2
- package/extension/src/content/providerSettingsCoordinator.js +63 -14
- package/extension/src/content/providerSettingsDialog.js +724 -113
- package/extension/src/content/recentProjects.js +21 -6
- package/extension/src/content/runActivitySummary.js +665 -0
- package/extension/src/content/runCompletionMeta.js +344 -0
- package/extension/src/content/runController.js +40 -15
- package/extension/src/content/runFailureNotice.js +34 -12
- package/extension/src/content/runGuidanceController.js +76 -30
- package/extension/src/content/runGuidanceView.js +59 -10
- package/extension/src/content/runPresence.js +306 -0
- package/extension/src/content/runQueueScheduler.js +150 -43
- package/extension/src/content/runRecoveryActions.js +146 -0
- package/extension/src/content/runResultActions.js +11 -8
- package/extension/src/content/runReviewController.js +574 -0
- package/extension/src/content/runScrollLayout.js +21 -2
- package/extension/src/content/runTimelineView.js +315 -290
- package/extension/src/content/scopedPersistencePanelState.js +51 -6
- package/extension/src/content/selectionContextView.js +300 -0
- package/extension/src/content/sensitivePreflight.js +140 -0
- package/extension/src/content/sessionForkController.js +80 -17
- package/extension/src/content/sessionManager.js +1 -1
- package/extension/src/content/sessionPersistence.js +6 -1
- package/extension/src/content/settingsPanel.js +84 -55
- package/extension/src/content/settingsWorkbench.js +379 -0
- package/extension/src/content/sharedSessionViewSync.js +109 -0
- package/extension/src/content/subagentActivityView.js +195 -0
- package/extension/src/content/trackedChangeCaptureController.js +7 -3
- package/extension/src/content/updateIdle.js +4 -1
- package/extension/src/content/updateNotice.js +179 -56
- package/extension/src/content/updateSafetyReceiver.js +58 -0
- package/extension/src/content/writebackController.js +308 -2
- package/extension/src/content/writebackOrchestrator.js +213 -199
- package/extension/src/content/writebackPlan.js +231 -0
- package/extension/src/content/writebackRecovery.js +122 -0
- package/extension/src/content/writingStyleSettings.js +600 -0
- package/extension/src/content/writtenChangesView.js +152 -0
- package/extension/src/page/binaryAssetUploader.js +223 -23
- package/extension/src/page/fileMover.js +256 -0
- package/extension/src/page/overleafProjectSnapshot.js +1 -0
- package/extension/src/page/ownedDirectoryCleanup.js +94 -0
- package/extension/src/page/referenceProjects.js +149 -0
- package/extension/src/page/reviewContext.js +113 -0
- package/extension/src/page/saveState.js +20 -6
- package/extension/src/page/snapshotRouter.js +124 -48
- package/extension/src/page/textCoordinates.js +102 -0
- package/extension/src/page/textFileCreator.js +442 -71
- package/extension/src/page/trackedChangeCapture.js +53 -57
- package/extension/src/page/trackedChangeOwnership.js +216 -0
- package/extension/src/page/trackedChangeReplay.js +184 -0
- package/extension/src/page/trackedChangesLifecycle.js +343 -339
- package/extension/src/page/treeOperations.js +33 -12
- package/extension/src/page/updateSafetyProbe.js +41 -0
- package/extension/src/page/writebackReceiptJournal.js +114 -0
- package/extension/src/page/writebackRouter.js +242 -201
- package/extension/src/pageBridge.js +73 -102
- package/extension/src/popup.js +261 -65
- package/extension/src/shared/agentTranscript.js +41 -4
- package/extension/src/shared/auditRecords.js +73 -0
- package/extension/src/shared/changeHistoryModel.js +94 -0
- package/extension/src/shared/compatibility.js +22 -6
- package/extension/src/shared/compileAdapter.js +101 -37
- package/extension/src/shared/composerAttachmentDraft.js +151 -0
- package/extension/src/shared/directoryCleanupProof.js +43 -0
- package/extension/src/shared/failureReasons.js +329 -3
- package/extension/src/shared/globalPreferences.js +31 -14
- package/extension/src/shared/governanceRules.js +4 -37
- package/extension/src/shared/i18n.js +389 -25
- package/extension/src/shared/managedUpdateProjection.js +8 -5
- package/extension/src/shared/nativeRequestIdentity.js +1 -0
- package/extension/src/shared/pageRpcContract.js +9 -2
- package/extension/src/shared/projectFiles.js +21 -44
- package/extension/src/shared/providerProfiles.js +114 -3
- package/extension/src/shared/runActivityModel.js +361 -0
- package/extension/src/shared/runExecutionSnapshot.js +8 -2
- package/extension/src/shared/runExecutionSnapshotCodec.js +16 -4
- package/extension/src/shared/runInputQueue.js +48 -5
- package/extension/src/shared/scopedPersistenceBrowserAdapter.js +6 -3
- package/extension/src/shared/selectionContext.js +37 -0
- package/extension/src/shared/sessionState.js +166 -30
- package/extension/src/shared/settlementFacts.js +10 -2
- package/extension/src/shared/sharedSessionBridge.js +311 -0
- package/extension/src/shared/sharedSessionTransfer.js +140 -0
- package/extension/src/shared/staleGuard.js +118 -13
- package/extension/src/shared/storageDb.js +77 -78
- package/extension/src/shared/storageMigration.js +74 -111
- package/extension/src/shared/storageRunActions.js +211 -22
- package/extension/src/shared/storageValuePruning.js +40 -0
- package/extension/src/shared/subagentActivityModel.js +174 -0
- package/extension/src/shared/undoOperations.js +216 -6
- package/extension/src/shared/updateConsent.js +42 -11
- package/extension/src/shared/updateRuntimeIdentity.js +1 -1
- package/extension/src/shared/writebackIntent.js +78 -0
- package/extension/src/shared/writebackOperationEvidence.js +4 -15
- package/extension/src/shared/writebackSettlement.js +67 -48
- package/extension/src/shared/writingStyle.js +33 -0
- package/extension/styles/panel.css +1987 -385
- package/extension/styles/popup.css +110 -0
- package/native-host/src/anthropicBridgeRequest.js +6 -3
- package/native-host/src/anthropicBridgeResponse.js +6 -2
- package/native-host/src/anthropicMessagesBridge.js +24 -16
- package/native-host/src/bootstrapMigration.js +296 -0
- package/native-host/src/bootstrapMigrationContract.js +101 -0
- package/native-host/src/bootstrapUpdate.js +233 -0
- package/native-host/src/bootstrapUpdateWatchdog.js +44 -0
- package/native-host/src/chatBridgeResponse.js +10 -0
- package/native-host/src/chatCompletionsBridge.js +21 -15
- package/native-host/src/codexConfigPaths.js +106 -0
- package/native-host/src/codexHome.js +66 -73
- package/native-host/src/codexHomeScope.js +124 -0
- package/native-host/src/codexInheritedAuth.js +90 -0
- package/native-host/src/codexLocalSkills.js +301 -0
- package/native-host/src/codexModelRecovery.js +107 -0
- package/native-host/src/codexPromptAssembly.js +33 -12
- package/native-host/src/codexProviderLaunch.js +3 -3
- package/native-host/src/codexProviderTest.js +24 -26
- package/native-host/src/codexRuntimeIdentity.js +1 -0
- package/native-host/src/codexSessionRunner.js +211 -318
- package/native-host/src/codexSessionTiming.js +21 -8
- package/native-host/src/codexSkillIsolation.js +170 -0
- package/native-host/src/codexThreadFork.js +19 -3
- package/native-host/src/index.js +19 -7
- package/native-host/src/managedInstall.js +115 -39
- package/native-host/src/managedInstallRecovery.js +140 -0
- package/native-host/src/managedRuntimeEvidence.js +57 -0
- package/native-host/src/mirrorWorkspace.js +92 -22
- package/native-host/src/nativeDoctor.js +15 -0
- package/native-host/src/nativeEnvironment.js +70 -0
- package/native-host/src/nativeHelperLifecycle.js +21 -0
- package/native-host/src/nativeHostRegistration.js +33 -0
- package/native-host/src/nativeQuotas.js +15 -8
- package/native-host/src/nativeRunLifecycle.js +71 -0
- package/native-host/src/overleafWorkspaceRules.js +16 -0
- package/native-host/src/processStopBarrier.js +115 -0
- package/native-host/src/projectPathPlatform.js +30 -0
- package/native-host/src/providerHttp.js +80 -0
- package/native-host/src/providerModelCatalog.js +4 -3
- package/native-host/src/providerProfile.js +17 -3
- package/native-host/src/providerReasoning.js +10 -11
- package/native-host/src/providerRuntime.js +1 -0
- package/native-host/src/providerStore.js +76 -14
- package/native-host/src/releaseTransport.js +14 -5
- package/native-host/src/responsesPassthroughBridge.js +266 -52
- package/native-host/src/runtimeInstaller.js +21 -1
- package/native-host/src/selectionScope.js +86 -0
- package/native-host/src/skills/parallel-subagents/SKILL.md +31 -3
- package/native-host/src/skills/writing-style-builder/SKILL.md +146 -0
- package/native-host/src/subagentAdmission.js +26 -0
- package/native-host/src/subagentBroker.js +176 -159
- package/native-host/src/subagentTelemetry.js +325 -0
- package/native-host/src/subagentWorkspace.js +103 -0
- package/native-host/src/subagentWorkspacePath.js +34 -0
- package/native-host/src/taskRunnerRuntime.js +130 -57
- package/native-host/src/tomlStatements.js +140 -0
- package/native-host/src/turnAttachments.js +113 -0
- package/native-host/src/updateManager.js +406 -38
- package/native-host/src/updateNetworkControl.js +75 -0
- package/native-host/src/updateTrust.js +21 -2
- package/native-host/src/vendor/pdfjs/LICENSE +177 -0
- package/native-host/src/vendor/pdfjs/SOURCE.txt +3 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
- package/native-host/src/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/LICENSE +36 -0
- package/native-host/src/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/pdf.mjs +26740 -0
- package/native-host/src/vendor/pdfjs/pdf.worker.mjs +62201 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
- package/native-host/src/writingStyleEvidence.js +102 -0
- package/native-host/src/writingStylePdfWorker.js +35 -0
- package/native-host/src/writingStyleProfile.js +165 -0
- package/native-host/src/writingStyleRuntime.js +475 -0
- package/native-host/src/writingStyleStore.js +73 -0
- package/package.json +1 -1
- 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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
61
|
-
|
|
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
|
|
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
|
-
|
|
197
|
-
'
|
|
198
|
-
|
|
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
|
-
|
|
863
|
-
|
|
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.
|
|
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 =
|
|
28
|
-
if (!
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
131
|
+
const path = normalizeLiteralPath(input?.path);
|
|
128
132
|
const time = typeof input?.observedAt === 'number' ? input.observedAt : Date.parse(input?.observedAt || '');
|
|
129
|
-
if (!
|
|
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
|
-
|
|
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
|
|
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,
|