rea-agents 6.1.0 → 6.3.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 (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,6 +1,7 @@
1
+ import { semanticContainer, semanticPropertyPointer, } from "../../domain/javascript/javascriptSemanticSlots.js";
1
2
  import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
2
3
  import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
3
- import { observedSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
4
+ import { observedSemanticEvidence, unknownSemanticEvidence, } from "./JavaScriptSemanticGraphEvidence.js";
4
5
  /** Project bounded literal values and object slots for exact query seeds. */
5
6
  export const projectSemanticValues = (context) => {
6
7
  for (const binding of context.ir.bindings) {
@@ -12,12 +13,13 @@ export const projectSemanticValues = (context) => {
12
13
  binding,
13
14
  value: binding.value,
14
15
  target: bindingNode,
15
- role: "binding",
16
+ path: [],
16
17
  });
17
18
  }
18
19
  };
19
20
  const projectValue = (input) => {
20
- const { context, binding, value, target, role } = input;
21
+ const { context, binding, value, target, path } = input;
22
+ const role = path.length === 0 ? "binding" : `property:${semanticPropertyPointer(path)}`;
21
23
  if (target === null)
22
24
  return;
23
25
  if (value.status === "literal") {
@@ -39,32 +41,51 @@ const projectValue = (input) => {
39
41
  resolution: "candidate",
40
42
  });
41
43
  }
42
- else if (value.status === "object")
43
- for (const property of value.properties) {
44
- const slot = semanticPropertySlot(context, binding.bindingId, property.name);
44
+ else if (value.status === "object" || value.status === "array") {
45
+ const container = semanticContainer(value);
46
+ for (const property of container.slots) {
47
+ const propertyPath = [...path, property.name];
48
+ const slot = semanticPropertySlot(context, binding.bindingId, propertyPath, property);
49
+ if (property.presence === "absent")
50
+ continue;
45
51
  addSemanticGraphRelation(context.state, {
46
52
  source: target,
47
53
  target: slot,
48
54
  relation: "writes-property",
49
- resolution: value.unknownProperties ? "candidate" : "resolved",
50
- });
51
- projectValue({
52
- context,
53
- binding,
54
- value: property.value,
55
- target: slot,
56
- role: `property:${property.name}`,
55
+ resolution: property.presence === "present" ? "resolved" : "candidate",
57
56
  });
57
+ if (property.presence === "present")
58
+ projectValue({
59
+ context,
60
+ binding,
61
+ value: property.value,
62
+ target: slot,
63
+ path: propertyPath,
64
+ });
58
65
  }
59
- else if (value.status === "unknown" && value.resourceLimit !== undefined) {
66
+ if (container.coverage.status === "partial")
67
+ addSemanticGraphUnknown(context.state, createJavaScriptSemanticGraphUnknown({
68
+ node_id: target.node_id,
69
+ family: "object-flow",
70
+ relation_kinds: ["writes-property"],
71
+ reason: "ambiguous-target",
72
+ detail: `Initializer container has unknown ${value.status === "object" ? "properties" : "items"}${container.coverage.omitted === null ? " with an unknown omitted count" : `; ${container.coverage.omitted} omitted`}.`,
73
+ candidate_node_ids: [target.node_id],
74
+ evidence: unknownSemanticEvidence(context.file, binding.definitions[0]?.location ?? null),
75
+ }, context.state.evidenceContexts));
76
+ }
77
+ else if (value.status === "unknown" ||
78
+ value.status === "ambiguous" ||
79
+ value.status === "cycle") {
60
80
  const location = binding.definitions[0]?.location ?? null;
61
81
  const evidence = observedSemanticEvidence(context.file, location);
62
- const isPropertyValue = role.startsWith("property:");
63
82
  addSemanticGraphUnknown(context.state, createJavaScriptSemanticGraphUnknown({
64
83
  node_id: target.node_id,
65
- family: isPropertyValue ? "object-flow" : "data-flow",
66
- relation_kinds: [isPropertyValue ? "writes-property" : "defines"],
67
- reason: "resource-limit",
84
+ family: "data-flow",
85
+ relation_kinds: ["defines"],
86
+ reason: value.resourceLimit === undefined
87
+ ? "unknown-value"
88
+ : "resource-limit",
68
89
  detail: `${value.reason} Unknown value at ${role}.`,
69
90
  candidate_node_ids: [target.node_id],
70
91
  evidence: {
@@ -74,7 +95,7 @@ const projectValue = (input) => {
74
95
  confidence: "unknown",
75
96
  limitations: [value.reason],
76
97
  },
77
- }));
98
+ }, context.state.evidenceContexts));
78
99
  }
79
100
  };
80
101
  const addLiteralNode = (context, binding, value, role) => retainSemanticGraphNode(context.state, context.file, {
@@ -85,15 +106,20 @@ const addLiteralNode = (context, binding, value, role) => retainSemanticGraphNod
85
106
  functionNodeId: context.bindingNodes.get(binding.bindingId)?.function_node_id ?? null,
86
107
  properties: { value },
87
108
  });
88
- /** Create one canonical property slot for a binding/property identity. */
89
- export const semanticPropertySlot = (context, objectBindingId, name) => retainSemanticGraphNode(context.state, context.file, {
109
+ /** Create one canonical slot for a root binding and exact static property path. */
110
+ export const semanticPropertySlot = (context, objectBindingId, path, fact) => retainSemanticGraphNode(context.state, context.file, {
90
111
  kind: "property-slot",
91
- roleKey: `property:${objectBindingId}:${name}`,
112
+ roleKey: `property:${JSON.stringify([objectBindingId, path])}`,
92
113
  location: null,
93
- label: name,
114
+ label: fact.name,
94
115
  functionNodeId: context.bindingNodes.get(objectBindingId)?.function_node_id ?? null,
95
116
  properties: {
96
- name,
117
+ name: fact.name,
118
+ property_path: [...path],
119
+ property_pointer: semanticPropertyPointer(path),
97
120
  object_binding_id: objectBindingId,
121
+ presence: fact.presence,
122
+ value_status: fact.value.status,
123
+ value_coverage: semanticContainer(fact.value)?.coverage ?? null,
98
124
  },
99
125
  });
@@ -1,25 +1,30 @@
1
1
  import { z } from "zod";
2
2
  import { AnalysisInputError, AnalysisProtocolError, } from "../../domain/analysisErrorCore.js";
3
3
  import {} from "../../domain/analysisErrorBase.js";
4
+ import { applicationGraphEvidenceInputError, parseApplicationGraphEvidence, } from "./JavaScriptApplicationEvidenceGraph.js";
4
5
  import { jsonValueSchema } from "../../domain/jsonValue.js";
5
6
  import { queryJavaScriptSemanticGraph } from "../../domain/javascript/javascriptSemanticQuery.js";
6
7
  import { javaScriptSemanticTraceResultSchema, traceJavaScriptSemanticsInputSchema, } from "../../domain/javascript/javascriptSemanticTraceSchemas.js";
7
8
  import { err, ok } from "../../domain/result.js";
8
- import { parseApplicationGraphEvidence } from "./JavaScriptApplicationEvidenceGraph.js";
9
9
  import { createJavaScriptSemanticTraceEvidence } from "./JavaScriptApplicationWorkflowEvidence.js";
10
10
  const OPERATION = "trace_javascript_semantics";
11
11
  /** Trace semantic relations from input already parsed by a trusted adapter. */
12
12
  export const traceJavaScriptSemanticsEvidenceValidated = (input) => {
13
+ const sourceResult = parseApplicationGraphEvidence(input.application, [
14
+ "application",
15
+ ]);
16
+ if (!sourceResult.ok)
17
+ return err(applicationGraphEvidenceInputError(OPERATION, sourceResult.error));
18
+ const source = sourceResult.value;
19
+ if (source.semanticGraph === null)
20
+ return err(new AnalysisInputError(OPERATION, undefined, [
21
+ {
22
+ path: ["application"],
23
+ reason: "invalid_value",
24
+ expected: "inline Evidence from analyze_javascript_application with a semantic graph",
25
+ },
26
+ ]));
13
27
  try {
14
- const source = parseApplicationGraphEvidence(input.application);
15
- if (source.semanticGraph === null)
16
- return err(new AnalysisInputError(OPERATION, undefined, [
17
- {
18
- path: ["application"],
19
- reason: "invalid_value",
20
- expected: "inline Evidence from analyze_javascript_application with a semantic graph",
21
- },
22
- ]));
23
28
  const query = queryJavaScriptSemanticGraph(source.semanticGraph, input.query);
24
29
  const result = javaScriptSemanticTraceResultSchema.parse({
25
30
  ...query,
@@ -1,7 +1,8 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { z } from "zod";
4
- import { compareManagedMembers, managedMemberComparisonResultSchema, parseManagedMemberEvidence, } from "../../domain/managed/managedMemberComparison.js";
4
+ import { compareManagedMembers, managedMemberComparisonResultSchema, } from "../../domain/managed/managedMemberComparison.js";
5
+ import { parseManagedMemberEvidence } from "../../domain/managed/managedMemberComparisonMatch.js";
5
6
  import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
6
7
  import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
7
8
  import {} from "../../domain/analysisErrorBase.js";
@@ -3,10 +3,11 @@ import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
3
3
  import {} from "../../domain/analysisErrorBase.js";
4
4
  import { createEvidence } from "../../domain/evidence.js";
5
5
  import { jsonValueSchema } from "../../domain/jsonValue.js";
6
- import { managedNativeVerificationInputSchema, verifyManagedNativeBoundaries, } from "../../domain/managed/managedNativeVerification.js";
6
+ import { managedNativeVerificationInputSchema, } from "../../domain/managed/managedNativeVerificationSchemas.js";
7
7
  import { err, ok } from "../../domain/result.js";
8
8
  import { MANAGED_WORKFLOW_PROVIDER } from "../InvestigationProviders.js";
9
9
  import { requestInputError, workflowInputError, } from "../workflowInputError.js";
10
+ import { verifyManagedNativeBoundaries } from "../../domain/managed/managedNativeVerification.js";
10
11
  const OPERATION = "verify_managed_native_boundaries";
11
12
  /** Verify managed/native boundary declarations against native Evidence. */
12
13
  export const verifyManagedNativeBoundariesEvidence = (rawInput) => {
@@ -3,16 +3,14 @@ import { parseRelatedAddresses, referenceKindSchema, } from "../../domain/hopper
3
3
  import { err, ok } from "../../domain/result.js";
4
4
  import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
5
5
  const referencesSchema = z.object({
6
- reference_kinds_available: z.boolean().optional(),
6
+ reference_kinds_available: z.boolean(),
7
7
  references: z.array(z.object({
8
8
  source_address: z.string(),
9
9
  target_address: z.string(),
10
10
  target_procedure: z.object({ address: z.string() }).nullable(),
11
11
  kind: referenceKindSchema,
12
12
  })),
13
- unresolved_calls: z
14
- .array(z.object({ address: z.string(), reason: z.string() }))
15
- .default([]),
13
+ unresolved_calls: z.array(z.object({ address: z.string(), reason: z.string() })),
16
14
  });
17
15
  /** Prefer typed static call references, preserving computed targets and targetless sites. */
18
16
  export const readNativeCallRoutes = async (analysis, procedure, signal) => {
@@ -7,11 +7,13 @@ import { createEvidence, parseEvidence } from "../../domain/evidence.js";
7
7
  import { describeValidationFailure } from "../../domain/evidenceBundle.js";
8
8
  import { jsonValueSchema } from "../../domain/jsonValue.js";
9
9
  import { analysisInputErrorFromIssues, projectInputIssues, } from "../../domain/inputIssueProjection.js";
10
- import { processTraceSpecificationSchema } from "../../domain/process/processTraceComparison.js";
10
+ import { processTraceSpecificationSchema } from "../../domain/process/processTraceSpecification.js";
11
11
  import { processScenarioSchema } from "../../domain/process/processScenario.js";
12
- import { compareProcessCaptures, parseProcessCapture, } from "../../domain/process/processCapture.js";
12
+ import { compareProcessCaptures } from "../../domain/process/processComparison.js";
13
+ import { parseProcessCapture } from "../../domain/process/processCaptureParsing.js";
13
14
  import { captureProcessScenario } from "../../process/capture/ProcessHarness.js";
14
- import { PROCESS_PROVIDER, createProcessCaptureEvidence, } from "./ProcessEvidence.js";
15
+ import { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
16
+ import { createProcessCaptureEvidence } from "./ProcessEvidence.js";
15
17
  /** Identify the process workflow's typed diagnostic result for CLI exit status. */
16
18
  export const isProcessCliFailure = (value) => typeof value === "object" &&
17
19
  value !== null &&
@@ -22,13 +24,13 @@ export const isProcessCliFailure = (value) => typeof value === "object" &&
22
24
  "message" in value &&
23
25
  typeof value.message === "string";
24
26
  /** Capture one JSON scenario through the shared process harness and Evidence contract. */
25
- export const captureProcessScenarioFile = async (path, environment = process.env) => {
27
+ export const captureProcessScenarioFile = async (path, environment = process.env, signal) => {
26
28
  try {
27
29
  const input = await readJson(path);
28
30
  const parsed = processScenarioSchema.safeParse(input);
29
31
  if (!parsed.success)
30
32
  throw analysisInputErrorFromIssues("capture_process_scenario", parsed.error.issues, input, { cause: parsed.error });
31
- const captured = await captureProcessScenario(parsed.data, undefined, process.platform, environment);
33
+ const captured = await captureProcessScenario(parsed.data, signal, process.platform, environment);
32
34
  if (!captured.ok)
33
35
  return cliAnalysisError(captured.error);
34
36
  return createProcessCaptureEvidence(parsed.data, captured.value);
@@ -118,8 +120,7 @@ const readJson = async (path) => {
118
120
  bytes = await readFile(path);
119
121
  }
120
122
  catch (cause) {
121
- void cause;
122
- throw new ProcessCliFailure("invalid_input", "Process input file could not be read. Check that the path exists and is readable.");
123
+ throw new ProcessCliFailure("invalid_input", `Process input file could not be read: ${path} (${describeValidationFailure(cause)}). Check the reported filesystem constraint and retry.`);
123
124
  }
124
125
  try {
125
126
  const text = new TextDecoder("utf-8", {
@@ -130,8 +131,7 @@ const readJson = async (path) => {
130
131
  return parsed;
131
132
  }
132
133
  catch (cause) {
133
- void cause;
134
- throw new ProcessCliFailure("invalid_input", "Process input file is not valid JSON. Repair the file, then try again.");
134
+ throw new ProcessCliFailure("invalid_input", `Process input file is not valid UTF-8 JSON: ${path} (${describeValidationFailure(cause)}). Repair the file, then try again.`);
135
135
  }
136
136
  };
137
137
  class ProcessCliFailure extends Error {
@@ -147,7 +147,7 @@ const cliAnalysisError = (error) => ({
147
147
  error: "Process command failed",
148
148
  ...projectAnalysisError(error),
149
149
  });
150
- /** Project any process CLI failure without exposing its cause. */
150
+ /** Preserve typed failures and local diagnostics at the process CLI boundary. */
151
151
  export const projectProcessCliError = (cause) => {
152
152
  if (cause instanceof ProcessCliFailure)
153
153
  return {
@@ -160,6 +160,6 @@ export const projectProcessCliError = (cause) => {
160
160
  return {
161
161
  error: "Process command failed",
162
162
  category: "execution_failure",
163
- message: "Process command could not complete. Check the input files and run `rea doctor`, then try again.",
163
+ message: `Process command could not complete: ${describeValidationFailure(cause)}`,
164
164
  };
165
165
  };
@@ -2,7 +2,6 @@ import { posix, win32 } from "node:path";
2
2
  import { createEvidence } from "../../domain/evidence.js";
3
3
  import { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
4
4
  import { jsonValueSchema } from "../../domain/jsonValue.js";
5
- export { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
6
5
  /** Project one process scenario into secret-free Evidence parameters. */
7
6
  const processEvidenceParameters = (scenario, platform) => ({
8
7
  executable_name: (platform === "win32" ? win32 : posix).basename(scenario.executable),
@@ -1,3 +1,4 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
2
3
  import { inspectBundleKeyedArchive } from "./apple/KeyedArchiveReader.js";
3
4
  import { traceDylibResolution } from "./apple/DylibResolutionReader.js";
@@ -7,42 +8,50 @@ import { extractArtifact } from "./extraction/ArtifactExtraction.js";
7
8
  import { analyzeInterfaceBuilderBundle } from "./apple/InterfaceBuilderAnalysis.js";
8
9
  import { analyzeAppleAssetCatalogs } from "./apple/AppleAssetCatalogAnalysis.js";
9
10
  import { ARTIFACT_ANALYSIS_OPERATIONS, artifactInventoryInputSchema, artifactExtractionExecutionSchema, } from "../contracts/artifactToolContracts.js";
10
- import { AnalysisCapabilityUnavailableError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
11
+ import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisUnsupportedTargetError, } from "../domain/analysisErrorCore.js";
11
12
  import { ArtifactOperationError } from "../domain/artifactOperationError.js";
12
13
  import {} from "../domain/analysisErrorBase.js";
13
14
  import { interfaceBuilderLimitsSchema } from "../domain/apple/interfaceBuilderGraph.js";
14
15
  import { err, ok } from "../domain/result.js";
15
16
  import { ArtifactReaderFailure } from "./ArtifactReader.js";
16
- import { ARTIFACT_PROVIDER_IDENTITY as IDENTITY, artifactCapabilities, } from "./ArtifactProviderMetadata.js";
17
+ import { artifactCapabilities } from "./ArtifactProviderMetadata.js";
18
+ import { ARTIFACT_GRAPH_PROVIDER } from "../application/InvestigationProviders.js";
17
19
  import { createEvidence } from "../domain/evidence.js";
18
20
  import { createArtifactInspection } from "../domain/artifactInspection.js";
19
- import { resolveArtifactIntegrityPolicy } from "./inventory/policy.js";
20
21
  /** Read-only inventory and exclusively owned extraction provider. */
21
22
  export class ArtifactProvider {
22
23
  #capabilities;
23
- constructor(platform = process.platform) {
24
+ #platform;
25
+ environment;
26
+ constructor(environment, platform = process.platform) {
27
+ this.environment = snapshotEnvironment(environment, platform);
24
28
  this.#capabilities = artifactCapabilities(platform);
29
+ this.#platform = platform;
25
30
  }
26
31
  identity() {
27
- return IDENTITY;
32
+ return ARTIFACT_GRAPH_PROVIDER;
28
33
  }
29
34
  capabilities() {
30
35
  return this.#capabilities;
31
36
  }
32
37
  createClient(target) {
33
- return new ArtifactClient(target);
38
+ return new ArtifactClient(target, this.environment, this.#platform);
34
39
  }
35
40
  }
36
41
  class ArtifactClient {
37
42
  target;
38
- constructor(target) {
43
+ environment;
44
+ platform;
45
+ constructor(target, environment, platform) {
39
46
  this.target = target;
47
+ this.environment = environment;
48
+ this.platform = platform;
40
49
  }
41
50
  async execute(operation, parameters, options) {
42
51
  if (operation === "health")
43
- return ok(createAnalysisExecution(null, IDENTITY));
52
+ return ok(createAnalysisExecution(null, ARTIFACT_GRAPH_PROVIDER));
44
53
  if (!isArtifactOperation(operation))
45
- return err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, "Operation is not implemented by artifact graph provider."));
54
+ return err(new AnalysisCapabilityUnavailableError(ARTIFACT_GRAPH_PROVIDER.id, operation, "Operation is not implemented by artifact graph provider."));
46
55
  try {
47
56
  if (operation === "inspect_artifact") {
48
57
  const inspected = await this.inspectArtifact(parameters, options);
@@ -52,7 +61,7 @@ class ArtifactClient {
52
61
  if (this.target.kind !== "executable" ||
53
62
  this.target.sourcePath === undefined ||
54
63
  !this.target.sourcePath.toLowerCase().endsWith(".app"))
55
- throw new ArtifactReaderFailure("unavailable", "decode_interface_builder requires an active .app bundle target");
64
+ throw this.unsupportedTarget(operation, "decode_interface_builder requires an active .app bundle target");
56
65
  const limits = interfaceBuilderLimitsSchema.parse(parameters);
57
66
  const result = await analyzeInterfaceBuilderBundle({
58
67
  bundlePath: this.target.sourcePath,
@@ -60,7 +69,7 @@ class ArtifactClient {
60
69
  limits,
61
70
  ...(options?.signal === undefined ? {} : { signal: options.signal }),
62
71
  });
63
- return ok(createAnalysisExecution(result, IDENTITY, {
72
+ return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
64
73
  limitations: result.limitations,
65
74
  locations: result.documents.map(({ relative_path: path }) => ({
66
75
  kind: "artifact-path",
@@ -87,18 +96,19 @@ class ArtifactClient {
87
96
  : this.target.sourcePath;
88
97
  if (bundlePath === undefined ||
89
98
  (!standalone && !bundlePath.toLowerCase().endsWith(".app")))
90
- throw new ArtifactReaderFailure("unavailable", "inspect_keyed_archive requires an active plist or .app bundle");
99
+ throw this.unsupportedTarget(operation, "inspect_keyed_archive requires an active plist or .app bundle");
91
100
  const result = await inspectBundleKeyedArchive({
92
101
  bundlePath,
93
102
  targetSha256: this.target.sha256,
94
103
  parameters: standalone
95
104
  ? { ...parameters, path: basename(this.target.path) }
96
105
  : parameters,
106
+ platform: this.platform,
97
107
  ...(options?.signal === undefined ? {} : { signal: options.signal }),
98
108
  });
99
109
  if (standalone && result.archive_sha256 !== this.target.sha256)
100
110
  throw new ArtifactReaderFailure("integrity", `Active archive digest changed: expected ${this.target.sha256}, observed ${result.archive_sha256}`);
101
- return ok(createAnalysisExecution(result, IDENTITY, {
111
+ return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
102
112
  limitations: result.limitations,
103
113
  locations: [{ kind: "artifact-path", path: result.archive_path }],
104
114
  }));
@@ -114,8 +124,9 @@ class ArtifactClient {
114
124
  inputPath: this.target.sourcePath ?? this.target.path,
115
125
  inputFormat: this.target.format,
116
126
  outputRoot: parsed.output_root,
127
+ environment: this.environment,
117
128
  }, options?.signal);
118
- return ok(createAnalysisExecution(result, IDENTITY, {
129
+ return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
119
130
  rawResult: null,
120
131
  limitations: result.limitations,
121
132
  subject: subjectFor(this.target.sourcePath ?? this.target.path, result.manifest),
@@ -127,7 +138,7 @@ class ArtifactClient {
127
138
  }
128
139
  const parsed = artifactInventoryInputSchema.parse(parameters);
129
140
  const result = await this.inventory(parsed, options);
130
- return ok(createAnalysisExecution(result, IDENTITY, {
141
+ return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
131
142
  rawResult: null,
132
143
  limitations: result.limitations,
133
144
  subject: subjectFor(this.target.sourcePath ?? this.target.path, result.manifest),
@@ -138,25 +149,30 @@ class ArtifactClient {
138
149
  }));
139
150
  }
140
151
  catch (cause) {
141
- return err(translateFailure(operation, cause));
152
+ return err(translateArtifactFailure(operation, cause));
142
153
  }
143
154
  }
144
155
  close() {
145
- return Promise.resolve();
156
+ return Promise.resolve(ok(null));
157
+ }
158
+ /** The active target's kind is outside this operation's supported targets. */
159
+ unsupportedTarget(operation, reason) {
160
+ return new AnalysisUnsupportedTargetError(operation, this.target.sourcePath ?? this.target.path, reason);
146
161
  }
147
162
  async inspectAssetCatalog(parameters, options) {
148
163
  const bundlePath = this.target.sourcePath;
149
164
  if (this.target.kind !== "executable" ||
150
165
  bundlePath === undefined ||
151
166
  !bundlePath.toLowerCase().endsWith(".app"))
152
- throw new ArtifactReaderFailure("unavailable", "inspect_asset_catalog requires an active .app bundle target");
167
+ throw this.unsupportedTarget("inspect_asset_catalog", "inspect_asset_catalog requires an active .app bundle target");
153
168
  const result = await analyzeAppleAssetCatalogs({
169
+ environment: this.environment,
154
170
  bundlePath,
155
171
  targetSha256: this.target.sha256,
156
172
  page: parameters,
157
173
  ...(options?.signal === undefined ? {} : { signal: options.signal }),
158
174
  });
159
- return ok(createAnalysisExecution(result, IDENTITY, {
175
+ return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
160
176
  limitations: result.limitations,
161
177
  locations: result.catalogs.map(({ path }) => ({
162
178
  kind: "artifact-path",
@@ -166,7 +182,7 @@ class ArtifactClient {
166
182
  }
167
183
  async traceDylibResolution(parameters, options) {
168
184
  if (this.target.kind !== "executable" || this.target.format !== "mach-o")
169
- throw new ArtifactReaderFailure("unavailable", "trace_dylib_resolution requires an active Mach-O or .app bundle target");
185
+ throw this.unsupportedTarget("trace_dylib_resolution", "trace_dylib_resolution requires an active Mach-O or .app bundle target");
170
186
  // Only a target opened from an app bundle directory carries its Info.plist;
171
187
  // a regular file whose name ends in .app is a standalone image.
172
188
  const bundle = this.target.bundleInfoPlist === undefined
@@ -180,7 +196,7 @@ class ArtifactClient {
180
196
  parameters,
181
197
  ...(options?.signal === undefined ? {} : { signal: options.signal }),
182
198
  });
183
- return ok(createAnalysisExecution(result, IDENTITY, {
199
+ return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
184
200
  limitations: result.limitations,
185
201
  locations: result.images.map(({ path }) => ({
186
202
  kind: "artifact-path",
@@ -205,7 +221,7 @@ class ArtifactClient {
205
221
  kind: "artifact-path",
206
222
  path,
207
223
  }));
208
- const inventoryEvidence = createEvidence(subject, IDENTITY, {
224
+ const inventoryEvidence = createEvidence(subject, ARTIFACT_GRAPH_PROVIDER, {
209
225
  operation: "inventory_artifact",
210
226
  parameters: inventoryParameters,
211
227
  result: inventory,
@@ -220,7 +236,7 @@ class ArtifactClient {
220
236
  total: 1,
221
237
  message: "inventory substep completed",
222
238
  });
223
- return ok(createAnalysisExecution(result, IDENTITY, {
239
+ return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
224
240
  rawResult: null,
225
241
  limitations: result.limitations,
226
242
  subject,
@@ -229,19 +245,26 @@ class ArtifactClient {
229
245
  }
230
246
  inventory(parsed, options) {
231
247
  return inventoryArtifact(this.target.sourcePath ?? this.target.path, {
248
+ environment: this.environment,
232
249
  ...(options?.signal === undefined ? {} : { signal: options.signal }),
233
- integrity: resolveArtifactIntegrityPolicy({
234
- mode: parsed.integrity_policy,
235
- }),
250
+ integrity: { mode: parsed.integrity_policy },
236
251
  });
237
252
  }
238
253
  }
239
254
  const isArtifactOperation = (operation) => ARTIFACT_ANALYSIS_OPERATIONS.includes(operation);
240
- const translateFailure = (operation, cause) => {
255
+ /** Translate one artifact boundary failure while retaining cleanup evidence. */
256
+ export const translateArtifactFailure = (operation, cause) => {
241
257
  if (cause instanceof ArtifactReaderFailure)
242
- return new ArtifactOperationError(operation, cause.reason, cause.details, cause.message);
243
- // Caller-selection failures are already typed; keep their correction details.
244
- if (cause instanceof AnalysisInputError)
258
+ return new ArtifactOperationError(operation, cause.reason, cause.details, cause.message, {
259
+ ...(cause.cleanup === undefined ? {} : { cleanup: cause.cleanup }),
260
+ ...(cause.partialObservation === undefined
261
+ ? {}
262
+ : { partialObservation: cause.partialObservation }),
263
+ });
264
+ // Caller-selection and unsupported-target failures are already typed; keep
265
+ // their correction details instead of reducing them to an I/O failure.
266
+ if (cause instanceof AnalysisInputError ||
267
+ cause instanceof AnalysisUnsupportedTargetError)
245
268
  return cause;
246
269
  return new ArtifactOperationError(operation, "io");
247
270
  };
@@ -1,12 +1,9 @@
1
1
  import { ARTIFACT_GRAPH_PROVIDER } from "../application/InvestigationProviders.js";
2
2
  import { ARTIFACT_ANALYSIS_OPERATIONS } from "../contracts/artifactToolContracts.js";
3
- /** Identity of artifact inventory and owned extraction observations. */
4
- export const ARTIFACT_PROVIDER_IDENTITY = Object.freeze(ARTIFACT_GRAPH_PROVIDER);
5
- const IDENTITY = ARTIFACT_PROVIDER_IDENTITY;
6
3
  /** Declare artifact coverage without constructing readers or acquiring resources. */
7
4
  export const artifactCapabilities = (platform = process.platform) => Object.freeze(ARTIFACT_ANALYSIS_OPERATIONS.map((operation) => {
8
5
  const common = {
9
- provider: IDENTITY,
6
+ provider: ARTIFACT_GRAPH_PROVIDER,
10
7
  operation,
11
8
  effects: Object.freeze({
12
9
  mutatesArtifact: false,
@@ -2,10 +2,41 @@
2
2
  export class ArtifactReaderFailure extends Error {
3
3
  reason;
4
4
  details;
5
+ cleanup;
6
+ partialObservation;
5
7
  constructor(reason, message, options, details) {
6
8
  super(message, options);
7
9
  this.reason = reason;
8
10
  this.details = details;
9
11
  this.name = "ArtifactReaderFailure";
12
+ this.cleanup = options?.cleanup;
13
+ this.partialObservation = options?.partialObservation;
14
+ }
15
+ /** Preserve the primary failure while attaching cleanup and any complete observation. */
16
+ static withCleanup(cause, cleanup, partialObservation) {
17
+ const primary = cause instanceof ArtifactReaderFailure
18
+ ? cause
19
+ : new ArtifactReaderFailure("io", errorMessage(cause), { cause });
20
+ const mergedObservation = partialObservation ?? primary.partialObservation;
21
+ return new ArtifactReaderFailure(primary.reason, primary.message, {
22
+ cause: primary,
23
+ cleanup: combineCleanup(primary.cleanup, cleanup),
24
+ ...(mergedObservation === undefined
25
+ ? {}
26
+ : { partialObservation: mergedObservation }),
27
+ }, primary.details);
28
+ }
29
+ /** Give otherwise opaque cleanup failures a concrete owned resource. */
30
+ static cleanupObservation(cause, resource) {
31
+ if (cause instanceof ArtifactReaderFailure && cause.cleanup !== undefined)
32
+ return cause.cleanup;
33
+ return { reason: errorMessage(cause), resources: [resource] };
10
34
  }
11
35
  }
36
+ const combineCleanup = (primary, cleanup) => primary === undefined || primary === cleanup
37
+ ? cleanup
38
+ : {
39
+ reason: `${primary.reason}; ${cleanup.reason}`,
40
+ resources: [...new Set([...primary.resources, ...cleanup.resources])],
41
+ };
42
+ const errorMessage = (cause) => cause instanceof Error ? cause.message : String(cause);