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,379 @@
|
|
|
1
|
+
(function (root, factory) {
|
|
2
|
+
if (typeof module === 'object' && module.exports) module.exports = factory();
|
|
3
|
+
else root.CodexOverleafModuleRegistry.define('SettingsWorkbench', [], factory);
|
|
4
|
+
})(typeof globalThis !== 'undefined' ? globalThis : this, function () {
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const CATEGORIES = [
|
|
8
|
+
['general', 'settingsWorkbenchGeneral', 'appearance'],
|
|
9
|
+
['providers', 'settingsWorkbenchModels', 'bolt'],
|
|
10
|
+
['context', 'settingsWorkbenchContext', 'database'],
|
|
11
|
+
['instructions', 'settingsWorkbenchInstructions', 'pen'],
|
|
12
|
+
['protection', 'settingsWorkbenchProtection', 'shield'],
|
|
13
|
+
['history', 'settingsWorkbenchHistory', 'history'],
|
|
14
|
+
['updates', 'softwareUpdatesTitle', 'software']
|
|
15
|
+
];
|
|
16
|
+
const GROUP_PAGES = {
|
|
17
|
+
appearance: 'general', 'writing-style': 'general', providers: 'providers', 'context-loading': 'context',
|
|
18
|
+
experimental: 'context', personalization: 'instructions', protection: 'protection',
|
|
19
|
+
privacy: 'protection', history: 'history', storage: 'history', updates: 'updates'
|
|
20
|
+
};
|
|
21
|
+
const PROJECT_GROUPS = new Set(['writing-style', 'personalization', 'protection', 'privacy', 'experimental', 'history']);
|
|
22
|
+
|
|
23
|
+
function mount(instance, options = {}) {
|
|
24
|
+
const container = instance.container, doc = container.ownerDocument;
|
|
25
|
+
const panel = container.closest('#codex-overleaf-panel');
|
|
26
|
+
const settings = container.querySelector('[data-project-settings-panel]');
|
|
27
|
+
const skills = container.querySelector('.codex-skills-panel');
|
|
28
|
+
if (!panel || !settings || !doc) return null;
|
|
29
|
+
const win = doc.defaultView;
|
|
30
|
+
const t = key => instance.i18n?.tr?.(key) || key;
|
|
31
|
+
const listeners = [];
|
|
32
|
+
const listen = (node, name, listener, eventOptions) => {
|
|
33
|
+
node?.addEventListener(name, listener, eventOptions);
|
|
34
|
+
listeners.push(() => node?.removeEventListener(name, listener, eventOptions));
|
|
35
|
+
};
|
|
36
|
+
const make = (tag, className, key) => {
|
|
37
|
+
const node = doc.createElement(tag);
|
|
38
|
+
if (className) node.className = className;
|
|
39
|
+
if (key) { node.dataset.i18n = key; node.textContent = t(key); }
|
|
40
|
+
return node;
|
|
41
|
+
};
|
|
42
|
+
const button = (className, key) => {
|
|
43
|
+
const node = make('button', className, key);
|
|
44
|
+
node.type = 'button';
|
|
45
|
+
return node;
|
|
46
|
+
};
|
|
47
|
+
const originalHead = settings.querySelector('.codex-custom-instructions-head');
|
|
48
|
+
const closeButton = originalHead?.querySelector('[data-settings-back]')
|
|
49
|
+
|| button('', 'settingsWorkbenchClose');
|
|
50
|
+
const status = settings.querySelector('[data-project-settings-status]');
|
|
51
|
+
const dialog = make('dialog', 'codex-settings-workbench');
|
|
52
|
+
dialog.setAttribute('aria-labelledby', 'codex-settings-workbench-title');
|
|
53
|
+
const header = make('header', 'codex-wb-header');
|
|
54
|
+
const heading = make('div', 'codex-wb-heading');
|
|
55
|
+
const title = make('h2', '', 'settingsWorkbenchTitle');
|
|
56
|
+
title.id = 'codex-settings-workbench-title';
|
|
57
|
+
heading.append(title, make('p', '', 'settingsWorkbenchSubtitle'));
|
|
58
|
+
closeButton.classList.add('codex-wb-close');
|
|
59
|
+
closeButton.textContent = '\u00d7';
|
|
60
|
+
header.append(heading, closeButton);
|
|
61
|
+
originalHead?.remove();
|
|
62
|
+
|
|
63
|
+
const layout = make('div', 'codex-wb-layout');
|
|
64
|
+
const sidebar = make('aside', 'codex-wb-sidebar');
|
|
65
|
+
const filters = make('div', 'codex-wb-filters');
|
|
66
|
+
filters.setAttribute('role', 'group');
|
|
67
|
+
const allFilter = button('', 'settingsWorkbenchAll');
|
|
68
|
+
const projectFilter = button('', 'settingsScopeProjectTitle');
|
|
69
|
+
filters.append(allFilter, projectFilter);
|
|
70
|
+
const nav = make('nav', 'codex-wb-nav');
|
|
71
|
+
nav.setAttribute('role', 'tablist');
|
|
72
|
+
nav.setAttribute('aria-orientation', 'vertical');
|
|
73
|
+
const brand = make('div', 'codex-wb-brand');
|
|
74
|
+
brand.textContent = 'Codex Overleaf Link';
|
|
75
|
+
sidebar.append(filters, nav, brand);
|
|
76
|
+
const main = make('div', 'codex-wb-main');
|
|
77
|
+
const body = make('div', 'codex-wb-body');
|
|
78
|
+
const footer = make('footer', 'codex-wb-footer');
|
|
79
|
+
if (status) { status.setAttribute('aria-live', 'polite'); footer.append(status); }
|
|
80
|
+
main.append(body, footer);
|
|
81
|
+
layout.append(sidebar, main);
|
|
82
|
+
dialog.append(header, layout);
|
|
83
|
+
const pages = new Map(), navButtons = new Map(), groups = [];
|
|
84
|
+
let active = 'general', filter = 'all', returnFocus = null, destroyed = false;
|
|
85
|
+
let providerRequested = false, providerCloseGuard = null, closing = null;
|
|
86
|
+
|
|
87
|
+
for (const [id, key, icon] of CATEGORIES) {
|
|
88
|
+
const page = make('section', 'codex-wb-page');
|
|
89
|
+
page.id = 'codex-settings-page-' + id;
|
|
90
|
+
page.dataset.workbenchPage = id;
|
|
91
|
+
page.setAttribute('role', 'tabpanel');
|
|
92
|
+
page.setAttribute('aria-labelledby', 'codex-settings-nav-' + id);
|
|
93
|
+
page.hidden = true;
|
|
94
|
+
page.append(make('h3', 'codex-wb-page-title', key));
|
|
95
|
+
pages.set(id, page);
|
|
96
|
+
const tab = button('codex-wb-nav-button');
|
|
97
|
+
tab.id = 'codex-settings-nav-' + id;
|
|
98
|
+
tab.setAttribute('role', 'tab');
|
|
99
|
+
tab.setAttribute('aria-controls', page.id);
|
|
100
|
+
if (options.icon) {
|
|
101
|
+
const glyph = make('span', 'codex-wb-nav-icon');
|
|
102
|
+
glyph.innerHTML = options.icon(icon); // Static, repository-owned icon paths only.
|
|
103
|
+
tab.append(glyph);
|
|
104
|
+
}
|
|
105
|
+
tab.append(make('span', '', key));
|
|
106
|
+
listen(tab, 'click', () => select(id));
|
|
107
|
+
nav.append(tab);
|
|
108
|
+
navButtons.set(id, tab);
|
|
109
|
+
}
|
|
110
|
+
function addGroup(node, category, projectOnly) {
|
|
111
|
+
node.hidden = true;
|
|
112
|
+
node.dataset.workbenchScope = projectOnly ? 'project' : 'global';
|
|
113
|
+
const summary = node.querySelector('summary');
|
|
114
|
+
const badge = make('span', 'codex-wb-scope-label',
|
|
115
|
+
projectOnly ? 'settingsScopeProjectTitle' : 'settingsScopeGlobalTitle');
|
|
116
|
+
(summary || node).append(badge);
|
|
117
|
+
pages.get(category).append(node);
|
|
118
|
+
groups.push({ node, category, projectOnly, expanded: true });
|
|
119
|
+
}
|
|
120
|
+
// Move existing controls rather than copying them. Their listeners, unsaved
|
|
121
|
+
// values, identity, validation and persistence callbacks remain attached.
|
|
122
|
+
for (const group of Array.from(settings.querySelectorAll('[data-set-group]'))) {
|
|
123
|
+
const key = group.dataset.setGroup;
|
|
124
|
+
const originalScope = group.closest('.codex-project-settings-scope');
|
|
125
|
+
const projectOnly = PROJECT_GROUPS.has(key)
|
|
126
|
+
|| (!GROUP_PAGES[key] && originalScope && !originalScope.classList.contains('codex-project-settings-scope--global'));
|
|
127
|
+
addGroup(group, GROUP_PAGES[key] || 'instructions', Boolean(projectOnly));
|
|
128
|
+
}
|
|
129
|
+
// Preserve non-card controls, including the legacy skill-loading entry.
|
|
130
|
+
// Scope headings are replaced by labels on the actual groups.
|
|
131
|
+
for (const scope of Array.from(settings.querySelectorAll('.codex-project-settings-scope'))) {
|
|
132
|
+
scope.querySelectorAll('.codex-project-settings-scope-title').forEach(node => node.remove());
|
|
133
|
+
if (scope.children.length) {
|
|
134
|
+
addGroup(scope, 'instructions', !scope.classList.contains('codex-project-settings-scope--global'));
|
|
135
|
+
} else scope.remove();
|
|
136
|
+
}
|
|
137
|
+
for (const node of Array.from(settings.children)) {
|
|
138
|
+
if (node === status) continue;
|
|
139
|
+
addGroup(node, 'instructions', false);
|
|
140
|
+
}
|
|
141
|
+
const providerHost = make('div', 'codex-wb-provider-host');
|
|
142
|
+
providerHost.dataset.providerSettingsHost = '';
|
|
143
|
+
pages.get('providers').append(providerHost);
|
|
144
|
+
settings.append(...pages.values());
|
|
145
|
+
body.append(settings);
|
|
146
|
+
if (skills) {
|
|
147
|
+
const back = skills.querySelector('[data-skills-back]');
|
|
148
|
+
if (back) back.innerHTML = '<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="m9.5 4-4 4 4 4"/></svg>';
|
|
149
|
+
const masterRow = skills.querySelector('[data-load-codex-overleaf-skills]')?.closest('label');
|
|
150
|
+
const masterTitle = masterRow?.querySelector('.codex-project-settings-row-label');
|
|
151
|
+
if (masterRow && masterTitle) {
|
|
152
|
+
if (masterRow.parentElement !== skills) {
|
|
153
|
+
masterRow.parentElement.classList.remove('codex-set-card');
|
|
154
|
+
masterRow.parentElement.classList.add('codex-wb-skills-master');
|
|
155
|
+
}
|
|
156
|
+
masterRow.classList.add('codex-wb-skills-master-row');
|
|
157
|
+
masterTitle.dataset.i18n = 'settingsWorkbenchEnableSkills';
|
|
158
|
+
masterTitle.classList.add('codex-wb-skills-caption');
|
|
159
|
+
const copy = make('div', 'codex-wb-skills-master-copy');
|
|
160
|
+
masterTitle.before(copy);
|
|
161
|
+
copy.append(masterTitle, make('p', 'codex-wb-skills-help codex-wb-skills-caption', 'settingsWorkbenchSkillsHelp'));
|
|
162
|
+
}
|
|
163
|
+
skills.querySelector('[data-local-skill-list]')?.before(
|
|
164
|
+
make('div', 'codex-wb-skills-list-title codex-wb-skills-caption', 'settingsWorkbenchSkillsList')
|
|
165
|
+
);
|
|
166
|
+
body.append(skills);
|
|
167
|
+
}
|
|
168
|
+
container.append(dialog);
|
|
169
|
+
panel.dataset.settingsWorkbench = 'true';
|
|
170
|
+
|
|
171
|
+
const themeSelect = settings.querySelector('[data-theme-select]');
|
|
172
|
+
let themeChoices = null;
|
|
173
|
+
if (themeSelect) {
|
|
174
|
+
const row = themeSelect.closest('label') || themeSelect;
|
|
175
|
+
themeSelect.hidden = true;
|
|
176
|
+
themeChoices = make('div', 'codex-wb-themes');
|
|
177
|
+
themeChoices.setAttribute('role', 'radiogroup');
|
|
178
|
+
for (const [value, key] of [['light', 'themeLight'], ['dark', 'themeDark'], ['auto', 'themeAuto']]) {
|
|
179
|
+
const choice = button('codex-wb-theme-choice');
|
|
180
|
+
choice.dataset.themeChoice = value;
|
|
181
|
+
choice.setAttribute('role', 'radio');
|
|
182
|
+
const preview = make('span', 'codex-wb-theme-preview');
|
|
183
|
+
preview.dataset.previewTheme = value;
|
|
184
|
+
preview.setAttribute('aria-hidden', 'true');
|
|
185
|
+
const lines = make('span', 'codex-wb-theme-lines');
|
|
186
|
+
lines.append(make('b'), make('b'), make('b'));
|
|
187
|
+
preview.append(lines);
|
|
188
|
+
choice.append(preview, make('span', 'codex-wb-theme-caption', key));
|
|
189
|
+
listen(choice, 'click', () => {
|
|
190
|
+
themeSelect.value = value;
|
|
191
|
+
themeSelect.dispatchEvent(new win.Event('input', { bubbles: true }));
|
|
192
|
+
themeSelect.dispatchEvent(new win.Event('change', { bubbles: true }));
|
|
193
|
+
updateThemes();
|
|
194
|
+
});
|
|
195
|
+
themeChoices.append(choice);
|
|
196
|
+
}
|
|
197
|
+
row.after(themeChoices);
|
|
198
|
+
listen(themeChoices, 'keydown', event => {
|
|
199
|
+
const choices = Array.from(themeChoices.querySelectorAll('button'));
|
|
200
|
+
const index = choices.indexOf(event.target);
|
|
201
|
+
if (index < 0 || !['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;
|
|
202
|
+
event.preventDefault(); event.stopPropagation();
|
|
203
|
+
const next = event.key === 'Home' ? 0 : event.key === 'End' ? choices.length - 1
|
|
204
|
+
: (index + (event.key === 'ArrowLeft' ? -1 : 1) + choices.length) % choices.length;
|
|
205
|
+
choices[next].click(); choices[next].focus();
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function updateThemes() {
|
|
209
|
+
themeChoices?.setAttribute('aria-label', t('themeLabel'));
|
|
210
|
+
for (const choice of themeChoices?.querySelectorAll('button') || []) {
|
|
211
|
+
const selected = choice.dataset.themeChoice === themeSelect.value;
|
|
212
|
+
choice.setAttribute('aria-checked', String(selected));
|
|
213
|
+
choice.tabIndex = selected ? 0 : -1;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function hasProject() {
|
|
217
|
+
return panel.dataset.settingsScope !== 'account'
|
|
218
|
+
&& /^\/project\/[^/]+/.test(win?.location?.pathname || '');
|
|
219
|
+
}
|
|
220
|
+
function available(item) {
|
|
221
|
+
return (!item.projectOnly || hasProject()) && (filter !== 'project' || item.projectOnly);
|
|
222
|
+
}
|
|
223
|
+
function refresh() {
|
|
224
|
+
if (destroyed) return;
|
|
225
|
+
if (!hasProject()) filter = 'all';
|
|
226
|
+
if (panel.dataset.view === 'skills') { active = 'instructions'; filter = 'all'; }
|
|
227
|
+
const availablePages = new Set(groups.filter(available).map(item => item.category));
|
|
228
|
+
if (!availablePages.has(active)) active = CATEGORIES.find(([id]) => availablePages.has(id))?.[0] || 'general';
|
|
229
|
+
for (const node of dialog.querySelectorAll('[data-i18n]')) {
|
|
230
|
+
// Existing controls use their established translation pass; update the
|
|
231
|
+
// newly owned chrome only, without replacing controls or skill rows.
|
|
232
|
+
if (node.closest('.codex-wb-header, .codex-wb-nav, .codex-wb-filters, .codex-wb-footer')
|
|
233
|
+
|| node.classList.contains('codex-wb-page-title')
|
|
234
|
+
|| node.classList.contains('codex-wb-scope-label')
|
|
235
|
+
|| node.classList.contains('codex-wb-theme-caption')
|
|
236
|
+
|| node.classList.contains('codex-wb-skills-caption')) node.textContent = t(node.dataset.i18n);
|
|
237
|
+
}
|
|
238
|
+
projectFilter.disabled = !hasProject();
|
|
239
|
+
projectFilter.title = hasProject() ? t('settingsWorkbenchProjectFilter') : t('settingsWorkbenchOpenProject');
|
|
240
|
+
filters.setAttribute('aria-label', t('settingsWorkbenchFilter'));
|
|
241
|
+
nav.setAttribute('aria-label', t('settingsWorkbenchCategories'));
|
|
242
|
+
allFilter.setAttribute('aria-pressed', String(filter === 'all'));
|
|
243
|
+
projectFilter.setAttribute('aria-pressed', String(filter === 'project'));
|
|
244
|
+
closeButton.title = t('settingsWorkbenchClose');
|
|
245
|
+
closeButton.setAttribute('aria-label', t('settingsWorkbenchClose'));
|
|
246
|
+
const skillsBack = skills?.querySelector('[data-skills-back]');
|
|
247
|
+
if (skillsBack) {
|
|
248
|
+
skillsBack.title = t('settingsBack');
|
|
249
|
+
skillsBack.setAttribute('aria-label', t('settingsBack'));
|
|
250
|
+
}
|
|
251
|
+
for (const [id, tab] of navButtons) {
|
|
252
|
+
tab.hidden = !availablePages.has(id);
|
|
253
|
+
tab.setAttribute('aria-selected', String(id === active));
|
|
254
|
+
tab.tabIndex = id === active ? 0 : -1;
|
|
255
|
+
pages.get(id).hidden = id !== active;
|
|
256
|
+
}
|
|
257
|
+
for (const item of groups) {
|
|
258
|
+
const visible = available(item) && item.category === active && panel.dataset.view !== 'skills';
|
|
259
|
+
if (item.node.tagName === 'DETAILS' && item.node.hidden !== !visible) {
|
|
260
|
+
if (!visible) item.expanded = item.node.open;
|
|
261
|
+
item.node.open = visible && item.expanded;
|
|
262
|
+
}
|
|
263
|
+
item.node.hidden = !visible;
|
|
264
|
+
}
|
|
265
|
+
updateThemes();
|
|
266
|
+
}
|
|
267
|
+
function requestProviders() {
|
|
268
|
+
if (active !== 'providers' || providerRequested || typeof instance.callbacks.onProvidersOpen !== 'function') return;
|
|
269
|
+
providerRequested = true;
|
|
270
|
+
const failed = error => {
|
|
271
|
+
providerRequested = false;
|
|
272
|
+
if (status && !destroyed) {
|
|
273
|
+
status.textContent = error?.message || t('settingsWorkbenchProviderOpenFailed');
|
|
274
|
+
status.dataset.status = 'failed';
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
try { Promise.resolve(instance.callbacks.onProvidersOpen()).catch(failed); }
|
|
278
|
+
catch (error) { failed(error); }
|
|
279
|
+
}
|
|
280
|
+
function revealProviders() {
|
|
281
|
+
active = 'providers';
|
|
282
|
+
filter = 'all';
|
|
283
|
+
providerRequested = true;
|
|
284
|
+
pages.get('providers').dataset.providerEmbedded = 'true';
|
|
285
|
+
panel.dataset.view = 'settings';
|
|
286
|
+
refresh();
|
|
287
|
+
return providerHost;
|
|
288
|
+
}
|
|
289
|
+
function requestClose() {
|
|
290
|
+
if (closing) return closing;
|
|
291
|
+
closing = (async () => {
|
|
292
|
+
if (providerCloseGuard && !await providerCloseGuard()) return;
|
|
293
|
+
if (!destroyed) instance.callbacks.onBack?.();
|
|
294
|
+
})().catch(error => {
|
|
295
|
+
if (status && !destroyed) {
|
|
296
|
+
status.textContent = error?.message || t('settingsWorkbenchProviderOpenFailed');
|
|
297
|
+
status.dataset.status = 'failed';
|
|
298
|
+
}
|
|
299
|
+
}).finally(() => { closing = null; });
|
|
300
|
+
return closing;
|
|
301
|
+
}
|
|
302
|
+
function select(id) {
|
|
303
|
+
active = id;
|
|
304
|
+
if (panel.dataset.view === 'skills') instance.callbacks.onSkillsBack?.();
|
|
305
|
+
refresh();
|
|
306
|
+
body.scrollTop = 0;
|
|
307
|
+
if (dialog.open) requestProviders();
|
|
308
|
+
}
|
|
309
|
+
function show() {
|
|
310
|
+
if (destroyed) return;
|
|
311
|
+
refresh();
|
|
312
|
+
if (!dialog.open) {
|
|
313
|
+
returnFocus = doc.activeElement;
|
|
314
|
+
dialog.showModal();
|
|
315
|
+
panel.dataset.settingsWorkbenchOpen = 'true';
|
|
316
|
+
navButtons.get(active)?.focus();
|
|
317
|
+
}
|
|
318
|
+
requestProviders();
|
|
319
|
+
}
|
|
320
|
+
function hide() {
|
|
321
|
+
providerRequested = false;
|
|
322
|
+
if (!dialog.open) return;
|
|
323
|
+
if (dialog.contains(doc.activeElement)) doc.activeElement?.blur?.();
|
|
324
|
+
dialog.close();
|
|
325
|
+
delete panel.dataset.settingsWorkbenchOpen;
|
|
326
|
+
if (returnFocus?.isConnected) returnFocus.focus?.();
|
|
327
|
+
}
|
|
328
|
+
const syncView = () => {
|
|
329
|
+
refresh();
|
|
330
|
+
if (['settings', 'skills'].includes(panel.dataset.view)) show();
|
|
331
|
+
else hide();
|
|
332
|
+
};
|
|
333
|
+
listen(allFilter, 'click', () => { filter = 'all'; refresh(); });
|
|
334
|
+
listen(projectFilter, 'click', () => {
|
|
335
|
+
filter = 'project';
|
|
336
|
+
if (panel.dataset.view === 'skills') instance.callbacks.onSkillsBack?.();
|
|
337
|
+
refresh();
|
|
338
|
+
body.scrollTop = 0;
|
|
339
|
+
});
|
|
340
|
+
listen(nav, 'keydown', event => {
|
|
341
|
+
if (!['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) return;
|
|
342
|
+
const tabs = Array.from(navButtons.values()).filter(tab => !tab.hidden);
|
|
343
|
+
const index = tabs.indexOf(event.target);
|
|
344
|
+
if (index < 0) return;
|
|
345
|
+
event.preventDefault(); event.stopPropagation();
|
|
346
|
+
const next = event.key === 'Home' ? 0 : event.key === 'End' ? tabs.length - 1
|
|
347
|
+
: (index + (event.key === 'ArrowUp' ? -1 : 1) + tabs.length) % tabs.length;
|
|
348
|
+
tabs[next].click(); tabs[next].focus();
|
|
349
|
+
});
|
|
350
|
+
listen(closeButton, 'click', event => {
|
|
351
|
+
if (!providerCloseGuard) return;
|
|
352
|
+
event.preventDefault(); event.stopImmediatePropagation();
|
|
353
|
+
void requestClose();
|
|
354
|
+
}, true);
|
|
355
|
+
listen(dialog, 'cancel', event => {
|
|
356
|
+
// File-input cancel events bubble; only this dialog's own cancel closes it.
|
|
357
|
+
if (event.target !== dialog) return;
|
|
358
|
+
event.preventDefault(); event.stopPropagation();
|
|
359
|
+
void requestClose();
|
|
360
|
+
});
|
|
361
|
+
listen(dialog, 'change', refresh);
|
|
362
|
+
const observer = new win.MutationObserver(syncView);
|
|
363
|
+
observer.observe(panel, { attributes: true, attributeFilter: ['data-view', 'data-settings-scope', 'data-theme'] });
|
|
364
|
+
refresh();
|
|
365
|
+
return {
|
|
366
|
+
show, hide, refresh, revealProviders,
|
|
367
|
+
setProviderCloseGuard(guard) { providerCloseGuard = guard; },
|
|
368
|
+
destroy() {
|
|
369
|
+
destroyed = true;
|
|
370
|
+
observer.disconnect();
|
|
371
|
+
listeners.splice(0).forEach(dispose => dispose());
|
|
372
|
+
hide();
|
|
373
|
+
dialog.remove();
|
|
374
|
+
delete panel.dataset.settingsWorkbench;
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
return { mount };
|
|
379
|
+
});
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
(function (root, factory) {
|
|
2
|
+
if (typeof module === 'object' && module.exports) module.exports = factory();
|
|
3
|
+
else root.CodexOverleafModuleRegistry.define('SharedSessionViewSync', [], factory);
|
|
4
|
+
})(typeof globalThis !== 'undefined' ? globalThis : this, function () {
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const sameScope = (a, b) => a.accountScopeId === b.accountScopeId
|
|
8
|
+
&& a.projectId === b.projectId && a.generation === b.generation;
|
|
9
|
+
|
|
10
|
+
function applySnapshot(options, sessions) {
|
|
11
|
+
const previous = options.getState(), scope = options.getScope();
|
|
12
|
+
const next = options.normalize({ ...previous, sessions }, { restoreRunningRuns: false });
|
|
13
|
+
const unchangedSnapshot = JSON.stringify(next);
|
|
14
|
+
options.setState(next);
|
|
15
|
+
try {
|
|
16
|
+
options.render();
|
|
17
|
+
} catch (error) {
|
|
18
|
+
// A callback may replace state, edit it in place or navigate. Restore only
|
|
19
|
+
// the unchanged view owned by this failed passive application.
|
|
20
|
+
let unchanged = false;
|
|
21
|
+
try {
|
|
22
|
+
unchanged = options.getState() === next && sameScope(scope, options.getScope())
|
|
23
|
+
&& JSON.stringify(options.getState()) === unchangedSnapshot;
|
|
24
|
+
} catch (_error) { /* Unknown state must not overwrite a newer edit. */ }
|
|
25
|
+
if (unchanged) {
|
|
26
|
+
options.setState(previous);
|
|
27
|
+
// A second render can also fail. The old merge base still protects
|
|
28
|
+
// subsequent saves, including values from partially restored controls.
|
|
29
|
+
try { options.render(); } catch (_error) { /* Report the first failure. */ }
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function install(options) {
|
|
36
|
+
const { Bridge, StorageDb, getScope, getState, isBusy, notice } = options;
|
|
37
|
+
const apply = options.apply || (sessions => applySnapshot(options, sessions));
|
|
38
|
+
let saving = 0, version = 0, pending = false, timer = null, refreshing = false, stopped = false;
|
|
39
|
+
let retryCount = 0;
|
|
40
|
+
const signature = state => JSON.stringify([state.activeSessionId,
|
|
41
|
+
(state.sessions || []).map(session => [session.id, session.updatedAt, session.task])]);
|
|
42
|
+
function schedule(delay = 250) {
|
|
43
|
+
if (stopped || timer || !pending) return;
|
|
44
|
+
timer = setTimeout(() => { timer = null; void refresh(); }, delay);
|
|
45
|
+
}
|
|
46
|
+
async function refresh() {
|
|
47
|
+
if (refreshing || stopped || !pending) return;
|
|
48
|
+
const scope = getScope();
|
|
49
|
+
if (!scope.projectId || !scope.accountScopeId) { pending = false; return; }
|
|
50
|
+
if (saving || isBusy()) { schedule(1000); return; }
|
|
51
|
+
const local = getState();
|
|
52
|
+
// A draft or a not-yet-persisted edit always takes priority over passive
|
|
53
|
+
// history refresh. It remains on screen until the user saves/sends it.
|
|
54
|
+
if (local.task || (local.sessions || []).some(session => StorageDb.hasUnpersistedSharedSession(session))) {
|
|
55
|
+
schedule(1500); return;
|
|
56
|
+
}
|
|
57
|
+
const capturedVersion = version, capturedSignature = signature(local);
|
|
58
|
+
pending = false; refreshing = true;
|
|
59
|
+
try {
|
|
60
|
+
const records = await StorageDb.readSharedProjectSnapshot(scope.projectId);
|
|
61
|
+
if (!sameScope(scope, getScope())) return;
|
|
62
|
+
if (saving || isBusy() || version !== capturedVersion || signature(getState()) !== capturedSignature) {
|
|
63
|
+
pending = true; return;
|
|
64
|
+
}
|
|
65
|
+
const ids = new Set(records.map(record => record.id));
|
|
66
|
+
const newLocal = (local.sessions || []).filter(session =>
|
|
67
|
+
!ids.has(session.id) && !StorageDb.wasSharedSessionStored(session.id));
|
|
68
|
+
// Rendering may fail after only part of the composer was updated.
|
|
69
|
+
// Keep the prior merge base until the complete view accepts the data.
|
|
70
|
+
apply([...records, ...newLocal]);
|
|
71
|
+
if (stopped || !sameScope(scope, getScope())) return;
|
|
72
|
+
if (saving || version !== capturedVersion) { pending = true; return; }
|
|
73
|
+
StorageDb.adoptSharedSessionBaseline(records);
|
|
74
|
+
retryCount = 0;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
notice?.(error);
|
|
77
|
+
// One retry can recover transient DOM failures. Local edits, navigation
|
|
78
|
+
// and persistent failures stop it; another notification starts afresh.
|
|
79
|
+
if (!stopped && sameScope(scope, getScope()) && version === capturedVersion
|
|
80
|
+
&& signature(getState()) === capturedSignature && retryCount < 1) {
|
|
81
|
+
retryCount++; pending = true;
|
|
82
|
+
}
|
|
83
|
+
} finally {
|
|
84
|
+
refreshing = false;
|
|
85
|
+
schedule(1000);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const unsubscribe = Bridge.subscribe(change => {
|
|
89
|
+
const scope = getScope();
|
|
90
|
+
if (!change.projectId || change.projectId === scope.projectId) {
|
|
91
|
+
retryCount = 0; pending = true; schedule();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
beginSave() {
|
|
96
|
+
saving += 1; version += 1;
|
|
97
|
+
let ended = false;
|
|
98
|
+
return () => {
|
|
99
|
+
if (ended) return;
|
|
100
|
+
ended = true; saving -= 1; version += 1; schedule();
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
dispose() {
|
|
104
|
+
stopped = true; clearTimeout(timer); unsubscribe();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return { install, applySnapshot };
|
|
109
|
+
});
|