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,231 @@
1
+ (function (root, factory) {
2
+ if (typeof module === 'object' && module.exports) module.exports = factory();
3
+ else root.CodexOverleafModuleRegistry.define('WritebackPlan', [], factory);
4
+ })(typeof globalThis !== 'undefined' ? globalThis : window, function () {
5
+ 'use strict';
6
+
7
+ // Input validation, user approval, and audit projection precede page mutation.
8
+ function create(deps = {}) {
9
+ const { tx, tr, normalizeSafeProjectPath, GovernanceRules, getGovernanceRulesForCurrentProject,
10
+ showPluginConfirm, formatOperationFiles, getAppliedEntries, getSkippedEntries } = deps;
11
+
12
+ function partitionUnsafeProjectPathOperations(operations = []) {
13
+ const safe = [];
14
+ const skipped = [];
15
+ for (const operation of operations || []) {
16
+ const normalized = normalizeOperationProjectPaths(operation);
17
+ const invalid = getInvalidOperationProjectPath(normalized);
18
+ if (invalid) {
19
+ skipped.push({
20
+ operation: normalized,
21
+ result: {
22
+ ok: false,
23
+ code: 'invalid_project_path',
24
+ reason: tx(`Invalid ${invalid}. Codex did not write this file.`, `路径无效:${invalid}。Codex 没有写入这个文件。`)
25
+ }
26
+ });
27
+ continue;
28
+ }
29
+ safe.push(normalized);
30
+ }
31
+ return { safe, skipped };
32
+ }
33
+
34
+ function normalizeOperationProjectPaths(operation = {}) {
35
+ if (!operation || typeof operation !== 'object') {
36
+ return operation;
37
+ }
38
+ const normalized = { ...operation };
39
+ if (typeof operation.path === 'string') {
40
+ normalized.path = normalizeSafeProjectPath(operation.path);
41
+ if (!normalized.path) {
42
+ normalized.invalidProjectPath = true;
43
+ }
44
+ }
45
+ if (typeof operation.to === 'string') {
46
+ normalized.to = normalizeSafeProjectPath(operation.to);
47
+ if (!normalized.to) {
48
+ normalized.invalidProjectDestinationPath = true;
49
+ }
50
+ }
51
+ if (typeof operation.destinationPath === 'string') {
52
+ normalized.destinationPath = normalizeSafeProjectPath(operation.destinationPath);
53
+ if (!normalized.destinationPath) {
54
+ normalized.invalidProjectDestinationPath = true;
55
+ }
56
+ }
57
+ return normalized;
58
+ }
59
+
60
+ function getInvalidOperationProjectPath(operation = {}) {
61
+ if (operation.invalidProjectPath || (requiresOperationPath(operation) && !operation.path)) {
62
+ return 'operation path';
63
+ }
64
+ if (operation.invalidProjectDestinationPath || (requiresOperationDestinationPath(operation) && !(operation.to || operation.destinationPath))) {
65
+ return 'operation destination path';
66
+ }
67
+ return '';
68
+ }
69
+
70
+ function requiresOperationPath(operation = {}) {
71
+ return ['edit', 'create', 'delete', 'rename', 'move', 'binary-create', 'overwrite-binary'].includes(operation.type);
72
+ }
73
+
74
+ function requiresOperationDestinationPath(operation = {}) {
75
+ return operation.type === 'rename' || operation.type === 'move';
76
+ }
77
+
78
+
79
+ function evaluateGovernedOperations(operations = []) {
80
+ if (!GovernanceRules?.evaluateGovernedOperations) {
81
+ return { allowed: operations || [], blocked: [], rules: getGovernanceRulesForCurrentProject() };
82
+ }
83
+ return GovernanceRules.evaluateGovernedOperations(operations, getGovernanceRulesForCurrentProject());
84
+ }
85
+
86
+ function buildGovernanceSkippedApplyResult(blockedItems = []) {
87
+ return {
88
+ ok: blockedItems.length === 0,
89
+ applied: [],
90
+ skipped: (blockedItems || []).map(item => ({
91
+ operation: item.operation,
92
+ result: {
93
+ ok: false,
94
+ code: 'governance_blocked',
95
+ reason: formatGovernanceBlockedReason(item),
96
+ reasonKey: item.reason || 'governance_blocked'
97
+ }
98
+ }))
99
+ };
100
+ }
101
+
102
+ function formatGovernanceBlockedReason(item = {}) {
103
+ if (item.reason === 'readonly') {
104
+ return tx(
105
+ 'Project governance marked this path read-only, so Codex did not write it.',
106
+ '项目治理规则将此路径标记为只读,因此 Codex 没有写入。'
107
+ );
108
+ }
109
+ if (item.reason === 'writable_allowlist') {
110
+ return tx(
111
+ 'Project governance allows writes only to configured writable patterns, and this path is outside that allowlist.',
112
+ '项目治理规则只允许写入配置的可写路径,此路径不在允许范围内。'
113
+ );
114
+ }
115
+ return tx('Project governance blocked this write.', '项目治理规则阻止了此写入。');
116
+ }
117
+
118
+ function filterSyncChangesByOperations(syncChanges = [], operations = []) {
119
+ const allowedPaths = new Set((operations || []).map(operation => operation.path).filter(Boolean));
120
+ return (syncChanges || []).filter(change => allowedPaths.has(change?.path));
121
+ }
122
+
123
+ function mergeApplyResultSkipped(result = {}, skipped = []) {
124
+ if (!skipped.length) {
125
+ return result;
126
+ }
127
+ return {
128
+ ...(result || {}),
129
+ ok: false,
130
+ applied: Array.isArray(result?.applied) ? result.applied : [],
131
+ skipped: [
132
+ ...getSkippedEntries(result),
133
+ ...skipped
134
+ ]
135
+ };
136
+ }
137
+
138
+ async function confirmBinaryOperations(operations = []) {
139
+ const binaryOperations = (operations || []).filter(operation => operation.type === 'binary-create' || operation.type === 'overwrite-binary');
140
+ if (!binaryOperations.length) {
141
+ return { operations, skipped: [] };
142
+ }
143
+ const approved = await showPluginConfirm({
144
+ title: tr('binaryAssetConfirmTitle'),
145
+ message: tr('binaryAssetConfirmMessage', { files: formatOperationFiles(binaryOperations) }),
146
+ confirmLabel: tr('binaryAssetConfirm'),
147
+ cancelLabel: tr('binaryAssetCancel'),
148
+ destructive: true
149
+ });
150
+ if (approved) {
151
+ return { operations, skipped: [] };
152
+ }
153
+ return {
154
+ operations: operations.filter(operation => operation.type !== 'binary-create' && operation.type !== 'overwrite-binary'),
155
+ skipped: binaryOperations.map(operation => ({
156
+ operation,
157
+ result: {
158
+ ok: false,
159
+ code: 'binary_confirmation_rejected',
160
+ reason: tx('Binary asset writeback requires explicit confirmation and was skipped.', '二进制资源写回需要显式确认,已跳过。')
161
+ }
162
+ }))
163
+ };
164
+ }
165
+
166
+ function buildAuditDiffSummary(operations = []) {
167
+ const changedFiles = new Set();
168
+ let binaryFilesChanged = 0;
169
+ for (const operation of operations || []) {
170
+ if (operation?.path) {
171
+ changedFiles.add(operation.path);
172
+ }
173
+ if (operation?.type === 'binary-create' || operation?.type === 'overwrite-binary') {
174
+ binaryFilesChanged++;
175
+ }
176
+ }
177
+ return {
178
+ filesChanged: changedFiles.size,
179
+ additions: 0,
180
+ deletions: 0,
181
+ binaryFilesChanged
182
+ };
183
+ }
184
+
185
+ function buildAuditSummaryFromApply({ operations = [], applyResults = [], blockedFiles = [], resultStatus = 'completed', saveVerification = null } = {}) {
186
+ const appliedFiles = [];
187
+ const skippedFiles = [];
188
+ for (const result of applyResults || []) {
189
+ for (const item of getAppliedEntries(result)) {
190
+ appliedFiles.push(summarizeOperationForAudit(item.operation, item.result, 'applied'));
191
+ }
192
+ for (const item of getSkippedEntries(result)) {
193
+ skippedFiles.push(summarizeOperationForAudit(item.operation, item.result, 'skipped'));
194
+ }
195
+ }
196
+ return {
197
+ changedFiles: (operations || []).map(operation => summarizeOperationForAudit(operation, {}, 'changed')),
198
+ ['diffSummary']: buildAuditDiffSummary(operations),
199
+ blockedFiles,
200
+ appliedFiles,
201
+ skippedFiles,
202
+ resultStatus,
203
+ saveVerification
204
+ };
205
+ }
206
+
207
+ // Tolerates `operation` and `result` being null in addition to undefined.
208
+ // Default-parameter values fire only for `undefined`, but the v1.3.8
209
+ // write-guard (pageBridge.runWriteGuard / writebackRouter.checkWritebackRunProjectId)
210
+ // emits batch-level skips with `operation: null` — there is no specific
211
+ // op to attribute the block to. Without this normalization the audit pass
212
+ // crashed with "Cannot read properties of null (reading 'path')", the
213
+ // outer-catch swallowed the partial-sync conclusion, and the user saw the
214
+ // misleading "local Codex returned no usable result" fallback.
215
+ function summarizeOperationForAudit(operation, result, status = '') {
216
+ const op = operation || {};
217
+ const res = result || {};
218
+ return {
219
+ path: op.path || op.from || op.to || '',
220
+ destinationPath: op.destinationPath || op.to || '',
221
+ type: op.type || '',
222
+ reason: res.reasonKey || res.code || res.reason || op.reasonKey || op.reason || '',
223
+ status,
224
+ size: op.size
225
+ };
226
+ }
227
+
228
+ return { partitionUnsafeProjectPathOperations, normalizeOperationProjectPaths, getInvalidOperationProjectPath, evaluateGovernedOperations, buildGovernanceSkippedApplyResult, filterSyncChangesByOperations, mergeApplyResultSkipped, confirmBinaryOperations, buildAuditSummaryFromApply, summarizeOperationForAudit };
229
+ }
230
+ return { create };
231
+ });
@@ -0,0 +1,122 @@
1
+ (function (root, factory) {
2
+ root.CodexOverleafModuleRegistry.define('WritebackRecovery', ['WritebackIntent', 'UndoOperations'], factory);
3
+ })(typeof globalThis !== 'undefined' ? globalThis : window, function (Intent, Undo) {
4
+ 'use strict';
5
+ function create(deps) {
6
+ let recovery = null;
7
+ const owner = () => ({ projectId: deps.getProjectId(), accountScopeId: deps.getAccountScopeId() });
8
+ const current = scope => scope.projectId === deps.getProjectId() && scope.accountScopeId === deps.getAccountScopeId();
9
+ const runs = () => (deps.getState()?.sessions || []).flatMap(session => (session.runs || []).map(run => ({ session, run })));
10
+ async function prepare(input) {
11
+ const view = deps.getRun(), scope = owner();
12
+ const run = view && deps.findRun(view.recordId, view.sessionId);
13
+ if (!run || !scope.accountScopeId || input.runProjectId !== scope.projectId
14
+ || view.runProjectId !== scope.projectId) throw new Error('Writeback ownership changed before dispatch.');
15
+ const pending = Intent.normalize({
16
+ ...scope, id: crypto.randomUUID(), sessionId: view.sessionId, runId: run.id,
17
+ createdAt: new Date().toISOString(), operations: input.operations, baseFiles: input.baseFiles,
18
+ requireReviewing: input.requireReviewing
19
+ });
20
+ if (!pending) throw new Error('This change exceeds the recoverable writeback limit. Split it into smaller changes.');
21
+ for (const op of pending.operations) {
22
+ if (op.type === 'edit' && !pending.baseFiles.some(file => file.path === op.path)) {
23
+ throw new Error('The original content of ' + op.path + ' is unavailable. Refresh the project before writing.');
24
+ }
25
+ }
26
+ run.pendingWriteback = pending;
27
+ await deps.save();
28
+ if (!current(scope)) throw new Error('Project changed before writeback dispatch.');
29
+ const stored = await deps.StorageDb.getRecord('sessions', view.sessionId);
30
+ if (stored?.accountScopeId !== scope.accountScopeId || stored?.projectId !== scope.projectId
31
+ || !(stored.runs || []).some(item => item.id === run.id && item.pendingWriteback?.id === pending.id)) {
32
+ throw new Error('The writeback recovery record could not be saved. No write was dispatched.');
33
+ }
34
+ return pending.id;
35
+ }
36
+ async function settle(input, result) {
37
+ const view = deps.getRun(), run = view && deps.findRun(view.recordId, view.sessionId);
38
+ if (!run?.pendingWriteback || run.pendingWriteback.projectId !== input.runProjectId) return;
39
+ const uncertain = result?.receiptUnconfirmed === true || (result?.skipped || []).some(entry => {
40
+ const item = entry.result || entry; return item.changedDocument === true || item.failure?.changedDocument === true;
41
+ });
42
+ // Volatile marker only. The intent remains durable until the mature
43
+ // action checkpoint has been recorded by the orchestrator.
44
+ run.writebackResultKnown = !uncertain;
45
+ }
46
+ function checkpointRecorded(run) {
47
+ if (run?.writebackResultKnown === true) {
48
+ delete run.pendingWriteback; delete run.writebackResultKnown;
49
+ }
50
+ }
51
+ async function recover() {
52
+ if (recovery) return recovery;
53
+ recovery = reconcile().finally(() => { recovery = null; });
54
+ return recovery;
55
+ }
56
+ async function reconcile() {
57
+ if (deps.getRun()) return false;
58
+ const scope = owner();
59
+ const pending = runs().filter(({ run }) => run.pendingWriteback
60
+ && run.pendingWriteback.projectId === scope.projectId && run.pendingWriteback.accountScopeId === scope.accountScopeId);
61
+ if (!pending.length) return true;
62
+ const snapshot = await deps.readProject();
63
+ if (!current(scope) || !snapshot?.capabilities?.fullProjectSnapshot) return false;
64
+ const observed = new Map((snapshot.files || []).map(file => [file.path, file]));
65
+ for (const { session, run } of pending) {
66
+ const intent = Intent.normalize(run.pendingWriteback);
67
+ if (!intent || intent.sessionId !== session.id || intent.runId !== run.id) continue;
68
+ const before = new Map(intent.baseFiles.map(file => [file.path, file.content]));
69
+ const after = Intent.expectedFiles(intent);
70
+ const applied = [], untouched = [], unknown = [];
71
+ for (const operation of intent.operations) {
72
+ const paths = [operation.path, operation.to].filter(Boolean);
73
+ if (operation.type.includes('binary')) {
74
+ unknown.push(operation.path); continue;
75
+ }
76
+ const matches = map => paths.every(path => map.has(path)
77
+ ? typeof observed.get(path)?.content === 'string' && observed.get(path).content === map.get(path)
78
+ : !observed.has(path));
79
+ if (matches(before)) untouched.push(operation.path);
80
+ else if (matches(after)) applied.push(operation);
81
+ else unknown.push(operation.path);
82
+ }
83
+ if (!current(scope)) return false;
84
+ const retained = Array.isArray(run.appliedOperations) ? run.appliedOperations : [];
85
+ const knownPaths = new Set(retained.map(op => op.path));
86
+ run.appliedOperations = [...retained, ...applied.filter(op => !knownPaths.has(op.path))];
87
+ if (applied.length) {
88
+ run.changedDocument = true;
89
+ if (intent.requireReviewing) {
90
+ // Text readback cannot recreate native tracked-change identities.
91
+ // Preserve real refs if already captured; never fabricate Accept.
92
+ run.undoExpectedFiles = intent.baseFiles;
93
+ run.trackedChangeStatus = ['accepted', 'rejected'].includes(run.trackedChangeStatus)
94
+ ? run.trackedChangeStatus : 'needs_review';
95
+ } else {
96
+ const undo = Undo.buildUndoCheckpoint({ files: intent.baseFiles }, run.appliedOperations);
97
+ run.undoOperations = undo.undoOperations; run.undoBaseFiles = undo.undoBaseFiles;
98
+ run.undoExpectedFiles = intent.baseFiles;
99
+ }
100
+ }
101
+ if (!unknown.length) delete run.pendingWriteback;
102
+ run.status = applied.length || unknown.length ? 'needs_review_after_navigation' : 'interrupted';
103
+ run.statusText = deps.tx('Writeback checked after refresh', '已核对刷新前的写入');
104
+ const text = deps.tx(
105
+ 'Writeback recovery: ' + applied.length + ' confirmed changed, ' + untouched.length + ' unchanged, ' + unknown.length + ' require inspection.',
106
+ '写入核对:' + applied.length + ' 项已确认修改,' + untouched.length + ' 项未修改,' + unknown.length + ' 项需要检查。'
107
+ );
108
+ run.events = [...(run.events || []).filter(event => event.recoveryIntentId !== intent.id), {
109
+ kind: 'activity', title: text, status: unknown.length ? 'warning' : 'completed',
110
+ timestamp: new Date().toISOString(), recoveryIntentId: intent.id,
111
+ activity: { v: 1, kind: 'notice', id: 'writeback-recovery:' + intent.id, state: unknown.length ? 'warning' : 'info' }
112
+ }].slice(-300);
113
+ session.updatedAt = new Date().toISOString();
114
+ }
115
+ await deps.save();
116
+ if (current(scope)) deps.refresh();
117
+ return !runs().some(({ run }) => run.pendingWriteback?.projectId === scope.projectId);
118
+ }
119
+ return { prepare, settle, checkpointRecorded, recover };
120
+ }
121
+ return { create };
122
+ });