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
@@ -10,7 +10,33 @@ const SKILL_FILES = [
10
10
  "references/runtime-observation.md",
11
11
  "references/evidence-workflows.md",
12
12
  ];
13
- const skillRoot = (home) => join(home, ".agents/skills", PRODUCT_IDENTITY.skillName);
13
+ /** Resolve Claude Code personal skills from the selected environment. */
14
+ export const claudeCodeSkillsDirectory = (home, environment = {}) => join(environment.CLAUDE_CONFIG_DIR ?? join(home, ".claude"), "skills");
15
+ /** Resolve the skill roots required by a client selection, or all owned roots. */
16
+ export const skillDestinations = (home, clientIds, claudeSkillsDirectory = claudeCodeSkillsDirectory(home)) => {
17
+ const includeClaude = clientIds === undefined || clientIds.includes("claude_code");
18
+ const includeShared = clientIds === undefined ||
19
+ clientIds.length === 0 ||
20
+ clientIds.some((clientId) => clientId !== "claude_code");
21
+ return [
22
+ ...(includeShared
23
+ ? [
24
+ {
25
+ client: "shared",
26
+ path: join(home, ".agents/skills", PRODUCT_IDENTITY.skillName),
27
+ },
28
+ ]
29
+ : []),
30
+ ...(includeClaude
31
+ ? [
32
+ {
33
+ client: "claude_code",
34
+ path: join(claudeSkillsDirectory, PRODUCT_IDENTITY.skillName),
35
+ },
36
+ ]
37
+ : []),
38
+ ];
39
+ };
14
40
  const readOptionalText = async (path) => {
15
41
  try {
16
42
  return await readFile(path, "utf8");
@@ -21,18 +47,18 @@ const readOptionalText = async (path) => {
21
47
  throw cause;
22
48
  }
23
49
  };
24
- const canonicalSkillFiles = async (home) => Promise.all(SKILL_FILES.map(async (relativePath) => {
25
- const destination = join(skillRoot(home), relativePath);
50
+ const canonicalSkillFiles = async (home, clientIds, claudeSkillsDirectory) => Promise.all(skillDestinations(home, clientIds, claudeSkillsDirectory).flatMap(({ path: root }) => SKILL_FILES.map(async (relativePath) => {
51
+ const destination = join(root, relativePath);
26
52
  return {
27
53
  destination,
28
54
  content: await readFile(new URL(`../../skills/${PRODUCT_IDENTITY.skillName}/${relativePath}`, import.meta.url), "utf8"),
29
55
  original: await readOptionalText(destination),
30
56
  };
31
- }));
57
+ })));
32
58
  /** Report whether setup would change any file in the managed REA skill bundle. */
33
- export const canonicalSkillNeedsInstall = async (home) => {
59
+ export const canonicalSkillNeedsInstall = async (home, clientIds = [], claudeSkillsDirectory) => {
34
60
  try {
35
- return (await canonicalSkillFiles(home)).some(({ content, original }) => original !== content);
61
+ return (await canonicalSkillFiles(home, clientIds, claudeSkillsDirectory)).some(({ content, original }) => original !== content);
36
62
  }
37
63
  catch (cause) {
38
64
  // Unreadable skill state fails open to install so setup can repair it.
@@ -50,10 +76,10 @@ const restoreSkillFiles = async (changed) => {
50
76
  }
51
77
  };
52
78
  /** Transactionally install or upgrade the canonical REA skill and references. */
53
- export const installCanonicalSkill = async (home) => {
79
+ export const installCanonicalSkill = async (home, clientIds = [], claudeSkillsDirectory) => {
54
80
  let changed = [];
55
81
  try {
56
- const canonical = await canonicalSkillFiles(home);
82
+ const canonical = await canonicalSkillFiles(home, clientIds, claudeSkillsDirectory);
57
83
  changed = canonical.filter(({ content, original }) => original !== content);
58
84
  if (changed.length === 0)
59
85
  return "unchanged";
@@ -82,3 +108,26 @@ export const installCanonicalSkill = async (home) => {
82
108
  return "failed";
83
109
  }
84
110
  };
111
+ /** Read installed skill metadata and compare every managed location. */
112
+ export const readInstalledSkillIdentity = async (home, clientIds, claudeSkillsDirectory) => {
113
+ const destinations = skillDestinations(home, clientIds, claudeSkillsDirectory);
114
+ let content;
115
+ for (const destination of destinations) {
116
+ try {
117
+ content = await readFile(join(destination.path, "SKILL.md"), "utf8");
118
+ break;
119
+ }
120
+ catch {
121
+ // Another selected copy may provide metadata; canonical validation below
122
+ // still marks missing or unreadable copies as stale.
123
+ }
124
+ }
125
+ if (content === undefined)
126
+ return undefined;
127
+ const toolCount = /^\s{2}tool_count:\s*(\d+)\s*$/mu.exec(content)?.[1];
128
+ return {
129
+ canonical: !(await canonicalSkillNeedsInstall(home, clientIds, claudeSkillsDirectory)),
130
+ version: /^\s{2}version:\s*"([^"]+)"\s*$/mu.exec(content)?.[1] ?? null,
131
+ toolCount: toolCount === undefined ? null : Number.parseInt(toolCount, 10),
132
+ };
133
+ };
@@ -34,6 +34,38 @@ export const GROK_BOT_MANUAL_REGISTRATION_REMEDIATION = "Grok Bot keeps connecto
34
34
  export const manualRegistrationRemediation = (clientName) => clientName === "grok_bot"
35
35
  ? GROK_BOT_MANUAL_REGISTRATION_REMEDIATION
36
36
  : undefined;
37
+ const OMP_PROFILE_NAME = /^[a-z0-9][a-z0-9._-]{0,63}$/u;
38
+ /**
39
+ * OMP's active named profile. OMP_PROFILE wins over the legacy PI_PROFILE even
40
+ * when empty; empty and "default" select the default profile. OMP refuses to
41
+ * start with an invalid name, so one leaves the default location in place.
42
+ */
43
+ const ompProfile = ({ env }) => {
44
+ const name = (env.OMP_PROFILE ?? env.PI_PROFILE)?.trim();
45
+ return name === undefined ||
46
+ name === "" ||
47
+ name === "default" ||
48
+ name.endsWith(".") ||
49
+ !OMP_PROFILE_NAME.test(name)
50
+ ? undefined
51
+ : name;
52
+ };
53
+ /**
54
+ * The OMP agent directory whose `mcp.json` holds user-scope MCP servers. OMP
55
+ * joins PI_CONFIG_DIR to the home directory, and a named profile ignores
56
+ * PI_CODING_AGENT_DIR. OMP resolves a relative agent directory against each
57
+ * process's working directory, so only an absolute override names one file.
58
+ */
59
+ const ompAgentDirectory = (context) => {
60
+ const root = join(context.home, context.env.PI_CONFIG_DIR || ".omp");
61
+ const profile = ompProfile(context);
62
+ if (profile !== undefined)
63
+ return join(root, "profiles", profile, "agent");
64
+ const override = context.env.PI_CODING_AGENT_DIR;
65
+ return override !== undefined && override !== "" && isAbsolute(override)
66
+ ? override
67
+ : join(root, "agent");
68
+ };
37
69
  const copilotDirectory = ({ home, env }) => env.COPILOT_HOME ?? join(home, ".copilot");
38
70
  const commandCodeDirectory = ({ home }) => join(home, ".commandcode");
39
71
  const opencodeDirectory = ({ home, env }) => join(env.XDG_CONFIG_HOME ?? join(home, ".config"), "opencode");
@@ -157,6 +189,13 @@ export const SUPPORTED_CLIENT_DEFINITIONS = [
157
189
  markerPath: grokDirectory,
158
190
  format: "grok",
159
191
  },
192
+ {
193
+ name: "omp",
194
+ displayName: "OMP",
195
+ configPath: (context) => join(ompAgentDirectory(context), "mcp.json"),
196
+ markerPath: ompAgentDirectory,
197
+ format: "omp",
198
+ },
160
199
  {
161
200
  name: "grok_bot",
162
201
  displayName: "Grok Bot",
@@ -173,7 +212,11 @@ export const supportedClients = (home, platform = process.platform, env = {
173
212
  CODEX_HOME: process.env.CODEX_HOME,
174
213
  COPILOT_HOME: process.env.COPILOT_HOME,
175
214
  GROK_HOME: process.env.GROK_HOME,
215
+ OMP_PROFILE: process.env.OMP_PROFILE,
176
216
  OPENCODE_CONFIG: process.env.OPENCODE_CONFIG,
217
+ PI_CODING_AGENT_DIR: process.env.PI_CODING_AGENT_DIR,
218
+ PI_CONFIG_DIR: process.env.PI_CONFIG_DIR,
219
+ PI_PROFILE: process.env.PI_PROFILE,
177
220
  SAND_DATA_ROOT: process.env.SAND_DATA_ROOT,
178
221
  XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME,
179
222
  }) => {
@@ -1,16 +1,18 @@
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";
9
+ import { claudeCodeSkillsDirectory, skillDestinations } from "./SetupSkill.js";
8
10
  import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
9
11
  import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
10
12
  import { manualRegistrationRemediation, supportedClients, } from "./SupportedClients.js";
11
13
  const systemFileSystem = {
12
14
  readText: (path) => readFile(path, "utf8"),
13
- copy: (source, destination) => copyFile(source, destination),
15
+ copy: (source, destination) => copyFile(source, destination, fsConstants.COPYFILE_EXCL),
14
16
  writeText: (path, contents) => writeFileAtomic(path, contents, { encoding: "utf8" }),
15
17
  stat: (path) => lstat(path),
16
18
  realpath: (path) => realpath(path),
@@ -30,14 +32,26 @@ export const isUninstallFailure = (result) => {
30
32
  }
31
33
  }
32
34
  };
33
- /** Remove only REA-owned registrations and managed files, optionally including local state. */
35
+ /**
36
+ * Remove only REA-owned registrations and managed files, optionally including
37
+ * local state. A client configuration that cannot be read safely stops the
38
+ * operation before anything is removed; one that fails during removal stops
39
+ * the remaining removals.
40
+ */
34
41
  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()));
42
+ const clients = await host.clients();
43
+ const blocked = [];
44
+ for (const client of clients) {
45
+ const blocking = await host.inspectClient(client);
46
+ if (blocking !== undefined)
47
+ blocked.push(blocking);
48
+ }
49
+ const items = blocked.length > 0
50
+ ? [
51
+ ...blocked,
52
+ item("uninstall", "skipped", "No REA registration, skill, or data was removed. Repair each failed configuration, then rerun uninstall."),
53
+ ]
54
+ : await removeAll(clients, purgeData, host);
41
55
  items.push({
42
56
  name: "analysis_engine",
43
57
  status: "retained",
@@ -50,41 +64,80 @@ export const runUninstall = async (purgeData, host = systemUninstallHost()) => {
50
64
  items,
51
65
  };
52
66
  };
67
+ /**
68
+ * Each client is reread when it is edited, so a concurrent change is never
69
+ * overwritten. A client that fails then still stops the remaining removals.
70
+ */
71
+ const removeAll = async (clients, purgeData, host) => {
72
+ const items = [];
73
+ for (const client of clients) {
74
+ const removed = await host.removeClient(client);
75
+ items.push(removed);
76
+ if (removed.status === "failed")
77
+ return [
78
+ ...items,
79
+ item("uninstall", "skipped", "Uninstall stopped at this failure; the items above report what changed. Repair the failed configuration, then rerun uninstall."),
80
+ ];
81
+ }
82
+ items.push(await host.removeSkill());
83
+ if (purgeData)
84
+ items.push(...(await host.purgeData()));
85
+ return items;
86
+ };
53
87
  /** 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) => {
88
+ export const systemUninstallHost = (selectedHome = undefined, fileSystem = systemFileSystem, environment = process.env, platform = process.platform) => {
89
+ const home = selectedHome ?? homeDirectoryFromEnvironment(environment, platform);
90
+ return {
91
+ clients: () => Promise.resolve(supportedClients(home, platform, environment)),
92
+ inspectClient: async (client) => {
93
+ const read = await readClientConfiguration(client, fileSystem);
94
+ return read.kind === "item" && read.item.status === "failed"
95
+ ? read.item
96
+ : undefined;
97
+ },
98
+ removeClient: (client) => removeClient(client, fileSystem),
99
+ removeSkill: () => removeManagedSkills(home, fileSystem, environment),
100
+ purgeData: async () => [
101
+ await removeManagedPath(join(home, ".rea/cache"), "cache", fileSystem),
102
+ await removeManagedPath(join(home, ".rea/state"), "state", fileSystem),
103
+ ],
104
+ };
105
+ };
106
+ const readClientConfiguration = async (client, fileSystem) => {
64
107
  if (client.format === "unsupported")
65
- return item(client.name, "skipped", manualRegistrationRemediation(client.name) ??
66
- "This client has no documented local MCP configuration boundary.");
108
+ return itemRead(item(client.name, "skipped", manualRegistrationRemediation(client.name) ??
109
+ "This client has no documented local MCP configuration boundary."));
67
110
  const resolved = await resolveUninstallConfigPath(client, fileSystem);
68
111
  if (typeof resolved !== "string")
69
- return resolved;
112
+ return itemRead(resolved);
70
113
  const transactionPath = resolved;
71
114
  let original;
72
115
  try {
73
116
  original = await fileSystem.readText(transactionPath);
74
117
  }
75
118
  catch (cause) {
76
- return isMissing(cause)
119
+ return itemRead(isMissing(cause)
77
120
  ? item(client.name, "skipped", "Configuration does not exist.")
78
- : item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall.");
121
+ : item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall."));
79
122
  }
80
- let parsed;
81
123
  try {
82
- parsed = parseClientConfiguration(original, client.format);
124
+ const parsed = parseClientConfiguration(original, client.format);
125
+ return { kind: "configuration", transactionPath, original, parsed };
83
126
  }
84
127
  catch (cause) {
85
128
  void cause;
86
- return 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.`);
129
+ 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.`));
87
130
  }
131
+ };
132
+ const itemRead = (result) => ({
133
+ kind: "item",
134
+ item: result,
135
+ });
136
+ const removeClient = async (client, fileSystem) => {
137
+ const read = await readClientConfiguration(client, fileSystem);
138
+ if (read.kind === "item")
139
+ return read.item;
140
+ const { transactionPath, original, parsed } = read;
88
141
  const name = PRODUCT_IDENTITY.mcpServerKey;
89
142
  // Beside a native OpenCode V2 table, OpenCode also loads a V1 `mcp.rea`.
90
143
  const legacyPath = legacyClientServerPath(parsed, name);
@@ -109,8 +162,8 @@ const removeClient = async (client, fileSystem) => {
109
162
  await fileSystem.copy(transactionPath, backupPath);
110
163
  }
111
164
  catch (cause) {
112
- void cause;
113
- return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
165
+ if (!(cause instanceof Error && "code" in cause && cause.code === "EEXIST"))
166
+ return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
114
167
  }
115
168
  try {
116
169
  await fileSystem.writeText(transactionPath, serializeClientConfiguration(document, client.format, original, editedPaths));
@@ -172,7 +225,22 @@ const removeManagedPath = async (path, name, fileSystem) => {
172
225
  : item(name, "failed", "This item could not be removed. Check file permissions, then rerun uninstall.");
173
226
  }
174
227
  };
175
- const removeManagedSkills = async (home, fileSystem) => removeManagedPath(join(home, ".agents/skills", PRODUCT_IDENTITY.skillName), "skill", fileSystem);
228
+ const removeManagedSkills = async (home, fileSystem, environment) => {
229
+ const results = await Promise.all(skillDestinations(home, undefined, claudeCodeSkillsDirectory(home, environment)).map(({ client, path }) => removeManagedPath(path, client === "claude_code" ? "Claude Code skill" : "skill", fileSystem)));
230
+ const failed = results.find(({ status }) => status === "failed");
231
+ if (failed !== undefined)
232
+ return item("skill", "failed", results
233
+ .map(({ name, status, detail }) => `${name}: ${status} (${detail})`)
234
+ .join(" "));
235
+ const status = results.some(({ status: resultStatus }) => resultStatus === "removed")
236
+ ? "removed"
237
+ : results.some(({ status: resultStatus }) => resultStatus === "retained")
238
+ ? "retained"
239
+ : "skipped";
240
+ return item("skill", status, results
241
+ .map(({ name, status: resultStatus, detail }) => `${name}: ${resultStatus} (${detail})`)
242
+ .join(" "));
243
+ };
176
244
  const item = (name, status, detail) => ({ name, status, detail });
177
245
  const registrationSchema = z
178
246
  .object({ command: z.string(), args: z.array(z.string()) })
@@ -4,7 +4,7 @@ import { z } from "zod";
4
4
  import { PRODUCT_IDENTITY } from "../identity.js";
5
5
  import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
6
6
  import { readClientRegistrationStatuses } from "./ClientRegistrationStatus.js";
7
- import { effectiveClientServer, parseClientConfiguration, } from "./ClientConfigurationDocument.js";
7
+ import { clientServerForcedEnabled, clientServerListedDisabled, effectiveClientServer, parseClientConfiguration, } from "./ClientConfigurationDocument.js";
8
8
  import { supportedClients } from "./SupportedClients.js";
9
9
  const setupPlanSchema = z.object({
10
10
  status: z.literal("planned"),
@@ -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") ||
@@ -39,7 +41,11 @@ export const existingMaintenanceScope = async (home, entryPoint) => {
39
41
  disabled: z.boolean().optional(),
40
42
  })
41
43
  .parse(effectiveClientServer(parsed, PRODUCT_IDENTITY.mcpServerKey));
42
- if (enabled.enabled !== false && enabled.disabled !== true)
44
+ // Root disable lists override enabled entries and OMP's force-on allowlist.
45
+ if ((enabled.enabled !== false ||
46
+ clientServerForcedEnabled(parsed, PRODUCT_IDENTITY.mcpServerKey)) &&
47
+ enabled.disabled !== true &&
48
+ !clientServerListedDisabled(parsed, PRODUCT_IDENTITY.mcpServerKey))
43
49
  clients.push(client.name);
44
50
  }
45
51
  let skill = false;
@@ -56,9 +62,9 @@ export const existingMaintenanceScope = async (home, entryPoint) => {
56
62
  return { clients, skill };
57
63
  };
58
64
  /** Ask the verified new executable to plan only existing REA integrations. */
59
- export const planIntegrationMaintenance = async (home, entryPoint, execute) => {
65
+ export const planIntegrationMaintenance = async (home, entryPoint, environment, execute) => {
60
66
  try {
61
- const scope = await existingMaintenanceScope(home, entryPoint);
67
+ const scope = await existingMaintenanceScope(home, entryPoint, environment);
62
68
  if (scope.clients.length === 0 && !scope.skill)
63
69
  return { status: "current", plannedActions: [] };
64
70
  const command = [
@@ -1,5 +1,5 @@
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";
@@ -9,13 +9,13 @@ 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;
@@ -130,21 +130,21 @@ export const npmReleaseLookup = (response) => {
130
130
  : err({ kind: "invalid-metadata", detail: parsed.error });
131
131
  };
132
132
  /** Create npm, registry, verification, and read-only maintenance effects. */
133
- 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) => ({
134
134
  installation: () => detectNpmInstallation(packageRoot, {
135
135
  canonicalPath: realpath,
136
- globalRoot: () => requireCommandOutput(["npm", "root", "--global"]),
137
- globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"]),
136
+ globalRoot: () => requireCommandOutput(["npm", "root", "--global"], environment),
137
+ globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"], environment),
138
138
  }),
139
- latestVersion: async (installation) => npmReleaseLookup(await runUpdateCommand(npmLatestVersionCommand(installation))),
139
+ latestVersion: async (installation) => npmReleaseLookup(await runUpdateCommand(npmLatestVersionCommand(installation), environment)),
140
140
  installVersion: async (installation, version, output) => {
141
- const result = await runUpdateCommand(updateInstallCommand(installation, version), output);
141
+ const result = await runUpdateCommand(updateInstallCommand(installation, version), environment, output);
142
142
  return result.ok ? ok(undefined) : result;
143
143
  },
144
144
  installedVersion: (installation) => runUpdateCommand([
145
145
  process.execPath,
146
146
  join(installation.packageRoot, "scripts", "rea.mjs"),
147
147
  "--version",
148
- ]),
149
- 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)),
150
150
  });
@@ -0,0 +1,64 @@
1
+ import { constants } from "node:buffer";
2
+ import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js";
3
+ import { safeParseJson } from "../domain/safeJson.js";
4
+ /** Recovery that preserves complete, authenticated Evidence workflow inputs. */
5
+ export const JSON_INPUT_RESOURCE_REMEDIATION = "Provide a smaller valid JSON value. For Evidence workflows, re-analyze a smaller selection of the original target and use its complete Evidence; splitting JSON text or trimming Evidence fields does not produce valid workflow input.";
6
+ /** Decode JSON bytes without confusing a runtime string limit with malformed input. */
7
+ export const parseUtf8Json = (bytes, operation, path, boundary = "json-input") => {
8
+ const stringLimitFailure = (cause, decodedUnits) => new AnalysisResourceConstraintError(operation, "memory", "JSON input exceeds the runtime's maximum decoded string length", {
9
+ boundary,
10
+ input_path: path,
11
+ input_bytes: bytes.byteLength,
12
+ max_string_code_units: constants.MAX_STRING_LENGTH,
13
+ ...(decodedUnits === undefined
14
+ ? {}
15
+ : { decoded_string_code_units_at_least: decodedUnits }),
16
+ }, {
17
+ ...(cause === undefined ? {} : { cause }),
18
+ remediationAction: JSON_INPUT_RESOURCE_REMEDIATION,
19
+ });
20
+ let text;
21
+ try {
22
+ const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
23
+ if (bytes.byteLength <= constants.MAX_STRING_LENGTH) {
24
+ text = decoder.decode(bytes);
25
+ }
26
+ else {
27
+ // Node 22's UTF-8 fast path bounds encoded bytes before decoding. Decode
28
+ // large inputs in chunks so valid multibyte text is bounded by its actual
29
+ // UTF-16 length. Streaming also preserves characters spanning chunks.
30
+ const parts = [];
31
+ let decodedUnits = 0;
32
+ const append = (part) => {
33
+ decodedUnits += part.length;
34
+ if (decodedUnits > constants.MAX_STRING_LENGTH)
35
+ throw stringLimitFailure(undefined, decodedUnits);
36
+ parts.push(part);
37
+ };
38
+ const chunkBytes = 1024 * 1024;
39
+ for (let offset = 0; offset < bytes.byteLength; offset += chunkBytes)
40
+ append(decoder.decode(bytes.subarray(offset, offset + chunkBytes), {
41
+ stream: true,
42
+ }));
43
+ append(decoder.decode());
44
+ text = parts.join("");
45
+ }
46
+ }
47
+ catch (cause) {
48
+ if (cause instanceof AnalysisResourceConstraintError)
49
+ throw cause;
50
+ const code = typeof cause === "object" && cause !== null && "code" in cause
51
+ ? cause.code
52
+ : undefined;
53
+ if (code === "ERR_STRING_TOO_LONG")
54
+ throw stringLimitFailure(cause);
55
+ if (code !== "ERR_ENCODING_INVALID_ENCODED_DATA")
56
+ throw cause;
57
+ return {
58
+ ok: false,
59
+ error: "JSON input is not valid UTF-8",
60
+ cause,
61
+ };
62
+ }
63
+ return safeParseJson(text);
64
+ };
@@ -1,11 +1,10 @@
1
1
  import { createHash } from "node:crypto";
2
- import { readFile } from "node:fs/promises";
3
2
  import { isAbsolute } from "node:path";
4
3
  import { z } from "zod";
5
4
  import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
6
5
  import { publishWebScripts } from "../browser/assets/PublishWebScripts.js";
7
6
  import { selectScriptCapture } from "../browser/assets/ScriptCaptureAdapters.js";
8
- import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
7
+ import { AnalysisAccessDeniedError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
9
8
  import { createEvidence } from "../domain/evidence.js";
10
9
  import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
11
10
  import { jsonValueSchema } from "../domain/jsonValue.js";
@@ -15,6 +14,8 @@ import { safeParseJson } from "../domain/safeJson.js";
15
14
  import { exportWebScriptsInputSchema, } from "../domain/webScriptExport.js";
16
15
  import { WebScriptExportError } from "../domain/webScriptExportError.js";
17
16
  import { WEB_SCRIPT_EXPORT_PROVIDER as PROVIDER } from "./InvestigationProviders.js";
17
+ import { readRegularFile } from "./RegularFileRead.js";
18
+ import { NonRegularFileReadError } from "../filesystem/RegularFile.js";
18
19
  const OPERATION = "export_web_scripts";
19
20
  /** Export one local capture through the shared CLI/MCP application workflow. */
20
21
  export const exportWebScripts = async (rawInput, options = {}) => {
@@ -35,9 +36,10 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
35
36
  ]));
36
37
  try {
37
38
  options.signal?.throwIfAborted();
38
- const bytes = await readFile(input.capture_path, {
39
- signal: options.signal,
40
- });
39
+ const read = await readCapture(input.capture_path, options.signal);
40
+ if (!read.ok)
41
+ return read;
42
+ const bytes = read.value;
41
43
  const loaded = parseCapture(bytes);
42
44
  if (!loaded.ok)
43
45
  return loaded;
@@ -90,6 +92,37 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
90
92
  }));
91
93
  }
92
94
  };
95
+ /**
96
+ * Read the caller-selected capture. A missing, non-file or unreadable
97
+ * selection is a caller or host-permission failure, not an export failure.
98
+ */
99
+ const readCapture = async (path, signal) => {
100
+ try {
101
+ return ok(await readRegularFile(path, signal));
102
+ }
103
+ catch (cause) {
104
+ const code = cause instanceof Error && "code" in cause ? String(cause.code) : "";
105
+ if (code === "EACCES" || code === "EPERM")
106
+ return err(new AnalysisAccessDeniedError(OPERATION, path, code, { cause }));
107
+ if (cause instanceof NonRegularFileReadError ||
108
+ code === "ENOENT" ||
109
+ code === "ENOTDIR" ||
110
+ code === "EISDIR" ||
111
+ code === "ENXIO")
112
+ return err(new AnalysisInputError(OPERATION, { cause }, [
113
+ {
114
+ path: ["capture_path"],
115
+ reason: "invalid_value",
116
+ message: cause instanceof NonRegularFileReadError && code !== "EISDIR"
117
+ ? cause.message
118
+ : code === "EISDIR"
119
+ ? `Selected capture is a directory, not a file: ${path}`
120
+ : `Selected capture could not be read (${code}): ${path}`,
121
+ },
122
+ ]));
123
+ throw cause;
124
+ }
125
+ };
93
126
  const parseCapture = (bytes) => {
94
127
  try {
95
128
  const text = new TextDecoder("utf-8", {
@@ -1,6 +1,6 @@
1
1
  import { REA_WORKFLOW_PROVIDER, workflowAnalysisProfile, } from "./InvestigationProviders.js";
2
2
  import { analysisProfileSchema, committedProviderSchema, } from "../domain/analysisProfile.js";
3
- import { createEvidence } from "../domain/evidence.js";
3
+ import { createEvidence, } from "../domain/evidence.js";
4
4
  import { UnknownRegistryError } from "../domain/unknownRegistryError.js";
5
5
  /** Build the shared Evidence record for a successful composed binary workflow. */
6
6
  export const createWorkflowEvidence = (input) => createEvidence(input.target, REA_WORKFLOW_PROVIDER, {
@@ -14,10 +14,33 @@ export const createWorkflowEvidence = (input) => createEvidence(input.target, RE
14
14
  }),
15
15
  confidence: "derived",
16
16
  limitations: ["Derived by an REA composed workflow."],
17
+ ...(input.operation === "batch_decompile"
18
+ ? { locations: batchProcedureLocations(input.result) }
19
+ : {}),
17
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
+ };
18
41
  /** Convert workflow Evidence into its exact replay binding, when it has a profile. */
19
42
  export const workflowSnapshotRecord = (evidence, operation) => {
20
- if (!("analysis_profile" in evidence))
43
+ if (evidence.analysis_profile === null)
21
44
  return undefined;
22
45
  return {
23
46
  operation,