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
@@ -0,0 +1,236 @@
1
+ (function (root, factory) {
2
+ if (typeof module === 'object' && module.exports) module.exports = factory();
3
+ else root.CodexOverleafModuleRegistry.define('DiagnosticsExport', [], factory);
4
+ })(typeof globalThis !== 'undefined' ? globalThis : this, function () {
5
+ 'use strict';
6
+
7
+ function create(deps = {}) {
8
+ const { root, window, document, Blob, URL, TextEncoder, AuditRecords, StorageDb, CodexOverleafCompatibility, getState, getCurrentRunView, getCurrentProjectId, findRunRecord, getMirrorFreshness, getExtensionCompatibilityMetadata, getModelDiscovery, getGovernanceRulesForCurrentProject, sendBackgroundNative, fallbackNativeCompatibility, isNativeCompatibilityCompatible, getNativeCompatibilityClassification, callPageBridge, showPluginToast, tr, RUN_SNAPSHOT_ZIP_TIMEOUT_MS } = deps;
9
+
10
+ function exposeSmokeHelper() {
11
+ const helper = Object.freeze({
12
+ probeNative: smokeProbeNative,
13
+ probeProject: smokeProbeProject,
14
+ getProjectSnapshotMetrics: smokeProbeProject
15
+ });
16
+ try {
17
+ Object.defineProperty(root, 'CodexOverleafSmoke', {
18
+ configurable: true,
19
+ enumerable: false,
20
+ value: helper
21
+ });
22
+ } catch (_error) {
23
+ root.CodexOverleafSmoke = helper;
24
+ }
25
+ }
26
+
27
+ async function smokeProbeNative() {
28
+ try {
29
+ const params = CodexOverleafCompatibility?.buildBridgePingParams
30
+ ? CodexOverleafCompatibility.buildBridgePingParams(getExtensionCompatibilityMetadata())
31
+ : {};
32
+ const response = await sendBackgroundNative({ method: 'bridge.ping', params });
33
+ const compatibility = CodexOverleafCompatibility?.evaluateNativeCompatibility
34
+ ? CodexOverleafCompatibility.evaluateNativeCompatibility(response, getExtensionCompatibilityMetadata())
35
+ : fallbackNativeCompatibility(response);
36
+ return {
37
+ supported: true,
38
+ ok: response?.ok === true && isNativeCompatibilityCompatible(compatibility),
39
+ status: compatibility?.status || (response?.ok ? 'ok' : 'native_missing'),
40
+ classification: getNativeCompatibilityClassification(compatibility),
41
+ errorCode: response?.error?.code || compatibility?.status || '',
42
+ nativeCompatibility: summarizeSmokeNativeCompatibility(compatibility, response)
43
+ };
44
+ } catch (_error) {
45
+ return {
46
+ supported: true,
47
+ ok: false,
48
+ status: 'native_probe_failed',
49
+ errorCode: 'native_probe_failed'
50
+ };
51
+ }
52
+ }
53
+
54
+ async function smokeProbeProject(options = {}) {
55
+ try {
56
+ const project = await callPageBridge('getProjectSnapshot', {
57
+ force: Boolean(options.force),
58
+ preferLightweight: true,
59
+ allowZipFallback: true,
60
+ allowEditorNavigation: false,
61
+ requireFullProject: false,
62
+ includeBinaryFiles: true,
63
+ includeContent: false,
64
+ zipTimeoutMs: RUN_SNAPSHOT_ZIP_TIMEOUT_MS
65
+ });
66
+ const files = Array.isArray(project?.files) ? project.files : [];
67
+ const skipped = Array.isArray(project?.capabilities?.skipped) ? project.capabilities.skipped : [];
68
+ const bytes = summarizeSmokeProjectBytes(files);
69
+ const ok = project?.ok !== false && files.length > 0;
70
+ return {
71
+ supported: true,
72
+ ok,
73
+ status: ok ? 'ok' : 'project_snapshot_unavailable',
74
+ errorCode: ok ? '' : project?.code || 'project_snapshot_unavailable',
75
+ counts: {
76
+ files: files.length,
77
+ skipped: skipped.length
78
+ },
79
+ bytes,
80
+ method: project?.capabilities?.method || ''
81
+ };
82
+ } catch (_error) {
83
+ return {
84
+ supported: true,
85
+ ok: false,
86
+ status: 'project_probe_failed',
87
+ errorCode: 'project_probe_failed',
88
+ counts: {
89
+ files: 0,
90
+ skipped: 0
91
+ },
92
+ bytes: {
93
+ text: 0,
94
+ binary: 0
95
+ }
96
+ };
97
+ }
98
+ }
99
+
100
+ function summarizeSmokeNativeCompatibility(compatibility = {}, response = {}) {
101
+ const native = compatibility?.native || response?.result || {};
102
+ return {
103
+ status: compatibility?.status || (response?.ok ? 'ok' : 'native_missing'),
104
+ classification: getNativeCompatibilityClassification(compatibility),
105
+ nativeVersion: compatibility?.nativeVersion || native.version || '',
106
+ version: compatibility?.version || native.version || '',
107
+ minimumNativeVersion: compatibility?.minimumNativeVersion || compatibility?.minNativeVersion || '',
108
+ protocolVersion: compatibility?.protocolVersion || native.protocolVersion || '',
109
+ supportedProtocol: compatibility?.supportedProtocol || native.supportedProtocol || ''
110
+ };
111
+ }
112
+
113
+ function summarizeSmokeProjectBytes(files = []) {
114
+ return files.reduce((bytes, file) => {
115
+ let size = Number(file?.size || file?.byteLength || 0);
116
+ if ((!Number.isFinite(size) || size <= 0) && typeof file?.content === 'string') {
117
+ size = new TextEncoder().encode(file.content).byteLength;
118
+ }
119
+ if (!Number.isFinite(size) || size <= 0) {
120
+ return bytes;
121
+ }
122
+ if (file?.kind === 'binary') {
123
+ bytes.binary += size;
124
+ } else {
125
+ bytes.text += size;
126
+ }
127
+ return bytes;
128
+ }, {
129
+ text: 0,
130
+ binary: 0
131
+ });
132
+ }
133
+
134
+ async function exportDiagnosticsBundle() {
135
+ if (!AuditRecords?.buildDiagnosticBundle) {
136
+ throw new Error('Audit diagnostics helper is unavailable');
137
+ }
138
+ const projectId = getCurrentProjectId();
139
+ const accountScopeId = deps.getAccountScopeId?.() || '';
140
+ if (!accountScopeId) throw new Error('Account identity is unavailable; reopen the project before exporting diagnostics.');
141
+ const currentRunView = getCurrentRunView();
142
+ const activeRecord = currentRunView && findRunRecord(currentRunView.recordId, currentRunView.sessionId);
143
+ const panelState = getState();
144
+ const sessionScope = panelState.sessions?.find(session => session.id === panelState.activeSessionId)?.accountScopeId;
145
+ // Older normalized runs lack owner fields; they still rely on the view's
146
+ // hydration boundary. Explicit ownership, when present, must agree.
147
+ const matchesAccount = (record, ...owners) => [record?.runAccountScopeId, record?.accountScopeId, ...owners]
148
+ .filter(Boolean).every(owner => owner === accountScopeId);
149
+ const recentRuns = (panelState.runs || []).filter(run => run && (!run.runProjectId || run.runProjectId === projectId)
150
+ && matchesAccount(run, sessionScope, panelState.accountScopeId))
151
+ .slice().reverse().sort((a, b) => (Date.parse(b.startedAt) || 0) - (Date.parse(a.startedAt) || 0)).slice(0, 8);
152
+ const [auditLogs, mirror, nativeDiagnostics] = await Promise.all([
153
+ getRecentAuditLogsForCurrentProject({ projectId, accountScopeId }),
154
+ getMirrorFreshness().catch(error => ({ status: 'unavailable', errorCode: error.message })),
155
+ getNativeDiagnosticsSummaryForBundle()
156
+ ]);
157
+ if (getCurrentProjectId() !== projectId) throw new Error('Project changed during diagnostics export; export again.');
158
+ if (deps.getAccountScopeId?.() !== accountScopeId) throw new Error('Account changed during diagnostics export; export again.');
159
+ const bundle = AuditRecords.buildDiagnosticBundle({
160
+ excludeContent: true,
161
+ compatibility: {
162
+ extension: getExtensionCompatibilityMetadata(),
163
+ modelDiscovery: getModelDiscovery()
164
+ },
165
+ platform: nativeDiagnostics.platform,
166
+ nativeEnvironment: nativeDiagnostics.nativeEnvironment,
167
+ mirror,
168
+ auditLogs,
169
+ run: activeRecord?.runProjectId === projectId && matchesAccount(activeRecord, currentRunView?.runAccountScopeId)
170
+ ? activeRecord : recentRuns[0] || {},
171
+ recentRuns,
172
+ governance: getGovernanceRulesForCurrentProject(),
173
+ projectId
174
+ });
175
+ const blob = new Blob([JSON.stringify(bundle, null, 2)], { type: 'application/json' });
176
+ const url = URL.createObjectURL(blob);
177
+ const link = document.createElement('a');
178
+ link.href = url;
179
+ link.download = `codex-overleaf-diagnostics-${new Date().toISOString().replace(/[:.]/g, '-')}.json`;
180
+ document.body.append(link);
181
+ link.click();
182
+ link.remove();
183
+ window.setTimeout(() => URL.revokeObjectURL(url), 1000);
184
+ showPluginToast(tr('diagnosticsExportDone'), { status: 'completed' });
185
+ }
186
+
187
+ async function getNativeDiagnosticsSummaryForBundle() {
188
+ try {
189
+ const params = CodexOverleafCompatibility?.buildBridgePingParams
190
+ ? CodexOverleafCompatibility.buildBridgePingParams(getExtensionCompatibilityMetadata())
191
+ : {};
192
+ const response = await sendBackgroundNative({ method: 'bridge.ping', params });
193
+ if (!response?.ok) {
194
+ const errorCode = response?.error?.code || 'native_unavailable';
195
+ return {
196
+ platform: { status: 'unavailable', errorCode },
197
+ nativeEnvironment: { status: 'unavailable', errorCode }
198
+ };
199
+ }
200
+ return {
201
+ platform: {
202
+ host: response.result?.host || '',
203
+ platform: response.result?.platform || '',
204
+ version: response.result?.version || '',
205
+ protocolVersion: response.result?.protocolVersion || ''
206
+ },
207
+ nativeEnvironment: response.result?.environment || {}
208
+ };
209
+ } catch (error) {
210
+ const errorCode = error?.message || 'native_unavailable';
211
+ return {
212
+ platform: { status: 'unavailable', errorCode },
213
+ nativeEnvironment: { status: 'unavailable', errorCode }
214
+ };
215
+ }
216
+ }
217
+
218
+ async function getRecentAuditLogsForCurrentProject(scope, limit = 12) {
219
+ if (!StorageDb?.getAllByIndex) {
220
+ return [];
221
+ }
222
+ const records = await StorageDb.getAllByIndex('auditLogs', 'projectId', scope.projectId);
223
+ return (records || [])
224
+ // Legacy unowned audits remain stored but cannot be assigned to whichever
225
+ // account happens to export next, even when a session ID looks familiar.
226
+ .filter(record => record?.projectId === scope.projectId && record.accountScopeId === scope.accountScopeId)
227
+ .slice()
228
+ .sort((left, right) => String(right.createdAt || '').localeCompare(String(left.createdAt || '')))
229
+ .slice(0, limit);
230
+ }
231
+
232
+ return { exposeSmokeHelper, exportDiagnosticsBundle, smokeProbeNative, smokeProbeProject, summarizeSmokeProjectBytes };
233
+ }
234
+
235
+ return { create };
236
+ });
@@ -11,6 +11,7 @@
11
11
  callbacks: options.callbacks || {},
12
12
  i18n: options.i18n || {},
13
13
  dismissInstalled: false,
14
+ resultDismissed: false,
14
15
  cleanup: []
15
16
  };
16
17
 
@@ -47,19 +48,21 @@
47
48
  <small data-i18n="diagnosticsExportSubtitle">Redacted audit and environment bundle</small>
48
49
  </button>
49
50
  </div>
50
- <section class="codex-diagnostics-result" data-diagnostics-result hidden>
51
+ <section class="codex-diagnostics-result" data-diagnostics-result role="region" aria-label="Diagnostics" hidden>
51
52
  <div class="codex-diagnostics-result-head">
52
53
  <div>
53
54
  <div class="codex-diagnostics-result-title" data-diagnostics-result-title></div>
54
55
  <div class="codex-diagnostics-result-subtitle" data-diagnostics-result-subtitle></div>
55
56
  </div>
56
- <button type="button" data-diagnostics-result-close title="Close" aria-label="Close diagnostics result">×</button>
57
+ <button type="button" data-diagnostics-result-close title="Close" aria-label="Close diagnostics result"><span class="codex-icon" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="m4 4 8 8M12 4l-8 8"/></svg></span></button>
58
+ </div>
59
+ <div class="codex-diagnostics-result-scroll">
60
+ <div class="codex-diagnostics-result-body" data-diagnostics-result-body></div>
61
+ <details class="codex-diagnostics-technical" data-diagnostics-result-details>
62
+ <summary data-i18n="technicalDetails">Technical Details</summary>
63
+ <pre data-diagnostics-result-technical></pre>
64
+ </details>
57
65
  </div>
58
- <div class="codex-diagnostics-result-body" data-diagnostics-result-body></div>
59
- <details class="codex-diagnostics-technical" data-diagnostics-result-details>
60
- <summary data-i18n="technicalDetails">Technical Details</summary>
61
- <pre data-diagnostics-result-technical></pre>
62
- </details>
63
66
  </section>
64
67
  </div>
65
68
  `;
@@ -85,7 +88,10 @@
85
88
  root.querySelector('[data-diagnostics-snapshot]')?.addEventListener('click', () => instance.callbacks.onSnapshot?.());
86
89
  root.querySelector('[data-diagnostics-ot]')?.addEventListener('click', () => instance.callbacks.onOtDiagnostics?.());
87
90
  root.querySelector('[data-diagnostics-export]')?.addEventListener('click', () => instance.callbacks.onExport?.());
88
- root.querySelector('[data-diagnostics-result-close]')?.addEventListener('click', () => closeResult(instance));
91
+ root.querySelector('[data-diagnostics-result-close]')?.addEventListener('click', () => {
92
+ closeResult(instance);
93
+ root.querySelector('[data-diagnostics-menu]')?.focus();
94
+ });
89
95
  }
90
96
 
91
97
  function toggleMenu(target, forceOpen) {
@@ -95,8 +101,14 @@
95
101
  if (!popover || !button) {
96
102
  return;
97
103
  }
104
+ const result = instance.container.querySelector('[data-diagnostics-result]');
105
+ if (forceOpen === undefined && result && !result.hidden) {
106
+ closeResult(instance);
107
+ return;
108
+ }
98
109
  const open = typeof forceOpen === 'boolean' ? forceOpen : popover.hidden;
99
110
  if (open) {
111
+ closeResult(instance);
100
112
  instance.callbacks.onBeforeOpen?.();
101
113
  }
102
114
  popover.hidden = !open;
@@ -123,6 +135,7 @@
123
135
 
124
136
  function closeResult(target) {
125
137
  const instance = target?._instance || target;
138
+ if (instance) instance.resultDismissed = true;
126
139
  const result = instance?.container?.querySelector('[data-diagnostics-result]');
127
140
  if (result) {
128
141
  hideFloating(result);
@@ -131,6 +144,7 @@
131
144
 
132
145
  function showLoading(target, title, subtitle) {
133
146
  const instance = target?._instance || target;
147
+ if (instance) instance.resultDismissed = false;
134
148
  showResult(instance, {
135
149
  title,
136
150
  subtitle: subtitle || t(instance, 'diagnosticsLoading'),
@@ -139,15 +153,47 @@
139
153
  });
140
154
  }
141
155
 
156
+ // Repaint an already-visible observation without rerunning checks or
157
+ // reopening a dismissed result. User disclosure and scroll choices survive.
158
+ function refreshLocale(target, result) {
159
+ const instance = target?._instance || target;
160
+ if (!instance?.container) return;
161
+ for (const node of instance.container.querySelectorAll('[data-i18n]')) {
162
+ node.textContent = t(instance, node.getAttribute('data-i18n'));
163
+ }
164
+ const close = instance.container.querySelector('[data-diagnostics-result-close]');
165
+ if (close) {
166
+ close.title = t(instance, 'close');
167
+ close.setAttribute('aria-label', t(instance, 'closeDiagnostics'));
168
+ }
169
+ const health = instance.container.querySelector('[data-diagnostics-health-dot]')?.dataset.health;
170
+ updateStatus(instance, { health });
171
+ const root = instance.container.querySelector('[data-diagnostics-result]');
172
+ if (!result || !root || root.hidden || instance.resultDismissed) return;
173
+ const details = root.querySelector('[data-diagnostics-result-details]');
174
+ const scroll = root.querySelector('.codex-diagnostics-result-scroll');
175
+ const open = details?.open, scrollTop = scroll?.scrollTop;
176
+ const checks = Array.from(root.querySelectorAll('.codex-diagnostics-check'), node => node.open);
177
+ showResult(instance, result);
178
+ if (details) details.open = open;
179
+ root.querySelectorAll('.codex-diagnostics-check').forEach((node, index) => {
180
+ if (index < checks.length) node.open = checks[index];
181
+ });
182
+ if (scroll) scroll.scrollTop = scrollTop;
183
+ }
184
+
142
185
  function showResult(target, result = {}) {
143
186
  const instance = target?._instance || target;
187
+ if (instance?.resultDismissed) return;
144
188
  const root = instance?.container?.querySelector('[data-diagnostics-result]');
145
189
  if (!root) {
146
190
  return;
147
191
  }
148
192
 
193
+ const wasHidden = root.hidden;
149
194
  root.hidden = false;
150
195
  root.dataset.status = result.status || 'info';
196
+ root.setAttribute('aria-label', result.title || t(instance, 'diagnosticsResult'));
151
197
  root.querySelector('[data-diagnostics-result-title]').textContent = result.title || t(instance, 'diagnosticsResult');
152
198
  root.querySelector('[data-diagnostics-result-subtitle]').textContent = result.subtitle || '';
153
199
 
@@ -188,7 +234,8 @@
188
234
  details.hidden = !technicalText;
189
235
  technical.textContent = technicalText;
190
236
  closeMenu(instance);
191
- openFloating(instance, root, 560);
237
+ openFloating(instance, root, 400);
238
+ if (wasHidden) root.querySelector('[data-diagnostics-result-close]')?.focus({ preventScroll: true });
192
239
  }
193
240
 
194
241
  // Keep DOM ownership (theme, locale and callbacks), but render above clipping
@@ -237,12 +284,20 @@
237
284
  if (!(width > 0 && height > 0)) return;
238
285
  const margin = 12;
239
286
  const gap = 8;
240
- const leftEdge = (viewport?.offsetLeft || 0) + margin;
241
- const topEdge = (viewport?.offsetTop || 0) + margin;
242
- const rightEdge = leftEdge + Math.max(0, width - margin * 2);
243
- const bottomEdge = topEdge + Math.max(0, height - margin * 2);
244
- element.style.width = `${Math.min(preferredWidth, Math.max(0, width - margin * 2))}px`;
245
- element.style.maxHeight = `${Math.min(640, Math.max(0, height - margin * 2))}px`;
287
+ const viewportLeft = viewport?.offsetLeft || 0;
288
+ const viewportTop = viewport?.offsetTop || 0;
289
+ const panel = instance.container.closest?.('#codex-overleaf-panel')?.getBoundingClientRect?.();
290
+ const leftEdge = Math.max(viewportLeft, panel?.left ?? viewportLeft) + margin;
291
+ const topEdge = Math.max(viewportTop, panel?.top ?? viewportTop) + margin;
292
+ const rightEdge = Math.min(viewportLeft + width, panel?.right ?? viewportLeft + width) - margin;
293
+ const bottomEdge = Math.min(viewportTop + height, panel?.bottom ?? viewportTop + height) - margin;
294
+ if (rightEdge <= leftEdge || bottomEdge <= topEdge) {
295
+ closeMenu(instance);
296
+ closeResult(instance);
297
+ return;
298
+ }
299
+ element.style.width = `${Math.min(preferredWidth, rightEdge - leftEdge)}px`;
300
+ element.style.maxHeight = `${Math.min(480, bottomEdge - topEdge)}px`;
246
301
  const anchor = button.getBoundingClientRect();
247
302
  const bounds = element.getBoundingClientRect();
248
303
  const below = Math.max(0, bottomEdge - anchor.bottom - gap);
@@ -307,9 +362,11 @@
307
362
  list.className = 'codex-diagnostics-checks';
308
363
  for (const check of checks) {
309
364
  if (!check) continue;
310
- const row = document.createElement('div');
365
+ const row = document.createElement('details');
311
366
  row.className = 'codex-diagnostics-check';
312
367
  row.dataset.status = healthBucket(check.status);
368
+ row.open = row.dataset.status === 'warn' || row.dataset.status === 'fail';
369
+ const heading = document.createElement('summary');
313
370
 
314
371
  const glyph = document.createElement('span');
315
372
  glyph.className = 'codex-diagnostics-check-glyph';
@@ -320,7 +377,7 @@
320
377
  const title = document.createElement('div');
321
378
  title.className = 'codex-diagnostics-check-title';
322
379
  title.textContent = check.title || '';
323
- textWrap.append(title);
380
+ heading.append(glyph, title);
324
381
  if (check.summary) {
325
382
  const summary = document.createElement('div');
326
383
  summary.className = 'codex-diagnostics-check-summary';
@@ -334,7 +391,7 @@
334
391
  textWrap.append(next);
335
392
  }
336
393
 
337
- row.append(glyph, textWrap);
394
+ row.append(heading, textWrap);
338
395
  list.append(row);
339
396
  }
340
397
  container.append(list);
@@ -358,6 +415,7 @@
358
415
  return;
359
416
  }
360
417
  closeMenu(instance);
418
+ closeResult(instance);
361
419
  }, true);
362
420
  listen(doc, 'keydown', event => {
363
421
  if (event.key !== 'Escape') return;
@@ -374,7 +432,7 @@
374
432
  const reposition = () => {
375
433
  frame = null;
376
434
  positionFloating(instance, instance.container.querySelector('[data-diagnostics-popover]'), 300);
377
- positionFloating(instance, instance.container.querySelector('[data-diagnostics-result]'), 560);
435
+ positionFloating(instance, instance.container.querySelector('[data-diagnostics-result]'), 400);
378
436
  };
379
437
  const schedule = () => {
380
438
  if (frame !== null) return;
@@ -592,6 +650,7 @@
592
650
  closeResult,
593
651
  showLoading,
594
652
  showResult,
653
+ refreshLocale,
595
654
  uniqueContentSignatures
596
655
  };
597
656
  })();
@@ -103,13 +103,13 @@
103
103
  const acceptHunkBtn = document.createElement('button');
104
104
  acceptHunkBtn.type = 'button';
105
105
  acceptHunkBtn.setAttribute('data-diff-hunk-accept', '');
106
- acceptHunkBtn.textContent = '✓';
106
+ acceptHunkBtn.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>';
107
107
  acceptHunkBtn.title = tr('diffHunkAccept');
108
108
  acceptHunkBtn.setAttribute('aria-label', tr('diffHunkAccept'));
109
109
  const rejectHunkBtn = document.createElement('button');
110
110
  rejectHunkBtn.type = 'button';
111
111
  rejectHunkBtn.setAttribute('data-diff-hunk-reject', '');
112
- rejectHunkBtn.textContent = '✗';
112
+ rejectHunkBtn.innerHTML = '<svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m4 4 8 8M12 4l-8 8"/></svg>';
113
113
  rejectHunkBtn.title = tr('diffHunkReject');
114
114
  rejectHunkBtn.setAttribute('aria-label', tr('diffHunkReject'));
115
115
  const jumpHunkBtn = document.createElement('button');
@@ -619,13 +619,13 @@
619
619
  const acceptBtn = document.createElement('button');
620
620
  acceptBtn.type = 'button';
621
621
  acceptBtn.dataset.diffAccept = '';
622
- acceptBtn.textContent = '✓';
622
+ acceptBtn.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>';
623
623
  acceptBtn.title = tr('diffAccept');
624
624
  acceptBtn.setAttribute('aria-label', tr('diffAccept'));
625
625
  const rejectBtn = document.createElement('button');
626
626
  rejectBtn.type = 'button';
627
627
  rejectBtn.dataset.diffReject = '';
628
- rejectBtn.textContent = '✗';
628
+ rejectBtn.innerHTML = '<svg class="codex-glyph" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="m4 4 8 8M12 4l-8 8"/></svg>';
629
629
  rejectBtn.title = tr('diffReject');
630
630
  rejectBtn.setAttribute('aria-label', tr('diffReject'));
631
631
 
@@ -775,7 +775,10 @@
775
775
  title,
776
776
  status: 'completed'
777
777
  });
778
- const { container } = createDiffReviewElement(visibleChanges, { readonly: true });
778
+ // Written changes are a receipt, not a review: one folded row per file.
779
+ const container = typeof deps.renderWrittenChanges === 'function'
780
+ ? deps.renderWrittenChanges(visibleChanges)
781
+ : createDiffReviewElement(visibleChanges, { readonly: true }).container;
779
782
  events = getRunEvents() || events;
780
783
  events.append(container);
781
784
  scrollLogToBottom();
@@ -0,0 +1,54 @@
1
+ (function (root, factory) {
2
+ if (typeof module === 'object' && module.exports) module.exports = factory(require('../shared/directoryCleanupProof'));
3
+ else root.CodexOverleafModuleRegistry.define('DirectoryCleanupRecovery', ['DirectoryCleanupProof'], factory);
4
+ })(typeof globalThis !== 'undefined' ? globalThis : window, function (Proof) {
5
+ 'use strict';
6
+ function collect(result) {
7
+ const proofs = [], seen = new Set();
8
+ const safePath = path => typeof path === 'string' && path && path.trim() === path
9
+ && !/[\\\u0000-\u001f\u007f]/.test(path) && !path.startsWith('/') && !/^[A-Za-z]:/.test(path)
10
+ && !path.split('/').some(part => !part || part === '.' || part === '..');
11
+ function visit(value) {
12
+ if (!value || typeof value !== 'object' || seen.has(value)) return;
13
+ seen.add(value);
14
+ if (Array.isArray(value)) { value.forEach(visit); return; }
15
+ const operation = value.operation, detail = value.result;
16
+ if (operation && detail && safePath(operation.path)) {
17
+ const remaining = Array.isArray(detail.directoryCleanup?.remaining) ? detail.directoryCleanup.remaining
18
+ : detail.ok !== true && Array.isArray(detail.createdDirectories) ? detail.createdDirectories : [];
19
+ // Forward moves may create destination parents; inverse moves can
20
+ // leave source parents behind. Other operations authorize path only.
21
+ const targets = [operation.path, ...(operation.type === 'move' && safePath(operation.to) ? [operation.to] : [])];
22
+ for (const proof of remaining) if (safePath(proof?.path)
23
+ && targets.some(target => target.startsWith(proof.path + '/'))) proofs.push(proof);
24
+ }
25
+ for (const field of ['applied', 'skipped']) visit(value[field]);
26
+ }
27
+ visit(result);
28
+ return proofs;
29
+ }
30
+ function create(deps) {
31
+ const scope = () => ({ projectId: deps.getProjectId(), accountScopeId: deps.getAccountScopeId(), generation: deps.getRouteGeneration?.() });
32
+ function capture(target, result) {
33
+ const directories = collect(result);
34
+ if (!directories.length || !target?.recordId) return null;
35
+ const captured = scope(), owner = { ...captured, sessionId: target.sessionId, runId: target.recordId };
36
+ if (!captured.accountScopeId || !captured.projectId || target.runProjectId !== captured.projectId
37
+ || (target.runAccountScopeId && target.runAccountScopeId !== captured.accountScopeId)) return null;
38
+ const record = deps.findRunRecord(owner.runId, owner.sessionId);
39
+ if (!record || record.runProjectId !== owner.projectId || record.forkSnapshot) return null;
40
+ const next = Proof.merge(owner, record.pendingDirectoryCleanup, directories);
41
+ if (!next) {
42
+ // These passive observations never hold a verified file result hostage.
43
+ // Preserve older evidence and report the omission in existing run details.
44
+ deps.onOmitted?.(owner.runId, 'directory_cleanup_capacity_exceeded');
45
+ return null;
46
+ }
47
+ record.pendingDirectoryCleanup = next;
48
+ deps.refresh?.(owner.runId);
49
+ return { owner, value: next };
50
+ }
51
+ return { capture };
52
+ }
53
+ return { create, collect };
54
+ });