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