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.
- package/README.md +272 -314
- package/README.zh-CN.md +287 -329
- package/extension/bootstrap/background.js +47 -10
- package/extension/bootstrap/manifest.template.json +9 -4
- package/extension/bootstrap/popup.html +10 -16
- package/extension/bootstrap/update.js +25 -2
- package/extension/runtime-manifest.json +3 -1
- package/extension/src/background.js +28 -3
- package/extension/src/backgroundSharedSessions.js +380 -0
- package/extension/src/backgroundUpdateCoordinator.js +442 -379
- package/extension/src/content/activeTurnControl.js +8 -0
- package/extension/src/content/assetTransferBroker.js +186 -12
- package/extension/src/content/changeHistoryView.js +175 -0
- package/extension/src/content/composerAttachments.js +24 -22
- package/extension/src/content/composerPanel.js +23 -8
- package/extension/src/content/contentRuntime.js +507 -507
- package/extension/src/content/diagnosticsController.js +1 -2
- package/extension/src/content/diagnosticsExport.js +222 -0
- package/extension/src/content/diagnosticsPanel.js +48 -19
- package/extension/src/content/diffReviewPanel.js +8 -5
- package/extension/src/content/generated/content.bundle.js +8330 -1349
- package/extension/src/content/generated/content.bundle.meta.json +22 -3
- package/extension/src/content/legacyGlobalRegistry.js +19 -1
- package/extension/src/content/localSkillsPanel.js +42 -7
- package/extension/src/content/markdownDomRenderer.js +9 -4
- package/extension/src/content/modelPicker.js +1 -1
- package/extension/src/content/pageBridgeClient.js +18 -3
- package/extension/src/content/panelMaintenance.js +48 -121
- package/extension/src/content/panelRenderer.js +4 -0
- package/extension/src/content/pendingInputView.js +109 -76
- package/extension/src/content/providerSettingsCoordinator.js +17 -6
- package/extension/src/content/providerSettingsDialog.js +661 -108
- package/extension/src/content/recentProjects.js +10 -1
- package/extension/src/content/runActivitySummary.js +631 -0
- package/extension/src/content/runController.js +3 -1
- package/extension/src/content/runFailureNotice.js +14 -1
- package/extension/src/content/runGuidanceController.js +4 -3
- package/extension/src/content/runPresence.js +306 -0
- package/extension/src/content/runQueueScheduler.js +2 -1
- package/extension/src/content/runResultActions.js +123 -3
- package/extension/src/content/runTimelineView.js +186 -154
- package/extension/src/content/selectionContextView.js +300 -0
- package/extension/src/content/sessionPersistence.js +6 -1
- package/extension/src/content/settingsPanel.js +77 -52
- package/extension/src/content/settingsWorkbench.js +374 -0
- package/extension/src/content/sharedSessionViewSync.js +72 -0
- package/extension/src/content/subagentActivityView.js +195 -0
- package/extension/src/content/trackedChangeCaptureController.js +7 -3
- package/extension/src/content/updateNotice.js +121 -50
- package/extension/src/content/writebackController.js +257 -0
- package/extension/src/content/writebackOrchestrator.js +146 -141
- package/extension/src/content/writebackPlan.js +231 -0
- package/extension/src/content/writebackRecovery.js +122 -0
- package/extension/src/content/writingStyleSettings.js +576 -0
- package/extension/src/content/writtenChangesView.js +152 -0
- package/extension/src/page/binaryAssetUploader.js +97 -19
- package/extension/src/page/overleafProjectSnapshot.js +1 -0
- package/extension/src/page/referenceProjects.js +148 -0
- package/extension/src/page/saveState.js +14 -2
- package/extension/src/page/snapshotRouter.js +44 -13
- package/extension/src/page/textCoordinates.js +102 -0
- package/extension/src/page/textFileCreator.js +350 -59
- package/extension/src/page/trackedChangeCapture.js +42 -56
- package/extension/src/page/trackedChangeOwnership.js +198 -0
- package/extension/src/page/trackedChangeReplay.js +164 -0
- package/extension/src/page/trackedChangesLifecycle.js +135 -149
- package/extension/src/page/treeOperations.js +26 -2
- package/extension/src/page/writebackReceiptJournal.js +112 -0
- package/extension/src/page/writebackRouter.js +175 -135
- package/extension/src/pageBridge.js +56 -101
- package/extension/src/popup.js +203 -59
- package/extension/src/shared/agentTranscript.js +18 -4
- package/extension/src/shared/auditRecords.js +71 -0
- package/extension/src/shared/changeHistoryModel.js +94 -0
- package/extension/src/shared/compatibility.js +1 -1
- package/extension/src/shared/compileAdapter.js +42 -0
- package/extension/src/shared/failureReasons.js +20 -0
- package/extension/src/shared/globalPreferences.js +1 -1
- package/extension/src/shared/i18n.js +93 -25
- package/extension/src/shared/managedUpdateProjection.js +6 -3
- package/extension/src/shared/pageRpcContract.js +7 -1
- package/extension/src/shared/providerProfiles.js +109 -0
- package/extension/src/shared/runActivityModel.js +361 -0
- package/extension/src/shared/runExecutionSnapshot.js +8 -2
- package/extension/src/shared/runExecutionSnapshotCodec.js +16 -4
- package/extension/src/shared/scopedPersistenceBrowserAdapter.js +6 -3
- package/extension/src/shared/selectionContext.js +28 -0
- package/extension/src/shared/sessionState.js +97 -6
- package/extension/src/shared/sharedSessionBridge.js +288 -0
- package/extension/src/shared/storageDb.js +22 -55
- package/extension/src/shared/storageMigration.js +3 -0
- package/extension/src/shared/storageRunActions.js +10 -4
- package/extension/src/shared/storageValuePruning.js +40 -0
- package/extension/src/shared/subagentActivityModel.js +174 -0
- package/extension/src/shared/undoOperations.js +87 -0
- package/extension/src/shared/updateConsent.js +37 -8
- package/extension/src/shared/writebackIntent.js +62 -0
- package/extension/src/shared/writebackSettlement.js +29 -10
- package/extension/src/shared/writingStyle.js +33 -0
- package/extension/styles/panel.css +1972 -384
- package/extension/styles/popup.css +110 -0
- package/native-host/src/anthropicBridgeRequest.js +2 -1
- package/native-host/src/codexModelRecovery.js +107 -0
- package/native-host/src/codexPromptAssembly.js +2 -0
- package/native-host/src/codexProviderLaunch.js +3 -3
- package/native-host/src/codexRuntimeIdentity.js +1 -0
- package/native-host/src/codexSessionRunner.js +106 -140
- package/native-host/src/codexSessionTiming.js +3 -0
- package/native-host/src/managedInstall.js +5 -4
- package/native-host/src/nativeEnvironment.js +70 -0
- package/native-host/src/nativeQuotas.js +15 -8
- package/native-host/src/overleafWorkspaceRules.js +16 -0
- package/native-host/src/processStopBarrier.js +80 -0
- package/native-host/src/providerModelCatalog.js +4 -3
- package/native-host/src/providerProfile.js +13 -1
- package/native-host/src/providerReasoning.js +9 -5
- package/native-host/src/providerStore.js +4 -0
- package/native-host/src/releaseTransport.js +14 -5
- package/native-host/src/selectionScope.js +58 -0
- package/native-host/src/skills/parallel-subagents/SKILL.md +31 -3
- package/native-host/src/skills/writing-style-builder/SKILL.md +146 -0
- package/native-host/src/subagentBroker.js +102 -98
- package/native-host/src/subagentTelemetry.js +316 -0
- package/native-host/src/subagentWorkspace.js +103 -0
- package/native-host/src/subagentWorkspacePath.js +31 -0
- package/native-host/src/taskRunnerRuntime.js +55 -5
- package/native-host/src/turnAttachments.js +113 -0
- package/native-host/src/updateManager.js +122 -12
- package/native-host/src/updateNetworkControl.js +75 -0
- package/native-host/src/updateTrust.js +21 -2
- package/native-host/src/vendor/pdfjs/LICENSE +177 -0
- package/native-host/src/vendor/pdfjs/SOURCE.txt +3 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
- package/native-host/src/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
- package/native-host/src/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/LICENSE +36 -0
- package/native-host/src/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/V.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
- package/native-host/src/vendor/pdfjs/pdf.mjs +26740 -0
- package/native-host/src/vendor/pdfjs/pdf.worker.mjs +62201 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
- package/native-host/src/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
- package/native-host/src/writingStyleEvidence.js +102 -0
- package/native-host/src/writingStylePdfWorker.js +35 -0
- package/native-host/src/writingStyleProfile.js +165 -0
- package/native-host/src/writingStyleRuntime.js +447 -0
- 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:
|
|
32
|
-
brokerBudgetMs:
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
445
|
-
|
|
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
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
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
|
|
471
|
-
const
|
|
472
|
-
for (const file of
|
|
473
|
-
|
|
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
|
|
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:
|
|
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
|
}
|