rea-agents 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/README.md +83 -108
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -8,15 +8,18 @@ export const ABORTED = Symbol("aborted");
8
8
  export const waitForAbortable = async (pending, signal) => {
9
9
  if (signal === undefined)
10
10
  return pending;
11
- if (signal.aborted)
12
- return ABORTED;
13
11
  let onAbort;
14
12
  const cancelled = new Promise((resolve) => {
13
+ if (signal.aborted) {
14
+ resolve(ABORTED);
15
+ return;
16
+ }
15
17
  onAbort = () => resolve(ABORTED);
16
18
  signal.addEventListener("abort", onAbort, { once: true });
17
19
  });
18
20
  try {
19
- return await Promise.race([pending, cancelled]);
21
+ // Even an already-cancelled wait must own the producer's eventual rejection.
22
+ return await Promise.race([cancelled, pending]);
20
23
  }
21
24
  finally {
22
25
  if (onAbort !== undefined)
@@ -69,10 +69,7 @@ export const inspectAddressContext = async (analysis, input, signal) => {
69
69
  comment,
70
70
  inline_comment: inlineComment,
71
71
  bookmarks: bookmarks.state === "available"
72
- ? {
73
- state: "available",
74
- value: matchingBookmarks(bookmarks.value, resolvedAddress(results[1], input.address)),
75
- }
72
+ ? matchingBookmarks(bookmarks.value, resolvedAddress(results[1], input.address))
76
73
  : bookmarks,
77
74
  });
78
75
  };
@@ -122,9 +119,24 @@ const resolvedAddress = (result, fallback) => {
122
119
  };
123
120
  const matchingBookmarks = (value, address) => {
124
121
  if (!Array.isArray(value))
125
- return [];
126
- return value.filter((bookmark) => typeof bookmark === "object" &&
127
- bookmark !== null &&
128
- !Array.isArray(bookmark) &&
129
- bookmark.address === address);
122
+ return {
123
+ state: "unavailable",
124
+ reason: "list_bookmarks returned malformed output; expected an array.",
125
+ remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
126
+ };
127
+ if (!value.every(isBookmark))
128
+ return {
129
+ state: "unavailable",
130
+ reason: "list_bookmarks returned malformed entries; expected address and name strings.",
131
+ remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
132
+ };
133
+ return {
134
+ state: "available",
135
+ value: value.filter((bookmark) => bookmark.address === address),
136
+ };
130
137
  };
138
+ const isBookmark = (value) => typeof value === "object" &&
139
+ value !== null &&
140
+ !Array.isArray(value) &&
141
+ typeof value.address === "string" &&
142
+ typeof value.name === "string";
@@ -76,7 +76,6 @@ export class AnalysisSnapshotCache {
76
76
  if (target === undefined || profile === undefined)
77
77
  return err(new NoBinaryOpenError());
78
78
  return ok({
79
- snapshot_version: 2,
80
79
  target: snapshotTarget(target),
81
80
  binding: snapshotBinding(profile),
82
81
  entries: this.entries(),
@@ -1,10 +1,10 @@
1
1
  import { parseAnalysisSnapshot, serializeAnalysisSnapshot, } from "../domain/analysisSnapshot.js";
2
2
  import { EvidenceFileError, EvidenceIntegrityError } from "../domain/errors.js";
3
3
  import { err, ok } from "../domain/result.js";
4
- import { readBoundedJson, writeBoundedText } from "./BoundedJsonFiles.js";
5
- /** Read and validate a bounded analysis snapshot inside an approved root. */
6
- export const readAnalysisSnapshot = async (path, policy) => {
7
- const loaded = await readBoundedJson(path, policy);
4
+ import { readJsonFile, writeTextFile } from "./JsonFiles.js";
5
+ /** Read and validate an analysis snapshot from the caller's path. */
6
+ export const readAnalysisSnapshot = async (path) => {
7
+ const loaded = await readJsonFile(path);
8
8
  if (!loaded.ok)
9
9
  return loaded;
10
10
  try {
@@ -14,8 +14,8 @@ export const readAnalysisSnapshot = async (path, policy) => {
14
14
  return err(new EvidenceIntegrityError(snapshotValidationMessage(cause), { cause }));
15
15
  }
16
16
  };
17
- /** Atomically write a deterministic analysis snapshot inside an approved root. */
18
- export const writeAnalysisSnapshot = async (snapshot, path, overwrite, policy) => {
17
+ /** Atomically write a deterministic analysis snapshot to the caller's path. */
18
+ export const writeAnalysisSnapshot = async (snapshot, path, overwrite) => {
19
19
  let encoded;
20
20
  try {
21
21
  encoded = serializeAnalysisSnapshot(snapshot);
@@ -23,7 +23,7 @@ export const writeAnalysisSnapshot = async (snapshot, path, overwrite, policy) =
23
23
  catch (cause) {
24
24
  return err(new EvidenceIntegrityError(snapshotValidationMessage(cause), { cause }));
25
25
  }
26
- return writeBoundedText(encoded, path, overwrite, policy);
26
+ return writeTextFile(encoded, path, overwrite);
27
27
  };
28
28
  const snapshotValidationMessage = (cause) => cause instanceof TypeError
29
29
  ? cause.message
@@ -9,7 +9,7 @@ export const projectAndroidApplicationEvidence = (rawInput) => {
9
9
  schema: androidApplicationProjectionInputSchema,
10
10
  project: projectAndroidApplication,
11
11
  operation: OPERATION,
12
- predicateType: "rea.android-application-graph/v1",
12
+ predicateType: "rea.android-application-graph",
13
13
  provider: ANDROID_APPLICATION_PROVIDER,
14
14
  subjectFormat: () => "apk",
15
15
  protocolError: "Android application projection produced an invalid result",
@@ -9,7 +9,7 @@ export const projectAppleApplicationEvidence = (rawInput) => {
9
9
  schema: appleApplicationProjectionInputSchema,
10
10
  project: projectAppleApplication,
11
11
  operation: OPERATION,
12
- predicateType: "rea.apple-application-graph/v1",
12
+ predicateType: "rea.apple-application-graph",
13
13
  provider: APPLE_APPLICATION_PROVIDER,
14
14
  subjectFormat: () => "ipa",
15
15
  protocolError: "Apple application projection produced an invalid result",
@@ -8,26 +8,35 @@ import { ZipArtifactReader } from "../artifacts/ZipArtifactReader.js";
8
8
  import { MachOSliceArtifactReader } from "../artifacts/MachOSliceArtifactReader.js";
9
9
  import { artifactExtractionResultSchema, } from "../domain/artifactGraph.js";
10
10
  import { scanArtifactInventory } from "./ArtifactInventory.js";
11
- import { digestCanonical, pageOf, toOutputLimits, } from "./ArtifactGraphConstruction.js";
12
- const PAGE_SIZE = 500;
13
- /** Extract selected inventory occurrences into an exclusively owned absent root. */
11
+ import { digestCanonical } from "./ArtifactGraphConstruction.js";
12
+ /** Extract every regular inventory occurrence into an exclusively owned absent root. */
14
13
  export const extractArtifact = async (input, signal) => {
15
- validateSelection(input.occurrenceIds);
16
14
  const sourcePath = await realpath(input.inputPath);
17
- const selectedIds = new Set(input.occurrenceIds);
18
- const inventory = await loadInventory(sourcePath, input.limits, selectedIds, signal);
19
- const selected = input.occurrenceIds.map((id) => {
20
- const occurrence = inventory.occurrences.get(id);
21
- if (occurrence === undefined)
22
- throw new ArtifactReaderFailure("unavailable", `Selected artifact occurrence was not found: ${id}`);
15
+ const snapshot = await scanArtifactInventory(sourcePath, {
16
+ signal,
17
+ });
18
+ const selectedOccurrences = snapshot.occurrences.filter((occurrence) => (occurrence.entry_kind === "file" || occurrence.entry_kind === "slice") &&
19
+ occurrence.logical_path !== ".");
20
+ const selectedIds = new Set(selectedOccurrences.map(({ occurrence_id: id }) => id));
21
+ const occurrences = new Map();
22
+ const neededNodes = new Set();
23
+ collectOccurrences(snapshot.occurrences, selectedIds, occurrences, neededNodes);
24
+ const nodes = new Map();
25
+ collectNodes(snapshot.nodes, neededNodes, nodes);
26
+ const inventory = {
27
+ manifest: snapshot.manifest,
28
+ occurrences,
29
+ nodes,
30
+ };
31
+ const selected = selectedOccurrences.map((occurrence) => {
23
32
  if ((occurrence.entry_kind !== "file" && occurrence.entry_kind !== "slice") ||
24
33
  occurrence.artifact_id === null ||
25
34
  occurrence.encrypted ||
26
35
  occurrence.logical_path === ".")
27
- throw new ArtifactReaderFailure("format", `Selected occurrence is not an extractable regular child file: ${id}`);
36
+ throw new ArtifactReaderFailure("format", `Selected occurrence is not an extractable regular child file: ${occurrence.occurrence_id}`);
28
37
  const node = inventory.nodes.get(occurrence.artifact_id);
29
38
  if (node === undefined)
30
- throw new ArtifactReaderFailure("integrity", `Selected occurrence has no inventory node: ${id}`);
39
+ throw new ArtifactReaderFailure("integrity", `Selected occurrence has no inventory node: ${occurrence.occurrence_id}`);
31
40
  return { occurrence, node };
32
41
  });
33
42
  return materializeSelection({
@@ -41,23 +50,22 @@ export const extractArtifact = async (input, signal) => {
41
50
  const materializeSelection = async ({ input, sourcePath, inventory, selected, signal, }) => {
42
51
  const byPath = new Map(selected.map((item) => [item.occurrence.logical_path, item]));
43
52
  const reader = await createReader(sourcePath, input.inputFormat);
44
- const output = await SafeOutputTree.create(input.outputRoot, input.limits);
53
+ const output = await SafeOutputTree.create(input.outputRoot);
45
54
  let readerClosed = false;
46
55
  const extracted = [];
47
56
  try {
48
- const found = new Set();
57
+ const materialized = [];
49
58
  const registry = new ArtifactPathRegistry();
50
- let entryCount = 0;
51
59
  for await (const entry of reader.entries(signal)) {
52
- entryCount += 1;
53
- if (entryCount > input.limits.maxEntries)
54
- throw new ArtifactReaderFailure("limit", "Artifact entry limit exceeded during extraction");
55
- const path = normalizeArtifactPath(entry.path, input.limits);
60
+ const path = normalizeArtifactPath(entry.path);
56
61
  registry.add(path, entry.kind);
57
62
  const selectedItem = byPath.get(path);
58
- if (selectedItem === undefined)
63
+ if (selectedItem === undefined) {
64
+ if (entry.kind === "file" || entry.kind === "slice")
65
+ throw new ArtifactReaderFailure("integrity", `Regular artifact entry is missing from inventory: ${path}`);
59
66
  continue;
60
- preflight(entry, input.limits);
67
+ }
68
+ preflight(entry);
61
69
  const stream = await reader.open(entry, signal);
62
70
  const written = await output.write(path, stream, selectedItem.node.sha256, signal);
63
71
  extracted.push({
@@ -67,14 +75,12 @@ const materializeSelection = async ({ input, sourcePath, inventory, selected, si
67
75
  bytes_written: written.bytesWritten,
68
76
  created: true,
69
77
  });
70
- found.add(path);
78
+ materialized.push(selectedItem);
71
79
  }
72
- if (found.size !== selected.length)
73
- throw new ArtifactReaderFailure("integrity", "Selected inventory occurrence disappeared before extraction");
74
80
  await reader.close();
75
81
  readerClosed = true;
76
82
  extracted.sort((left, right) => left.relative_path.localeCompare(right.relative_path, "en"));
77
- const result = createExtractionResult(input, inventory, selected, extracted);
83
+ const result = createExtractionResult(input, inventory, materialized, extracted);
78
84
  await output.commit();
79
85
  return result;
80
86
  }
@@ -87,7 +93,6 @@ const materializeSelection = async ({ input, sourcePath, inventory, selected, si
87
93
  };
88
94
  const createExtractionResult = (input, inventory, selected, extracted) => {
89
95
  const extractionSemantic = {
90
- schema_version: 1,
91
96
  source_manifest_id: inventory.manifest.manifest_id,
92
97
  selected_occurrence_ids: selected
93
98
  .map(({ occurrence }) => occurrence.occurrence_id)
@@ -101,26 +106,16 @@ const createExtractionResult = (input, inventory, selected, extracted) => {
101
106
  ...extractionSemantic,
102
107
  extraction_id: `aex_${digestCanonical(extractionSemantic)}`,
103
108
  },
104
- output_root: "$OUTPUT_ROOT",
105
- artifacts: pageOf(extracted, input.offset, input.limit),
109
+ output_root: input.outputRoot,
110
+ artifacts: extracted,
106
111
  containment_verified: true,
107
112
  cleanup: { attempted: false, verified: true, residual_paths: [] },
108
- limits: toOutputLimits(input.limits),
109
113
  provenance: [],
110
114
  limitations: [
111
- "Only caller-selected regular file occurrences were materialized.",
115
+ "All regular files in the active artifact were materialized; nested archive contents remain represented by their containing file.",
112
116
  ],
113
117
  });
114
118
  };
115
- const loadInventory = async (path, limits, selectedIds, signal) => {
116
- const snapshot = await scanArtifactInventory(path, limits, { signal });
117
- const occurrences = new Map();
118
- const neededNodes = new Set();
119
- collectOccurrences(snapshot.occurrences, selectedIds, occurrences, neededNodes);
120
- const nodes = new Map();
121
- collectNodes(snapshot.nodes, neededNodes, nodes);
122
- return { manifest: snapshot.manifest, occurrences, nodes };
123
- };
124
119
  const collectOccurrences = (items, selected, output, neededNodes) => {
125
120
  for (const item of items) {
126
121
  if (!selected.has(item.occurrence_id))
@@ -150,21 +145,7 @@ const createReader = async (path, format) => {
150
145
  return new MachOSliceArtifactReader(path);
151
146
  throw new ArtifactReaderFailure("unavailable", `Artifact format has no extraction reader: ${format}`);
152
147
  };
153
- const validateSelection = (ids) => {
154
- if (ids.length === 0 || ids.length > PAGE_SIZE)
155
- throw new ArtifactReaderFailure("limit", "Extraction requires 1 to 500 explicitly selected occurrences");
156
- if (new Set(ids).size !== ids.length)
157
- throw new ArtifactReaderFailure("path", "Extraction occurrence selection contains duplicates");
158
- };
159
- const preflight = (entry, limits) => {
148
+ const preflight = (entry) => {
160
149
  if ((entry.kind !== "file" && entry.kind !== "slice") || entry.encrypted)
161
150
  throw new ArtifactReaderFailure("format", `Selected artifact entry cannot be read: ${entry.path}`);
162
- if (entry.declaredSize !== null && entry.declaredSize > limits.maxEntryBytes)
163
- throw new ArtifactReaderFailure("limit", `Selected artifact exceeds byte limit: ${entry.path}`);
164
- if (entry.declaredSize !== null &&
165
- entry.compressedSize !== null &&
166
- (entry.compressedSize === 0
167
- ? entry.declaredSize > 0
168
- : entry.declaredSize / entry.compressedSize > limits.maxCompressionRatio))
169
- throw new ArtifactReaderFailure("limit", `Selected artifact exceeds compression ratio limit: ${entry.path}`);
170
151
  };
@@ -0,0 +1,17 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ /** Choose a fresh temporary destination for an artifact extraction. */
5
+ export const createArtifactExtractionDestination = () => join(tmpdir(), `rea-extracted-${randomUUID()}`);
6
+ /** Stable parent scope used to authorize REA-owned extraction destinations. */
7
+ export const artifactExtractionPermissionRoot = () => tmpdir();
8
+ /** Stable filesystem scope for the destination selected internally by REA. */
9
+ export const artifactExtractionPermissionRequest = () => ({
10
+ capability: "artifact_extract",
11
+ roots: [artifactExtractionPermissionRoot()],
12
+ executables: [],
13
+ environment_names: [],
14
+ network: "none",
15
+ mount: false,
16
+ operation_identity: "extract_artifact:temporary_output",
17
+ });
@@ -19,7 +19,7 @@ export const createOccurrence = (entry, path, parent) => ({
19
19
  compressed_size: entry.compressedSize,
20
20
  executable: entry.executable,
21
21
  encrypted: entry.encrypted,
22
- hash_status: entry.encrypted ? "unavailable" : "not-hashed-limit",
22
+ hash_status: entry.encrypted ? "unavailable" : "not-hashed",
23
23
  source_location: entry.byteOffset === null || entry.declaredSize === null
24
24
  ? null
25
25
  : { offset: entry.byteOffset, length: entry.declaredSize },
@@ -82,7 +82,7 @@ export const createRootNode = (input) => createArtifactNode({
82
82
  contentState: "materialized",
83
83
  });
84
84
  export const createArtifactNode = (input) => ({
85
- artifact_id: `art_${digestCanonical({ schema_version: 1, sha256: input.sha256 })}`,
85
+ artifact_id: `art_${digestCanonical({ sha256: input.sha256 })}`,
86
86
  kind: input.kind,
87
87
  format: input.format,
88
88
  sha256: input.sha256,
@@ -222,21 +222,6 @@ export const classifyArtifactContent = (path, prefix) => {
222
222
  };
223
223
  return byPath;
224
224
  };
225
- export const pageOf = (items, offset, limit) => ({
226
- items: items.slice(offset, offset + limit),
227
- offset,
228
- limit,
229
- total: items.length,
230
- next_offset: offset + limit < items.length ? offset + limit : null,
231
- });
232
- export const toOutputLimits = (limits) => ({
233
- max_entries: limits.maxEntries,
234
- max_total_bytes: limits.maxTotalBytes,
235
- max_entry_bytes: limits.maxEntryBytes,
236
- max_compression_ratio: limits.maxCompressionRatio,
237
- max_depth: limits.maxDepth,
238
- max_path_bytes: limits.maxPathBytes,
239
- });
240
225
  export const digestCanonical = (value) => {
241
226
  const encoded = canonicalize(value);
242
227
  if (encoded === undefined)
@@ -1,6 +1,6 @@
1
1
  import { open } from "node:fs/promises";
2
2
  import { classifyArtifactPath } from "../ArtifactGraphConstruction.js";
3
- import { zipPackageFormatForPath } from "../../domain/zipPackageFormat.js";
3
+ import { hasZipSignature, zipPackageFormatForPath, } from "../../domain/zipPackageFormat.js";
4
4
  const classifyContainerExtension = (path) => {
5
5
  const lower = path.toLowerCase();
6
6
  const zipPackage = zipPackageFormatForPath(lower);
@@ -21,11 +21,7 @@ export const classifyRoot = async (path, directory) => {
21
21
  try {
22
22
  const magic = Buffer.alloc(4);
23
23
  const observed = await handle.read(magic, 0, magic.length, 0);
24
- if (observed.bytesRead === 4 &&
25
- magic[0] === 0x50 &&
26
- magic[1] === 0x4b &&
27
- [0x03, 0x05, 0x07].includes(magic[2] ?? -1) &&
28
- [0x04, 0x06, 0x08].includes(magic[3] ?? -1))
24
+ if (hasZipSignature(magic.subarray(0, observed.bytesRead)))
29
25
  return "zip";
30
26
  if (observed.bytesRead === 4) {
31
27
  const header = magic.readUInt32BE(0);
@@ -1,25 +1,11 @@
1
1
  import { createHash } from "node:crypto";
2
- import { ArtifactReaderFailure, } from "../../artifacts/ArtifactReader.js";
2
+ import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
3
3
  import { streamChunkToBuffer } from "../../artifacts/StreamBytes.js";
4
4
  export const abortIfNeeded = (signal) => {
5
5
  if (signal?.aborted === true)
6
6
  throw new ArtifactReaderFailure("cancelled", "Artifact inventory cancelled");
7
7
  };
8
- export const preflightEntry = (entry, limits) => {
9
- if (entry.declaredSize !== null && entry.declaredSize > limits.maxEntryBytes)
10
- throw new ArtifactReaderFailure("limit", `Entry exceeds byte limit: ${entry.path}`);
11
- if (entry.declaredSize !== null &&
12
- entry.compressedSize !== null &&
13
- entry.compressedSize === 0 &&
14
- entry.declaredSize > 0)
15
- throw new ArtifactReaderFailure("limit", `Invalid compression ratio: ${entry.path}`);
16
- if (entry.declaredSize !== null &&
17
- entry.compressedSize !== null &&
18
- entry.compressedSize > 0 &&
19
- entry.declaredSize / entry.compressedSize > limits.maxCompressionRatio)
20
- throw new ArtifactReaderFailure("limit", `Compression ratio exceeds limit: ${entry.path}`);
21
- };
22
- export const hashReadable = async (stream, maximum, signal) => {
8
+ export const hashReadable = async (stream, signal) => {
23
9
  const hash = createHash("sha256");
24
10
  const prefixes = [];
25
11
  let prefixBytes = 0;
@@ -28,10 +14,6 @@ export const hashReadable = async (stream, maximum, signal) => {
28
14
  abortIfNeeded(signal);
29
15
  const chunk = streamChunkToBuffer(raw);
30
16
  bytes += chunk.length;
31
- if (bytes > maximum) {
32
- stream.destroy();
33
- throw new ArtifactReaderFailure("limit", "Observed entry bytes exceed limit");
34
- }
35
17
  hash.update(chunk);
36
18
  if (prefixBytes < 16) {
37
19
  const selected = chunk.subarray(0, 16 - prefixBytes);
@@ -0,0 +1,17 @@
1
+ import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
2
+ /** Resolve caller approval and operator policy before native reader selection. */
3
+ export const resolveNativeMountPolicy = (approved, enabled) => {
4
+ if (!approved)
5
+ return { status: "disabled" };
6
+ if (!enabled)
7
+ throw new ArtifactReaderFailure("unavailable", "Native DMG mounting is disabled by operator policy");
8
+ return { status: "approved" };
9
+ };
10
+ /** Resolve parsed caller intent and operator policy before artifact scanning. */
11
+ export const resolveArtifactIntegrityPolicy = (intent, enabled) => {
12
+ if (intent.mode === "fail")
13
+ return intent;
14
+ if (!enabled)
15
+ throw new ArtifactReaderFailure("policy", "Integrity continuation requires explicit approval and operator policy");
16
+ return intent;
17
+ };
@@ -1,5 +1,4 @@
1
1
  import { AsarArtifactReader } from "../../artifacts/AsarArtifactReader.js";
2
- import { ArtifactReaderFailure, } from "../../artifacts/ArtifactReader.js";
3
2
  import { DirectoryArtifactReader } from "../../artifacts/DirectoryArtifactReader.js";
4
3
  import { MachOSliceArtifactReader } from "../../artifacts/MachOSliceArtifactReader.js";
5
4
  import { NativeDmgArtifactReader } from "../../artifacts/NativeDmgArtifactReader.js";
@@ -21,10 +20,8 @@ export const createReader = async (path, format, nativeMount, signal) => {
21
20
  ? new MachOSliceArtifactReader(path)
22
21
  : undefined;
23
22
  case "dmg":
24
- if (!nativeMount.nativeMountApproved)
23
+ if (nativeMount.status === "disabled")
25
24
  return undefined;
26
- if (!nativeMount.nativeMountEnabled)
27
- throw new ArtifactReaderFailure("unavailable", "Native DMG mounting is disabled by operator policy");
28
25
  return NativeDmgArtifactReader.create(path, signal);
29
26
  default:
30
27
  return undefined;
@@ -2,32 +2,28 @@ import { createReadStream } from "node:fs";
2
2
  import { lstat } from "node:fs/promises";
3
3
  import { ArtifactReaderFailure, } from "../../artifacts/ArtifactReader.js";
4
4
  import { artifactInventoryResultSchema, } from "../../domain/artifactGraph.js";
5
- import { createArtifactEdges, createRootNode, digestCanonical, indexOccurrencesByPath, materializeDirectoryNodes, rekeyOccurrences, rootOccurrenceFor, toOutputLimits, } from "../ArtifactGraphConstruction.js";
5
+ import { createArtifactEdges, createRootNode, digestCanonical, indexOccurrencesByPath, materializeDirectoryNodes, rekeyOccurrences, rootOccurrenceFor, } from "../ArtifactGraphConstruction.js";
6
6
  import { classifyRoot } from "./classify.js";
7
7
  import { hashReadable } from "./hash.js";
8
8
  import { createReader, inventoryLimitations } from "./reader.js";
9
9
  import { scanReader, } from "./scanReader.js";
10
10
  import { NATIVE_MOUNT_DISABLED, STRICT_INTEGRITY_POLICY, } from "./types.js";
11
- export const scanCanonicalArtifactInventory = async (path, limits, options = {}) => {
11
+ export const scanCanonicalArtifactInventory = async (path, options = {}) => {
12
12
  const integrity = options.integrity ?? STRICT_INTEGRITY_POLICY;
13
- if (integrity.mode === "record-and-continue" &&
14
- (!integrity.approved || !integrity.enabled))
15
- throw new ArtifactReaderFailure("policy", "Integrity continuation requires explicit approval and operator policy");
16
13
  const metadata = await lstat(path);
17
14
  const rootFormat = await classifyRoot(path, metadata.isDirectory());
18
15
  const rootDigest = metadata.isDirectory()
19
16
  ? null
20
- : await hashReadable(createReadStream(path), limits.maxTotalBytes, options.signal);
17
+ : await hashReadable(createReadStream(path), options.signal);
21
18
  const reader = await createReader(path, rootFormat, options.nativeMount ?? NATIVE_MOUNT_DISABLED, options.signal);
22
19
  try {
23
- const { nodes, occurrences, pendingContradictions } = await scanReader(reader, limits, options.signal, integrity);
20
+ const { nodes, occurrences, pendingContradictions } = await scanReader(reader, options.signal, integrity);
24
21
  return await buildInventorySnapshot({
25
22
  path,
26
23
  metadata,
27
24
  rootFormat,
28
25
  rootDigest,
29
26
  reader,
30
- limits,
31
27
  signal: options.signal,
32
28
  nodes,
33
29
  occurrences,
@@ -39,7 +35,7 @@ export const scanCanonicalArtifactInventory = async (path, limits, options = {})
39
35
  }
40
36
  };
41
37
  const buildInventorySnapshot = async (input) => {
42
- const { path, metadata, rootFormat, rootDigest, reader, limits, signal } = input;
38
+ const { path, metadata, rootFormat, rootDigest, reader, signal } = input;
43
39
  materializeDirectoryNodes(input.occurrences, input.nodes);
44
40
  const rootNode = createRootNode({
45
41
  path,
@@ -65,7 +61,7 @@ const buildInventorySnapshot = async (input) => {
65
61
  const orderedNodes = sortNodes([...input.nodes.values()]);
66
62
  const orderedOccurrences = sortOccurrences(input.occurrences);
67
63
  const orderedEdges = sortEdges(edges);
68
- await verifyRootDigest(path, rootDigest, limits.maxTotalBytes, signal);
64
+ await verifyRootDigest(path, rootDigest, signal);
69
65
  const graphSha256 = digestCanonical({
70
66
  nodes: orderedNodes,
71
67
  occurrences: orderedOccurrences,
@@ -84,7 +80,6 @@ const buildInventorySnapshot = async (input) => {
84
80
  nodes: orderedNodes,
85
81
  occurrences: orderedOccurrences,
86
82
  edges: orderedEdges,
87
- limits: toOutputLimits(limits),
88
83
  provenance: reader?.provenance() ?? [],
89
84
  integrity_contradictions: integrityContradictions,
90
85
  limitations: buildLimitations(rootFormat, reader, integrityContradictions),
@@ -119,10 +114,10 @@ const buildIntegrityContradictions = (pending, occurrenceByPath, occurrenceById,
119
114
  ],
120
115
  };
121
116
  });
122
- const verifyRootDigest = async (path, rootDigest, maxTotalBytes, signal) => {
117
+ const verifyRootDigest = async (path, rootDigest, signal) => {
123
118
  if (rootDigest === null)
124
119
  return;
125
- const verified = await hashReadable(createReadStream(path), maxTotalBytes, signal);
120
+ const verified = await hashReadable(createReadStream(path), signal);
126
121
  if (verified.sha256 !== rootDigest.sha256 ||
127
122
  verified.bytes !== rootDigest.bytes)
128
123
  throw new ArtifactReaderFailure("integrity", "Root artifact changed during inventory");
@@ -131,9 +126,7 @@ const sortNodes = (nodes) => nodes.sort((left, right) => left.artifact_id.locale
131
126
  const sortOccurrences = (occurrences) => occurrences.sort((left, right) => left.logical_path.localeCompare(right.logical_path, "en"));
132
127
  const sortEdges = (edges) => edges.sort((left, right) => left.edge_id.localeCompare(right.edge_id));
133
128
  const buildManifest = ({ rootNode, graphSha256, orderedNodes, orderedOccurrences, orderedEdges, }) => artifactInventoryResultSchema.shape.manifest.parse({
134
- schema_version: 1,
135
129
  manifest_id: `agm_${digestCanonical({
136
- schema_version: 1,
137
130
  root_artifact_id: rootNode.artifact_id,
138
131
  graph_sha256: graphSha256,
139
132
  })}`,