rea-agents 3.0.0 → 3.2.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 (628) hide show
  1. package/README.md +83 -108
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -3,16 +3,15 @@ import { ArtifactReaderFailure, } from "../../artifacts/ArtifactReader.js";
3
3
  import { AsarArtifactReader } from "../../artifacts/AsarArtifactReader.js";
4
4
  import { classifyArtifactContent, createArtifactNode, createOccurrence, nearestParent, } from "../ArtifactGraphConstruction.js";
5
5
  import { STRICT_INTEGRITY_POLICY, } from "./types.js";
6
- import { hashReadable, preflightEntry } from "./hash.js";
6
+ import { hashReadable } from "./hash.js";
7
7
  const UNAVAILABLE_UNPACKED_LIMITATION = "ASAR unpacked companion bytes were unavailable; no content hash or child artifact was produced.";
8
8
  const emptyScan = () => ({ nodes: new Map(), occurrences: [], pendingContradictions: [] });
9
- export const scanReader = async (reader, limits, signal, integrity = STRICT_INTEGRITY_POLICY) => {
9
+ export const scanReader = async (reader, signal, integrity = STRICT_INTEGRITY_POLICY) => {
10
10
  const { nodes, occurrences, pendingContradictions } = emptyScan();
11
11
  if (reader === undefined)
12
12
  return { nodes, occurrences, pendingContradictions };
13
13
  const context = {
14
14
  reader,
15
- limits,
16
15
  signal,
17
16
  integrity,
18
17
  nodes,
@@ -20,65 +19,93 @@ export const scanReader = async (reader, limits, signal, integrity = STRICT_INTE
20
19
  pendingContradictions,
21
20
  occurrenceByPath: new Map(),
22
21
  registry: new ArtifactPathRegistry(),
23
- totalBytes: 0,
24
22
  };
25
23
  await visitArtifactEntries(context, reader, "");
26
24
  return { nodes, occurrences, pendingContradictions };
27
25
  };
28
26
  const visitArtifactEntries = async (context, currentReader, prefix) => {
29
- for await (const entry of currentReader.entries(context.signal)) {
30
- if (context.occurrences.length >= context.limits.maxEntries)
31
- throw new ArtifactReaderFailure("limit", "Artifact entry limit exceeded");
32
- const logicalPath = normalizeArtifactPath(prefix.length === 0 ? entry.path : `${prefix}/${entry.path}`, context.limits);
33
- const expandableAsar = isExpandableAsar(entry, logicalPath);
34
- context.registry.add(logicalPath, expandableAsar ? "directory" : entry.kind);
35
- preflightEntry(entry, context.limits);
36
- const parent = nearestParent(logicalPath, context.occurrenceByPath);
37
- const occurrence = createOccurrence(entry, logicalPath, parent?.occurrence_id ?? null);
38
- let digested;
39
- try {
40
- digested = await digestArtifactEntry(context, currentReader, entry, logicalPath);
41
- }
42
- catch (cause) {
43
- if (!isUnavailableUnpackedEntry(cause, entry))
44
- throw cause;
45
- occurrence.hash_status = "unavailable";
46
- occurrence.limitations.push(UNAVAILABLE_UNPACKED_LIMITATION);
47
- }
48
- if (digested !== undefined) {
49
- context.nodes.set(digested.node.artifact_id, digested.node);
50
- occurrence.artifact_id = digested.node.artifact_id;
51
- occurrence.hash_status = digested.mismatched ? "mismatched" : "verified";
52
- if (digested.mismatched)
53
- occurrence.limitations.push("Declared integrity metadata contradicts observed bytes.");
27
+ const stack = [
28
+ {
29
+ reader: currentReader,
30
+ prefix,
31
+ iterator: currentReader.entries(context.signal)[Symbol.asyncIterator](),
32
+ owned: false,
33
+ },
34
+ ];
35
+ try {
36
+ while (stack.length > 0) {
37
+ const frame = stack.at(-1);
38
+ if (frame === undefined)
39
+ break;
40
+ const next = await frame.iterator.next();
41
+ if (next.done) {
42
+ stack.pop();
43
+ if (frame.owned)
44
+ await frame.reader.close();
45
+ continue;
46
+ }
47
+ const entry = next.value;
48
+ const logicalPath = normalizeArtifactPath(frame.prefix.length === 0
49
+ ? entry.path
50
+ : `${frame.prefix}/${entry.path}`);
51
+ const expandableAsar = isExpandableAsar(entry, logicalPath);
52
+ context.registry.add(logicalPath, expandableAsar ? "directory" : entry.kind);
53
+ const parent = nearestParent(logicalPath, context.occurrenceByPath);
54
+ const occurrence = createOccurrence(entry, logicalPath, parent?.occurrence_id ?? null);
55
+ let digested;
56
+ try {
57
+ digested = await digestArtifactEntry(context, frame.reader, entry, logicalPath);
58
+ }
59
+ catch (cause) {
60
+ if (!isUnavailableUnpackedEntry(cause, entry))
61
+ throw cause;
62
+ occurrence.hash_status = "unavailable";
63
+ occurrence.limitations.push(UNAVAILABLE_UNPACKED_LIMITATION);
64
+ }
65
+ if (digested !== undefined) {
66
+ context.nodes.set(digested.node.artifact_id, digested.node);
67
+ occurrence.artifact_id = digested.node.artifact_id;
68
+ occurrence.hash_status = digested.mismatched
69
+ ? "mismatched"
70
+ : "verified";
71
+ if (digested.mismatched)
72
+ occurrence.limitations.push("Declared integrity metadata contradicts observed bytes.");
73
+ }
74
+ context.occurrences.push(occurrence);
75
+ context.occurrenceByPath.set(logicalPath, occurrence);
76
+ if (expandableAsar && digested?.mismatched !== true) {
77
+ const nested = new AsarArtifactReader(entry.adapterKey);
78
+ stack.push({
79
+ reader: nested,
80
+ prefix: logicalPath,
81
+ iterator: nested.entries(context.signal)[Symbol.asyncIterator](),
82
+ owned: true,
83
+ });
84
+ }
54
85
  }
55
- context.occurrences.push(occurrence);
56
- context.occurrenceByPath.set(logicalPath, occurrence);
57
- if (expandableAsar && digested?.mismatched !== true)
58
- await visitNestedAsar(context, entry.adapterKey, logicalPath);
86
+ }
87
+ finally {
88
+ await Promise.allSettled(stack
89
+ .filter(({ owned }) => owned)
90
+ .map(async ({ reader, iterator }) => {
91
+ await iterator.return?.();
92
+ await reader.close();
93
+ }));
59
94
  }
60
95
  };
61
96
  const digestArtifactEntry = async (context, currentReader, entry, logicalPath) => {
62
97
  if ((entry.kind !== "file" && entry.kind !== "slice") || entry.encrypted)
63
98
  return undefined;
64
- const remainingBytes = context.limits.maxTotalBytes - context.totalBytes;
65
- if (remainingBytes <= 0)
66
- throw new ArtifactReaderFailure("limit", "Artifact total byte limit exceeded");
67
- if (entry.declaredSize !== null && entry.declaredSize > remainingBytes)
68
- throw new ArtifactReaderFailure("limit", "Declared artifact bytes exceed remaining cumulative limit");
69
- const digest = await hashReadable(await currentReader.open(entry, context.signal), Math.min(context.limits.maxEntryBytes, remainingBytes), context.signal);
70
- context.totalBytes += digest.bytes;
99
+ const digest = await hashReadable(await currentReader.open(entry, context.signal), context.signal);
71
100
  const mismatched = entry.declaredSha256 !== null && entry.declaredSha256 !== digest.sha256;
72
- if (mismatched && context.integrity.mode === "fail")
73
- throw new ArtifactReaderFailure("integrity", `Artifact integrity metadata disagrees with content: ${logicalPath}`, undefined, {
74
- logicalPath,
75
- declaredSha256: entry.declaredSha256,
76
- calculatedSha256: digest.sha256,
77
- unpacked: entry.unpacked,
78
- });
79
101
  if (mismatched && entry.declaredSha256 !== null) {
80
- if (context.pendingContradictions.length >= context.integrity.maxMismatches)
81
- throw new ArtifactReaderFailure("limit", "Artifact integrity mismatch limit exceeded");
102
+ if (context.integrity.mode === "fail")
103
+ throw new ArtifactReaderFailure("integrity", `Artifact integrity metadata disagrees with content: ${logicalPath}`, undefined, {
104
+ logicalPath,
105
+ declaredSha256: entry.declaredSha256,
106
+ calculatedSha256: digest.sha256,
107
+ unpacked: entry.unpacked,
108
+ });
82
109
  context.pendingContradictions.push({
83
110
  logicalPath,
84
111
  declaredSha256: entry.declaredSha256,
@@ -107,15 +134,6 @@ const digestArtifactEntry = async (context, currentReader, entry, logicalPath) =
107
134
  mismatched,
108
135
  };
109
136
  };
110
- const visitNestedAsar = async (context, adapterKey, logicalPath) => {
111
- const nested = new AsarArtifactReader(adapterKey);
112
- try {
113
- await visitArtifactEntries(context, nested, logicalPath);
114
- }
115
- finally {
116
- await nested.close();
117
- }
118
- };
119
137
  const isExpandableAsar = (entry, logicalPath) => entry.kind === "file" &&
120
138
  logicalPath.toLowerCase().endsWith(".asar") &&
121
139
  entry.adapterKey.startsWith("/");
@@ -1,10 +1,6 @@
1
1
  export const NATIVE_MOUNT_DISABLED = {
2
- nativeMountApproved: false,
3
- nativeMountEnabled: false,
2
+ status: "disabled",
4
3
  };
5
4
  export const STRICT_INTEGRITY_POLICY = {
6
5
  mode: "fail",
7
- approved: false,
8
- enabled: false,
9
- maxMismatches: 1,
10
6
  };
@@ -1,24 +1,16 @@
1
1
  import { realpath } from "node:fs/promises";
2
2
  import { artifactInventoryResultSchema, } from "../domain/artifactGraph.js";
3
- import { pageOf } from "./ArtifactGraphConstruction.js";
4
3
  import { abortIfNeeded } from "./ArtifactInventory/hash.js";
5
4
  import { scanCanonicalArtifactInventory } from "./ArtifactInventory/scanCanonical.js";
6
5
  export { scanCanonicalArtifactInventory } from "./ArtifactInventory/scanCanonical.js";
7
- /** Inventory one local artifact without extracting or mounting it. */
8
- export const inventoryArtifact = async (inputPath, limits, page, options = {}) => {
9
- const snapshot = await scanArtifactInventory(inputPath, limits, options);
10
- return paginateArtifactInventory(snapshot, page);
6
+ /** Inventory one local artifact and return every graph collection inline. */
7
+ export const inventoryArtifact = async (inputPath, options = {}) => {
8
+ const snapshot = await scanArtifactInventory(inputPath, options);
9
+ return artifactInventoryResultSchema.parse(snapshot);
11
10
  };
12
11
  /** Scan an artifact once and retain the complete immutable graph for projection. */
13
- export const scanArtifactInventory = async (inputPath, limits, options = {}) => {
12
+ export const scanArtifactInventory = async (inputPath, options = {}) => {
14
13
  abortIfNeeded(options.signal);
15
14
  const path = await realpath(inputPath);
16
- return scanCanonicalArtifactInventory(path, limits, options);
15
+ return scanCanonicalArtifactInventory(path, options);
17
16
  };
18
- /** Project independently paged graph collections from one inventory snapshot. */
19
- export const paginateArtifactInventory = (snapshot, page) => artifactInventoryResultSchema.parse({
20
- ...snapshot,
21
- nodes: pageOf(snapshot.nodes, page.nodeOffset, page.nodeLimit),
22
- occurrences: pageOf(snapshot.occurrences, page.occurrenceOffset, page.occurrenceLimit),
23
- edges: pageOf(snapshot.edges, page.edgeOffset, page.edgeLimit),
24
- });
@@ -1,17 +1,7 @@
1
1
  import { realpath } from "node:fs/promises";
2
- import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
3
- import { withinRoot } from "../reference/ReferenceSourceReaderPaths.js";
4
2
  import { scanCanonicalArtifactInventory, } from "./ArtifactInventory.js";
5
- import { canonicalizeConfiguredRoots } from "./ConfiguredRoots.js";
6
3
  /** Resolve, authorize, and scan one artifact without a second path resolution. */
7
- export const scanAuthorizedArtifactInventory = async (inputPath, roots, limits, options = {}) => {
8
- if (roots.length === 0)
9
- throw new ArtifactReaderFailure("path", "Artifact input roots are disabled");
10
- const [path, approved] = await Promise.all([
11
- realpath(inputPath),
12
- canonicalizeConfiguredRoots(roots),
13
- ]);
14
- if (!approved.some((root) => withinRoot(root, path)))
15
- throw new ArtifactReaderFailure("path", "Artifact path is outside approved input roots");
16
- return scanCanonicalArtifactInventory(path, limits, options);
4
+ export const scanAuthorizedArtifactInventory = async (inputPath, options = {}) => {
5
+ const path = await realpath(inputPath);
6
+ return scanCanonicalArtifactInventory(path, options);
17
7
  };
@@ -19,20 +19,15 @@ const ENHANCED_OPERATIONS = new Set(GENERATED_MCP_TOOL_CATALOG.filter(({ kind })
19
19
  * of retaining a client whose resources were already shut down.
20
20
  */
21
21
  export class BinarySession extends BinarySessionRecords {
22
- provider;
23
22
  #active;
24
23
  #transition = Promise.resolve();
25
24
  #calls = new Set();
26
25
  #providerRouter;
27
- #runtimeAvailability = new Map();
26
+ #runtimeUnavailability = new Map();
28
27
  #availabilityListeners = new Set();
29
- constructor(provider, options = {}) {
28
+ constructor(providerRouter) {
30
29
  super();
31
- this.provider = provider;
32
- this.#providerRouter =
33
- provider instanceof SessionProviderRouter
34
- ? provider
35
- : SessionProviderRouter.legacy(provider, options);
30
+ this.#providerRouter = providerRouter;
36
31
  }
37
32
  /** Identify the provider producing evidence for this session. */
38
33
  providerIdentity(operation) {
@@ -173,7 +168,14 @@ export class BinarySession extends BinarySessionRecords {
173
168
  await this.#drainCalls();
174
169
  const closed = previous === undefined
175
170
  ? ok(null)
176
- : await closeAnalysisClient(previous.client, previous.route.identity.id, options);
171
+ : await closeAnalysisClient(previous.client, previous.route.identity.id, {
172
+ ...(options.progress === undefined
173
+ ? {}
174
+ : { progress: options.progress }),
175
+ ...(options.retainProviderDocuments === true
176
+ ? { retainDocument: true }
177
+ : {}),
178
+ });
177
179
  this.clearSessionRecords();
178
180
  this.#clearRuntimeAvailability();
179
181
  return closed;
@@ -185,7 +187,7 @@ export class BinarySession extends BinarySessionRecords {
185
187
  target: this.#active?.target,
186
188
  route: this.#currentRoute(),
187
189
  router: this.#providerRouter,
188
- runtimeAvailability: this.#runtimeAvailability,
190
+ runtimeUnavailability: this.#runtimeUnavailability,
189
191
  runId: this.#active?.runId,
190
192
  runtimeLineageSnapshots: this.#active?.client.runtimeLineageSnapshots?.() ?? [],
191
193
  requestActivitySnapshots: this.#active?.client.requestActivitySnapshots?.() ?? [],
@@ -214,7 +216,9 @@ export class BinarySession extends BinarySessionRecords {
214
216
  operation: name,
215
217
  parameters: arguments_,
216
218
  unboundOperationError: (operation, route) => this.#providerRouter.unboundOperationError(operation, route),
217
- lookupSnapshot: (target, profile, operation, parameters) => this.lookupSnapshot(target, profile, operation, parameters),
219
+ lookupSnapshot: (target, profile, operation, parameters) => operation === "decode_interface_builder"
220
+ ? undefined
221
+ : this.lookupSnapshot(target, profile, operation, parameters),
218
222
  });
219
223
  if (!prepared.ok)
220
224
  return prepared;
@@ -225,9 +229,12 @@ export class BinarySession extends BinarySessionRecords {
225
229
  this.#calls.add(call);
226
230
  try {
227
231
  const result = await call;
228
- const profiled = commitExecutionProfile(name, result, profile);
232
+ const profiled = bindExecutionTarget(commitExecutionProfile(name, result, profile), name, active.target);
229
233
  this.#observeRuntimeAvailability(name, profiled);
230
- if (profiled.ok && cacheable && profile !== undefined)
234
+ if (profiled.ok &&
235
+ cacheable &&
236
+ profile !== undefined &&
237
+ name !== "decode_interface_builder")
231
238
  this.recordSnapshot({
232
239
  target: active.target,
233
240
  profile,
@@ -246,12 +253,12 @@ export class BinarySession extends BinarySessionRecords {
246
253
  }
247
254
  #observeRuntimeAvailability(operation, result) {
248
255
  if (result.ok) {
249
- if (this.#setRuntimeAvailability(operation, true, null))
256
+ if (this.#markRuntimeAvailable(operation))
250
257
  this.#emitAvailabilityChanged();
251
258
  return;
252
259
  }
253
260
  if (result.error._tag === "AnalysisCapabilityUnavailableError") {
254
- if (this.#setRuntimeAvailability(operation, false, result.error.message))
261
+ if (this.#markRuntimeUnavailable(operation, result.error.message))
255
262
  this.#emitAvailabilityChanged();
256
263
  return;
257
264
  }
@@ -259,7 +266,6 @@ export class BinarySession extends BinarySessionRecords {
259
266
  "ProviderAdapterError",
260
267
  "HopperProcessError",
261
268
  "HopperStartError",
262
- "HopperRemoteError",
263
269
  ].includes(result.error._tag)) {
264
270
  const capabilities = this.#active?.route.capabilities;
265
271
  const providerId = capabilities?.get(operation)?.provider.id;
@@ -267,27 +273,25 @@ export class BinarySession extends BinarySessionRecords {
267
273
  for (const descriptor of capabilities?.values() ?? [])
268
274
  if (providerId !== undefined && descriptor.provider.id === providerId)
269
275
  changed =
270
- this.#setRuntimeAvailability(descriptor.operation, false, "Provider became unavailable during this session.") || changed;
276
+ this.#markRuntimeUnavailable(descriptor.operation, `${result.error._tag}: ${result.error.message}`) || changed;
271
277
  if (changed)
272
278
  this.#emitAvailabilityChanged();
273
279
  }
274
280
  }
275
- #setRuntimeAvailability(operation, available, reason) {
276
- const current = this.#runtimeAvailability.get(operation);
277
- if (current?.available === available && current.reason === reason)
278
- return false;
279
- if (available && current === undefined)
281
+ #markRuntimeAvailable(operation) {
282
+ return this.#runtimeUnavailability.delete(operation);
283
+ }
284
+ #markRuntimeUnavailable(operation, reason) {
285
+ const current = this.#runtimeUnavailability.get(operation);
286
+ if (current?.reason === reason)
280
287
  return false;
281
- if (available)
282
- this.#runtimeAvailability.delete(operation);
283
- else
284
- this.#runtimeAvailability.set(operation, { available, reason });
288
+ this.#runtimeUnavailability.set(operation, { reason });
285
289
  return true;
286
290
  }
287
291
  #clearRuntimeAvailability() {
288
- if (this.#runtimeAvailability.size === 0)
292
+ if (this.#runtimeUnavailability.size === 0)
289
293
  return;
290
- this.#runtimeAvailability.clear();
294
+ this.#runtimeUnavailability.clear();
291
295
  this.#emitAvailabilityChanged();
292
296
  }
293
297
  #emitAvailabilityChanged() {
@@ -372,3 +376,25 @@ const commitExecutionProfile = (operation, result, profile) => {
372
376
  analysisProfile: structuredClone(profile),
373
377
  });
374
378
  };
379
+ const bindExecutionTarget = (result, operation, target) => {
380
+ if (!result.ok)
381
+ return result;
382
+ const subject = {
383
+ path: target.path,
384
+ sha256: target.sha256,
385
+ format: target.format === "analysis-database"
386
+ ? "analysis-database"
387
+ : target.format,
388
+ ...(target.architecture === undefined
389
+ ? {}
390
+ : { architecture: target.architecture }),
391
+ };
392
+ if (result.value.subject !== null &&
393
+ result.value.subject.sha256 !== target.sha256) {
394
+ if (!isArtifactInventorySubject(operation, result.value.subject, target))
395
+ return err(new ProviderAdapterError(result.value.provider.id, `${operation}:subject`));
396
+ }
397
+ return ok({ ...result.value, subject: result.value.subject ?? subject });
398
+ };
399
+ const isArtifactInventorySubject = (operation, subject, target) => (operation === "inventory_artifact" || operation === "inspect_artifact") &&
400
+ subject.path === (target.sourcePath ?? target.path);
@@ -1,9 +1,6 @@
1
1
  import { AnalysisProviderRegistry } from "./AnalysisProviderRegistry.js";
2
2
  import { BinarySession } from "./BinarySession.js";
3
3
  import { SessionProviderRouter } from "./SessionProviderRouter.js";
4
- const normalizeBinarySessionOptions = (optionsOrResolver) => typeof optionsOrResolver === "function"
5
- ? { resolveAnalysisProfile: optionsOrResolver }
6
- : (optionsOrResolver ?? {});
7
4
  /**
8
5
  * Compose one provider-neutral session from deep-provider selection and
9
6
  * disjoint auxiliary operation families.
@@ -11,11 +8,3 @@ const normalizeBinarySessionOptions = (optionsOrResolver) => typeof optionsOrRes
11
8
  export const composeBinarySession = (registry, auxiliaryProviders = []) => new BinarySession(registry instanceof SessionProviderRouter
12
9
  ? registry
13
10
  : SessionProviderRouter.selectable(registry, auxiliaryProviders));
14
- /**
15
- * Compose a session through the same internal seam for focused adapter tests.
16
- * The constructor remains private to this composition module, so callers test
17
- * provider behavior without coupling to BinarySession construction.
18
- */
19
- export const composeBinarySessionFromFactory = (provider, optionsOrResolver) => new BinarySession(provider, normalizeBinarySessionOptions(optionsOrResolver));
20
- /** Compose a focused session from any provider-shaped test seam. */
21
- export const composeBinarySessionFromProvider = (provider, optionsOrResolver) => new BinarySession(provider, normalizeBinarySessionOptions(optionsOrResolver));
@@ -1,5 +1,6 @@
1
1
  import { snapshotMatchesBinding, snapshotMatchesTarget, snapshotTarget, } from "../domain/analysisSnapshot.js";
2
- import { parseBinaryTarget, } from "../domain/binaryTarget.js";
2
+ import { parseBinaryTarget } from "./BinaryTargetResolver.js";
3
+ import {} from "../domain/binaryTarget.js";
3
4
  import { EvidenceIntegrityError, } from "../domain/errors.js";
4
5
  import { err } from "../domain/result.js";
5
6
  import { SessionProviderRouter } from "./SessionProviderRouter.js";
@@ -1,25 +1,14 @@
1
1
  import { createEvidence } from "../domain/evidence.js";
2
- import { evidenceBundleForTarget, serializeEvidenceBundle, } from "../domain/evidenceBundle.js";
3
- import { EvidenceIntegrityError, EvidenceLimitError, } from "../domain/errors.js";
4
- import { parseInvestigationWorkspace, } from "../domain/investigationWorkspace.js";
5
- import { parseReconstructionCoverageWorkspace, } from "../domain/reconstructionCoverage.js";
2
+ import { evidenceBundleForTarget } from "../domain/evidenceBundle.js";
3
+ import { EvidenceIntegrityError, } from "../domain/errors.js";
6
4
  import { err, ok } from "../domain/result.js";
7
5
  import { AnalysisSnapshotCache } from "./AnalysisSnapshotCache.js";
8
6
  import { EvidenceLedger } from "./EvidenceLedger.js";
9
7
  import { UNKNOWN_REGISTRY_PROVIDER, unknownEvidenceLinks, unknownMutationEvidence, } from "./UnknownEvidence.js";
10
- /** Owns session evidence, snapshots, workspaces, and residual unknowns. */
8
+ /** Owns session evidence, snapshots, and residual unknowns. */
11
9
  export class BinarySessionRecords {
12
- static MAX_RETAINED_BUNDLES = 16;
13
- static MAX_RETAINED_BUNDLE_BYTES = 64 * 1024 * 1024;
14
- #evidence = new EvidenceLedger({
15
- maxRecords: 10_000,
16
- maxBytes: 64 * 1024 * 1024,
17
- });
10
+ #evidence = new EvidenceLedger();
18
11
  #snapshot = new AnalysisSnapshotCache();
19
- #retainedBundles = new Map();
20
- #retainedBundleBytes = 0;
21
- #investigationWorkspaces = new Map();
22
- #coverageWorkspaces = new Map();
23
12
  #snapshotInvalidated = false;
24
13
  #snapshotListeners = new Set();
25
14
  /** Observe changes to the mutable current analysis snapshot resource. */
@@ -42,38 +31,13 @@ export class BinarySessionRecords {
42
31
  exportEvidenceBundle() {
43
32
  return this.#evidence.export();
44
33
  }
45
- snapshotEvidenceBundle() {
46
- const bundle = this.#evidence.export();
47
- const encoded = serializeEvidenceBundle(bundle);
48
- const digest = createHash("sha256").update(encoded).digest("hex");
49
- const existing = this.#retainedBundles.get(digest);
50
- if (existing === undefined) {
51
- if (this.#retainedBundles.size >= BinarySessionRecords.MAX_RETAINED_BUNDLES)
52
- return err(new EvidenceLimitError("records", BinarySessionRecords.MAX_RETAINED_BUNDLES));
53
- const bytes = Buffer.byteLength(encoded);
54
- if (this.#retainedBundleBytes + bytes >
55
- BinarySessionRecords.MAX_RETAINED_BUNDLE_BYTES)
56
- return err(new EvidenceLimitError("bytes", BinarySessionRecords.MAX_RETAINED_BUNDLE_BYTES));
57
- this.#retainedBundles.set(digest, encoded);
58
- this.#retainedBundleBytes += bytes;
59
- }
60
- return ok({
61
- bundleDigest: digest,
62
- bundleVersion: 2,
63
- bytes: Buffer.byteLength(existing ?? encoded),
64
- records: bundle.records.length,
65
- unknowns: bundle.unknowns.length,
66
- uri: `rea://evidence-bundle/${digest}`,
67
- });
68
- }
69
- retainedEvidenceBundle(digest) {
70
- return this.#retainedBundles.get(digest);
71
- }
72
34
  importEvidenceBundle(bundle) {
73
35
  const imported = this.#evidence.import(bundle);
74
- if (imported.ok && imported.value > 0)
36
+ if (!imported.ok)
37
+ return imported;
38
+ if (imported.value.changed)
75
39
  this.#emitSnapshotChanged();
76
- return imported;
40
+ return ok(imported.value.recordsAdded);
77
41
  }
78
42
  exportAnalysisSnapshot() {
79
43
  const active = this.activeAnalysisBinding();
@@ -93,7 +57,10 @@ export class BinarySessionRecords {
93
57
  return err(new EvidenceIntegrityError("Analysis snapshot profile_mismatch: the active target has no concrete analysis profile"));
94
58
  const imported = this.#snapshot.import(snapshot, active === undefined
95
59
  ? undefined
96
- : { target: active.target, profile: active.profile }, (bundle) => this.#evidence.import(bundle));
60
+ : { target: active.target, profile: active.profile }, (bundle) => {
61
+ const imported = this.#evidence.import(bundle);
62
+ return imported.ok ? ok(imported.value.recordsAdded) : imported;
63
+ });
97
64
  if (imported.ok)
98
65
  this.#emitSnapshotChanged();
99
66
  return imported;
@@ -131,43 +98,20 @@ export class BinarySessionRecords {
131
98
  this.#evidence.clear();
132
99
  this.#snapshot.clear();
133
100
  this.#snapshotInvalidated = false;
134
- this.#retainedBundles.clear();
135
- this.#retainedBundleBytes = 0;
136
101
  this.#emitSnapshotChanged();
137
102
  }
138
103
  #emitSnapshotChanged() {
139
- for (const listener of this.#snapshotListeners)
140
- void listener();
141
- }
142
- retainInvestigationWorkspace(workspace) {
143
- const parsed = parseInvestigationWorkspace(workspace);
144
- const key = workspaceKey(parsed.workspace_id, parsed.revision);
145
- if (this.#investigationWorkspaces.has(key))
146
- return "duplicate";
147
- this.#investigationWorkspaces.set(key, parsed);
148
- return "added";
149
- }
150
- investigationWorkspace(workspaceId, revision) {
151
- const workspace = this.#investigationWorkspaces.get(workspaceKey(workspaceId, revision));
152
- return workspace === undefined ? undefined : structuredClone(workspace);
153
- }
154
- investigationWorkspaces() {
155
- return sortedWorkspaces(this.#investigationWorkspaces.values());
156
- }
157
- retainReconstructionCoverageWorkspace(workspace) {
158
- const parsed = parseReconstructionCoverageWorkspace(workspace);
159
- const key = workspaceKey(parsed.workspace_id, parsed.revision);
160
- if (this.#coverageWorkspaces.has(key))
161
- return "duplicate";
162
- this.#coverageWorkspaces.set(key, parsed);
163
- return "added";
164
- }
165
- reconstructionCoverageWorkspace(workspaceId, revision) {
166
- const workspace = this.#coverageWorkspaces.get(workspaceKey(workspaceId, revision));
167
- return workspace === undefined ? undefined : structuredClone(workspace);
168
- }
169
- reconstructionCoverageWorkspaces() {
170
- return sortedWorkspaces(this.#coverageWorkspaces.values());
104
+ for (const listener of this.#snapshotListeners) {
105
+ try {
106
+ const notification = listener();
107
+ if (notification !== undefined)
108
+ void notification.catch(() => undefined);
109
+ }
110
+ catch {
111
+ // External resource observers are best-effort; one callback must not
112
+ // make a committed evidence mutation appear to fail.
113
+ }
114
+ }
171
115
  }
172
116
  recordUnknown(input) {
173
117
  const target = this.activeAnalysisBinding()?.target;
@@ -185,7 +129,7 @@ export class BinarySessionRecords {
185
129
  updateUnknown(input) {
186
130
  const target = this.activeAnalysisBinding()?.target;
187
131
  const evidence = createEvidence(target, UNKNOWN_REGISTRY_PROVIDER, {
188
- predicateType: "rea.residual-unknown-mutation/v1",
132
+ predicateType: "rea.residual-unknown-mutation",
189
133
  operation: "update_unknown",
190
134
  parameters: {
191
135
  unknown_id: input.unknown_id,
@@ -211,9 +155,3 @@ export class BinarySessionRecords {
211
155
  return this.#evidence.verifyUnknownResolution(unknownId);
212
156
  }
213
157
  }
214
- const workspaceKey = (workspaceId, revision) => `${workspaceId}:${String(revision)}`;
215
- const sortedWorkspaces = (workspaces) => [...workspaces]
216
- .sort((left, right) => left.workspace_id.localeCompare(right.workspace_id) ||
217
- left.revision - right.revision)
218
- .map((workspace) => structuredClone(workspace));
219
- import { createHash } from "node:crypto";