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
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
(function installBackgroundUpdateSafety(root) {
|
|
2
|
+
'use strict';
|
|
3
|
+
const blocked = () => ({ idle: false, saved: false, blockers: ['tab_probe_unavailable'] });
|
|
4
|
+
// Chrome storage serializes object keys independently of insertion order.
|
|
5
|
+
// Preserve every key/value and array position when comparing readback.
|
|
6
|
+
function sameStored(left, right) {
|
|
7
|
+
if (left === right) return true;
|
|
8
|
+
if (!left || !right || typeof left !== 'object' || typeof right !== 'object') return false;
|
|
9
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
10
|
+
return Array.isArray(left) && Array.isArray(right) && left.length === right.length
|
|
11
|
+
&& left.every((value, index) => sameStored(value, right[index]));
|
|
12
|
+
}
|
|
13
|
+
const leftKeys = Object.keys(left), rightKeys = Object.keys(right);
|
|
14
|
+
return leftKeys.length === rightKeys.length
|
|
15
|
+
&& leftKeys.every(key => Object.prototype.hasOwnProperty.call(right, key) && sameStored(left[key], right[key]));
|
|
16
|
+
}
|
|
17
|
+
function create(options) {
|
|
18
|
+
const bindings = new Map();
|
|
19
|
+
const tabsKey = 'codex-overleaf-managed-update-tabs-v1';
|
|
20
|
+
const guardKey = 'codex-overleaf-managed-update-guarded-tabs-v1';
|
|
21
|
+
async function ownerMatches(binding) {
|
|
22
|
+
if (!options.isExecutionLocked()) return false;
|
|
23
|
+
const response = await options.request({ id: crypto.randomUUID(), method: 'update.status',
|
|
24
|
+
params: { bootstrapRevision: String(root.__CODEX_OVERLEAF_BOOTSTRAP_REVISION__ || '') } });
|
|
25
|
+
const tx = response?.ok && response.result?.transaction;
|
|
26
|
+
return tx?.id === binding.transactionId && tx.targetVersion === binding.targetVersion
|
|
27
|
+
&& tx.sourceVersion === binding.sourceVersion && tx.state === binding.expectedState;
|
|
28
|
+
}
|
|
29
|
+
async function snapshot(tabId, documentId) {
|
|
30
|
+
const results = await chrome.scripting.executeScript({ target: documentId ? { tabId, documentIds: [documentId] }
|
|
31
|
+
: { tabId, frameIds: [0] }, world: 'ISOLATED', func: () => ({ url: location.href }) });
|
|
32
|
+
const item = results?.length === 1 && results[0];
|
|
33
|
+
return item?.frameId === 0 && item.documentId && typeof item.result?.url === 'string'
|
|
34
|
+
? { documentId: item.documentId, url: item.result.url } : null;
|
|
35
|
+
}
|
|
36
|
+
async function saveProbe(message, sender) {
|
|
37
|
+
const binding = bindings.get(sender?.tab?.id);
|
|
38
|
+
if (!binding || sender.id !== chrome.runtime.id || sender.frameId !== 0 || sender.documentId !== binding.documentId
|
|
39
|
+
|| sender.url !== binding.url || message.token !== binding.token || message.transactionId !== binding.transactionId
|
|
40
|
+
|| message.nonce !== binding.nonce || !await ownerMatches(binding)) return { ok: false };
|
|
41
|
+
const before = await snapshot(binding.tabId, binding.documentId);
|
|
42
|
+
if (before?.url !== binding.url) return { ok: false };
|
|
43
|
+
const results = await chrome.scripting.executeScript({ target: { tabId: binding.tabId, documentIds: [binding.documentId] },
|
|
44
|
+
world: 'MAIN', func: url => globalThis.CodexOverleafUpdateSafetyProbe?.probe(url), args: [binding.url] });
|
|
45
|
+
const after = await snapshot(binding.tabId, binding.documentId);
|
|
46
|
+
if (after?.url !== binding.url || message.nonce !== binding.nonce || !await ownerMatches(binding)
|
|
47
|
+
|| results?.length !== 1 || results[0].documentId !== binding.documentId || results[0].frameId !== 0) return { ok: false };
|
|
48
|
+
return { ok: true, nonce: message.nonce, result: results[0].result };
|
|
49
|
+
}
|
|
50
|
+
chrome.runtime.onMessage.addListener((message, sender, respond) => {
|
|
51
|
+
if (message?.type !== 'codex-overleaf/migration-save-probe') return undefined;
|
|
52
|
+
saveProbe(message, sender).then(respond).catch(() => respond({ ok: false }));
|
|
53
|
+
return true;
|
|
54
|
+
});
|
|
55
|
+
async function probe(tab, owner) {
|
|
56
|
+
try {
|
|
57
|
+
const current = await snapshot(tab.id);
|
|
58
|
+
if (!current || current.url !== tab.url) return blocked();
|
|
59
|
+
let binding = bindings.get(tab.id);
|
|
60
|
+
if (binding && (binding.documentId !== current.documentId || binding.url !== current.url
|
|
61
|
+
|| binding.transactionId !== owner.transactionId)) return blocked();
|
|
62
|
+
if (!binding) {
|
|
63
|
+
binding = { ...owner, ...current, tabId: tab.id, token: crypto.randomUUID(), nonce: '' };
|
|
64
|
+
if (!await ownerMatches(binding)) return blocked();
|
|
65
|
+
bindings.set(tab.id, binding);
|
|
66
|
+
}
|
|
67
|
+
binding.expectedState = owner.expectedState;
|
|
68
|
+
if (!binding.installed) {
|
|
69
|
+
const target = { tabId: tab.id, documentIds: [binding.documentId] };
|
|
70
|
+
await chrome.scripting.executeScript({ target, world: 'MAIN',
|
|
71
|
+
files: ['runtime/src/page/saveState.js', 'runtime/src/page/updateSafetyProbe.js'] });
|
|
72
|
+
await chrome.scripting.executeScript({ target, world: 'ISOLATED',
|
|
73
|
+
files: ['runtime/src/shared/pageRpcContract.js', 'runtime/src/content/updateIdle.js', 'runtime/src/content/updateSafetyReceiver.js'] });
|
|
74
|
+
const installed = await chrome.scripting.executeScript({ target, world: 'ISOLATED',
|
|
75
|
+
func: value => globalThis.CodexOverleafUpdateSafetyReceiver?.install(value, {
|
|
76
|
+
UpdateIdle: globalThis.CodexOverleafUpdateIdle, PageRpcContract: globalThis.CodexOverleafPageRpcContract
|
|
77
|
+
}), args: [binding] });
|
|
78
|
+
if (installed?.length !== 1 || installed[0].documentId !== binding.documentId
|
|
79
|
+
|| installed[0].result?.ok !== true || installed[0].result.url !== binding.url) return blocked();
|
|
80
|
+
binding.installed = true;
|
|
81
|
+
}
|
|
82
|
+
if (!await ownerMatches(binding)) return blocked();
|
|
83
|
+
binding.nonce = crypto.randomUUID();
|
|
84
|
+
const nonce = binding.nonce;
|
|
85
|
+
let timer;
|
|
86
|
+
const response = await Promise.race([
|
|
87
|
+
chrome.tabs.sendMessage(tab.id, { type: 'codex-overleaf/migration-idle-probe', ...binding },
|
|
88
|
+
{ documentId: binding.documentId }),
|
|
89
|
+
new Promise(resolve => { timer = setTimeout(() => resolve(null), 3500); })
|
|
90
|
+
]).finally(() => clearTimeout(timer));
|
|
91
|
+
const after = await snapshot(tab.id, binding.documentId);
|
|
92
|
+
if (!response?.safetyOnly || response.token !== binding.token || response.transactionId !== binding.transactionId
|
|
93
|
+
|| response.targetVersion !== binding.targetVersion || response.nonce !== nonce || response.url !== binding.url
|
|
94
|
+
|| after?.url !== binding.url || !await ownerMatches(binding)) return blocked();
|
|
95
|
+
return response;
|
|
96
|
+
} catch (_) { return blocked(); }
|
|
97
|
+
}
|
|
98
|
+
async function protectReloadTabs(transaction) {
|
|
99
|
+
const owner = { transactionId: transaction.id, sourceVersion: transaction.sourceVersion,
|
|
100
|
+
targetVersion: transaction.targetVersion, expectedState: 'bootstrap_pending' };
|
|
101
|
+
if (!await ownerMatches(owner)) return false;
|
|
102
|
+
const stored = await chrome.storage.local.get([tabsKey, guardKey]);
|
|
103
|
+
if (stored[guardKey]?.transactionId === transaction.id && !stored[tabsKey]?.length) return true;
|
|
104
|
+
if (stored[guardKey]?.state === 'guarded' && stored[guardKey].transactionId !== transaction.id) {
|
|
105
|
+
const open = new Set((await chrome.tabs.query({})).map(tab => tab.id));
|
|
106
|
+
for (const entry of stored[guardKey].entries || []) {
|
|
107
|
+
if (!open.has(entry.tabId)) continue;
|
|
108
|
+
const current = await snapshot(entry.tabId).catch(() => null);
|
|
109
|
+
if (!entry.documentId || !current || current.documentId === entry.documentId) return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const entries = await Promise.all((stored[tabsKey] || []).map(async tabId => ({ tabId,
|
|
113
|
+
...await snapshot(tabId).catch(() => null) })));
|
|
114
|
+
const guard = { transactionId: transaction.id, sourceVersion: transaction.sourceVersion,
|
|
115
|
+
targetVersion: transaction.targetVersion, state: 'guarded', entries };
|
|
116
|
+
const current = await chrome.storage.local.get([tabsKey, guardKey]);
|
|
117
|
+
if (!sameStored(current, stored) || !await ownerMatches(owner)) return false;
|
|
118
|
+
await chrome.storage.local.set({ [guardKey]: guard, [tabsKey]: [] });
|
|
119
|
+
const readback = await chrome.storage.local.get([tabsKey, guardKey]);
|
|
120
|
+
return sameStored(readback[guardKey], guard) && readback[tabsKey]?.length === 0;
|
|
121
|
+
}
|
|
122
|
+
async function releaseReloadTabs(transaction, expectedState = 'bootstrap_pending') {
|
|
123
|
+
const owner = { transactionId: transaction.id, sourceVersion: transaction.sourceVersion,
|
|
124
|
+
targetVersion: transaction.targetVersion, expectedState };
|
|
125
|
+
if (!await ownerMatches(owner)) return false;
|
|
126
|
+
const stored = await chrome.storage.local.get([tabsKey, guardKey]);
|
|
127
|
+
const guard = stored[guardKey];
|
|
128
|
+
if (guard?.transactionId !== transaction.id || guard.state !== 'guarded' || stored[tabsKey]?.length) return false;
|
|
129
|
+
const open = new Set((await chrome.tabs.query({})).map(tab => tab.id));
|
|
130
|
+
const ids = [];
|
|
131
|
+
for (const entry of guard.entries) {
|
|
132
|
+
if (!open.has(entry.tabId)) continue;
|
|
133
|
+
if (!entry.documentId || !entry.url) return false;
|
|
134
|
+
const current = await snapshot(entry.tabId, entry.documentId).catch(() => null);
|
|
135
|
+
if (current?.documentId !== entry.documentId || current?.url !== entry.url) return false;
|
|
136
|
+
ids.push(entry.tabId);
|
|
137
|
+
}
|
|
138
|
+
const again = await chrome.storage.local.get([tabsKey, guardKey]);
|
|
139
|
+
if (!sameStored(again[guardKey], guard) || again[tabsKey]?.length || !await ownerMatches(owner)) return false;
|
|
140
|
+
await chrome.storage.local.set({ [tabsKey]: ids, [guardKey]: { ...guard, state: 'ready' } });
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
async function revalidate(tabs, owner) {
|
|
144
|
+
if (!await ownerMatches(owner)) return false;
|
|
145
|
+
for (const tab of tabs) {
|
|
146
|
+
const binding = bindings.get(tab.id);
|
|
147
|
+
if (!binding || binding.transactionId !== owner.transactionId) continue;
|
|
148
|
+
if ((await probe(tab, owner)).idle !== true) return false;
|
|
149
|
+
}
|
|
150
|
+
return ownerMatches(owner);
|
|
151
|
+
}
|
|
152
|
+
async function hasReplacedReloadDocument(transaction) {
|
|
153
|
+
const owner = { transactionId: transaction.id, sourceVersion: transaction.sourceVersion,
|
|
154
|
+
targetVersion: transaction.targetVersion, expectedState: 'rolled_back' };
|
|
155
|
+
if (!await ownerMatches(owner)) return false;
|
|
156
|
+
const stored = await chrome.storage.local.get([tabsKey, guardKey]);
|
|
157
|
+
const guard = stored[guardKey];
|
|
158
|
+
if (guard?.transactionId !== transaction.id || guard.state !== 'guarded' || stored[tabsKey]?.length) return false;
|
|
159
|
+
const open = new Set((await chrome.tabs.query({})).map(tab => tab.id));
|
|
160
|
+
for (const entry of guard.entries) {
|
|
161
|
+
if (!open.has(entry.tabId) || !entry.documentId) continue;
|
|
162
|
+
const current = await snapshot(entry.tabId).catch(() => null);
|
|
163
|
+
if (current && current.documentId !== entry.documentId) {
|
|
164
|
+
const again = await chrome.storage.local.get([tabsKey, guardKey]);
|
|
165
|
+
return sameStored(again, stored) && await ownerMatches(owner);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
return Object.freeze({ probe, protectReloadTabs, releaseReloadTabs, revalidate, hasReplacedReloadDocument });
|
|
171
|
+
}
|
|
172
|
+
root.CodexOverleafBackgroundUpdateSafety = Object.freeze({ create });
|
|
173
|
+
})(globalThis);
|
|
@@ -94,12 +94,19 @@
|
|
|
94
94
|
const journals = await listJournals(projectKey).catch(() => []);
|
|
95
95
|
let changed = false;
|
|
96
96
|
const acknowledgeIds = [];
|
|
97
|
+
const recoveredRuns = [];
|
|
97
98
|
for (const journal of journals) {
|
|
98
99
|
if (!journal?.terminal && !journal?.ownerLost) {
|
|
99
100
|
continue;
|
|
100
101
|
}
|
|
102
|
+
// Native completion can precede the owner's writeback and durable
|
|
103
|
+
// session save. A passive shared-history reader must not settle it.
|
|
104
|
+
if (options.requireOwnerLost === true && journal.ownerLost !== true) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
101
107
|
const session = options.findSession?.(journal.sessionId);
|
|
102
|
-
if (!session)
|
|
108
|
+
if (!session || (session.projectId && session.projectId !== projectKey)
|
|
109
|
+
|| (options.accountScopeId && session.accountScopeId && session.accountScopeId !== options.accountScopeId)) {
|
|
103
110
|
continue;
|
|
104
111
|
}
|
|
105
112
|
let record = (session.runs || []).find(run => run.id === journal.clientRunId);
|
|
@@ -112,6 +119,11 @@
|
|
|
112
119
|
if (!record) {
|
|
113
120
|
continue;
|
|
114
121
|
}
|
|
122
|
+
if (record.runProjectId && record.runProjectId !== projectKey) continue;
|
|
123
|
+
if (!record.runProjectId) record.runProjectId = projectKey;
|
|
124
|
+
if (record.status === 'running') {
|
|
125
|
+
options.normalizeInterruptedRun?.(record);
|
|
126
|
+
}
|
|
115
127
|
const reloadReports = (record.events || []).filter(event => event?.failure?.source === 'panel_reload');
|
|
116
128
|
record.events = (record.events || []).filter(event => event?.failure?.source !== 'panel_reload');
|
|
117
129
|
const lastSequence = Number(record.nativeEventSeq || 0);
|
|
@@ -155,8 +167,10 @@
|
|
|
155
167
|
options.pauseSessionQueue?.(session, 'page_reload');
|
|
156
168
|
changed = true;
|
|
157
169
|
acknowledgeIds.push(journal.requestId);
|
|
170
|
+
recoveredRuns.push({ sessionId: session.id, runId: record.id,
|
|
171
|
+
projectId: projectKey, accountScopeId: options.accountScopeId });
|
|
158
172
|
}
|
|
159
|
-
return { changed, acknowledgeIds };
|
|
173
|
+
return { changed, acknowledgeIds, recoveredRuns };
|
|
160
174
|
}
|
|
161
175
|
|
|
162
176
|
function destroy() {
|
|
@@ -85,7 +85,8 @@
|
|
|
85
85
|
*/
|
|
86
86
|
function normalizeSkippedFailure(item) {
|
|
87
87
|
if (!FailureReasons || !FailureReasons.normalizeFailureReason) return null;
|
|
88
|
-
const
|
|
88
|
+
const normalize = FailureReasons.normalizeWritebackFailure || FailureReasons.normalizeFailureReason;
|
|
89
|
+
const failure = normalize(item?.result, item?.operation || {}, { locale: getLocale() });
|
|
89
90
|
if (!failure || !failure.code) return null;
|
|
90
91
|
const localized = FailureReasons.localizeFailureReason
|
|
91
92
|
? FailureReasons.localizeFailureReason(failure, getLocale(), failureReasonI18nLookup)
|
|
@@ -98,7 +99,7 @@
|
|
|
98
99
|
|
|
99
100
|
function pickPrimarySkippedFailure(failures) {
|
|
100
101
|
if (!FailureReasons || !FailureReasons.selectPrimaryFailure) return null;
|
|
101
|
-
return FailureReasons.selectPrimaryFailure(failures);
|
|
102
|
+
return (FailureReasons.selectPrimaryWritebackFailure || FailureReasons.selectPrimaryFailure)(failures);
|
|
102
103
|
}
|
|
103
104
|
|
|
104
105
|
function failureReasonI18nLookup(key) {
|
|
@@ -134,6 +135,8 @@
|
|
|
134
135
|
const code = result.code || '';
|
|
135
136
|
const filePath = result.reasonParams?.filePath || operation.path || operation.from || operation.to || '';
|
|
136
137
|
const withDebug = reason => appendApplyResultDebug(reason, result);
|
|
138
|
+
const catalogReason = formatCatalogFailureReason(result, filePath);
|
|
139
|
+
if (catalogReason) return withDebug(catalogReason);
|
|
137
140
|
if (key === 'missingBaseFile' || code === 'missing_base_file') {
|
|
138
141
|
const target = filePath || tx('this file', '这个文件');
|
|
139
142
|
return withDebug(tx(
|
|
@@ -236,82 +239,52 @@
|
|
|
236
239
|
return parts.join(', ');
|
|
237
240
|
}
|
|
238
241
|
|
|
242
|
+
function formatCatalogFailureReason(result, path) {
|
|
243
|
+
if (!FailureReasons?.formatFailureReasonForDisplay) return '';
|
|
244
|
+
// Compact historical settlements can omit canonical validation fields.
|
|
245
|
+
// Their display is still recoverable without re-normalizing stored facts.
|
|
246
|
+
const failure = result.failure && typeof result.failure === 'object'
|
|
247
|
+
? { ...result.failure, file: result.failure.file || result.file || path }
|
|
248
|
+
: FailureReasons.normalizeFailureReason(result, { path: result.file || path });
|
|
249
|
+
const display = FailureReasons.formatFailureReasonForDisplay(failure, getLocale(), failureReasonI18nLookup);
|
|
250
|
+
return display.localized ? display.message : '';
|
|
251
|
+
}
|
|
252
|
+
|
|
239
253
|
function formatBridgeResultReason(result = {}, fallbackPath = '') {
|
|
240
|
-
const
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
return localizeVisibleReason(result.reason || result.error || result.code || tr('unknownReason'));
|
|
244
|
-
}
|
|
245
|
-
if (code === 'missing_tracked_changes') {
|
|
246
|
-
return 'No matching Overleaf tracked-change records were found for this run, so Codex did not undo with text patches.';
|
|
247
|
-
}
|
|
248
|
-
if (code === 'tracked_change_file_open_failed') {
|
|
249
|
-
return path
|
|
250
|
-
? `Could not open ${path} to find this run's tracked changes. Handle them manually in the Overleaf review tools.`
|
|
251
|
-
: 'Could not open the file to find this run\'s tracked changes. Handle them manually in the Overleaf review tools.';
|
|
252
|
-
}
|
|
253
|
-
if (code === 'tracked_change_not_found') {
|
|
254
|
-
return 'No matching tracked changes were found on the Overleaf page for this run.';
|
|
255
|
-
}
|
|
256
|
-
if (code === 'tracked_change_reject_control_not_found') {
|
|
257
|
-
return path
|
|
258
|
-
? `Some tracked changes in ${path} remain, but the matching Reject button was not found. Reject them manually in Overleaf.`
|
|
259
|
-
: 'Some tracked changes remain, but the matching Reject button was not found. Reject them manually in Overleaf.';
|
|
260
|
-
}
|
|
261
|
-
if (code === 'tracked_change_reject_not_confirmed') {
|
|
262
|
-
return 'Codex clicked Reject, but Overleaf still shows this tracked change. Reject it manually in the Overleaf review panel.';
|
|
263
|
-
}
|
|
264
|
-
if (code === 'tracked_change_accept_control_not_found') {
|
|
265
|
-
return path
|
|
266
|
-
? `Some tracked changes in ${path} remain, but the matching Accept button was not found. Accept them manually in Overleaf.`
|
|
267
|
-
: 'Some tracked changes remain, but the matching Accept button was not found. Accept them manually in Overleaf.';
|
|
268
|
-
}
|
|
269
|
-
if (code === 'tracked_change_accept_not_confirmed') {
|
|
270
|
-
return 'Codex clicked Accept, but Overleaf still shows this tracked change. Accept it manually in the Overleaf review panel.';
|
|
271
|
-
}
|
|
272
|
-
if (code === 'tracked_change_editor_undo_open_failed') {
|
|
273
|
-
return path ? `Could not open ${path} for Overleaf native undo.` : 'Could not open the file for Overleaf native undo.';
|
|
274
|
-
}
|
|
275
|
-
if (code === 'tracked_change_editor_undo_current_mismatch') {
|
|
276
|
-
return path
|
|
277
|
-
? `${path} no longer matches this run's written content, so Codex did not use Overleaf native undo.`
|
|
278
|
-
: 'The current content no longer matches this run\'s written content, so Codex did not use Overleaf native undo.';
|
|
279
|
-
}
|
|
280
|
-
if (code === 'editor_undo_control_not_found') {
|
|
281
|
-
return path
|
|
282
|
-
? `Could not find Overleaf's editor Undo button to undo this run in ${path}.`
|
|
283
|
-
: 'Could not find Overleaf\'s editor Undo button to undo this run.';
|
|
284
|
-
}
|
|
285
|
-
if (code === 'editor_undo_no_progress') {
|
|
286
|
-
return path
|
|
287
|
-
? `Codex clicked Overleaf Undo, but ${path} did not change.`
|
|
288
|
-
: 'Codex clicked Overleaf Undo, but the file did not change.';
|
|
289
|
-
}
|
|
290
|
-
if (code === 'editor_undo_max_iterations') {
|
|
291
|
-
return path
|
|
292
|
-
? `${path} did not return to its pre-run content after repeated Overleaf native undo steps. Codex stopped to avoid undoing other edits.`
|
|
293
|
-
: 'The file did not return to its pre-run content after repeated Overleaf native undo steps. Codex stopped to avoid undoing other edits.';
|
|
294
|
-
}
|
|
295
|
-
if (code === 'tracked_change_undo_max_iterations') {
|
|
296
|
-
return path
|
|
297
|
-
? `${path} still has tracked changes left. Codex stopped to avoid rejecting unrelated edits.`
|
|
298
|
-
: 'Tracked changes are still left. Codex stopped to avoid rejecting unrelated edits.';
|
|
299
|
-
}
|
|
300
|
-
if (code === 'tracked_change_undo_verify_open_failed') {
|
|
301
|
-
return path
|
|
302
|
-
? `Could not open ${path} after undo to verify content. Reload Overleaf and check manually.`
|
|
303
|
-
: 'Could not open the file after undo to verify content. Reload Overleaf and check manually.';
|
|
304
|
-
}
|
|
305
|
-
if (code === 'tracked_change_undo_verify_failed') {
|
|
306
|
-
return path
|
|
307
|
-
? `${path} did not return to its pre-run content after rejecting tracked changes. Check this run's changes in the Overleaf review panel.`
|
|
308
|
-
: 'The file did not return to its pre-run content after rejecting tracked changes. Check this run\'s changes in the Overleaf review panel.';
|
|
309
|
-
}
|
|
310
|
-
return localizeVisibleReason(result.reason || result.error || result.code || tr('unknownReason'));
|
|
254
|
+
const path = result.file || result.path || fallbackPath || '';
|
|
255
|
+
return formatCatalogFailureReason(result, path)
|
|
256
|
+
|| localizeVisibleReason(result.reason || result.error || result.code || tr('unknownReason'));
|
|
311
257
|
}
|
|
312
258
|
|
|
259
|
+
const runtimeOwnedReasonPairs = [
|
|
260
|
+
['The selected provider no longer exists.', '所选模型服务已不存在。'],
|
|
261
|
+
['The selected provider has no usable revision.', '所选模型服务没有可用的配置版本。'],
|
|
262
|
+
['The selected provider revision was not captured for this run.', '本轮任务未记录所选模型服务的配置版本。'],
|
|
263
|
+
['The selected provider changed after this run was submitted.', '本轮任务提交后,所选模型服务的配置已发生变化。'],
|
|
264
|
+
['The captured selection is invalid. Attach it again.', '已记录的选区无效,请重新添加。'],
|
|
265
|
+
['Provider revision must be a finite non-negative integer.', '模型服务配置版本必须是有效的非负整数。'],
|
|
266
|
+
['A stable matching Overleaf account is required for shared history.', '共享历史需要稳定且匹配的 Overleaf 账号。'],
|
|
267
|
+
['The background storage connection was lost.', '后台存储连接已断开。'],
|
|
268
|
+
['Shared history is unavailable. Reload the extension and this page.', '共享历史不可用,请重新加载扩展和当前页面。'],
|
|
269
|
+
['The shared history lock disconnected.', '共享历史的存储锁连接已断开。'],
|
|
270
|
+
['Another page is saving history. Retry after it finishes.', '其他页面正在保存历史,请待保存完成后重试。'],
|
|
271
|
+
['The shared history lock was lost before completion.', '操作完成前,共享历史的存储锁已丢失。'],
|
|
272
|
+
['A stable account scope is required for durable persistence.', '持久保存需要稳定的账号范围。'],
|
|
273
|
+
['A cross-realm browser lock is required for durable persistence.', '持久保存需要能够跨页面协调的浏览器锁。'],
|
|
274
|
+
['Shared session storage is unavailable.', '共享会话存储不可用。'],
|
|
275
|
+
['Native host request failed.', '本地主机请求失败。'],
|
|
276
|
+
['Native host disconnected', '本地主机连接已断开。']
|
|
277
|
+
];
|
|
278
|
+
|
|
313
279
|
function localizeVisibleReason(reason) {
|
|
314
280
|
const text = String(reason || '').trim();
|
|
281
|
+
for (const [en, zh] of runtimeOwnedReasonPairs) {
|
|
282
|
+
if (text === en || text === zh) return tx(en, zh);
|
|
283
|
+
}
|
|
284
|
+
const scoped = /^(?:Scoped persistence failed: |限定范围的持久保存失败:)(invalid_commit|stale_view|revision_conflict|queue_revision_conflict|invalid_queue_mutation|queue_claim_conflict)$/.exec(text);
|
|
285
|
+
if (scoped) return tx(`Scoped persistence failed: ${scoped[1]}`, `限定范围的持久保存失败:${scoped[1]}`);
|
|
286
|
+
const localized = FailureReasons?.localizeFailureMessage?.(text, getLocale(), failureReasonI18nLookup);
|
|
287
|
+
if (localized && localized !== text) return localized;
|
|
315
288
|
if (!text || getLocale() !== 'en') {
|
|
316
289
|
return text;
|
|
317
290
|
}
|