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
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
const fs = require('node:fs');
|
|
4
4
|
const path = require('node:path');
|
|
5
|
+
const { createHash } = require('node:crypto');
|
|
6
|
+
const { filterTomlRootKeys } = require('./tomlStatements');
|
|
7
|
+
const { copyInheritedAuth, removeMissingInheritedAuth } = require('./codexInheritedAuth');
|
|
5
8
|
const {
|
|
6
9
|
getHomeDir,
|
|
7
10
|
getNativeHostPlatform
|
|
@@ -86,9 +89,11 @@ function preparePluginCodexHome(env = process.env, options = {}) {
|
|
|
86
89
|
const linked = [];
|
|
87
90
|
const skippedLinks = [];
|
|
88
91
|
for (const fileName of COPIED_USER_CODEX_FILES) {
|
|
92
|
+
if (fileName === 'config.toml' && options.skipCopiedUserConfig === true) continue;
|
|
89
93
|
const source = path.join(userHome, fileName);
|
|
90
94
|
const target = path.join(pluginHome, fileName);
|
|
91
95
|
if (!isRegularFile(source)) {
|
|
96
|
+
if (fileName === 'auth.json') removeMissingInheritedAuth(source, target);
|
|
92
97
|
continue;
|
|
93
98
|
}
|
|
94
99
|
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
@@ -166,90 +171,36 @@ function ensureDefaultCodexOverleafSkills({ env = process.env } = {}) {
|
|
|
166
171
|
}
|
|
167
172
|
|
|
168
173
|
function copyUserCodexFile(source, target, fileName, options = {}) {
|
|
174
|
+
if (fileName === 'auth.json') {
|
|
175
|
+
copyInheritedAuth(source, target);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
169
178
|
if (fileName !== 'config.toml') {
|
|
170
179
|
fs.copyFileSync(source, target);
|
|
171
180
|
return;
|
|
172
181
|
}
|
|
173
|
-
|
|
182
|
+
const content = sanitizeCopiedCodexConfig(fs.readFileSync(source, 'utf8'), options);
|
|
183
|
+
fs.writeFileSync(target, content, 'utf8');
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function sanitizeCopiedCodexConfig(content, options = {}) {
|
|
187
|
+
content = stripPersonalizationFromCodexConfig(content);
|
|
174
188
|
if (options.loadCodexLocalSkills === false) {
|
|
175
189
|
content = sanitizeCodexConfigForLocalSkillIsolation(content);
|
|
176
190
|
}
|
|
177
|
-
|
|
191
|
+
return content;
|
|
178
192
|
}
|
|
179
193
|
|
|
180
|
-
//
|
|
181
|
-
//
|
|
182
|
-
//
|
|
183
|
-
//
|
|
184
|
-
// values and both multi-line string forms (""" basic and ''' literal). All
|
|
185
|
-
// other lines pass through unchanged, aside from line endings being normalized to LF.
|
|
194
|
+
// Remove the complete top-level personality assignment. Statement boundaries
|
|
195
|
+
// keep keys/table headers inside multiline strings from becoming filter input.
|
|
196
|
+
// Key paths are decoded before filtering, including quoted/dotted spellings.
|
|
197
|
+
// Table-scoped fields remain distinct. Unselected source text is preserved.
|
|
186
198
|
function stripPersonalizationFromCodexConfig(content) {
|
|
187
|
-
|
|
188
|
-
const output = [];
|
|
189
|
-
let beforeFirstSection = true;
|
|
190
|
-
let closingDelimiter = '';
|
|
191
|
-
|
|
192
|
-
for (const line of lines) {
|
|
193
|
-
if (closingDelimiter) {
|
|
194
|
-
if (line.includes(closingDelimiter)) {
|
|
195
|
-
closingDelimiter = '';
|
|
196
|
-
}
|
|
197
|
-
// Drop every line of the multi-line value, including the one that closes it.
|
|
198
|
-
continue;
|
|
199
|
-
}
|
|
200
|
-
if (parseTomlSectionName(line)) {
|
|
201
|
-
beforeFirstSection = false;
|
|
202
|
-
output.push(line);
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
if (beforeFirstSection) {
|
|
206
|
-
const match = line.match(/^\s*personality\s*=\s*(.*)$/);
|
|
207
|
-
if (match) {
|
|
208
|
-
const value = match[1];
|
|
209
|
-
const opener = value.startsWith('"""') ? '"""'
|
|
210
|
-
: value.startsWith("'''") ? "'''"
|
|
211
|
-
: '';
|
|
212
|
-
if (opener && value.indexOf(opener, opener.length) === -1) {
|
|
213
|
-
closingDelimiter = opener;
|
|
214
|
-
}
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
output.push(line);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
return output.join('\n');
|
|
199
|
+
return filterTomlRootKeys(content, ['personality']);
|
|
222
200
|
}
|
|
223
201
|
|
|
224
202
|
function sanitizeCodexConfigForLocalSkillIsolation(content) {
|
|
225
|
-
|
|
226
|
-
let skippedSection = false;
|
|
227
|
-
|
|
228
|
-
for (const line of String(content || '').split(/\r?\n/)) {
|
|
229
|
-
const sectionName = parseTomlSectionName(line);
|
|
230
|
-
if (sectionName) {
|
|
231
|
-
skippedSection = isLocalSkillConfigSection(sectionName);
|
|
232
|
-
if (!skippedSection) {
|
|
233
|
-
output.push(line);
|
|
234
|
-
}
|
|
235
|
-
continue;
|
|
236
|
-
}
|
|
237
|
-
if (skippedSection || /^\s*notify\s*=/.test(line)) {
|
|
238
|
-
continue;
|
|
239
|
-
}
|
|
240
|
-
output.push(line);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
return `${output.join('\n').replace(/\n{3,}/g, '\n\n').trim()}\n`;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
function parseTomlSectionName(line) {
|
|
247
|
-
const match = String(line || '').match(/^\s*\[{1,2}\s*([^\]]+?)\s*\]{1,2}\s*(?:#.*)?$/);
|
|
248
|
-
return match ? match[1].trim() : '';
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function isLocalSkillConfigSection(sectionName) {
|
|
252
|
-
return LOCAL_SKILL_CONFIG_SECTIONS.some(prefix => sectionName === prefix || sectionName.startsWith(`${prefix}.`));
|
|
203
|
+
return filterTomlRootKeys(content, ['notify', ...LOCAL_SKILL_CONFIG_SECTIONS]);
|
|
253
204
|
}
|
|
254
205
|
|
|
255
206
|
function removePluginHomeEntry(pluginHome, entryName, skippedLinks) {
|
|
@@ -265,6 +216,24 @@ function removePluginHomeEntry(pluginHome, entryName, skippedLinks) {
|
|
|
265
216
|
}
|
|
266
217
|
|
|
267
218
|
function buildCodexHomeEnv(env = process.env, options = {}) {
|
|
219
|
+
const userHome = getUserCodexHome(env, options);
|
|
220
|
+
let canonicalHome = getPluginCodexHome(env, options);
|
|
221
|
+
// Per-skill writes belong to the plugin even when an older installation
|
|
222
|
+
// explicitly shared its Codex home with the user's normal Codex session.
|
|
223
|
+
if (samePath(userHome, canonicalHome) && (options.forceIsolatedSkillSettings === true
|
|
224
|
+
|| Array.isArray(options.enabledCodexLocalSkillIds))) {
|
|
225
|
+
canonicalHome += '-overleaf-runtime';
|
|
226
|
+
if (samePath(userHome, canonicalHome)) throw new Error('The isolated skill home must not alias the user Codex home.');
|
|
227
|
+
}
|
|
228
|
+
if (options.isolateRuntimeHome === true && !samePath(userHome, canonicalHome)) {
|
|
229
|
+
const { prepareScopedPluginCodexHome } = require('./codexHomeScope');
|
|
230
|
+
const prepared = prepareScopedPluginCodexHome(env, options, {
|
|
231
|
+
userHome, canonicalHome, prepare: preparePluginCodexHome, ensureSkills: ensureDefaultCodexOverleafSkills,
|
|
232
|
+
prepareConfig: sanitizeCopiedCodexConfig
|
|
233
|
+
});
|
|
234
|
+
return { ...env, CODEX_HOME: prepared.pluginHome, CODEX_SQLITE_HOME: env.CODEX_SQLITE_HOME || canonicalHome,
|
|
235
|
+
CODEX_OVERLEAF_CODEX_HOME: canonicalHome, CODEX_OVERLEAF_USER_CODEX_HOME: userHome };
|
|
236
|
+
}
|
|
268
237
|
const prepared = preparePluginCodexHome(env, options);
|
|
269
238
|
return {
|
|
270
239
|
...env,
|
|
@@ -322,9 +291,14 @@ function composePluginSkillsDirectory({
|
|
|
322
291
|
continue;
|
|
323
292
|
}
|
|
324
293
|
for (const entry of fs.readdirSync(source.root, { withFileTypes: true })) {
|
|
325
|
-
if (!entry.isDirectory() ||
|
|
294
|
+
if (!(entry.isDirectory() || (source.name === 'codex-local' && entry.isSymbolicLink()
|
|
295
|
+
&& isDirectory(path.join(source.root, entry.name)))) || !isSafeSkillEntryName(entry.name)) {
|
|
326
296
|
continue;
|
|
327
297
|
}
|
|
298
|
+
if (source.name === 'codex-overleaf') {
|
|
299
|
+
if (Array.isArray(options.enabledCodexOverleafSkillIds) && !options.enabledCodexOverleafSkillIds.includes(entry.name)) continue;
|
|
300
|
+
if (Array.isArray(options.disableCodexOverleafSkillIds) && options.disableCodexOverleafSkillIds.includes(entry.name)) continue;
|
|
301
|
+
}
|
|
328
302
|
const sourcePath = path.join(source.root, entry.name);
|
|
329
303
|
const targetPath = path.join(targetRoot, entry.name);
|
|
330
304
|
if (!isSafePluginHomePath(targetPath, pluginHome)) {
|
|
@@ -332,6 +306,7 @@ function composePluginSkillsDirectory({
|
|
|
332
306
|
continue;
|
|
333
307
|
}
|
|
334
308
|
if (source.replaceExisting) {
|
|
309
|
+
preserveLocalSkillAlias(targetPath, targetRoot, options);
|
|
335
310
|
fs.rmSync(targetPath, { recursive: true, force: true });
|
|
336
311
|
}
|
|
337
312
|
const linkResult = ensureSymlink(sourcePath, targetPath, options);
|
|
@@ -377,6 +352,21 @@ function composePluginSkillsDirectory({
|
|
|
377
352
|
return { linked, skippedLinks };
|
|
378
353
|
}
|
|
379
354
|
|
|
355
|
+
function preserveLocalSkillAlias(targetPath, targetRoot, options) {
|
|
356
|
+
let target;
|
|
357
|
+
try {
|
|
358
|
+
if (!fs.lstatSync(targetPath).isSymbolicLink()) return;
|
|
359
|
+
target = fs.realpathSync(targetPath);
|
|
360
|
+
} catch (error) {
|
|
361
|
+
if (error.code === 'ENOENT') return;
|
|
362
|
+
throw error;
|
|
363
|
+
}
|
|
364
|
+
const suffix = createHash('sha256').update(target).digest('hex').slice(0, 16);
|
|
365
|
+
const alias = path.join(targetRoot, `${path.basename(targetPath)}.codex-local-${suffix}`);
|
|
366
|
+
const result = ensureSymlink(target, alias, options);
|
|
367
|
+
if (!result.ok) throw new Error('The local skill alias could not be preserved.');
|
|
368
|
+
}
|
|
369
|
+
|
|
380
370
|
function clearPluginCodexHistory(optionsOrEnv = {}, maybeEnv = null) {
|
|
381
371
|
const { options, env } = normalizeClearHistoryArgs(optionsOrEnv, maybeEnv);
|
|
382
372
|
const pluginHome = getPluginCodexHome(env);
|
|
@@ -595,7 +585,10 @@ function chmodIfPossible(target, mode) {
|
|
|
595
585
|
}
|
|
596
586
|
|
|
597
587
|
function samePath(left, right) {
|
|
598
|
-
|
|
588
|
+
const resolvedLeft = path.resolve(left), resolvedRight = path.resolve(right);
|
|
589
|
+
if (resolvedLeft === resolvedRight) return true;
|
|
590
|
+
try { return fs.realpathSync(resolvedLeft) === fs.realpathSync(resolvedRight); }
|
|
591
|
+
catch { return false; }
|
|
599
592
|
}
|
|
600
593
|
|
|
601
594
|
function isInsideDirectory(target, parent) {
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const crypto = require('node:crypto');
|
|
4
|
+
const fs = require('node:fs');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const { rebaseCodexConfigPaths } = require('./codexConfigPaths');
|
|
7
|
+
const { AUTH_SOURCE_MARKER, copyInheritedAuth, removeMissingInheritedAuth } = require('./codexInheritedAuth');
|
|
8
|
+
const { getCodexOverleafSkillsRoot } = require('./localSkills');
|
|
9
|
+
|
|
10
|
+
const HISTORY_DIRS = ['sessions', 'archived_sessions', 'history'];
|
|
11
|
+
const SCOPE_MARKER = '.codex-overleaf-scope.json';
|
|
12
|
+
|
|
13
|
+
function prepareScopedPluginCodexHome(env, options, home) {
|
|
14
|
+
const { userHome, canonicalHome, prepare, ensureSkills, prepareConfig } = home;
|
|
15
|
+
fs.mkdirSync(canonicalHome, { recursive: true, mode: 0o700 });
|
|
16
|
+
try { fs.chmodSync(canonicalHome, 0o700); } catch { /* Match the existing best-effort home permissions. */ }
|
|
17
|
+
synchronizeAuth(path.join(userHome, 'auth.json'), path.join(canonicalHome, 'auth.json'));
|
|
18
|
+
ensureSkills({ env });
|
|
19
|
+
const overleafRoot = getCodexOverleafSkillsRoot({ env });
|
|
20
|
+
const capturedConfig = readOptionalFile(path.join(userHome, 'config.toml'));
|
|
21
|
+
const descriptor = {
|
|
22
|
+
version: 1,
|
|
23
|
+
userHome,
|
|
24
|
+
local: options.loadCodexLocalSkills !== false,
|
|
25
|
+
overleaf: options.loadCodexOverleafSkills !== false,
|
|
26
|
+
installer: options.installCodexOverleafSkillsTarget === true,
|
|
27
|
+
enabled: normalizedIds(options.enabledCodexOverleafSkillIds),
|
|
28
|
+
enabledLocal: normalizedIds(options.enabledCodexLocalSkillIds),
|
|
29
|
+
disabled: normalizedIds(options.disableCodexOverleafSkillIds),
|
|
30
|
+
config: digest(capturedConfig),
|
|
31
|
+
localSkills: options.loadCodexLocalSkills !== false ? directoryIdentity(path.join(userHome, 'skills')) : [],
|
|
32
|
+
// Installer targets stay stable while installed skill contents grow.
|
|
33
|
+
pluginSkills: options.installCodexOverleafSkillsTarget === true
|
|
34
|
+
? overleafRoot
|
|
35
|
+
: options.loadCodexOverleafSkills !== false ? directoryIdentity(overleafRoot) : [],
|
|
36
|
+
projectSkills: options.projectLocalSkills || null
|
|
37
|
+
};
|
|
38
|
+
const key = digest(JSON.stringify(descriptor));
|
|
39
|
+
const scopesRoot = path.join(canonicalHome, 'runtime-homes');
|
|
40
|
+
fs.mkdirSync(scopesRoot, { recursive: true, mode: 0o700 });
|
|
41
|
+
const scopeHome = path.join(scopesRoot, key);
|
|
42
|
+
for (const name of HISTORY_DIRS) fs.mkdirSync(path.join(canonicalHome, name), { recursive: true });
|
|
43
|
+
|
|
44
|
+
if (!isReady(scopeHome, key)) {
|
|
45
|
+
const staging = fs.mkdtempSync(path.join(scopesRoot, '.prepare-'));
|
|
46
|
+
try {
|
|
47
|
+
prepare({ ...env, CODEX_OVERLEAF_CODEX_HOME: staging, CODEX_OVERLEAF_USER_CODEX_HOME: userHome }, {
|
|
48
|
+
...options,
|
|
49
|
+
skipCopiedUserConfig: true,
|
|
50
|
+
enabledCodexOverleafSkillIds: descriptor.enabled || undefined,
|
|
51
|
+
enabledCodexLocalSkillIds: descriptor.enabledLocal || undefined,
|
|
52
|
+
disableCodexOverleafSkillIds: descriptor.disabled || undefined
|
|
53
|
+
});
|
|
54
|
+
// Published scopes inherit from the canonical home, including provenance.
|
|
55
|
+
// The staging prepare's direct user copy must never escape publication.
|
|
56
|
+
fs.rmSync(path.join(staging, 'auth.json'), { force: true });
|
|
57
|
+
fs.rmSync(path.join(staging, AUTH_SOURCE_MARKER), { force: true });
|
|
58
|
+
synchronizeAuth(path.join(canonicalHome, 'auth.json'), path.join(staging, 'auth.json'));
|
|
59
|
+
const configFile = path.join(staging, 'config.toml');
|
|
60
|
+
const config = prepareConfig(capturedConfig.toString('utf8'), options);
|
|
61
|
+
fs.writeFileSync(configFile, rebaseCodexConfigPaths(config, canonicalHome), { mode: 0o600 });
|
|
62
|
+
for (const name of HISTORY_DIRS) {
|
|
63
|
+
fs.symlinkSync(path.join(canonicalHome, name), path.join(staging, name), options.platform === 'win32' || process.platform === 'win32' ? 'junction' : 'dir');
|
|
64
|
+
}
|
|
65
|
+
fs.writeFileSync(path.join(staging, SCOPE_MARKER), JSON.stringify({ version: 1, key }), { mode: 0o600 });
|
|
66
|
+
try { fs.renameSync(staging, scopeHome); }
|
|
67
|
+
catch (error) {
|
|
68
|
+
// Another process may have atomically published this complete scope.
|
|
69
|
+
// Never remove a final directory or return an incomplete environment.
|
|
70
|
+
if (!isReady(scopeHome, key)) throw error;
|
|
71
|
+
}
|
|
72
|
+
} finally {
|
|
73
|
+
fs.rmSync(staging, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
synchronizeAuth(path.join(userHome, 'auth.json'), path.join(canonicalHome, 'auth.json'));
|
|
78
|
+
synchronizeAuth(path.join(canonicalHome, 'auth.json'), path.join(scopeHome, 'auth.json'));
|
|
79
|
+
// Refresh discovery caches without rewriting a live scope's configuration or
|
|
80
|
+
// replacing the skill paths a process has already discovered.
|
|
81
|
+
for (const name of ['installation_id', 'models_cache.json', 'version.json']) {
|
|
82
|
+
const source = path.join(userHome, name);
|
|
83
|
+
if (isFile(source)) fs.copyFileSync(source, path.join(scopeHome, name));
|
|
84
|
+
}
|
|
85
|
+
return { userHome, pluginHome: scopeHome, canonicalHome };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function synchronizeAuth(source, target) {
|
|
89
|
+
if (isFile(source)) copyInheritedAuth(source, target);
|
|
90
|
+
else removeMissingInheritedAuth(source, target);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function normalizedIds(value) {
|
|
94
|
+
return Array.isArray(value) ? Array.from(new Set(value.map(id => String(id || '').trim()).filter(Boolean))).sort() : null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function directoryIdentity(root) {
|
|
98
|
+
let entries;
|
|
99
|
+
try { entries = fs.readdirSync(root, { withFileTypes: true }); }
|
|
100
|
+
catch (error) { if (error.code === 'ENOENT') return []; throw error; }
|
|
101
|
+
return entries.filter(entry => entry.isDirectory() || (entry.isSymbolicLink()
|
|
102
|
+
&& isDirectory(path.join(root, entry.name)))).map(entry => {
|
|
103
|
+
const location = path.join(root, entry.name);
|
|
104
|
+
return [entry.name, fs.realpathSync(location)];
|
|
105
|
+
}).sort((a, b) => a[0].localeCompare(b[0]));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function isReady(directory, key) {
|
|
109
|
+
try {
|
|
110
|
+
const marker = JSON.parse(fs.readFileSync(path.join(directory, SCOPE_MARKER), 'utf8'));
|
|
111
|
+
if (marker.version === 1 && marker.key === key && !fs.lstatSync(directory).isSymbolicLink()) return true;
|
|
112
|
+
throw new Error('The plugin Codex scope has invalid ownership metadata.');
|
|
113
|
+
} catch (error) {
|
|
114
|
+
if (error.code === 'ENOENT' && !fs.existsSync(directory)) return false;
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function isFile(file) { try { return fs.statSync(file).isFile(); } catch { return false; } }
|
|
120
|
+
function isDirectory(file) { try { return fs.statSync(file).isDirectory(); } catch { return false; } }
|
|
121
|
+
function readOptionalFile(file) { try { return fs.readFileSync(file); } catch (error) { if (error.code === 'ENOENT') return Buffer.alloc(0); throw error; } }
|
|
122
|
+
function digest(value) { return crypto.createHash('sha256').update(value).digest('hex'); }
|
|
123
|
+
|
|
124
|
+
module.exports = { prepareScopedPluginCodexHome };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const crypto = require('node:crypto');
|
|
4
|
+
const fs = require('node:fs');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
|
|
7
|
+
const MARKER = '.codex-overleaf-auth-source.json';
|
|
8
|
+
|
|
9
|
+
function fingerprint(contents) {
|
|
10
|
+
return crypto.createHash('sha256').update(contents).digest('hex');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function copyInheritedAuth(source, target) {
|
|
14
|
+
const contents = fs.readFileSync(source);
|
|
15
|
+
const authTemporary = `${target}.${process.pid}.${crypto.randomBytes(6).toString('hex')}.tmp`;
|
|
16
|
+
try {
|
|
17
|
+
fs.writeFileSync(authTemporary, contents, { mode: 0o600 });
|
|
18
|
+
fs.renameSync(authTemporary, target);
|
|
19
|
+
} finally {
|
|
20
|
+
fs.rmSync(authTemporary, { force: true });
|
|
21
|
+
}
|
|
22
|
+
const marker = path.join(path.dirname(target), MARKER);
|
|
23
|
+
const temporary = `${marker}.${process.pid}.${crypto.randomBytes(6).toString('hex')}.tmp`;
|
|
24
|
+
try {
|
|
25
|
+
fs.writeFileSync(temporary, JSON.stringify({ version: 1, source: path.resolve(source), digest: fingerprint(contents) }), { mode: 0o600 });
|
|
26
|
+
fs.renameSync(temporary, marker);
|
|
27
|
+
} finally {
|
|
28
|
+
fs.rmSync(temporary, { force: true });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Source absence alone cannot identify independent or old, unattributed auth.
|
|
33
|
+
// Delete only the unchanged bytes that this home preparation actually copied.
|
|
34
|
+
function removeMissingInheritedAuth(source, target) {
|
|
35
|
+
const marker = path.join(path.dirname(target), MARKER);
|
|
36
|
+
const ownedMarker = `${marker}.claimed-${process.pid}-${crypto.randomBytes(8).toString('hex')}`;
|
|
37
|
+
try { fs.renameSync(marker, ownedMarker); }
|
|
38
|
+
catch (error) { if (error.code === 'ENOENT') return; throw error; }
|
|
39
|
+
let provenance;
|
|
40
|
+
try { provenance = JSON.parse(fs.readFileSync(ownedMarker, 'utf8')); }
|
|
41
|
+
catch (error) { restoreExclusive(ownedMarker, marker); throw error; }
|
|
42
|
+
if (provenance?.version !== 1 || provenance.source !== path.resolve(source)) {
|
|
43
|
+
restoreExclusive(ownedMarker, marker); return;
|
|
44
|
+
}
|
|
45
|
+
// Independent auth that already differs requires no file move at all.
|
|
46
|
+
let contents;
|
|
47
|
+
try { contents = fs.readFileSync(target); }
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error.code === 'ENOENT') { fs.rmSync(ownedMarker, { force: true }); return; }
|
|
50
|
+
restoreExclusive(ownedMarker, marker); throw error;
|
|
51
|
+
}
|
|
52
|
+
if (fingerprint(contents) !== provenance.digest) {
|
|
53
|
+
fs.rmSync(ownedMarker, { force: true }); return;
|
|
54
|
+
}
|
|
55
|
+
const detached = `${target}.preserved-${process.pid}-${crypto.randomBytes(8).toString('hex')}`;
|
|
56
|
+
try { fs.renameSync(target, detached); }
|
|
57
|
+
catch (error) {
|
|
58
|
+
restoreExclusive(ownedMarker, marker);
|
|
59
|
+
if (error.code === 'ENOENT') return;
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
let inherited;
|
|
63
|
+
try {
|
|
64
|
+
inherited = fs.lstatSync(detached).isFile() && fingerprint(fs.readFileSync(detached)) === provenance.digest;
|
|
65
|
+
} catch (error) {
|
|
66
|
+
restoreExclusive(detached, target); restoreExclusive(ownedMarker, marker); throw error;
|
|
67
|
+
}
|
|
68
|
+
if (inherited) {
|
|
69
|
+
// A concurrent login may already have published a new auth and marker.
|
|
70
|
+
// Only these atomically claimed files belong to this cleanup operation.
|
|
71
|
+
fs.rmSync(detached, { force: true });
|
|
72
|
+
} else {
|
|
73
|
+
restoreExclusive(detached, target);
|
|
74
|
+
}
|
|
75
|
+
fs.rmSync(ownedMarker, { force: true });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function restoreExclusive(detached, target) {
|
|
79
|
+
try {
|
|
80
|
+
fs.linkSync(detached, target);
|
|
81
|
+
fs.rmSync(detached, { force: true });
|
|
82
|
+
} catch (error) {
|
|
83
|
+
if (error.code === 'EEXIST' && fs.existsSync(target)) return;
|
|
84
|
+
// A nonmatching credential remains in the private preserved file. Starting
|
|
85
|
+
// without restoring it would silently change the selected authentication.
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
module.exports = { AUTH_SOURCE_MARKER: MARKER, copyInheritedAuth, removeMissingInheritedAuth };
|