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
  const tx = typeof options.tx === 'function' ? options.tx : (en) => en;
7
7
  const tr = typeof options.tr === 'function' ? options.tr : (key) => key;
8
8
  const appendPlainLog = typeof options.appendPlainLog === 'function' ? options.appendPlainLog : () => {};
9
+ const onChange = typeof options.onChange === 'function' ? options.onChange : () => {};
9
10
  const limits = options.limits || {};
10
11
  const maxAttachments = Number(limits.maxAttachments) || 8;
11
12
  const maxAttachmentBytes = Number(limits.maxAttachmentBytes) || 12 * 1024 * 1024;
@@ -15,6 +16,8 @@
15
16
  let attachments = [];
16
17
  const pendingAttachmentKeys = new Set();
17
18
  let pendingAttachmentBytes = 0;
19
+ let attachmentGeneration = 0;
20
+ let attachmentRevision = 0;
18
21
 
19
22
  function handlePaste(event) {
20
23
  const files = collectFilesFromDataTransfer(event.clipboardData);
@@ -59,51 +62,68 @@
59
62
  }
60
63
 
61
64
  async function addFiles(files) {
62
- for (const file of Array.from(files || [])) {
63
- const dedupeKey = buildAttachmentDedupeKey(file);
64
- if (isDuplicateAttachmentFile(dedupeKey)) {
65
- continue;
66
- }
67
- if (attachments.length + pendingAttachmentKeys.size >= maxAttachments) {
68
- appendPlainLog(tx(
69
- `Attachment limit reached (${maxAttachments}).`,
70
- `附件数量已达上限(${maxAttachments} 个)。`
71
- ));
72
- break;
73
- }
74
- validateAttachmentFile(file);
75
- const fileSize = Number(file.size) || 0;
76
- if (!canReserveAttachmentBytes(fileSize)) {
77
- appendPlainLog(tx(
78
- `Attachment total limit reached (${formatFileSize(maxAttachmentTotalBytes)}). Remove attachments or use smaller files.`,
79
- `附件总大小已达上限(${formatFileSize(maxAttachmentTotalBytes)})。请移除部分附件或使用更小的文件。`
80
- ));
81
- continue;
82
- }
83
- pendingAttachmentKeys.add(dedupeKey);
84
- pendingAttachmentBytes += fileSize;
85
- try {
86
- const dataUrl = await readFileAsDataUrl(file);
87
- const preview = await buildAttachmentPreviewData(file, dataUrl);
88
- const attachment = {
89
- id: `${Date.now()}-${Math.random().toString(36).slice(2)}`,
90
- name: normalizeAttachmentName(file.name),
91
- mimeType: String(file.type || ''),
92
- size: Number(file.size) || 0,
93
- kind: preview.kind,
94
- previewDataUrl: preview.previewDataUrl,
95
- contentBase64: extractBase64FromDataUrl(dataUrl),
96
- dedupeKey
97
- };
98
- if (!attachments.some(existing => buildAttachmentDedupeKey(existing) === dedupeKey)) {
99
- attachments.push(attachment);
65
+ const generation = attachmentGeneration;
66
+ try {
67
+ for (const file of Array.from(files || [])) {
68
+ if (generation !== attachmentGeneration) return;
69
+ const dedupeKey = buildAttachmentDedupeKey(file);
70
+ if (isDuplicateAttachmentFile(dedupeKey)) {
71
+ continue;
72
+ }
73
+ if (attachments.length + pendingAttachmentKeys.size >= maxAttachments) {
74
+ appendPlainLog(tx(
75
+ `Attachment limit reached (${maxAttachments}).`,
76
+ `附件数量已达上限(${maxAttachments} 个)。`
77
+ ));
78
+ break;
79
+ }
80
+ validateAttachmentFile(file);
81
+ const fileSize = Number(file.size) || 0;
82
+ if (!canReserveAttachmentBytes(fileSize)) {
83
+ appendPlainLog(tx(
84
+ `Attachment total limit reached (${formatFileSize(maxAttachmentTotalBytes)}). Remove attachments or use smaller files.`,
85
+ `附件总大小已达上限(${formatFileSize(maxAttachmentTotalBytes)})。请移除部分附件或使用更小的文件。`
86
+ ));
87
+ continue;
88
+ }
89
+ attachmentRevision += 1;
90
+ pendingAttachmentKeys.add(dedupeKey);
91
+ pendingAttachmentBytes += fileSize;
92
+ try {
93
+ const dataUrl = await readFileAsDataUrl(file, tx);
94
+ if (generation !== attachmentGeneration) return;
95
+ const preview = await buildAttachmentPreviewData(file, dataUrl);
96
+ if (generation !== attachmentGeneration) return;
97
+ const attachment = {
98
+ id: `${Date.now()}-${Math.random().toString(36).slice(2)}`,
99
+ name: normalizeAttachmentName(file.name),
100
+ mimeType: String(file.type || ''),
101
+ size: Number(file.size) || 0,
102
+ kind: preview.kind,
103
+ previewDataUrl: preview.previewDataUrl,
104
+ contentBase64: extractBase64FromDataUrl(dataUrl),
105
+ dedupeKey
106
+ };
107
+ if (!attachments.some(existing => buildAttachmentDedupeKey(existing) === dedupeKey)) {
108
+ attachments.push(attachment);
109
+ attachmentRevision += 1;
110
+ onChange();
111
+ }
112
+ } catch (error) {
113
+ if (generation !== attachmentGeneration) return;
114
+ throw error;
115
+ } finally {
116
+ // Cleared work no longer owns reservations in the current composer.
117
+ if (generation === attachmentGeneration) {
118
+ pendingAttachmentBytes = Math.max(0, pendingAttachmentBytes - fileSize);
119
+ pendingAttachmentKeys.delete(dedupeKey);
120
+ }
100
121
  }
101
- } finally {
102
- pendingAttachmentBytes = Math.max(0, pendingAttachmentBytes - fileSize);
103
- pendingAttachmentKeys.delete(dedupeKey);
104
122
  }
123
+ } finally {
124
+ // A partial batch may have accepted files before validation or reading failed.
125
+ if (generation === attachmentGeneration) renderComposerAttachments();
105
126
  }
106
- renderComposerAttachments();
107
127
  }
108
128
 
109
129
  function getAttachmentsForRun() {
@@ -144,15 +164,21 @@
144
164
  });
145
165
  }
146
166
 
147
- function clear() {
167
+ function clear(options = {}) {
168
+ attachmentGeneration += 1;
169
+ attachmentRevision += 1;
148
170
  attachments = [];
149
171
  pendingAttachmentKeys.clear();
172
+ pendingAttachmentBytes = 0;
150
173
  renderComposerAttachments();
174
+ if (options.notify !== false) onChange();
151
175
  }
152
176
 
153
177
  function removeAttachment(id) {
178
+ const previousLength = attachments.length;
154
179
  attachments = attachments.filter(attachment => attachment.id !== id);
155
180
  renderComposerAttachments();
181
+ if (attachments.length !== previousLength) { attachmentRevision += 1; onChange(); }
156
182
  }
157
183
 
158
184
  function isDuplicateAttachmentFile(dedupeKey) {
@@ -260,14 +286,36 @@
260
286
  if (!usable.length) {
261
287
  return 0;
262
288
  }
289
+ attachmentRevision += 1;
263
290
  attachments = usable.map(item => ({ ...item }));
264
291
  renderComposerAttachments();
265
292
  return attachments.length;
266
293
  }
267
294
 
295
+ // Only a just-rejected local-skill submission uses this in-memory recovery.
296
+ // It keeps the normal composer limits, without durable-draft truncation.
297
+ function restoreSubmittedAttachments(value, expectedRevision) {
298
+ if (expectedRevision !== attachmentRevision || attachments.length || pendingAttachmentBytes || pendingAttachmentKeys.size) return false;
299
+ if (!Array.isArray(value) || value.length > maxAttachments) return false;
300
+ let total = 0;
301
+ for (const item of value) {
302
+ const size = Number(item?.size);
303
+ if (!item?.name || typeof item.contentBase64 !== 'string' || !Number.isFinite(size) || size < 0 || size > maxAttachmentBytes) return false;
304
+ total += size;
305
+ }
306
+ if (total > maxAttachmentTotalBytes) return false;
307
+ attachments = value.map((item, index) => ({ ...item, id: `restored-${Date.now()}-${index}`, dedupeKey: buildAttachmentDedupeKey(item) }));
308
+ attachmentRevision += 1;
309
+ renderComposerAttachments();
310
+ onChange();
311
+ return true;
312
+ }
313
+
268
314
  return {
269
315
  serializePersistableAttachments,
270
316
  restorePersistedAttachments,
317
+ restoreSubmittedAttachments,
318
+ getRevision: () => attachmentRevision,
271
319
  handlePaste,
272
320
  handleDragOver,
273
321
  handleDragLeave,
@@ -361,54 +409,56 @@
361
409
  }
362
410
 
363
411
  function renderAttachmentPreviewList(attachments = [], container, options = {}) {
364
- if (!container) {
365
- return;
366
- }
412
+ if (!container) return;
367
413
  container.replaceChildren();
368
414
  const items = Array.isArray(attachments) ? attachments : [];
369
415
  container.hidden = items.length === 0;
370
416
  for (const attachment of items) {
371
417
  const isImage = attachment.kind === 'image' && attachment.previewDataUrl;
372
- const card = document.createElement(isImage ? 'button' : 'div');
418
+ const label = attachment.name || (options.tx ? options.tx('Attachment', '附件') : 'Attachment');
419
+ const card = document.createElement('div');
373
420
  card.className = 'codex-attachment-preview-card';
374
421
  card.dataset.kind = isImage ? 'image' : 'file';
422
+ card.title = label + ' · ' + formatFileSize(attachment.size);
375
423
  if (isImage) {
376
- card.type = 'button';
377
- card.title = options.tx
378
- ? options.tx(`Open ${attachment.name}`, `打开 ${attachment.name}`)
379
- : `Open ${attachment.name}`;
380
- card.addEventListener('click', () => showAttachmentPreviewDialog(attachment, options));
424
+ const preview = document.createElement('button');
425
+ preview.type = 'button';
426
+ preview.className = 'codex-attachment-preview-open';
427
+ preview.setAttribute('aria-label', options.tx ? options.tx('Preview ' + label, '预览 ' + label) : 'Preview ' + label);
428
+ preview.addEventListener('click', () => showAttachmentPreviewDialog(attachment, options));
381
429
  const image = document.createElement('img');
382
430
  image.src = attachment.previewDataUrl;
383
- image.alt = attachment.name || (options.tx ? options.tx('Attached image', '已附加图片') : 'Attached image');
384
- card.append(image);
431
+ image.alt = label;
432
+ preview.append(image);
433
+ card.append(preview);
385
434
  } else {
386
435
  const icon = document.createElement('span');
387
436
  icon.className = 'codex-attachment-file-icon';
388
437
  icon.textContent = getAttachmentIconLabel(attachment);
438
+ icon.setAttribute('aria-hidden', 'true');
389
439
  card.append(icon);
390
440
  }
391
-
392
441
  const meta = document.createElement('span');
393
442
  meta.className = 'codex-attachment-preview-meta';
394
443
  const name = document.createElement('span');
395
444
  name.className = 'codex-attachment-preview-name';
396
- name.textContent = attachment.name || (options.tx ? options.tx('Attachment', '附件') : 'Attachment');
397
- const size = document.createElement('span');
398
- size.className = 'codex-attachment-preview-size';
399
- size.textContent = formatFileSize(attachment.size);
400
- meta.append(name, size);
445
+ name.textContent = label;
446
+ meta.append(name);
447
+ if (!isImage) {
448
+ const size = document.createElement('span');
449
+ size.className = 'codex-attachment-preview-size';
450
+ size.textContent = formatFileSize(attachment.size);
451
+ meta.append(size);
452
+ }
401
453
  card.append(meta);
402
-
403
454
  if (options.removable) {
404
455
  const remove = document.createElement('button');
405
456
  remove.type = 'button';
406
457
  remove.className = 'codex-attachment-preview-remove';
407
458
  remove.textContent = '×';
408
- remove.title = options.tx ? options.tx('Remove attachment', '移除附件') : 'Remove attachment';
409
- remove.setAttribute('aria-label', options.tx
410
- ? options.tx(`Remove ${attachment.name}`, `移除 ${attachment.name}`)
411
- : `Remove ${attachment.name}`);
459
+ const removeLabel = options.tx ? options.tx('Remove ' + label, '移除 ' + label) : 'Remove ' + label;
460
+ remove.title = removeLabel;
461
+ remove.setAttribute('aria-label', removeLabel);
412
462
  remove.addEventListener('click', event => {
413
463
  event.preventDefault();
414
464
  event.stopPropagation();
@@ -494,13 +544,13 @@
494
544
  /\.(?:png|jpe?g|gif|webp|bmp|svg)$/i.test(String(attachment.name || ''));
495
545
  }
496
546
 
497
- function readFileAsDataUrl(file) {
547
+ function readFileAsDataUrl(file, tx = en => en) {
498
548
  return new Promise((resolve, reject) => {
499
549
  const reader = new FileReader();
500
550
  reader.onload = () => {
501
551
  resolve(String(reader.result || ''));
502
552
  };
503
- reader.onerror = () => reject(reader.error || new Error('Could not read selected file'));
553
+ reader.onerror = () => reject(new Error(tx('Could not read selected file.', '无法读取所选文件。'), { cause: reader.error }));
504
554
  reader.readAsDataURL(file);
505
555
  });
506
556
  }
@@ -18,6 +18,7 @@
18
18
  <div class="codex-pending-inputs" data-pending-inputs hidden></div>
19
19
  <form class="codex-composer" data-composer-form>
20
20
  <div class="codex-attachment-strip codex-attachment-preview-list" data-attachment-strip hidden></div>
21
+ <div class="codex-composer-selection" data-composer-selection hidden></div>
21
22
  <div class="codex-composer-skill-context" data-composer-skill-context hidden>
22
23
  <span class="codex-composer-skill-icon" aria-hidden="true">◇</span>
23
24
  <span data-composer-skill-label></span>
@@ -35,17 +36,31 @@
35
36
  <option value="ask">Ask</option>
36
37
  <option value="auto">Auto</option>
37
38
  </select>
39
+ <div class="codex-write-preferences">
40
+ <label class="codex-review-toggle" title="When enabled, Codex checks or switches Overleaf Reviewing/Track Changes before writing. Deletes still require confirmation.">
41
+ <input type="checkbox" data-require-reviewing>
42
+ <svg class="codex-composer-option-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
43
+ <path d="m9 11 8-8 4 4-8 8M9 11l4 4-3 3H6v-4l3-3ZM3 21h7"></path>
44
+ </svg>
45
+ <span class="codex-review-label" data-i18n="requireReviewing">Track</span>
46
+ <svg class="codex-composer-option-check" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
47
+ <path d="m3.5 8 3 3 6-6"></path>
48
+ </svg>
49
+ </label>
50
+ <label class="codex-recompile-toggle" title="Automatically recompile in Overleaf after Codex writes and record the result. Toggling this setting does not compile immediately. Ask mode does not trigger compilation.">
51
+ <input type="checkbox" data-auto-recompile>
52
+ <svg class="codex-composer-option-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
53
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8ZM14 2v6h6m-11 7 2 2 4-4"></path>
54
+ </svg>
55
+ <span class="codex-recompile-label" data-i18n="autoCompile">Auto compile</span>
56
+ <svg class="codex-composer-option-check" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
57
+ <path d="m3.5 8 3 3 6-6"></path>
58
+ </svg>
59
+ </label>
60
+ </div>
38
61
  </div>
39
62
  <div class="codex-composer-toolbar">
40
63
  <button type="button" data-add-context title="Add @ context" aria-label="Add @ context" aria-expanded="false">+</button>
41
- <label class="codex-review-toggle" title="When enabled, Codex checks or switches Overleaf Reviewing/Track Changes before writing. Deletes still require confirmation.">
42
- <input type="checkbox" data-require-reviewing>
43
- <span class="codex-review-label" data-i18n="requireReviewing">Track</span>
44
- </label>
45
- <label class="codex-recompile-toggle" title="After Codex writes, click Overleaf Recompile and record the compile result for this task. Ask mode will not trigger it.">
46
- <input type="checkbox" data-auto-recompile>
47
- <span class="codex-recompile-label" data-i18n="autoCompile">Compile</span>
48
- </label>
49
64
  <div class="codex-model-config" data-model-config>
50
65
  <button type="button" class="codex-model-config-button" data-model-config-toggle aria-haspopup="menu" aria-expanded="false">
51
66
  <span class="codex-model-speed-indicator" data-speed-indicator hidden aria-hidden="true">
@@ -117,6 +132,7 @@
117
132
  `;
118
133
 
119
134
  bindEvents(instance);
135
+ bindMenuLayout(instance);
120
136
 
121
137
  return {
122
138
  setRunning: running => setRunning(instance, running),
@@ -178,6 +194,22 @@
178
194
  instance.listeners.push({ target, type, listener });
179
195
  }
180
196
 
197
+ function bindMenuLayout(instance) {
198
+ const view = instance.container.ownerDocument?.defaultView || window;
199
+ const update = () => instance.callbacks.onMenuLayoutChange?.();
200
+ bind(instance, view, 'resize', update);
201
+ bind(instance, view.visualViewport, 'resize', update);
202
+ bind(instance, view.visualViewport, 'scroll', update);
203
+ const form = instance.container.querySelector('[data-composer-form]');
204
+ if (form && typeof view.ResizeObserver === 'function') {
205
+ instance.menuResizeObserver = new view.ResizeObserver(update);
206
+ instance.menuResizeObserver.observe(form);
207
+ instance.menuResizeObserver.observe(instance.container);
208
+ const panel = instance.container.closest?.('#codex-overleaf-panel');
209
+ if (panel && panel !== instance.container) instance.menuResizeObserver.observe(panel);
210
+ }
211
+ }
212
+
181
213
  function setRunning(target, running) {
182
214
  const instance = target?._instance || target;
183
215
  const runButton = instance?.container?.querySelector('[data-run]');
@@ -261,6 +293,7 @@
261
293
  }
262
294
 
263
295
  function destroy(instance) {
296
+ instance.menuResizeObserver?.disconnect();
264
297
  for (const { target, type, listener } of instance.listeners.splice(0)) {
265
298
  target.removeEventListener?.(type, listener);
266
299
  }