codex-overleaf-link 2.4.0 → 2.5.0

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 (327) hide show
  1. package/README.md +272 -311
  2. package/README.zh-CN.md +287 -326
  3. package/extension/bootstrap/background.js +47 -10
  4. package/extension/bootstrap/manifest.template.json +9 -4
  5. package/extension/bootstrap/popup.html +10 -16
  6. package/extension/bootstrap/update.js +25 -2
  7. package/extension/runtime-manifest.json +3 -1
  8. package/extension/src/background.js +28 -3
  9. package/extension/src/backgroundSharedSessions.js +380 -0
  10. package/extension/src/backgroundUpdateCoordinator.js +442 -379
  11. package/extension/src/content/activeTurnControl.js +8 -0
  12. package/extension/src/content/assetTransferBroker.js +186 -12
  13. package/extension/src/content/changeHistoryView.js +175 -0
  14. package/extension/src/content/composerAttachments.js +24 -22
  15. package/extension/src/content/composerPanel.js +23 -8
  16. package/extension/src/content/contentRuntime.js +572 -571
  17. package/extension/src/content/diagnosticsController.js +1 -2
  18. package/extension/src/content/diagnosticsExport.js +222 -0
  19. package/extension/src/content/diagnosticsPanel.js +48 -19
  20. package/extension/src/content/diffReviewPanel.js +8 -5
  21. package/extension/src/content/generated/content.bundle.js +8974 -1781
  22. package/extension/src/content/generated/content.bundle.meta.json +22 -3
  23. package/extension/src/content/legacyGlobalRegistry.js +19 -1
  24. package/extension/src/content/localSkillsPanel.js +42 -7
  25. package/extension/src/content/markdownDomRenderer.js +9 -4
  26. package/extension/src/content/modelPicker.js +1 -1
  27. package/extension/src/content/pageBridgeClient.js +18 -3
  28. package/extension/src/content/panelMaintenance.js +51 -120
  29. package/extension/src/content/panelRenderer.js +4 -0
  30. package/extension/src/content/pendingInputView.js +109 -76
  31. package/extension/src/content/providerSettingsCoordinator.js +17 -6
  32. package/extension/src/content/providerSettingsDialog.js +661 -108
  33. package/extension/src/content/recentProjects.js +364 -356
  34. package/extension/src/content/runActivitySummary.js +631 -0
  35. package/extension/src/content/runController.js +3 -1
  36. package/extension/src/content/runFailureNotice.js +14 -1
  37. package/extension/src/content/runGuidanceController.js +4 -3
  38. package/extension/src/content/runPresence.js +306 -0
  39. package/extension/src/content/runQueueScheduler.js +2 -1
  40. package/extension/src/content/runResultActions.js +123 -3
  41. package/extension/src/content/runTimelineView.js +194 -164
  42. package/extension/src/content/scopedPersistenceCoordinator.js +2 -1
  43. package/extension/src/content/scopedPersistencePanelState.js +45 -2
  44. package/extension/src/content/selectionContextView.js +300 -0
  45. package/extension/src/content/sessionPersistence.js +10 -2
  46. package/extension/src/content/settingsPanel.js +93 -54
  47. package/extension/src/content/settingsWorkbench.js +374 -0
  48. package/extension/src/content/sharedSessionViewSync.js +72 -0
  49. package/extension/src/content/subagentActivityView.js +195 -0
  50. package/extension/src/content/trackedChangeCaptureController.js +7 -3
  51. package/extension/src/content/updateNotice.js +121 -50
  52. package/extension/src/content/writebackController.js +257 -0
  53. package/extension/src/content/writebackOrchestrator.js +146 -141
  54. package/extension/src/content/writebackPlan.js +231 -0
  55. package/extension/src/content/writebackRecovery.js +122 -0
  56. package/extension/src/content/writingStyleSettings.js +576 -0
  57. package/extension/src/content/writtenChangesView.js +152 -0
  58. package/extension/src/page/binaryAssetUploader.js +97 -19
  59. package/extension/src/page/overleafProjectSnapshot.js +1 -0
  60. package/extension/src/page/referenceProjects.js +148 -0
  61. package/extension/src/page/saveState.js +58 -3
  62. package/extension/src/page/snapshotRouter.js +44 -13
  63. package/extension/src/page/textCoordinates.js +102 -0
  64. package/extension/src/page/textFileCreator.js +350 -59
  65. package/extension/src/page/trackedChangeCapture.js +42 -56
  66. package/extension/src/page/trackedChangeOwnership.js +198 -0
  67. package/extension/src/page/trackedChangeReplay.js +164 -0
  68. package/extension/src/page/trackedChangesLifecycle.js +139 -150
  69. package/extension/src/page/treeOperations.js +36 -29
  70. package/extension/src/page/writebackReceiptJournal.js +112 -0
  71. package/extension/src/page/writebackRouter.js +176 -136
  72. package/extension/src/pageBridge.js +59 -101
  73. package/extension/src/popup.js +203 -59
  74. package/extension/src/shared/agentTranscript.js +18 -4
  75. package/extension/src/shared/auditRecords.js +71 -0
  76. package/extension/src/shared/changeHistoryModel.js +94 -0
  77. package/extension/src/shared/compatibility.js +1 -1
  78. package/extension/src/shared/compileAdapter.js +42 -0
  79. package/extension/src/shared/failureReasons.js +20 -0
  80. package/extension/src/shared/globalPreferences.js +1 -1
  81. package/extension/src/shared/i18n.js +187 -65
  82. package/extension/src/shared/managedUpdateProjection.js +6 -3
  83. package/extension/src/shared/pageRpcContract.js +7 -1
  84. package/extension/src/shared/providerProfiles.js +109 -0
  85. package/extension/src/shared/runActivityModel.js +361 -0
  86. package/extension/src/shared/runExecutionSnapshot.js +8 -2
  87. package/extension/src/shared/runExecutionSnapshotCodec.js +16 -4
  88. package/extension/src/shared/scopedPersistenceBrowserAdapter.js +6 -3
  89. package/extension/src/shared/selectionContext.js +28 -0
  90. package/extension/src/shared/sessionState.js +97 -6
  91. package/extension/src/shared/sharedSessionBridge.js +288 -0
  92. package/extension/src/shared/storageDb.js +23 -55
  93. package/extension/src/shared/storageMigration.js +3 -0
  94. package/extension/src/shared/storageRunActions.js +54 -4
  95. package/extension/src/shared/storageValuePruning.js +40 -0
  96. package/extension/src/shared/subagentActivityModel.js +174 -0
  97. package/extension/src/shared/undoOperations.js +87 -0
  98. package/extension/src/shared/updateConsent.js +37 -8
  99. package/extension/src/shared/writebackIntent.js +62 -0
  100. package/extension/src/shared/writebackSettlement.js +29 -10
  101. package/extension/src/shared/writingStyle.js +33 -0
  102. package/extension/styles/panel.css +2136 -744
  103. package/extension/styles/popup.css +110 -0
  104. package/native-host/src/anthropicBridgeRequest.js +2 -1
  105. package/native-host/src/codexModelRecovery.js +107 -0
  106. package/native-host/src/codexPromptAssembly.js +2 -0
  107. package/native-host/src/codexProviderLaunch.js +3 -3
  108. package/native-host/src/codexRuntimeIdentity.js +1 -0
  109. package/native-host/src/codexSessionRunner.js +146 -177
  110. package/native-host/src/codexSessionTiming.js +71 -0
  111. package/native-host/src/managedInstall.js +5 -4
  112. package/native-host/src/nativeEnvironment.js +70 -0
  113. package/native-host/src/nativeQuotas.js +15 -8
  114. package/native-host/src/overleafWorkspaceRules.js +16 -0
  115. package/native-host/src/processStopBarrier.js +80 -0
  116. package/native-host/src/providerModelCatalog.js +4 -3
  117. package/native-host/src/providerProfile.js +13 -1
  118. package/native-host/src/providerReasoning.js +9 -5
  119. package/native-host/src/providerStore.js +4 -0
  120. package/native-host/src/readProgressGuard.js +84 -17
  121. package/native-host/src/releaseTransport.js +14 -5
  122. package/native-host/src/selectionScope.js +58 -0
  123. package/native-host/src/skills/parallel-subagents/SKILL.md +31 -3
  124. package/native-host/src/skills/writing-style-builder/SKILL.md +146 -0
  125. package/native-host/src/subagentBroker.js +102 -98
  126. package/native-host/src/subagentTelemetry.js +316 -0
  127. package/native-host/src/subagentWorkspace.js +103 -0
  128. package/native-host/src/subagentWorkspacePath.js +31 -0
  129. package/native-host/src/taskRunnerRuntime.js +55 -5
  130. package/native-host/src/turnAttachments.js +113 -0
  131. package/native-host/src/updateManager.js +122 -12
  132. package/native-host/src/updateNetworkControl.js +75 -0
  133. package/native-host/src/updateTrust.js +21 -2
  134. package/native-host/src/vendor/pdfjs/LICENSE +177 -0
  135. package/native-host/src/vendor/pdfjs/SOURCE.txt +3 -0
  136. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  137. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  138. package/native-host/src/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
  139. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  140. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  141. package/native-host/src/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
  142. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  143. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  144. package/native-host/src/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  145. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  146. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  147. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  148. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  149. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  150. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  151. package/native-host/src/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
  152. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  153. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  154. package/native-host/src/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
  155. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  156. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  157. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  158. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  159. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  160. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  161. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  162. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  163. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  164. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  165. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  166. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  167. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  168. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  169. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  170. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  171. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  172. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  173. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  174. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  175. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  176. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  177. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  178. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  179. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  180. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  181. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  182. package/native-host/src/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
  183. package/native-host/src/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
  184. package/native-host/src/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  185. package/native-host/src/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  186. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  187. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  188. package/native-host/src/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  189. package/native-host/src/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  190. package/native-host/src/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  191. package/native-host/src/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  192. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  193. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  194. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  195. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  196. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  197. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  198. package/native-host/src/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
  199. package/native-host/src/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
  200. package/native-host/src/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
  201. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  202. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  203. package/native-host/src/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
  204. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  205. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  206. package/native-host/src/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
  207. package/native-host/src/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
  208. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  209. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  210. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  211. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  212. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  213. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  214. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  215. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  216. package/native-host/src/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
  217. package/native-host/src/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
  218. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  219. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  220. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  221. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  222. package/native-host/src/vendor/pdfjs/cmaps/H.bcmap +0 -0
  223. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  224. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  225. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  226. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  227. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  228. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  229. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  230. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  231. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  232. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  233. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  234. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  235. package/native-host/src/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
  236. package/native-host/src/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
  237. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  238. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  239. package/native-host/src/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
  240. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  241. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  242. package/native-host/src/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
  243. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  244. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  245. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  246. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  247. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  248. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  249. package/native-host/src/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
  250. package/native-host/src/vendor/pdfjs/cmaps/LICENSE +36 -0
  251. package/native-host/src/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
  252. package/native-host/src/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
  253. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  254. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  255. package/native-host/src/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
  256. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  257. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  258. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  259. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  260. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  261. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  262. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  263. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  264. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  265. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  266. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  267. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  268. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  269. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  270. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  271. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  272. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  273. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  274. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  275. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  276. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  277. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  278. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  279. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  280. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  281. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  282. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  283. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  284. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  285. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  286. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  287. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  288. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  289. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  290. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  291. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  292. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  293. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  294. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  295. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  296. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  297. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  298. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  299. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  300. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  301. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  302. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  303. package/native-host/src/vendor/pdfjs/cmaps/V.bcmap +0 -0
  304. package/native-host/src/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  305. package/native-host/src/vendor/pdfjs/pdf.mjs +26740 -0
  306. package/native-host/src/vendor/pdfjs/pdf.worker.mjs +62201 -0
  307. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  308. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  309. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  310. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  311. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  312. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  313. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  314. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  315. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  316. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  317. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  318. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
  319. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  320. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  321. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  322. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  323. package/native-host/src/writingStyleEvidence.js +102 -0
  324. package/native-host/src/writingStylePdfWorker.js +35 -0
  325. package/native-host/src/writingStyleProfile.js +165 -0
  326. package/native-host/src/writingStyleRuntime.js +447 -0
  327. package/package.json +1 -1
@@ -372,6 +372,7 @@
372
372
  status: 'running',
373
373
  streamKey: getCodexStreamKey(method, params),
374
374
  streamRole: method === 'item/agentMessage/delta' ? 'assistant' : 'reasoning',
375
+ streamPhase: params.phase || '',
375
376
  appendText: true
376
377
  };
377
378
  }
@@ -412,12 +413,13 @@
412
413
  };
413
414
  }
414
415
  if (method === 'warning' || method === 'guardianWarning' || method === 'configWarning') {
415
- const title = cleanVisibleText(params.message || params.warning || '');
416
+ const title = cleanVisibleText(params.message || params.warning || params.summary || '');
417
+ if (!title) return technicalOnly(event, locale);
416
418
  return {
417
419
  kind: 'activity',
418
420
  visible: true,
419
- title: title || textFor(locale, 'Codex 返回了一条运行提示。', 'Codex returned a runtime notice.'),
420
- status: 'running',
421
+ title,
422
+ status: event.status === 'failed' ? 'failed' : method === 'guardianWarning' ? 'warning' : 'info',
421
423
  technicalDetail: normalizeRawEvent(event)
422
424
  };
423
425
  }
@@ -459,6 +461,7 @@
459
461
  status,
460
462
  streamKey: getItemStreamKey('agent', item),
461
463
  streamRole: 'assistant',
464
+ streamPhase: item.phase || '',
462
465
  replaceText: true
463
466
  };
464
467
  }
@@ -500,6 +503,10 @@
500
503
  status,
501
504
  detail: {
502
505
  command: item.command,
506
+ itemId: item.id,
507
+ threadId: event.detail?.params?.threadId,
508
+ turnId: event.detail?.params?.turnId,
509
+ commandActions: item.commandActions,
503
510
  output: item.aggregatedOutput,
504
511
  exitCode: item.exitCode
505
512
  }
@@ -863,6 +870,11 @@
863
870
  : textFor(locale, '本轮没有可撤销的写入', 'this run has no reversible writes');
864
871
  }
865
872
 
873
+ if (input.saveVerification && input.saveVerification.state !== 'not_checked') {
874
+ report.saveState = input.saveVerification.state === 'verified_saved'
875
+ ? textFor(locale, '已确认保存', 'Saved')
876
+ : textFor(locale, '待确认,可检查保存状态', 'Pending confirmation; check save status');
877
+ }
866
878
  const failed = input.status === 'failed' || input.status === 'blocked';
867
879
  return {
868
880
  title: textFor(locale, '本轮完成报告', 'Task report'),
@@ -946,6 +958,7 @@
946
958
  });
947
959
  }
948
960
 
961
+ if (report.saveState) meta.push({ key: 'saveState', label: textFor(locale, '保存', 'Save'), value: report.saveState });
949
962
  return { conclusion, body: bodySections.join('\n\n'), meta };
950
963
  }
951
964
 
@@ -976,6 +989,7 @@
976
989
  if (nextStep) {
977
990
  sections.push(textFor(locale, `下一步:${nextStep}`, `Next: ${nextStep}`));
978
991
  }
992
+ if (report.saveState) sections.push(textFor(locale, `保存:${report.saveState}`, `Save: ${report.saveState}`));
979
993
  return sections.join('\n\n');
980
994
  }
981
995
 
@@ -1045,7 +1059,7 @@
1045
1059
  if (input.mode === 'ask' || input.status === '只问不改') {
1046
1060
  return textFor(locale, '这轮是只问不改。', 'This run was Ask mode.');
1047
1061
  }
1048
- if (input.status === 'rejected') {
1062
+ if (input.status === 'cancelled' || input.status === 'rejected') {
1049
1063
  return textFor(locale, '你取消了这轮修改。', 'You cancelled this change.');
1050
1064
  }
1051
1065
  return '';
@@ -75,6 +75,7 @@
75
75
  mirror: summarizeMirror(input.mirror),
76
76
  auditLogs: summarizeAuditLogList(input.auditLogs),
77
77
  run: summarizeRun(input.run),
78
+ ...(Array.isArray(input.recentRuns) ? { recentRuns: input.recentRuns.slice(0, 8).map(summarizeRun) } : {}),
78
79
  governance: summarizeGovernance(input.governance),
79
80
  projectIdHash: hashString(stringField(input.projectId))
80
81
  };
@@ -272,9 +273,22 @@
272
273
  }
273
274
 
274
275
  function summarizeRun(run = {}) {
276
+ run = run && typeof run === 'object' && !Array.isArray(run) ? run : {};
277
+ const captures = Array.isArray(run.trackedChangeCaptures) ? run.trackedChangeCaptures : [];
275
278
  return removeEmptySummaryFields({
276
279
  id: redactSecretLikeText(stringField(run.id)),
277
280
  status: redactSecretLikeText(stringField(run.status)),
281
+ startedAt: redactSecretLikeText(stringField(run.startedAt)),
282
+ finishedAt: redactSecretLikeText(stringField(run.finishedAt)),
283
+ requireReviewing: typeof run.executionSnapshot?.requireReviewing === 'boolean'
284
+ ? run.executionSnapshot.requireReviewing : undefined,
285
+ trackedChangeStatus: diagnosticToken(run.trackedChangeStatus),
286
+ undoStatus: diagnosticToken(run.undoStatus),
287
+ appliedOperationCount: Array.isArray(run.appliedOperations) ? run.appliedOperations.length : undefined,
288
+ undoTrackedChangeCount: Array.isArray(run.undoTrackedChanges) ? run.undoTrackedChanges.length : undefined,
289
+ captureCount: Array.isArray(run.trackedChangeCaptures) ? captures.length : undefined,
290
+ capturesTruncated: captures.length > 20 ? true : undefined,
291
+ trackedChangeCaptures: captures.slice(0, 20).map(summarizeTrackedCapture),
278
292
  errorCode: redactSecretLikeText(stringField(run.errorCode)),
279
293
  errorCategory: categorizeError(run.errorCode || run.message || run.error),
280
294
  events: (Array.isArray(run.events) ? run.events : []).map(event => removeEmptyFields({
@@ -287,6 +301,63 @@
287
301
  });
288
302
  }
289
303
 
304
+ // Export only proof metadata, never document text, prompts, labels or raw IDs.
305
+ function diagnosticToken(value) {
306
+ const text = redactSecretLikeText(stringField(value));
307
+ return /^[a-z][a-z0-9_]{0,79}$/.test(text) ? text : undefined;
308
+ }
309
+
310
+ function diagnosticNumbers(value, keys) {
311
+ const source = value && typeof value === 'object' ? value : {};
312
+ const result = {};
313
+ for (const key of keys) {
314
+ if (Number.isSafeInteger(source[key]) && source[key] >= 0) result[key] = source[key];
315
+ }
316
+ return result;
317
+ }
318
+
319
+ function diagnosticFingerprint(value) {
320
+ return typeof value === 'string' && /^\d{1,16}:[a-f0-9]{1,8}:[a-f0-9]{1,8}$/.test(value)
321
+ ? value : undefined;
322
+ }
323
+
324
+ function summarizeTrackedCapture(value) {
325
+ const capture = value && typeof value === 'object' && !Array.isArray(value) ? value : {};
326
+ const before = Array.isArray(capture.before) ? capture.before : [];
327
+ const refs = Array.isArray(capture.refs) ? capture.refs : [];
328
+ const ranges = Array.isArray(capture.ranges) ? capture.ranges : [];
329
+ const diagnostics = capture.diagnostics || {};
330
+ const refSummary = ref => removeEmptySummaryFields({
331
+ idHash: stringField(ref?.id) ? hashString(ref.id) : undefined,
332
+ kind: diagnosticToken(ref?.kind),
333
+ ...diagnosticNumbers(ref, ['from', 'to', 'textLength']),
334
+ textHash: diagnosticFingerprint(ref?.textHash)
335
+ });
336
+ return removeEmptySummaryFields({
337
+ pathHash: stringField(capture.path) ? hashString(capture.path) : undefined,
338
+ nativeDocIdHash: stringField(capture.nativeDocId) ? hashString(capture.nativeDocId) : undefined,
339
+ state: diagnosticToken(capture.state), reason: diagnosticToken(capture.reason),
340
+ source: diagnosticToken(capture.source),
341
+ ...diagnosticNumbers(capture, ['startedAt', 'expiresAt']),
342
+ expectedFingerprint: diagnosticFingerprint(capture.expected),
343
+ beforeCount: before.length, refCount: refs.length, rangeCount: ranges.length,
344
+ truncated: before.length > 1200 || refs.length > 1200 || ranges.length > 1000 ? true : undefined,
345
+ before: before.slice(0, 1200).map(refSummary),
346
+ refs: refs.slice(0, 1200).map(refSummary),
347
+ ranges: ranges.slice(0, 1000).map(range => removeEmptySummaryFields({
348
+ ...diagnosticNumbers(range, ['from', 'to', 'start', 'end', 'removedLength']),
349
+ removedHash: diagnosticFingerprint(range?.removedHash)
350
+ })),
351
+ diagnostics: removeEmptySummaryFields({
352
+ ...diagnosticNumbers(diagnostics, ['beforeCount', 'afterCount', 'capturedCount',
353
+ 'filteredCount', 'polls', 'elapsedMs', 'waitMs']),
354
+ reason: diagnosticToken(diagnostics.reason),
355
+ source: diagnosticToken(diagnostics.source),
356
+ sourceReason: diagnosticToken(diagnostics.sourceReason)
357
+ })
358
+ });
359
+ }
360
+
290
361
  function summarizeGovernance(rules = {}) {
291
362
  return {
292
363
  readonlyPatternCount: Array.isArray(rules.readonlyPatterns) ? rules.readonlyPatterns.length : 0,
@@ -0,0 +1,94 @@
1
+ (function initChangeHistoryModel(root, factory) {
2
+ if (typeof module === 'object' && module.exports) {
3
+ module.exports = factory(require('./settlementFacts'), require('./sessionState'));
4
+ } else root.CodexOverleafModuleRegistry.define('ChangeHistoryModel', ['SettlementFacts', 'SessionState'], factory);
5
+ })(typeof globalThis !== 'undefined' ? globalThis : window, function changeHistoryModelFactory(SettlementFacts, SessionState) {
6
+ 'use strict';
7
+ const array = value => Array.isArray(value) ? value : [];
8
+ const text = value => typeof value === 'string' ? value : '';
9
+ const opaque = value => /^\[.*(?:omitted|redacted|chars=\d+|hash=).*?\]$/i.test(text(value).trim());
10
+
11
+ function project(records, options = {}) {
12
+ const { projectId, accountScopeId } = options;
13
+ if (!projectId || !accountScopeId) return [];
14
+ const sanitize = options.sanitizeText || text;
15
+ const safe = value => text(sanitize(text(value))).trim();
16
+ const sessions = new Map();
17
+ const live = new Map();
18
+ for (const session of array(options.storedSessions)) {
19
+ if (session?.projectId === projectId && session.accountScopeId === accountScopeId) sessions.set(session.id, session);
20
+ }
21
+ // In-memory sessions already passed the runtime's account/project hydrate
22
+ // boundary. Their review state is newer than the persisted audit snapshot.
23
+ for (const session of array(options.sessions)) {
24
+ if (!session?.id) continue;
25
+ const prior = sessions.get(session.id);
26
+ const runs = new Map(array(prior?.runs).map(run => [run.id, run]));
27
+ const current = session.id === options.activeSessionId ? array(options.activeRuns) : array(session.runs);
28
+ for (const run of current) if (run?.id) runs.set(run.id, run);
29
+ sessions.set(session.id, { ...prior, ...session, runs: [...runs.values()] });
30
+ live.set(session.id, new Set(current.filter(run => run?.id && (!run.runProjectId || run.runProjectId === projectId)).map(run => run.id)));
31
+ }
32
+ function path(value) {
33
+ const raw = text(value).replace(/\\/g, '/').replace(/^\.\//, '');
34
+ if (/(^|\/)\.codex-overleaf-(subagents|attachments)(\/|$)/.test(raw)) return '';
35
+ const result = safe(raw);
36
+ if (!result || /^\[.*\]$/.test(result)) return '';
37
+ return result.slice(0, 320);
38
+ }
39
+ const seen = new Set();
40
+ return array(records).filter(record => record?.projectId === projectId
41
+ && (!record.accountScopeId || record.accountScopeId === accountScopeId)
42
+ && sessions.has(record.sessionId))
43
+ .slice().sort((a, b) => String(b.createdAt || '').localeCompare(String(a.createdAt || '')))
44
+ .filter(record => {
45
+ const key = JSON.stringify([record.sessionId, record.turnId || record.id]);
46
+ if (seen.has(key)) return false;
47
+ seen.add(key); return true;
48
+ }).slice(0, 50).map(record => {
49
+ const session = sessions.get(record.sessionId);
50
+ const candidate = array(session.runs).find(run => run.id === record.turnId);
51
+ const run = candidate && (!candidate.runProjectId || candidate.runProjectId === projectId) ? candidate : null;
52
+ const facts = SettlementFacts.compactSettlementFacts(run?.settlement || run?.settlementFacts || {});
53
+ const projection = run ? SettlementFacts.projectRunSettlement(run) : null;
54
+ const applied = array(record.appliedFiles).filter(file => path(typeof file === 'string' ? file : file?.path));
55
+ const review = text(run?.trackedChangeStatus);
56
+ const hasWrites = applied.length > 0 || run?.changedDocument === true
57
+ || ['changed', 'possibly-changed'].includes(facts.documentEffect)
58
+ || ['pending', 'accepted', 'rejected', 'needs_review'].includes(review)
59
+ || run?.undoStatus === 'applied';
60
+ let files = applied.slice();
61
+ files.push(...facts.fileSettlements.filter(file => ['complete', 'partial'].includes(file.applied)
62
+ || ['changed', 'possibly-changed'].includes(file.documentEffect)));
63
+ if (!files.length && hasWrites) files = array(record.changedFiles);
64
+ const paths = [...new Set(files.flatMap(file => typeof file === 'string'
65
+ ? [path(file)] : [path(file?.path), path(file?.destinationPath)]).filter(Boolean))];
66
+ const unsafeSave = record.saveVerification?.ok === false
67
+ || ['failed', 'unavailable'].includes(record.saveVerification?.state);
68
+ let status;
69
+ if (review === 'accepted') status = 'accepted';
70
+ else if (review === 'rejected' || run?.undoStatus === 'applied') status = 'undone';
71
+ else if (review === 'needs_review' || projection?.terminalState === 'needs_review'
72
+ || facts.documentEffect === 'possibly-changed'
73
+ || ['partial', 'needs-review'].includes(facts.evidence.settled)
74
+ || hasWrites && (unsafeSave || ['failed', 'interrupted', 'needs_review_after_navigation'].includes(run?.status))) status = 'attention';
75
+ else if (run?.status === 'running' || record.resultStatus === 'draft' && !record.completedAt) status = 'running';
76
+ else if (review === 'pending') status = 'pending';
77
+ else if (!hasWrites) status = 'unchanged';
78
+ else status = run ? 'written' : 'unknown';
79
+ const suppliedSummary = safe(run?.safeTaskSummary || '');
80
+ const summary = suppliedSummary && !opaque(suppliedSummary)
81
+ ? SessionState.computeSafeTaskSummary(suppliedSummary) : '';
82
+ // Audit promptSummary deliberately stores a privacy marker. Never
83
+ // recover it, render it, or turn it into an apparent task summary.
84
+ return {
85
+ key: JSON.stringify([record.sessionId, record.turnId || record.id]),
86
+ projectId, accountScopeId, sessionId: record.sessionId, turnId: record.turnId,
87
+ createdAt: text(record.createdAt), paths, hasWrites, status, summary,
88
+ operation: paths.length === 1 ? text(files[0]?.type) : '',
89
+ canJump: Boolean(run && live.get(record.sessionId)?.has(record.turnId))
90
+ };
91
+ });
92
+ }
93
+ return { project };
94
+ });
@@ -12,7 +12,7 @@
12
12
  const MIN_NATIVE_VERSION = '1.0.0';
13
13
  const MIN_COMPATIBLE_NATIVE_VERSION = '1.0.0';
14
14
  const MIN_COMPATIBLE_EXTENSION_VERSION = '1.0.0';
15
- const BUILD_TARGET_VERSION = '2.4.0';
15
+ const BUILD_TARGET_VERSION = '2.5.0';
16
16
  const DEFAULT_CHROME_EXTENSION_ID = 'illdpneeeopfffmiepaejglgmhpmdhdc';
17
17
  const REQUIRED_CAPABILITIES = Object.freeze([
18
18
  'bridgePing',
@@ -163,7 +163,49 @@
163
163
  return result;
164
164
  }
165
165
 
166
+ function buildPostWriteCompileSummary({ result = null, logResult = null, error = null } = {}) {
167
+ const logAvailable = logResult?.ok === true;
168
+ const errors = logAvailable && Array.isArray(logResult.errors)
169
+ ? logResult.errors.slice(0, 5).map(formatCompileDiagnosticForSummary)
170
+ : [];
171
+ const warnings = logAvailable && Array.isArray(logResult.warnings)
172
+ ? logResult.warnings.slice(0, 5).map(formatCompileDiagnosticForSummary)
173
+ : [];
174
+ if (error) {
175
+ return {
176
+ status: 'failed',
177
+ reason: error?.message || 'Post-write compile failed.',
178
+ errors,
179
+ warnings,
180
+ logAvailable
181
+ };
182
+ }
183
+ if (!result?.ok) {
184
+ return {
185
+ status: 'failed',
186
+ reason: result?.reason || 'Post-write compile did not succeed.',
187
+ errors,
188
+ warnings,
189
+ logAvailable
190
+ };
191
+ }
192
+ return {
193
+ status: result.compile?.status || 'triggered',
194
+ reason: result.reason || '',
195
+ errors,
196
+ warnings,
197
+ logAvailable
198
+ };
199
+ }
200
+
201
+ function formatCompileDiagnosticForSummary(value) {
202
+ const text = String(value || '').replace(/\s+/g, ' ').trim();
203
+ return text.length > 180 ? `${text.slice(0, 179)}...` : text;
204
+ }
205
+
166
206
  return {
207
+ buildPostWriteCompileSummary,
208
+ formatCompileDiagnosticForSummary,
167
209
  COMPILABLE_EXTENSIONS,
168
210
  MAX_LOG_BYTES,
169
211
  extractErrorBlocks,
@@ -158,6 +158,26 @@
158
158
  fallbackUserMessage: 'Create/delete/rename/move did not appear in the file tree as expected.',
159
159
  fallbackNextAction: 'Inspect the file tree and retry if needed.'
160
160
  },
161
+ source_zip_unavailable: {
162
+ stage: 'preflight', severity: 'blocked', defaultRetryable: true,
163
+ fallbackUserMessage: 'The project could not be checked before uploading this file.',
164
+ fallbackNextAction: 'Retry sync; only missing files will be uploaded.'
165
+ },
166
+ file_upload_unconfirmed: {
167
+ stage: 'verify', severity: 'warning', defaultRetryable: true,
168
+ fallbackUserMessage: 'The file was submitted, but its saved content is not yet confirmed.',
169
+ fallbackNextAction: 'Check the file before retrying; matching content will not be uploaded twice.'
170
+ },
171
+ subagent_unfinished_output: {
172
+ stage: 'preflight', severity: 'blocked', defaultRetryable: false,
173
+ fallbackUserMessage: 'A subagent stopped before finishing this file; the main agent must review and adopt it.',
174
+ fallbackNextAction: 'Have the main agent complete and adopt the pending file.'
175
+ },
176
+ subagent_unauthorized_edit: {
177
+ stage: 'preflight', severity: 'blocked', defaultRetryable: false,
178
+ fallbackUserMessage: 'A file changed outside the subagent ownership boundary and was not synced.',
179
+ fallbackNextAction: 'Review the ownership violation; it cannot be cleared through output adoption.'
180
+ },
161
181
  partial_write_needs_review: {
162
182
  stage: 'verify', severity: 'warning', defaultRetryable: false,
163
183
  fallbackUserMessage: 'Some operations wrote, some were skipped.',
@@ -112,7 +112,7 @@
112
112
  try {
113
113
  const url = new URL(sender?.tab?.url || '');
114
114
  allowed = sender.id === chromeApi.runtime.id && url.protocol === 'https:'
115
- && ['overleaf.com', 'www.overleaf.com'].includes(url.hostname)
115
+ && ['overleaf.com', 'www.overleaf.com', 'cn.overleaf.com'].includes(url.hostname)
116
116
  && /^\/project(?:\/|$)/.test(url.pathname);
117
117
  } catch (_error) { /* reject unrelated contexts */ }
118
118
  if (!allowed) {