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
@@ -2,6 +2,9 @@
2
2
 
3
3
  const fs = require('node:fs');
4
4
  const path = require('node:path');
5
+ const { createHash } = require('node:crypto');
6
+ const { filterTomlRootKeys } = require('./tomlStatements');
7
+ const { copyInheritedAuth, removeMissingInheritedAuth } = require('./codexInheritedAuth');
5
8
  const {
6
9
  getHomeDir,
7
10
  getNativeHostPlatform
@@ -86,9 +89,11 @@ function preparePluginCodexHome(env = process.env, options = {}) {
86
89
  const linked = [];
87
90
  const skippedLinks = [];
88
91
  for (const fileName of COPIED_USER_CODEX_FILES) {
92
+ if (fileName === 'config.toml' && options.skipCopiedUserConfig === true) continue;
89
93
  const source = path.join(userHome, fileName);
90
94
  const target = path.join(pluginHome, fileName);
91
95
  if (!isRegularFile(source)) {
96
+ if (fileName === 'auth.json') removeMissingInheritedAuth(source, target);
92
97
  continue;
93
98
  }
94
99
  fs.mkdirSync(path.dirname(target), { recursive: true });
@@ -166,90 +171,36 @@ function ensureDefaultCodexOverleafSkills({ env = process.env } = {}) {
166
171
  }
167
172
 
168
173
  function copyUserCodexFile(source, target, fileName, options = {}) {
174
+ if (fileName === 'auth.json') {
175
+ copyInheritedAuth(source, target);
176
+ return;
177
+ }
169
178
  if (fileName !== 'config.toml') {
170
179
  fs.copyFileSync(source, target);
171
180
  return;
172
181
  }
173
- let content = stripPersonalizationFromCodexConfig(fs.readFileSync(source, 'utf8'));
182
+ const content = sanitizeCopiedCodexConfig(fs.readFileSync(source, 'utf8'), options);
183
+ fs.writeFileSync(target, content, 'utf8');
184
+ }
185
+
186
+ function sanitizeCopiedCodexConfig(content, options = {}) {
187
+ content = stripPersonalizationFromCodexConfig(content);
174
188
  if (options.loadCodexLocalSkills === false) {
175
189
  content = sanitizeCodexConfigForLocalSkillIsolation(content);
176
190
  }
177
- fs.writeFileSync(target, content, 'utf8');
191
+ return content;
178
192
  }
179
193
 
180
- // Removes the top-level `personality` key (Codex's built-in "personality"
181
- // feature) so the plugin Codex home never inherits the user's global
182
- // personalization. Only the top-level key is removed — a `personality` key
183
- // inside a [section] is a different key and is preserved. Handles single-line
184
- // values and both multi-line string forms (""" basic and ''' literal). All
185
- // other lines pass through unchanged, aside from line endings being normalized to LF.
194
+ // Remove the complete top-level personality assignment. Statement boundaries
195
+ // keep keys/table headers inside multiline strings from becoming filter input.
196
+ // Key paths are decoded before filtering, including quoted/dotted spellings.
197
+ // Table-scoped fields remain distinct. Unselected source text is preserved.
186
198
  function stripPersonalizationFromCodexConfig(content) {
187
- const lines = String(content || '').split(/\r?\n/);
188
- const output = [];
189
- let beforeFirstSection = true;
190
- let closingDelimiter = '';
191
-
192
- for (const line of lines) {
193
- if (closingDelimiter) {
194
- if (line.includes(closingDelimiter)) {
195
- closingDelimiter = '';
196
- }
197
- // Drop every line of the multi-line value, including the one that closes it.
198
- continue;
199
- }
200
- if (parseTomlSectionName(line)) {
201
- beforeFirstSection = false;
202
- output.push(line);
203
- continue;
204
- }
205
- if (beforeFirstSection) {
206
- const match = line.match(/^\s*personality\s*=\s*(.*)$/);
207
- if (match) {
208
- const value = match[1];
209
- const opener = value.startsWith('"""') ? '"""'
210
- : value.startsWith("'''") ? "'''"
211
- : '';
212
- if (opener && value.indexOf(opener, opener.length) === -1) {
213
- closingDelimiter = opener;
214
- }
215
- continue;
216
- }
217
- }
218
- output.push(line);
219
- }
220
-
221
- return output.join('\n');
199
+ return filterTomlRootKeys(content, ['personality']);
222
200
  }
223
201
 
224
202
  function sanitizeCodexConfigForLocalSkillIsolation(content) {
225
- const output = [];
226
- let skippedSection = false;
227
-
228
- for (const line of String(content || '').split(/\r?\n/)) {
229
- const sectionName = parseTomlSectionName(line);
230
- if (sectionName) {
231
- skippedSection = isLocalSkillConfigSection(sectionName);
232
- if (!skippedSection) {
233
- output.push(line);
234
- }
235
- continue;
236
- }
237
- if (skippedSection || /^\s*notify\s*=/.test(line)) {
238
- continue;
239
- }
240
- output.push(line);
241
- }
242
-
243
- return `${output.join('\n').replace(/\n{3,}/g, '\n\n').trim()}\n`;
244
- }
245
-
246
- function parseTomlSectionName(line) {
247
- const match = String(line || '').match(/^\s*\[{1,2}\s*([^\]]+?)\s*\]{1,2}\s*(?:#.*)?$/);
248
- return match ? match[1].trim() : '';
249
- }
250
-
251
- function isLocalSkillConfigSection(sectionName) {
252
- return LOCAL_SKILL_CONFIG_SECTIONS.some(prefix => sectionName === prefix || sectionName.startsWith(`${prefix}.`));
203
+ return filterTomlRootKeys(content, ['notify', ...LOCAL_SKILL_CONFIG_SECTIONS]);
253
204
  }
254
205
 
255
206
  function removePluginHomeEntry(pluginHome, entryName, skippedLinks) {
@@ -265,6 +216,24 @@ function removePluginHomeEntry(pluginHome, entryName, skippedLinks) {
265
216
  }
266
217
 
267
218
  function buildCodexHomeEnv(env = process.env, options = {}) {
219
+ const userHome = getUserCodexHome(env, options);
220
+ let canonicalHome = getPluginCodexHome(env, options);
221
+ // Per-skill writes belong to the plugin even when an older installation
222
+ // explicitly shared its Codex home with the user's normal Codex session.
223
+ if (samePath(userHome, canonicalHome) && (options.forceIsolatedSkillSettings === true
224
+ || Array.isArray(options.enabledCodexLocalSkillIds))) {
225
+ canonicalHome += '-overleaf-runtime';
226
+ if (samePath(userHome, canonicalHome)) throw new Error('The isolated skill home must not alias the user Codex home.');
227
+ }
228
+ if (options.isolateRuntimeHome === true && !samePath(userHome, canonicalHome)) {
229
+ const { prepareScopedPluginCodexHome } = require('./codexHomeScope');
230
+ const prepared = prepareScopedPluginCodexHome(env, options, {
231
+ userHome, canonicalHome, prepare: preparePluginCodexHome, ensureSkills: ensureDefaultCodexOverleafSkills,
232
+ prepareConfig: sanitizeCopiedCodexConfig
233
+ });
234
+ return { ...env, CODEX_HOME: prepared.pluginHome, CODEX_SQLITE_HOME: env.CODEX_SQLITE_HOME || canonicalHome,
235
+ CODEX_OVERLEAF_CODEX_HOME: canonicalHome, CODEX_OVERLEAF_USER_CODEX_HOME: userHome };
236
+ }
268
237
  const prepared = preparePluginCodexHome(env, options);
269
238
  return {
270
239
  ...env,
@@ -322,9 +291,14 @@ function composePluginSkillsDirectory({
322
291
  continue;
323
292
  }
324
293
  for (const entry of fs.readdirSync(source.root, { withFileTypes: true })) {
325
- if (!entry.isDirectory() || !isSafeSkillEntryName(entry.name)) {
294
+ if (!(entry.isDirectory() || (source.name === 'codex-local' && entry.isSymbolicLink()
295
+ && isDirectory(path.join(source.root, entry.name)))) || !isSafeSkillEntryName(entry.name)) {
326
296
  continue;
327
297
  }
298
+ if (source.name === 'codex-overleaf') {
299
+ if (Array.isArray(options.enabledCodexOverleafSkillIds) && !options.enabledCodexOverleafSkillIds.includes(entry.name)) continue;
300
+ if (Array.isArray(options.disableCodexOverleafSkillIds) && options.disableCodexOverleafSkillIds.includes(entry.name)) continue;
301
+ }
328
302
  const sourcePath = path.join(source.root, entry.name);
329
303
  const targetPath = path.join(targetRoot, entry.name);
330
304
  if (!isSafePluginHomePath(targetPath, pluginHome)) {
@@ -332,6 +306,7 @@ function composePluginSkillsDirectory({
332
306
  continue;
333
307
  }
334
308
  if (source.replaceExisting) {
309
+ preserveLocalSkillAlias(targetPath, targetRoot, options);
335
310
  fs.rmSync(targetPath, { recursive: true, force: true });
336
311
  }
337
312
  const linkResult = ensureSymlink(sourcePath, targetPath, options);
@@ -377,6 +352,21 @@ function composePluginSkillsDirectory({
377
352
  return { linked, skippedLinks };
378
353
  }
379
354
 
355
+ function preserveLocalSkillAlias(targetPath, targetRoot, options) {
356
+ let target;
357
+ try {
358
+ if (!fs.lstatSync(targetPath).isSymbolicLink()) return;
359
+ target = fs.realpathSync(targetPath);
360
+ } catch (error) {
361
+ if (error.code === 'ENOENT') return;
362
+ throw error;
363
+ }
364
+ const suffix = createHash('sha256').update(target).digest('hex').slice(0, 16);
365
+ const alias = path.join(targetRoot, `${path.basename(targetPath)}.codex-local-${suffix}`);
366
+ const result = ensureSymlink(target, alias, options);
367
+ if (!result.ok) throw new Error('The local skill alias could not be preserved.');
368
+ }
369
+
380
370
  function clearPluginCodexHistory(optionsOrEnv = {}, maybeEnv = null) {
381
371
  const { options, env } = normalizeClearHistoryArgs(optionsOrEnv, maybeEnv);
382
372
  const pluginHome = getPluginCodexHome(env);
@@ -595,7 +585,10 @@ function chmodIfPossible(target, mode) {
595
585
  }
596
586
 
597
587
  function samePath(left, right) {
598
- return path.resolve(left) === path.resolve(right);
588
+ const resolvedLeft = path.resolve(left), resolvedRight = path.resolve(right);
589
+ if (resolvedLeft === resolvedRight) return true;
590
+ try { return fs.realpathSync(resolvedLeft) === fs.realpathSync(resolvedRight); }
591
+ catch { return false; }
599
592
  }
600
593
 
601
594
  function isInsideDirectory(target, parent) {
@@ -0,0 +1,124 @@
1
+ 'use strict';
2
+
3
+ const crypto = require('node:crypto');
4
+ const fs = require('node:fs');
5
+ const path = require('node:path');
6
+ const { rebaseCodexConfigPaths } = require('./codexConfigPaths');
7
+ const { AUTH_SOURCE_MARKER, copyInheritedAuth, removeMissingInheritedAuth } = require('./codexInheritedAuth');
8
+ const { getCodexOverleafSkillsRoot } = require('./localSkills');
9
+
10
+ const HISTORY_DIRS = ['sessions', 'archived_sessions', 'history'];
11
+ const SCOPE_MARKER = '.codex-overleaf-scope.json';
12
+
13
+ function prepareScopedPluginCodexHome(env, options, home) {
14
+ const { userHome, canonicalHome, prepare, ensureSkills, prepareConfig } = home;
15
+ fs.mkdirSync(canonicalHome, { recursive: true, mode: 0o700 });
16
+ try { fs.chmodSync(canonicalHome, 0o700); } catch { /* Match the existing best-effort home permissions. */ }
17
+ synchronizeAuth(path.join(userHome, 'auth.json'), path.join(canonicalHome, 'auth.json'));
18
+ ensureSkills({ env });
19
+ const overleafRoot = getCodexOverleafSkillsRoot({ env });
20
+ const capturedConfig = readOptionalFile(path.join(userHome, 'config.toml'));
21
+ const descriptor = {
22
+ version: 1,
23
+ userHome,
24
+ local: options.loadCodexLocalSkills !== false,
25
+ overleaf: options.loadCodexOverleafSkills !== false,
26
+ installer: options.installCodexOverleafSkillsTarget === true,
27
+ enabled: normalizedIds(options.enabledCodexOverleafSkillIds),
28
+ enabledLocal: normalizedIds(options.enabledCodexLocalSkillIds),
29
+ disabled: normalizedIds(options.disableCodexOverleafSkillIds),
30
+ config: digest(capturedConfig),
31
+ localSkills: options.loadCodexLocalSkills !== false ? directoryIdentity(path.join(userHome, 'skills')) : [],
32
+ // Installer targets stay stable while installed skill contents grow.
33
+ pluginSkills: options.installCodexOverleafSkillsTarget === true
34
+ ? overleafRoot
35
+ : options.loadCodexOverleafSkills !== false ? directoryIdentity(overleafRoot) : [],
36
+ projectSkills: options.projectLocalSkills || null
37
+ };
38
+ const key = digest(JSON.stringify(descriptor));
39
+ const scopesRoot = path.join(canonicalHome, 'runtime-homes');
40
+ fs.mkdirSync(scopesRoot, { recursive: true, mode: 0o700 });
41
+ const scopeHome = path.join(scopesRoot, key);
42
+ for (const name of HISTORY_DIRS) fs.mkdirSync(path.join(canonicalHome, name), { recursive: true });
43
+
44
+ if (!isReady(scopeHome, key)) {
45
+ const staging = fs.mkdtempSync(path.join(scopesRoot, '.prepare-'));
46
+ try {
47
+ prepare({ ...env, CODEX_OVERLEAF_CODEX_HOME: staging, CODEX_OVERLEAF_USER_CODEX_HOME: userHome }, {
48
+ ...options,
49
+ skipCopiedUserConfig: true,
50
+ enabledCodexOverleafSkillIds: descriptor.enabled || undefined,
51
+ enabledCodexLocalSkillIds: descriptor.enabledLocal || undefined,
52
+ disableCodexOverleafSkillIds: descriptor.disabled || undefined
53
+ });
54
+ // Published scopes inherit from the canonical home, including provenance.
55
+ // The staging prepare's direct user copy must never escape publication.
56
+ fs.rmSync(path.join(staging, 'auth.json'), { force: true });
57
+ fs.rmSync(path.join(staging, AUTH_SOURCE_MARKER), { force: true });
58
+ synchronizeAuth(path.join(canonicalHome, 'auth.json'), path.join(staging, 'auth.json'));
59
+ const configFile = path.join(staging, 'config.toml');
60
+ const config = prepareConfig(capturedConfig.toString('utf8'), options);
61
+ fs.writeFileSync(configFile, rebaseCodexConfigPaths(config, canonicalHome), { mode: 0o600 });
62
+ for (const name of HISTORY_DIRS) {
63
+ fs.symlinkSync(path.join(canonicalHome, name), path.join(staging, name), options.platform === 'win32' || process.platform === 'win32' ? 'junction' : 'dir');
64
+ }
65
+ fs.writeFileSync(path.join(staging, SCOPE_MARKER), JSON.stringify({ version: 1, key }), { mode: 0o600 });
66
+ try { fs.renameSync(staging, scopeHome); }
67
+ catch (error) {
68
+ // Another process may have atomically published this complete scope.
69
+ // Never remove a final directory or return an incomplete environment.
70
+ if (!isReady(scopeHome, key)) throw error;
71
+ }
72
+ } finally {
73
+ fs.rmSync(staging, { recursive: true, force: true });
74
+ }
75
+ }
76
+
77
+ synchronizeAuth(path.join(userHome, 'auth.json'), path.join(canonicalHome, 'auth.json'));
78
+ synchronizeAuth(path.join(canonicalHome, 'auth.json'), path.join(scopeHome, 'auth.json'));
79
+ // Refresh discovery caches without rewriting a live scope's configuration or
80
+ // replacing the skill paths a process has already discovered.
81
+ for (const name of ['installation_id', 'models_cache.json', 'version.json']) {
82
+ const source = path.join(userHome, name);
83
+ if (isFile(source)) fs.copyFileSync(source, path.join(scopeHome, name));
84
+ }
85
+ return { userHome, pluginHome: scopeHome, canonicalHome };
86
+ }
87
+
88
+ function synchronizeAuth(source, target) {
89
+ if (isFile(source)) copyInheritedAuth(source, target);
90
+ else removeMissingInheritedAuth(source, target);
91
+ }
92
+
93
+ function normalizedIds(value) {
94
+ return Array.isArray(value) ? Array.from(new Set(value.map(id => String(id || '').trim()).filter(Boolean))).sort() : null;
95
+ }
96
+
97
+ function directoryIdentity(root) {
98
+ let entries;
99
+ try { entries = fs.readdirSync(root, { withFileTypes: true }); }
100
+ catch (error) { if (error.code === 'ENOENT') return []; throw error; }
101
+ return entries.filter(entry => entry.isDirectory() || (entry.isSymbolicLink()
102
+ && isDirectory(path.join(root, entry.name)))).map(entry => {
103
+ const location = path.join(root, entry.name);
104
+ return [entry.name, fs.realpathSync(location)];
105
+ }).sort((a, b) => a[0].localeCompare(b[0]));
106
+ }
107
+
108
+ function isReady(directory, key) {
109
+ try {
110
+ const marker = JSON.parse(fs.readFileSync(path.join(directory, SCOPE_MARKER), 'utf8'));
111
+ if (marker.version === 1 && marker.key === key && !fs.lstatSync(directory).isSymbolicLink()) return true;
112
+ throw new Error('The plugin Codex scope has invalid ownership metadata.');
113
+ } catch (error) {
114
+ if (error.code === 'ENOENT' && !fs.existsSync(directory)) return false;
115
+ throw error;
116
+ }
117
+ }
118
+
119
+ function isFile(file) { try { return fs.statSync(file).isFile(); } catch { return false; } }
120
+ function isDirectory(file) { try { return fs.statSync(file).isDirectory(); } catch { return false; } }
121
+ function readOptionalFile(file) { try { return fs.readFileSync(file); } catch (error) { if (error.code === 'ENOENT') return Buffer.alloc(0); throw error; } }
122
+ function digest(value) { return crypto.createHash('sha256').update(value).digest('hex'); }
123
+
124
+ module.exports = { prepareScopedPluginCodexHome };
@@ -0,0 +1,90 @@
1
+ 'use strict';
2
+
3
+ const crypto = require('node:crypto');
4
+ const fs = require('node:fs');
5
+ const path = require('node:path');
6
+
7
+ const MARKER = '.codex-overleaf-auth-source.json';
8
+
9
+ function fingerprint(contents) {
10
+ return crypto.createHash('sha256').update(contents).digest('hex');
11
+ }
12
+
13
+ function copyInheritedAuth(source, target) {
14
+ const contents = fs.readFileSync(source);
15
+ const authTemporary = `${target}.${process.pid}.${crypto.randomBytes(6).toString('hex')}.tmp`;
16
+ try {
17
+ fs.writeFileSync(authTemporary, contents, { mode: 0o600 });
18
+ fs.renameSync(authTemporary, target);
19
+ } finally {
20
+ fs.rmSync(authTemporary, { force: true });
21
+ }
22
+ const marker = path.join(path.dirname(target), MARKER);
23
+ const temporary = `${marker}.${process.pid}.${crypto.randomBytes(6).toString('hex')}.tmp`;
24
+ try {
25
+ fs.writeFileSync(temporary, JSON.stringify({ version: 1, source: path.resolve(source), digest: fingerprint(contents) }), { mode: 0o600 });
26
+ fs.renameSync(temporary, marker);
27
+ } finally {
28
+ fs.rmSync(temporary, { force: true });
29
+ }
30
+ }
31
+
32
+ // Source absence alone cannot identify independent or old, unattributed auth.
33
+ // Delete only the unchanged bytes that this home preparation actually copied.
34
+ function removeMissingInheritedAuth(source, target) {
35
+ const marker = path.join(path.dirname(target), MARKER);
36
+ const ownedMarker = `${marker}.claimed-${process.pid}-${crypto.randomBytes(8).toString('hex')}`;
37
+ try { fs.renameSync(marker, ownedMarker); }
38
+ catch (error) { if (error.code === 'ENOENT') return; throw error; }
39
+ let provenance;
40
+ try { provenance = JSON.parse(fs.readFileSync(ownedMarker, 'utf8')); }
41
+ catch (error) { restoreExclusive(ownedMarker, marker); throw error; }
42
+ if (provenance?.version !== 1 || provenance.source !== path.resolve(source)) {
43
+ restoreExclusive(ownedMarker, marker); return;
44
+ }
45
+ // Independent auth that already differs requires no file move at all.
46
+ let contents;
47
+ try { contents = fs.readFileSync(target); }
48
+ catch (error) {
49
+ if (error.code === 'ENOENT') { fs.rmSync(ownedMarker, { force: true }); return; }
50
+ restoreExclusive(ownedMarker, marker); throw error;
51
+ }
52
+ if (fingerprint(contents) !== provenance.digest) {
53
+ fs.rmSync(ownedMarker, { force: true }); return;
54
+ }
55
+ const detached = `${target}.preserved-${process.pid}-${crypto.randomBytes(8).toString('hex')}`;
56
+ try { fs.renameSync(target, detached); }
57
+ catch (error) {
58
+ restoreExclusive(ownedMarker, marker);
59
+ if (error.code === 'ENOENT') return;
60
+ throw error;
61
+ }
62
+ let inherited;
63
+ try {
64
+ inherited = fs.lstatSync(detached).isFile() && fingerprint(fs.readFileSync(detached)) === provenance.digest;
65
+ } catch (error) {
66
+ restoreExclusive(detached, target); restoreExclusive(ownedMarker, marker); throw error;
67
+ }
68
+ if (inherited) {
69
+ // A concurrent login may already have published a new auth and marker.
70
+ // Only these atomically claimed files belong to this cleanup operation.
71
+ fs.rmSync(detached, { force: true });
72
+ } else {
73
+ restoreExclusive(detached, target);
74
+ }
75
+ fs.rmSync(ownedMarker, { force: true });
76
+ }
77
+
78
+ function restoreExclusive(detached, target) {
79
+ try {
80
+ fs.linkSync(detached, target);
81
+ fs.rmSync(detached, { force: true });
82
+ } catch (error) {
83
+ if (error.code === 'EEXIST' && fs.existsSync(target)) return;
84
+ // A nonmatching credential remains in the private preserved file. Starting
85
+ // without restoring it would silently change the selected authentication.
86
+ throw error;
87
+ }
88
+ }
89
+
90
+ module.exports = { AUTH_SOURCE_MARKER: MARKER, copyInheritedAuth, removeMissingInheritedAuth };