rea-agents 5.0.0 → 6.1.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 (507) hide show
  1. package/README.md +168 -655
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +173 -47
  4. package/bridge/hopper_bridge.py +310 -128
  5. package/bridge/mitmproxy/capture.py +208 -0
  6. package/bridge/native/rea_lldb_tracer.py +839 -0
  7. package/bridge/process/ProcessRunTokenReader.swift +297 -0
  8. package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
  9. package/bridge/pwndbg/core_context.py +101 -0
  10. package/bridge/pwndbg/launch.py +39 -0
  11. package/bridge/pwndbg/launch_impl.py +34 -0
  12. package/bridge/pwntools/decoder_runtime.py +59 -0
  13. package/bridge/pwntools/layout.py +39 -0
  14. package/bridge/pwntools/layout_impl.py +309 -0
  15. package/bridge/pwntools/recorded_crash.py +39 -0
  16. package/bridge/pwntools/recorded_crash_impl.py +147 -0
  17. package/dist/android/JadxConfiguration.js +196 -33
  18. package/dist/android/JadxMcpTransport.js +4 -0
  19. package/dist/android/JadxProtocol.js +6 -0
  20. package/dist/android/JadxProvider.js +20 -2
  21. package/dist/android/JadxSession.js +23 -4
  22. package/dist/application/AnalysisContextQueries.js +8 -35
  23. package/dist/application/AnalysisDocument.js +32 -0
  24. package/dist/application/AppBundleExecutable.js +67 -21
  25. package/dist/application/CallPathTracing.js +19 -3
  26. package/dist/application/CapabilityInventory.js +27 -3
  27. package/dist/application/ClientConfigurationDocument.js +871 -6
  28. package/dist/application/ClientRegistrationIdentity.js +26 -5
  29. package/dist/application/ClientRegistrationStatus.js +29 -14
  30. package/dist/application/DirectAnalysis.js +97 -33
  31. package/dist/application/Doctor.js +4 -2
  32. package/dist/application/DoctorScope.js +25 -13
  33. package/dist/application/EnhancedLiteralTracing.js +22 -25
  34. package/dist/application/EnhancedTools.js +13 -11
  35. package/dist/application/EvidenceBundleFiles.js +24 -12
  36. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  37. package/dist/application/InventoryProjectionEvidence.js +4 -3
  38. package/dist/application/InvestigationProviders.js +3 -2
  39. package/dist/application/JsonFiles.js +50 -28
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/ReconstructionCoverageService.js +7 -4
  42. package/dist/application/ReconstructionObligationCandidates.js +5 -1
  43. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  44. package/dist/application/Setup.js +13 -1
  45. package/dist/application/SetupClientConfiguration.js +10 -15
  46. package/dist/application/SetupHost.js +5 -2
  47. package/dist/application/SetupPlan.js +5 -3
  48. package/dist/application/SupportedClients.js +34 -1
  49. package/dist/application/Uninstall.js +4 -3
  50. package/dist/application/Update.js +18 -3
  51. package/dist/application/UpdateRuntime.js +46 -25
  52. package/dist/application/WebModuleTraceService.js +4 -2
  53. package/dist/application/WebNetworkCapturePort.js +1 -0
  54. package/dist/application/WebNetworkCaptureService.js +134 -0
  55. package/dist/application/WebRuntimeService.js +5 -3
  56. package/dist/application/WebScriptExportService.js +2 -2
  57. package/dist/application/WebSourceLocationService.js +4 -2
  58. package/dist/application/WindowsCapabilities.js +1 -1
  59. package/dist/application/WorkflowEvidence.js +82 -0
  60. package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
  61. package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
  62. package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
  63. package/dist/application/binary/BinarySession.js +131 -76
  64. package/dist/application/binary/BinarySessionOpen.js +19 -6
  65. package/dist/application/binary/BinarySessionRecords.js +45 -3
  66. package/dist/application/binary/BinarySessionStatus.js +17 -1
  67. package/dist/application/binary/CompositeProvider.js +13 -0
  68. package/dist/application/binary/LazyAnalysisProvider.js +3 -0
  69. package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
  70. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
  71. package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
  72. package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
  73. package/dist/application/evm/EvmInterfacePort.js +1 -0
  74. package/dist/application/evm/EvmInterfaceService.js +64 -0
  75. package/dist/application/investigation/EvidenceLedger.js +21 -7
  76. package/dist/application/investigation/InvestigationRecords.js +8 -0
  77. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  78. package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
  79. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  80. package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
  81. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  82. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
  83. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
  84. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
  85. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
  86. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  89. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
  90. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  91. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
  92. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
  93. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
  94. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
  95. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
  96. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
  97. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
  98. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
  99. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
  100. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
  101. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  102. package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
  103. package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
  104. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  105. package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
  106. package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
  107. package/dist/application/workflowInputError.js +18 -0
  108. package/dist/artifacts/ArtifactProvider.js +42 -5
  109. package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
  110. package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
  111. package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
  112. package/dist/artifacts/ZipArtifactReader.js +3 -0
  113. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
  114. package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
  115. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  116. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  117. package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
  118. package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
  119. package/dist/artifacts/apple/NibArchive.js +81 -14
  120. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  121. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  122. package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
  123. package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
  124. package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
  125. package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
  126. package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
  127. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
  128. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
  129. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  130. package/dist/artifacts/readStableArtifact.js +20 -4
  131. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  132. package/dist/browser/CdpCaptureEventHandlers.js +165 -12
  133. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  134. package/dist/browser/CdpCaptureEvents.js +34 -0
  135. package/dist/browser/CdpConnection.js +30 -11
  136. package/dist/browser/CdpOptionalCommand.js +2 -3
  137. package/dist/browser/CdpPageCapture.js +23 -1
  138. package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
  139. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  140. package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
  141. package/dist/browser/WebSourceMapFetcher.js +426 -72
  142. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  143. package/dist/browser/history/CaptureFailures.js +137 -0
  144. package/dist/browser/history/CaptureFormatError.js +10 -0
  145. package/dist/browser/history/CaptureRedaction.js +65 -0
  146. package/dist/browser/history/CaptureRelease.js +17 -0
  147. package/dist/browser/history/HarCapture.js +165 -0
  148. package/dist/browser/history/HarCaptureAdapter.js +20 -0
  149. package/dist/browser/history/HarCaptureProcess.js +57 -0
  150. package/dist/browser/history/HarJson.js +92 -0
  151. package/dist/browser/history/HarSchema.js +72 -0
  152. package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
  153. package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
  154. package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
  155. package/dist/cli/analysisSelector.js +23 -0
  156. package/dist/cli/applicationCommands.js +2 -3
  157. package/dist/cli/artifactCommands.js +26 -1
  158. package/dist/cli/binaryDiagnosticsCommands.js +39 -0
  159. package/dist/cli/coreAnalysisCommands.js +2 -2
  160. package/dist/cli/coreBinaryCommands.js +78 -20
  161. package/dist/cli/electronCommands.js +21 -13
  162. package/dist/cli/evmCommands.js +24 -0
  163. package/dist/cli/firmwareCommands.js +6 -3
  164. package/dist/cli/javascriptApplicationAnalysis.js +20 -3
  165. package/dist/cli/jsonOutput.js +38 -0
  166. package/dist/cli/nativeCallCommands.js +34 -0
  167. package/dist/cli/processCommands.js +1 -1
  168. package/dist/cli/streamedJsonOutput.js +56 -0
  169. package/dist/cli/utilityCommands.js +2 -0
  170. package/dist/cli/webNetworkCaptureCommands.js +40 -0
  171. package/dist/cli/webRuntimeCommands.js +8 -8
  172. package/dist/cli.js +11 -4
  173. package/dist/cliBrowserScenarioCommands.js +2 -2
  174. package/dist/cliCommandNames.js +6 -1
  175. package/dist/cliJsonInput.js +35 -1
  176. package/dist/cliOutput.js +21 -6
  177. package/dist/composition/binaryDiagnostics.js +8 -0
  178. package/dist/composition/evm.js +4 -0
  179. package/dist/composition/webNetworkCaptures.js +6 -0
  180. package/dist/config/environment.js +4 -0
  181. package/dist/config/ghidraStartupTimeout.js +17 -0
  182. package/dist/config/mcpResponseBudget.js +22 -0
  183. package/dist/config/parseConfig.js +2 -1
  184. package/dist/contracts/artifactToolContracts.js +6 -0
  185. package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
  186. package/dist/contracts/browserToolContracts.js +4 -3
  187. package/dist/contracts/enhancedInputs.js +5 -3
  188. package/dist/contracts/enhancedToolContracts.js +3 -3
  189. package/dist/contracts/errorSchemas.js +8 -1
  190. package/dist/contracts/evm/evmToolContracts.js +20 -0
  191. package/dist/contracts/hopperMemoryContracts.js +2 -5
  192. package/dist/contracts/investigationExamples.js +2 -2
  193. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  194. package/dist/contracts/managed/managedToolContracts.js +8 -6
  195. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
  196. package/dist/contracts/native/nativeToolContracts.js +21 -3
  197. package/dist/contracts/officialToolContracts.js +26 -24
  198. package/dist/contracts/process/processCaptureExample.js +2 -0
  199. package/dist/contracts/promptContracts.js +3 -3
  200. package/dist/contracts/sessionLifecycleInputs.js +18 -5
  201. package/dist/contracts/sessionStatusContract.js +8 -2
  202. package/dist/contracts/sessionToolContracts.js +8 -3
  203. package/dist/contracts/sessionToolSchemas.js +8 -4
  204. package/dist/contracts/toolContractExamples.js +1 -2
  205. package/dist/contracts/toolContractHelpers.js +4 -1
  206. package/dist/contracts/toolContracts.js +6 -0
  207. package/dist/contracts/toolEffects.js +30 -1
  208. package/dist/contracts/toolOutputSchemaGroups.js +33 -28
  209. package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
  210. package/dist/contracts/toolSchemaMetadata.js +69 -10
  211. package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
  212. package/dist/domain/analysisErrorBase.js +22 -2
  213. package/dist/domain/analysisErrorCore.js +61 -5
  214. package/dist/domain/analysisErrorPresentation.js +95 -12
  215. package/dist/domain/analysisErrorProjection.js +148 -19
  216. package/dist/domain/analysisSnapshot.js +166 -2
  217. package/dist/domain/android/androidAnalysis.js +2 -4
  218. package/dist/domain/android/androidApplication.js +17 -9
  219. package/dist/domain/apple/appleApplication.js +41 -14
  220. package/dist/domain/apple/dyldEnvironment.js +73 -0
  221. package/dist/domain/apple/dyldPaths.js +81 -0
  222. package/dist/domain/apple/dylibResolution.js +478 -0
  223. package/dist/domain/apple/dylibResolutionFindings.js +77 -0
  224. package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
  225. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  226. package/dist/domain/apple/keyedArchive.js +9 -1
  227. package/dist/domain/apple/machoContainer.js +54 -0
  228. package/dist/domain/apple/plistNumbers.js +76 -0
  229. package/dist/domain/artifactIdentity.js +29 -0
  230. package/dist/domain/artifactInventoryEvidence.js +19 -24
  231. package/dist/domain/artifactPathSyntax.js +1 -1
  232. package/dist/domain/bridgeCandidateProjection.js +71 -0
  233. package/dist/domain/browserCompleteness.js +1 -0
  234. package/dist/domain/browserObservation.js +1 -1
  235. package/dist/domain/browserObservationError.js +24 -5
  236. package/dist/domain/browserObservationSchemas.js +13 -0
  237. package/dist/domain/browserScenarioValues.js +5 -2
  238. package/dist/domain/bundleComparison.js +3 -2
  239. package/dist/domain/callPathSchemas.js +1 -1
  240. package/dist/domain/canonicalDigest.js +13 -1
  241. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  242. package/dist/domain/canonicalOrdering.js +9 -5
  243. package/dist/domain/changedBehavior.js +9 -9
  244. package/dist/domain/comparisonSourceEvidence.js +40 -0
  245. package/dist/domain/comparisonStatus.js +2 -30
  246. package/dist/domain/configurationErrors.js +1 -1
  247. package/dist/domain/conformanceTrustGate.js +0 -16
  248. package/dist/domain/evidence.js +78 -11
  249. package/dist/domain/evidenceBundle.js +42 -1
  250. package/dist/domain/evidenceErrors.js +12 -1
  251. package/dist/domain/evm/evmInterface.js +63 -0
  252. package/dist/domain/explicitSensitiveFailure.js +108 -0
  253. package/dist/domain/explicitSensitiveValues.js +10 -0
  254. package/dist/domain/firmware/firmwareAnalysis.js +10 -4
  255. package/dist/domain/hopperErrors.js +23 -2
  256. package/dist/domain/hopperValues.js +51 -8
  257. package/dist/domain/immutableJson.js +114 -0
  258. package/dist/domain/inputIssueProjection.js +3 -0
  259. package/dist/domain/javascript/electronActiveObservation.js +37 -6
  260. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  261. package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
  262. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  263. package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
  264. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  265. package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
  266. package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
  267. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  268. package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
  269. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  270. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  271. package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
  272. package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
  273. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  274. package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
  275. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  276. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  277. package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
  278. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  279. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  280. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  281. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
  282. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  283. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
  284. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  285. package/dist/domain/jsonSerialization.js +109 -0
  286. package/dist/domain/jsonValue.js +91 -3
  287. package/dist/domain/localPath.js +8 -0
  288. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  289. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  290. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  291. package/dist/domain/managed/managedNativeVerification.js +3 -9
  292. package/dist/domain/native/binaryLayout.js +357 -0
  293. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  294. package/dist/domain/native/nativeCallObservation.js +186 -0
  295. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  296. package/dist/domain/native/objcSwiftMetadata.js +0 -39
  297. package/dist/domain/native/recordedCrash.js +266 -0
  298. package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
  299. package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
  300. package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
  301. package/dist/domain/process/processCaptureParsing.js +54 -0
  302. package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
  303. package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
  304. package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
  305. package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
  306. package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
  307. package/dist/domain/propertyListKeys.js +1 -1
  308. package/dist/domain/propertyListXmlText.js +19 -0
  309. package/dist/domain/providerAdapterError.js +1 -1
  310. package/dist/domain/providerOperationHealth.js +54 -0
  311. package/dist/domain/providerSelectionError.js +4 -2
  312. package/dist/domain/reconstructionVerification.js +9 -46
  313. package/dist/domain/reconstructionVerificationSchemas.js +3 -3
  314. package/dist/domain/residualUnknown.js +3 -2
  315. package/dist/domain/staticRuntimeCorrelation.js +9 -46
  316. package/dist/domain/webBundleAnalysis.js +20 -8
  317. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  318. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  319. package/dist/domain/webCaptureDiff.js +1 -0
  320. package/dist/domain/webNetworkCapture.js +118 -0
  321. package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
  322. package/dist/domain/webRuntime.js +19 -5
  323. package/dist/domain/webSourceLocation.js +1 -0
  324. package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
  325. package/dist/dotnet/ManagedMemberInspector.js +4 -2
  326. package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
  327. package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
  328. package/dist/dotnet/ManagedMemberRows.js +14 -3
  329. package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
  330. package/dist/dotnet/ManagedMetadataInventory.js +38 -28
  331. package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
  332. package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
  333. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
  334. package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
  335. package/dist/dotnet/ManagedPeReader.js +11 -0
  336. package/dist/evm/EvmBytecodeCarrier.js +21 -0
  337. package/dist/evm/EvmWorkerLimits.js +40 -0
  338. package/dist/evm/EvmoleFailures.js +126 -0
  339. package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
  340. package/dist/evm/EvmoleInterfaceProvider.js +273 -0
  341. package/dist/evm/EvmoleInterfaceWorker.js +87 -0
  342. package/dist/evm/EvmoleRelease.js +16 -0
  343. package/dist/firmware/FirmwareCommand.js +1 -0
  344. package/dist/firmware/FirmwareFiles.js +1 -1
  345. package/dist/generatedPackageMetadata.js +2 -2
  346. package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
  347. package/dist/ghidra/GhidraClient.js +47 -14
  348. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  349. package/dist/ghidra/GhidraFunctionValues.js +10 -7
  350. package/dist/ghidra/GhidraInstallation.js +18 -21
  351. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  352. package/dist/ghidra/GhidraJavaLaunch.js +62 -0
  353. package/dist/ghidra/GhidraLauncher.js +34 -16
  354. package/dist/ghidra/GhidraProvider.js +2 -2
  355. package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
  356. package/dist/ghidra/GhidraProviderClient.js +23 -12
  357. package/dist/ghidra/GhidraSessionError.js +11 -7
  358. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  359. package/dist/ghidra/GhidraTransport.js +20 -0
  360. package/dist/hopper/BridgeLauncher.js +33 -11
  361. package/dist/hopper/HopperAnalysisProfile.js +62 -4
  362. package/dist/hopper/HopperCleanup.js +15 -3
  363. package/dist/hopper/HopperClient.js +222 -14
  364. package/dist/hopper/HopperFileOffset.js +237 -0
  365. package/dist/hopper/HopperMachOImage.js +196 -0
  366. package/dist/hopper/HopperOperationStage.js +6 -0
  367. package/dist/hopper/HopperProvider.js +63 -9
  368. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  369. package/dist/hopper/HopperRegexSearch.js +137 -0
  370. package/dist/hopper/HopperRegexWorker.js +27 -0
  371. package/dist/hopper/HopperRequestQueue.js +68 -19
  372. package/dist/hopper/HopperTargetLease.js +3 -2
  373. package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
  374. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  375. package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
  376. package/dist/inspector/V8InspectorProvider.js +47 -11
  377. package/dist/javascript/recovery/WakaruCommand.js +3 -0
  378. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  379. package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
  380. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  381. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  382. package/dist/mcpDoctor.js +62 -2
  383. package/dist/native/AppleDispatchCoverage.js +47 -6
  384. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  385. package/dist/native/AppleDispatchMetadata.js +6 -3
  386. package/dist/native/AppleMachoFixups.js +48 -24
  387. package/dist/native/AppleMachoSelection.js +32 -16
  388. package/dist/native/AppleObjcCategories.js +6 -2
  389. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  390. package/dist/native/AppleObjcProperties.js +2 -1
  391. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  392. package/dist/native/AppleSwiftVtables.js +21 -15
  393. package/dist/native/CommandRunner.js +82 -84
  394. package/dist/native/LldbCallTracer.js +541 -0
  395. package/dist/native/LldbRetainedObservations.js +178 -0
  396. package/dist/native/NativeCallObservation.js +194 -0
  397. package/dist/native/NativeMacOSProvider.js +117 -20
  398. package/dist/native/NativeMacOSProviderMetadata.js +8 -3
  399. package/dist/native/SignatureTargetBinding.js +155 -0
  400. package/dist/native/parsers/lipo.js +71 -1
  401. package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
  402. package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
  403. package/dist/native/pwntools/PwntoolsFailures.js +180 -0
  404. package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
  405. package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
  406. package/dist/native/pwntools/PwntoolsRelease.js +19 -0
  407. package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
  408. package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
  409. package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
  410. package/dist/process/DarwinProcessRunTokenReader.js +293 -0
  411. package/dist/process/ExecFileOutput.js +20 -0
  412. package/dist/process/OwnedCommand.js +118 -0
  413. package/dist/process/ProcessOwnership.js +431 -51
  414. package/dist/process/ProcessOwnershipObservation.js +209 -27
  415. package/dist/process/ProviderProcess.js +68 -10
  416. package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
  417. package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
  418. package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
  419. package/dist/{application → process/capture}/ProcessHarness.js +195 -29
  420. package/dist/{application → process/capture}/ProcessSampling.js +2 -2
  421. package/dist/server/EvidenceMcpServer.js +146 -0
  422. package/dist/server/createServer.js +37 -8
  423. package/dist/server/promptCompletion.js +10 -3
  424. package/dist/server/registerAndroidTools.js +2 -4
  425. package/dist/server/registerApplicationTools/helpers.js +2 -4
  426. package/dist/server/registerArtifactComparisonTool.js +11 -7
  427. package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
  428. package/dist/server/registerBrowserScenarioTool.js +2 -4
  429. package/dist/server/registerBrowserTools.js +2 -4
  430. package/dist/server/registerBundleComparisonTool.js +2 -3
  431. package/dist/server/registerCloseLifecycleTool.js +8 -18
  432. package/dist/server/registerElectronTools.js +2 -4
  433. package/dist/server/registerEnhancedTools.js +18 -59
  434. package/dist/server/registerEvidenceTools.js +3 -5
  435. package/dist/server/registerEvmTools.js +15 -0
  436. package/dist/server/registerFirmwareTools.js +2 -4
  437. package/dist/server/registerFunctionComparisonTool.js +10 -6
  438. package/dist/server/registerInvestigationTools.js +7 -7
  439. package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
  440. package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
  441. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
  442. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
  443. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
  444. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
  445. package/dist/server/registerOfficialTools.js +2 -4
  446. package/dist/server/registerProcessComparisonTool.js +72 -46
  447. package/dist/server/registerRecordedCrashTools.js +15 -0
  448. package/dist/server/registerSessionRecordTools.js +5 -6
  449. package/dist/server/registerSessionStatusTool.js +17 -3
  450. package/dist/server/registerSessionTools.js +13 -5
  451. package/dist/server/registerWebModuleTool.js +2 -4
  452. package/dist/server/registerWebNetworkCaptureTool.js +26 -0
  453. package/dist/server/registerWebRuntimeTools.js +3 -7
  454. package/dist/server/registerWebScriptTool.js +2 -4
  455. package/dist/server/registerWebSourceLocationTool.js +2 -4
  456. package/dist/server/runDerivedOperation.js +15 -3
  457. package/dist/server/sessionAvailabilityPolicy.js +3 -1
  458. package/dist/server/sessionToolPolicies.js +1 -1
  459. package/dist/server/toolRegistrationOptions.js +2 -2
  460. package/dist/server/toolResult.js +63 -11
  461. package/dist/server/toolResultEncoding.js +33 -0
  462. package/install.sh +1 -1
  463. package/native/windows/build/manifest.json +2 -2
  464. package/native/windows/build/rea-windows-x64.node +0 -0
  465. package/package.json +42 -9
  466. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  467. package/scripts/electron-active-hook.cjs +241 -37
  468. package/scripts/rea.mjs +11 -3
  469. package/skills/reverse-engineer-anything/SKILL.md +32 -4
  470. package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
  471. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
  472. package/third_party/README.md +60 -0
  473. package/third_party/evmole/LICENSE +21 -0
  474. package/third_party/evmole/README.md +22 -0
  475. package/third_party/pwndbg/LICENSE.md +21 -0
  476. package/third_party/pwndbg/README.md +23 -0
  477. package/third_party/pwntools/README.md +40 -0
  478. package/dist/application/AuthorizedArtifactInventory.js +0 -7
  479. package/dist/application/ProcessCaptureLifecycle.js +0 -299
  480. package/dist/application/StoreFileLock.js +0 -124
  481. package/dist/contracts/processCaptureExample.js +0 -2
  482. package/dist/domain/bytecodeProvider.js +0 -178
  483. package/dist/domain/customProtocolCapture.js +0 -137
  484. package/dist/domain/eventProcessTree.js +0 -225
  485. package/dist/domain/mobileApplicationInvestigation.js +0 -159
  486. package/dist/domain/packageAnalysis.js +0 -123
  487. package/dist/domain/peInspection.js +0 -197
  488. package/dist/domain/processCaptureParsing.js +0 -21
  489. package/dist/domain/protocolCapture.js +0 -217
  490. package/dist/domain/runtimeIdentification.js +0 -212
  491. package/dist/generatedMcpToolCatalog.js +0 -37
  492. package/dist/ghidra/GhidraDefaults.js +0 -2
  493. /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
  494. /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
  495. /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
  496. /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
  497. /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
  498. /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
  499. /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
  500. /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
  501. /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
  502. /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
  503. /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
  504. /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
  505. /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
  506. /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
  507. /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
@@ -0,0 +1,266 @@
1
+ import { z } from "zod";
2
+ import { recordedNoteCoverageIssues } from "./recordedCrashNoteCoverage.js";
3
+ const hex = z.string().regex(/^0x(?:0|[1-9a-f][0-9a-f]{0,15})$/);
4
+ const index = z.number().int().nonnegative();
5
+ const signed32 = z.number().int().min(-2147483648).max(2147483647);
6
+ const base64 = z
7
+ .string()
8
+ .regex(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?$/);
9
+ const range = z.strictObject({ offset: hex, bytes: hex });
10
+ const diagnostics = z.strictObject({
11
+ stdout: z.string(),
12
+ stderr: z.string(),
13
+ truncated: z.boolean(),
14
+ });
15
+ // Exact b"CORE\0"; a lossy display label cannot establish the Linux note ABI.
16
+ const LINUX_CORE_OWNER_BASE64 = "Q09SRQA=";
17
+ /** Complete register identities in the supported Linux amd64 PRSTATUS ABI order. */
18
+ export const RECORDED_LINUX_AMD64_REGISTERS = [
19
+ "r15",
20
+ "r14",
21
+ "r13",
22
+ "r12",
23
+ "rbp",
24
+ "rbx",
25
+ "r11",
26
+ "r10",
27
+ "r9",
28
+ "r8",
29
+ "rax",
30
+ "rcx",
31
+ "rdx",
32
+ "rsi",
33
+ "rdi",
34
+ "orig_rax",
35
+ "rip",
36
+ "cs",
37
+ "eflags",
38
+ "rsp",
39
+ "ss",
40
+ "fs_base",
41
+ "gs_base",
42
+ "ds",
43
+ "es",
44
+ "fs",
45
+ "gs",
46
+ ];
47
+ const supportedRegisters = new Set(RECORDED_LINUX_AMD64_REGISTERS);
48
+ /** Select an explicit recording and optionally request debugger-derived mapping context. */
49
+ export const inspectRecordedCrashInputSchema = z.strictObject({
50
+ path: z
51
+ .string()
52
+ .min(1)
53
+ .describe("Absolute filesystem path to a supplied Linux ELF core"),
54
+ include_debugger_context: z
55
+ .boolean()
56
+ .default(false)
57
+ .describe("Add core-only mapping candidates through caller-supplied GDB/pwndbg"),
58
+ });
59
+ /** Debugger map candidates preserve reported flags; zero does not establish absent permissions. */
60
+ export const recordedCrashDebuggerSchema = z.discriminatedUnion("status", [
61
+ z.strictObject({ status: z.literal("not-requested") }),
62
+ z.strictObject({
63
+ status: z.literal("available"),
64
+ gdb_version: z.string().min(1),
65
+ pwndbg_version: z.string().min(1),
66
+ connection: z.literal("core"),
67
+ executable: z.null(),
68
+ historical_pid: signed32,
69
+ reported_limits: z.strictObject({
70
+ address_space_bytes: index,
71
+ cpu_seconds: index,
72
+ file_size_bytes: index,
73
+ }),
74
+ maps: z.array(z.strictObject({
75
+ start: hex,
76
+ end: hex,
77
+ offset: hex,
78
+ reported_flags: index,
79
+ permissions: z
80
+ .strictObject({
81
+ read: z.boolean(),
82
+ write: z.boolean(),
83
+ execute: z.boolean(),
84
+ })
85
+ .nullable(),
86
+ pathname_display: z.string(),
87
+ current_file_identity: z.literal("unknown"),
88
+ })),
89
+ confidence: z.literal("derived"),
90
+ completeness: z.literal("unknown"),
91
+ diagnostics,
92
+ }),
93
+ ]);
94
+ /** Portable recorded observations; registers and source coordinates remain lossless. */
95
+ const recordedCrashObjectSchema = z.strictObject({
96
+ artifact: z.strictObject({
97
+ path: z.string().min(1),
98
+ sha256: z.string().regex(/^[a-f0-9]{64}$/),
99
+ bytes: index,
100
+ }),
101
+ format: z.literal("elf-core"),
102
+ architecture: z.literal("x86_64-little-endian"),
103
+ target_execution: z.literal("not-performed"),
104
+ live_process_identity: z.literal("unknown"),
105
+ segments: z.array(z.strictObject({
106
+ index,
107
+ type: z.union([z.string(), index]),
108
+ header_location: range,
109
+ offset: hex,
110
+ file_size: hex,
111
+ memory_size: hex,
112
+ virtual_address: hex,
113
+ physical_address: hex,
114
+ alignment: hex,
115
+ flags: hex,
116
+ file_backing: z.enum(["file", "none"]),
117
+ })),
118
+ notes: z.array(z.strictObject({
119
+ index,
120
+ segment_index: index,
121
+ type: z.union([z.string(), index]),
122
+ location: range,
123
+ owner_location: range,
124
+ owner_bytes_base64: base64,
125
+ owner_display: z.string().nullable(),
126
+ descriptor_location: range,
127
+ descriptor_bytes_base64: base64,
128
+ })),
129
+ note_padding: z.array(z.strictObject({
130
+ segment_index: index,
131
+ location: range,
132
+ bytes_base64: base64,
133
+ })),
134
+ threads: z.array(z.strictObject({
135
+ note_index: index,
136
+ historical_pid: signed32,
137
+ recorded_current_signal: z.number().int().min(-32768).max(32767),
138
+ registers: z.array(z.strictObject({
139
+ name: z.string().min(1),
140
+ value: hex,
141
+ location: range,
142
+ })),
143
+ })),
144
+ signals: z.array(z.strictObject({
145
+ note_index: index,
146
+ number: signed32,
147
+ code: signed32,
148
+ errno: signed32,
149
+ fault_address: hex.nullable(),
150
+ fault_address_meaning: z.enum(["recorded-sigsegv-address", "unknown"]),
151
+ thread_association: z.literal("unknown"),
152
+ })),
153
+ debugger: recordedCrashDebuggerSchema,
154
+ note_interpretation_completeness: z.literal("unknown"),
155
+ decoder_diagnostics: diagnostics,
156
+ diagnostics,
157
+ limitations: z.array(z.string()),
158
+ });
159
+ /** Provider payload excludes identity and diagnostics bound by the owned snapshot boundary. */
160
+ export const recordedCrashPayloadSchema = recordedCrashObjectSchema.omit({
161
+ artifact: true,
162
+ diagnostics: true,
163
+ debugger: true,
164
+ decoder_diagnostics: true,
165
+ });
166
+ /** Validate the next consumer's file ranges, note links and register representations. */
167
+ export const recordedCrashSchema = recordedCrashObjectSchema.superRefine((value, context) => {
168
+ const fail = (message) => context.addIssue({ code: "custom", message });
169
+ const within = (item, start = 0n, end = BigInt(value.artifact.bytes)) => {
170
+ const offset = BigInt(item.offset);
171
+ const bytes = BigInt(item.bytes);
172
+ return offset >= start && offset <= end && bytes <= end - offset;
173
+ };
174
+ for (const issue of recordedNoteCoverageIssues(value.segments, value.notes, value.note_padding))
175
+ fail(issue);
176
+ for (const [position, segment] of value.segments.entries()) {
177
+ if (position !== segment.index || !within(segment.header_location))
178
+ fail("Invalid original segment identity or header range.");
179
+ if (segment.file_backing === "file" &&
180
+ !within({ offset: segment.offset, bytes: segment.file_size }))
181
+ fail("Recorded segment exceeds artifact bytes.");
182
+ if (segment.type === "PT_LOAD" &&
183
+ BigInt(segment.file_size) > BigInt(segment.memory_size))
184
+ fail("Recorded PT_LOAD file size exceeds memory size.");
185
+ }
186
+ for (const [position, note] of value.notes.entries()) {
187
+ const segment = value.segments[note.segment_index];
188
+ if (position !== note.index || segment?.type !== "PT_NOTE") {
189
+ fail("Invalid original note identity or segment reference.");
190
+ continue;
191
+ }
192
+ const decodedLength = (raw) => BigInt((raw.length / 4) * 3 -
193
+ (raw.endsWith("==") ? 2 : raw.endsWith("=") ? 1 : 0));
194
+ if (decodedLength(note.owner_bytes_base64) !==
195
+ BigInt(note.owner_location.bytes) ||
196
+ decodedLength(note.descriptor_bytes_base64) !==
197
+ BigInt(note.descriptor_location.bytes))
198
+ fail("Raw note lengths differ from their source ranges.");
199
+ const start = BigInt(segment.offset);
200
+ const end = start + BigInt(segment.file_size);
201
+ if (!within(note.location, start, end) ||
202
+ !within(note.owner_location, BigInt(note.location.offset), BigInt(note.location.offset) + BigInt(note.location.bytes)) ||
203
+ !within(note.descriptor_location, BigInt(note.location.offset), BigInt(note.location.offset) + BigInt(note.location.bytes)))
204
+ fail("Note source ranges exceed their recorded segment.");
205
+ }
206
+ for (const padding of value.note_padding) {
207
+ const segment = value.segments[padding.segment_index];
208
+ if (segment?.type !== "PT_NOTE" ||
209
+ !within(padding.location, BigInt(segment.offset), BigInt(segment.offset) + BigInt(segment.file_size)))
210
+ fail("Invalid recorded note padding range.");
211
+ }
212
+ for (const [kind, rows] of [
213
+ ["NT_PRSTATUS", value.threads],
214
+ ["NT_SIGINFO", value.signals],
215
+ ]) {
216
+ const matchingNotes = value.notes.filter((note) => note.type === kind &&
217
+ note.owner_bytes_base64 === LINUX_CORE_OWNER_BASE64);
218
+ if (rows.length !== matchingNotes.length ||
219
+ new Set(rows.map(({ note_index }) => note_index)).size !== rows.length)
220
+ fail("Each supported raw note requires exactly one corresponding interpretation.");
221
+ }
222
+ for (const thread of value.threads) {
223
+ const note = value.notes[thread.note_index];
224
+ if (note?.type !== "NT_PRSTATUS" ||
225
+ note.owner_display !== "CORE" ||
226
+ note.owner_bytes_base64 !== LINUX_CORE_OWNER_BASE64) {
227
+ fail("Thread references a different note kind.");
228
+ continue;
229
+ }
230
+ if (thread.registers.length !== RECORDED_LINUX_AMD64_REGISTERS.length ||
231
+ !thread.registers.every(({ name }) => supportedRegisters.has(name)) ||
232
+ new Set(thread.registers.map(({ name }) => name)).size !==
233
+ thread.registers.length)
234
+ fail("Each recorded thread requires every supported register exactly once.");
235
+ for (const register of thread.registers)
236
+ if (BigInt(register.location.bytes) !== 8n ||
237
+ !within(register.location, BigInt(note.descriptor_location.offset), BigInt(note.descriptor_location.offset) +
238
+ BigInt(note.descriptor_location.bytes)))
239
+ fail("Register source exceeds its descriptor.");
240
+ }
241
+ for (const signal of value.signals) {
242
+ if (value.notes[signal.note_index]?.type !== "NT_SIGINFO" ||
243
+ value.notes[signal.note_index]?.owner_display !== "CORE" ||
244
+ value.notes[signal.note_index]?.owner_bytes_base64 !==
245
+ LINUX_CORE_OWNER_BASE64)
246
+ fail("Signal references a different note kind.");
247
+ const known = signal.number === 11 && (signal.code === 1 || signal.code === 2);
248
+ if (known !== (signal.fault_address !== null) ||
249
+ (signal.fault_address !== null) !==
250
+ (signal.fault_address_meaning === "recorded-sigsegv-address"))
251
+ fail("Signal union meaning does not match recorded SIGSEGV code.");
252
+ }
253
+ if (value.debugger.status === "available")
254
+ for (const map of value.debugger.maps) {
255
+ if (BigInt(map.end) < BigInt(map.start))
256
+ fail("Debugger mapping end precedes its start.");
257
+ if (map.permissions !== null &&
258
+ (map.permissions.read !== Boolean(map.reported_flags & 4) ||
259
+ map.permissions.write !== Boolean(map.reported_flags & 2) ||
260
+ map.permissions.execute !== Boolean(map.reported_flags & 1)))
261
+ fail("Mapping permissions differ from reported flags.");
262
+ if ((map.reported_flags === 0 || map.reported_flags > 7) !==
263
+ (map.permissions === null))
264
+ fail("Unreported or unfamiliar map flags require unknown permissions.");
265
+ }
266
+ });
@@ -0,0 +1,73 @@
1
+ const align = (size) => ((size + 3n) / 4n) * 4n;
2
+ const layoutMatches = (note) => {
3
+ const start = BigInt(note.location.offset);
4
+ const owner = BigInt(note.owner_location.bytes);
5
+ const descriptor = BigInt(note.descriptor_location.bytes);
6
+ return (BigInt(note.owner_location.offset) === start + 12n &&
7
+ BigInt(note.descriptor_location.offset) === start + 12n + align(owner) &&
8
+ BigInt(note.location.bytes) === 12n + align(owner) + align(descriptor));
9
+ };
10
+ const paddingMatches = (item, segment) => {
11
+ const bytes = BigInt(item.location.bytes);
12
+ const decodedLength = (item.bytes_base64.length / 4) * 3 -
13
+ (item.bytes_base64.endsWith("==")
14
+ ? 2
15
+ : item.bytes_base64.endsWith("=")
16
+ ? 1
17
+ : 0);
18
+ return (bytes > 0n &&
19
+ bytes < 12n &&
20
+ BigInt(decodedLength) === bytes &&
21
+ /^A*={0,2}$/.test(item.bytes_base64) &&
22
+ segment !== undefined &&
23
+ BigInt(item.location.offset) + bytes ===
24
+ BigInt(segment.offset) + BigInt(segment.file_size));
25
+ };
26
+ /** Require exact aligned note layouts and one complete, nonoverlapping physical coverage. */
27
+ export function recordedNoteCoverageIssues(segments, notes, padding) {
28
+ const issues = [];
29
+ const bySegment = new Map();
30
+ const all = [];
31
+ const add = (segment, range) => {
32
+ const ranges = bySegment.get(segment) ?? [];
33
+ ranges.push(range);
34
+ bySegment.set(segment, ranges);
35
+ all.push(range);
36
+ };
37
+ for (const note of notes) {
38
+ if (!layoutMatches(note))
39
+ issues.push("Recorded note layout differs from its aligned header/owner/descriptor ranges.");
40
+ add(note.segment_index, note.location);
41
+ }
42
+ for (const item of padding) {
43
+ if (!paddingMatches(item, segments[item.segment_index]))
44
+ issues.push("Recorded note padding must be a short zero-filled segment tail.");
45
+ add(item.segment_index, item.location);
46
+ }
47
+ const compare = (left, right) => BigInt(left.offset) < BigInt(right.offset)
48
+ ? -1
49
+ : BigInt(left.offset) > BigInt(right.offset)
50
+ ? 1
51
+ : 0;
52
+ let end = 0n;
53
+ for (const range of all.sort(compare)) {
54
+ const start = BigInt(range.offset);
55
+ if (start < end)
56
+ issues.push("Physical recorded note/padding ranges overlap or repeat.");
57
+ if (start + BigInt(range.bytes) > end)
58
+ end = start + BigInt(range.bytes);
59
+ }
60
+ for (const segment of segments) {
61
+ if (segment.type !== "PT_NOTE")
62
+ continue;
63
+ let cursor = BigInt(segment.offset);
64
+ for (const range of (bySegment.get(segment.index) ?? []).sort(compare)) {
65
+ if (BigInt(range.offset) !== cursor)
66
+ issues.push("Recorded note/padding ranges leave a gap or overlap in their segment.");
67
+ cursor = BigInt(range.offset) + BigInt(range.bytes);
68
+ }
69
+ if (cursor !== BigInt(segment.offset) + BigInt(segment.file_size))
70
+ issues.push("Recorded note/padding ranges do not completely cover their segment.");
71
+ }
72
+ return issues;
73
+ }
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { jsonValueSchema } from "./jsonValue.js";
2
+ import { jsonValueSchema } from "../jsonValue.js";
3
3
  import { normalizationSchema } from "./processScenario.js";
4
4
  import { collectProcessCaptureIssues } from "./processCaptureValidation.js";
5
5
  export * from "./processScenario.js";
@@ -61,6 +61,19 @@ const fileEffectSchema = z.discriminatedUnion("status", [
61
61
  }),
62
62
  ]);
63
63
  /** Exact serialized shape of a process capture. */
64
+ const processSettlementSchema = z.discriminatedUnion("state", [
65
+ z.object({
66
+ state: z.literal("quiesced"),
67
+ elapsed_ms: z.number().int().nonnegative(),
68
+ cleanup_outcome: z.enum(["not_required", "failed"]),
69
+ }),
70
+ z.object({
71
+ state: z.enum(["alive_at_deadline", "unverifiable"]),
72
+ elapsed_ms: z.number().int().nonnegative(),
73
+ cleanup_outcome: z.enum(["cleaned", "failed"]),
74
+ }),
75
+ ]);
76
+ const unverifiedCleanupProcessesSchema = z.array(z.strictObject({ pid: z.number().int().positive(), reason: z.string() }));
64
77
  const processCaptureShapeSchema = z.strictObject({
65
78
  manifest: z.strictObject({
66
79
  rea_version: z.string().min(1),
@@ -74,7 +87,22 @@ const processCaptureShapeSchema = z.strictObject({
74
87
  comparison_contract: z.record(z.string(), jsonValueSchema),
75
88
  full_scenario_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
76
89
  comparison_contract_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
77
- executable_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
90
+ selected_executable_sha256: z
91
+ .string()
92
+ .regex(/^[a-f0-9]{64}$/u)
93
+ .nullable(),
94
+ executable_sha256: z
95
+ .string()
96
+ .regex(/^[a-f0-9]{64}$/u)
97
+ .nullable(),
98
+ legacy_executable_sha256: z
99
+ .string()
100
+ .regex(/^[a-f0-9]{64}$/u)
101
+ .optional(),
102
+ executable_identity: z.strictObject({
103
+ state: z.enum(["path_metadata_unchanged", "unknown"]),
104
+ reason: z.string().nullable(),
105
+ }),
78
106
  normalization_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
79
107
  }),
80
108
  normalization: normalizationSchema,
@@ -162,11 +190,124 @@ const processCaptureShapeSchema = z.strictObject({
162
190
  cleanup: z.object({
163
191
  owned_process_group: z.literal("verified"),
164
192
  temporary_root: z.literal("removed"),
193
+ unverified_processes: unverifiedCleanupProcessesSchema.optional(),
165
194
  }),
166
195
  });
196
+ const processCleanupResourceSchema = z.strictObject({
197
+ state: z.enum(["cleaned", "failed", "unverified", "not_required"]),
198
+ reason: z.string().nullable(),
199
+ unverified_processes: unverifiedCleanupProcessesSchema.optional(),
200
+ });
201
+ const partialObservationFieldSchema = (value) => z.discriminatedUnion("state", [
202
+ z.strictObject({ state: z.literal("available"), value }),
203
+ z.strictObject({ state: z.literal("unavailable"), reason: z.string() }),
204
+ ]);
205
+ const incompleteProcessCaptureObservationsSchema = z.strictObject({
206
+ target_pid: partialObservationFieldSchema(z.number().int().positive()),
207
+ frames: partialObservationFieldSchema(processCaptureShapeSchema.shape.frames),
208
+ rendered_frames: partialObservationFieldSchema(processCaptureShapeSchema.shape.rendered_frames),
209
+ interaction_events: partialObservationFieldSchema(processCaptureShapeSchema.shape.interaction_events),
210
+ exit: partialObservationFieldSchema(z.strictObject({
211
+ code: z.number().int().nullable(),
212
+ signal: z.number().int().nullable(),
213
+ reason: z.enum(["exited", "timeout", "idle_timeout", "cancelled"]),
214
+ })),
215
+ settlement: partialObservationFieldSchema(z.strictObject({
216
+ state: z.enum(["quiesced", "alive_at_deadline", "unverifiable"]),
217
+ elapsed_ms: z.number().int().nonnegative(),
218
+ })),
219
+ process_samples: partialObservationFieldSchema(processCaptureShapeSchema.shape.process_samples),
220
+ filesystem_snapshots: z.strictObject({
221
+ before: partialObservationFieldSchema(z.strictObject({
222
+ files: z.array(fileStateSchema),
223
+ truncated: z.boolean(),
224
+ })),
225
+ after: partialObservationFieldSchema(z.strictObject({
226
+ files: z.array(fileStateSchema),
227
+ truncated: z.boolean(),
228
+ })),
229
+ }),
230
+ event_journal: partialObservationFieldSchema(processCaptureShapeSchema.shape.event_journal),
231
+ manifest: partialObservationFieldSchema(processCaptureShapeSchema.shape.manifest),
232
+ });
233
+ const partialCleanupReportSchema = z.strictObject({
234
+ owned_process_group: processCleanupResourceSchema,
235
+ terminal_renderer: processCleanupResourceSchema,
236
+ temporary_root: processCleanupResourceSchema,
237
+ });
238
+ const partialObservationMetadataSchema = z.strictObject({
239
+ cleanup: partialCleanupReportSchema,
240
+ execution_failure: z.string().nullable(),
241
+ });
242
+ const completedCaptureObservationSchema = z.strictObject({
243
+ capture: processCaptureShapeSchema
244
+ .omit({ cleanup: true })
245
+ .extend({ settlement: processSettlementSchema }),
246
+ });
247
+ const incompleteCaptureObservationSchema = z.strictObject({
248
+ observations: incompleteProcessCaptureObservationsSchema,
249
+ });
250
+ /** Validated, non-comparable process observations attached to execution or cleanup errors. */
251
+ export const partialProcessCaptureObservationSchema = z
252
+ .union([
253
+ completedCaptureObservationSchema.extend(partialObservationMetadataSchema.shape),
254
+ incompleteCaptureObservationSchema.extend(partialObservationMetadataSchema.shape),
255
+ ])
256
+ .superRefine((partial, context) => {
257
+ const cleanupIncomplete = Object.values(partial.cleanup).some(({ state }) => state === "failed" || state === "unverified");
258
+ if (!cleanupIncomplete && partial.execution_failure === null)
259
+ context.addIssue({
260
+ code: "custom",
261
+ path: ["execution_failure"],
262
+ message: "partial observations require incomplete cleanup or an execution failure",
263
+ });
264
+ if ("observations" in partial) {
265
+ const { observations } = partial;
266
+ if (![
267
+ observations.frames,
268
+ observations.interaction_events,
269
+ observations.process_samples,
270
+ observations.filesystem_snapshots.before,
271
+ observations.event_journal,
272
+ ].some(({ state }) => state === "available"))
273
+ context.addIssue({
274
+ code: "custom",
275
+ path: ["observations"],
276
+ message: "incomplete observations contain no collected evidence",
277
+ });
278
+ return;
279
+ }
280
+ const { capture } = partial;
281
+ const settlement = capture.settlement.state === "quiesced"
282
+ ? {
283
+ ...capture.settlement,
284
+ cleanup_outcome: "not_required",
285
+ }
286
+ : { ...capture.settlement, cleanup_outcome: "cleaned" };
287
+ const validationCapture = {
288
+ ...capture,
289
+ settlement,
290
+ cleanup: {
291
+ owned_process_group: "verified",
292
+ temporary_root: "removed",
293
+ },
294
+ };
295
+ for (const issue of collectProcessCaptureIssues(validationCapture))
296
+ context.addIssue({
297
+ code: "custom",
298
+ path: ["capture", ...issue.path.split(".")],
299
+ message: issue.message,
300
+ });
301
+ });
167
302
  /** Exact serialized shape plus all process-capture semantic invariants. */
168
303
  export const processCaptureSchema = processCaptureShapeSchema
169
304
  .superRefine((capture, context) => {
305
+ if (capture.settlement.cleanup_outcome === "failed")
306
+ context.addIssue({
307
+ code: "custom",
308
+ path: ["settlement", "cleanup_outcome"],
309
+ message: "verified captures cannot contain failed cleanup",
310
+ });
170
311
  for (const issue of collectProcessCaptureIssues(capture))
171
312
  context.addIssue({
172
313
  code: "custom",
@@ -22,7 +22,12 @@ export const EMPTY_PROCESS_CAPTURE_EXAMPLE = {
22
22
  comparison_contract: comparisonContract,
23
23
  full_scenario_sha256: digestProcessCommitment(scenario),
24
24
  comparison_contract_sha256: digestProcessCommitment(comparisonContract),
25
+ selected_executable_sha256: "0".repeat(64),
25
26
  executable_sha256: "0".repeat(64),
27
+ executable_identity: {
28
+ state: "path_metadata_unchanged",
29
+ reason: null,
30
+ },
26
31
  normalization_sha256: digestProcessCommitment(normalization),
27
32
  },
28
33
  normalization,
@@ -0,0 +1,54 @@
1
+ import { processCaptureSchema, } from "./processCapture.js";
2
+ import { z } from "zod";
3
+ const verifiedCaptures = new WeakSet();
4
+ const isVerifiedCapture = (capture) => verifiedCaptures.has(capture);
5
+ const attachProof = (capture) => {
6
+ verifiedCaptures.add(capture);
7
+ if (isVerifiedCapture(capture))
8
+ return capture;
9
+ throw new TypeError("Process Capture proof ownership failed");
10
+ };
11
+ const recordSchema = z.record(z.string(), z.unknown());
12
+ const LEGACY_EXECUTABLE_IDENTITY_REASON = "Legacy v3 capture did not distinguish selected and launch executable digests";
13
+ const migrateLegacyV3Capture = (input) => {
14
+ const capture = recordSchema.safeParse(input);
15
+ if (!capture.success)
16
+ return input;
17
+ const manifest = recordSchema.safeParse(capture.data.manifest);
18
+ if (!manifest.success)
19
+ return input;
20
+ if (manifest.data.provider_version !== "3" ||
21
+ "selected_executable_sha256" in manifest.data ||
22
+ "executable_identity" in manifest.data ||
23
+ "legacy_executable_sha256" in manifest.data)
24
+ return input;
25
+ const { executable_sha256 } = manifest.data;
26
+ if (typeof executable_sha256 !== "string" ||
27
+ !/^[a-f0-9]{64}$/u.test(executable_sha256))
28
+ return input;
29
+ return {
30
+ ...capture.data,
31
+ manifest: {
32
+ ...manifest.data,
33
+ selected_executable_sha256: null,
34
+ executable_sha256: null,
35
+ executable_identity: {
36
+ state: "unknown",
37
+ reason: LEGACY_EXECUTABLE_IDENTITY_REASON,
38
+ },
39
+ legacy_executable_sha256: executable_sha256,
40
+ },
41
+ };
42
+ };
43
+ /** Parse unknown input and reject invalid commitments or semantics. */
44
+ export const parseProcessCapture = (input) => {
45
+ const parsed = processCaptureSchema.safeParse(migrateLegacyV3Capture(input));
46
+ if (parsed.success)
47
+ return attachProof(parsed.data);
48
+ const issues = parsed.error.issues.flatMap((issue) => issue.code === "custom"
49
+ ? [{ path: issue.path.join("."), message: issue.message }]
50
+ : []);
51
+ if (issues.length > 0)
52
+ throw new TypeError(`Invalid process capture: ${issues.map(({ path, message }) => `${path}: ${message}`).join("; ")}`);
53
+ throw parsed.error;
54
+ };
@@ -5,8 +5,24 @@ const orderedTimestamps = (values) => values.every((value, index) => {
5
5
  });
6
6
  const validateCommitments = (capture, require) => {
7
7
  const { manifest } = capture;
8
- require(manifest.scenario.executable_sha256 ===
9
- manifest.executable_sha256, "manifest.executable_sha256", "executable commitment does not match the scenario projection");
8
+ if (manifest.legacy_executable_sha256 !== undefined) {
9
+ require(manifest.selected_executable_sha256 === null &&
10
+ manifest.executable_sha256 === null &&
11
+ manifest.executable_identity.state === "unknown" &&
12
+ manifest.executable_identity.reason !== null &&
13
+ manifest.scenario.executable_sha256 ===
14
+ manifest.legacy_executable_sha256, "manifest.legacy_executable_sha256", "legacy executable digest must remain distinct from unknown selected and launch digests");
15
+ }
16
+ else {
17
+ require(manifest.scenario.executable_sha256 ===
18
+ manifest.selected_executable_sha256, "manifest.selected_executable_sha256", "selected executable commitment does not match the scenario projection");
19
+ }
20
+ require(manifest.executable_identity.state === "path_metadata_unchanged"
21
+ ? manifest.executable_sha256 === manifest.selected_executable_sha256 &&
22
+ manifest.executable_identity.reason === null
23
+ : manifest.executable_sha256 === null &&
24
+ manifest.executable_identity.reason !==
25
+ null, "manifest.executable_identity", "launch identity and executable digest do not agree");
10
26
  for (const [field, value] of [
11
27
  ["full_scenario_sha256", manifest.scenario],
12
28
  ["comparison_contract_sha256", manifest.comparison_contract],
@@ -1,8 +1,10 @@
1
1
  import canonicalize from "canonicalize";
2
2
  import { z } from "zod";
3
- import { jsonValueSchema } from "./jsonValue.js";
3
+ import { AnalysisInputError } from "../analysisErrorCore.js";
4
+ import { jsonValueSchema } from "../jsonValue.js";
4
5
  import { compareProcessTraces, processTraceOutcomesDiffer, processTraceComparisonResultSchema, } from "./processTraceComparison.js";
5
6
  import { dimensionsForTraceSources, traceCoversObservedDimension, } from "./processTraceDimensionProjection.js";
7
+ const OPERATION = "compare_process_captures";
6
8
  /** Comparison classification that never equates incomplete evidence. */
7
9
  export const comparisonStatusSchema = z.enum([
8
10
  "unchanged",
@@ -152,15 +154,47 @@ const chooseFirstDivergence = (candidates) => {
152
154
  };
153
155
  const assertComparable = (left, right, options) => {
154
156
  if (left.manifest.comparison_contract_sha256 !==
155
- right.manifest.comparison_contract_sha256)
156
- throw new TypeError("Process captures have incompatible comparison contracts");
157
+ right.manifest.comparison_contract_sha256) {
158
+ const fields = differingContractFields(left.manifest.comparison_contract, right.manifest.comparison_contract);
159
+ throw new AnalysisInputError(OPERATION, undefined, [
160
+ {
161
+ path: ["right"],
162
+ reason: "invalid_value",
163
+ message: `Process captures have incompatible comparison contracts${fields.length === 0 ? "" : `; these scenario fields differ: ${fields.join(", ")}`}. Capture both scenarios with the same values for these fields, then compare them.`,
164
+ expected: fields,
165
+ },
166
+ ]);
167
+ }
157
168
  if (options.maxCaptureAgeMs === undefined)
158
169
  return;
159
170
  const maxCaptureAgeMs = options.maxCaptureAgeMs;
160
171
  const now = (options.now ?? Date.now)();
161
- if ([left, right].some(({ manifest }) => now - Date.parse(manifest.completed_at) > maxCaptureAgeMs))
162
- throw new TypeError("Process capture exceeds max_capture_age_ms");
172
+ const stale = [
173
+ ["left", left],
174
+ ["right", right],
175
+ ].flatMap(([side, { manifest }]) => {
176
+ const age = now - Date.parse(manifest.completed_at);
177
+ return age > maxCaptureAgeMs
178
+ ? [
179
+ `${side} completed at ${manifest.completed_at} (${String(age)} ms ago)`,
180
+ ]
181
+ : [];
182
+ });
183
+ if (stale.length > 0)
184
+ throw new AnalysisInputError(OPERATION, undefined, [
185
+ {
186
+ path: ["max_capture_age_ms"],
187
+ reason: "out_of_range",
188
+ message: `Process capture exceeds max_capture_age_ms ${String(maxCaptureAgeMs)}: ${stale.join("; ")}. Recapture the stale scenario or raise max_capture_age_ms.`,
189
+ },
190
+ ]);
163
191
  };
192
+ /** Name top-level contract fields whose canonical values differ. */
193
+ const differingContractFields = (left, right) => [...new Set([...Object.keys(left), ...Object.keys(right)])]
194
+ .filter((field) => !Object.hasOwn(left, field) ||
195
+ !Object.hasOwn(right, field) ||
196
+ canonicalize(left[field]) !== canonicalize(right[field]))
197
+ .sort();
164
198
  const truncatedComparison = () => ({
165
199
  status: "truncated",
166
200
  terminal: "truncated",