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,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
|
+
});
|