codex-overleaf-link 2.4.0 → 2.5.0
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 +272 -311
- package/README.zh-CN.md +287 -326
- package/extension/bootstrap/background.js +47 -10
- package/extension/bootstrap/manifest.template.json +9 -4
- package/extension/bootstrap/popup.html +10 -16
- package/extension/bootstrap/update.js +25 -2
- package/extension/runtime-manifest.json +3 -1
- package/extension/src/background.js +28 -3
- package/extension/src/backgroundSharedSessions.js +380 -0
- package/extension/src/backgroundUpdateCoordinator.js +442 -379
- package/extension/src/content/activeTurnControl.js +8 -0
- package/extension/src/content/assetTransferBroker.js +186 -12
- package/extension/src/content/changeHistoryView.js +175 -0
- package/extension/src/content/composerAttachments.js +24 -22
- package/extension/src/content/composerPanel.js +23 -8
- package/extension/src/content/contentRuntime.js +572 -571
- package/extension/src/content/diagnosticsController.js +1 -2
- package/extension/src/content/diagnosticsExport.js +222 -0
- package/extension/src/content/diagnosticsPanel.js +48 -19
- package/extension/src/content/diffReviewPanel.js +8 -5
- package/extension/src/content/generated/content.bundle.js +8974 -1781
- package/extension/src/content/generated/content.bundle.meta.json +22 -3
- package/extension/src/content/legacyGlobalRegistry.js +19 -1
- package/extension/src/content/localSkillsPanel.js +42 -7
- package/extension/src/content/markdownDomRenderer.js +9 -4
- package/extension/src/content/modelPicker.js +1 -1
- package/extension/src/content/pageBridgeClient.js +18 -3
- package/extension/src/content/panelMaintenance.js +51 -120
- package/extension/src/content/panelRenderer.js +4 -0
- package/extension/src/content/pendingInputView.js +109 -76
- package/extension/src/content/providerSettingsCoordinator.js +17 -6
- package/extension/src/content/providerSettingsDialog.js +661 -108
- package/extension/src/content/recentProjects.js +364 -356
- package/extension/src/content/runActivitySummary.js +631 -0
- package/extension/src/content/runController.js +3 -1
- package/extension/src/content/runFailureNotice.js +14 -1
- package/extension/src/content/runGuidanceController.js +4 -3
- package/extension/src/content/runPresence.js +306 -0
- package/extension/src/content/runQueueScheduler.js +2 -1
- package/extension/src/content/runResultActions.js +123 -3
- package/extension/src/content/runTimelineView.js +194 -164
- package/extension/src/content/scopedPersistenceCoordinator.js +2 -1
- package/extension/src/content/scopedPersistencePanelState.js +45 -2
- package/extension/src/content/selectionContextView.js +300 -0
- package/extension/src/content/sessionPersistence.js +10 -2
- package/extension/src/content/settingsPanel.js +93 -54
- package/extension/src/content/settingsWorkbench.js +374 -0
- package/extension/src/content/sharedSessionViewSync.js +72 -0
- package/extension/src/content/subagentActivityView.js +195 -0
- package/extension/src/content/trackedChangeCaptureController.js +7 -3
- package/extension/src/content/updateNotice.js +121 -50
- package/extension/src/content/writebackController.js +257 -0
- package/extension/src/content/writebackOrchestrator.js +146 -141
- package/extension/src/content/writebackPlan.js +231 -0
- package/extension/src/content/writebackRecovery.js +122 -0
- package/extension/src/content/writingStyleSettings.js +576 -0
- package/extension/src/content/writtenChangesView.js +152 -0
- package/extension/src/page/binaryAssetUploader.js +97 -19
- package/extension/src/page/overleafProjectSnapshot.js +1 -0
- package/extension/src/page/referenceProjects.js +148 -0
- package/extension/src/page/saveState.js +58 -3
- package/extension/src/page/snapshotRouter.js +44 -13
- package/extension/src/page/textCoordinates.js +102 -0
- package/extension/src/page/textFileCreator.js +350 -59
- package/extension/src/page/trackedChangeCapture.js +42 -56
- package/extension/src/page/trackedChangeOwnership.js +198 -0
- package/extension/src/page/trackedChangeReplay.js +164 -0
- package/extension/src/page/trackedChangesLifecycle.js +139 -150
- package/extension/src/page/treeOperations.js +36 -29
- package/extension/src/page/writebackReceiptJournal.js +112 -0
- package/extension/src/page/writebackRouter.js +176 -136
- package/extension/src/pageBridge.js +59 -101
- package/extension/src/popup.js +203 -59
- package/extension/src/shared/agentTranscript.js +18 -4
- package/extension/src/shared/auditRecords.js +71 -0
- package/extension/src/shared/changeHistoryModel.js +94 -0
- package/extension/src/shared/compatibility.js +1 -1
- package/extension/src/shared/compileAdapter.js +42 -0
- package/extension/src/shared/failureReasons.js +20 -0
- package/extension/src/shared/globalPreferences.js +1 -1
- package/extension/src/shared/i18n.js +187 -65
- package/extension/src/shared/managedUpdateProjection.js +6 -3
- package/extension/src/shared/pageRpcContract.js +7 -1
- package/extension/src/shared/providerProfiles.js +109 -0
- 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/scopedPersistenceBrowserAdapter.js +6 -3
- package/extension/src/shared/selectionContext.js +28 -0
- package/extension/src/shared/sessionState.js +97 -6
- package/extension/src/shared/sharedSessionBridge.js +288 -0
- package/extension/src/shared/storageDb.js +23 -55
- package/extension/src/shared/storageMigration.js +3 -0
- package/extension/src/shared/storageRunActions.js +54 -4
- package/extension/src/shared/storageValuePruning.js +40 -0
- package/extension/src/shared/subagentActivityModel.js +174 -0
- package/extension/src/shared/undoOperations.js +87 -0
- package/extension/src/shared/updateConsent.js +37 -8
- package/extension/src/shared/writebackIntent.js +62 -0
- package/extension/src/shared/writebackSettlement.js +29 -10
- package/extension/src/shared/writingStyle.js +33 -0
- package/extension/styles/panel.css +2136 -744
- package/extension/styles/popup.css +110 -0
- package/native-host/src/anthropicBridgeRequest.js +2 -1
- package/native-host/src/codexModelRecovery.js +107 -0
- package/native-host/src/codexPromptAssembly.js +2 -0
- package/native-host/src/codexProviderLaunch.js +3 -3
- package/native-host/src/codexRuntimeIdentity.js +1 -0
- package/native-host/src/codexSessionRunner.js +146 -177
- package/native-host/src/codexSessionTiming.js +71 -0
- package/native-host/src/managedInstall.js +5 -4
- package/native-host/src/nativeEnvironment.js +70 -0
- package/native-host/src/nativeQuotas.js +15 -8
- package/native-host/src/overleafWorkspaceRules.js +16 -0
- package/native-host/src/processStopBarrier.js +80 -0
- package/native-host/src/providerModelCatalog.js +4 -3
- package/native-host/src/providerProfile.js +13 -1
- package/native-host/src/providerReasoning.js +9 -5
- package/native-host/src/providerStore.js +4 -0
- package/native-host/src/readProgressGuard.js +84 -17
- package/native-host/src/releaseTransport.js +14 -5
- package/native-host/src/selectionScope.js +58 -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/subagentBroker.js +102 -98
- package/native-host/src/subagentTelemetry.js +316 -0
- package/native-host/src/subagentWorkspace.js +103 -0
- package/native-host/src/subagentWorkspacePath.js +31 -0
- package/native-host/src/taskRunnerRuntime.js +55 -5
- package/native-host/src/turnAttachments.js +113 -0
- package/native-host/src/updateManager.js +122 -12
- 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 +447 -0
- package/package.json +1 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
(function (root, factory) {
|
|
2
|
+
if (typeof module === 'object' && module.exports) module.exports = factory();
|
|
3
|
+
else root.CodexOverleafModuleRegistry.define('WritebackPlan', [], factory);
|
|
4
|
+
})(typeof globalThis !== 'undefined' ? globalThis : window, function () {
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
// Input validation, user approval, and audit projection precede page mutation.
|
|
8
|
+
function create(deps = {}) {
|
|
9
|
+
const { tx, tr, normalizeSafeProjectPath, GovernanceRules, getGovernanceRulesForCurrentProject,
|
|
10
|
+
showPluginConfirm, formatOperationFiles, getAppliedEntries, getSkippedEntries } = deps;
|
|
11
|
+
|
|
12
|
+
function partitionUnsafeProjectPathOperations(operations = []) {
|
|
13
|
+
const safe = [];
|
|
14
|
+
const skipped = [];
|
|
15
|
+
for (const operation of operations || []) {
|
|
16
|
+
const normalized = normalizeOperationProjectPaths(operation);
|
|
17
|
+
const invalid = getInvalidOperationProjectPath(normalized);
|
|
18
|
+
if (invalid) {
|
|
19
|
+
skipped.push({
|
|
20
|
+
operation: normalized,
|
|
21
|
+
result: {
|
|
22
|
+
ok: false,
|
|
23
|
+
code: 'invalid_project_path',
|
|
24
|
+
reason: tx(`Invalid ${invalid}. Codex did not write this file.`, `路径无效:${invalid}。Codex 没有写入这个文件。`)
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
safe.push(normalized);
|
|
30
|
+
}
|
|
31
|
+
return { safe, skipped };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function normalizeOperationProjectPaths(operation = {}) {
|
|
35
|
+
if (!operation || typeof operation !== 'object') {
|
|
36
|
+
return operation;
|
|
37
|
+
}
|
|
38
|
+
const normalized = { ...operation };
|
|
39
|
+
if (typeof operation.path === 'string') {
|
|
40
|
+
normalized.path = normalizeSafeProjectPath(operation.path);
|
|
41
|
+
if (!normalized.path) {
|
|
42
|
+
normalized.invalidProjectPath = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (typeof operation.to === 'string') {
|
|
46
|
+
normalized.to = normalizeSafeProjectPath(operation.to);
|
|
47
|
+
if (!normalized.to) {
|
|
48
|
+
normalized.invalidProjectDestinationPath = true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (typeof operation.destinationPath === 'string') {
|
|
52
|
+
normalized.destinationPath = normalizeSafeProjectPath(operation.destinationPath);
|
|
53
|
+
if (!normalized.destinationPath) {
|
|
54
|
+
normalized.invalidProjectDestinationPath = true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return normalized;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function getInvalidOperationProjectPath(operation = {}) {
|
|
61
|
+
if (operation.invalidProjectPath || (requiresOperationPath(operation) && !operation.path)) {
|
|
62
|
+
return 'operation path';
|
|
63
|
+
}
|
|
64
|
+
if (operation.invalidProjectDestinationPath || (requiresOperationDestinationPath(operation) && !(operation.to || operation.destinationPath))) {
|
|
65
|
+
return 'operation destination path';
|
|
66
|
+
}
|
|
67
|
+
return '';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function requiresOperationPath(operation = {}) {
|
|
71
|
+
return ['edit', 'create', 'delete', 'rename', 'move', 'binary-create', 'overwrite-binary'].includes(operation.type);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function requiresOperationDestinationPath(operation = {}) {
|
|
75
|
+
return operation.type === 'rename' || operation.type === 'move';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
function evaluateGovernedOperations(operations = []) {
|
|
80
|
+
if (!GovernanceRules?.evaluateGovernedOperations) {
|
|
81
|
+
return { allowed: operations || [], blocked: [], rules: getGovernanceRulesForCurrentProject() };
|
|
82
|
+
}
|
|
83
|
+
return GovernanceRules.evaluateGovernedOperations(operations, getGovernanceRulesForCurrentProject());
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function buildGovernanceSkippedApplyResult(blockedItems = []) {
|
|
87
|
+
return {
|
|
88
|
+
ok: blockedItems.length === 0,
|
|
89
|
+
applied: [],
|
|
90
|
+
skipped: (blockedItems || []).map(item => ({
|
|
91
|
+
operation: item.operation,
|
|
92
|
+
result: {
|
|
93
|
+
ok: false,
|
|
94
|
+
code: 'governance_blocked',
|
|
95
|
+
reason: formatGovernanceBlockedReason(item),
|
|
96
|
+
reasonKey: item.reason || 'governance_blocked'
|
|
97
|
+
}
|
|
98
|
+
}))
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function formatGovernanceBlockedReason(item = {}) {
|
|
103
|
+
if (item.reason === 'readonly') {
|
|
104
|
+
return tx(
|
|
105
|
+
'Project governance marked this path read-only, so Codex did not write it.',
|
|
106
|
+
'项目治理规则将此路径标记为只读,因此 Codex 没有写入。'
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
if (item.reason === 'writable_allowlist') {
|
|
110
|
+
return tx(
|
|
111
|
+
'Project governance allows writes only to configured writable patterns, and this path is outside that allowlist.',
|
|
112
|
+
'项目治理规则只允许写入配置的可写路径,此路径不在允许范围内。'
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
return tx('Project governance blocked this write.', '项目治理规则阻止了此写入。');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function filterSyncChangesByOperations(syncChanges = [], operations = []) {
|
|
119
|
+
const allowedPaths = new Set((operations || []).map(operation => operation.path).filter(Boolean));
|
|
120
|
+
return (syncChanges || []).filter(change => allowedPaths.has(change?.path));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function mergeApplyResultSkipped(result = {}, skipped = []) {
|
|
124
|
+
if (!skipped.length) {
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
...(result || {}),
|
|
129
|
+
ok: false,
|
|
130
|
+
applied: Array.isArray(result?.applied) ? result.applied : [],
|
|
131
|
+
skipped: [
|
|
132
|
+
...getSkippedEntries(result),
|
|
133
|
+
...skipped
|
|
134
|
+
]
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async function confirmBinaryOperations(operations = []) {
|
|
139
|
+
const binaryOperations = (operations || []).filter(operation => operation.type === 'binary-create' || operation.type === 'overwrite-binary');
|
|
140
|
+
if (!binaryOperations.length) {
|
|
141
|
+
return { operations, skipped: [] };
|
|
142
|
+
}
|
|
143
|
+
const approved = await showPluginConfirm({
|
|
144
|
+
title: tr('binaryAssetConfirmTitle'),
|
|
145
|
+
message: tr('binaryAssetConfirmMessage', { files: formatOperationFiles(binaryOperations) }),
|
|
146
|
+
confirmLabel: tr('binaryAssetConfirm'),
|
|
147
|
+
cancelLabel: tr('binaryAssetCancel'),
|
|
148
|
+
destructive: true
|
|
149
|
+
});
|
|
150
|
+
if (approved) {
|
|
151
|
+
return { operations, skipped: [] };
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
operations: operations.filter(operation => operation.type !== 'binary-create' && operation.type !== 'overwrite-binary'),
|
|
155
|
+
skipped: binaryOperations.map(operation => ({
|
|
156
|
+
operation,
|
|
157
|
+
result: {
|
|
158
|
+
ok: false,
|
|
159
|
+
code: 'binary_confirmation_rejected',
|
|
160
|
+
reason: tx('Binary asset writeback requires explicit confirmation and was skipped.', '二进制资源写回需要显式确认,已跳过。')
|
|
161
|
+
}
|
|
162
|
+
}))
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function buildAuditDiffSummary(operations = []) {
|
|
167
|
+
const changedFiles = new Set();
|
|
168
|
+
let binaryFilesChanged = 0;
|
|
169
|
+
for (const operation of operations || []) {
|
|
170
|
+
if (operation?.path) {
|
|
171
|
+
changedFiles.add(operation.path);
|
|
172
|
+
}
|
|
173
|
+
if (operation?.type === 'binary-create' || operation?.type === 'overwrite-binary') {
|
|
174
|
+
binaryFilesChanged++;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
filesChanged: changedFiles.size,
|
|
179
|
+
additions: 0,
|
|
180
|
+
deletions: 0,
|
|
181
|
+
binaryFilesChanged
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function buildAuditSummaryFromApply({ operations = [], applyResults = [], blockedFiles = [], resultStatus = 'completed', saveVerification = null } = {}) {
|
|
186
|
+
const appliedFiles = [];
|
|
187
|
+
const skippedFiles = [];
|
|
188
|
+
for (const result of applyResults || []) {
|
|
189
|
+
for (const item of getAppliedEntries(result)) {
|
|
190
|
+
appliedFiles.push(summarizeOperationForAudit(item.operation, item.result, 'applied'));
|
|
191
|
+
}
|
|
192
|
+
for (const item of getSkippedEntries(result)) {
|
|
193
|
+
skippedFiles.push(summarizeOperationForAudit(item.operation, item.result, 'skipped'));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
changedFiles: (operations || []).map(operation => summarizeOperationForAudit(operation, {}, 'changed')),
|
|
198
|
+
['diffSummary']: buildAuditDiffSummary(operations),
|
|
199
|
+
blockedFiles,
|
|
200
|
+
appliedFiles,
|
|
201
|
+
skippedFiles,
|
|
202
|
+
resultStatus,
|
|
203
|
+
saveVerification
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Tolerates `operation` and `result` being null in addition to undefined.
|
|
208
|
+
// Default-parameter values fire only for `undefined`, but the v1.3.8
|
|
209
|
+
// write-guard (pageBridge.runWriteGuard / writebackRouter.checkWritebackRunProjectId)
|
|
210
|
+
// emits batch-level skips with `operation: null` — there is no specific
|
|
211
|
+
// op to attribute the block to. Without this normalization the audit pass
|
|
212
|
+
// crashed with "Cannot read properties of null (reading 'path')", the
|
|
213
|
+
// outer-catch swallowed the partial-sync conclusion, and the user saw the
|
|
214
|
+
// misleading "local Codex returned no usable result" fallback.
|
|
215
|
+
function summarizeOperationForAudit(operation, result, status = '') {
|
|
216
|
+
const op = operation || {};
|
|
217
|
+
const res = result || {};
|
|
218
|
+
return {
|
|
219
|
+
path: op.path || op.from || op.to || '',
|
|
220
|
+
destinationPath: op.destinationPath || op.to || '',
|
|
221
|
+
type: op.type || '',
|
|
222
|
+
reason: res.reasonKey || res.code || res.reason || op.reasonKey || op.reason || '',
|
|
223
|
+
status,
|
|
224
|
+
size: op.size
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return { partitionUnsafeProjectPathOperations, normalizeOperationProjectPaths, getInvalidOperationProjectPath, evaluateGovernedOperations, buildGovernanceSkippedApplyResult, filterSyncChangesByOperations, mergeApplyResultSkipped, confirmBinaryOperations, buildAuditSummaryFromApply, summarizeOperationForAudit };
|
|
229
|
+
}
|
|
230
|
+
return { create };
|
|
231
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
(function (root, factory) {
|
|
2
|
+
root.CodexOverleafModuleRegistry.define('WritebackRecovery', ['WritebackIntent', 'UndoOperations'], factory);
|
|
3
|
+
})(typeof globalThis !== 'undefined' ? globalThis : window, function (Intent, Undo) {
|
|
4
|
+
'use strict';
|
|
5
|
+
function create(deps) {
|
|
6
|
+
let recovery = null;
|
|
7
|
+
const owner = () => ({ projectId: deps.getProjectId(), accountScopeId: deps.getAccountScopeId() });
|
|
8
|
+
const current = scope => scope.projectId === deps.getProjectId() && scope.accountScopeId === deps.getAccountScopeId();
|
|
9
|
+
const runs = () => (deps.getState()?.sessions || []).flatMap(session => (session.runs || []).map(run => ({ session, run })));
|
|
10
|
+
async function prepare(input) {
|
|
11
|
+
const view = deps.getRun(), scope = owner();
|
|
12
|
+
const run = view && deps.findRun(view.recordId, view.sessionId);
|
|
13
|
+
if (!run || !scope.accountScopeId || input.runProjectId !== scope.projectId
|
|
14
|
+
|| view.runProjectId !== scope.projectId) throw new Error('Writeback ownership changed before dispatch.');
|
|
15
|
+
const pending = Intent.normalize({
|
|
16
|
+
...scope, id: crypto.randomUUID(), sessionId: view.sessionId, runId: run.id,
|
|
17
|
+
createdAt: new Date().toISOString(), operations: input.operations, baseFiles: input.baseFiles,
|
|
18
|
+
requireReviewing: input.requireReviewing
|
|
19
|
+
});
|
|
20
|
+
if (!pending) throw new Error('This change exceeds the recoverable writeback limit. Split it into smaller changes.');
|
|
21
|
+
for (const op of pending.operations) {
|
|
22
|
+
if (op.type === 'edit' && !pending.baseFiles.some(file => file.path === op.path)) {
|
|
23
|
+
throw new Error('The original content of ' + op.path + ' is unavailable. Refresh the project before writing.');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
run.pendingWriteback = pending;
|
|
27
|
+
await deps.save();
|
|
28
|
+
if (!current(scope)) throw new Error('Project changed before writeback dispatch.');
|
|
29
|
+
const stored = await deps.StorageDb.getRecord('sessions', view.sessionId);
|
|
30
|
+
if (stored?.accountScopeId !== scope.accountScopeId || stored?.projectId !== scope.projectId
|
|
31
|
+
|| !(stored.runs || []).some(item => item.id === run.id && item.pendingWriteback?.id === pending.id)) {
|
|
32
|
+
throw new Error('The writeback recovery record could not be saved. No write was dispatched.');
|
|
33
|
+
}
|
|
34
|
+
return pending.id;
|
|
35
|
+
}
|
|
36
|
+
async function settle(input, result) {
|
|
37
|
+
const view = deps.getRun(), run = view && deps.findRun(view.recordId, view.sessionId);
|
|
38
|
+
if (!run?.pendingWriteback || run.pendingWriteback.projectId !== input.runProjectId) return;
|
|
39
|
+
const uncertain = result?.receiptUnconfirmed === true || (result?.skipped || []).some(entry => {
|
|
40
|
+
const item = entry.result || entry; return item.changedDocument === true || item.failure?.changedDocument === true;
|
|
41
|
+
});
|
|
42
|
+
// Volatile marker only. The intent remains durable until the mature
|
|
43
|
+
// action checkpoint has been recorded by the orchestrator.
|
|
44
|
+
run.writebackResultKnown = !uncertain;
|
|
45
|
+
}
|
|
46
|
+
function checkpointRecorded(run) {
|
|
47
|
+
if (run?.writebackResultKnown === true) {
|
|
48
|
+
delete run.pendingWriteback; delete run.writebackResultKnown;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function recover() {
|
|
52
|
+
if (recovery) return recovery;
|
|
53
|
+
recovery = reconcile().finally(() => { recovery = null; });
|
|
54
|
+
return recovery;
|
|
55
|
+
}
|
|
56
|
+
async function reconcile() {
|
|
57
|
+
if (deps.getRun()) return false;
|
|
58
|
+
const scope = owner();
|
|
59
|
+
const pending = runs().filter(({ run }) => run.pendingWriteback
|
|
60
|
+
&& run.pendingWriteback.projectId === scope.projectId && run.pendingWriteback.accountScopeId === scope.accountScopeId);
|
|
61
|
+
if (!pending.length) return true;
|
|
62
|
+
const snapshot = await deps.readProject();
|
|
63
|
+
if (!current(scope) || !snapshot?.capabilities?.fullProjectSnapshot) return false;
|
|
64
|
+
const observed = new Map((snapshot.files || []).map(file => [file.path, file]));
|
|
65
|
+
for (const { session, run } of pending) {
|
|
66
|
+
const intent = Intent.normalize(run.pendingWriteback);
|
|
67
|
+
if (!intent || intent.sessionId !== session.id || intent.runId !== run.id) continue;
|
|
68
|
+
const before = new Map(intent.baseFiles.map(file => [file.path, file.content]));
|
|
69
|
+
const after = Intent.expectedFiles(intent);
|
|
70
|
+
const applied = [], untouched = [], unknown = [];
|
|
71
|
+
for (const operation of intent.operations) {
|
|
72
|
+
const paths = [operation.path, operation.to].filter(Boolean);
|
|
73
|
+
if (operation.type.includes('binary')) {
|
|
74
|
+
unknown.push(operation.path); continue;
|
|
75
|
+
}
|
|
76
|
+
const matches = map => paths.every(path => map.has(path)
|
|
77
|
+
? typeof observed.get(path)?.content === 'string' && observed.get(path).content === map.get(path)
|
|
78
|
+
: !observed.has(path));
|
|
79
|
+
if (matches(before)) untouched.push(operation.path);
|
|
80
|
+
else if (matches(after)) applied.push(operation);
|
|
81
|
+
else unknown.push(operation.path);
|
|
82
|
+
}
|
|
83
|
+
if (!current(scope)) return false;
|
|
84
|
+
const retained = Array.isArray(run.appliedOperations) ? run.appliedOperations : [];
|
|
85
|
+
const knownPaths = new Set(retained.map(op => op.path));
|
|
86
|
+
run.appliedOperations = [...retained, ...applied.filter(op => !knownPaths.has(op.path))];
|
|
87
|
+
if (applied.length) {
|
|
88
|
+
run.changedDocument = true;
|
|
89
|
+
if (intent.requireReviewing) {
|
|
90
|
+
// Text readback cannot recreate native tracked-change identities.
|
|
91
|
+
// Preserve real refs if already captured; never fabricate Accept.
|
|
92
|
+
run.undoExpectedFiles = intent.baseFiles;
|
|
93
|
+
run.trackedChangeStatus = ['accepted', 'rejected'].includes(run.trackedChangeStatus)
|
|
94
|
+
? run.trackedChangeStatus : 'needs_review';
|
|
95
|
+
} else {
|
|
96
|
+
const undo = Undo.buildUndoCheckpoint({ files: intent.baseFiles }, run.appliedOperations);
|
|
97
|
+
run.undoOperations = undo.undoOperations; run.undoBaseFiles = undo.undoBaseFiles;
|
|
98
|
+
run.undoExpectedFiles = intent.baseFiles;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!unknown.length) delete run.pendingWriteback;
|
|
102
|
+
run.status = applied.length || unknown.length ? 'needs_review_after_navigation' : 'interrupted';
|
|
103
|
+
run.statusText = deps.tx('Writeback checked after refresh', '已核对刷新前的写入');
|
|
104
|
+
const text = deps.tx(
|
|
105
|
+
'Writeback recovery: ' + applied.length + ' confirmed changed, ' + untouched.length + ' unchanged, ' + unknown.length + ' require inspection.',
|
|
106
|
+
'写入核对:' + applied.length + ' 项已确认修改,' + untouched.length + ' 项未修改,' + unknown.length + ' 项需要检查。'
|
|
107
|
+
);
|
|
108
|
+
run.events = [...(run.events || []).filter(event => event.recoveryIntentId !== intent.id), {
|
|
109
|
+
kind: 'activity', title: text, status: unknown.length ? 'warning' : 'completed',
|
|
110
|
+
timestamp: new Date().toISOString(), recoveryIntentId: intent.id,
|
|
111
|
+
activity: { v: 1, kind: 'notice', id: 'writeback-recovery:' + intent.id, state: unknown.length ? 'warning' : 'info' }
|
|
112
|
+
}].slice(-300);
|
|
113
|
+
session.updatedAt = new Date().toISOString();
|
|
114
|
+
}
|
|
115
|
+
await deps.save();
|
|
116
|
+
if (current(scope)) deps.refresh();
|
|
117
|
+
return !runs().some(({ run }) => run.pendingWriteback?.projectId === scope.projectId);
|
|
118
|
+
}
|
|
119
|
+
return { prepare, settle, checkpointRecorded, recover };
|
|
120
|
+
}
|
|
121
|
+
return { create };
|
|
122
|
+
});
|