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
@@ -6,6 +6,7 @@
6
6
  function create(deps = {}) {
7
7
  const {
8
8
  tr,
9
+ tx = en => en,
9
10
  getAccountScopeId,
10
11
  showPluginConfirm,
11
12
  showPluginToast,
@@ -22,79 +23,125 @@
22
23
  return !Number.isFinite(touched) || (Date.now() - touched) <= FRESH_RUNNING_WINDOW_MS;
23
24
  }
24
25
 
25
- async function clearProjectSessions(projectId, projectName) {
26
+ async function clearProjectSessions(projectId, projectName, options = {}) {
26
27
  const StorageDb = deps.StorageDb;
27
28
  const SessionState = deps.SessionState;
28
29
  if (!StorageDb || !SessionState) {
29
30
  return;
30
31
  }
31
- const scope = getAccountScopeId();
32
- const records = (await StorageDb.getAllByIndex('sessions', 'projectId', projectId))
33
- .filter(record => record && (!scope || record.accountScopeId === scope));
34
- if (!records.length) {
35
- await renderRecentProjectsVariant();
36
- return;
37
- }
38
- if (records.some(record => isFreshRunningRecord(StorageDb, record))) {
39
- showPluginToast(tr('recentProjects_clearProject_running'), { status: 'warning', sticky: true });
40
- return;
41
- }
42
- const approved = await showPluginConfirm({
43
- title: tr('recentProjects_clearProject_title', { project: projectName }),
44
- message: tr('recentProjects_clearProject_message', { count: String(records.length), project: projectName }),
45
- confirmLabel: tr('recentProjects_clearProject_confirm'),
46
- cancelLabel: tr('confirmDefaultCancel'),
47
- destructive: true
48
- });
49
- if (!approved) {
50
- return;
51
- }
52
- const Migration = deps.StorageMigration;
53
- if (Migration?.addSessionTombstones) {
54
- await Migration.addSessionTombstones(projectId, records.map(record => record.id));
55
- }
32
+ const scope = options.accountScopeId ?? getAccountScopeId();
33
+ const scopeChanged = error => error?.code === 'history_cleanup_scope_changed'
34
+ || error?.code === 'account_scope_unavailable';
35
+ const assertCurrent = () => {
36
+ if (!scope || getAccountScopeId() !== scope || options.isCurrent?.() === false
37
+ || options.generation !== undefined && deps.getViewGeneration?.() !== options.generation) {
38
+ throw Object.assign(new Error('History cleanup identity changed.'), { code: 'history_cleanup_scope_changed' });
39
+ }
40
+ };
41
+ const readRecords = async () => {
42
+ assertCurrent();
43
+ const records = await StorageDb.getAllByIndex('sessions', 'projectId', projectId);
44
+ assertCurrent();
45
+ return records.filter(record => record && record.accountScopeId === scope);
46
+ };
56
47
  try {
57
- await mutateProjectPanelState(projectId, state => records.reduce(
58
- (nextState, record) => SessionState.deleteSession(nextState, record.id),
59
- state
60
- ));
61
- } catch (_error) { /* IndexedDB deletion remains authoritative for the dashboard. */ }
62
-
63
- let removed = 0;
64
- let historyFailures = 0;
65
- for (const record of records) {
66
- try {
67
- await StorageDb.deleteRecord('sessions', record.id);
68
- removed++;
69
- } catch (_error) { /* The remaining record stays visible and can be retried. */ }
48
+ let records = await readRecords();
49
+ if (!records.length) {
50
+ await renderRecentProjectsVariant();
51
+ return;
52
+ }
53
+ if (records.some(record => isFreshRunningRecord(StorageDb, record))) {
54
+ showPluginToast(tr('recentProjects_clearProject_running'), { status: 'warning', sticky: true });
55
+ return;
56
+ }
57
+ const approved = await showPluginConfirm({
58
+ title: tr('recentProjects_clearProject_title', { project: projectName }),
59
+ message: tr('recentProjects_clearProject_message', { count: String(records.length), project: projectName }),
60
+ confirmLabel: tr('recentProjects_clearProject_confirm'),
61
+ cancelLabel: tr('confirmDefaultCancel'),
62
+ destructive: true
63
+ });
64
+ if (!approved) {
65
+ return;
66
+ }
67
+ // Re-read after the destructive dialog: another tab can have started a
68
+ // run or added a conversation while the original count was displayed.
69
+ const approvedIds = new Set(records.map(record => record.id));
70
+ const latest = await readRecords();
71
+ if (latest.some(record => isFreshRunningRecord(StorageDb, record))) {
72
+ showPluginToast(tr('recentProjects_clearProject_running'), { status: 'warning', sticky: true });
73
+ return;
74
+ }
75
+ records = latest.filter(record => approvedIds.has(record.id));
76
+ if (!records.length) { await renderRecentProjectsVariant(); return; }
77
+ const Migration = deps.StorageMigration;
78
+ if (Migration?.addSessionTombstones) {
79
+ assertCurrent();
80
+ await Migration.addSessionTombstones(projectId, records.map(record => record.id));
81
+ assertCurrent();
82
+ }
70
83
  try {
71
- const response = await sendBackgroundNative({
72
- method: 'codex.history.clearPlugin',
73
- params: { sessionId: record.id, threadId: record.codexThreadId || '' }
74
- });
75
- if (!response || !response.ok) {
84
+ assertCurrent();
85
+ await mutateProjectPanelState(projectId, state => records.reduce(
86
+ (nextState, record) => SessionState.deleteSession(nextState, record.id),
87
+ state
88
+ ), { assertCurrent });
89
+ assertCurrent();
90
+ } catch (error) {
91
+ if (scopeChanged(error)) throw error;
92
+ assertCurrent(); // Other legacy-blob failures do not replace shared deletion.
93
+ }
94
+
95
+ let removed = 0;
96
+ let historyFailures = 0;
97
+ for (const record of records) {
98
+ try {
99
+ assertCurrent();
100
+ await StorageDb.deleteRecord('sessions', record.id, { accountScopeId: scope, projectId });
101
+ assertCurrent();
102
+ removed++;
103
+ } catch (error) {
104
+ if (scopeChanged(error)) throw error;
105
+ assertCurrent(); // The remaining record can be retried in the same scope.
106
+ }
107
+ try {
108
+ assertCurrent();
109
+ const response = await sendBackgroundNative({
110
+ method: 'codex.history.clearPlugin',
111
+ params: { sessionId: record.id, threadId: record.codexThreadId || '' }
112
+ });
113
+ assertCurrent();
114
+ if (!response || !response.ok) {
115
+ historyFailures++;
116
+ }
117
+ } catch (error) {
118
+ if (scopeChanged(error)) throw error;
119
+ assertCurrent();
76
120
  historyFailures++;
77
121
  }
78
- } catch (_error) {
79
- historyFailures++;
80
122
  }
123
+ if (removed < records.length) {
124
+ showPluginToast(tr('recentProjects_clearProject_partial', {
125
+ removed: String(removed),
126
+ count: String(records.length)
127
+ }), { status: 'warning', sticky: true });
128
+ } else if (historyFailures) {
129
+ showPluginToast(tr('recentProjects_clearProject_historyPartial', {
130
+ count: String(historyFailures)
131
+ }), { status: 'warning', sticky: true });
132
+ } else {
133
+ showPluginToast(tr('recentProjects_clearProject_done', {
134
+ count: String(removed),
135
+ project: projectName
136
+ }), { status: 'completed' });
137
+ }
138
+ await renderRecentProjectsVariant();
139
+ } catch (error) {
140
+ if (!scopeChanged(error)) throw error;
141
+ showPluginToast(tx('History view or account changed. Reopen the history list before deleting sessions.',
142
+ '历史视图或账号已变化,请重新打开历史列表后再清理会话。'), { status: 'warning', sticky: true });
143
+ return false;
81
144
  }
82
- if (removed < records.length) {
83
- showPluginToast(tr('recentProjects_clearProject_partial', {
84
- removed: String(removed),
85
- count: String(records.length)
86
- }), { status: 'warning', sticky: true });
87
- } else if (historyFailures) {
88
- showPluginToast(tr('recentProjects_clearProject_historyPartial', {
89
- count: String(historyFailures)
90
- }), { status: 'warning', sticky: true });
91
- } else {
92
- showPluginToast(tr('recentProjects_clearProject_done', {
93
- count: String(removed),
94
- project: projectName
95
- }), { status: 'completed' });
96
- }
97
- await renderRecentProjectsVariant();
98
145
  }
99
146
 
100
147
  return { clearProjectSessions };
@@ -140,9 +140,13 @@
140
140
  if (!settingsPanelInstance) {
141
141
  return;
142
142
  }
143
- const summary = getSkillLoadingSettings().loadCodexOverleafSkills === false
143
+ const settings = getSkillLoadingSettings();
144
+ const localCount = settings.loadCodexLocalSkills === false ? 0
145
+ : (deps.getCodexLocalSkills?.() || []).filter(skill => isCodexLocalSkillEnabled(skill.id, skill)).length;
146
+ const overleafCount = settings.loadCodexOverleafSkills === false ? 0 : countEnabledCodexOverleafSkills();
147
+ const summary = settings.loadCodexLocalSkills === false && settings.loadCodexOverleafSkills === false
144
148
  ? tr('codexOverleafSkillsSummaryOff')
145
- : tr('codexOverleafSkillsSummaryCount', { count: countEnabledCodexOverleafSkills() });
149
+ : tr('codexOverleafSkillsSummaryCount', { count: localCount + overleafCount });
146
150
  SettingsPanel.setSkillsSummary(settingsPanelInstance, summary);
147
151
  }
148
152
 
@@ -296,6 +300,36 @@
296
300
  deps.updateGlobalPreferences?.({ codexOverleafSkillEnabled: { [skillId]: Boolean(enabled) } })?.catch(() => {});
297
301
  }
298
302
 
303
+ function getCodexLocalSkillEnabled() {
304
+ const map = getState()?.codexLocalSkillEnabled;
305
+ return map && typeof map === 'object' && !Array.isArray(map) ? map : {};
306
+ }
307
+
308
+ function isCodexLocalSkillEnabled(skillId, skill) {
309
+ const map = getCodexLocalSkillEnabled();
310
+ return Object.prototype.hasOwnProperty.call(map, skillId) ? map[skillId] !== false : skill?.enabled !== false;
311
+ }
312
+
313
+ function setCodexLocalSkillEnabled(skillId, enabled) {
314
+ if (deps.updateGlobalPreferences) {
315
+ try {
316
+ const pending = deps.updateGlobalPreferences({ codexLocalSkillEnabled: { [skillId]: Boolean(enabled) } });
317
+ Promise.resolve(pending).then(() => saveStateSoon()).catch(() => {
318
+ renderLocalSkillList();
319
+ setProjectSettingsStatus(tx('Could not save the local skill selection. Try again.', '无法保存本地技能选择,请重试。'), 'failed');
320
+ });
321
+ } catch (_error) {
322
+ renderLocalSkillList();
323
+ setProjectSettingsStatus(tx('Could not save the local skill selection. Try again.', '无法保存本地技能选择,请重试。'), 'failed');
324
+ }
325
+ } else {
326
+ setState({ ...getState(), codexLocalSkillEnabled: { ...getCodexLocalSkillEnabled(), [skillId]: Boolean(enabled) } });
327
+ saveStateSoon();
328
+ renderLocalSkillList();
329
+ }
330
+ deps.onSkillsChange?.();
331
+ }
332
+
299
333
  function readSkillLoadingSettingsFromSettings() {
300
334
  return SettingsPanel.readState(getSettingsPanelInstance()).skillToggles;
301
335
  }
@@ -337,6 +371,9 @@
337
371
  closeCustomInstructionsSettings,
338
372
  closeSkillsView,
339
373
  getCodexOverleafSkillEnabled,
374
+ getCodexLocalSkillEnabled,
375
+ isCodexLocalSkillEnabled,
376
+ setCodexLocalSkillEnabled,
340
377
  getCustomInstructionsForCurrentProject,
341
378
  getGovernanceRulesForCurrentProject,
342
379
  getSkillLoadingSettings,
@@ -7,16 +7,23 @@
7
7
  if (!Profiles || !Dialog?.create) {
8
8
  throw new Error('Provider settings require explicit profile and dialog dependencies.');
9
9
  }
10
+ const statusTranslations = new Map();
11
+ const translate = options.tx || (english => english);
10
12
  const instance = {
11
13
  Profiles,
12
- tx: options.tx || ((english) => english),
14
+ tx: (english, chinese) => {
15
+ statusTranslations.set(english, [english, chinese]); statusTranslations.set(chinese, [english, chinese]);
16
+ return translate(english, chinese);
17
+ },
13
18
  sendBackgroundNative: options.sendBackgroundNative,
14
19
  getSettingsPanelInstance: options.getSettingsPanelInstance || (() => null),
15
20
  getSelectedModel: options.getSelectedModel || (() => ''),
16
21
  getSelectedProviderId: options.getSelectedProviderId || (() => 'builtin'),
22
+ getSelectedProviderRevision: options.getSelectedProviderRevision || (() => undefined),
17
23
  hasCurrentProject: options.hasCurrentProject || (() => true),
18
24
  setSelectedProviderId: options.setSelectedProviderId || (() => {}),
19
25
  confirmProviderSwitch: options.confirmProviderSwitch || (() => true),
26
+ assertProviderSwitchAllowed: options.assertProviderSwitchAllowed || (() => {}),
20
27
  clearSelectedModel: options.clearSelectedModel || (() => {}),
21
28
  refreshModelOptions: options.refreshModelOptions || (() => {}),
22
29
  persistInputs: options.persistInputs || (() => {}),
@@ -42,6 +49,7 @@
42
49
  instance.dialog = Dialog.create({
43
50
  document: options.document || document,
44
51
  tx: instance.tx,
52
+ translateStatusText: text => statusTranslations.has(text) ? translate(...statusTranslations.get(text)) : text,
45
53
  ProviderProfiles: Profiles,
46
54
  callbacks: {
47
55
  hasCurrentProject: instance.hasCurrentProject,
@@ -52,7 +60,8 @@
52
60
  onActivate: context => activateProvider(instance, context),
53
61
  onClearSecret: context => clearProviderSecret(instance, context),
54
62
  onDelete: context => deleteProvider(instance, context),
55
- onActivateBuiltin: () => activateBuiltin(instance)
63
+ onActivateBuiltin: () => activateBuiltin(instance),
64
+ onReload: () => open(instance, { refresh: true })
56
65
  }
57
66
  });
58
67
  setupCrossTabRefresh(instance, options.window || window);
@@ -60,6 +69,7 @@
60
69
  open: () => open(instance),
61
70
  refreshSummary: () => refreshSummary(instance),
62
71
  renderSummary: () => updateSettingsSummary(instance),
72
+ refreshLocale: () => instance.dialog.refreshLocale?.(),
63
73
  ensureLoaded: () => ensureLoaded(instance),
64
74
  getRunSelection: providerId => instance.loaded
65
75
  ? Profiles.buildRunSelection(instance.catalog, providerId || instance.getSelectedProviderId())
@@ -73,15 +83,25 @@
73
83
  };
74
84
  }
75
85
 
76
- async function open(instance) {
77
- instance.dialog.open(instance.catalog);
86
+ async function open(instance, options = {}) {
87
+ const settings = instance.getSettingsPanelInstance();
88
+ const host = settings?.openProviderPage?.() || null;
89
+ const preserveDraft = Boolean(host && instance.dialog.isOpen());
90
+ if (host) settings.setProviderCloseGuard?.(async () => {
91
+ if (!instance.dialog.isOpen()) return true;
92
+ // A native confirmation must be opened from a visible provider section,
93
+ // even when the user has since navigated to another settings category.
94
+ if (instance.dialog.hasUnsavedChanges()) settings.openProviderPage();
95
+ return instance.dialog.close();
96
+ });
97
+ instance.dialog.open(instance.catalog, { container: host, preserveDraft });
98
+ if (preserveDraft && !options.refresh) return;
78
99
  instance.dialog.setBusy('loading', instance.tx('Loading providers…', '正在加载模型服务…'));
79
100
  try {
80
- await refresh(instance, { updateDialog: true });
101
+ await refresh(instance, { updateDialog: true, source: preserveDraft ? 'cross-tab' : 'open' });
81
102
  instance.dialog.setBusy('', '');
82
103
  } catch (_error) {
83
- // refresh() already projected the actionable failure into the dialog.
84
- // Keep the modal open so the user can close it or retry from Settings.
104
+ // Keep the embedded editor available, with its original error projection.
85
105
  }
86
106
  }
87
107
 
@@ -184,15 +204,20 @@
184
204
  }
185
205
  }
186
206
  const changedProviderIds = Array.isArray(change.changedProviderIds) ? change.changedProviderIds : [];
187
- const providerConfigurationChanged = changedProviderIds.includes(requestedProviderId);
207
+ const selectedRevision = instance.getSelectedProviderRevision();
208
+ const providerConfigurationChanged = changedProviderIds.includes(requestedProviderId)
209
+ || (requestedProviderId === previousProviderId && selectedRevision !== undefined
210
+ && Number(selectedRevision) !== Number(instance.Profiles.getProviderById(catalog, requestedProviderId)?.revision || 0));
188
211
  if (!change.forceSessionRefresh && !projectProviderChanged && !providerConfigurationChanged) {
189
212
  return;
190
213
  }
214
+ if (projectProviderChanged || providerConfigurationChanged) instance.assertProviderSwitchAllowed();
191
215
  const loadResult = change.modelsPreloaded === true
192
216
  ? { stale: false, selectedModel: change.preloadedModelId || '' }
193
217
  : await instance.refreshModelOptions(
194
218
  instance.Profiles.buildRunSelection(catalog, requestedProviderId),
195
- { persist: false }
219
+ { persist: false, ...(projectProviderChanged || providerConfigurationChanged
220
+ ? { assertCurrent: instance.assertProviderSwitchAllowed } : {}) }
196
221
  );
197
222
  if (loadResult?.stale || loadResult?.error) {
198
223
  const error = createClientError(
@@ -212,6 +237,7 @@
212
237
 
213
238
  async function prepareProviderActivation(instance, providerId) {
214
239
  requireCurrentProject(instance);
240
+ instance.assertProviderSwitchAllowed();
215
241
  const previousProviderId = instance.getSelectedProviderId() || 'builtin';
216
242
  const provider = instance.Profiles.getProviderById(instance.catalog, providerId);
217
243
  if (providerId !== previousProviderId) {
@@ -223,9 +249,10 @@
223
249
  return { cancelled: true, previousProviderId };
224
250
  }
225
251
  }
252
+ instance.assertProviderSwitchAllowed();
226
253
  const result = await instance.refreshModelOptions(
227
254
  instance.Profiles.buildRunSelection(instance.catalog, providerId),
228
- { persist: false }
255
+ { persist: false, assertCurrent: instance.assertProviderSwitchAllowed }
229
256
  );
230
257
  if (result?.stale || result?.error) {
231
258
  if (providerId !== previousProviderId) {
@@ -241,6 +268,7 @@
241
268
  error.details = result?.error || {};
242
269
  throw error;
243
270
  }
271
+ instance.assertProviderSwitchAllowed();
244
272
  return {
245
273
  cancelled: false,
246
274
  previousProviderId,
@@ -305,7 +333,10 @@
305
333
  async function saveProvider(instance, context, action = {}) {
306
334
  instance.dialog.setBusy('saving', instance.tx('Saving provider…', '正在保存模型服务…'));
307
335
  try {
308
- if (action.activate === true) requireCurrentProject(instance);
336
+ if (action.activate === true) {
337
+ requireCurrentProject(instance);
338
+ instance.assertProviderSwitchAllowed();
339
+ }
309
340
  const result = await request(instance, 'codex.providers.upsert', {
310
341
  profileId: context.profileId,
311
342
  expectedRevision: context.expectedRevision,
@@ -336,8 +367,8 @@
336
367
  tone: fellBackToBuiltin ? 'warning' : 'success',
337
368
  title: fellBackToBuiltin
338
369
  ? instance.tx(
339
- 'Provider saved. Its endpoint changed, so Built-in Codex is active until the new endpoint is approved.',
340
- '模型服务已保存。由于端点发生变化,确认新端点前将使用内置 Codex。'
370
+ 'Provider saved. Its endpoint changed, so the Native Host default is Built-in Codex. The project provider is unchanged; approve the new endpoint before using it.',
371
+ '模型服务已保存。端点变更使 Native Host 默认项回退到内置 Codex,当前项目的服务选择保持不变;使用新端点前仍需确认披露。'
341
372
  )
342
373
  : action.activate
343
374
  ? instance.tx('Provider saved and activated.', '模型服务已保存并启用。')
@@ -365,7 +396,7 @@
365
396
  instance.dialog.setStatus({
366
397
  tone: 'success',
367
398
  title: result.activeProviderId === 'builtin'
368
- ? instance.tx('API key removed. Built-in Codex is now active.', 'API 密钥已删除,当前已切换到内置 Codex。')
399
+ ? instance.tx('API key removed. The Native Host default is Built-in Codex; the project provider is unchanged.', 'API 密钥已删除。Native Host 默认项为内置 Codex,当前项目的服务选择保持不变。')
369
400
  : instance.tx('Stored API key removed.', '已删除存储的 API 密钥。')
370
401
  });
371
402
  } catch (error) {
@@ -376,6 +407,7 @@
376
407
  async function deleteProvider(instance, context) {
377
408
  instance.dialog.setBusy('deleting', instance.tx('Deleting provider…', '正在删除模型服务…'));
378
409
  try {
410
+ if (context.profileId === instance.getSelectedProviderId()) instance.assertProviderSwitchAllowed();
379
411
  const result = await request(instance, 'codex.providers.delete', {
380
412
  providerId: context.profileId,
381
413
  expectedRevision: context.expectedRevision
@@ -654,6 +686,23 @@
654
686
  provider_revision_conflict: instance.tx('This provider changed in another tab. Reload it and retry.', '此模型服务已在其他标签页发生变化,请刷新后重试。'),
655
687
  provider_protocol_negotiation_required: instance.tx('The Auto protocol could not be negotiated for this model.', '无法为此模型自动协商 API 协议。')
656
688
  };
689
+ Object.assign(messages, {
690
+ provider_store_busy: instance.tx('Provider settings are being updated by another Native Host. Retry shortly.', '其他 Native Host 正在更新模型服务设置,请稍后重试。'),
691
+ provider_store_too_large: instance.tx('Provider settings exceed the storage limit. Reduce the configuration and retry.', '模型服务设置超过存储上限,请精简配置后重试。'),
692
+ provider_store_unavailable: instance.tx('Provider settings could not be read or saved. Check the local service and retry.', '无法读取或保存模型服务设置,请检查本机服务后重试。'),
693
+ provider_store_corrupt: instance.tx('Stored provider settings are inconsistent or invalid. Repair the local configuration before retrying.', '已存储的模型服务设置不一致或无效,请修复本机配置后重试。'),
694
+ provider_not_found: instance.tx('The selected provider no longer exists. Refresh the provider list.', '所选模型服务已不存在,请刷新服务列表。'),
695
+ provider_dns_failed: instance.tx('The provider hostname could not be resolved. Check the endpoint and network.', '无法解析模型服务域名,请检查端点和网络。'),
696
+ provider_tls_failed: instance.tx('A secure connection to the provider could not be established. Check the endpoint certificate.', '无法与模型服务建立安全连接,请检查端点证书。'),
697
+ provider_rate_limited: instance.tx('The provider is rate limiting requests. Retry later.', '模型服务已限制请求频率,请稍后重试。'),
698
+ provider_model_not_configured: instance.tx('The selected model is not configured for this provider.', '当前模型服务未配置所选模型。'),
699
+ provider_selection_unavailable: instance.tx('The selected provider or model is unavailable. Review the project selection.', '所选模型服务或模型不可用,请检查当前项目的选择。'),
700
+ provider_disclosure_required: instance.tx('Confirm the provider endpoint before activation.', '启用前请确认模型服务端点。'),
701
+ provider_secret_invalid: instance.tx('The API key change could not be accepted. Review the key settings.', '无法接受此次 API 密钥变更,请检查密钥设置。'),
702
+ provider_model_catalog_unavailable: instance.tx('The provider model catalog could not be loaded. Retry shortly.', '无法加载模型服务的模型目录,请稍后重试。'),
703
+ native_unavailable: instance.tx('The local service is unavailable. Check the Native Host connection.', '本机服务不可用,请检查 Native Host 连接。'),
704
+ provider_request_failed: instance.tx('The provider operation failed. Review the settings and retry.', '模型服务操作失败,请检查设置后重试。')
705
+ });
657
706
  return messages[code] || error?.message || instance.tx('Provider operation failed.', '模型服务操作失败。');
658
707
  }
659
708