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
@@ -2,21 +2,24 @@
2
2
  "schemaVersion": 1,
3
3
  "entry": "extension/entries/content-entry.mjs",
4
4
  "output": "extension/src/content/generated/content.bundle.js",
5
- "sourceDigest": "b19a018ab6eb9c7bdca8cfad8ff6efcc4a30e80f81c3c0a2e89a7f78b6361d97",
6
- "outputDigest": "7640649ee012b3224d696703c2a1ab323d549418a3fcc31e2219bf14399416b5",
7
- "byteLength": 2422231,
5
+ "sourceDigest": "548acfc19dd7be907e0c5494f2da2e11fa68dfc501e0552846ad63d4e5a35dba",
6
+ "outputDigest": "404e0523fc534b56e87ea96e62cd112514c06ce034209ec7a05feef83d7a64a9",
7
+ "byteLength": 3162346,
8
8
  "inputs": [
9
9
  "extension/entries/content-entry.mjs",
10
10
  "extension/src/content/activeTurnControl.js",
11
11
  "extension/src/content/applyResultFormatters.js",
12
12
  "extension/src/content/assetTransferBroker.js",
13
+ "extension/src/content/changeHistoryView.js",
13
14
  "extension/src/content/composerAttachments.js",
14
15
  "extension/src/content/composerPanel.js",
15
16
  "extension/src/content/contentRuntime.js",
16
17
  "extension/src/content/contextTray.js",
17
18
  "extension/src/content/diagnosticsController.js",
19
+ "extension/src/content/diagnosticsExport.js",
18
20
  "extension/src/content/diagnosticsPanel.js",
19
21
  "extension/src/content/diffReviewPanel.js",
22
+ "extension/src/content/directoryCleanupRecovery.js",
20
23
  "extension/src/content/globalPreferencesController.js",
21
24
  "extension/src/content/legacyGlobalRegistry.js",
22
25
  "extension/src/content/localSkillsPanel.js",
@@ -43,34 +46,50 @@
43
46
  "extension/src/content/providerSettingsDialog.js",
44
47
  "extension/src/content/recentProjects.js",
45
48
  "extension/src/content/reviewHunks.js",
49
+ "extension/src/content/runActivitySummary.js",
50
+ "extension/src/content/runCompletionMeta.js",
46
51
  "extension/src/content/runController.js",
47
52
  "extension/src/content/runFailureNotice.js",
48
53
  "extension/src/content/runGuidanceController.js",
49
54
  "extension/src/content/runGuidanceView.js",
55
+ "extension/src/content/runPresence.js",
50
56
  "extension/src/content/runQueueScheduler.js",
57
+ "extension/src/content/runRecoveryActions.js",
51
58
  "extension/src/content/runResultActions.js",
59
+ "extension/src/content/runReviewController.js",
52
60
  "extension/src/content/runScrollLayout.js",
53
61
  "extension/src/content/runSettlementPersistence.js",
54
62
  "extension/src/content/runTimelineView.js",
55
63
  "extension/src/content/scopedPersistenceCoordinator.js",
56
64
  "extension/src/content/scopedPersistenceDetachedCommit.js",
57
65
  "extension/src/content/scopedPersistencePanelState.js",
66
+ "extension/src/content/selectionContextView.js",
67
+ "extension/src/content/sensitivePreflight.js",
58
68
  "extension/src/content/sessionForkController.js",
59
69
  "extension/src/content/sessionManager.js",
60
70
  "extension/src/content/sessionMenuView.js",
61
71
  "extension/src/content/sessionPanel.js",
62
72
  "extension/src/content/sessionPersistence.js",
63
73
  "extension/src/content/settingsPanel.js",
74
+ "extension/src/content/settingsWorkbench.js",
75
+ "extension/src/content/sharedSessionViewSync.js",
76
+ "extension/src/content/subagentActivityView.js",
64
77
  "extension/src/content/themeController.js",
65
78
  "extension/src/content/trackedChangeCaptureController.js",
66
79
  "extension/src/content/updateIdle.js",
67
80
  "extension/src/content/updateNotice.js",
68
81
  "extension/src/content/writebackController.js",
69
82
  "extension/src/content/writebackOrchestrator.js",
83
+ "extension/src/content/writebackPlan.js",
84
+ "extension/src/content/writingStyleSettings.js",
85
+ "extension/src/content/writtenChangesView.js",
70
86
  "extension/src/shared/agentTranscript.js",
71
87
  "extension/src/shared/auditRecords.js",
88
+ "extension/src/shared/changeHistoryModel.js",
72
89
  "extension/src/shared/compatibility.js",
73
90
  "extension/src/shared/compileAdapter.js",
91
+ "extension/src/shared/composerAttachmentDraft.js",
92
+ "extension/src/shared/directoryCleanupProof.js",
74
93
  "extension/src/shared/failureReasons.js",
75
94
  "extension/src/shared/globalPreferences.js",
76
95
  "extension/src/shared/governanceRules.js",
@@ -84,6 +103,7 @@
84
103
  "extension/src/shared/projectFiles.js",
85
104
  "extension/src/shared/providerProfiles.js",
86
105
  "extension/src/shared/reviewing.js",
106
+ "extension/src/shared/runActivityModel.js",
87
107
  "extension/src/shared/runExecutionSnapshot.js",
88
108
  "extension/src/shared/runExecutionSnapshotCodec.js",
89
109
  "extension/src/shared/runInputQueue.js",
@@ -91,21 +111,28 @@
91
111
  "extension/src/shared/scopedPersistenceQueuePolicy.js",
92
112
  "extension/src/shared/scopedPersistenceReceipt.js",
93
113
  "extension/src/shared/scopedPersistenceTransaction.js",
114
+ "extension/src/shared/selectionContext.js",
94
115
  "extension/src/shared/sensitiveScan.js",
95
116
  "extension/src/shared/sessionState.js",
96
117
  "extension/src/shared/sessionTitle.js",
97
118
  "extension/src/shared/settlementFacts.js",
119
+ "extension/src/shared/sharedSessionBridge.js",
120
+ "extension/src/shared/sharedSessionTransfer.js",
98
121
  "extension/src/shared/staleGuard.js",
99
122
  "extension/src/shared/storageDb.js",
100
123
  "extension/src/shared/storageKeys.js",
101
124
  "extension/src/shared/storageMigration.js",
102
125
  "extension/src/shared/storageRunActions.js",
103
126
  "extension/src/shared/storageSessionClaims.js",
127
+ "extension/src/shared/storageValuePruning.js",
128
+ "extension/src/shared/subagentActivityModel.js",
104
129
  "extension/src/shared/summary.js",
105
130
  "extension/src/shared/undoOperations.js",
106
131
  "extension/src/shared/writebackEvidenceProjection.js",
132
+ "extension/src/shared/writebackIntent.js",
107
133
  "extension/src/shared/writebackOperationEvidence.js",
108
134
  "extension/src/shared/writebackSettlement.js",
135
+ "extension/src/shared/writingStyle.js",
109
136
  "extension/vendor/katex/katex.min.js",
110
137
  "extension/vendor/markdown-it/markdown-it.min.js"
111
138
  ]
@@ -40,7 +40,7 @@
40
40
  if (force || changed.includes('theme')) options.applyTheme?.(values.theme);
41
41
  if (changed.includes('locale')) options.applyLocale?.();
42
42
  if (force || changed.includes('preloadProjectContext')) options.onPreloadChange?.(values.preloadProjectContext);
43
- if (changed.some(key => key === 'codexOverleafSkillEnabled' || key.startsWith('loadCodex'))) options.onSkillsChange?.();
43
+ if (changed.some(key => key === 'codexOverleafSkillEnabled' || key === 'codexLocalSkillEnabled' || key.startsWith('loadCodex'))) options.onSkillsChange?.();
44
44
  }
45
45
 
46
46
  function accept(value) {
@@ -17,12 +17,20 @@
17
17
  'ApplyResultFormatters',
18
18
  'AssetTransferBroker',
19
19
  'AuditRecords',
20
+ 'SelectionContext',
21
+ 'SelectionContextView',
22
+ 'WritebackIntent',
23
+ 'DirectoryCleanupProof',
24
+ 'ChangeHistoryModel',
25
+ 'ChangeHistoryView',
20
26
  'Compatibility',
21
27
  'ComposerAttachments',
28
+ 'ComposerAttachmentDraft',
22
29
  'ComposerPanel',
23
30
  'ContentRuntime',
24
31
  'ContextTray',
25
32
  'DiagnosticsController',
33
+ 'DiagnosticsExport',
26
34
  'DiagnosticsPanel',
27
35
  'DiffReviewPanel',
28
36
  'FailureReasons',
@@ -51,7 +59,11 @@
51
59
  'ProviderSettingsCoordinator',
52
60
  'RecentProjects',
53
61
  'ReviewHunks',
62
+ 'RunActivitySummary',
63
+ 'RunPresence',
64
+ 'RunActivityModel',
54
65
  'RunController',
66
+ 'RunReviewController',
55
67
  'RunExecutionSnapshot',
56
68
  'RunGuidanceController',
57
69
  'RunInputQueue',
@@ -64,15 +76,20 @@
64
76
  'ScopedPersistenceCoordinator',
65
77
  'ScopedPersistenceTransaction',
66
78
  'SensitiveScan',
79
+ 'SensitivePreflight',
67
80
  'SessionManager',
68
81
  'SessionForkController',
69
82
  'SessionPanel',
70
83
  'SessionPersistence',
71
84
  'SessionState',
72
85
  'SettingsPanel',
86
+ 'SharedSessionBridge',
87
+ 'SharedSessionViewSync',
73
88
  'StorageDb',
74
89
  'StorageKeys',
75
90
  'StorageMigration',
91
+ 'SubagentActivityModel',
92
+ 'SubagentActivityView',
76
93
  'Summary',
77
94
  'Theme',
78
95
  'TrackedChangeCaptureController',
@@ -80,8 +97,14 @@
80
97
  'UpdateIdle',
81
98
  'UpdateNotice',
82
99
  'WritebackController',
100
+ 'DirectoryCleanupRecovery',
101
+ 'WritebackIntent',
83
102
  'WritebackOrchestrator',
84
- 'WritebackSettlement'
103
+ 'WritebackPlan',
104
+ 'WritebackSettlement',
105
+ 'WritingStyle',
106
+ 'WritingStyleSettings',
107
+ 'WrittenChangesView'
85
108
  ]);
86
109
 
87
110
  const SUPPORT_MODULES = Object.freeze([
@@ -93,6 +116,7 @@
93
116
  'ProviderProfiles',
94
117
  'ProviderSettingsDialog',
95
118
  'RunGuidanceView',
119
+ 'RunRecoveryActions',
96
120
  'SessionMenuView'
97
121
  ]);
98
122
 
@@ -17,11 +17,17 @@
17
17
  document: documentDep = null,
18
18
  getPanel = () => null,
19
19
  getState = () => null,
20
+ getScope = () => '',
20
21
  setState = () => {},
21
22
  saveState = null,
22
23
  sendBackgroundNative = () => Promise.resolve({ ok: false }),
23
24
  getSkillLoadingSettings = () => ({ loadCodexOverleafSkills: true }),
24
25
  isCodexOverleafSkillEnabled = () => true,
26
+ isCodexLocalSkillEnabled = (id, skill) => skill?.enabled !== false,
27
+ setCodexLocalSkillEnabled = () => {},
28
+ getCodexLocalSkills = () => [],
29
+ getCodexLocalSkillWarnings = () => [],
30
+ refreshCodexLocalSkills = async () => [],
25
31
  setCodexOverleafSkillEnabled = () => {},
26
32
  setProjectSettingsStatus = () => {},
27
33
  tr = (key) => key,
@@ -36,27 +42,51 @@
36
42
  || root.document
37
43
  || (typeof globalThis !== 'undefined' ? globalThis.document : null);
38
44
 
45
+ let localSkillsListError = false;
46
+ let refreshGeneration = 0;
39
47
  async function refreshLocalSkills() {
48
+ const generation = ++refreshGeneration;
49
+ const scope = getScope();
50
+ const isCurrent = () => generation === refreshGeneration && scope === getScope();
51
+ localSkillsListError = false;
40
52
  showSkillListLoading();
53
+ const localList = getPanel()?.querySelector('[data-codex-local-skill-list]');
54
+ if (localList) {
55
+ localList.textContent = '';
56
+ appendLocalSkillEmpty(localList, 'codexOverleafSkillsLoading');
57
+ }
58
+ const localRefresh = localList ? refreshCodexLocalSkills({ force: true }) : Promise.resolve([]);
59
+ const localOutcome = localRefresh.then(() => {
60
+ if (isCurrent()) renderCodexLocalSkillList();
61
+ return null;
62
+ }, error => {
63
+ if (isCurrent()) { localSkillsListError = true; renderCodexLocalSkillList(); }
64
+ return error;
65
+ });
41
66
  try {
42
67
  const codexOverleafResponse = await sendBackgroundNative({
43
68
  method: 'skills.list',
44
69
  params: { scope: 'codex-overleaf' }
45
70
  });
46
71
  if (!codexOverleafResponse?.ok) {
47
- throw new Error(codexOverleafResponse?.error?.message || 'native host did not return Codex Overleaf skills');
72
+ throw new Error(tx('Could not load Codex Overleaf skills. Try again.', '无法加载 Codex Overleaf 技能,请重试。'));
48
73
  }
49
74
  const codexOverleafSkills = Array.isArray(codexOverleafResponse.result?.skills)
50
75
  ? codexOverleafResponse.result.skills
51
76
  : [];
77
+ if (!isCurrent()) return;
52
78
  const state = getState() || {};
53
79
  setState({
54
80
  ...state,
55
81
  codexOverleafSkills
56
82
  });
57
83
  setSlashCodexOverleafSkills(codexOverleafSkills);
84
+ const localError = await localOutcome;
85
+ if (!isCurrent()) return;
58
86
  renderLocalSkillList();
87
+ if (localError) throw localError;
59
88
  } catch (err) {
89
+ if (!isCurrent()) return;
60
90
  renderLocalSkillList();
61
91
  throw err;
62
92
  }
@@ -71,6 +101,7 @@
71
101
  const placeholder = document.createElement('div');
72
102
  placeholder.className = 'codex-project-settings-empty';
73
103
  placeholder.textContent = tr('codexOverleafSkillsLoading');
104
+ placeholder.dataset.i18n = 'codexOverleafSkillsLoading';
74
105
  list.append(placeholder);
75
106
  }
76
107
 
@@ -84,6 +115,7 @@
84
115
  }
85
116
 
86
117
  function renderLocalSkillList() {
118
+ renderCodexLocalSkillList();
87
119
  const list = getPanel()?.querySelector('[data-local-skill-list]');
88
120
  if (!list) {
89
121
  return;
@@ -93,10 +125,10 @@
93
125
  const codexOverleafEnabled = getSkillLoadingSettings().loadCodexOverleafSkills !== false;
94
126
  list.textContent = '';
95
127
  if (!codexOverleafEnabled) {
96
- appendLocalSkillEmpty(list, tr('codexOverleafSkillsDisabled'));
128
+ appendLocalSkillEmpty(list, 'codexOverleafSkillsDisabled');
97
129
  }
98
130
  if (!codexOverleafSkills.length) {
99
- appendLocalSkillEmpty(list, tr('codexOverleafSkillsEmpty'));
131
+ appendLocalSkillEmpty(list, 'codexOverleafSkillsEmpty');
100
132
  return;
101
133
  }
102
134
  for (const skill of codexOverleafSkills) {
@@ -104,14 +136,55 @@
104
136
  }
105
137
  }
106
138
 
139
+ function renderCodexLocalSkillList() {
140
+ const list = getPanel()?.querySelector('[data-codex-local-skill-list]');
141
+ if (!list) return;
142
+ list.textContent = '';
143
+ const enabled = getSkillLoadingSettings().loadCodexLocalSkills !== false;
144
+ if (!enabled) appendLocalSkillEmpty(list, 'codexLocalSkillsDisabled');
145
+ const skills = getCodexLocalSkills();
146
+ if (localSkillsListError) { appendLocalSkillEmpty(list, 'codexLocalSkillsLoadFailed'); return; }
147
+ if (!Array.isArray(skills)) { appendLocalSkillEmpty(list, 'codexOverleafSkillsLoading'); return; }
148
+ if (!skills.length) appendLocalSkillEmpty(list, 'codexLocalSkillsEmpty');
149
+ const skippedCount = getCodexLocalSkillWarnings().reduce((sum, warning) => sum + (warning?.code === 'codex_local_skills_skipped' ? warning.count : 0), 0);
150
+ if (skippedCount > 0) {
151
+ const warning = document.createElement('div');
152
+ warning.className = 'codex-project-settings-empty';
153
+ warning._refreshLocale = () => { warning.textContent = tr('codexLocalSkillsSkipped', { count: skippedCount }); };
154
+ warning._refreshLocale();
155
+ list.append(warning);
156
+ }
157
+ for (const skill of skills) {
158
+ const title = String(skill.title || skill.name || skill.id).trim();
159
+ const duplicateTitle = skills.filter(other => String(other.title || other.name || other.id).trim() === title).length > 1;
160
+ renderCodexOverleafSkillRow(list, { ...skill, title, duplicateTitle, scope: 'codex-local', removable: false }, enabled);
161
+ }
162
+ }
163
+
164
+ function createSkillMark(id) {
165
+ const mark = document.createElement('span');
166
+ mark.className = 'codex-local-skill-icon';
167
+ mark.setAttribute('aria-hidden', 'true');
168
+ // Static, locally owned glyphs only; skill metadata never supplies SVG.
169
+ const glyph = id === 'annotated-rewrite'
170
+ ? '<path d="M3.2 12.8 4 9.7l6.6-6.6a1.4 1.4 0 0 1 2 2L6 11.7z"/><path d="m9.6 4.1 2.3 2.3"/>'
171
+ : id === 'parallel-subagents'
172
+ ? '<circle cx="4" cy="3.5" r="1.75"/><circle cx="12" cy="3.5" r="1.75"/><circle cx="8" cy="12.5" r="1.75"/><path d="M4 5.25v1.5A1.75 1.75 0 0 0 5.75 8.5h4.5A1.75 1.75 0 0 0 12 6.75v-1.5M8 8.5v2.25"/>'
173
+ : '<rect x="3" y="2.5" width="10" height="11" rx="2"/><path d="M6 6h4M6 9h4"/>';
174
+ mark.innerHTML = '<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" focusable="false">' + glyph + '</svg>';
175
+ return mark;
176
+ }
177
+
107
178
  function renderCodexOverleafSkillRow(list, skill, masterEnabled) {
108
179
  const id = String(skill?.id || '').trim();
109
180
  if (!id) {
110
181
  return;
111
182
  }
183
+ const local = skill.scope === 'codex-local';
184
+ const compact = Boolean(list.closest?.('.codex-settings-workbench'));
112
185
  const row = document.createElement('div');
113
186
  row.className = 'codex-local-skill-row';
114
- row.dataset.scope = 'codex-overleaf';
187
+ row.dataset.scope = local ? 'codex-local' : 'codex-overleaf';
115
188
  if (!masterEnabled) {
116
189
  row.dataset.disabled = 'true';
117
190
  }
@@ -125,21 +198,61 @@
125
198
  const trimmedTitle = typeof skill.title === 'string' ? skill.title.trim() : '';
126
199
  text.textContent = trimmedTitle || id;
127
200
  text.title = id;
128
- row.append(text);
201
+ text.className = 'codex-local-skill-name';
202
+ const copy = document.createElement('div');
203
+ copy.className = 'codex-local-skill-copy';
204
+ copy.append(text);
205
+ const descriptions = {
206
+ 'annotated-rewrite': tx('Guided editing for document revisions.', '用于文稿修订的编辑流程。'),
207
+ 'parallel-subagents': tx('Split independent subtasks across multiple agents.', '将相互独立的子任务分配给多个 agent。')
208
+ };
209
+ const description = (!local && descriptions[id])
210
+ || (typeof skill.description === 'string' ? skill.description.replace(/\s+/g, ' ').trim() : '');
211
+ if (description) {
212
+ const help = document.createElement('span');
213
+ help.className = 'codex-local-skill-description';
214
+ help.textContent = description;
215
+ help.title = description;
216
+ copy.append(help);
217
+ }
218
+ const sourceText = () => (skill.sourceKind === 'system' ? tx('Codex built-in', 'Codex 内置')
219
+ : skill.sourceKind === 'plugin' && skill.sourceLabel ? String(skill.sourceLabel) : tx('Local Codex', 'Codex 本地'))
220
+ + (skill.duplicateTitle ? ' · ' + (skill.sourceHint || id.slice(-8)) : '');
221
+ let sourceLabel = null;
222
+ if (local) {
223
+ sourceLabel = document.createElement('span');
224
+ sourceLabel.className = 'codex-local-skill-description';
225
+ sourceLabel.textContent = sourceText();
226
+ copy.append(sourceLabel);
227
+ }
228
+ if (compact) row.append(createSkillMark(local ? '' : id));
229
+ row.append(copy);
230
+ const controls = compact ? document.createElement('div') : row;
231
+ if (compact) controls.className = 'codex-local-skill-controls';
129
232
 
130
- // Per-skill enable switch — appended last so it sits on the right of the
131
- // row, after the Remove control. It remains a real checkbox input.
233
+ // Keep the same native input and callbacks; only its visual grouping changes.
132
234
  const toggle = document.createElement('input');
133
235
  toggle.type = 'checkbox';
134
236
  toggle.className = 'codex-switch';
135
- toggle.checked = isCodexOverleafSkillEnabled(id);
136
- toggle.setAttribute('aria-label', tr('codexOverleafSkillEnableToggle'));
237
+ toggle.checked = local ? isCodexLocalSkillEnabled(id, skill) : isCodexOverleafSkillEnabled(id);
238
+ const accessibleSkillName = (trimmedTitle || id)
239
+ + (local && skill.duplicateTitle ? ': ' + (skill.sourceHint || id.slice(-8)) : '');
240
+ toggle.setAttribute('aria-label', accessibleSkillName + ': ' + tr('codexOverleafSkillEnableToggle'));
137
241
  if (!masterEnabled) {
138
242
  toggle.disabled = true;
139
243
  }
140
244
  toggle.addEventListener('change', event => {
141
- setCodexOverleafSkillEnabled(id, event.target.checked);
245
+ if (local) setCodexLocalSkillEnabled(id, event.target.checked);
246
+ else setCodexOverleafSkillEnabled(id, event.target.checked);
142
247
  });
248
+ row._refreshLocale = () => {
249
+ if (sourceLabel) sourceLabel.textContent = sourceText();
250
+ toggle.setAttribute('aria-label', accessibleSkillName + ': ' + tr('codexOverleafSkillEnableToggle'));
251
+ const label = !local && id === 'annotated-rewrite' ? tx('Guided editing for document revisions.', '用于文稿修订的编辑流程。')
252
+ : !local && id === 'parallel-subagents' ? tx('Split independent subtasks across multiple agents.', '将相互独立的子任务分配给多个 agent。') : '';
253
+ const help = copy.querySelector('.codex-local-skill-description');
254
+ if (label && help) { help.textContent = label; help.title = label; }
255
+ };
143
256
 
144
257
  if (skill.removable !== false) {
145
258
  // The Remove / Confirm / Cancel controls share an actions container so
@@ -164,6 +277,11 @@
164
277
  cancelBtn.type = 'button';
165
278
  cancelBtn.className = 'codex-set-btn';
166
279
  cancelBtn.textContent = tr('localSkillRemoveCancel');
280
+ const refreshRow = row._refreshLocale;
281
+ row._refreshLocale = () => {
282
+ refreshRow(); removeBtn.textContent = tr('localSkillRemove'); cancelBtn.textContent = tr('localSkillRemoveCancel');
283
+ confirmBtn.textContent = tr(confirmBtn.disabled ? 'localSkillRemoving' : 'localSkillRemoveConfirm');
284
+ };
167
285
 
168
286
  function enterConfirming() {
169
287
  // Reset any previously confirming row back to its Remove button state.
@@ -212,15 +330,16 @@
212
330
  });
213
331
 
214
332
  actions.append(removeBtn);
215
- row.append(actions);
333
+ controls.append(actions);
216
334
 
217
335
  // Store references so resetConfirmingRow can find and reset this row.
218
336
  row._exitConfirming = exitConfirming;
219
337
  row._skillId = id;
220
338
  }
221
339
 
222
- // Per-skill enable switch is always the last child (rightmost).
223
- row.append(toggle);
340
+ // The switch remains rightmost, including during removal confirmation.
341
+ controls.append(toggle);
342
+ if (compact) row.append(controls);
224
343
 
225
344
  list.append(row);
226
345
  }
@@ -239,10 +358,11 @@
239
358
  }
240
359
  }
241
360
 
242
- function appendLocalSkillEmpty(list, text) {
361
+ function appendLocalSkillEmpty(list, key) {
243
362
  const empty = document.createElement('div');
244
363
  empty.className = 'codex-project-settings-empty';
245
- empty.textContent = text;
364
+ empty.textContent = tr(key);
365
+ empty.dataset.i18n = key;
246
366
  list.append(empty);
247
367
  }
248
368
 
@@ -258,7 +378,7 @@
258
378
  throw new Error(response?.error?.message || 'native host did not remove Codex Overleaf skill');
259
379
  }
260
380
  const activeSkill = normalizeComposerSkillInvocation(getComposerSkillInvocation());
261
- if (activeSkill?.scope === 'codex-overleaf' && activeSkill.skillId === id) {
381
+ if (activeSkill?.scope === 'codex-overleaf' && activeSkill.id === id) {
262
382
  clearComposerSkillInvocation();
263
383
  }
264
384
  setProjectSettingsStatus(tr('codexOverleafSkillRemoveDone'), 'completed');
@@ -269,6 +389,11 @@
269
389
 
270
390
  return {
271
391
  refreshLocalSkills,
392
+ refreshLocale: () => {
393
+ for (const selector of ['[data-local-skill-list]', '[data-codex-local-skill-list]']) {
394
+ for (const row of getPanel()?.querySelector(selector)?.children || []) row._refreshLocale?.();
395
+ }
396
+ },
272
397
  renderLocalSkillList,
273
398
  removeCodexOverleafSkill
274
399
  };
@@ -454,11 +454,16 @@
454
454
  const text = String(textNode.textContent || '');
455
455
  const match = text.match(/^(\s*)(Conclusion:|结论:|Changes:|修改:)(\s*)/);
456
456
  if (!match || !textNode.parentNode) continue;
457
+ // The answer speaks for itself: older stored reports still begin with a
458
+ // "Conclusion:" prefix, which is dropped rather than labelled.
459
+ if (['Conclusion:', '结论:'].includes(match[2])) {
460
+ textNode.textContent = `${match[1]}${text.slice(match[0].length)}`;
461
+ if (!String(block.textContent || '').trim()) block.remove?.();
462
+ continue;
463
+ }
457
464
  const label = document.createElement('span');
458
465
  label.className = 'run-system-label';
459
- label.dataset.systemLabel = ['Conclusion:', '结论:'].includes(match[2])
460
- ? 'conclusion'
461
- : 'changes';
466
+ label.dataset.systemLabel = 'changes';
462
467
  label.textContent = `${match[2]}${match[3]}`;
463
468
  textNode.textContent = `${match[1]}${text.slice(match[0].length)}`;
464
469
  textNode.parentNode.insertBefore(label, textNode);
@@ -487,7 +492,7 @@
487
492
  const check = document.createElement('span');
488
493
  check.className = 'run-change-summary__check';
489
494
  check.setAttribute('aria-hidden', 'true');
490
- check.textContent = '✓';
495
+ check.innerHTML = '<svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg>';
491
496
  const text = document.createElement('span');
492
497
  text.textContent = tx(
493
498
  `${syncedFiles} ${syncedFiles === 1 ? 'file' : 'files'} synced`,
@@ -1,11 +1,8 @@
1
1
  (function initCodexOverleafMarkdownText() {
2
2
  'use strict';
3
3
 
4
- // Markdown / assistant-text rendering — block + inline markdown, the
5
- // assistant-visible sanitizers, and line-reference resolution/buttons carved
6
- // out of contentRuntime.js (v1.4.5 structural-debt phase 1). The code below
7
- // moved verbatim (original indentation kept); the four runtime collaborators
8
- // are factory-injected so behavior is unchanged.
4
+ // Assistant-text rendering, sanitizers, and line-reference controls.
5
+ // Runtime collaborators are factory-injected.
9
6
  function create(deps = {}) {
10
7
  const {
11
8
  LineReferences,
@@ -588,7 +585,9 @@
588
585
  return;
589
586
  }
590
587
  renderingDiagnosticKeys.add(key);
591
- if (typeof options.recordRenderingDiagnostic === 'function') options.recordRenderingDiagnostic({ code, detail });
588
+ try {
589
+ if (typeof deps.recordRenderingDiagnostic === 'function') deps.recordRenderingDiagnostic({ code, detail });
590
+ } catch (_error) { /* A diagnostic sink must not interrupt rendering. */ }
592
591
  }
593
592
 
594
593
  function appendMarkdownParagraphFlow(target, value) {
@@ -117,11 +117,12 @@
117
117
  if (generation !== modelLoadGeneration) {
118
118
  return { stale: true };
119
119
  }
120
+ options.assertCurrent?.();
120
121
  const responseProviderId = response?.result?.providerId || '';
121
122
  if (selection?.providerId && responseProviderId && responseProviderId !== selection.providerId) {
122
123
  return { stale: true };
123
124
  }
124
- if (selection?.providerId && selection.providerId !== 'builtin'
125
+ if (response?.ok && selection?.providerId && selection.providerId !== 'builtin'
125
126
  && Number(response?.result?.providerRevision) !== Number(selection.providerRevision)) {
126
127
  return { stale: true };
127
128
  }
@@ -170,6 +171,7 @@
170
171
  if (generation !== modelLoadGeneration) {
171
172
  return { stale: true };
172
173
  }
174
+ options.assertCurrent?.();
173
175
  applyUnavailableModelOptions(error);
174
176
  return { stale: false, error };
175
177
  }
@@ -251,7 +253,7 @@
251
253
  }
252
254
  const option = document.createElement('option');
253
255
  option.value = id;
254
- option.textContent = model.label;
256
+ option.textContent = model.unverified && model.label === `${id} (custom)` ? tx(`${id} (custom)`, `${id}(自定义)`) : model.label;
255
257
  option.dataset.reasoningEfforts = normalizeReasoningEffortsForSelect(model.reasoningEfforts).join(',');
256
258
  option.dataset.defaultReasoningEffort = model.defaultReasoningEffort || '';
257
259
  option.dataset.reasoningPresentation = model.reasoningPresentation || '';
@@ -269,7 +271,7 @@
269
271
  if (selectedId && !renderedSelected && options.allowUnknownSelected !== false) {
270
272
  const option = document.createElement('option');
271
273
  option.value = selectedId;
272
- option.textContent = `${selectedId} (custom)`;
274
+ option.textContent = tx(`${selectedId} (custom)`, `${selectedId}(自定义)`);
273
275
  option.dataset.reasoningEfforts = '';
274
276
  option.dataset.defaultReasoningEffort = '';
275
277
  option.dataset.reasoningPresentation = 'none';
@@ -370,7 +372,7 @@
370
372
  for (const option of Array.from(reasoningSelect.options || [])) {
371
373
  list.append(createModelConfigChoice({
372
374
  value: option.value,
373
- label: option.textContent || formatReasoningEffortLabel(option.value, reasoningSelect.dataset.presentation),
375
+ label: formatReasoningEffortLabel(option.value, reasoningSelect.dataset.presentation),
374
376
  datasetName: 'reasoningChoice'
375
377
  }));
376
378
  }
@@ -384,6 +386,7 @@
384
386
  }
385
387
  list.textContent = '';
386
388
  for (const option of Array.from(modelSelect.options || [])) {
389
+ if (option.dataset.unverified === 'true' && [`${option.value} (custom)`, `${option.value}(自定义)`].includes(option.textContent)) option.textContent = tx(`${option.value} (custom)`, `${option.value}(自定义)`);
387
390
  const choice = createModelConfigChoice({
388
391
  value: option.value,
389
392
  label: option.textContent || option.value,
@@ -427,7 +430,7 @@
427
430
 
428
431
  const check = document.createElement('span');
429
432
  check.className = 'codex-model-config-check';
430
- check.textContent = '✓';
433
+ check.innerHTML = '<svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m3.5 8 3 3 6-6"/></svg>';
431
434
  check.setAttribute('aria-hidden', 'true');
432
435
  button.append(check);
433
436
  return button;