rea-agents 3.1.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 (590) hide show
  1. package/README.md +72 -95
  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/AnalysisSnapshotCache.js +0 -1
  6. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  7. package/dist/application/AndroidApplicationService.js +1 -1
  8. package/dist/application/AppleApplicationService.js +1 -1
  9. package/dist/application/ArtifactExtraction.js +35 -54
  10. package/dist/application/ArtifactExtractionDestination.js +17 -0
  11. package/dist/application/ArtifactGraphConstruction.js +2 -17
  12. package/dist/application/ArtifactInventory/classify.js +2 -6
  13. package/dist/application/ArtifactInventory/hash.js +2 -20
  14. package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
  15. package/dist/application/ArtifactInventory/scanReader.js +69 -51
  16. package/dist/application/ArtifactInventory.js +6 -14
  17. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  18. package/dist/application/BinarySession.js +41 -13
  19. package/dist/application/BinarySessionComposition.js +0 -11
  20. package/dist/application/BinarySessionOpen.js +2 -1
  21. package/dist/application/BinarySessionRecords.js +5 -93
  22. package/dist/application/BinarySessionStatus.js +5 -16
  23. package/dist/application/BinaryTargetResolver.js +216 -0
  24. package/dist/application/BrowserEvidence.js +42 -58
  25. package/dist/application/BrowserObservationService.js +3 -6
  26. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  27. package/dist/application/BrowserScenarioEvidence.js +3 -3
  28. package/dist/application/CallPathTracing.js +2 -36
  29. package/dist/application/CapabilityInventory.js +10 -15
  30. package/dist/application/ClientConfigurationDocument.js +27 -0
  31. package/dist/application/ClientRegistrationStatus.js +16 -13
  32. package/dist/application/CommandShimReplay.js +14 -1
  33. package/dist/application/DirectAnalysis.js +22 -46
  34. package/dist/application/DirectAnalysisStatus.js +5 -61
  35. package/dist/application/Doctor.js +11 -32
  36. package/dist/application/DoctorDiagnostics.js +1 -2
  37. package/dist/application/DoctorScope.js +1 -1
  38. package/dist/application/ElectronActiveEvidence.js +3 -8
  39. package/dist/application/ElectronActiveObservationService.js +3 -6
  40. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  41. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  42. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  43. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  44. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  45. package/dist/application/ElectronEvidence.js +4 -7
  46. package/dist/application/ElectronObservationService.js +5 -9
  47. package/dist/application/EnhancedLiteralTracing.js +42 -65
  48. package/dist/application/EnhancedTools.js +76 -44
  49. package/dist/application/EvidenceBundleCommands.js +11 -11
  50. package/dist/application/EvidenceBundleFiles.js +9 -15
  51. package/dist/application/EvidenceLedger.js +6 -41
  52. package/dist/application/FilesystemSnapshot.js +2 -3
  53. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  54. package/dist/application/InventoryProjectionEvidence.js +4 -2
  55. package/dist/application/InvestigationProviders.js +1 -1
  56. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  57. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  58. package/dist/application/JavaScriptApplicationService.js +6 -29
  59. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  60. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  61. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  62. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  63. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  64. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  65. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  66. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  67. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  68. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  69. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  70. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  71. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  72. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  73. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  74. package/dist/application/JavaScriptJsonModules.js +2 -2
  75. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  76. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  77. package/dist/application/JavaScriptReplayService.js +6 -32
  78. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  79. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  80. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  81. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  82. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  83. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  84. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  85. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  86. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  87. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  88. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  89. package/dist/application/JsonFiles.js +79 -0
  90. package/dist/application/LinuxHopper.js +11 -9
  91. package/dist/application/LoopbackReplay.js +26 -23
  92. package/dist/application/LoopbackReplayRecorder.js +29 -1
  93. package/dist/application/ManagedApplicationGraphService.js +1 -2
  94. package/dist/application/ManagedMemberComparisonService.js +11 -41
  95. package/dist/application/ManagedNativeVerificationService.js +1 -2
  96. package/dist/application/ManagedReconstructionService.js +1 -1
  97. package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
  98. package/dist/application/NativeApiInspection.js +2 -7
  99. package/dist/application/NativeUiActionTrace.js +394 -0
  100. package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
  101. package/dist/application/PermissionAuthority.js +15 -7
  102. package/dist/application/PermissionFailure.js +5 -0
  103. package/dist/application/ProcessCaptureAuthority.js +5 -7
  104. package/dist/application/ProcessCaptureJournal.js +3 -2
  105. package/dist/application/ProcessCaptureLifecycle.js +5 -12
  106. package/dist/application/ProcessCheckpoints.js +29 -11
  107. package/dist/application/ProcessCli.js +6 -16
  108. package/dist/application/ProcessEvidence.js +5 -7
  109. package/dist/application/ProcessHarness.js +52 -17
  110. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  111. package/dist/application/ProcessReactiveEffects.js +9 -3
  112. package/dist/application/ProcessReactiveHarness.js +13 -7
  113. package/dist/application/ProcessSampling.js +2 -4
  114. package/dist/application/ProcessTimer.js +39 -0
  115. package/dist/application/ProjectPermissionStore.js +39 -96
  116. package/dist/application/RealHopperAssertions.js +20 -66
  117. package/dist/application/ReconstructionCoverageService.js +12 -58
  118. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  119. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  120. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  121. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  122. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  123. package/dist/application/ReferenceSourceImport.js +19 -45
  124. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  125. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  126. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  127. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  128. package/dist/application/SessionProviderRouter.js +2 -2
  129. package/dist/application/Setup.js +1 -3
  130. package/dist/application/SetupClientConfiguration.js +22 -93
  131. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  132. package/dist/application/StoreFileLock.js +119 -0
  133. package/dist/application/TerminalRenderer.js +2 -3
  134. package/dist/application/Uninstall.js +9 -14
  135. package/dist/application/UnknownEvidence.js +1 -1
  136. package/dist/artifacts/ArtifactPaths.js +2 -5
  137. package/dist/artifacts/ArtifactProvider.js +36 -58
  138. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  139. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  140. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  141. package/dist/artifacts/NibArchive.js +269 -0
  142. package/dist/artifacts/SafeOutputTree.js +15 -24
  143. package/dist/browser/BrowserProcessStartup.js +1 -2
  144. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  145. package/dist/browser/CdpBrowserProvider.js +3 -13
  146. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  147. package/dist/browser/CdpCaptureDocuments.js +28 -76
  148. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  149. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  150. package/dist/browser/CdpCaptureEvents.js +2 -8
  151. package/dist/browser/CdpCaptureStorage.js +9 -20
  152. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
  153. package/dist/browser/CdpCaptureValues.js +21 -21
  154. package/dist/browser/CdpConnection.js +10 -25
  155. package/dist/browser/CdpElectronInspection.js +26 -50
  156. package/dist/browser/CdpElectronProvider.js +10 -35
  157. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  158. package/dist/browser/CdpElectronScripts.js +6 -35
  159. package/dist/browser/CdpElectronWorkers.js +6 -10
  160. package/dist/browser/CdpEndpoint.js +25 -41
  161. package/dist/browser/CdpObservationSession.js +14 -26
  162. package/dist/browser/CdpPageCapture.js +34 -48
  163. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  164. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  165. package/dist/browser/CdpSafeMetadata.js +19 -22
  166. package/dist/browser/CdpScreenshot.js +3 -5
  167. package/dist/browser/CdpTargetSession.js +1 -2
  168. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  169. package/dist/browser/ElectronFileScope.js +8 -19
  170. package/dist/browser/JavaScriptRuntimeScope.js +9 -14
  171. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  172. package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
  174. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  175. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  176. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  177. package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
  178. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  179. package/dist/browser/PlaywrightScenarioSession.js +14 -30
  180. package/dist/browser/PngVisualDiff.js +22 -14
  181. package/dist/browser/SensitiveTextCapture.js +0 -17
  182. package/dist/browser/V8InspectorCaptureProjection.js +7 -8
  183. package/dist/browser/V8InspectorEndpoint.js +12 -14
  184. package/dist/browser/V8InspectorProvider.js +20 -61
  185. package/dist/browser/WebSourceMapFetcher.js +56 -176
  186. package/dist/catalogIdentity.js +0 -54
  187. package/dist/cli/artifactCommands.js +49 -77
  188. package/dist/cli/coreAnalysisCommands.js +83 -133
  189. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  190. package/dist/cli/managedCommands.js +5 -270
  191. package/dist/cli/setupCommands.js +3 -12
  192. package/dist/cli/utilityCommands.js +7 -41
  193. package/dist/cli.js +0 -2
  194. package/dist/cliApplicationCommands.js +42 -112
  195. package/dist/cliBrowserAdvancedCommands.js +10 -106
  196. package/dist/cliBrowserCommands.js +15 -127
  197. package/dist/cliBrowserContext.js +30 -0
  198. package/dist/cliCommandNames.js +4 -5
  199. package/dist/cliElectronCommands.js +8 -72
  200. package/dist/cliEvidenceCommands.js +8 -77
  201. package/dist/cliJavaScriptRuntimeCommands.js +9 -91
  202. package/dist/cliJsonInput.js +4 -14
  203. package/dist/cliObservationOptions.js +11 -96
  204. package/dist/cliPolicyCommands.js +2 -17
  205. package/dist/cliProcessCommands.js +3 -3
  206. package/dist/cliSetup.js +0 -13
  207. package/dist/config/browserScenario.js +2 -2
  208. package/dist/config/environment.js +0 -9
  209. package/dist/config/parseConfig.js +1 -33
  210. package/dist/config/parsers.js +6 -27
  211. package/dist/config/passiveObservation.js +7 -77
  212. package/dist/config/permissions.js +0 -7
  213. package/dist/contracts/analysisSearchContract.js +2 -5
  214. package/dist/contracts/applicationToolContracts.js +56 -109
  215. package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
  216. package/dist/contracts/artifactComparisonExample.js +58 -60
  217. package/dist/contracts/artifactToolContracts.js +20 -67
  218. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  219. package/dist/contracts/browserToolContracts.js +8 -73
  220. package/dist/contracts/electronToolContracts.js +8 -108
  221. package/dist/contracts/enhancedInputs.js +23 -54
  222. package/dist/contracts/errorSchemas.js +0 -1
  223. package/dist/contracts/functionComparisonExample.js +10 -24
  224. package/dist/contracts/functionInstructionContract.js +1 -3
  225. package/dist/contracts/functionWorkflowToolContracts.js +2 -2
  226. package/dist/contracts/hopperMemoryContracts.js +3 -3
  227. package/dist/contracts/investigationExamples.js +14 -11
  228. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  229. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  230. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  231. package/dist/contracts/managedToolContracts.js +6 -95
  232. package/dist/contracts/managedWorkflowExamples.js +77 -128
  233. package/dist/contracts/managedWorkflowToolContracts.js +51 -77
  234. package/dist/contracts/nativeToolContracts.js +7 -11
  235. package/dist/contracts/processCaptureExample.js +2 -69
  236. package/dist/contracts/promptContracts.js +49 -67
  237. package/dist/contracts/providerSelection.js +0 -1
  238. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  239. package/dist/contracts/sessionStatusContract.js +1 -17
  240. package/dist/contracts/sessionToolSchemas.js +6 -15
  241. package/dist/contracts/toolContractExamples.js +11 -11
  242. package/dist/contracts/toolContractHelpers.js +0 -4
  243. package/dist/contracts/toolContracts.js +60 -71
  244. package/dist/contracts/toolEffects.js +5 -13
  245. package/dist/contracts/toolOutputSchemaGroups.js +37 -91
  246. package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
  247. package/dist/contracts/toolSchemaMetadata.js +8 -19
  248. package/dist/contracts/unknownContractExamples.js +0 -2
  249. package/dist/domain/analysisErrorPresentation.js +46 -54
  250. package/dist/domain/analysisErrorProjection.js +28 -37
  251. package/dist/domain/analysisProfile.js +3 -31
  252. package/dist/domain/analysisSnapshot.js +3 -12
  253. package/dist/domain/androidApplication.js +15 -54
  254. package/dist/domain/appleApplication.js +24 -67
  255. package/dist/domain/artifactComparison.js +11 -29
  256. package/dist/domain/artifactGraph.js +14 -44
  257. package/dist/domain/artifactInspection.js +38 -69
  258. package/dist/domain/artifactInventoryEvidence.js +27 -21
  259. package/dist/domain/binaryTarget.js +2 -221
  260. package/dist/domain/browserCaptureComparison.js +47 -24
  261. package/dist/domain/browserObservation.js +28 -193
  262. package/dist/domain/browserObservationSchemas.js +5 -23
  263. package/dist/domain/browserScenario.js +11 -14
  264. package/dist/domain/browserScenarioCapture.js +11 -12
  265. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  266. package/dist/domain/browserScenarioDiff.js +2 -59
  267. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  268. package/dist/domain/browserScenarioDiffValues.js +21 -38
  269. package/dist/domain/browserScenarioValues.js +80 -109
  270. package/dist/domain/browserSession.js +4 -7
  271. package/dist/domain/bundleComparison.js +6 -32
  272. package/dist/domain/bytecodeProvider.js +20 -19
  273. package/dist/domain/callPath.js +47 -167
  274. package/dist/domain/callPathSchemas.js +79 -0
  275. package/dist/domain/changedBehavior.js +34 -60
  276. package/dist/domain/completionLedgerGeneration.js +8 -14
  277. package/dist/domain/conformancePackage.js +126 -97
  278. package/dist/domain/conformanceReplay.js +36 -8
  279. package/dist/domain/conformanceTrustGate.js +23 -14
  280. package/dist/domain/customProtocolCapture.js +1 -1
  281. package/dist/domain/electronActiveObservation.js +70 -103
  282. package/dist/domain/electronObservation.js +14 -80
  283. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  284. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  285. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  286. package/dist/domain/electronStaticAnalysisValues.js +10 -17
  287. package/dist/domain/errors.js +33 -54
  288. package/dist/domain/eventProcessTree.js +20 -12
  289. package/dist/domain/evidence.js +2 -10
  290. package/dist/domain/evidenceBundle.js +3 -5
  291. package/dist/domain/evidenceCompletionLedger.js +6 -8
  292. package/dist/domain/functionComparison.js +4 -14
  293. package/dist/domain/functionComparisonNormalization.js +4 -11
  294. package/dist/domain/functionComparisonResults.js +25 -15
  295. package/dist/domain/functionComparisonSchemas.js +49 -33
  296. package/dist/domain/functionDossierEvidence.js +31 -156
  297. package/dist/domain/hopperStartupFailure.js +1 -1
  298. package/dist/domain/hopperValues.js +15 -136
  299. package/dist/domain/interfaceBuilderGraph.js +654 -0
  300. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  301. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  302. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  303. package/dist/domain/javascriptApplicationGraph.js +3 -13
  304. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  305. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  306. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  307. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  308. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  309. package/dist/domain/javascriptAstFingerprint.js +25 -58
  310. package/dist/domain/javascriptAstValues.js +9 -0
  311. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  312. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  313. package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
  314. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  315. package/dist/domain/javascriptFeatureSeed.js +20 -12
  316. package/dist/domain/javascriptFeatureTrace.js +13 -67
  317. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  318. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  319. package/dist/domain/javascriptNativeHandoff.js +1 -1
  320. package/dist/domain/javascriptReplay.js +24 -41
  321. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  322. package/dist/domain/javascriptRuntimeObservation.js +42 -103
  323. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  324. package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
  325. package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
  326. package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
  327. package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
  328. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
  329. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  330. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
  331. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  332. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  333. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  334. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  335. package/dist/domain/javascriptSemanticCalls.js +5 -32
  336. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  337. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  338. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  339. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  340. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  341. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  342. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  343. package/dist/domain/javascriptSemanticIr.js +1 -29
  344. package/dist/domain/javascriptSemanticObjects.js +1 -5
  345. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  346. package/dist/domain/javascriptSemanticProjection.js +0 -18
  347. package/dist/domain/javascriptSemanticPromises.js +9 -16
  348. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  349. package/dist/domain/javascriptSemanticQuery.js +17 -139
  350. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  351. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  352. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  353. package/dist/domain/javascriptSemanticResources.js +1 -6
  354. package/dist/domain/javascriptSemanticReturns.js +10 -27
  355. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  356. package/dist/domain/javascriptSemanticValues.js +44 -62
  357. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  358. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  359. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  360. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  361. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  362. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  363. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  364. package/dist/domain/jsonShape.js +7 -33
  365. package/dist/domain/localPath.js +7 -0
  366. package/dist/domain/managedApplicationGraph.js +9 -41
  367. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  368. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  369. package/dist/domain/managedArtifact.js +14 -27
  370. package/dist/domain/managedMemberComparison.js +90 -92
  371. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  372. package/dist/domain/managedMemberComparisonItems.js +221 -0
  373. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  374. package/dist/domain/managedNativeVerification.js +3 -6
  375. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  376. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  377. package/dist/domain/managedReconstruction.js +19 -23
  378. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  379. package/dist/domain/nativeApiBoundary.js +2 -7
  380. package/dist/domain/nativeInspection.js +0 -2
  381. package/dist/domain/nativeInvestigationGraph.js +351 -0
  382. package/dist/domain/nativeValueFlow.js +61 -0
  383. package/dist/domain/nodeRuntimeCharacterization.js +1 -5
  384. package/dist/domain/objcSwiftMetadata.js +254 -0
  385. package/dist/domain/peInspection.js +1 -1
  386. package/dist/domain/permissionPolicy.js +13 -0
  387. package/dist/domain/processCapture.js +76 -113
  388. package/dist/domain/processCaptureExample.js +68 -0
  389. package/dist/domain/processCaptureParsing.js +21 -0
  390. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  391. package/dist/domain/processCaptureValidation.js +1 -7
  392. package/dist/domain/processComparison.js +3 -12
  393. package/dist/domain/processReactiveMatching.js +29 -50
  394. package/dist/domain/processReactiveRuntime.js +4 -8
  395. package/dist/domain/processReactiveScenario.js +28 -94
  396. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  397. package/dist/domain/processReactiveTransition.js +33 -18
  398. package/dist/domain/processScenario.js +56 -90
  399. package/dist/domain/processTraceComparison.js +0 -8
  400. package/dist/domain/processTraceEvaluation.js +14 -4
  401. package/dist/domain/processTraceSpecification.js +11 -17
  402. package/dist/domain/protocolCapture.js +3 -3
  403. package/dist/domain/reconstructionCoverage.js +62 -129
  404. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  405. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  406. package/dist/domain/reconstructionReadiness.js +1 -2
  407. package/dist/domain/reconstructionReadinessSchemas.js +36 -38
  408. package/dist/domain/reconstructionUnknowns.js +3 -3
  409. package/dist/domain/reconstructionVerification.js +13 -47
  410. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  411. package/dist/domain/referenceSourceGraph.js +53 -61
  412. package/dist/domain/referenceSourceImportParsing.js +1 -5
  413. package/dist/domain/replayMachine.js +19 -31
  414. package/dist/domain/replayMachineRun.js +15 -63
  415. package/dist/domain/replayMachineRuntime.js +41 -41
  416. package/dist/domain/replayMachineValues.js +84 -0
  417. package/dist/domain/residualUnknown.js +25 -30
  418. package/dist/domain/runtimeCharacterization.js +15 -16
  419. package/dist/domain/runtimeIdentification.js +48 -47
  420. package/dist/domain/sourceToBundleComparison.js +9 -85
  421. package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
  422. package/dist/domain/sourceToBundleSignals.js +4 -15
  423. package/dist/domain/staticRuntimeCorrelation.js +37 -49
  424. package/dist/domain/symbolAnalysis.js +10 -19
  425. package/dist/domain/unicodeCodePointOrder.js +12 -0
  426. package/dist/domain/webBundleAnalysis.js +70 -99
  427. package/dist/domain/webBundleAnalyzer.js +2 -4
  428. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  429. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  430. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  431. package/dist/domain/webCaptureDiff.js +33 -73
  432. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  433. package/dist/domain/webContentArtifact.js +1 -10
  434. package/dist/domain/webMcpDiscovery.js +3 -14
  435. package/dist/domain/webScreenshot.js +58 -34
  436. package/dist/domain/zipPackageFormat.js +7 -0
  437. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  438. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  439. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  440. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  441. package/dist/dotnet/ManagedMemberRows.js +16 -16
  442. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  443. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  444. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  445. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  446. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  447. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  448. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
  449. package/dist/dotnet/ManagedPeReader.js +2 -2
  450. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  451. package/dist/generatedMcpToolCatalog.js +1 -1
  452. package/dist/generatedPackageMetadata.js +1 -1
  453. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  454. package/dist/ghidra/GhidraClient.js +4 -12
  455. package/dist/ghidra/GhidraClientWire.js +9 -5
  456. package/dist/ghidra/GhidraDefaults.js +0 -18
  457. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  458. package/dist/ghidra/GhidraDoctor.js +16 -12
  459. package/dist/ghidra/GhidraFunctionValues.js +65 -108
  460. package/dist/ghidra/GhidraInstallation.js +98 -42
  461. package/dist/ghidra/GhidraInventoryValues.js +16 -85
  462. package/dist/ghidra/GhidraLauncher.js +0 -8
  463. package/dist/ghidra/GhidraProvider.js +15 -22
  464. package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
  465. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  466. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  467. package/dist/ghidra/GhidraSessionValues.js +0 -2
  468. package/dist/ghidra/GhidraTransport.js +4 -7
  469. package/dist/ghidra/protocol.js +2 -2
  470. package/dist/hopper/BridgeLauncher.js +112 -36
  471. package/dist/hopper/HopperAnalysisProfile.js +1 -1
  472. package/dist/hopper/HopperCleanup.js +6 -3
  473. package/dist/hopper/HopperClient.js +4 -7
  474. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  475. package/dist/hopper/HopperProvider.js +0 -16
  476. package/dist/hopper/HopperRequestQueue.js +21 -40
  477. package/dist/hopper/HopperResponseStream.js +1 -9
  478. package/dist/hopper/HopperSessionValues.js +3 -2
  479. package/dist/hopper/HopperTargetLease.js +119 -0
  480. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  481. package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
  482. package/dist/hopper/protocol.js +6 -4
  483. package/dist/main/reload.js +0 -3
  484. package/dist/main/shutdown.js +1 -1
  485. package/dist/main/state.js +0 -9
  486. package/dist/main/transport.js +0 -5
  487. package/dist/mcpDoctor.js +25 -45
  488. package/dist/native/CommandRunner.js +18 -25
  489. package/dist/native/NativeMacOSProvider.js +13 -38
  490. package/dist/native/NativeMachoInspection.js +1 -1
  491. package/dist/process/BoundedFileBytes.js +17 -0
  492. package/dist/process/ExecFileOutput.js +11 -0
  493. package/dist/process/PendingOperations.js +8 -6
  494. package/dist/process/ProcessOwnership.js +3 -2
  495. package/dist/process/ProcessOwnershipObservation.js +0 -1
  496. package/dist/process/ProviderProcess.js +7 -28
  497. package/dist/reference/ReferenceSourceReader.js +8 -24
  498. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  499. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  500. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  501. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  502. package/dist/replay/JavaScriptReplayWorker.js +3 -5
  503. package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
  504. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  505. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  506. package/dist/replay/ReplayOutcome.js +1 -3
  507. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  508. package/dist/replay/ReplaySeccompFile.js +29 -0
  509. package/dist/replay/ReplayWorkerProtocol.js +0 -2
  510. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  511. package/dist/server/ProcessCaptureElicitation.js +4 -8
  512. package/dist/server/createServer.js +6 -44
  513. package/dist/server/promptCompletion.js +37 -61
  514. package/dist/server/recordDerivedEvidence.js +1 -1
  515. package/dist/server/registerApplicationTools/characterization.js +4 -8
  516. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
  517. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
  518. package/dist/server/registerApplicationTools/compareVersions.js +5 -10
  519. package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
  520. package/dist/server/registerApplicationTools/coverage.js +6 -71
  521. package/dist/server/registerApplicationTools/helpers.js +1 -13
  522. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  523. package/dist/server/registerApplicationTools/traceFeature.js +5 -9
  524. package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
  525. package/dist/server/registerApplicationTools.js +0 -2
  526. package/dist/server/registerArtifactComparisonTool.js +23 -27
  527. package/dist/server/registerBrowserScenarioTool.js +4 -4
  528. package/dist/server/registerBrowserTools.js +5 -8
  529. package/dist/server/registerBundleComparisonTool.js +5 -7
  530. package/dist/server/registerCloseLifecycleTool.js +2 -16
  531. package/dist/server/registerElectronTools.js +10 -29
  532. package/dist/server/registerEnhancedTools.js +10 -11
  533. package/dist/server/registerEvidenceTools.js +15 -22
  534. package/dist/server/registerFunctionComparisonTool.js +30 -25
  535. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  536. package/dist/server/registerInvestigationTools.js +20 -116
  537. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
  538. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
  539. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  540. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  541. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  542. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
  543. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
  544. package/dist/server/registerOfficialTools.js +1 -43
  545. package/dist/server/registerProcessComparisonTool.js +33 -23
  546. package/dist/server/registerPrompts.js +19 -17
  547. package/dist/server/registerSessionRecordTools.js +10 -156
  548. package/dist/server/registerSessionStatusTool.js +6 -69
  549. package/dist/server/registerSessionTools.js +10 -51
  550. package/dist/server/sessionAvailabilityPolicy.js +0 -2
  551. package/dist/server/sessionEvidence.js +9 -15
  552. package/dist/server/sessionToolPolicies.js +0 -8
  553. package/dist/server/toolResult.js +14 -50
  554. package/dist/serverIdentity.js +0 -20
  555. package/install.sh +1 -1
  556. package/package.json +11 -7
  557. package/scripts/electron-active-hook.cjs +23 -55
  558. package/scripts/hopper-demo-x11.py +13 -32
  559. package/skills/reverse-engineer-anything/SKILL.md +47 -12
  560. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  561. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  562. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  563. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
  564. package/dist/application/BoundedJsonFiles.js +0 -86
  565. package/dist/application/CrossVersionInventory.js +0 -129
  566. package/dist/application/CrossVersionInvestigation.js +0 -301
  567. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  568. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  569. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  570. package/dist/application/DeferredFileAuthorization.js +0 -61
  571. package/dist/application/DoctorProjection.js +0 -43
  572. package/dist/application/EnhancedToolPagination.js +0 -22
  573. package/dist/application/EvidenceReferenceResolver.js +0 -26
  574. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  575. package/dist/application/ProcessPairedExperiment.js +0 -72
  576. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  577. package/dist/application/ReconstructionReadinessService.js +0 -48
  578. package/dist/cliInvestigationCommands.js +0 -173
  579. package/dist/domain/boundedCartesianProjection.js +0 -15
  580. package/dist/domain/investigationWorkspace.js +0 -347
  581. package/dist/domain/jsonLimits.js +0 -26
  582. package/dist/domain/knownPageCoverage.js +0 -29
  583. package/dist/domain/processPairedExperiment.js +0 -128
  584. package/dist/server/javascriptApplicationResult.js +0 -106
  585. package/dist/server/permissionFailure.js +0 -12
  586. package/dist/server/registerApplicationTools/readiness.js +0 -50
  587. package/dist/server/registerEvidenceResources.js +0 -315
  588. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  589. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  590. package/dist/server/registerReconstructionReadinessResource.js +0 -32
@@ -1,168 +1,68 @@
1
1
  import { DirectedGraph } from "graphology";
2
2
  import { bidirectional } from "graphology-shortest-path/unweighted.js";
3
- import { z } from "zod";
4
- import { evidenceSchema } from "./evidence.js";
3
+ import { callPathInputSchema, callPathResultSchema, parseCallPathAddress, } from "./callPathSchemas.js";
5
4
  import { parseFunctionEvidence, } from "./functionDossierEvidence.js";
6
- const addressSchema = z.string().regex(/^0x(?:0|[1-9a-f][0-9a-f]*)$/u);
7
- const inputAddressSchema = z
8
- .string()
9
- .regex(/^0[xX][0-9a-fA-F]+$/u)
10
- .transform((address) => `0x${BigInt(address).toString(16)}`);
11
- const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
12
- const evidenceGroupSchema = z.union([
13
- evidenceSchema,
14
- z.array(evidenceSchema).min(1).max(100),
15
- ]);
16
- const MAX_EVIDENCE_PAGES = 2_000;
17
- const MAX_GRAPH_EDGES = 10_000;
18
- const MAX_PATH_EXPANSIONS = 100_000;
19
- /** Strict, bounded input for explicit call-path reconstruction. */
20
- export const callPathInputSchema = z
21
- .object({
22
- functions: z.array(evidenceGroupSchema).min(1).max(500),
23
- start: z.object({ address: inputAddressSchema }).strict(),
24
- goal: z.object({ address: inputAddressSchema }).strict(),
25
- max_depth: z.number().int().min(0).max(32).default(8),
26
- max_paths: z.number().int().min(1).max(100).default(10),
27
- offset: z.number().int().min(0).default(0),
28
- limit: z.number().int().min(1).max(100).default(100),
29
- unknown_registry_approved: z.literal(true).optional(),
30
- })
31
- .superRefine(({ functions }, context) => {
32
- const pages = functions.reduce((total, group) => total + (Array.isArray(group) ? group.length : 1), 0);
33
- if (pages > MAX_EVIDENCE_PAGES)
34
- context.addIssue({
35
- code: "custom",
36
- message: `Call-path Evidence exceeds ${MAX_EVIDENCE_PAGES} pages`,
37
- path: ["functions"],
38
- });
39
- });
40
- const citedNodeSchema = z.object({
41
- address: addressSchema,
42
- name: z.string().nullable(),
43
- evidence_links: z.array(evidenceIdSchema).min(1).max(100),
44
- });
45
- const citedEdgeSchema = z.object({
46
- source: addressSchema,
47
- target: addressSchema,
48
- evidence_links: z.array(evidenceIdSchema).min(1).max(100),
49
- });
50
- const pathSchema = z.object({
51
- hops: z.number().int().min(0),
52
- nodes: z.array(citedNodeSchema).min(1).max(33),
53
- edges: z.array(citedEdgeSchema).max(32),
54
- evidence_links: z.array(evidenceIdSchema).min(1).max(3_300),
55
- });
56
- /** Evidence-cited, bounded directed call-path result. */
57
- export const callPathResultSchema = z.object({
58
- status: z.enum(["found", "not_found", "unknown", "truncated"]),
59
- start: addressSchema,
60
- goal: addressSchema,
61
- shortest_hops: z.number().int().min(0).nullable(),
62
- search_scope: z.object({
63
- max_depth: z.number().int().min(0).max(32),
64
- max_paths: z.number().int().min(1).max(100),
65
- exhaustive: z.boolean(),
66
- }),
67
- explored: z.object({
68
- nodes: z.number().int().min(0),
69
- edges: z.number().int().min(0),
70
- depth_reached: z.number().int().min(0),
71
- }),
72
- paths: z.object({
73
- items: z.array(pathSchema).max(100),
74
- offset: z.number().int().min(0),
75
- limit: z.number().int().min(1).max(100),
76
- total: z.number().int().min(0).nullable(),
77
- returned: z.number().int().min(0).max(100),
78
- truncated: z.boolean(),
79
- lower_bound: z.number().int().min(0),
80
- next_offset: z.number().int().min(0).nullable(),
81
- }),
82
- evidence_links: z.array(evidenceIdSchema).min(1).max(50_000),
83
- limitations: z.array(z.string()),
84
- });
85
- /** Reconstruct bounded direct-callee paths from explicit analyze_function Evidence. */
5
+ export { callPathInputSchema, callPathResultSchema };
6
+ /** Reconstruct direct-callee paths from explicit analyze_function Evidence. */
86
7
  export const buildCallPath = (input) => {
87
8
  const parsed = callPathInputSchema.parse(input);
88
- const snapshots = parseSnapshots(parsed.functions);
89
- assertCompatible(snapshots);
90
- if (!snapshots.has(parsed.start.address))
91
- throw new TypeError(`No analyze_function Evidence was supplied for start ${parsed.start.address}`);
92
- const graph = createGraph(snapshots);
9
+ const { snapshots, graph } = prepareCallGraph(parsed);
93
10
  const search = inspectSearch({
94
11
  graph,
95
12
  snapshots,
96
13
  start: parsed.start.address,
97
14
  goal: parsed.goal.address,
98
- maxDepth: parsed.max_depth,
99
15
  });
100
16
  const shortest = graph.hasNode(parsed.start.address) && graph.hasNode(parsed.goal.address)
101
17
  ? bidirectional(graph, parsed.start.address, parsed.goal.address)
102
18
  : null;
103
- const enumeration = shortest === null || shortest.length - 1 > parsed.max_depth
104
- ? { paths: [], budgetExhausted: false }
19
+ const paths = shortest === null
20
+ ? []
105
21
  : enumeratePaths({
106
22
  graph,
107
23
  start: parsed.start.address,
108
24
  goal: parsed.goal.address,
109
25
  shortestDepth: shortest.length - 1,
110
- maxDepth: parsed.max_depth,
111
- limit: parsed.max_paths + 1,
112
- });
113
- const hasKnownExtraPath = enumeration.paths.length > parsed.max_paths;
114
- const capped = hasKnownExtraPath || enumeration.budgetExhausted;
115
- const retained = enumeration.paths.slice(0, parsed.max_paths);
116
- const paths = retained.map((path) => citePath(path, snapshots));
117
- const total = paths.length;
118
- const items = paths.slice(parsed.offset, parsed.offset + parsed.limit);
119
- const found = paths.length > 0;
120
- const exhaustive = search.exhaustive && !capped;
121
- const status = callPathStatus({ capped, found, exhaustive });
122
- const limitations = [...search.limitations];
123
- if (capped)
124
- limitations.push(enumeration.budgetExhausted
125
- ? `Path enumeration stopped at ${MAX_PATH_EXPANSIONS} expansions`
126
- : `Path enumeration stopped at max_paths=${parsed.max_paths}`);
127
- if (!found && shortest !== null && shortest.length - 1 > parsed.max_depth)
128
- limitations.push(`The shortest observed path exceeds max_depth=${parsed.max_depth}`);
129
- return callPathResultSchema.parse({
130
- status,
26
+ }).paths.map((path) => citePath(path, snapshots));
27
+ const shortestHops = paths[0]?.hops;
28
+ const found = shortestHops !== undefined;
29
+ const exhaustive = search.exhaustive;
30
+ const limitations = search.limitations;
31
+ const resultContext = {
131
32
  start: parsed.start.address,
132
33
  goal: parsed.goal.address,
133
- shortest_hops: found ? (paths[0]?.hops ?? null) : null,
134
- search_scope: {
135
- max_depth: parsed.max_depth,
136
- max_paths: parsed.max_paths,
137
- exhaustive,
138
- },
139
- explored: {
140
- nodes: search.reached.size,
141
- edges: [...search.reached.keys()].reduce((count, node) => count + (graph.hasNode(node) ? graph.outDegree(node) : 0), 0),
142
- depth_reached: Math.max(0, ...search.reached.values()),
143
- },
144
- paths: {
145
- items,
146
- offset: parsed.offset,
147
- limit: parsed.limit,
148
- total: capped ? null : total,
149
- returned: items.length,
150
- truncated: capped,
151
- lower_bound: total + (hasKnownExtraPath ? 1 : 0),
152
- next_offset: parsed.offset + items.length < total
153
- ? parsed.offset + items.length
154
- : null,
155
- },
34
+ explored: summarizeSearch(graph, search.reached),
156
35
  evidence_links: uniqueEvidence(snapshots.values()),
157
36
  limitations: [...new Set(limitations)].sort((left, right) => left.localeCompare(right)),
37
+ };
38
+ const searchScope = { exhaustive };
39
+ if (found)
40
+ return callPathResultSchema.parse({
41
+ ...resultContext,
42
+ status: "found",
43
+ shortest_hops: shortestHops,
44
+ search_scope: searchScope,
45
+ paths,
46
+ });
47
+ return callPathResultSchema.parse({
48
+ ...resultContext,
49
+ status: exhaustive ? "not_found" : "unknown",
50
+ shortest_hops: null,
51
+ search_scope: searchScope,
52
+ paths: [],
158
53
  });
159
54
  };
160
- const callPathStatus = ({ capped, found, exhaustive, }) => {
161
- if (capped)
162
- return "truncated";
163
- if (found)
164
- return "found";
165
- return exhaustive ? "not_found" : "unknown";
55
+ const summarizeSearch = (graph, reached) => ({
56
+ nodes: reached.size,
57
+ edges: [...reached.keys()].reduce((count, node) => count + (graph.hasNode(node) ? graph.outDegree(node) : 0), 0),
58
+ depth_reached: Math.max(0, ...reached.values()),
59
+ });
60
+ const prepareCallGraph = (input) => {
61
+ const snapshots = parseSnapshots(input.functions);
62
+ assertCompatible(snapshots);
63
+ if (!snapshots.has(input.start.address))
64
+ throw new TypeError(`No analyze_function Evidence was supplied for start ${input.start.address}`);
65
+ return { snapshots, graph: createGraph(snapshots) };
166
66
  };
167
67
  const parseSnapshots = (groups) => {
168
68
  const snapshots = new Map();
@@ -201,13 +101,11 @@ const createGraph = (snapshots) => {
201
101
  const calleeAddress = normalizeAddress(callee.address);
202
102
  graph.mergeNode(calleeAddress);
203
103
  graph.mergeDirectedEdge(address, calleeAddress);
204
- if (graph.size > MAX_GRAPH_EDGES)
205
- throw new TypeError(`Call graph exceeds ${MAX_GRAPH_EDGES} directed edges`);
206
104
  }
207
105
  }
208
106
  return graph;
209
107
  };
210
- const inspectSearch = ({ graph, snapshots, start, goal, maxDepth, }) => {
108
+ const inspectSearch = ({ graph, snapshots, start, goal, }) => {
211
109
  if (!graph.hasNode(start))
212
110
  return {
213
111
  graph,
@@ -233,16 +131,9 @@ const inspectSearch = ({ graph, snapshots, start, goal, maxDepth, }) => {
233
131
  limitations.push(`No analyze_function Evidence covers reachable function ${node}`);
234
132
  continue;
235
133
  }
236
- if (!snapshot.collections.callees.complete)
237
- limitations.push(`Callee coverage is incomplete for reachable function ${node}`);
238
134
  const neighbors = graph
239
135
  .outNeighbors(node)
240
136
  .sort((left, right) => left.localeCompare(right));
241
- if (depth === maxDepth) {
242
- if (neighbors.length > 0)
243
- limitations.push(`Search reached max_depth=${maxDepth} at ${node}`);
244
- continue;
245
- }
246
137
  for (const neighbor of neighbors)
247
138
  if (!reached.has(neighbor)) {
248
139
  reached.set(neighbor, depth + 1);
@@ -257,7 +148,7 @@ const inspectSearch = ({ graph, snapshots, start, goal, maxDepth, }) => {
257
148
  limitations,
258
149
  };
259
150
  };
260
- const enumeratePaths = ({ graph, start, goal, shortestDepth, maxDepth, limit, }) => {
151
+ const enumeratePaths = ({ graph, start, goal, shortestDepth, }) => {
261
152
  const output = [];
262
153
  const state = {
263
154
  graph,
@@ -265,23 +156,14 @@ const enumeratePaths = ({ graph, start, goal, shortestDepth, maxDepth, limit, })
265
156
  path: [start],
266
157
  visited: new Set([start]),
267
158
  output,
268
- limit,
269
- expansions: 0,
270
- budgetExhausted: false,
271
159
  };
272
- for (let depth = shortestDepth; depth <= maxDepth && output.length < limit; depth += 1)
273
- enumerateAtDepth(state, depth);
274
- return { paths: output, budgetExhausted: state.budgetExhausted };
160
+ enumerateAtDepth(state, shortestDepth);
161
+ return { paths: output };
275
162
  };
276
163
  const enumerateAtDepth = (state, remaining) => {
277
- const { graph, goal, path, visited, output, limit } = state;
278
- state.expansions += 1;
279
- if (state.expansions > MAX_PATH_EXPANSIONS) {
280
- state.budgetExhausted = true;
281
- return;
282
- }
164
+ const { graph, goal, path, visited, output } = state;
283
165
  const current = path.at(-1);
284
- if (current === undefined || output.length >= limit)
166
+ if (current === undefined)
285
167
  return;
286
168
  if (remaining === 0) {
287
169
  if (current === goal)
@@ -300,8 +182,6 @@ const enumerateAtDepth = (state, remaining) => {
300
182
  enumerateAtDepth(state, remaining - 1);
301
183
  path.pop();
302
184
  visited.delete(neighbor);
303
- if (output.length >= limit || state.budgetExhausted)
304
- return;
305
185
  }
306
186
  };
307
187
  const citePath = (addresses, snapshots) => {
@@ -344,4 +224,4 @@ const snapshotLinks = (snapshot) => {
344
224
  const uniqueEvidence = (snapshots) => [
345
225
  ...new Set([...snapshots].flatMap((snapshot) => snapshotLinks(snapshot))),
346
226
  ].sort((left, right) => left.localeCompare(right));
347
- const normalizeAddress = (input) => inputAddressSchema.parse(input);
227
+ const normalizeAddress = (input) => parseCallPathAddress(input);
@@ -0,0 +1,79 @@
1
+ import { z } from "zod";
2
+ import { evidenceSchema } from "./evidence.js";
3
+ const addressSchema = z.string().regex(/^0x(?:0|[1-9a-f][0-9a-f]*)$/u);
4
+ const inputAddressSchema = z
5
+ .string()
6
+ .regex(/^0[xX][0-9a-fA-F]+$/u)
7
+ .transform((address) => `0x${BigInt(address).toString(16)}`);
8
+ const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
9
+ /** Parse a caller-supplied hexadecimal address into canonical form. */
10
+ export const parseCallPathAddress = (input) => inputAddressSchema.parse(input);
11
+ /** Strict input for explicit call-path reconstruction from complete dossiers. */
12
+ export const callPathInputSchema = z.object({
13
+ functions: z.array(evidenceSchema).min(1),
14
+ start: z.object({ address: inputAddressSchema }).strict(),
15
+ goal: z.object({ address: inputAddressSchema }).strict(),
16
+ });
17
+ const citedNodeSchema = z.object({
18
+ address: addressSchema,
19
+ name: z.string().nullable(),
20
+ evidence_links: z.array(evidenceIdSchema).min(1),
21
+ });
22
+ const citedEdgeSchema = z.object({
23
+ source: addressSchema,
24
+ target: addressSchema,
25
+ evidence_links: z.array(evidenceIdSchema).min(1),
26
+ });
27
+ const pathSchema = z
28
+ .object({
29
+ hops: z.number().int().min(0),
30
+ nodes: z.array(citedNodeSchema).min(1),
31
+ edges: z.array(citedEdgeSchema),
32
+ evidence_links: z.array(evidenceIdSchema).min(1),
33
+ })
34
+ .superRefine((path, context) => {
35
+ const edgesConnectNodes = path.edges.every((edge, index) => edge.source === path.nodes[index]?.address &&
36
+ edge.target === path.nodes[index + 1]?.address);
37
+ if (path.hops !== path.edges.length ||
38
+ path.nodes.length !== path.edges.length + 1 ||
39
+ !edgesConnectNodes)
40
+ context.addIssue({
41
+ code: "custom",
42
+ message: "Path hops and edges must connect the ordered nodes",
43
+ });
44
+ });
45
+ const resultContextShape = {
46
+ start: addressSchema,
47
+ goal: addressSchema,
48
+ explored: z.object({
49
+ nodes: z.number().int().min(0),
50
+ edges: z.number().int().min(0),
51
+ depth_reached: z.number().int().min(0),
52
+ }),
53
+ evidence_links: z.array(evidenceIdSchema).min(1),
54
+ limitations: z.array(z.string()),
55
+ };
56
+ /** Evidence-cited directed call-path result containing every shortest path. */
57
+ export const callPathResultSchema = z.union([
58
+ z.object({
59
+ ...resultContextShape,
60
+ status: z.literal("found"),
61
+ shortest_hops: z.number().int().min(0),
62
+ search_scope: z.object({ exhaustive: z.boolean() }),
63
+ paths: z.array(pathSchema).min(1),
64
+ }),
65
+ z.object({
66
+ ...resultContextShape,
67
+ status: z.literal("not_found"),
68
+ shortest_hops: z.null(),
69
+ search_scope: z.object({ exhaustive: z.literal(true) }),
70
+ paths: z.tuple([]),
71
+ }),
72
+ z.object({
73
+ ...resultContextShape,
74
+ status: z.literal("unknown"),
75
+ shortest_hops: z.null(),
76
+ search_scope: z.object({ exhaustive: z.literal(false) }),
77
+ paths: z.tuple([]),
78
+ }),
79
+ ]);
@@ -3,24 +3,10 @@ import { artifactComparisonResultSchema } from "./artifactComparison.js";
3
3
  import { evidenceSchema, parseEvidence } from "./evidence.js";
4
4
  import { functionComparisonResultSchema } from "./functionComparison.js";
5
5
  import { comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./processCapture.js";
6
- import { crossVersionInvestigationInputSchema, investigationRunSummarySchema, } from "./investigationWorkspace.js";
7
6
  const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
8
- /** Strict bounded input for aggregating existing comparison Evidence. */
9
- export const changedBehaviorInputSchema = z
10
- .object({
11
- comparisons: z.array(evidenceSchema).max(100).default([]),
12
- investigation_run: crossVersionInvestigationInputSchema.optional(),
13
- offset: z.number().int().min(0).default(0),
14
- limit: z.number().int().min(1).max(100).default(100),
15
- unknown_registry_approved: z.literal(true).optional(),
16
- })
17
- .superRefine((input, context) => {
18
- if (input.comparisons.length > 0 ===
19
- (input.investigation_run !== undefined))
20
- context.addIssue({
21
- code: "custom",
22
- message: "Supply either existing comparisons or one investigation_run, but not both",
23
- });
7
+ /** Input for aggregating existing comparison Evidence. */
8
+ export const changedBehaviorInputSchema = z.object({
9
+ comparisons: z.array(evidenceSchema).default([]),
24
10
  });
25
11
  const findingSchema = z.object({
26
12
  scope: z.enum(["runtime", "protocol", "resource", "static_candidate"]),
@@ -33,11 +19,12 @@ const findingSchema = z.object({
33
19
  ]),
34
20
  status: comparisonStatusSchema,
35
21
  source_comparison_id: evidenceIdSchema,
36
- evidence_links: z.array(evidenceIdSchema).min(3).max(201),
22
+ evidence_links: z.array(evidenceIdSchema).min(3),
37
23
  limitations: z.array(z.string()),
38
24
  });
39
25
  /** Truthful aggregate: runtime observations remain separate from static candidates. */
40
- export const changedBehaviorResultSchema = z.object({
26
+ export const changedBehaviorResultSchema = z
27
+ .object({
41
28
  behavior_status: z.enum([
42
29
  "observed_changed",
43
30
  "observed_unchanged",
@@ -51,31 +38,44 @@ export const changedBehaviorResultSchema = z.object({
51
38
  unresolved: z.number().int().min(0),
52
39
  }),
53
40
  findings: z.object({
54
- items: z.array(findingSchema).max(100),
55
- offset: z.number().int().min(0),
56
- limit: z.number().int().min(1).max(100),
57
- total: z.number().int().min(0),
58
- next_offset: z.number().int().min(0).nullable(),
41
+ items: z.array(findingSchema),
59
42
  }),
60
- evidence_links: z.array(evidenceIdSchema).min(3).max(20_100),
43
+ evidence_links: z.array(evidenceIdSchema).min(3),
61
44
  limitations: z.array(z.string()),
62
- investigation_run: investigationRunSummarySchema.optional(),
45
+ })
46
+ .superRefine((result, context) => {
47
+ const summaryTotal = Object.values(result.summary).reduce((total, count) => total + count, 0);
48
+ if (summaryTotal !== result.findings.items.length)
49
+ context.addIssue({
50
+ code: "custom",
51
+ message: "Finding classification counts must equal the finding total",
52
+ path: ["summary"],
53
+ });
54
+ if ((result.behavior_status === "observed_changed" &&
55
+ result.summary.observed_changes === 0) ||
56
+ (result.behavior_status === "observed_unchanged" &&
57
+ result.summary.observed_changes > 0))
58
+ context.addIssue({
59
+ code: "custom",
60
+ message: "Observed-change status must agree with runtime findings",
61
+ path: ["behavior_status"],
62
+ });
63
63
  });
64
64
  const EXPECTED_PROVIDERS = {
65
65
  compare_process_captures: {
66
- predicates: ["rea.process-comparison/v3", "rea.process-comparison/v4"],
66
+ predicates: ["rea.process-comparison"],
67
67
  id: "rea-process",
68
68
  name: "REA deterministic process harness",
69
69
  version: "3",
70
70
  },
71
71
  compare_artifacts: {
72
- predicates: ["rea.artifact-comparison/v1"],
72
+ predicates: ["rea.artifact-comparison"],
73
73
  id: "rea-artifact-comparison",
74
74
  name: "REA artifact comparison",
75
75
  version: "1",
76
76
  },
77
77
  compare_functions: {
78
- predicates: ["rea.function-comparison/v1"],
78
+ predicates: ["rea.function-comparison"],
79
79
  id: "rea-function-comparison",
80
80
  name: "REA function comparison",
81
81
  version: "1",
@@ -83,11 +83,9 @@ const EXPECTED_PROVIDERS = {
83
83
  };
84
84
  const acceptsPredicate = (expected, actual) => expected.some((predicate) => predicate === actual);
85
85
  /** Find observed runtime changes and separately report static change candidates. */
86
- export const findChangedBehavior = (comparisonsInput, offset, limit) => {
86
+ export const findChangedBehavior = (comparisonsInput) => {
87
87
  const parsedInput = changedBehaviorInputSchema.parse({
88
88
  comparisons: comparisonsInput,
89
- offset,
90
- limit,
91
89
  });
92
90
  const comparisons = parsedInput.comparisons;
93
91
  const evidence = comparisons.map(parseComparisonEvidence);
@@ -95,9 +93,6 @@ export const findChangedBehavior = (comparisonsInput, offset, limit) => {
95
93
  const findings = evidence.flatMap(findingsFor).sort(compareFindings);
96
94
  const runtimeStatuses = evidence.flatMap(runtimeStatus);
97
95
  const links = uniqueSorted(evidence.flatMap((item) => [item.evidence_id, ...item.evidence_links]));
98
- if (links.length > 20_100)
99
- throw new TypeError("Changed-behavior Evidence closure exceeds limit");
100
- const page = findings.slice(parsedInput.offset, parsedInput.offset + parsedInput.limit);
101
96
  return changedBehaviorResultSchema.parse({
102
97
  behavior_status: behaviorStatus(runtimeStatuses),
103
98
  summary: {
@@ -107,13 +102,7 @@ export const findChangedBehavior = (comparisonsInput, offset, limit) => {
107
102
  unresolved: count(findings, "unresolved_branch"),
108
103
  },
109
104
  findings: {
110
- items: page,
111
- offset: parsedInput.offset,
112
- limit: parsedInput.limit,
113
- total: findings.length,
114
- next_offset: parsedInput.offset + page.length < findings.length
115
- ? parsedInput.offset + page.length
116
- : null,
105
+ items: findings,
117
106
  },
118
107
  evidence_links: links,
119
108
  limitations: uniqueSorted([
@@ -126,7 +115,6 @@ export const findChangedBehavior = (comparisonsInput, offset, limit) => {
126
115
  ...(runtimeStatuses.length === 0
127
116
  ? ["No process comparison Evidence was supplied."]
128
117
  : []),
129
- ...evidence.flatMap(artifactPaginationLimitations),
130
118
  ]),
131
119
  });
132
120
  };
@@ -170,9 +158,7 @@ const parseResult = (evidence) => {
170
158
  return;
171
159
  }
172
160
  const result = artifactComparisonResultSchema.parse(evidence.normalized_result);
173
- if (result.changes.offset !== 0)
174
- throw new TypeError("Changed-behavior analysis requires artifact comparison pagination from offset zero");
175
- assertNestedLinks(evidence, result.changes.items.flatMap(({ evidence_links: links }) => links));
161
+ assertNestedLinks(evidence, result.changes.flatMap(({ evidence_links: links }) => links));
176
162
  };
177
163
  const assertNestedLinks = (evidence, nestedLinks) => {
178
164
  const topLevel = new Set(evidence.evidence_links);
@@ -232,7 +218,7 @@ const functionFindings = (evidence) => {
232
218
  };
233
219
  const artifactFindings = (evidence) => {
234
220
  const result = artifactComparisonResultSchema.parse(evidence.normalized_result);
235
- const changes = result.changes.items.map((change) => makeFinding({
221
+ const changes = result.changes.map((change) => makeFinding({
236
222
  evidence,
237
223
  dimension: `artifact:${change.logical_path}`,
238
224
  scope: "static_candidate",
@@ -245,9 +231,7 @@ const artifactFindings = (evidence) => {
245
231
  limitations: result.limitations,
246
232
  links: change.evidence_links,
247
233
  }));
248
- return (result.status === "unknown" ||
249
- result.status === "truncated" ||
250
- result.changes.next_offset !== null) &&
234
+ return (result.status === "unknown" || result.status === "truncated") &&
251
235
  !changes.some(({ classification }) => classification === "unresolved_branch")
252
236
  ? [
253
237
  ...changes,
@@ -262,16 +246,6 @@ const artifactFindings = (evidence) => {
262
246
  ]
263
247
  : changes;
264
248
  };
265
- const artifactPaginationLimitations = (evidence) => {
266
- if (evidence.operation !== "compare_artifacts")
267
- return [];
268
- const result = artifactComparisonResultSchema.parse(evidence.normalized_result);
269
- return result.changes.next_offset === null
270
- ? []
271
- : [
272
- `Artifact comparison reports ${String(result.changes.items.length)} of ${String(result.changes.total)} changes.`,
273
- ];
274
- };
275
249
  const makeFinding = (input) => findingSchema.parse({
276
250
  scope: input.scope,
277
251
  dimension: input.dimension,
@@ -2,17 +2,17 @@ import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
4
  import { createEvidenceCompletionLedger, evidenceCompletionRecordSchema, } from "./evidenceCompletionLedger.js";
5
- const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]{0,99}$/u);
5
+ const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
6
6
  const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
7
7
  const identitySchema = z.strictObject({
8
8
  id: identifierSchema,
9
- version: z.string().min(1).max(100),
9
+ version: z.string().min(1),
10
10
  });
11
11
  const environmentSchema = z.strictObject({
12
12
  platform: identifierSchema,
13
13
  architecture: identifierSchema,
14
14
  runtime: identifierSchema,
15
- runtime_version: z.string().min(1).max(100),
15
+ runtime_version: z.string().min(1),
16
16
  });
17
17
  const scenarioSchema = z.strictObject({
18
18
  id: identifierSchema,
@@ -24,14 +24,12 @@ const skillDigestSchema = z.strictObject({
24
24
  });
25
25
  const verifierRunSchema = z
26
26
  .strictObject({
27
- schema_version: z.literal(1),
28
27
  run_id: z.string().uuid(),
29
28
  verifier_pid: z.number().int().positive(),
30
29
  parent_pid: z.number().int().nonnegative(),
31
30
  process_lineage: z.discriminatedUnion("status", [
32
31
  z.strictObject({
33
32
  status: z.literal("verified"),
34
- schema_version: z.literal(1),
35
33
  observed_at: z.iso.datetime(),
36
34
  launcher_pid: z.number().int().positive(),
37
35
  launcher_parent_pid: z.number().int().nonnegative(),
@@ -48,7 +46,7 @@ const verifierRunSchema = z
48
46
  launcher_pid: z.number().int().positive(),
49
47
  launcher_parent_pid: z.number().int().nonnegative(),
50
48
  process_group_id: z.number().int().positive().nullable(),
51
- reason: z.string().min(1).max(500),
49
+ reason: z.string().min(1),
52
50
  }),
53
51
  ]),
54
52
  })
@@ -69,18 +67,16 @@ const verifierRunSchema = z
69
67
  const reportClaimSchema = z.strictObject({
70
68
  claim_id: identifierSchema,
71
69
  scenario: scenarioSchema,
72
- artifact_sha256s: z.array(digestSchema).max(100),
70
+ artifact_sha256s: z.array(digestSchema),
73
71
  provider: identitySchema,
74
- result_schema_version: z.number().int().positive(),
75
72
  status: evidenceCompletionRecordSchema.shape.status,
76
73
  evidence_ids: evidenceCompletionRecordSchema.shape.evidence_ids,
77
74
  });
78
75
  const completionVerifierReportObjectSchema = z.strictObject({
79
- schema_version: z.literal(1),
80
76
  verifier: identitySchema,
81
77
  verifier_run: verifierRunSchema,
82
78
  environment: environmentSchema,
83
- claims: z.array(reportClaimSchema).min(1).max(10_000),
79
+ claims: z.array(reportClaimSchema).min(1),
84
80
  });
85
81
  /** Strict output contract implemented by completion-aware verifiers. */
86
82
  export const completionVerifierReportSchema = completionVerifierReportObjectSchema.superRefine((report, context) => {
@@ -97,12 +93,11 @@ const manifestClaimSchema = reportClaimSchema.omit({
97
93
  evidence_ids: true,
98
94
  });
99
95
  const completionManifestObjectSchema = z.strictObject({
100
- schema_version: z.literal(1),
101
96
  manifest_id: z.string().regex(/^ecm_[a-f0-9]{64}$/u),
102
97
  verifier: identitySchema,
103
98
  environment: environmentSchema,
104
- skill_digests: z.array(skillDigestSchema).min(1).max(100),
105
- claims: z.array(manifestClaimSchema).min(1).max(10_000),
99
+ skill_digests: z.array(skillDigestSchema).min(1),
100
+ claims: z.array(manifestClaimSchema).min(1),
106
101
  });
107
102
  const compareIdentifiers = (left, right) => left < right ? -1 : left > right ? 1 : 0;
108
103
  const isSortedUnique = (values) => values.every((value, index) => index === 0 || compareIdentifiers(values[index - 1] ?? "", value) < 0);
@@ -168,7 +163,6 @@ export const createCompletionLedgerArtifacts = (input, skillDigests) => {
168
163
  if (!isSortedUnique(skills.map(({ skill_id }) => skill_id)))
169
164
  throw new TypeError("Completion skill IDs must be unique");
170
165
  const projection = {
171
- schema_version: 1,
172
166
  verifier: report.verifier,
173
167
  environment: report.environment,
174
168
  skill_digests: skills,