rea-agents 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/README.md +83 -108
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -74,15 +74,20 @@ export class DirectoryArtifactReader {
74
74
  if (entry.kind !== "file")
75
75
  throw new ArtifactReaderFailure("format", "Only regular files can be opened");
76
76
  const handle = await open(entry.adapterKey, constants.O_RDONLY | constants.O_NOFOLLOW);
77
- const observed = await handle.stat();
78
- if (!observed.isFile() ||
79
- entry.sourceIdentity === undefined ||
80
- observed.dev !== entry.sourceIdentity.device ||
81
- observed.ino !== entry.sourceIdentity.inode) {
82
- await handle.close();
83
- throw new ArtifactReaderFailure("integrity", `Directory entry changed before open: ${entry.path}`);
77
+ try {
78
+ const observed = await handle.stat();
79
+ if (!observed.isFile() ||
80
+ entry.sourceIdentity === undefined ||
81
+ observed.dev !== entry.sourceIdentity.device ||
82
+ observed.ino !== entry.sourceIdentity.inode) {
83
+ throw new ArtifactReaderFailure("integrity", `Directory entry changed before open: ${entry.path}`);
84
+ }
85
+ return handle.createReadStream({ autoClose: true });
86
+ }
87
+ catch (cause) {
88
+ await handle.close().catch(() => undefined);
89
+ throw cause;
84
90
  }
85
- return handle.createReadStream({ autoClose: true });
86
91
  }
87
92
  close() {
88
93
  return Promise.resolve();
@@ -13,11 +13,7 @@ export class MachOSliceArtifactReader {
13
13
  this.runner = runner;
14
14
  }
15
15
  async *entries(signal) {
16
- const captured = await this.runner.run("lipo", ["-detailed_info", this.path], {
17
- ...(signal === undefined ? {} : { signal }),
18
- timeoutMs: 30_000,
19
- maxOutputBytes: 4 * 1024 * 1024,
20
- });
16
+ const captured = await this.runner.run("lipo", ["-detailed_info", this.path], signal === undefined ? {} : { signal });
21
17
  if (!captured.ok)
22
18
  throw new ArtifactReaderFailure(captured.error.reason === "cancelled" ? "cancelled" : "unavailable", "lipo could not enumerate universal Mach-O slices", { cause: captured.error });
23
19
  this.#command = {
@@ -1,13 +1,12 @@
1
- import { execFile } from "node:child_process";
2
1
  import { mkdtemp, rm } from "node:fs/promises";
3
2
  import { tmpdir } from "node:os";
4
3
  import { basename, join } from "node:path";
5
- import { promisify } from "node:util";
6
4
  import { parse } from "plist";
7
5
  import { z } from "zod";
8
6
  import { ArtifactReaderFailure, } from "./ArtifactReader.js";
9
7
  import { DirectoryArtifactReader } from "./DirectoryArtifactReader.js";
10
- const execFileAsync = promisify(execFile);
8
+ import { execFileOutput } from "../process/ExecFileOutput.js";
9
+ const DETACH_TIMEOUT_MS = 120_000;
11
10
  const attachOutputSchema = z.object({
12
11
  "system-entities": z.array(z.object({
13
12
  "dev-entry": z.string().startsWith("/dev/"),
@@ -15,11 +14,10 @@ const attachOutputSchema = z.object({
15
14
  })),
16
15
  });
17
16
  const systemHost = {
18
- async run(arguments_, signal) {
17
+ async run(arguments_, signal, options) {
19
18
  try {
20
- const { stdout } = await execFileAsync("/usr/bin/hdiutil", [...arguments_], {
21
- encoding: "utf8",
22
- timeout: 120_000,
19
+ const { stdout } = await execFileOutput("/usr/bin/hdiutil", [...arguments_], {
20
+ ...(options === undefined ? {} : { timeout: options.timeoutMs }),
23
21
  ...(signal === undefined ? {} : { signal }),
24
22
  });
25
23
  return { stdout, exitCode: 0 };
@@ -48,7 +46,7 @@ export class NativeDmgArtifactReader {
48
46
  }
49
47
  /** Verify and attach one image beneath an exclusively owned temporary root. */
50
48
  static async create(path, signal, host = systemHost) {
51
- if (process.platform !== "darwin")
49
+ if (process.platform !== "darwin" && host === systemHost)
52
50
  throw new ArtifactReaderFailure("unavailable", "Native DMG traversal is available only on macOS");
53
51
  const reader = new NativeDmgArtifactReader(path, host);
54
52
  await reader.attach(signal);
@@ -73,7 +71,9 @@ export class NativeDmgArtifactReader {
73
71
  let detachFailure;
74
72
  for (const device of [...this.#devices].reverse()) {
75
73
  try {
76
- await runChecked(this.host, ["detach", device]);
74
+ await runChecked(this.host, ["detach", device], undefined, {
75
+ timeoutMs: DETACH_TIMEOUT_MS,
76
+ });
77
77
  this.#provenance.push(command(["detach", device], ["mount"]));
78
78
  }
79
79
  catch (cause) {
@@ -135,8 +135,8 @@ export class NativeDmgArtifactReader {
135
135
  }
136
136
  }
137
137
  }
138
- const runChecked = async (host, arguments_, signal) => {
139
- const result = await host.run(arguments_, signal);
138
+ const runChecked = async (host, arguments_, signal, options) => {
139
+ const result = await host.run(arguments_, signal, options);
140
140
  if (result.exitCode !== 0)
141
141
  throw new ArtifactReaderFailure("unavailable", `hdiutil ${arguments_[0] ?? "operation"} failed with a non-zero exit code`);
142
142
  return { stdout: result.stdout, exitCode: 0 };
@@ -0,0 +1,269 @@
1
+ import { TextDecoder } from "node:util";
2
+ const MAGIC = Buffer.from("NIBArchive", "ascii");
3
+ const MAX_RECORDS = 1_000_000;
4
+ /** Decode Apple's length-prefixed NIBArchive representation without loading UI classes. */
5
+ export const decodeNibArchive = (bytes) => {
6
+ if (bytes.length < 50 || !bytes.subarray(0, MAGIC.length).equals(MAGIC))
7
+ throw new TypeError("NIBArchive magic or header is invalid");
8
+ const formatVersion = readU32(bytes, 10);
9
+ const coderVersion = readU32(bytes, 14);
10
+ if (formatVersion !== 1)
11
+ throw new TypeError(`Unsupported NIBArchive format version ${formatVersion}`);
12
+ const objectCount = readCount(bytes, 18, "object");
13
+ const objectsOffset = readOffset(bytes, 22, bytes.length, "object");
14
+ const keyCount = readCount(bytes, 26, "key");
15
+ const keysOffset = readOffset(bytes, 30, bytes.length, "key");
16
+ const valueCount = readCount(bytes, 34, "value");
17
+ const valuesOffset = readOffset(bytes, 38, bytes.length, "value");
18
+ const classCount = readCount(bytes, 42, "class");
19
+ const classesOffset = readOffset(bytes, 46, bytes.length, "class");
20
+ assertOrderedOffsets(bytes.length, [
21
+ objectsOffset,
22
+ keysOffset,
23
+ valuesOffset,
24
+ classesOffset,
25
+ ]);
26
+ const objectRecords = parseObjects(bytes, objectsOffset, keysOffset, objectCount, valueCount, classCount);
27
+ const keys = parseStrings(bytes, keysOffset, valuesOffset, keyCount, "key");
28
+ const classes = parseClasses(bytes, classesOffset, bytes.length, classCount);
29
+ const neededValues = valueIndexes(objectRecords, valueCount);
30
+ const values = parseValues(bytes, valuesOffset, classesOffset, valueCount, keyCount, neededValues);
31
+ for (const { value } of values.values()) {
32
+ if (typeof value === "object" &&
33
+ value !== null &&
34
+ !Array.isArray(value) &&
35
+ typeof value.$nib_object_ref === "number" &&
36
+ value.$nib_object_ref >= objectCount)
37
+ throw new TypeError("NIBArchive object reference is outside the object table");
38
+ }
39
+ const objects = objectRecords.flatMap((object, id) => {
40
+ const className = classes[object.class_index];
41
+ if (className === undefined)
42
+ return [];
43
+ const fields = {};
44
+ for (let index = object.value_start; index < object.value_start + object.value_count; index += 1) {
45
+ const value = values.get(index);
46
+ if (value === undefined)
47
+ continue;
48
+ const key = keys[value.key_index];
49
+ if (key !== undefined)
50
+ fields[key] = value.value;
51
+ }
52
+ return [{ id, class_name: className, values: fields }];
53
+ });
54
+ let connectionObjectCount = 0;
55
+ for (const object of objects)
56
+ if (/(?:Outlet|Connection|Segue|ActionConnection)/iu.test(object.class_name))
57
+ connectionObjectCount += 1;
58
+ return {
59
+ format_version: formatVersion,
60
+ coder_version: coderVersion,
61
+ object_count: objectCount,
62
+ connection_object_count: connectionObjectCount,
63
+ objects,
64
+ classes,
65
+ limitations: [
66
+ "NIBArchive class extensions and unsupported value encodings are retained as unavailable fields.",
67
+ "NIBArchive object relationships are decoded from serialized references; runtime object creation and execution are not performed.",
68
+ ],
69
+ };
70
+ };
71
+ const parseObjects = (bytes, start, end, count, valueCount, classCount) => {
72
+ const cursor = { offset: start };
73
+ const output = [];
74
+ for (let index = 0; index < count; index += 1) {
75
+ const classIndex = readVarint(bytes, cursor, end);
76
+ const valueStart = readVarint(bytes, cursor, end);
77
+ const countForObject = readVarint(bytes, cursor, end);
78
+ if (classIndex >= classCount ||
79
+ valueStart > valueCount ||
80
+ countForObject > valueCount - valueStart)
81
+ throw new TypeError(`NIBArchive object ${index} references an invalid table range`);
82
+ output.push({
83
+ class_index: classIndex,
84
+ value_start: valueStart,
85
+ value_count: countForObject,
86
+ });
87
+ }
88
+ if (cursor.offset > end)
89
+ throw new TypeError("NIBArchive object table overlaps the next table");
90
+ return output;
91
+ };
92
+ const parseStrings = (bytes, start, end, count, label) => {
93
+ const cursor = { offset: start };
94
+ const output = [];
95
+ for (let index = 0; index < count; index += 1) {
96
+ const length = readVarint(bytes, cursor, end);
97
+ const next = checkedEnd(cursor.offset, length, end, `${label} ${index}`);
98
+ const value = decodeUtf8(bytes, cursor.offset, next, `${label} ${index}`);
99
+ cursor.offset = next;
100
+ output.push(value);
101
+ }
102
+ return output;
103
+ };
104
+ const parseClasses = (bytes, start, end, count) => {
105
+ const cursor = { offset: start };
106
+ const output = [];
107
+ for (let index = 0; index < count; index += 1) {
108
+ const length = readVarint(bytes, cursor, end);
109
+ const extraCount = readVarint(bytes, cursor, end);
110
+ if (extraCount > 16)
111
+ throw new TypeError(`NIBArchive class ${index} has too many extension values`);
112
+ ensureRange(cursor.offset, extraCount * 4, end, `class ${index} extensions`);
113
+ cursor.offset += extraCount * 4;
114
+ const next = checkedEnd(cursor.offset, length, end, `class ${index}`);
115
+ const name = decodeUtf8(bytes, cursor.offset, next, `class ${index}`).replace(/\0+$/u, "");
116
+ cursor.offset = next;
117
+ output.push(name);
118
+ }
119
+ return output;
120
+ };
121
+ const parseValues = (bytes, start, end, count, keyCount, needed) => {
122
+ const cursor = { offset: start };
123
+ const output = new Map();
124
+ for (let index = 0; index < count; index += 1) {
125
+ const keyIndex = readVarint(bytes, cursor, end);
126
+ if (keyIndex >= keyCount)
127
+ throw new TypeError(`NIBArchive value ${index} references an invalid key`);
128
+ ensureRange(cursor.offset, 1, end, `value ${index} type`);
129
+ const type = bytes[cursor.offset++] ?? -1;
130
+ const value = readValue(bytes, cursor, end, type, index);
131
+ if (needed.has(index))
132
+ output.set(index, { key_index: keyIndex, value });
133
+ }
134
+ if (cursor.offset > end)
135
+ throw new TypeError("NIBArchive value table overlaps the next table");
136
+ return output;
137
+ };
138
+ const readValue = (bytes, cursor, end, type, index) => {
139
+ switch (type) {
140
+ case 0:
141
+ ensureRange(cursor.offset, 1, end, `value ${index}`);
142
+ return bytes.readInt8(cursor.offset++);
143
+ case 1:
144
+ ensureRange(cursor.offset, 2, end, `value ${index}`);
145
+ {
146
+ const value = bytes.readInt16LE(cursor.offset);
147
+ cursor.offset += 2;
148
+ return value;
149
+ }
150
+ case 2:
151
+ ensureRange(cursor.offset, 4, end, `value ${index}`);
152
+ {
153
+ const value = bytes.readInt32LE(cursor.offset);
154
+ cursor.offset += 4;
155
+ return value;
156
+ }
157
+ case 3:
158
+ ensureRange(cursor.offset, 8, end, `value ${index}`);
159
+ {
160
+ const value = bytes.readBigInt64LE(cursor.offset);
161
+ cursor.offset += 8;
162
+ return value <= BigInt(Number.MAX_SAFE_INTEGER) &&
163
+ value >= BigInt(Number.MIN_SAFE_INTEGER)
164
+ ? Number(value)
165
+ : value.toString();
166
+ }
167
+ case 4:
168
+ return true;
169
+ case 5:
170
+ return false;
171
+ case 6:
172
+ ensureRange(cursor.offset, 4, end, `value ${index}`);
173
+ {
174
+ const value = bytes.readFloatLE(cursor.offset);
175
+ cursor.offset += 4;
176
+ return Number.isFinite(value) ? value : null;
177
+ }
178
+ case 7:
179
+ ensureRange(cursor.offset, 8, end, `value ${index}`);
180
+ {
181
+ const value = bytes.readDoubleLE(cursor.offset);
182
+ cursor.offset += 8;
183
+ return Number.isFinite(value) ? value : null;
184
+ }
185
+ case 8: {
186
+ const length = readVarint(bytes, cursor, end);
187
+ const next = checkedEnd(cursor.offset, length, end, `value ${index} data`);
188
+ const encoded = bytes.subarray(cursor.offset, next).toString("base64");
189
+ cursor.offset = next;
190
+ return { $nib_data_base64: encoded };
191
+ }
192
+ case 9:
193
+ return null;
194
+ case 10:
195
+ ensureRange(cursor.offset, 4, end, `value ${index} reference`);
196
+ {
197
+ const objectIndex = bytes.readUInt32LE(cursor.offset);
198
+ cursor.offset += 4;
199
+ return { $nib_object_ref: objectIndex };
200
+ }
201
+ default:
202
+ throw new TypeError(`NIBArchive value ${index} has unsupported type ${type}`);
203
+ }
204
+ };
205
+ const valueIndexes = (objects, total) => {
206
+ const indexes = new Set();
207
+ for (const object of objects)
208
+ for (let index = object.value_start; index < object.value_start + object.value_count; index += 1)
209
+ indexes.add(index);
210
+ if (indexes.size > total)
211
+ throw new TypeError("NIBArchive object value ranges exceed the value table");
212
+ return indexes;
213
+ };
214
+ const readCount = (bytes, offset, label) => {
215
+ const count = readU32(bytes, offset);
216
+ if (count > MAX_RECORDS)
217
+ throw new TypeError(`NIBArchive ${label} count exceeds the decoder bound`);
218
+ return count;
219
+ };
220
+ const readOffset = (bytes, offset, fileLength, label) => {
221
+ const value = readU32(bytes, offset);
222
+ if (value < 50 || value > fileLength)
223
+ throw new TypeError(`NIBArchive ${label} table offset is invalid`);
224
+ return value;
225
+ };
226
+ const readU32 = (bytes, offset) => {
227
+ ensureRange(offset, 4, bytes.length, "header");
228
+ return bytes.readUInt32LE(offset);
229
+ };
230
+ const decodeUtf8 = (bytes, start, end, label) => {
231
+ try {
232
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes.subarray(start, end));
233
+ }
234
+ catch {
235
+ throw new TypeError(`NIBArchive ${label} is not valid UTF-8`);
236
+ }
237
+ };
238
+ const readVarint = (bytes, cursor, end) => {
239
+ let value = 0;
240
+ let shift = 0;
241
+ for (let index = 0; index < 5; index += 1) {
242
+ ensureRange(cursor.offset, 1, end, "variable integer");
243
+ const byte = bytes[cursor.offset++] ?? 0;
244
+ value += (byte & 0x7f) * 2 ** shift;
245
+ if ((byte & 0x80) !== 0) {
246
+ if (value > 0x7fff_ffff)
247
+ throw new TypeError("NIBArchive variable integer is out of range");
248
+ return value;
249
+ }
250
+ shift += 7;
251
+ }
252
+ throw new TypeError("NIBArchive variable integer is too long");
253
+ };
254
+ const checkedEnd = (start, length, limit, label) => {
255
+ if (!Number.isSafeInteger(length) || length < 0 || start + length > limit)
256
+ throw new TypeError(`NIBArchive ${label} exceeds its table`);
257
+ return start + length;
258
+ };
259
+ const ensureRange = (start, length, limit, label) => {
260
+ checkedEnd(start, length, limit, label);
261
+ };
262
+ const assertOrderedOffsets = (length, offsets) => {
263
+ let previous = 50;
264
+ for (const offset of offsets) {
265
+ if (offset < previous || offset > length)
266
+ throw new TypeError("NIBArchive table offsets are out of order");
267
+ previous = offset;
268
+ }
269
+ };
@@ -1,30 +1,23 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { constants } from "node:fs";
3
- import { lstat, mkdir, open, realpath, rm } from "node:fs/promises";
3
+ import { lstat, mkdir, open, realpath, rm, } from "node:fs/promises";
4
4
  import { basename, dirname, isAbsolute, join, resolve } from "node:path";
5
5
  import { streamChunkToBuffer } from "./StreamBytes.js";
6
6
  import { ArtifactPathRegistry, normalizeArtifactPath, } from "./ArtifactPaths.js";
7
- import { ArtifactReaderFailure, } from "./ArtifactReader.js";
7
+ import { ArtifactReaderFailure } from "./ArtifactReader.js";
8
8
  /** Symlink-resistant materialization in an exclusively owned, initially absent tree. */
9
9
  export class SafeOutputTree {
10
10
  #registry = new ArtifactPathRegistry();
11
- #limits;
12
11
  #outputRoot;
13
- #stagingRoot;
14
- #totalBytes = 0;
15
12
  #published = false;
16
13
  #cleanup = {
17
- attempted: false,
18
- verified: false,
19
- residualPaths: [],
14
+ status: "not-required",
20
15
  };
21
- constructor(outputRoot, stagingRoot, limits) {
16
+ constructor(outputRoot) {
22
17
  this.#outputRoot = outputRoot;
23
- this.#stagingRoot = stagingRoot;
24
- this.#limits = limits;
25
18
  }
26
19
  /** Exclusively create the absent destination as this operation's owned tree. */
27
- static async create(outputRoot, limits) {
20
+ static async create(outputRoot) {
28
21
  if (!isAbsolute(outputRoot))
29
22
  throw new ArtifactReaderFailure("path", "Extraction output root must be absolute");
30
23
  const requested = resolve(outputRoot);
@@ -48,7 +41,7 @@ export class SafeOutputTree {
48
41
  finally {
49
42
  await stagingHandle.close();
50
43
  }
51
- return new SafeOutputTree(canonicalOutput, canonicalOutput, limits);
44
+ return new SafeOutputTree(canonicalOutput);
52
45
  }
53
46
  catch (cause) {
54
47
  await rm(canonicalOutput, { recursive: true, force: true });
@@ -61,10 +54,10 @@ export class SafeOutputTree {
61
54
  get cleanup() {
62
55
  return structuredClone(this.#cleanup);
63
56
  }
64
- /** Stream one selected regular file with exact byte and digest verification. */
57
+ /** Stream one regular file with exact byte and digest verification. */
65
58
  async write(relativePath, source, expectedSha256, signal) {
66
59
  this.#assertWritable();
67
- const path = normalizeArtifactPath(relativePath, this.#limits);
60
+ const path = normalizeArtifactPath(relativePath);
68
61
  this.#registry.add(path, "file");
69
62
  const destination = await this.#prepareParent(path);
70
63
  const handle = await open(destination, constants.O_CREAT |
@@ -80,10 +73,6 @@ export class SafeOutputTree {
80
73
  abortIfNeeded(signal);
81
74
  const chunk = streamChunkToBuffer(raw);
82
75
  bytes += chunk.length;
83
- if (bytes > this.#limits.maxEntryBytes)
84
- throw new ArtifactReaderFailure("limit", `Observed entry bytes exceed limit: ${path}`);
85
- if (this.#totalBytes + bytes > this.#limits.maxTotalBytes)
86
- throw new ArtifactReaderFailure("limit", "Observed extraction bytes exceed cumulative limit");
87
76
  hash.update(chunk);
88
77
  await writeAll(handle, chunk);
89
78
  }
@@ -95,7 +84,6 @@ export class SafeOutputTree {
95
84
  const readback = await hashFile(destination, bytes, signal);
96
85
  if (readback.sha256 !== sha256 || readback.bytes !== bytes)
97
86
  throw new ArtifactReaderFailure("integrity", `Durable readback verification failed: ${path}`);
98
- this.#totalBytes += bytes;
99
87
  return { relativePath: path, sha256, bytesWritten: bytes };
100
88
  }
101
89
  catch (cause) {
@@ -107,9 +95,10 @@ export class SafeOutputTree {
107
95
  async commit() {
108
96
  this.#assertWritable();
109
97
  const parent = await open(dirname(this.#outputRoot), constants.O_RDONLY | constants.O_DIRECTORY);
110
- const staging = await open(this.#stagingRoot, constants.O_RDONLY | constants.O_DIRECTORY);
98
+ let output;
111
99
  try {
112
- await staging.sync();
100
+ output = await open(this.#outputRoot, constants.O_RDONLY | constants.O_DIRECTORY);
101
+ await output.sync();
113
102
  await parent.sync();
114
103
  this.#published = true;
115
104
  }
@@ -117,20 +106,21 @@ export class SafeOutputTree {
117
106
  throw new ArtifactReaderFailure("path", "Could not durably sync extraction output", { cause });
118
107
  }
119
108
  finally {
120
- await Promise.allSettled([parent.close(), staging.close()]);
109
+ await Promise.allSettled([parent.close(), output?.close()]);
121
110
  }
122
111
  }
123
112
  /** Remove only this operation's unsealed tree and verify absence. */
124
113
  async rollback() {
125
114
  if (this.#published)
126
115
  return structuredClone(this.#cleanup);
127
- await rm(this.#stagingRoot, { recursive: true, force: true });
128
- const absent = await isAbsent(this.#stagingRoot);
129
- this.#cleanup = {
130
- attempted: true,
131
- verified: absent,
132
- residualPaths: absent ? [] : [basename(this.#stagingRoot)],
133
- };
116
+ await rm(this.#outputRoot, { recursive: true, force: true });
117
+ const absent = await isAbsent(this.#outputRoot);
118
+ this.#cleanup = absent
119
+ ? { status: "complete", residualPaths: [] }
120
+ : {
121
+ status: "incomplete",
122
+ residualPaths: [basename(this.#outputRoot)],
123
+ };
134
124
  if (!absent)
135
125
  throw new ArtifactReaderFailure("integrity", "Extraction output cleanup could not be verified");
136
126
  return structuredClone(this.#cleanup);
@@ -140,7 +130,7 @@ export class SafeOutputTree {
140
130
  const fileName = parts.pop();
141
131
  if (fileName === undefined)
142
132
  throw new ArtifactReaderFailure("path", "Invalid extraction path");
143
- let current = this.#stagingRoot;
133
+ let current = this.#outputRoot;
144
134
  for (const part of parts) {
145
135
  current = join(current, part);
146
136
  await mkdir(current, { mode: 0o700 }).catch((cause) => {
@@ -69,7 +69,7 @@ const startupError = (options, startedAt, state) => new BrowserStartupError({
69
69
  elapsedMs: Math.max(0, Math.round(performance.now() - startedAt)),
70
70
  exitCode: options.child.exitCode,
71
71
  signalCode: options.child.signalCode,
72
- stderr: boundedStderr(options.stderr()),
72
+ stderr: options.stderr(),
73
73
  }, state.failure === "spawn-error" ? { cause: state.cause } : undefined);
74
74
  const readDevtoolsPort = async (path) => {
75
75
  try {
@@ -83,6 +83,5 @@ const readDevtoolsPort = async (path) => {
83
83
  return null;
84
84
  }
85
85
  };
86
- const boundedStderr = (stderr) => stderr.length <= 65_536 ? stderr : stderr.slice(-65_536);
87
86
  const delay = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
88
87
  const browserStartupMessage = (failure, diagnostics) => `Chrome CDP startup ${failure}; executable=${diagnostics.executable}; elapsed_ms=${String(diagnostics.elapsedMs)}; exit_code=${diagnostics.exitCode === null ? "null" : String(diagnostics.exitCode)}; signal=${diagnostics.signalCode ?? "null"}; stderr=${diagnostics.stderr.length === 0 ? "<empty>" : diagnostics.stderr}`;
@@ -0,0 +1,16 @@
1
+ import { BrowserObservationError } from "../domain/errors.js";
2
+ import { mainFrameUrl } from "./CdpCaptureDocuments.js";
3
+ import { allowedSanitizedUrl, delayWithCancellation, isHttpUrl, } from "./CdpCaptureValues.js";
4
+ /** Wait for the attached target's main frame to enter its approved origin. */
5
+ export const authorizedMainFrame = async ({ connection, sessionId, signal, allowedOrigins, delayOperation, }) => {
6
+ for (let attempt = 0; attempt < 80; attempt += 1) {
7
+ const result = await connection.send("Page.getFrameTree", {}, sessionId, signal);
8
+ const url = mainFrameUrl(result);
9
+ if (allowedSanitizedUrl(url, allowedOrigins) !== undefined)
10
+ return result;
11
+ if (isHttpUrl(url))
12
+ throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
13
+ await delayWithCancellation(25, delayOperation, signal);
14
+ }
15
+ throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
16
+ };
@@ -33,19 +33,9 @@ export class CdpBrowserProvider {
33
33
  const discovery = await discoverCdpEndpoint(input.cdp_endpoint, "list_browser_targets", options.signal);
34
34
  const allowedOrigins = new Set(input.allowed_origins);
35
35
  const selected = selectTargets(discovery, allowedOrigins);
36
- const items = selected.allowed.slice(input.offset, input.offset + input.limit);
37
- const nextOffset = input.offset + items.length;
38
36
  return ok(browserTargetListSchema.parse({
39
- schema_version: 1,
40
37
  browser: discovery.version,
41
- targets: {
42
- items,
43
- offset: input.offset,
44
- limit: input.limit,
45
- total: selected.allowed.length,
46
- next_offset: nextOffset < selected.allowed.length ? nextOffset : null,
47
- has_more: nextOffset < selected.allowed.length,
48
- },
38
+ targets: selected.allowed,
49
39
  excluded: selected.excluded,
50
40
  limitations: [
51
41
  "Only page targets whose current URL matches an approved exact origin are listed.",
@@ -76,7 +66,7 @@ export class CdpBrowserProvider {
76
66
  const sourceMaps = input.fetch_source_maps
77
67
  ? await fetchWebSourceMaps(captured.sourceMapRequests, input, options.signal)
78
68
  : undefined;
79
- return ok(webBundleAnalysisSchema.parse(analyzeCapturedWebBundle(captured.inspection, input, sourceMaps)));
69
+ return ok(webBundleAnalysisSchema.parse(analyzeCapturedWebBundle(captured.inspection, sourceMaps)));
80
70
  }
81
71
  catch (cause) {
82
72
  return err(providerError(cause, "analyze_web_bundle"));
@@ -228,7 +218,7 @@ const selectTargets = (discovery, allowedOrigins) => {
228
218
  allowed.push({
229
219
  target_id: target.id,
230
220
  type: target.type,
231
- title: target.title.slice(0, 16_384),
221
+ title: target.title,
232
222
  url: url.url,
233
223
  origin: url.origin,
234
224
  attached: target.attached,
@@ -0,0 +1,9 @@
1
+ import { createHash } from "node:crypto";
2
+ import canonicalize from "canonicalize";
3
+ /** Hash a value using the canonical JSON representation. */
4
+ export const canonicalJsonDigest = (value) => {
5
+ const encoded = canonicalize(value);
6
+ if (encoded === undefined)
7
+ throw new TypeError("Expected canonical JSON");
8
+ return createHash("sha256").update(encoded).digest("hex");
9
+ };