rea-agents 6.0.0 → 6.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 (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,16 +1,17 @@
1
1
  import { parseClientConfiguration, serializeClientConfiguration, clientServerPath, legacyClientServerPath, withClientServers, } from "./ClientConfigurationDocument.js";
2
2
  import { copyFile, lstat, readFile, realpath, rm } from "node:fs/promises";
3
- import { homedir } from "node:os";
3
+ import { constants as fsConstants } from "node:fs";
4
+ import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
4
5
  import { join } from "node:path";
5
6
  import writeFileAtomic from "write-file-atomic";
6
7
  import { z } from "zod";
7
8
  import { PRODUCT_IDENTITY } from "../identity.js";
8
9
  import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
9
10
  import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
10
- import { supportedClients } from "./SupportedClients.js";
11
+ import { manualRegistrationRemediation, supportedClients, } from "./SupportedClients.js";
11
12
  const systemFileSystem = {
12
13
  readText: (path) => readFile(path, "utf8"),
13
- copy: (source, destination) => copyFile(source, destination),
14
+ copy: (source, destination) => copyFile(source, destination, fsConstants.COPYFILE_EXCL),
14
15
  writeText: (path, contents) => writeFileAtomic(path, contents, { encoding: "utf8" }),
15
16
  stat: (path) => lstat(path),
16
17
  realpath: (path) => realpath(path),
@@ -30,14 +31,26 @@ export const isUninstallFailure = (result) => {
30
31
  }
31
32
  }
32
33
  };
33
- /** Remove only REA-owned registrations and managed files, optionally including local state. */
34
+ /**
35
+ * Remove only REA-owned registrations and managed files, optionally including
36
+ * local state. A client configuration that cannot be read safely stops the
37
+ * operation before anything is removed; one that fails during removal stops
38
+ * the remaining removals.
39
+ */
34
40
  export const runUninstall = async (purgeData, host = systemUninstallHost()) => {
35
- const items = [];
36
- for (const client of await host.clients())
37
- items.push(await host.removeClient(client));
38
- items.push(await host.removeSkill());
39
- if (purgeData)
40
- items.push(...(await host.purgeData()));
41
+ const clients = await host.clients();
42
+ const blocked = [];
43
+ for (const client of clients) {
44
+ const blocking = await host.inspectClient(client);
45
+ if (blocking !== undefined)
46
+ blocked.push(blocking);
47
+ }
48
+ const items = blocked.length > 0
49
+ ? [
50
+ ...blocked,
51
+ item("uninstall", "skipped", "No REA registration, skill, or data was removed. Repair each failed configuration, then rerun uninstall."),
52
+ ]
53
+ : await removeAll(clients, purgeData, host);
41
54
  items.push({
42
55
  name: "analysis_engine",
43
56
  status: "retained",
@@ -50,40 +63,80 @@ export const runUninstall = async (purgeData, host = systemUninstallHost()) => {
50
63
  items,
51
64
  };
52
65
  };
66
+ /**
67
+ * Each client is reread when it is edited, so a concurrent change is never
68
+ * overwritten. A client that fails then still stops the remaining removals.
69
+ */
70
+ const removeAll = async (clients, purgeData, host) => {
71
+ const items = [];
72
+ for (const client of clients) {
73
+ const removed = await host.removeClient(client);
74
+ items.push(removed);
75
+ if (removed.status === "failed")
76
+ return [
77
+ ...items,
78
+ item("uninstall", "skipped", "Uninstall stopped at this failure; the items above report what changed. Repair the failed configuration, then rerun uninstall."),
79
+ ];
80
+ }
81
+ items.push(await host.removeSkill());
82
+ if (purgeData)
83
+ items.push(...(await host.purgeData()));
84
+ return items;
85
+ };
53
86
  /** Create uninstall effects contained to detected client configs and REA-owned paths. */
54
- export const systemUninstallHost = (home = homedir(), fileSystem = systemFileSystem) => ({
55
- clients: () => Promise.resolve(supportedClients(home)),
56
- removeClient: (client) => removeClient(client, fileSystem),
57
- removeSkill: () => removeManagedSkills(home, fileSystem),
58
- purgeData: async () => [
59
- await removeManagedPath(join(home, ".rea/cache"), "cache", fileSystem),
60
- await removeManagedPath(join(home, ".rea/state"), "state", fileSystem),
61
- ],
62
- });
63
- const removeClient = async (client, fileSystem) => {
87
+ export const systemUninstallHost = (selectedHome = undefined, fileSystem = systemFileSystem, environment = process.env, platform = process.platform) => {
88
+ const home = selectedHome ?? homeDirectoryFromEnvironment(environment, platform);
89
+ return {
90
+ clients: () => Promise.resolve(supportedClients(home, platform, environment)),
91
+ inspectClient: async (client) => {
92
+ const read = await readClientConfiguration(client, fileSystem);
93
+ return read.kind === "item" && read.item.status === "failed"
94
+ ? read.item
95
+ : undefined;
96
+ },
97
+ removeClient: (client) => removeClient(client, fileSystem),
98
+ removeSkill: () => removeManagedSkills(home, fileSystem),
99
+ purgeData: async () => [
100
+ await removeManagedPath(join(home, ".rea/cache"), "cache", fileSystem),
101
+ await removeManagedPath(join(home, ".rea/state"), "state", fileSystem),
102
+ ],
103
+ };
104
+ };
105
+ const readClientConfiguration = async (client, fileSystem) => {
64
106
  if (client.format === "unsupported")
65
- return item(client.name, "skipped", "This client has no documented local MCP configuration boundary.");
107
+ return itemRead(item(client.name, "skipped", manualRegistrationRemediation(client.name) ??
108
+ "This client has no documented local MCP configuration boundary."));
66
109
  const resolved = await resolveUninstallConfigPath(client, fileSystem);
67
110
  if (typeof resolved !== "string")
68
- return resolved;
111
+ return itemRead(resolved);
69
112
  const transactionPath = resolved;
70
113
  let original;
71
114
  try {
72
115
  original = await fileSystem.readText(transactionPath);
73
116
  }
74
117
  catch (cause) {
75
- return isMissing(cause)
118
+ return itemRead(isMissing(cause)
76
119
  ? item(client.name, "skipped", "Configuration does not exist.")
77
- : item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall.");
120
+ : item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall."));
78
121
  }
79
- let parsed;
80
122
  try {
81
- parsed = parseClientConfiguration(original, client.format);
123
+ const parsed = parseClientConfiguration(original, client.format);
124
+ return { kind: "configuration", transactionPath, original, parsed };
82
125
  }
83
126
  catch (cause) {
84
127
  void cause;
85
- return item(client.name, "failed", `Configuration is not valid ${client.format === "toml" ? "TOML" : client.format === "opencode" ? "JSONC" : "JSON"} and was not changed. Repair it, then rerun uninstall.`);
128
+ return itemRead(item(client.name, "failed", `Configuration is not valid ${client.format === "toml" || client.format === "grok" ? "TOML" : client.format === "opencode" ? "JSONC" : "JSON"} and was not changed. Repair it, then rerun uninstall.`));
86
129
  }
130
+ };
131
+ const itemRead = (result) => ({
132
+ kind: "item",
133
+ item: result,
134
+ });
135
+ const removeClient = async (client, fileSystem) => {
136
+ const read = await readClientConfiguration(client, fileSystem);
137
+ if (read.kind === "item")
138
+ return read.item;
139
+ const { transactionPath, original, parsed } = read;
87
140
  const name = PRODUCT_IDENTITY.mcpServerKey;
88
141
  // Beside a native OpenCode V2 table, OpenCode also loads a V1 `mcp.rea`.
89
142
  const legacyPath = legacyClientServerPath(parsed, name);
@@ -108,8 +161,8 @@ const removeClient = async (client, fileSystem) => {
108
161
  await fileSystem.copy(transactionPath, backupPath);
109
162
  }
110
163
  catch (cause) {
111
- void cause;
112
- return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
164
+ if (!(cause instanceof Error && "code" in cause && cause.code === "EEXIST"))
165
+ return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
113
166
  }
114
167
  try {
115
168
  await fileSystem.writeText(transactionPath, serializeClientConfiguration(document, client.format, original, editedPaths));
@@ -25,6 +25,23 @@ export const updateInstallCommand = (installation, version) => [
25
25
  installation.prefix,
26
26
  `${PRODUCT_IDENTITY.packageName}@${version}`,
27
27
  ];
28
+ const versionCheckRemediation = (release) => {
29
+ if (release.ok) {
30
+ return "REA received invalid version metadata. Check the installed version and npm registry, then rerun rea update.";
31
+ }
32
+ const failure = release.error;
33
+ const kind = failure.kind;
34
+ switch (kind) {
35
+ case "unavailable":
36
+ return `REA could not resolve the latest release: ${failure.detail}. Retry rea update when registry access is available.`;
37
+ case "invalid-metadata":
38
+ return `REA could not resolve the latest release: ${failure.detail}. Check the npm release metadata, then rerun rea update.`;
39
+ default: {
40
+ const exhaustive = kind;
41
+ throw new TypeError(`Unhandled release lookup failure: ${String(exhaustive)}`);
42
+ }
43
+ }
44
+ };
28
45
  /** Identify, resolve, install, and verify REA without applying setup changes. */
29
46
  export const runUpdate = async (currentVersion, host, output = "human") => {
30
47
  const installation = await host.installation();
@@ -37,9 +54,7 @@ export const runUpdate = async (currentVersion, host, output = "human") => {
37
54
  currentVersion,
38
55
  latestVersion,
39
56
  reason: "version-check",
40
- remediation: release.ok
41
- ? "REA received invalid version metadata. Check the installed version and npm registry, then rerun rea update."
42
- : `REA could not resolve the latest release: ${release.error}. Retry rea update when registry access is available.`,
57
+ remediation: versionCheckRemediation(release),
43
58
  };
44
59
  if (!gt(targetVersion, currentVersion))
45
60
  return {
@@ -21,9 +21,11 @@ const setupPlanSchema = z.object({
21
21
  })),
22
22
  });
23
23
  /** Discover owned registrations and an existing REA skill without writes. */
24
- export const existingMaintenanceScope = async (home, entryPoint) => {
25
- const registrations = await readClientRegistrationStatuses(home, entryPoint);
26
- const supported = supportedClients(home);
24
+ export const existingMaintenanceScope = async (home, entryPoint, environment) => {
25
+ const registrations = await readClientRegistrationStatuses(home, entryPoint, {
26
+ environment,
27
+ });
28
+ const supported = supportedClients(home, process.platform, environment);
27
29
  const clients = [];
28
30
  for (const registration of registrations) {
29
31
  if ((registration.state !== "aligned" && registration.state !== "stale") ||
@@ -56,9 +58,9 @@ export const existingMaintenanceScope = async (home, entryPoint) => {
56
58
  return { clients, skill };
57
59
  };
58
60
  /** Ask the verified new executable to plan only existing REA integrations. */
59
- export const planIntegrationMaintenance = async (home, entryPoint, execute) => {
61
+ export const planIntegrationMaintenance = async (home, entryPoint, environment, execute) => {
60
62
  try {
61
- const scope = await existingMaintenanceScope(home, entryPoint);
63
+ const scope = await existingMaintenanceScope(home, entryPoint, environment);
62
64
  if (scope.clients.length === 0 && !scope.skill)
63
65
  return { status: "current", plannedActions: [] };
64
66
  const command = [
@@ -1,21 +1,21 @@
1
1
  import { realpath } from "node:fs/promises";
2
- import { homedir } from "node:os";
2
+ import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
3
3
  import { basename, dirname, join, resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import spawn from "cross-spawn";
6
- import { z } from "zod";
7
6
  import { PRODUCT_IDENTITY } from "../identity.js";
8
7
  import { err, ok } from "../domain/result.js";
8
+ import { safeParseJson } from "../domain/safeJson.js";
9
9
  import { updateInstallCommand, } from "./Update.js";
10
10
  import { planIntegrationMaintenance } from "./UpdateMaintenance.js";
11
11
  /** Run an updater subprocess with complete diagnostics and isolated machine output. */
12
- export const runUpdateCommand = (command, output = "structured") => new Promise((resolveResult) => {
12
+ export const runUpdateCommand = (command, selectedEnvironment, output = "structured") => new Promise((resolveResult) => {
13
13
  const [executable, ...args] = command;
14
14
  if (executable === undefined) {
15
15
  resolveResult(err("No executable supplied."));
16
16
  return;
17
17
  }
18
- const environment = { ...process.env };
18
+ const environment = { ...selectedEnvironment };
19
19
  // A fresh installed entry point must not inherit npx's invocation identity.
20
20
  delete environment.npm_command;
21
21
  const child = spawn(executable, args, {
@@ -46,8 +46,8 @@ export const runUpdateCommand = (command, output = "structured") => new Promise(
46
46
  ? `Process exited with code ${String(code)}.`
47
47
  : `Process terminated by ${signal}.`))));
48
48
  });
49
- const requireCommandOutput = async (command) => {
50
- const result = await runUpdateCommand(command);
49
+ const requireCommandOutput = async (command, environment) => {
50
+ const result = await runUpdateCommand(command, environment);
51
51
  if (!result.ok)
52
52
  throw new Error(result.error);
53
53
  return result.value;
@@ -85,45 +85,66 @@ export const detectNpmInstallation = async (packageRoot, host) => {
85
85
  return undefined;
86
86
  return { prefix: dirname(library), packageRoot: canonicalPackageRoot };
87
87
  };
88
+ const INVALID_NPM_RELEASE_METADATA = "Invalid npm release metadata: expected a version string or a single-element version array.";
89
+ /** npm view arguments for dist-tags.latest, scoped to the owning prefix when known. */
90
+ export const npmLatestVersionCommand = (installation) => [
91
+ "npm",
92
+ "view",
93
+ "--global",
94
+ ...(installation === undefined ? [] : ["--prefix", installation.prefix]),
95
+ PRODUCT_IDENTITY.packageName,
96
+ "dist-tags.latest",
97
+ "--json",
98
+ "--fetch-retries=0",
99
+ "--fetch-timeout=10000",
100
+ ];
101
+ /**
102
+ * Read one latest version from `npm view --json`.
103
+ * npm 11 emits a JSON string. npm 12 emits that string as a one-element array.
104
+ */
105
+ export const parseNpmLatestVersion = (metadata) => {
106
+ const decoded = safeParseJson(metadata);
107
+ if (!decoded.ok)
108
+ return err(decoded.error);
109
+ const version = readNpmLatestVersion(decoded.value);
110
+ return version === undefined
111
+ ? err(INVALID_NPM_RELEASE_METADATA)
112
+ : ok(version);
113
+ };
114
+ const readNpmLatestVersion = (value) => {
115
+ if (typeof value === "string")
116
+ return nonemptyVersion(value);
117
+ if (!Array.isArray(value) || value.length !== 1)
118
+ return undefined;
119
+ const only = value[0];
120
+ return typeof only === "string" ? nonemptyVersion(only) : undefined;
121
+ };
122
+ const nonemptyVersion = (value) => value.length === 0 ? undefined : value;
123
+ /** Classify npm view output as a version or a lookup failure. */
124
+ export const npmReleaseLookup = (response) => {
125
+ if (!response.ok)
126
+ return err({ kind: "unavailable", detail: response.error });
127
+ const parsed = parseNpmLatestVersion(response.value);
128
+ return parsed.ok
129
+ ? ok(parsed.value)
130
+ : err({ kind: "invalid-metadata", detail: parsed.error });
131
+ };
88
132
  /** Create npm, registry, verification, and read-only maintenance effects. */
89
- export const systemUpdateHost = (packageRoot = fileURLToPath(new URL("../..", import.meta.url)), home = homedir()) => ({
133
+ export const systemUpdateHost = (packageRoot = fileURLToPath(new URL("../..", import.meta.url)), home = undefined, environment = process.env) => ({
90
134
  installation: () => detectNpmInstallation(packageRoot, {
91
135
  canonicalPath: realpath,
92
- globalRoot: () => requireCommandOutput(["npm", "root", "--global"]),
93
- globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"]),
136
+ globalRoot: () => requireCommandOutput(["npm", "root", "--global"], environment),
137
+ globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"], environment),
94
138
  }),
95
- latestVersion: async (installation) => {
96
- const response = await runUpdateCommand([
97
- "npm",
98
- "view",
99
- "--global",
100
- ...(installation === undefined ? [] : ["--prefix", installation.prefix]),
101
- PRODUCT_IDENTITY.packageName,
102
- "dist-tags.latest",
103
- "--json",
104
- "--fetch-retries=0",
105
- "--fetch-timeout=10000",
106
- ]);
107
- if (!response.ok)
108
- return response;
109
- try {
110
- const parsed = z.string().min(1).safeParse(JSON.parse(response.value));
111
- return parsed.success
112
- ? ok(parsed.data)
113
- : err(`Invalid npm release metadata: ${parsed.error.message}`);
114
- }
115
- catch (cause) {
116
- return err(cause instanceof Error ? cause.message : String(cause));
117
- }
118
- },
139
+ latestVersion: async (installation) => npmReleaseLookup(await runUpdateCommand(npmLatestVersionCommand(installation), environment)),
119
140
  installVersion: async (installation, version, output) => {
120
- const result = await runUpdateCommand(updateInstallCommand(installation, version), output);
141
+ const result = await runUpdateCommand(updateInstallCommand(installation, version), environment, output);
121
142
  return result.ok ? ok(undefined) : result;
122
143
  },
123
144
  installedVersion: (installation) => runUpdateCommand([
124
145
  process.execPath,
125
146
  join(installation.packageRoot, "scripts", "rea.mjs"),
126
147
  "--version",
127
- ]),
128
- planMaintenance: (installation) => planIntegrationMaintenance(home, join(installation.packageRoot, "scripts", "rea.mjs"), runUpdateCommand),
148
+ ], environment),
149
+ planMaintenance: (installation) => planIntegrationMaintenance(home ?? homeDirectoryFromEnvironment(environment, process.platform), join(installation.packageRoot, "scripts", "rea.mjs"), environment, (command) => runUpdateCommand(command, environment)),
129
150
  });
@@ -3,7 +3,7 @@ import { z } from "zod";
3
3
  import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
4
4
  import { createEvidence } from "../domain/evidence.js";
5
5
  import { jsonObjectSchema } from "../domain/jsonValue.js";
6
- import { projectInputIssues } from "../domain/inputIssueProjection.js";
6
+ import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
7
7
  import { err, ok } from "../domain/result.js";
8
8
  import { collectWebModuleImports, matchCapturedModules, } from "../domain/webModuleImports.js";
9
9
  import { webModuleTraceInputSchema, webModuleFileSchema, webModuleResolutionSchema, webModuleTraceResultSchema, } from "../domain/webModuleTrace.js";
@@ -48,7 +48,9 @@ export class WebModuleTraceService {
48
48
  return err(new AnalysisCancelledError(OPERATION));
49
49
  const parsed = webModuleTraceInputSchema.safeParse(rawInput);
50
50
  if (!parsed.success)
51
- return err(new AnalysisInputError(OPERATION, { cause: parsed.error }, projectInputIssues(parsed.error.issues, rawInput)));
51
+ return err(analysisInputErrorFromIssues(OPERATION, parsed.error.issues, rawInput, {
52
+ cause: parsed.error,
53
+ }));
52
54
  const input = parsed.data;
53
55
  for (const [path, value] of [
54
56
  ["manifest_path", input.manifest_path],
@@ -4,7 +4,7 @@ import { redactExplicitText } from "../domain/explicitSensitiveValues.js";
4
4
  import { isAbsolute } from "node:path";
5
5
  import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
6
6
  import { createEvidence } from "../domain/evidence.js";
7
- import { projectInputIssues } from "../domain/inputIssueProjection.js";
7
+ import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
8
8
  import { jsonObjectSchema } from "../domain/jsonValue.js";
9
9
  import { err, ok } from "../domain/result.js";
10
10
  import { inspectWebNetworkCaptureInputSchema, webNetworkCaptureSchema, } from "../domain/webNetworkCapture.js";
@@ -27,7 +27,9 @@ export class WebNetworkCaptureService {
27
27
  const failure = (error) => err(redactExplicitFailure(error, declarations.success ? declarations.data : []));
28
28
  const parsed = inspectWebNetworkCaptureInputSchema.safeParse(rawInput);
29
29
  if (!parsed.success)
30
- return failure(new AnalysisInputError(OPERATION, { cause: parsed.error }, projectInputIssues(parsed.error.issues, rawInput)));
30
+ return failure(analysisInputErrorFromIssues(OPERATION, parsed.error.issues, rawInput, {
31
+ cause: parsed.error,
32
+ }));
31
33
  const input = parsed.data;
32
34
  if (!isAbsolute(input.capture_path))
33
35
  return failure(new AnalysisInputError(OPERATION, undefined, [
@@ -1,8 +1,8 @@
1
1
  import { z } from "zod";
2
- import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
2
+ import { AnalysisCancelledError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
3
3
  import { createEvidence } from "../domain/evidence.js";
4
4
  import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
5
- import { projectInputIssues } from "../domain/inputIssueProjection.js";
5
+ import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
6
6
  import { err, ok } from "../domain/result.js";
7
7
  import { observeWebExecutionInputSchema, webExecutionSchema, } from "../domain/webExecution.js";
8
8
  import { inspectWebEventListenersInputSchema, webEventListenersSchema, } from "../domain/webEventListeners.js";
@@ -69,5 +69,7 @@ const parseInput = (schema, rawInput, operation, options) => {
69
69
  const parsed = schema.safeParse(rawInput);
70
70
  return parsed.success
71
71
  ? ok(parsed.data)
72
- : err(new AnalysisInputError(operation, { cause: parsed.error }, projectInputIssues(parsed.error.issues, rawInput)));
72
+ : err(analysisInputErrorFromIssues(operation, parsed.error.issues, rawInput, {
73
+ cause: parsed.error,
74
+ }));
73
75
  };
@@ -5,9 +5,9 @@ import { z } from "zod";
5
5
  import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
6
6
  import { publishWebScripts } from "../browser/assets/PublishWebScripts.js";
7
7
  import { selectScriptCapture } from "../browser/assets/ScriptCaptureAdapters.js";
8
- import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
8
+ import { AnalysisAccessDeniedError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
9
9
  import { createEvidence } from "../domain/evidence.js";
10
- import { projectInputIssues } from "../domain/inputIssueProjection.js";
10
+ import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
11
11
  import { jsonValueSchema } from "../domain/jsonValue.js";
12
12
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
13
13
  import { err, ok } from "../domain/result.js";
@@ -21,7 +21,7 @@ export const exportWebScripts = async (rawInput, options = {}) => {
21
21
  const input = exportWebScriptsInputSchema.safeParse(rawInput);
22
22
  return input.success
23
23
  ? exportWebScriptsValidated(input.data, options)
24
- : err(new AnalysisInputError(OPERATION, undefined, projectInputIssues(input.error.issues, rawInput)));
24
+ : err(analysisInputErrorFromIssues(OPERATION, input.error.issues, rawInput));
25
25
  };
26
26
  /** Publish input already parsed by a named adapter contract. */
27
27
  export const exportWebScriptsValidated = async (input, options = {}) => {
@@ -35,9 +35,10 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
35
35
  ]));
36
36
  try {
37
37
  options.signal?.throwIfAborted();
38
- const bytes = await readFile(input.capture_path, {
39
- signal: options.signal,
40
- });
38
+ const read = await readCapture(input.capture_path, options.signal);
39
+ if (!read.ok)
40
+ return read;
41
+ const bytes = read.value;
41
42
  const loaded = parseCapture(bytes);
42
43
  if (!loaded.ok)
43
44
  return loaded;
@@ -90,6 +91,31 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
90
91
  }));
91
92
  }
92
93
  };
94
+ /**
95
+ * Read the caller-selected capture. A missing, non-file or unreadable
96
+ * selection is a caller or host-permission failure, not an export failure.
97
+ */
98
+ const readCapture = async (path, signal) => {
99
+ try {
100
+ return ok(await readFile(path, { signal }));
101
+ }
102
+ catch (cause) {
103
+ const code = cause instanceof Error && "code" in cause ? String(cause.code) : "";
104
+ if (code === "EACCES" || code === "EPERM")
105
+ return err(new AnalysisAccessDeniedError(OPERATION, path, code, { cause }));
106
+ if (code === "ENOENT" || code === "ENOTDIR" || code === "EISDIR")
107
+ return err(new AnalysisInputError(OPERATION, { cause }, [
108
+ {
109
+ path: ["capture_path"],
110
+ reason: "invalid_value",
111
+ message: code === "EISDIR"
112
+ ? `Selected capture is a directory, not a file: ${path}`
113
+ : `Selected capture could not be read (${code}): ${path}`,
114
+ },
115
+ ]));
116
+ throw cause;
117
+ }
118
+ };
93
119
  const parseCapture = (bytes) => {
94
120
  try {
95
121
  const text = new TextDecoder("utf-8", {
@@ -3,7 +3,7 @@ import { isAbsolute } from "node:path";
3
3
  import { z } from "zod";
4
4
  import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
5
5
  import { createEvidence } from "../domain/evidence.js";
6
- import { projectInputIssues } from "../domain/inputIssueProjection.js";
6
+ import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
7
7
  import { jsonObjectSchema } from "../domain/jsonValue.js";
8
8
  import { err, ok } from "../domain/result.js";
9
9
  import { selectedWebScriptArtifactsSchema, webArtifactFileSchema, } from "../domain/webScriptArtifacts.js";
@@ -41,7 +41,9 @@ export class WebSourceLocationService {
41
41
  return err(new AnalysisCancelledError(OPERATION));
42
42
  const parsed = webSourceLocationInputSchema.safeParse(rawInput);
43
43
  if (!parsed.success)
44
- return err(new AnalysisInputError(OPERATION, { cause: parsed.error }, projectInputIssues(parsed.error.issues, rawInput)));
44
+ return err(analysisInputErrorFromIssues(OPERATION, parsed.error.issues, rawInput, {
45
+ cause: parsed.error,
46
+ }));
45
47
  const input = parsed.data;
46
48
  const admitted = admitContext(input);
47
49
  if (!admitted.ok)
@@ -0,0 +1,105 @@
1
+ import { REA_WORKFLOW_PROVIDER, workflowAnalysisProfile, } from "./InvestigationProviders.js";
2
+ import { analysisProfileSchema, committedProviderSchema, } from "../domain/analysisProfile.js";
3
+ import { createEvidence, } from "../domain/evidence.js";
4
+ import { UnknownRegistryError } from "../domain/unknownRegistryError.js";
5
+ /** Build the shared Evidence record for a successful composed binary workflow. */
6
+ export const createWorkflowEvidence = (input) => createEvidence(input.target, REA_WORKFLOW_PROVIDER, {
7
+ operation: input.operation,
8
+ parameters: input.parameters,
9
+ result: input.result,
10
+ ...(input.upstreamProfile === undefined
11
+ ? {}
12
+ : {
13
+ analysisProfile: workflowAnalysisProfile(input.upstreamProfile, input.operation),
14
+ }),
15
+ confidence: "derived",
16
+ limitations: ["Derived by an REA composed workflow."],
17
+ ...(input.operation === "batch_decompile"
18
+ ? { locations: batchProcedureLocations(input.result) }
19
+ : {}),
20
+ });
21
+ const batchProcedureLocations = (result) => {
22
+ if (result === null ||
23
+ typeof result !== "object" ||
24
+ Array.isArray(result) ||
25
+ !Array.isArray(result.items))
26
+ return [];
27
+ const addresses = new Set();
28
+ for (const item of result.items) {
29
+ if (item === null || typeof item !== "object" || Array.isArray(item))
30
+ continue;
31
+ const procedure = item.procedure;
32
+ if (procedure !== null &&
33
+ typeof procedure === "object" &&
34
+ !Array.isArray(procedure) &&
35
+ procedure.status === "resolved" &&
36
+ typeof procedure.address === "string")
37
+ addresses.add(procedure.address);
38
+ }
39
+ return [...addresses].map((address) => ({ kind: "address", address }));
40
+ };
41
+ /** Convert workflow Evidence into its exact replay binding, when it has a profile. */
42
+ export const workflowSnapshotRecord = (evidence, operation) => {
43
+ if (evidence.analysis_profile === null)
44
+ return undefined;
45
+ return {
46
+ operation,
47
+ parameters: evidence.parameters,
48
+ execution: {
49
+ result: evidence.normalized_result,
50
+ rawResult: evidence.raw_result,
51
+ provider: committedProviderSchema.parse(evidence.provider),
52
+ analysisProfile: analysisProfileSchema.parse(evidence.analysis_profile),
53
+ limitations: evidence.limitations,
54
+ locations: evidence.locations,
55
+ subject: evidence.subject === null
56
+ ? null
57
+ : {
58
+ path: evidence.subject.local_path,
59
+ sha256: evidence.subject.digest.sha256,
60
+ format: evidence.subject.format,
61
+ ...(evidence.subject.architecture === null
62
+ ? {}
63
+ : { architecture: evidence.subject.architecture }),
64
+ },
65
+ },
66
+ };
67
+ };
68
+ /** Retain residual workflow questions using the shared investigation policy. */
69
+ export const recordWorkflowUnknowns = ({ name, result, evidenceId, recordUnknown, }) => {
70
+ if (!["trace_feature", "trace_call_path", "inspect_native_api"].includes(name) ||
71
+ recordUnknown === undefined ||
72
+ typeof result !== "object" ||
73
+ result === null ||
74
+ Array.isArray(result) ||
75
+ !Array.isArray(result.residual_unknowns))
76
+ return { ok: true, value: null };
77
+ for (const question of result.residual_unknowns) {
78
+ if (typeof question !== "string")
79
+ continue;
80
+ const recorded = recordUnknown({
81
+ question,
82
+ severity: "medium",
83
+ domain: name === "inspect_native_api" ? "native-api" : "control-flow",
84
+ supporting_evidence_ids: [evidenceId],
85
+ contradicting_evidence_ids: [],
86
+ required_authority: "shipped-artifact",
87
+ required_confidence: "observed",
88
+ required_environment: null,
89
+ recommended_probes: [
90
+ {
91
+ operation: name,
92
+ rationale: name === "inspect_native_api"
93
+ ? "Confirm the unsupported boundary with a capable provider or ABI probe."
94
+ : "Continue with a focused query or another available provider.",
95
+ },
96
+ ],
97
+ relationships: [],
98
+ });
99
+ if (!recorded.ok &&
100
+ !(recorded.error instanceof UnknownRegistryError &&
101
+ recorded.error.reason === "already-exists"))
102
+ return recorded;
103
+ }
104
+ return { ok: true, value: null };
105
+ };