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.
Files changed (397) hide show
  1. package/README.md +275 -305
  2. package/README.zh-CN.md +290 -320
  3. package/extension/bootstrap/background.js +99 -19
  4. package/extension/bootstrap/manifest.template.json +9 -4
  5. package/extension/bootstrap/popup.html +11 -16
  6. package/extension/bootstrap/popupFallback.js +55 -0
  7. package/extension/bootstrap/update.js +25 -2
  8. package/extension/bootstrap/updateStatus.js +1 -0
  9. package/extension/runtime-manifest.json +3 -1
  10. package/extension/src/background.js +234 -56
  11. package/extension/src/backgroundBootstrapMigration.js +181 -0
  12. package/extension/src/backgroundSharedSessions.js +440 -0
  13. package/extension/src/backgroundUpdateCoordinator.js +541 -381
  14. package/extension/src/backgroundUpdateSafety.js +173 -0
  15. package/extension/src/content/activeTurnControl.js +16 -2
  16. package/extension/src/content/applyResultFormatters.js +46 -73
  17. package/extension/src/content/assetTransferBroker.js +244 -12
  18. package/extension/src/content/changeHistoryView.js +175 -0
  19. package/extension/src/content/composerAttachments.js +117 -67
  20. package/extension/src/content/composerPanel.js +41 -8
  21. package/extension/src/content/contentRuntime.js +1084 -1099
  22. package/extension/src/content/diagnosticsController.js +122 -97
  23. package/extension/src/content/diagnosticsExport.js +236 -0
  24. package/extension/src/content/diagnosticsPanel.js +78 -19
  25. package/extension/src/content/diffReviewPanel.js +8 -5
  26. package/extension/src/content/directoryCleanupRecovery.js +54 -0
  27. package/extension/src/content/generated/content.bundle.js +14680 -3606
  28. package/extension/src/content/generated/content.bundle.meta.json +30 -3
  29. package/extension/src/content/globalPreferencesController.js +1 -1
  30. package/extension/src/content/legacyGlobalRegistry.js +25 -1
  31. package/extension/src/content/localSkillsPanel.js +141 -16
  32. package/extension/src/content/markdownDomRenderer.js +9 -4
  33. package/extension/src/content/markdownText.js +5 -6
  34. package/extension/src/content/modelPicker.js +8 -5
  35. package/extension/src/content/nativeCompatibilityController.js +45 -20
  36. package/extension/src/content/otWarmMirror.js +4 -5
  37. package/extension/src/content/otWarmMirrorController.js +17 -20
  38. package/extension/src/content/pageBridgeClient.js +33 -5
  39. package/extension/src/content/panelMaintenance.js +87 -132
  40. package/extension/src/content/panelRenderer.js +10 -0
  41. package/extension/src/content/pendingInputView.js +109 -76
  42. package/extension/src/content/projectProviderSelection.js +13 -4
  43. package/extension/src/content/projectSessionCleanup.js +109 -62
  44. package/extension/src/content/projectSettingsCoordinator.js +39 -2
  45. package/extension/src/content/providerSettingsCoordinator.js +63 -14
  46. package/extension/src/content/providerSettingsDialog.js +724 -113
  47. package/extension/src/content/recentProjects.js +21 -6
  48. package/extension/src/content/runActivitySummary.js +665 -0
  49. package/extension/src/content/runCompletionMeta.js +344 -0
  50. package/extension/src/content/runController.js +40 -15
  51. package/extension/src/content/runFailureNotice.js +34 -12
  52. package/extension/src/content/runGuidanceController.js +76 -30
  53. package/extension/src/content/runGuidanceView.js +59 -10
  54. package/extension/src/content/runPresence.js +306 -0
  55. package/extension/src/content/runQueueScheduler.js +150 -43
  56. package/extension/src/content/runRecoveryActions.js +146 -0
  57. package/extension/src/content/runResultActions.js +11 -8
  58. package/extension/src/content/runReviewController.js +574 -0
  59. package/extension/src/content/runScrollLayout.js +21 -2
  60. package/extension/src/content/runTimelineView.js +315 -290
  61. package/extension/src/content/scopedPersistencePanelState.js +51 -6
  62. package/extension/src/content/selectionContextView.js +300 -0
  63. package/extension/src/content/sensitivePreflight.js +140 -0
  64. package/extension/src/content/sessionForkController.js +80 -17
  65. package/extension/src/content/sessionManager.js +1 -1
  66. package/extension/src/content/sessionPersistence.js +6 -1
  67. package/extension/src/content/settingsPanel.js +84 -55
  68. package/extension/src/content/settingsWorkbench.js +379 -0
  69. package/extension/src/content/sharedSessionViewSync.js +109 -0
  70. package/extension/src/content/subagentActivityView.js +195 -0
  71. package/extension/src/content/trackedChangeCaptureController.js +7 -3
  72. package/extension/src/content/updateIdle.js +4 -1
  73. package/extension/src/content/updateNotice.js +179 -56
  74. package/extension/src/content/updateSafetyReceiver.js +58 -0
  75. package/extension/src/content/writebackController.js +308 -2
  76. package/extension/src/content/writebackOrchestrator.js +213 -199
  77. package/extension/src/content/writebackPlan.js +231 -0
  78. package/extension/src/content/writebackRecovery.js +122 -0
  79. package/extension/src/content/writingStyleSettings.js +600 -0
  80. package/extension/src/content/writtenChangesView.js +152 -0
  81. package/extension/src/page/binaryAssetUploader.js +223 -23
  82. package/extension/src/page/fileMover.js +256 -0
  83. package/extension/src/page/overleafProjectSnapshot.js +1 -0
  84. package/extension/src/page/ownedDirectoryCleanup.js +94 -0
  85. package/extension/src/page/referenceProjects.js +149 -0
  86. package/extension/src/page/reviewContext.js +113 -0
  87. package/extension/src/page/saveState.js +20 -6
  88. package/extension/src/page/snapshotRouter.js +124 -48
  89. package/extension/src/page/textCoordinates.js +102 -0
  90. package/extension/src/page/textFileCreator.js +442 -71
  91. package/extension/src/page/trackedChangeCapture.js +53 -57
  92. package/extension/src/page/trackedChangeOwnership.js +216 -0
  93. package/extension/src/page/trackedChangeReplay.js +184 -0
  94. package/extension/src/page/trackedChangesLifecycle.js +343 -339
  95. package/extension/src/page/treeOperations.js +33 -12
  96. package/extension/src/page/updateSafetyProbe.js +41 -0
  97. package/extension/src/page/writebackReceiptJournal.js +114 -0
  98. package/extension/src/page/writebackRouter.js +242 -201
  99. package/extension/src/pageBridge.js +73 -102
  100. package/extension/src/popup.js +261 -65
  101. package/extension/src/shared/agentTranscript.js +41 -4
  102. package/extension/src/shared/auditRecords.js +73 -0
  103. package/extension/src/shared/changeHistoryModel.js +94 -0
  104. package/extension/src/shared/compatibility.js +22 -6
  105. package/extension/src/shared/compileAdapter.js +101 -37
  106. package/extension/src/shared/composerAttachmentDraft.js +151 -0
  107. package/extension/src/shared/directoryCleanupProof.js +43 -0
  108. package/extension/src/shared/failureReasons.js +329 -3
  109. package/extension/src/shared/globalPreferences.js +31 -14
  110. package/extension/src/shared/governanceRules.js +4 -37
  111. package/extension/src/shared/i18n.js +389 -25
  112. package/extension/src/shared/managedUpdateProjection.js +8 -5
  113. package/extension/src/shared/nativeRequestIdentity.js +1 -0
  114. package/extension/src/shared/pageRpcContract.js +9 -2
  115. package/extension/src/shared/projectFiles.js +21 -44
  116. package/extension/src/shared/providerProfiles.js +114 -3
  117. package/extension/src/shared/runActivityModel.js +361 -0
  118. package/extension/src/shared/runExecutionSnapshot.js +8 -2
  119. package/extension/src/shared/runExecutionSnapshotCodec.js +16 -4
  120. package/extension/src/shared/runInputQueue.js +48 -5
  121. package/extension/src/shared/scopedPersistenceBrowserAdapter.js +6 -3
  122. package/extension/src/shared/selectionContext.js +37 -0
  123. package/extension/src/shared/sessionState.js +166 -30
  124. package/extension/src/shared/settlementFacts.js +10 -2
  125. package/extension/src/shared/sharedSessionBridge.js +311 -0
  126. package/extension/src/shared/sharedSessionTransfer.js +140 -0
  127. package/extension/src/shared/staleGuard.js +118 -13
  128. package/extension/src/shared/storageDb.js +77 -78
  129. package/extension/src/shared/storageMigration.js +74 -111
  130. package/extension/src/shared/storageRunActions.js +211 -22
  131. package/extension/src/shared/storageValuePruning.js +40 -0
  132. package/extension/src/shared/subagentActivityModel.js +174 -0
  133. package/extension/src/shared/undoOperations.js +216 -6
  134. package/extension/src/shared/updateConsent.js +42 -11
  135. package/extension/src/shared/updateRuntimeIdentity.js +1 -1
  136. package/extension/src/shared/writebackIntent.js +78 -0
  137. package/extension/src/shared/writebackOperationEvidence.js +4 -15
  138. package/extension/src/shared/writebackSettlement.js +67 -48
  139. package/extension/src/shared/writingStyle.js +33 -0
  140. package/extension/styles/panel.css +1987 -385
  141. package/extension/styles/popup.css +110 -0
  142. package/native-host/src/anthropicBridgeRequest.js +6 -3
  143. package/native-host/src/anthropicBridgeResponse.js +6 -2
  144. package/native-host/src/anthropicMessagesBridge.js +24 -16
  145. package/native-host/src/bootstrapMigration.js +296 -0
  146. package/native-host/src/bootstrapMigrationContract.js +101 -0
  147. package/native-host/src/bootstrapUpdate.js +233 -0
  148. package/native-host/src/bootstrapUpdateWatchdog.js +44 -0
  149. package/native-host/src/chatBridgeResponse.js +10 -0
  150. package/native-host/src/chatCompletionsBridge.js +21 -15
  151. package/native-host/src/codexConfigPaths.js +106 -0
  152. package/native-host/src/codexHome.js +66 -73
  153. package/native-host/src/codexHomeScope.js +124 -0
  154. package/native-host/src/codexInheritedAuth.js +90 -0
  155. package/native-host/src/codexLocalSkills.js +301 -0
  156. package/native-host/src/codexModelRecovery.js +107 -0
  157. package/native-host/src/codexPromptAssembly.js +33 -12
  158. package/native-host/src/codexProviderLaunch.js +3 -3
  159. package/native-host/src/codexProviderTest.js +24 -26
  160. package/native-host/src/codexRuntimeIdentity.js +1 -0
  161. package/native-host/src/codexSessionRunner.js +211 -318
  162. package/native-host/src/codexSessionTiming.js +21 -8
  163. package/native-host/src/codexSkillIsolation.js +170 -0
  164. package/native-host/src/codexThreadFork.js +19 -3
  165. package/native-host/src/index.js +19 -7
  166. package/native-host/src/managedInstall.js +115 -39
  167. package/native-host/src/managedInstallRecovery.js +140 -0
  168. package/native-host/src/managedRuntimeEvidence.js +57 -0
  169. package/native-host/src/mirrorWorkspace.js +92 -22
  170. package/native-host/src/nativeDoctor.js +15 -0
  171. package/native-host/src/nativeEnvironment.js +70 -0
  172. package/native-host/src/nativeHelperLifecycle.js +21 -0
  173. package/native-host/src/nativeHostRegistration.js +33 -0
  174. package/native-host/src/nativeQuotas.js +15 -8
  175. package/native-host/src/nativeRunLifecycle.js +71 -0
  176. package/native-host/src/overleafWorkspaceRules.js +16 -0
  177. package/native-host/src/processStopBarrier.js +115 -0
  178. package/native-host/src/projectPathPlatform.js +30 -0
  179. package/native-host/src/providerHttp.js +80 -0
  180. package/native-host/src/providerModelCatalog.js +4 -3
  181. package/native-host/src/providerProfile.js +17 -3
  182. package/native-host/src/providerReasoning.js +10 -11
  183. package/native-host/src/providerRuntime.js +1 -0
  184. package/native-host/src/providerStore.js +76 -14
  185. package/native-host/src/releaseTransport.js +14 -5
  186. package/native-host/src/responsesPassthroughBridge.js +266 -52
  187. package/native-host/src/runtimeInstaller.js +21 -1
  188. package/native-host/src/selectionScope.js +86 -0
  189. package/native-host/src/skills/parallel-subagents/SKILL.md +31 -3
  190. package/native-host/src/skills/writing-style-builder/SKILL.md +146 -0
  191. package/native-host/src/subagentAdmission.js +26 -0
  192. package/native-host/src/subagentBroker.js +176 -159
  193. package/native-host/src/subagentTelemetry.js +325 -0
  194. package/native-host/src/subagentWorkspace.js +103 -0
  195. package/native-host/src/subagentWorkspacePath.js +34 -0
  196. package/native-host/src/taskRunnerRuntime.js +130 -57
  197. package/native-host/src/tomlStatements.js +140 -0
  198. package/native-host/src/turnAttachments.js +113 -0
  199. package/native-host/src/updateManager.js +406 -38
  200. package/native-host/src/updateNetworkControl.js +75 -0
  201. package/native-host/src/updateTrust.js +21 -2
  202. package/native-host/src/vendor/pdfjs/LICENSE +177 -0
  203. package/native-host/src/vendor/pdfjs/SOURCE.txt +3 -0
  204. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  205. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  206. package/native-host/src/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
  207. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  208. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  209. package/native-host/src/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
  210. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  211. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  212. package/native-host/src/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  213. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  214. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  215. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  216. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  217. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  218. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  219. package/native-host/src/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
  220. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  221. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  222. package/native-host/src/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
  223. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  224. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  225. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  226. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  227. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  228. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  229. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  230. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  231. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  232. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  233. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  234. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  235. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  236. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  237. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  238. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  239. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  240. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  241. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  242. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  243. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  244. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  245. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  246. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  247. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  248. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  249. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  250. package/native-host/src/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
  251. package/native-host/src/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
  252. package/native-host/src/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  253. package/native-host/src/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  254. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  255. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  256. package/native-host/src/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  257. package/native-host/src/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  258. package/native-host/src/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  259. package/native-host/src/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  260. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  261. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  262. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  263. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  264. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  265. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  266. package/native-host/src/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
  267. package/native-host/src/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
  268. package/native-host/src/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
  269. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  270. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  271. package/native-host/src/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
  272. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  273. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  274. package/native-host/src/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
  275. package/native-host/src/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
  276. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  277. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  278. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  279. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  280. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  281. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  282. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  283. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  284. package/native-host/src/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
  285. package/native-host/src/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
  286. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  287. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  288. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  289. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  290. package/native-host/src/vendor/pdfjs/cmaps/H.bcmap +0 -0
  291. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  292. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  293. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  294. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  295. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  296. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  297. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  298. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  299. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  300. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  301. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  302. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  303. package/native-host/src/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
  304. package/native-host/src/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
  305. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  306. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  307. package/native-host/src/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
  308. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  309. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  310. package/native-host/src/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
  311. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  312. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  313. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  314. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  315. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  316. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  317. package/native-host/src/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
  318. package/native-host/src/vendor/pdfjs/cmaps/LICENSE +36 -0
  319. package/native-host/src/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
  320. package/native-host/src/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
  321. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  322. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  323. package/native-host/src/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
  324. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  325. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  326. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  327. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  328. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  329. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  330. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  331. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  332. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  333. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  334. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  335. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  336. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  337. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  338. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  339. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  340. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  341. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  342. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  343. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  344. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  345. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  346. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  347. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  348. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  349. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  350. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  351. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  352. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  353. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  354. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  355. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  356. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  357. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  358. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  359. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  360. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  361. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  362. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  363. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  364. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  365. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  366. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  367. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  368. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  369. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  370. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  371. package/native-host/src/vendor/pdfjs/cmaps/V.bcmap +0 -0
  372. package/native-host/src/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  373. package/native-host/src/vendor/pdfjs/pdf.mjs +26740 -0
  374. package/native-host/src/vendor/pdfjs/pdf.worker.mjs +62201 -0
  375. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  376. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  377. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  378. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  379. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  380. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  381. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  382. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  383. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  384. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  385. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  386. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
  387. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  388. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  389. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  390. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  391. package/native-host/src/writingStyleEvidence.js +102 -0
  392. package/native-host/src/writingStylePdfWorker.js +35 -0
  393. package/native-host/src/writingStyleProfile.js +165 -0
  394. package/native-host/src/writingStyleRuntime.js +475 -0
  395. package/native-host/src/writingStyleStore.js +73 -0
  396. package/package.json +1 -1
  397. package/scripts/install-managed.mjs +1 -0
@@ -7,15 +7,32 @@
7
7
 
8
8
  function create(deps = {}) {
9
9
  const {
10
- SessionState, getState, setState, sendBackgroundNative, saveState,
10
+ SessionState, getState, setState, getScope, sendBackgroundNative, saveState,
11
11
  applyStateToPanel, showPluginToast, tr
12
12
  } = deps;
13
13
 
14
14
  async function forkRunFromNode(runId) {
15
15
  const previousState = getState();
16
+ const skillPreferences = {
17
+ loadCodexLocalSkills: previousState.loadCodexLocalSkills !== false,
18
+ loadCodexOverleafSkills: previousState.loadCodexOverleafSkills !== false,
19
+ codexLocalSkillEnabled: { ...previousState.codexLocalSkillEnabled }
20
+ };
16
21
  const source = findSource(previousState, runId);
17
22
  if (!source) return failFork('session_fork_source_missing', tr('forkRunUnavailable'));
18
- const { session, run, runIndex } = source;
23
+ const scope = getScope ? { ...getScope() } : null;
24
+ const requestedActiveId = previousState.activeSessionId;
25
+ // The Native request and copied history must describe the same origin,
26
+ // even when the source session is edited while the request is pending.
27
+ const { session, run, runIndex } = JSON.parse(JSON.stringify(source));
28
+ const sameScope = () => {
29
+ const current = getScope?.();
30
+ return !scope || ['accountScopeId', 'projectId', 'generation'].every(key => current?.[key] === scope[key]);
31
+ };
32
+ const currentSource = () => {
33
+ const current = findSource(getState(), runId);
34
+ return current?.session.id === session.id && current.run.codexTurnId === run.codexTurnId;
35
+ };
19
36
  const draftThreadId = run.codexTurnId && run.interruptedDraft?.turnId === run.codexTurnId
20
37
  ? run.interruptedDraft.threadId : '';
21
38
  // Provider switches replace the session thread, not the selected node's origin.
@@ -25,25 +42,39 @@
25
42
  }
26
43
  let response;
27
44
  try {
45
+ const resolveLocalSkills = deps.captureLocalSkillIdsForFork || deps.getEnabledCodexLocalSkillIds;
46
+ const enabledCodexLocalSkillIds = skillPreferences.loadCodexLocalSkills
47
+ ? captureLocalSkillIds(await resolveLocalSkills?.(skillPreferences)) : [];
48
+ if (!sameScope() || !currentSource()) return null;
49
+ if (resolveLocalSkills && !Array.isArray(enabledCodexLocalSkillIds)) {
50
+ throw codedError('codex_local_skill_unavailable', tr('forkRunFailed'));
51
+ }
28
52
  response = await sendBackgroundNative({
29
53
  method: 'codex.thread.fork',
30
54
  params: {
31
55
  threadId: sourceThreadId,
32
56
  lastTurnId: run.codexTurnId,
33
57
  speedTier: session.speedTier,
34
- loadCodexLocalSkills: previousState.loadCodexLocalSkills !== false,
35
- loadCodexOverleafSkills: previousState.loadCodexOverleafSkills !== false
58
+ loadCodexLocalSkills: skillPreferences.loadCodexLocalSkills,
59
+ loadCodexOverleafSkills: skillPreferences.loadCodexOverleafSkills,
60
+ enabledCodexLocalSkillIds
36
61
  }
37
62
  });
38
63
  } catch (error) {
64
+ if (!sameScope() || !currentSource()) return null;
39
65
  return failFork(error?.code || 'session_fork_failed', error?.message || tr('forkRunFailed'));
40
66
  }
67
+ if (!sameScope() || !currentSource()) {
68
+ if (response?.ok && response.result?.threadId) await clearFork(response.result.threadId);
69
+ return null;
70
+ }
41
71
  if (!response?.ok || !response.result?.threadId) {
42
72
  return failFork(response?.error?.code || 'session_fork_failed', response?.error?.message || tr('forkRunFailed'));
43
73
  }
44
74
  const copiedRuns = session.runs.slice(0, runIndex + 1).map(copyRunSnapshot);
45
75
  const titleBase = String(session.title || copiedRuns[0]?.task || tr('newSessionFallback')).trim();
46
- const forkTitle = buildUniqueForkTitle(previousState.sessions, titleBase);
76
+ const mergeBase = getState();
77
+ const forkTitle = buildUniqueForkTitle(mergeBase.sessions, titleBase);
47
78
  const forked = SessionState.createSession({
48
79
  title: forkTitle,
49
80
  titleSource: 'manual',
@@ -62,27 +93,55 @@
62
93
  forkedFromSessionId: session.id,
63
94
  forkedFromRunId: run.id
64
95
  });
65
- setState(SessionState.normalizePanelState({
66
- ...previousState,
67
- sessions: [...(previousState.sessions || []), forked],
68
- activeSessionId: forked.id
69
- }));
96
+ const activeId = mergeBase.activeSessionId === requestedActiveId
97
+ ? forked.id : mergeBase.activeSessionId;
98
+ const installed = SessionState.setActiveSession({
99
+ ...mergeBase, sessions: [...(mergeBase.sessions || []), forked]
100
+ }, activeId);
101
+ const installedSnapshot = JSON.stringify(installed);
102
+ const forkSnapshot = JSON.stringify(forked);
103
+ setState(installed);
70
104
  try {
105
+ // Keep the visible composer and active-session owner aligned during save.
106
+ applyStateToPanel();
71
107
  await saveState();
72
108
  } catch (error) {
73
- setState(previousState);
74
- await sendBackgroundNative({
75
- method: 'codex.history.clearPlugin',
76
- params: { sessionId: forked.id, threadId: response.result.threadId }
77
- }).catch(() => null);
78
- showPluginToast(error.message || tr('forkRunFailed'), { status: 'failed', sticky: true });
109
+ if (sameScope()) {
110
+ const current = getState();
111
+ const currentFork = current.sessions?.find(item => item.id === forked.id);
112
+ // Never erase work entered into the fork after its optimistic insert.
113
+ if (!currentFork || JSON.stringify(currentFork) === forkSnapshot) {
114
+ if (currentFork) {
115
+ if (current === installed && JSON.stringify(current) === installedSnapshot) {
116
+ setState(mergeBase);
117
+ } else {
118
+ const remaining = current.sessions.filter(item => item.id !== forked.id);
119
+ const fallbackId = remaining.some(item => item.id === mergeBase.activeSessionId)
120
+ ? mergeBase.activeSessionId : remaining[remaining.length - 1]?.id;
121
+ setState(SessionState.setActiveSession({ ...current, sessions: remaining },
122
+ current.activeSessionId === forked.id ? fallbackId : current.activeSessionId));
123
+ }
124
+ try { applyStateToPanel(); } catch (_renderError) { /* Preserve the original failure and finish cleanup. */ }
125
+ }
126
+ await clearFork(response.result.threadId, forked.id);
127
+ }
128
+ if (sameScope()) showPluginToast(error.message || tr('forkRunFailed'), { status: 'failed', sticky: true });
129
+ }
79
130
  throw error;
80
131
  }
81
- applyStateToPanel();
132
+ // Persistence owns its captured scope. A late result cannot render a new
133
+ // view or delete a thread that may already have been saved in the old one.
134
+ if (!sameScope() || !getState().sessions?.some(item => item.id === forked.id)) return null;
82
135
  showPluginToast(tr('forkRunDone'), { status: 'completed' });
83
136
  return forked;
84
137
  }
85
138
 
139
+ async function clearFork(threadId, sessionId) {
140
+ try {
141
+ await sendBackgroundNative({ method: 'codex.history.clearPlugin', params: { sessionId, threadId } });
142
+ } catch (_error) { /* Best-effort cleanup must not restore a stale view. */ }
143
+ }
144
+
86
145
  function failFork(code, message) {
87
146
  showPluginToast(message, { status: 'failed', sticky: true });
88
147
  throw codedError(code, message);
@@ -91,6 +150,10 @@
91
150
  return { forkRunFromNode };
92
151
  }
93
152
 
153
+ function captureLocalSkillIds(value) {
154
+ return Array.isArray(value) ? [...value] : undefined;
155
+ }
156
+
94
157
  function buildUniqueForkTitle(sessions = [], sourceTitle = '') {
95
158
  const fallback = String(sourceTitle || 'New Session').trim() || 'New Session';
96
159
  const baseTitle = fallback
@@ -201,7 +201,7 @@
201
201
  }
202
202
  });
203
203
  if (!response?.ok) {
204
- showPluginToast(tr('deleteSessionHistoryFailedToast', { message: response?.error?.message || 'native host did not return success' }), { status: 'warning', sticky: true });
204
+ showPluginToast(tr('deleteSessionHistoryFailedToast', { message: response?.error?.message || tr('deleteSessionNativeFailureDetail') }), { status: 'warning', sticky: true });
205
205
  } else if (response.result?.skipped) {
206
206
  showPluginToast(tr('deleteSessionNoThreadToast'), { status: 'info' });
207
207
  } else {
@@ -85,7 +85,12 @@
85
85
  record !== rawExistingSessions[index] && !writable.some(item => item.id === record.id)
86
86
  );
87
87
  if (cleanedExisting.length || writable.length) {
88
- await StorageDb.putRecords('sessions', [...cleanedExisting, ...writable]);
88
+ const written = await StorageDb.putRecords('sessions', [...cleanedExisting, ...writable], {
89
+ reviewRunIds: options.reviewRunIds
90
+ });
91
+ // Check the actual durable result, including a decision already saved
92
+ // from another origin, instead of acknowledging only the proposed view.
93
+ return written.filter(record => writable.some(candidate => candidate.id === record.id));
89
94
  }
90
95
  return writable;
91
96
  }
@@ -1,4 +1,10 @@
1
- (function initCodexOverleafSettingsPanel() {
1
+ (function (root, factory) {
2
+ if (typeof module === 'object' && module.exports) {
3
+ module.exports = factory(require('./settingsWorkbench'));
4
+ } else {
5
+ root.CodexOverleafModuleRegistry.define('SettingsPanel', ['SettingsWorkbench'], factory);
6
+ }
7
+ })(typeof globalThis !== 'undefined' ? globalThis : this, function settingsPanelFactory(SettingsWorkbench) {
2
8
  'use strict';
3
9
 
4
10
  function codexIcon(name) {
@@ -45,10 +51,16 @@
45
51
  <div class="codex-project-settings-status" data-project-settings-status></div>
46
52
  <div class="codex-project-settings-scope">
47
53
  <div class="codex-project-settings-scope-title codex-set-eyebrow" data-i18n="settingsScopeProjectTitle">This project</div>
54
+ <details class="codex-set-group" data-set-group="writing-style" open>
55
+ <summary class="codex-set-group-head">
56
+ <span class="codex-set-group-title">${codexSetIcon('pen')}<span data-writing-style-heading>Writing style</span></span>
57
+ </summary>
58
+ <div class="codex-set-card" data-writing-style-settings></div>
59
+ </details>
48
60
  <details class="codex-set-group" data-set-group="personalization" open>
49
61
  <summary class="codex-set-group-head">
50
62
  <span class="codex-set-group-title">${codexSetIcon('pen')}<span data-i18n="personalizationConfig">Personalization</span></span>
51
- <span class="codex-set-saved" data-set-saved hidden>✓ <span data-i18n="settingsSaved">Saved</span></span>
63
+ <span class="codex-set-saved" data-set-saved hidden><svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg><span data-i18n="settingsSaved">Saved</span></span>
52
64
  </summary>
53
65
  <div class="codex-set-card">
54
66
  <p class="codex-set-row-help" data-i18n="personalizationHelp">Style, terminology, and LaTeX conventions Codex should follow in this project.</p>
@@ -58,7 +70,7 @@
58
70
  <details class="codex-set-group" data-set-group="protection" open>
59
71
  <summary class="codex-set-group-head">
60
72
  <span class="codex-set-group-title">${codexSetIcon('shield')}<span data-i18n="fileProtectionTitle">File protection</span></span>
61
- <span class="codex-set-saved" data-set-saved hidden>✓ <span data-i18n="settingsSaved">Saved</span></span>
73
+ <span class="codex-set-saved" data-set-saved hidden><svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg><span data-i18n="settingsSaved">Saved</span></span>
62
74
  </summary>
63
75
  <div class="codex-set-card">
64
76
  <div class="codex-set-row">
@@ -78,7 +90,7 @@
78
90
  <details class="codex-set-group" data-set-group="privacy" open>
79
91
  <summary class="codex-set-group-head">
80
92
  <span class="codex-set-group-title">${codexSetIcon('lock')}<span data-i18n="privacyTitle">Privacy</span></span>
81
- <span class="codex-set-saved" data-set-saved hidden>✓ <span data-i18n="settingsSaved">Saved</span></span>
93
+ <span class="codex-set-saved" data-set-saved hidden><svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg><span data-i18n="settingsSaved">Saved</span></span>
82
94
  </summary>
83
95
  <div class="codex-set-card">
84
96
  <label class="codex-project-settings-row codex-project-settings-row--switch">
@@ -96,7 +108,7 @@
96
108
  <details class="codex-set-group" data-set-group="experimental">
97
109
  <summary class="codex-set-group-head">
98
110
  <span class="codex-set-group-title">${codexSetIcon('database')}<span data-i18n="otSettingsTitle">Project cache</span></span>
99
- <span class="codex-set-saved" data-set-saved hidden>✓ <span data-i18n="settingsSaved">Saved</span></span>
111
+ <span class="codex-set-saved" data-set-saved hidden><svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg><span data-i18n="settingsSaved">Saved</span></span>
100
112
  </summary>
101
113
  <div class="codex-set-card">
102
114
  <label class="codex-project-settings-row codex-project-settings-row--switch">
@@ -113,19 +125,37 @@
113
125
  <div class="codex-project-settings-scope codex-project-settings-scope--global">
114
126
  <details class="codex-set-group" data-set-group="history" data-history-card>
115
127
  <summary class="codex-set-group-head">
116
- <span class="codex-set-group-title">${codexSetIcon('history')}<span data-i18n="historyTitle">Change history</span></span>
128
+ <span class="codex-set-group-title">${codexSetIcon('history')}<span data-i18n="historyTitle">File changes</span><span class="codex-history-count" data-history-count aria-live="polite"></span></span>
117
129
  </summary>
118
130
  <div class="codex-set-card">
119
- <p class="codex-set-row-help" data-i18n="historyHelp">What Codex wrote to this project, per run. Filter by file name or task text.</p>
120
- <input type="text" class="codex-set-select codex-history-filter" data-history-filter>
131
+ <p class="codex-set-row-help" data-i18n="historyHelp">Review recent file changes and open the matching conversation.</p>
132
+ <div class="codex-history-toolbar">
133
+ <label class="codex-history-search">
134
+ <span class="codex-history-search-mark" aria-hidden="true"></span>
135
+ <input type="search" class="codex-set-select codex-history-filter" data-history-filter autocomplete="off">
136
+ </label>
137
+ <select class="codex-set-select codex-history-status-filter" data-history-status data-i18n-aria-label="historyStatusLabel">
138
+ <option value="all" data-i18n="historyStatusAll">All statuses</option>
139
+ <option value="pending" data-i18n="historyStatusPending">Pending review</option>
140
+ <option value="accepted" data-i18n="historyStatusAccepted">Accepted</option>
141
+ <option value="undone" data-i18n="historyStatusUndone">Undone</option>
142
+ <option value="attention" data-i18n="historyStatusAttention">Needs attention</option>
143
+ <option value="written" data-i18n="historyStatusWritten">Written</option>
144
+ </select>
145
+ </div>
121
146
  <div class="codex-history-list" data-history-list></div>
147
+ <button type="button" class="codex-history-jump codex-history-more" data-history-more hidden></button>
148
+ <label class="codex-history-include" hidden>
149
+ <input type="checkbox" data-history-include-empty>
150
+ <span data-history-include-label></span>
151
+ </label>
122
152
  </div>
123
153
  </details>
124
154
  <div class="codex-project-settings-scope-title codex-set-eyebrow" data-i18n="settingsScopeGlobalTitle">All projects</div>
125
155
  <details class="codex-set-group" data-set-group="appearance" open>
126
156
  <summary class="codex-set-group-head">
127
157
  <span class="codex-set-group-title">${codexSetIcon('appearance')}<span data-i18n="appearanceTitle">Appearance</span></span>
128
- <span class="codex-set-saved" data-set-saved hidden>✓ <span data-i18n="settingsSaved">Saved</span></span>
158
+ <span class="codex-set-saved" data-set-saved hidden><svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg><span data-i18n="settingsSaved">Saved</span></span>
129
159
  </summary>
130
160
  <div class="codex-set-card">
131
161
  <label class="codex-project-settings-row codex-project-settings-row--select">
@@ -153,7 +183,7 @@
153
183
  </summary>
154
184
  <div class="codex-set-card codex-provider-settings-entry">
155
185
  <div class="codex-provider-settings-entry-copy">
156
- <p class="codex-set-row-help" data-i18n="providerSettingsHelp">Configure experimental third-party model APIs. Compatibility varies by provider and gateway.</p>
186
+ <p class="codex-set-row-help" data-i18n="providerSettingsHelp">Manage model API connections.</p>
157
187
  <p class="codex-provider-settings-summary" data-provider-settings-summary data-tone="loading">${t(instance, 'providerSettingsLoading')}</p>
158
188
  </div>
159
189
  <button type="button" class="codex-set-btn" data-provider-settings-open data-i18n="providerSettingsConfigure">Configure</button>
@@ -162,7 +192,7 @@
162
192
  <details class="codex-set-group" data-set-group="context-loading" open>
163
193
  <summary class="codex-set-group-head">
164
194
  <span class="codex-set-group-title">${codexSetIcon('database')}<span data-i18n="contextLoadingTitle">Context loading</span></span>
165
- <span class="codex-set-saved" data-set-saved hidden>✓ <span data-i18n="settingsSaved">Saved</span></span>
195
+ <span class="codex-set-saved" data-set-saved hidden><svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg><span data-i18n="settingsSaved">Saved</span></span>
166
196
  </summary>
167
197
  <div class="codex-set-card">
168
198
  <label class="codex-project-settings-row codex-project-settings-row--switch">
@@ -186,18 +216,24 @@
186
216
  </details>
187
217
  <details class="codex-set-group" data-set-group="storage" data-storage-card>
188
218
  <summary class="codex-set-group-head">
189
- <span class="codex-set-group-title">${codexSetIcon('database')}<span data-i18n="storageTitle">History &amp; storage</span></span>
219
+ <span class="codex-set-group-title">${codexSetIcon('database')}<span data-i18n="storageTitle">Local data</span></span>
190
220
  </summary>
191
221
  <div class="codex-set-card">
192
- <p class="codex-set-row-help" data-storage-usage data-i18n="storageUsageLoading">Calculating usage…</p>
193
- <button type="button" class="codex-set-btn codex-set-btn--danger" data-clear-all-history data-i18n="storageClearAll">Clear all history…</button>
194
- <p class="codex-set-row-help" data-i18n="storageClearAllHelp">Removes every stored session, run and audit record for all projects. Project settings and rules are kept.</p>
222
+ <div class="codex-storage-data-row">
223
+ <div class="codex-storage-data-copy">
224
+ <div class="codex-storage-data-label" data-i18n="storageSavedData">Saved conversations &amp; records</div>
225
+ <p class="codex-set-row-help" data-storage-usage data-i18n="storageUsageLoading">Loading saved history…</p>
226
+ </div>
227
+ <button type="button" class="codex-set-btn codex-set-btn--danger" data-clear-all-history data-i18n="storageClearAll">Clear local history…</button>
228
+ </div>
229
+ <p class="codex-set-row-help codex-storage-clear-help" data-i18n="storageClearAllHelp">Clearing removes local history and undo information. Overleaf project files stay unchanged.</p>
230
+ <p class="codex-storage-estimate" data-storage-estimate aria-live="polite"></p>
195
231
  </div>
196
232
  </details>
197
233
  <details class="codex-set-group" data-set-group="skills" open>
198
234
  <summary class="codex-set-group-head">
199
235
  <span class="codex-set-group-title">${codexSetIcon('bolt')}<span data-i18n="localSkillsTitle">Skills</span></span>
200
- <span class="codex-set-saved" data-set-saved hidden>✓ <span data-i18n="settingsSaved">Saved</span></span>
236
+ <span class="codex-set-saved" data-set-saved hidden><svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg><span data-i18n="settingsSaved">Saved</span></span>
201
237
  </summary>
202
238
  <div class="codex-set-card">
203
239
  <label class="codex-project-settings-row codex-project-settings-row--switch">
@@ -206,7 +242,7 @@
206
242
  </label>
207
243
  <p class="codex-set-row-help" data-i18n="loadCodexLocalSkillsHelp">Pull skills from your local Codex installation.</p>
208
244
  <button type="button" class="codex-skills-entry" data-skills-entry>
209
- <span class="codex-skills-entry-label" data-i18n="codexOverleafSkillsEntry">Codex Overleaf skills</span>
245
+ <span class="codex-skills-entry-label" data-i18n="skillsManageEntry">Manage skills</span>
210
246
  <span class="codex-skills-entry-summary" data-skills-entry-summary></span>
211
247
  <span class="codex-skills-entry-chevron" aria-hidden="true">›</span>
212
248
  </button>
@@ -216,11 +252,11 @@
216
252
  </section>
217
253
  <section class="codex-custom-instructions-panel codex-skills-panel" data-skills-screen>
218
254
  <div class="codex-custom-instructions-head">
219
- <button type="button" data-skills-back title="Back" aria-label="Back">‹</button>
255
+ <button type="button" data-skills-back data-i18n-title="settingsBack" data-i18n-aria-label="settingsBack" title="Back" aria-label="Back">‹</button>
220
256
  <div>
221
- <div class="codex-custom-instructions-title" data-i18n="codexOverleafSkillsTitle">Codex Overleaf skills</div>
257
+ <div class="codex-custom-instructions-title" data-i18n="localSkillsTitle">Skills</div>
222
258
  </div>
223
- <span class="codex-set-saved" data-set-saved hidden>✓ <span data-i18n="settingsSaved">Saved</span></span>
259
+ <span class="codex-set-saved" data-set-saved hidden><svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg><span data-i18n="settingsSaved">Saved</span></span>
224
260
  </div>
225
261
  <div class="codex-set-card">
226
262
  <label class="codex-project-settings-row codex-project-settings-row--switch">
@@ -230,6 +266,9 @@
230
266
  </div>
231
267
  <div class="codex-skills-divider"></div>
232
268
  <div class="codex-local-skill-list" data-local-skill-list></div>
269
+ <div class="codex-skills-divider"></div>
270
+ <div class="codex-wb-skills-list-title codex-wb-skills-caption" data-i18n="codexLocalSkillsTitle">Local Codex skills</div>
271
+ <div class="codex-local-skill-list" data-codex-local-skill-list></div>
233
272
  </section>
234
273
  `;
235
274
 
@@ -247,6 +286,8 @@
247
286
  if (event.target.open) instance.callbacks.onStorageOpen?.();
248
287
  });
249
288
  container.querySelector('[data-history-filter]')?.addEventListener('input', () => instance.callbacks.onHistoryFilter?.());
289
+ container.querySelector('[data-history-status]')?.addEventListener('change', () => instance.callbacks.onHistoryFilter?.());
290
+ container.querySelector('[data-history-include-empty]')?.addEventListener('change', () => instance.callbacks.onHistoryFilter?.());
250
291
  // OT mirror: a single visible switch; legacy storage/DOM keys are retained. The click is
251
292
  // intercepted (the runtime's handler preventDefaults, runs the enable
252
293
  // confirmation, then sets checked + drives the change flow itself) so the
@@ -265,8 +306,9 @@
265
306
  Promise.resolve(instance.callbacks.onInputChange?.(event))
266
307
  .then(() => {
267
308
  flashSaved(instance, event);
268
- if (selector === '[data-language-select]' && container.querySelector('[data-storage-card]')?.open) {
269
- instance.callbacks.onStorageOpen?.();
309
+ if (selector === '[data-language-select]') {
310
+ if (container.querySelector('[data-storage-card]')?.open) instance.callbacks.onStorageOpen?.();
311
+ instance.callbacks.onHistoryFilter?.();
270
312
  }
271
313
  }).catch(() => {});
272
314
  });
@@ -280,12 +322,18 @@
280
322
  element?.addEventListener?.('input', () => updateGovernanceNotes(instance));
281
323
  element?.addEventListener?.('change', () => updateGovernanceNotes(instance));
282
324
  }
283
- setupGroupPersistence(instance);
325
+ instance.workbench = SettingsWorkbench.mount(instance, { icon: codexIcon });
284
326
 
285
327
  return {
286
328
  get container() { return instance.container; },
287
329
  show: () => show(instance),
288
330
  hide: () => hide(instance),
331
+ openProviderPage: () => {
332
+ const host = instance.workbench?.revealProviders();
333
+ if (host) show(instance);
334
+ return host || null;
335
+ },
336
+ setProviderCloseGuard: guard => instance.workbench?.setProviderCloseGuard(guard),
289
337
  loadState: state => loadState(instance, state),
290
338
  readState: () => readState(instance),
291
339
  setStatus: (text, status) => setStatus(instance, text, status),
@@ -293,6 +341,7 @@
293
341
  setSkillsSummary: text => setSkillsSummary(instance, text),
294
342
  setProviderSummary: summary => setProviderSummary(instance, summary),
295
343
  refreshNotes: () => updateGovernanceNotes(instance),
344
+ refreshLocale: () => instance.workbench?.refresh(),
296
345
  destroy: () => destroy(instance),
297
346
  _instance: instance
298
347
  };
@@ -310,10 +359,12 @@
310
359
  button.dataset.active = 'true';
311
360
  button.setAttribute('aria-expanded', 'true');
312
361
  }
313
- root.querySelector('[data-custom-instructions-input]')?.focus?.();
362
+ if (instance.workbench) instance.workbench.show();
363
+ else root.querySelector('[data-custom-instructions-input]')?.focus?.();
314
364
  }
315
365
 
316
366
  function refreshSettingsScope(instance, root) {
367
+ if (instance.workbench) { instance.workbench.refresh(); return; }
317
368
  const accountScope = instance.container?.closest?.('[data-settings-scope]')?.dataset?.settingsScope === 'account';
318
369
  const prefix = accountScope ? 'recentProjects_settings' : 'projectSettings';
319
370
  for (const [selector, suffix] of [['[data-settings-title]', 'Title'], ['[data-settings-subtitle]', 'Subtitle']]) {
@@ -337,6 +388,7 @@
337
388
  button.setAttribute('aria-expanded', 'false');
338
389
  }
339
390
  clearStatus(instance);
391
+ instance.workbench?.hide();
340
392
  }
341
393
 
342
394
  function isVisible(target) {
@@ -386,6 +438,7 @@
386
438
  setValue(scope, '[data-theme-select]', state.theme || 'dark');
387
439
  setValue(scope, '[data-language-select]', state.language || 'en');
388
440
  }
441
+ instance.workbench?.refresh();
389
442
  }
390
443
 
391
444
  function readState(target) {
@@ -413,7 +466,7 @@
413
466
 
414
467
  function setStatus(target, text, status = 'info') {
415
468
  const instance = target?._instance || target;
416
- const element = getRoot(instance)?.querySelector('[data-project-settings-status]');
469
+ const element = instance?.container?.querySelector('[data-project-settings-status]');
417
470
  if (!element) {
418
471
  return;
419
472
  }
@@ -423,7 +476,7 @@
423
476
 
424
477
  function clearStatus(target) {
425
478
  const instance = target?._instance || target;
426
- const element = getRoot(instance)?.querySelector('[data-project-settings-status]');
479
+ const element = instance?.container?.querySelector('[data-project-settings-status]');
427
480
  if (!element) {
428
481
  return;
429
482
  }
@@ -440,11 +493,11 @@
440
493
  element.textContent = text || '';
441
494
  }
442
495
 
443
- // Flash the "✓ Saved" indicator after a field auto-saves, then fade it out.
496
+ // Flash the check-mark "Saved" indicator after a field auto-saves, then fade it out.
444
497
  // The fields persist immediately on change, so this is purely a confirmation
445
498
  // cue — it never gates the save itself.
446
499
  function flashSaved(instance, event) {
447
- // Card-level feedback: the ✓ appears on the card that was actually
500
+ // Card-level feedback: the check appears on the card that was actually
448
501
  // changed (falls back to the screen's first badge, e.g. the skills page).
449
502
  const origin = event?.target?.closest?.('details.codex-set-group, section');
450
503
  const badge = origin?.querySelector?.('[data-set-saved]')
@@ -530,31 +583,6 @@
530
583
  element.dataset.tone = typeof value === 'object' && value.tone ? value.tone : 'ok';
531
584
  }
532
585
 
533
- // Collapse memory: card open/closed state persists per browser profile.
534
- const GROUP_STORE_KEY = 'codexOverleafSettingsGroups';
535
-
536
- function setupGroupPersistence(instance) {
537
- let stored = {};
538
- try {
539
- stored = JSON.parse(globalThis.localStorage?.getItem(GROUP_STORE_KEY) || '{}') || {};
540
- } catch (_error) {
541
- stored = {};
542
- }
543
- for (const details of instance.container.querySelectorAll('details[data-set-group]')) {
544
- const key = details.dataset.setGroup;
545
- if (key in stored) {
546
- details.open = stored[key] !== false;
547
- }
548
- details.addEventListener('toggle', () => {
549
- try {
550
- const current = JSON.parse(globalThis.localStorage?.getItem(GROUP_STORE_KEY) || '{}') || {};
551
- current[key] = details.open;
552
- globalThis.localStorage?.setItem(GROUP_STORE_KEY, JSON.stringify(current));
553
- } catch (_error) { /* private mode — collapse state just doesn't persist */ }
554
- });
555
- }
556
- }
557
-
558
586
  function getRoot(instance) {
559
587
  return instance?.container?.querySelector('[data-project-settings-panel]') || null;
560
588
  }
@@ -582,6 +610,7 @@
582
610
  }
583
611
 
584
612
  function destroy(instance) {
613
+ instance.workbench?.destroy();
585
614
  if (instance._savedFlashTimer) {
586
615
  clearTimeout(instance._savedFlashTimer);
587
616
  instance._savedFlashTimer = null;
@@ -589,7 +618,7 @@
589
618
  instance.container.textContent = '';
590
619
  }
591
620
 
592
- window.CodexOverleafSettingsPanel = {
621
+ return {
593
622
  create,
594
623
  loadState,
595
624
  readState,
@@ -601,4 +630,4 @@
601
630
  setSkillsSummary,
602
631
  setProviderSummary
603
632
  };
604
- })();
633
+ });