codex-overleaf-link 2.4.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/README.md +272 -314
  2. package/README.zh-CN.md +287 -329
  3. package/extension/bootstrap/background.js +47 -10
  4. package/extension/bootstrap/manifest.template.json +9 -4
  5. package/extension/bootstrap/popup.html +10 -16
  6. package/extension/bootstrap/update.js +25 -2
  7. package/extension/runtime-manifest.json +3 -1
  8. package/extension/src/background.js +28 -3
  9. package/extension/src/backgroundSharedSessions.js +380 -0
  10. package/extension/src/backgroundUpdateCoordinator.js +442 -379
  11. package/extension/src/content/activeTurnControl.js +8 -0
  12. package/extension/src/content/assetTransferBroker.js +186 -12
  13. package/extension/src/content/changeHistoryView.js +175 -0
  14. package/extension/src/content/composerAttachments.js +24 -22
  15. package/extension/src/content/composerPanel.js +23 -8
  16. package/extension/src/content/contentRuntime.js +507 -507
  17. package/extension/src/content/diagnosticsController.js +1 -2
  18. package/extension/src/content/diagnosticsExport.js +222 -0
  19. package/extension/src/content/diagnosticsPanel.js +48 -19
  20. package/extension/src/content/diffReviewPanel.js +8 -5
  21. package/extension/src/content/generated/content.bundle.js +8330 -1349
  22. package/extension/src/content/generated/content.bundle.meta.json +22 -3
  23. package/extension/src/content/legacyGlobalRegistry.js +19 -1
  24. package/extension/src/content/localSkillsPanel.js +42 -7
  25. package/extension/src/content/markdownDomRenderer.js +9 -4
  26. package/extension/src/content/modelPicker.js +1 -1
  27. package/extension/src/content/pageBridgeClient.js +18 -3
  28. package/extension/src/content/panelMaintenance.js +48 -121
  29. package/extension/src/content/panelRenderer.js +4 -0
  30. package/extension/src/content/pendingInputView.js +109 -76
  31. package/extension/src/content/providerSettingsCoordinator.js +17 -6
  32. package/extension/src/content/providerSettingsDialog.js +661 -108
  33. package/extension/src/content/recentProjects.js +10 -1
  34. package/extension/src/content/runActivitySummary.js +631 -0
  35. package/extension/src/content/runController.js +3 -1
  36. package/extension/src/content/runFailureNotice.js +14 -1
  37. package/extension/src/content/runGuidanceController.js +4 -3
  38. package/extension/src/content/runPresence.js +306 -0
  39. package/extension/src/content/runQueueScheduler.js +2 -1
  40. package/extension/src/content/runResultActions.js +123 -3
  41. package/extension/src/content/runTimelineView.js +186 -154
  42. package/extension/src/content/selectionContextView.js +300 -0
  43. package/extension/src/content/sessionPersistence.js +6 -1
  44. package/extension/src/content/settingsPanel.js +77 -52
  45. package/extension/src/content/settingsWorkbench.js +374 -0
  46. package/extension/src/content/sharedSessionViewSync.js +72 -0
  47. package/extension/src/content/subagentActivityView.js +195 -0
  48. package/extension/src/content/trackedChangeCaptureController.js +7 -3
  49. package/extension/src/content/updateNotice.js +121 -50
  50. package/extension/src/content/writebackController.js +257 -0
  51. package/extension/src/content/writebackOrchestrator.js +146 -141
  52. package/extension/src/content/writebackPlan.js +231 -0
  53. package/extension/src/content/writebackRecovery.js +122 -0
  54. package/extension/src/content/writingStyleSettings.js +576 -0
  55. package/extension/src/content/writtenChangesView.js +152 -0
  56. package/extension/src/page/binaryAssetUploader.js +97 -19
  57. package/extension/src/page/overleafProjectSnapshot.js +1 -0
  58. package/extension/src/page/referenceProjects.js +148 -0
  59. package/extension/src/page/saveState.js +14 -2
  60. package/extension/src/page/snapshotRouter.js +44 -13
  61. package/extension/src/page/textCoordinates.js +102 -0
  62. package/extension/src/page/textFileCreator.js +350 -59
  63. package/extension/src/page/trackedChangeCapture.js +42 -56
  64. package/extension/src/page/trackedChangeOwnership.js +198 -0
  65. package/extension/src/page/trackedChangeReplay.js +164 -0
  66. package/extension/src/page/trackedChangesLifecycle.js +135 -149
  67. package/extension/src/page/treeOperations.js +26 -2
  68. package/extension/src/page/writebackReceiptJournal.js +112 -0
  69. package/extension/src/page/writebackRouter.js +175 -135
  70. package/extension/src/pageBridge.js +56 -101
  71. package/extension/src/popup.js +203 -59
  72. package/extension/src/shared/agentTranscript.js +18 -4
  73. package/extension/src/shared/auditRecords.js +71 -0
  74. package/extension/src/shared/changeHistoryModel.js +94 -0
  75. package/extension/src/shared/compatibility.js +1 -1
  76. package/extension/src/shared/compileAdapter.js +42 -0
  77. package/extension/src/shared/failureReasons.js +20 -0
  78. package/extension/src/shared/globalPreferences.js +1 -1
  79. package/extension/src/shared/i18n.js +93 -25
  80. package/extension/src/shared/managedUpdateProjection.js +6 -3
  81. package/extension/src/shared/pageRpcContract.js +7 -1
  82. package/extension/src/shared/providerProfiles.js +109 -0
  83. package/extension/src/shared/runActivityModel.js +361 -0
  84. package/extension/src/shared/runExecutionSnapshot.js +8 -2
  85. package/extension/src/shared/runExecutionSnapshotCodec.js +16 -4
  86. package/extension/src/shared/scopedPersistenceBrowserAdapter.js +6 -3
  87. package/extension/src/shared/selectionContext.js +28 -0
  88. package/extension/src/shared/sessionState.js +97 -6
  89. package/extension/src/shared/sharedSessionBridge.js +288 -0
  90. package/extension/src/shared/storageDb.js +22 -55
  91. package/extension/src/shared/storageMigration.js +3 -0
  92. package/extension/src/shared/storageRunActions.js +10 -4
  93. package/extension/src/shared/storageValuePruning.js +40 -0
  94. package/extension/src/shared/subagentActivityModel.js +174 -0
  95. package/extension/src/shared/undoOperations.js +87 -0
  96. package/extension/src/shared/updateConsent.js +37 -8
  97. package/extension/src/shared/writebackIntent.js +62 -0
  98. package/extension/src/shared/writebackSettlement.js +29 -10
  99. package/extension/src/shared/writingStyle.js +33 -0
  100. package/extension/styles/panel.css +1972 -384
  101. package/extension/styles/popup.css +110 -0
  102. package/native-host/src/anthropicBridgeRequest.js +2 -1
  103. package/native-host/src/codexModelRecovery.js +107 -0
  104. package/native-host/src/codexPromptAssembly.js +2 -0
  105. package/native-host/src/codexProviderLaunch.js +3 -3
  106. package/native-host/src/codexRuntimeIdentity.js +1 -0
  107. package/native-host/src/codexSessionRunner.js +106 -140
  108. package/native-host/src/codexSessionTiming.js +3 -0
  109. package/native-host/src/managedInstall.js +5 -4
  110. package/native-host/src/nativeEnvironment.js +70 -0
  111. package/native-host/src/nativeQuotas.js +15 -8
  112. package/native-host/src/overleafWorkspaceRules.js +16 -0
  113. package/native-host/src/processStopBarrier.js +80 -0
  114. package/native-host/src/providerModelCatalog.js +4 -3
  115. package/native-host/src/providerProfile.js +13 -1
  116. package/native-host/src/providerReasoning.js +9 -5
  117. package/native-host/src/providerStore.js +4 -0
  118. package/native-host/src/releaseTransport.js +14 -5
  119. package/native-host/src/selectionScope.js +58 -0
  120. package/native-host/src/skills/parallel-subagents/SKILL.md +31 -3
  121. package/native-host/src/skills/writing-style-builder/SKILL.md +146 -0
  122. package/native-host/src/subagentBroker.js +102 -98
  123. package/native-host/src/subagentTelemetry.js +316 -0
  124. package/native-host/src/subagentWorkspace.js +103 -0
  125. package/native-host/src/subagentWorkspacePath.js +31 -0
  126. package/native-host/src/taskRunnerRuntime.js +55 -5
  127. package/native-host/src/turnAttachments.js +113 -0
  128. package/native-host/src/updateManager.js +122 -12
  129. package/native-host/src/updateNetworkControl.js +75 -0
  130. package/native-host/src/updateTrust.js +21 -2
  131. package/native-host/src/vendor/pdfjs/LICENSE +177 -0
  132. package/native-host/src/vendor/pdfjs/SOURCE.txt +3 -0
  133. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  134. package/native-host/src/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  135. package/native-host/src/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
  136. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  137. package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  138. package/native-host/src/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
  139. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  140. package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  141. package/native-host/src/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  142. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  143. package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  144. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  145. package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  146. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  147. package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  148. package/native-host/src/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
  149. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  150. package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  151. package/native-host/src/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
  152. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  153. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  154. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  155. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  156. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  157. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  158. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  159. package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  160. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  161. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  162. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  163. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  164. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  165. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  166. package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  167. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  168. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  169. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  170. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  171. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  172. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  173. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  174. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  175. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  176. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  177. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  178. package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  179. package/native-host/src/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
  180. package/native-host/src/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
  181. package/native-host/src/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  182. package/native-host/src/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  183. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  184. package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  185. package/native-host/src/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  186. package/native-host/src/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  187. package/native-host/src/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  188. package/native-host/src/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  189. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  190. package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  191. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  192. package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  193. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  194. package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  195. package/native-host/src/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
  196. package/native-host/src/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
  197. package/native-host/src/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
  198. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  199. package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  200. package/native-host/src/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
  201. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  202. package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  203. package/native-host/src/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
  204. package/native-host/src/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
  205. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  206. package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  207. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  208. package/native-host/src/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  209. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  210. package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  211. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  212. package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  213. package/native-host/src/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
  214. package/native-host/src/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
  215. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  216. package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  217. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  218. package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  219. package/native-host/src/vendor/pdfjs/cmaps/H.bcmap +0 -0
  220. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  221. package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  222. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  223. package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  224. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  225. package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  226. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  227. package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  228. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  229. package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  230. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  231. package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  232. package/native-host/src/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
  233. package/native-host/src/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
  234. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  235. package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  236. package/native-host/src/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
  237. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  238. package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  239. package/native-host/src/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
  240. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  241. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  242. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  243. package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  244. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  245. package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  246. package/native-host/src/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
  247. package/native-host/src/vendor/pdfjs/cmaps/LICENSE +36 -0
  248. package/native-host/src/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
  249. package/native-host/src/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
  250. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  251. package/native-host/src/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  252. package/native-host/src/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
  253. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  254. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  255. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  256. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  257. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  258. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  259. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  260. package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  261. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  262. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  263. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  264. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  265. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  266. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  267. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  268. package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  269. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  270. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  271. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  272. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  273. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  274. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  275. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  276. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  277. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  278. package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  279. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  280. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  281. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  282. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  283. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  284. package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  285. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  286. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  287. package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  288. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  289. package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  290. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  291. package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  292. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  293. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  294. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  295. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  296. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  297. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  298. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  299. package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  300. package/native-host/src/vendor/pdfjs/cmaps/V.bcmap +0 -0
  301. package/native-host/src/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  302. package/native-host/src/vendor/pdfjs/pdf.mjs +26740 -0
  303. package/native-host/src/vendor/pdfjs/pdf.worker.mjs +62201 -0
  304. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  305. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  306. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  307. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  308. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  309. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  310. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  311. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  312. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  313. package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  314. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  315. package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
  316. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  317. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  318. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  319. package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  320. package/native-host/src/writingStyleEvidence.js +102 -0
  321. package/native-host/src/writingStylePdfWorker.js +35 -0
  322. package/native-host/src/writingStyleProfile.js +165 -0
  323. package/native-host/src/writingStyleRuntime.js +447 -0
  324. package/package.json +1 -1
@@ -19,6 +19,9 @@ const fs = require('node:fs');
19
19
  const path = require('node:path');
20
20
 
21
21
  const { SUBAGENT_QUEUE_DIR } = require('./mirrorWorkspace');
22
+ const { safeWorkspaceRelativePath } = require('./subagentWorkspacePath');
23
+ const { compactEvent, publicText } = require('./subagentTelemetry');
24
+ const { createSubagentWorkspace } = require('./subagentWorkspace');
22
25
 
23
26
  const PROTOCOL_VERSION = 1;
24
27
  const JOB_ID_PATTERN = /^[a-z0-9-]{1,32}$/;
@@ -28,8 +31,8 @@ const SUMMARY_LIMIT_CHARS = 2048;
28
31
  const DEFAULT_LIMITS = Object.freeze({
29
32
  maxWorkers: 3,
30
33
  maxJobsPerRun: 8,
31
- perWorkerTimeoutMs: 300000,
32
- brokerBudgetMs: 900000,
34
+ perWorkerTimeoutMs: 600000,
35
+ brokerBudgetMs: 1800000,
33
36
  pollIntervalMs: 500,
34
37
  drainGraceMs: 30000
35
38
  });
@@ -46,12 +49,25 @@ function createSubagentBroker(options = {}) {
46
49
  const emit = typeof options.emit === 'function' ? options.emit : () => {};
47
50
  const onMirrorDirty = typeof options.onMirrorDirty === 'function' ? options.onMirrorDirty : () => {};
48
51
  const parentSignal = options.signal || null;
49
- const limits = { ...DEFAULT_LIMITS, ...(options.limits || {}) };
52
+ const env = options.env || process.env;
53
+ const boundedMs = (value, fallback, max) => Number.isFinite(Number(value)) && Number(value) > 0
54
+ ? Math.min(max, Math.max(60000, Number(value))) : fallback;
55
+ const limits = { ...DEFAULT_LIMITS,
56
+ perWorkerTimeoutMs: boundedMs(env.CODEX_OVERLEAF_SUBAGENT_TIMEOUT_MS, DEFAULT_LIMITS.perWorkerTimeoutMs, 900000),
57
+ brokerBudgetMs: boundedMs(env.CODEX_OVERLEAF_SUBAGENT_BUDGET_MS, DEFAULT_LIMITS.brokerBudgetMs, 3600000),
58
+ ...(options.limits || {}) };
50
59
 
51
60
  const queueRoot = path.join(workspacePath, SUBAGENT_QUEUE_DIR);
52
61
  const jobsDir = path.join(queueRoot, 'jobs');
53
62
  const resultsDir = path.join(queueRoot, 'results');
54
63
  const logsDir = path.join(queueRoot, 'logs');
64
+ const { atomicWrite, appendLog, adoptionHash, hashWorkspace, hashPaths, buildWorkerPrompt } =
65
+ createSubagentWorkspace({ workspacePath, logsDir });
66
+ const adoptionsDir = path.join(queueRoot, 'adoptions');
67
+ const adoptionResultsDir = path.join(queueRoot, 'adoption-results');
68
+ const quarantined = new Map();
69
+ const seenAdoptions = new Set();
70
+ let adoptionToken = '';
55
71
 
56
72
  const jobs = new Map(); // id -> { job, status, startedAt, ownedBefore }
57
73
  const seenFiles = new Set();
@@ -76,6 +92,8 @@ function createSubagentBroker(options = {}) {
76
92
  fs.mkdirSync(jobsDir, { recursive: true });
77
93
  fs.mkdirSync(resultsDir, { recursive: true });
78
94
  fs.mkdirSync(logsDir, { recursive: true });
95
+ fs.mkdirSync(adoptionsDir, { recursive: true });
96
+ fs.mkdirSync(adoptionResultsDir, { recursive: true });
79
97
  fs.mkdirSync(path.join(queueRoot, 'work'), { recursive: true });
80
98
  startedAt = Date.now();
81
99
  accepting = true;
@@ -94,16 +112,14 @@ function createSubagentBroker(options = {}) {
94
112
  maxJobsPerRun: limits.maxJobsPerRun,
95
113
  perWorkerTimeoutMs: limits.perWorkerTimeoutMs,
96
114
  brokerBudgetMs: limits.brokerBudgetMs,
115
+ activeWorkers: running.size,
116
+ adoptionToken,
117
+ adoptionDirectory: 'adoptions',
97
118
  acceptedUntil: new Date(startedAt + limits.brokerBudgetMs - limits.perWorkerTimeoutMs).toISOString()
98
119
  };
99
120
  atomicWrite(path.join(queueRoot, 'broker.json'), JSON.stringify(payload, null, 2));
100
121
  }
101
122
 
102
- function atomicWrite(target, text) {
103
- const tmp = path.join(path.dirname(target), `.tmp-${crypto.randomUUID()}`);
104
- fs.writeFileSync(tmp, text);
105
- fs.renameSync(tmp, target);
106
- }
107
123
 
108
124
  function pollOnce() {
109
125
  if (closed || cancelled) {
@@ -112,6 +128,7 @@ function createSubagentBroker(options = {}) {
112
128
  try {
113
129
  intakeJobs();
114
130
  fillSlots();
131
+ processAdoptions();
115
132
  } catch (_error) {
116
133
  // The queue is adversarial model output; the broker never throws on it.
117
134
  }
@@ -154,7 +171,9 @@ function createSubagentBroker(options = {}) {
154
171
  acceptedCount += 1;
155
172
  jobs.set(job.id, { job, status: 'queued' });
156
173
  queued.push(job.id);
157
- emit('codex.subagent.queued', job.title || job.id, { jobId: job.id, files: job.files }, 'running');
174
+ emit('codex.subagent.queued', publicText(job.title || job.id, 160), {
175
+ jobId: job.id, files: job.files, task: publicText(job.task, 4096)
176
+ }, 'running');
158
177
  }
159
178
 
160
179
  function idFromFileName(name) {
@@ -212,30 +231,6 @@ function createSubagentBroker(options = {}) {
212
231
  return null;
213
232
  }
214
233
 
215
- function safeWorkspaceRelativePath(value) {
216
- if (typeof value !== 'string' || !value.trim()) {
217
- return null;
218
- }
219
- const normalized = value.trim().replace(/\\/g, '/').replace(/^\.\//, '');
220
- if (!normalized || path.isAbsolute(normalized)) {
221
- return null;
222
- }
223
- const segments = normalized.split('/');
224
- if (segments.some(segment => segment === '..' || segment === '')) {
225
- return null;
226
- }
227
- if (segments[0] === SUBAGENT_QUEUE_DIR) {
228
- // The queue control plane (jobs/results/logs/broker.json) is never
229
- // ownable — but the work/ scratch zone IS: single-file fan-out slices
230
- // live there (v1.6.1 scatter-gather), excluded from writeback by the
231
- // mirror-scan rule yet fully owned/hashed like any other job file.
232
- if (segments[1] === 'work' && segments.length >= 3) {
233
- return segments.join('/');
234
- }
235
- return null;
236
- }
237
- return segments.join('/');
238
- }
239
234
 
240
235
  function writeRejection(input) {
241
236
  const result = {
@@ -283,6 +278,9 @@ function createSubagentBroker(options = {}) {
283
278
  try {
284
279
  writeResult({ id: jobId, status: 'failed', reason: error?.message || 'subagent failed to start' });
285
280
  } catch (_writeError) { /* result dir may be gone */ }
281
+ emit('codex.subagent.failed', publicText(entry?.job?.title || jobId, 160), {
282
+ jobId, status: 'failed', reason: publicText(error?.message || 'subagent failed to start', 1200)
283
+ }, 'warning');
286
284
  }
287
285
  }
288
286
  }
@@ -313,8 +311,9 @@ function createSubagentBroker(options = {}) {
313
311
  controller.abort(new Error('subagent timeout'));
314
312
  }, limits.perWorkerTimeoutMs);
315
313
 
316
- emit('codex.subagent.started', job.title || job.id, {
314
+ emit('codex.subagent.started', publicText(job.title || job.id, 160), {
317
315
  jobId: job.id,
316
+ task: publicText(job.task, 4096),
318
317
  files: job.files,
319
318
  activeWorkers: running.size + 1,
320
319
  maxWorkers: limits.maxWorkers
@@ -323,7 +322,21 @@ function createSubagentBroker(options = {}) {
323
322
  const promise = runWorkerTask({
324
323
  jobId: job.id,
325
324
  prompt: buildWorkerPrompt(job),
326
- signal: controller.signal
325
+ signal: controller.signal,
326
+ onEvent: event => {
327
+ if (closed || entry.status !== 'running') return;
328
+ try {
329
+ const bounded = compactEvent(event);
330
+ if (!bounded) return;
331
+ const params = bounded.detail?.params || {};
332
+ entry.threadId = bounded.detail?.threadId || params.threadId || params.thread?.id || entry.threadId || '';
333
+ entry.sequence = (entry.sequence || 0) + 1;
334
+ emit('codex.subagent.event', publicText(job.title || job.id, 160), {
335
+ source: 'broker', jobId: job.id, threadId: entry.threadId,
336
+ sequence: entry.sequence, event: bounded
337
+ }, 'running');
338
+ } catch (_error) { /* Observability must not fail or stop the worker. */ }
339
+ }
327
340
  }).then(workerResult => {
328
341
  finishWorker(entry, {
329
342
  status: 'completed',
@@ -362,12 +375,13 @@ function createSubagentBroker(options = {}) {
362
375
  // demotion reads getViolationPaths() and drops these from writeback
363
376
  // (spec S8 safety extension, v1.6.2).
364
377
  for (const file of changedFiles) {
365
- violationPaths.add(file);
378
+ quarantined.set(file, { jobId: job.id, status: resultFields.status, adoptedHash: '' });
366
379
  }
367
380
  }
368
381
  const result = {
369
382
  id: job.id,
370
383
  ...resultFields,
384
+ threadId: workerResult?.threadId || entry.threadId || '',
371
385
  changedFiles,
372
386
  durationMs: Date.now() - entry.startedAt
373
387
  };
@@ -377,24 +391,23 @@ function createSubagentBroker(options = {}) {
377
391
  atomicWrite(path.join(resultsDir, `${job.id}.last-message.md`), String(workerResult.assistantMessage));
378
392
  }
379
393
  const eventType = resultFields.status === 'completed' ? 'codex.subagent.completed' : 'codex.subagent.failed';
380
- emit(eventType, job.title || job.id, {
394
+ emit(eventType, publicText(job.title || job.id, 160), {
381
395
  jobId: job.id,
396
+ threadId: result.threadId,
382
397
  status: resultFields.status,
383
- reason: resultFields.reason,
398
+ reason: publicText(resultFields.reason, 1200),
399
+ summary: publicText(workerResult?.assistantMessage || resultFields.summary, 24000),
384
400
  changedFiles,
385
401
  durationMs: result.durationMs
386
402
  }, resultFields.status === 'completed' ? 'completed' : 'warning');
387
403
  }
388
404
 
389
- function appendLog(jobId, text) {
390
- try {
391
- fs.appendFileSync(path.join(logsDir, `${jobId}.log`), `${new Date().toISOString()} ${text}\n`);
392
- } catch (_error) { /* logs are best-effort */ }
393
- }
394
405
 
395
406
  // ---- wave tracking (spec S5): owned attribution is per worker; unowned
396
407
  // changes can only be attributed to the wave's set of suspects.
397
408
  function beginWave() {
409
+ adoptionToken = '';
410
+ writeBrokerFile('ready');
398
411
  waveIndex += 1;
399
412
  waveSnapshot = {
400
413
  hashes: hashWorkspace(),
@@ -434,68 +447,49 @@ function createSubagentBroker(options = {}) {
434
447
  emit('codex.subagent.violation', file, violation, 'warning');
435
448
  }
436
449
  waveSnapshot = null;
450
+ if (!closed && !cancelled && accepting && running.size === 0) {
451
+ // Workers have exited before this capability is published. A worker
452
+ // cannot pre-authorize its own incomplete output while still running.
453
+ adoptionToken = crypto.randomBytes(24).toString('hex');
454
+ writeBrokerFile('ready');
455
+ }
437
456
  }
438
457
 
439
- function hashWorkspace() {
440
- const hashes = new Map();
441
- walk(workspacePath, '');
442
- return hashes;
443
458
 
444
- function walk(dir, prefix) {
445
- let entries;
459
+ function processAdoptions() {
460
+ if (closed || cancelled || running.size || !adoptionToken || !fs.existsSync(adoptionsDir)) return;
461
+ for (const name of fs.readdirSync(adoptionsDir).filter(name => /^[a-z0-9-]{1,32}\.json$/.test(name)).slice(0, 64)) {
462
+ if (seenAdoptions.has(name)) continue;
463
+ seenAdoptions.add(name);
464
+ let result = { ok: false, reason: 'invalid_adoption' };
446
465
  try {
447
- entries = fs.readdirSync(dir, { withFileTypes: true });
448
- } catch (_error) {
449
- return;
450
- }
451
- for (const entry of entries) {
452
- // The whole queue zone (incl. the work/ slice scratch) stays out of
453
- // wave hashing: scratch can never reach Overleaf, same-wave slices
454
- // are all in the owned union anyway, and a lead staggering slice
455
- // creation mid-wave must not read as a violation (v1.6.1).
456
- if (entry.name === '.DS_Store' || entry.name === SUBAGENT_QUEUE_DIR || entry.name === '.codex-overleaf-attachments') {
457
- continue;
458
- }
459
- const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
460
- const absolute = path.join(dir, entry.name);
461
- if (entry.isDirectory()) {
462
- walk(absolute, relative);
463
- } else if (entry.isFile()) {
464
- hashes.set(relative, hashFile(absolute));
466
+ const requestPath = path.join(adoptionsDir, name), stat = fs.lstatSync(requestPath);
467
+ if (!stat.isFile() || stat.size > MAX_JOB_FILE_BYTES) throw new Error('invalid_adoption_file');
468
+ const request = JSON.parse(fs.readFileSync(requestPath, 'utf8'));
469
+ if (request.token !== adoptionToken || request.reviewed !== true || !Array.isArray(request.files)
470
+ || !request.files.length || request.files.length > 100) throw new Error('adoption_not_authorized');
471
+ const approved = [];
472
+ for (const item of request.files) {
473
+ const safe = safeWorkspaceRelativePath(item?.path), held = quarantined.get(safe);
474
+ const entry = held && jobs.get(held.jobId);
475
+ if (!safe || !held || held.jobId !== item.jobId || !entry?.job?.files.includes(safe)
476
+ || violationPaths.has(safe) || !/^[a-f0-9]{64}$/i.test(item.sha256 || '')
477
+ || adoptionHash(safe) !== item.sha256.toLowerCase()) throw new Error('adoption_content_or_owner_mismatch');
478
+ approved.push({ path: safe, sha256: item.sha256.toLowerCase(), held });
465
479
  }
466
- }
480
+ for (const item of approved) item.held.adoptedHash = item.sha256;
481
+ result = { ok: true, files: approved.map(item => ({ path: item.path, sha256: item.sha256 })) };
482
+ } catch (error) { result = { ok: false, reason: String(error?.message || error).slice(0, 200) }; }
483
+ atomicWrite(path.join(adoptionResultsDir, name), JSON.stringify(result, null, 2));
467
484
  }
468
485
  }
469
486
 
470
- function hashPaths(files) {
471
- const hashes = new Map();
472
- for (const file of files) {
473
- hashes.set(file, hashFile(path.join(workspacePath, file)));
487
+ function blockedPaths() {
488
+ const blocked = new Set(violationPaths);
489
+ for (const [file, held] of quarantined) {
490
+ if (!held.adoptedHash || adoptionHash(file) !== held.adoptedHash) blocked.add(file);
474
491
  }
475
- return hashes;
476
- }
477
-
478
- function hashFile(absolute) {
479
- try {
480
- return crypto.createHash('sha1').update(fs.readFileSync(absolute)).digest('hex');
481
- } catch (_error) {
482
- return 'missing';
483
- }
484
- }
485
-
486
- function buildWorkerPrompt(job) {
487
- const readOnly = job.readOnlyContext.length
488
- ? `- You may read these for context but must not modify them: ${job.readOnlyContext.join(', ')}.\n`
489
- : '';
490
- return [
491
- 'You are a subagent working on one slice of a larger task.',
492
- 'HARD CONSTRAINTS:',
493
- `- You may modify ONLY these files: ${job.files.join(', ')}.`,
494
- readOnly + '- Do not modify, create, or delete any other file. Inside .codex-overleaf-subagents/ you may touch ONLY the slice files listed above (if any).',
495
- '- Work fully autonomously; nobody can answer questions.',
496
- '',
497
- job.task
498
- ].join('\n');
492
+ return blocked;
499
493
  }
500
494
 
501
495
  function onParentAbort() {
@@ -508,6 +502,9 @@ function createSubagentBroker(options = {}) {
508
502
  const entry = jobs.get(jobId);
509
503
  entry.status = 'cancelled';
510
504
  writeResult({ id: jobId, status: 'cancelled', reason: 'run cancelled' });
505
+ emit('codex.subagent.failed', publicText(entry.job.title || jobId, 160), {
506
+ jobId, status: 'cancelled', reason: 'run cancelled'
507
+ }, 'warning');
511
508
  }
512
509
  if (anyWorkerStarted) {
513
510
  // Partial worker edits must be deterministically discarded: cancellation
@@ -519,6 +516,7 @@ function createSubagentBroker(options = {}) {
519
516
  }
520
517
 
521
518
  async function stop({ drain = true } = {}) {
519
+ processAdoptions();
522
520
  accepting = false;
523
521
  // Queued-but-unstarted jobs would otherwise vanish with no result file,
524
522
  // hanging a lead still polling for its job count. Settle them first
@@ -529,6 +527,9 @@ function createSubagentBroker(options = {}) {
529
527
  entry.status = 'cancelled';
530
528
  }
531
529
  writeResult({ id: jobId, status: 'cancelled', reason: 'The run ended before this subagent started.' });
530
+ emit('codex.subagent.failed', publicText(entry?.job?.title || jobId, 160), {
531
+ jobId, status: 'cancelled', reason: 'The run ended before this subagent started.'
532
+ }, 'warning');
532
533
  }
533
534
  if (drain && running.size) {
534
535
  let graceTimer = null;
@@ -599,7 +600,8 @@ function createSubagentBroker(options = {}) {
599
600
  pollOnce,
600
601
  hasActiveWorkers: () => running.size > 0,
601
602
  hasAcceptedJobs: () => jobs.size > 0,
602
- getViolationPaths: () => new Set(violationPaths),
603
+ getViolationPaths: blockedPaths,
604
+ getBlockedReason: file => violationPaths.has(file) ? 'subagent_unauthorized_edit' : 'subagent_unfinished_output',
603
605
  getAuditSummary: () => ({
604
606
  jobs: [...jobs.values()].map(entry => ({
605
607
  id: entry.job?.id,
@@ -609,7 +611,9 @@ function createSubagentBroker(options = {}) {
609
611
  reason: entry.result?.reason,
610
612
  durationMs: entry.result?.durationMs
611
613
  })),
612
- violations: violations.slice()
614
+ violations: violations.slice(),
615
+ quarantined: [...quarantined].map(([file, item]) => ({ path: file, jobId: item.jobId, status: item.status,
616
+ adopted: Boolean(item.adoptedHash && adoptionHash(file) === item.adoptedHash) }))
613
617
  })
614
618
  };
615
619
  }