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
@@ -4,14 +4,20 @@
4
4
  require('./i18n'),
5
5
  require('./settlementFacts'),
6
6
  require('./runInputQueue'),
7
+ require('./selectionContext'),
7
8
  require('./lineReferences'),
8
9
  require('./pathRedaction'),
9
- require('./sessionTitle')
10
+ require('./sessionTitle'),
11
+ require('./runActivityModel'),
12
+ require('./subagentActivityModel'),
13
+ require('./writebackIntent'),
14
+ require('./directoryCleanupProof'),
15
+ require('./undoOperations')
10
16
  );
11
17
  } else {
12
18
  root.CodexOverleafModuleRegistry.define(
13
19
  'SessionState',
14
- ['I18n', 'SettlementFacts', 'RunInputQueue', 'LineReferences', 'PathRedaction', 'SessionTitle'],
20
+ ['I18n', 'SettlementFacts', 'RunInputQueue', 'SelectionContext', 'LineReferences', 'PathRedaction', 'SessionTitle', 'RunActivityModel', 'SubagentActivityModel', 'WritebackIntent', 'DirectoryCleanupProof', 'UndoOperations'],
15
21
  factory
16
22
  );
17
23
  }
@@ -19,9 +25,15 @@
19
25
  i18n,
20
26
  SettlementFacts,
21
27
  RunInputQueue,
28
+ SelectionContext,
22
29
  LineReferences,
23
30
  PathRedaction,
24
- SessionTitle
31
+ SessionTitle,
32
+ RunActivityModel,
33
+ SubagentActivityModel,
34
+ WritebackIntent,
35
+ DirectoryCleanupProof,
36
+ UndoOperations
25
37
  ) {
26
38
  'use strict';
27
39
 
@@ -38,6 +50,7 @@
38
50
  loadCodexLocalSkills: true,
39
51
  loadCodexOverleafSkills: true,
40
52
  codexOverleafSkillEnabled: {},
53
+ codexLocalSkillEnabled: {},
41
54
  theme: 'dark',
42
55
  panelWidth: 380,
43
56
  task: '',
@@ -112,7 +125,6 @@
112
125
  statusTextChars: 400,
113
126
  attachmentPreviewChars: 160 * 1024
114
127
  };
115
- const REDACTED_SECRET = '[REDACTED_SECRET]';
116
128
  const SECRET_REDACTION_PATTERNS = [
117
129
  /-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z0-9 ]*PRIVATE KEY-----/g,
118
130
  /\bBearer\s+[A-Za-z0-9._~+/=-]{12,}/gi,
@@ -145,6 +157,7 @@
145
157
  state.loadCodexLocalSkills = state.loadCodexLocalSkills !== false;
146
158
  state.loadCodexOverleafSkills = state.loadCodexOverleafSkills !== false;
147
159
  state.codexOverleafSkillEnabled = normalizeCodexOverleafSkillEnabled(state.codexOverleafSkillEnabled);
160
+ state.codexLocalSkillEnabled = normalizeCodexLocalSkillEnabled(state.codexLocalSkillEnabled);
148
161
  state.theme = ['dark', 'light', 'auto'].includes(state.theme) ? state.theme : 'dark';
149
162
  state.panelWidth = normalizePanelWidth(state.panelWidth);
150
163
  state.task = typeof state.task === 'string' ? state.task : '';
@@ -205,6 +218,8 @@
205
218
  const history = normalizeHistoryEntries(session.history);
206
219
  const normalizedRuns = normalizeRuns(session.runs, options);
207
220
  const runs = normalizedRuns.length ? normalizedRuns : recoverRunsFromHistory(session, history);
221
+ for (const run of runs) pruneRunRecoveryScope(run, session);
222
+
208
223
  const rawTitle = typeof session.title === 'string' ? session.title.trim() : '';
209
224
  const derivedTitle = deriveSessionTitle(runs, session.task);
210
225
  const titleSource = normalizeTitleSource(session.titleSource, rawTitle, derivedTitle);
@@ -232,6 +247,7 @@
232
247
  : fallbackState.speedTier,
233
248
  requireReviewing: session.requireReviewing !== false,
234
249
  focusFiles: normalizeFocusFiles(session.focusFiles),
250
+ selectionContext: SelectionContext.normalize(session.selectionContext),
235
251
  projectReferenceFiles: normalizeProjectReferenceFiles(session.projectReferenceFiles),
236
252
  codexThreadId: typeof session.codexThreadId === 'string' ? session.codexThreadId : '',
237
253
  forkedFromSessionId: typeof session.forkedFromSessionId === 'string' ? session.forkedFromSessionId : '',
@@ -319,6 +335,7 @@
319
335
  state.runs = Array.isArray(active.runs) ? active.runs : [];
320
336
  state.task = typeof active.task === 'string' ? active.task : '';
321
337
  state.focusFiles = normalizeFocusFiles(active.focusFiles);
338
+ state.selectionContext = SelectionContext.normalize(active.selectionContext);
322
339
  state.mode = normalizeMode(active.mode);
323
340
  state.requireReviewing = active.requireReviewing !== false;
324
341
 
@@ -354,6 +371,7 @@
354
371
  : DEFAULT_PANEL_STATE.speedTier,
355
372
  requireReviewing: overrides.requireReviewing !== false,
356
373
  focusFiles: normalizeFocusFiles(overrides.focusFiles),
374
+ selectionContext: SelectionContext.normalize(overrides.selectionContext),
357
375
  projectReferenceFiles: normalizeProjectReferenceFiles(overrides.projectReferenceFiles),
358
376
  codexThreadId: typeof overrides.codexThreadId === 'string' ? overrides.codexThreadId : '',
359
377
  forkedFromSessionId: typeof overrides.forkedFromSessionId === 'string' ? overrides.forkedFromSessionId : '',
@@ -592,7 +610,64 @@
592
610
  .slice(-20);
593
611
  }
594
612
 
613
+ function recordedRunFailure(run) {
614
+ const event = [...(Array.isArray(run?.events) ? run.events : [])].reverse()
615
+ .find(item => item && item.kind !== 'technical' && item.subagent !== true);
616
+ if (!event || event.status !== 'failed' || (event.kind && event.kind !== 'activity')
617
+ || event.streamRole || event.streamKey || event.guidanceId) return null;
618
+ if (!['Codex returned a result, but local post-processing of this run failed.',
619
+ 'Codex 已经返回了结果,但本地处理这一轮时出错了。'].includes(event.title)) return null;
620
+ const meta = RunActivityModel.capture(event);
621
+ // Capture encodes even an unscoped local event as [threadId, turnId].
622
+ const scoped = meta?.scope && meta.scope !== JSON.stringify(['', '']);
623
+ if (meta?.kind !== 'notice' || meta.state !== 'failed' || meta.id || scoped || meta.noticeSource) return null;
624
+ const ended = Date.parse(event.timestamp), started = Date.parse(run.startedAt);
625
+ if (!Number.isFinite(ended) || (Number.isFinite(started) && ended < started)) return null;
626
+ return event;
627
+ }
628
+
629
+ // On restore only: a run that already finished (finishedAt plus a terminal
630
+ // report as its last visible event) but was persisted as running by a stale
631
+ // status write. Live retries also carry an old finishedAt, so never in memory.
632
+ function recoverSettledRunningRun(run) {
633
+ if (run?.status !== 'running' || !Number.isFinite(Date.parse(run.finishedAt))) return run;
634
+ const last = [...(Array.isArray(run.events) ? run.events : [])].reverse()
635
+ .find(item => item && item.kind !== 'technical' && item.subagent !== true);
636
+ if (last?.kind !== 'report' || !['completed', 'failed'].includes(last.status)
637
+ || Date.parse(last.timestamp) > Date.parse(run.finishedAt)) return run;
638
+ return { ...run, status: last.status };
639
+ }
640
+
641
+ function recoverRecordedRunFailure(run, locale = i18n.DEFAULT_LOCALE) {
642
+ if (run?.status !== 'running') return run;
643
+ const event = recordedRunFailure(run);
644
+ if (!event) return run;
645
+ // This acknowledgement is emitted only by the parent's terminal catch.
646
+ // It survives a render failure that prevented the old owner from settling.
647
+ return { ...run, status: 'failed',
648
+ statusText: i18n.t(locale, 'processedFailed', { elapsed: '' }).trim(),
649
+ finishedAt: Number.isFinite(Date.parse(run.finishedAt)) ? run.finishedAt : event.timestamp };
650
+ }
651
+
652
+ function pruneRunRecoveryScope(run, session = {}) {
653
+ const wrongAccount = proof => Object.prototype.hasOwnProperty.call(session, 'accountScopeId')
654
+ && proof.accountScopeId !== session.accountScopeId;
655
+ const wrongProject = value => Boolean(session.projectId && value !== session.projectId);
656
+ if (run.pendingDirectoryCleanup && (run.pendingDirectoryCleanup.sessionId !== session.id
657
+ || wrongAccount(run.pendingDirectoryCleanup) || wrongProject(run.pendingDirectoryCleanup.projectId))) delete run.pendingDirectoryCleanup;
658
+ applyTrackedChangeStatus(run, run.trackedChangeStatus);
659
+ }
660
+
661
+ function normalizeRecoveryRetention(value) {
662
+ if (value?.state !== 'omitted') return undefined;
663
+ return { state: 'omitted', reason: ['run-budget', 'session-budget', 'fallback', 'invalid'].includes(value.reason)
664
+ ? value.reason : 'invalid', bytes: Number.isSafeInteger(value.bytes) && value.bytes >= 0 ? value.bytes : 0,
665
+ ...(value.directoryCleanup === true ? { directoryCleanup: true, ...(value.coreRetained === true ? { coreRetained: true } : {}) } : {}) };
666
+ }
667
+
595
668
  function normalizeRun(run, options = {}) {
669
+ if (options.restoreRunningRuns === true || options.recoverSettledRuns === true) run = recoverSettledRunningRun(run);
670
+ run = recoverRecordedRunFailure(run, options.locale);
596
671
  const shouldStopRestoredRun = options.restoreRunningRuns === true && run.status === 'running';
597
672
  const locale = options.locale || i18n.DEFAULT_LOCALE;
598
673
  const events = normalizeRunEvents(run.events);
@@ -622,19 +697,23 @@
622
697
  model: typeof run.model === 'string' ? run.model : '',
623
698
  reasoningEffort: typeof run.reasoningEffort === 'string' ? run.reasoningEffort : '',
624
699
  speedTier: typeof run.speedTier === 'string' ? run.speedTier : '',
625
- status: shouldStopRestoredRun ? 'interrupted' : normalizeRunStatus(run.status),
700
+ status: shouldStopRestoredRun ? 'interrupted' : normalizeRunStatus(run.status, run),
626
701
  statusText: shouldStopRestoredRun ? i18n.t(locale, 'restoredRunStoppedStatus') : sanitizeAssistantVisibleText(run.statusText),
627
702
  runProjectId: normalizeProjectPrefKey(run.runProjectId),
628
703
  startedAt: typeof run.startedAt === 'string' ? run.startedAt : '',
629
704
  finishedAt: shouldStopRestoredRun ? new Date().toISOString() : typeof run.finishedAt === 'string' ? run.finishedAt : '',
630
705
  events: events.slice(-MAX_RUN_EVENTS),
706
+ ...(run.subagents?.length ? { subagents: SubagentActivityModel.normalize(run.subagents, sanitizeAssistantVisibleText) } : {}),
631
707
  attachments: normalizeRunAttachments(run.attachments, STORAGE_DEFAULT_LIMITS),
632
708
  appliedOperations: Array.isArray(run.appliedOperations) ? run.appliedOperations : [],
633
709
  undoOperations: Array.isArray(run.undoOperations) ? run.undoOperations : [],
634
710
  undoBaseFiles: normalizeRunFiles(run.undoBaseFiles),
635
711
  undoTrackedChanges: normalizeRunTrackedChanges(run.undoTrackedChanges),
636
712
  undoExpectedFiles: normalizeRunFiles(run.undoExpectedFiles),
713
+ ...(normalizeRecoveryRetention(run.recoveryRetention) && !run.forkSnapshot
714
+ ? { recoveryRetention: normalizeRecoveryRetention(run.recoveryRetention) } : {}),
637
715
  undoStatus: sanitizeAssistantVisibleText(run.undoStatus),
716
+ ...(run.undoOwnerProtocol === 1 ? { undoOwnerProtocol: 1 } : {}),
638
717
  nativeRequestId: sanitizeAssistantVisibleText(run.nativeRequestId),
639
718
  codexThreadId: sanitizeAssistantVisibleText(run.codexThreadId), codexTurnId: sanitizeAssistantVisibleText(run.codexTurnId),
640
719
  forkSnapshot: run.forkSnapshot === true,
@@ -659,7 +738,11 @@
659
738
  if (Array.isArray(run.trackedChangeCaptures) && run.trackedChangeCaptures.length && !run.forkSnapshot) {
660
739
  normalized.trackedChangeCaptures = sanitizeAssistantVisibleValue(run.trackedChangeCaptures);
661
740
  }
741
+ const directories = DirectoryCleanupProof.normalize(run.pendingDirectoryCleanup);
742
+ if (directories && directories.runId === normalized.id && directories.projectId === normalized.runProjectId
743
+ && !run.forkSnapshot) normalized.pendingDirectoryCleanup = directories;
662
744
  applyTrackedChangeStatus(normalized, run.trackedChangeStatus);
745
+ Object.assign(normalized, pickWritebackRecovery(run));
663
746
 
664
747
  return normalized;
665
748
  }
@@ -670,6 +753,7 @@
670
753
  // output yields the same result.
671
754
  function applyTrackedChangeStatus(run, rawStatus) {
672
755
  const hasRefs = run.undoTrackedChanges.length > 0;
756
+ const hasFileUndo = (run.undoOperations || []).some(UndoOperations.isFileUndoOperation);
673
757
  const hasRawStatus = rawStatus !== undefined && rawStatus !== null && rawStatus !== '';
674
758
 
675
759
  // Step 1 — value recovery. Keep a stable value; recover any other present
@@ -686,12 +770,11 @@
686
770
  }
687
771
 
688
772
  // Step 1 — reload reconciliation. A non-terminal status (`pending`) with no
689
- // refs is the post-reload state of an un-acted tracked-change run: the heavy refs are
690
- // never persisted, so without them there is nothing to act on. Drop it so
691
- // the run returns to the legacy-undo world. A terminal status with no refs
773
+ // refs can result from an old record or a storage-budget omission. Drop
774
+ // pending and let actual legacy Undo material decide the action. A terminal status with no refs
692
775
  // is kept — step 3 already empties terminal payloads and the label stays
693
776
  // meaningful.
694
- if (!hasRefs && status === 'pending') {
777
+ if (!hasRefs && !hasFileUndo && status === 'pending') {
695
778
  status = undefined;
696
779
  }
697
780
 
@@ -708,7 +791,7 @@
708
791
 
709
792
  if (status !== undefined) {
710
793
  run.trackedChangeStatus = status;
711
- }
794
+ } else delete run.trackedChangeStatus;
712
795
  }
713
796
 
714
797
  // Welcome-panel + write-guard: the run lifecycle now
@@ -722,13 +805,20 @@
722
805
  'running',
723
806
  'completed',
724
807
  'failed',
808
+ 'cancelled',
725
809
  'interrupted',
726
810
  'background_completed',
727
811
  'needs_review_after_navigation',
728
812
  'abandoned_after_navigation'
729
813
  ]);
730
814
 
731
- function normalizeRunStatus(status) {
815
+ function normalizeRunStatus(status, run = {}) {
816
+ if (status === 'running' && recordedRunFailure(run)) return 'failed';
817
+ if (status === 'rejected') return 'cancelled';
818
+ // Older normalizers rewrote cancelled runs to pending or completed.
819
+ // Recover only with a terminal timestamp and an explicit plugin event.
820
+ if (['pending', 'completed'].includes(status) && Number.isFinite(Date.parse(run.finishedAt))
821
+ && Array.isArray(run.events) && run.events.some(RunActivityModel.isRoutineCancellationEvent)) return 'cancelled';
732
822
  if (VALID_RUN_STATUS.has(status)) return status;
733
823
  // Legacy persisted runs without an explicit status fall back to `completed`
734
824
  // (the historical default for the recovery branch); unknown values land on
@@ -753,6 +843,9 @@
753
843
  timestamp: typeof event.timestamp === 'string' ? event.timestamp : '',
754
844
  kind: typeof event.kind === 'string' ? event.kind : 'activity',
755
845
  technicalDetail: sanitizeAssistantVisibleValue(event.technicalDetail),
846
+ activity: RunActivityModel.capture(event, sanitizeAssistantVisibleText),
847
+ streamPhase: RunActivityModel.normalizePhase(event.streamPhase),
848
+ subagent: event.subagent === true ? true : undefined,
756
849
  guidanceId: sanitizeAssistantVisibleText(event.guidanceId),
757
850
  streamKey: sanitizeAssistantVisibleText(event.streamKey),
758
851
  streamRole: sanitizeAssistantVisibleText(event.streamRole)
@@ -970,6 +1063,17 @@
970
1063
  return result;
971
1064
  }
972
1065
 
1066
+ function normalizeCodexLocalSkillEnabled(value) {
1067
+ const result = {};
1068
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return result;
1069
+ for (const [id, enabled] of Object.entries(value)) {
1070
+ if (/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/.test(id) && !id.includes('..')
1071
+ && !['__proto__', 'prototype', 'constructor'].includes(id) && typeof enabled === 'boolean') result[id] = enabled;
1072
+ }
1073
+ if (Object.keys(result).length > 200) throw new Error('Too many skill preferences.');
1074
+ return result;
1075
+ }
1076
+
973
1077
  function normalizeProjectPrefKey(value) {
974
1078
  const key = typeof value === 'string' ? value.trim() : '';
975
1079
  if (!key) {
@@ -1041,6 +1145,7 @@
1041
1145
  loadCodexLocalSkills: source.loadCodexLocalSkills !== false,
1042
1146
  loadCodexOverleafSkills: source.loadCodexOverleafSkills !== false,
1043
1147
  codexOverleafSkillEnabled: normalizeCodexOverleafSkillEnabled(source.codexOverleafSkillEnabled),
1148
+ codexLocalSkillEnabled: normalizeCodexLocalSkillEnabled(source.codexLocalSkillEnabled),
1044
1149
  theme: ['dark', 'light', 'auto'].includes(source.theme) ? source.theme : 'dark',
1045
1150
  panelWidth: normalizePanelWidth(source.panelWidth),
1046
1151
  task: summarizeTextForStorage(active?.task || source.task || '', 'task'),
@@ -1123,6 +1228,7 @@
1123
1228
  speedTier: normalizeSpeedTier(session.speedTier || fallbackState.speedTier),
1124
1229
  requireReviewing: session.requireReviewing !== false,
1125
1230
  focusFiles: normalizeFocusFiles(session.focusFiles),
1231
+ selectionContext: SelectionContext.normalize(session.selectionContext),
1126
1232
  projectReferenceFiles: normalizeProjectReferenceFiles(session.projectReferenceFiles),
1127
1233
  codexThreadId: typeof session.codexThreadId === 'string' ? session.codexThreadId : '',
1128
1234
  forkedFromSessionId: normalizeTextField(session.forkedFromSessionId, 160),
@@ -1196,6 +1302,7 @@
1196
1302
  }
1197
1303
 
1198
1304
  function compactRunForStorage(run, limits, keepUndoPayload, settlementFacts = null) {
1305
+ run = recoverRecordedRunFailure(run);
1199
1306
  const undoPayload = compactUndoPayload(run, limits, keepUndoPayload);
1200
1307
  const compact = {
1201
1308
  id: run.id,
@@ -1204,19 +1311,26 @@
1204
1311
  model: normalizeTextField(run.model, 80),
1205
1312
  reasoningEffort: typeof run.reasoningEffort === 'string' ? run.reasoningEffort : '',
1206
1313
  speedTier: typeof run.speedTier === 'string' ? run.speedTier : '',
1207
- status: normalizeRunStatus(run.status),
1314
+ status: normalizeRunStatus(run.status, run),
1208
1315
  statusText: summarizeTextForStorage(run.statusText, 'status text'),
1209
1316
  runProjectId: normalizeProjectPrefKey(run.runProjectId),
1210
1317
  startedAt: typeof run.startedAt === 'string' ? run.startedAt : '',
1211
1318
  finishedAt: typeof run.finishedAt === 'string' ? run.finishedAt : '',
1212
1319
  events: compactRunEvents(run.events, limits),
1320
+ ...(run.subagents?.length ? { subagents: SubagentActivityModel.normalize(run.subagents, sanitizeAssistantVisibleText) } : {}),
1213
1321
  attachments: compactRunAttachmentsForStorage(run.attachments, limits),
1214
1322
  appliedOperations: [],
1215
1323
  undoOperations: undoPayload.undoOperations,
1216
1324
  undoBaseFiles: undoPayload.undoBaseFiles,
1217
1325
  undoTrackedChanges: undoPayload.undoTrackedChanges,
1218
1326
  undoExpectedFiles: undoPayload.undoExpectedFiles,
1327
+ ...(!run.forkSnapshot && (run.pendingDirectoryCleanup || run.recoveryRetention?.directoryCleanup === true || (run.undoStatus !== 'applied' && !['accepted', 'rejected'].includes(run.trackedChangeStatus)))
1328
+ && (run.pendingDirectoryCleanup || run.recoveryRetention?.state === 'omitted' || ['appliedOperations', 'undoOperations', 'undoTrackedChanges', 'undoExpectedFiles']
1329
+ .some(key => Array.isArray(run[key]) && run[key].length))
1330
+ ? { recoveryRetention: normalizeRecoveryRetention(run.recoveryRetention)
1331
+ || { state: 'omitted', reason: 'fallback', bytes: 0, ...(run.pendingDirectoryCleanup ? { directoryCleanup: true } : {}) } } : {}),
1219
1332
  undoStatus: summarizeTextForStorage(run.undoStatus, 'undo status'),
1333
+ ...(run.undoOwnerProtocol === 1 ? { undoOwnerProtocol: 1 } : {}),
1220
1334
  nativeRequestId: normalizeTextField(run.nativeRequestId, 160),
1221
1335
  codexThreadId: normalizeTextField(run.codexThreadId, 160), codexTurnId: normalizeTextField(run.codexTurnId, 160),
1222
1336
  forkSnapshot: run.forkSnapshot === true,
@@ -1224,6 +1338,11 @@
1224
1338
  nativeEventSeq: Number.isFinite(Number(run.nativeEventSeq)) ? Number(run.nativeEventSeq) : 0,
1225
1339
  queueItemId: normalizeTextField(run.queueItemId, 160)
1226
1340
  };
1341
+ if (compact.recoveryRetention?.coreRetained === true && run.undoStatus !== 'applied'
1342
+ && !TERMINAL_TRACKED_CHANGE_STATUS.has(run.trackedChangeStatus)
1343
+ && ['appliedOperations', 'undoOperations', 'undoTrackedChanges', 'undoExpectedFiles'].some(key => run[key]?.length)) {
1344
+ delete compact.recoveryRetention.coreRetained;
1345
+ }
1227
1346
  if (run.executionSnapshot && typeof run.executionSnapshot === 'object') {
1228
1347
  compact.executionSnapshot = sanitizeAssistantVisibleValue(run.executionSnapshot);
1229
1348
  }
@@ -1236,6 +1355,7 @@
1236
1355
  if (run.interruptedDraft) {
1237
1356
  compact.interruptedDraft = sanitizeAssistantVisibleValue(run.interruptedDraft);
1238
1357
  }
1358
+ Object.assign(compact, pickWritebackRecovery(run));
1239
1359
  if (VALID_TRACKED_CHANGE_STATUS.has(run.trackedChangeStatus)) {
1240
1360
  compact.trackedChangeStatus = run.trackedChangeStatus;
1241
1361
  }
@@ -1256,6 +1376,8 @@
1256
1376
  streamKey: typeof event.streamKey === 'string' ? event.streamKey : '',
1257
1377
  streamRole: typeof event.streamRole === 'string' ? event.streamRole : ''
1258
1378
  };
1379
+ compact.activity = RunActivityModel.capture(event, sanitizeAssistantVisibleText);
1380
+ compact.streamPhase = RunActivityModel.normalizePhase(event.streamPhase);
1259
1381
  if (event.subagent === true) {
1260
1382
  compact.subagent = true;
1261
1383
  }
@@ -1507,21 +1629,22 @@
1507
1629
  if (typeof value !== 'string' || !value) {
1508
1630
  return '';
1509
1631
  }
1510
- const secretRedacted = redactSecretLikeText(value);
1511
- if (!mightContainLocalReferenceText(secretRedacted)) {
1512
- return secretRedacted;
1632
+ // Conversation text is user/model content, not a credential field. Keep
1633
+ // examples and quoted values intact; local-reference display rules remain.
1634
+ if (!mightContainLocalReferenceText(value)) {
1635
+ return value;
1513
1636
  }
1514
1637
  if (LineReferences?.sanitizeLocalReferences) {
1515
1638
  try {
1516
- return LineReferences.sanitizeLocalReferences(secretRedacted, {
1639
+ return LineReferences.sanitizeLocalReferences(value, {
1517
1640
  projectFiles: [],
1518
1641
  context: 'persist'
1519
1642
  });
1520
1643
  } catch (_error) {
1521
- return fallbackSanitizeLocalReferences(secretRedacted);
1644
+ return fallbackSanitizeLocalReferences(value);
1522
1645
  }
1523
1646
  }
1524
- return fallbackSanitizeLocalReferences(secretRedacted);
1647
+ return fallbackSanitizeLocalReferences(value);
1525
1648
  }
1526
1649
 
1527
1650
  function mightContainLocalReferenceText(value) {
@@ -1549,18 +1672,6 @@
1549
1672
  });
1550
1673
  }
1551
1674
 
1552
- function redactSecretLikeText(value) {
1553
- if (typeof value !== 'string') {
1554
- return '';
1555
- }
1556
- let redacted = value;
1557
- for (const pattern of SECRET_REDACTION_PATTERNS) {
1558
- pattern.lastIndex = 0;
1559
- redacted = redacted.replace(pattern, REDACTED_SECRET);
1560
- }
1561
- return redacted;
1562
- }
1563
-
1564
1675
  function containsSecretLikeText(value) {
1565
1676
  if (typeof value === 'string') {
1566
1677
  return SECRET_REDACTION_PATTERNS.some(pattern => {
@@ -1616,7 +1727,26 @@
1616
1727
  return new Blob([serialized]).size;
1617
1728
  }
1618
1729
 
1730
+ function pickWritebackRecovery(run = {}) {
1731
+ if (run.forkSnapshot === true || run.undoStatus === 'applied' || run.trackedChangeStatus === 'rejected') return {};
1732
+ const result = {};
1733
+ const retry = WritebackIntent.normalize(run.retryWriteback);
1734
+ if (retry && retry.runId === run.id && retry.projectId === normalizeProjectPrefKey(run.runProjectId)
1735
+ && retry.operations.every(op => (op.type === 'create' && typeof op.content === 'string')
1736
+ || (op.type === 'edit' && (op.patches?.length || typeof op.replaceAll === 'string')
1737
+ && retry.baseFiles.some(file => file.path === op.path))
1738
+ || (op.type === 'delete' && retry.baseFiles.some(file => file.path === op.path)))
1739
+ && !containsSecretLikeText(retry)) result.retryWriteback = retry;
1740
+ const check = WritebackIntent.normalizeSaveCheck(run.saveCheck);
1741
+ if (check && check.runId === run.id && check.projectId === normalizeProjectPrefKey(run.runProjectId)) result.saveCheck = check;
1742
+ if (typeof run.saveConfirmedAt === 'string' && Number.isFinite(Date.parse(run.saveConfirmedAt))) result.saveConfirmedAt = run.saveConfirmedAt;
1743
+ return result;
1744
+ }
1745
+
1619
1746
  return {
1747
+ normalizeRecoveryRetention,
1748
+ pruneRunRecoveryScope,
1749
+ pickWritebackRecovery,
1620
1750
  DEFAULT_PANEL_STATE,
1621
1751
  createSession,
1622
1752
  deleteSession,
@@ -1630,7 +1760,13 @@
1630
1760
  setActiveSession,
1631
1761
  updateActiveSession,
1632
1762
  normalizeRuns,
1763
+ normalizeRunStatus,
1764
+ recoverRecordedRunFailure,
1765
+ recoverSettledRunningRun,
1766
+ normalizeCodexLocalSkillEnabled,
1633
1767
  normalizeProjectReferenceFiles,
1768
+ normalizeComposerAttachmentsForPersistence,
1769
+ normalizeSelectionContext: SelectionContext.normalize,
1634
1770
  prepareStateForStorage,
1635
1771
  estimateJsonBytes,
1636
1772
  computeSafeTaskSummary
@@ -157,6 +157,9 @@
157
157
  canAccept,
158
158
  canUndo,
159
159
  canRetry: Boolean(primaryFailure?.retryable),
160
+ requiresWriteReview: Boolean(facts && (facts.documentEffect === 'possibly-changed'
161
+ || facts.evidence?.settled === 'needs-review'
162
+ || facts.failures.some(failure => DefaultFailureReasons.isUnconfirmedWriteFailure?.(failure)))),
160
163
  terminalState: failureTerminalState || '',
161
164
  actions: { accept: canAccept, undo: canUndo }
162
165
  };
@@ -209,6 +212,10 @@
209
212
  file: safePath(item.file),
210
213
  operationType: text(item.operationType).slice(0, 80),
211
214
  changedDocument: item.changedDocument === true,
215
+ ...(item.mayHaveMutated === true ? { mayHaveMutated: true } : {}),
216
+ ...(item.evidence?.originalCode === 'native_untracked_undo_pending_changes'
217
+ && item.changedDocument !== true && item.mayHaveMutated !== true && item.evidence.writeStarted !== true
218
+ ? { evidence: { originalCode: 'native_untracked_undo_pending_changes' } } : {}),
212
219
  terminalState: normalizeTerminalState(item.terminalState)
213
220
  }));
214
221
  }
@@ -287,8 +294,9 @@
287
294
  }
288
295
 
289
296
  function selectPrimaryFailure(failures) {
290
- return DefaultFailureReasons?.selectPrimaryFailure instanceof Function
291
- ? DefaultFailureReasons.selectPrimaryFailure(failures)
297
+ const select = DefaultFailureReasons?.selectPrimaryWritebackFailure || DefaultFailureReasons?.selectPrimaryFailure;
298
+ return select instanceof Function
299
+ ? select(failures)
292
300
  : failures[0] || null;
293
301
  }
294
302