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
@@ -26,8 +26,7 @@ export class ProviderStartupDeadline {
26
26
  #externalSignal;
27
27
  #onExternalAbort;
28
28
  #timer;
29
- #timedOut = false;
30
- #cancelled = false;
29
+ #interruption;
31
30
  constructor(timeoutMs, signal) {
32
31
  this.timeoutMs = timeoutMs;
33
32
  if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
@@ -38,11 +37,11 @@ export class ProviderStartupDeadline {
38
37
  if (this.#controller.signal.aborted)
39
38
  return;
40
39
  if (Date.now() >= this.#deadlineAt) {
41
- this.#timedOut = true;
40
+ this.#interruption = "timeout";
42
41
  this.#abort(new DOMException("Provider startup deadline elapsed", "TimeoutError"));
43
42
  return;
44
43
  }
45
- this.#cancelled = true;
44
+ this.#interruption = "cancelled";
46
45
  this.#abort(signal?.reason);
47
46
  };
48
47
  if (signal?.aborted === true) {
@@ -53,7 +52,7 @@ export class ProviderStartupDeadline {
53
52
  this.#timer = setTimeout(() => {
54
53
  if (this.#controller.signal.aborted)
55
54
  return;
56
- this.#timedOut = true;
55
+ this.#interruption = "timeout";
57
56
  this.#abort(new DOMException("Provider startup deadline elapsed", "TimeoutError"));
58
57
  }, timeoutMs);
59
58
  }
@@ -61,13 +60,10 @@ export class ProviderStartupDeadline {
61
60
  get signal() {
62
61
  return this.#controller.signal;
63
62
  }
64
- /** True only when the external caller signal initiated cancellation. */
65
- get cancelled() {
66
- return this.#cancelled;
67
- }
68
- /** True when the absolute startup deadline has elapsed. */
69
- get timedOut() {
70
- return (this.#timedOut || (!this.#cancelled && Date.now() >= this.#deadlineAt));
63
+ /** First control path that interrupted startup, if any. */
64
+ get interruption() {
65
+ return (this.#interruption ??
66
+ (Date.now() >= this.#deadlineAt ? "timeout" : undefined));
71
67
  }
72
68
  /** Milliseconds still available to the next startup phase. */
73
69
  remainingMs() {
@@ -1,5 +1,4 @@
1
1
  import { spawn } from "node:child_process";
2
- const DEFAULT_OUTPUT_BYTES = 64 * 1024;
3
2
  const DEFAULT_TERMINATION_GRACE_MS = 250;
4
3
  const DEFAULT_KILL_GRACE_MS = 1_000;
5
4
  /**
@@ -47,8 +46,8 @@ export const spawnOwnedProviderProcess = async (options) => {
47
46
  export class ProviderProcessSupervisor {
48
47
  launch;
49
48
  #options;
50
- #stdout;
51
- #stderr;
49
+ #stdout = new ProcessOutputCapture();
50
+ #stderr = new ProcessOutputCapture();
52
51
  #exit = deferred();
53
52
  #onStdout = (chunk) => {
54
53
  this.#capture("stdout", this.#stdout, chunk);
@@ -71,11 +70,6 @@ export class ProviderProcessSupervisor {
71
70
  constructor(launch, options = {}) {
72
71
  this.launch = launch;
73
72
  this.#options = options;
74
- const limit = options.maxOutputBytesPerStream ?? DEFAULT_OUTPUT_BYTES;
75
- if (!Number.isSafeInteger(limit) || limit <= 0)
76
- throw new RangeError("Provider output limit must be a positive integer");
77
- this.#stdout = new BoundedByteCapture(limit);
78
- this.#stderr = new BoundedByteCapture(limit);
79
73
  this.#attach(launch.process.stdout, "stdout");
80
74
  this.#attach(launch.process.stderr, "stderr");
81
75
  launch.process.once("exit", this.#onExit);
@@ -84,7 +78,7 @@ export class ProviderProcessSupervisor {
84
78
  if (launch.process.exitCode !== null || launch.process.signalCode !== null)
85
79
  this.#recordExit(launch.process.exitCode, launch.process.signalCode);
86
80
  }
87
- /** Latest bounded output and exit observation. */
81
+ /** Latest complete output and exit observation. */
88
82
  snapshot() {
89
83
  return {
90
84
  stdout: this.#stdout.snapshot(),
@@ -203,7 +197,6 @@ export class ProviderProcessSupervisor {
203
197
  stream,
204
198
  bytes: bytes.byteLength,
205
199
  totalBytes: capture.bytes,
206
- truncated: capture.truncated,
207
200
  });
208
201
  }
209
202
  #recordExit(code, signal) {
@@ -219,35 +212,21 @@ export class ProviderProcessSupervisor {
219
212
  });
220
213
  }
221
214
  }
222
- class BoundedByteCapture {
223
- limit;
215
+ class ProcessOutputCapture {
224
216
  #chunks = [];
225
217
  #bytes = 0;
226
- #retainedBytes = 0;
227
- constructor(limit) {
228
- this.limit = limit;
229
- }
230
218
  get bytes() {
231
219
  return this.#bytes;
232
220
  }
233
- get truncated() {
234
- return this.#bytes > this.#retainedBytes;
235
- }
236
221
  append(chunk) {
237
222
  this.#bytes += chunk.byteLength;
238
- const remaining = this.limit - this.#retainedBytes;
239
- if (remaining <= 0)
240
- return;
241
- const retained = Buffer.from(chunk.subarray(0, remaining));
242
- this.#chunks.push(retained);
243
- this.#retainedBytes += retained.byteLength;
223
+ this.#chunks.push(Buffer.from(chunk));
244
224
  }
245
225
  snapshot() {
226
+ const text = Buffer.concat(this.#chunks, this.#bytes).toString("utf8");
246
227
  return {
247
- text: Buffer.concat(this.#chunks, this.#retainedBytes).toString("utf8"),
228
+ text,
248
229
  bytes: this.#bytes,
249
- retainedBytes: this.#retainedBytes,
250
- truncated: this.truncated,
251
230
  };
252
231
  }
253
232
  }
@@ -0,0 +1,32 @@
1
+ /** Stable explanation used whenever the native Windows authority is absent. */
2
+ export const WINDOWS_NATIVE_AUTHORITY_UNAVAILABLE_REASON = "Verified Windows native authority is unavailable: Job Object process ownership, private runtime DACL enforcement, and reparse-safe path admission are not implemented; chmod(0700) is insufficient for Windows private DACL proof, and taskkill is not a Job Object security proof";
3
+ /**
4
+ * Describe native Windows controls without inferring them from taskkill,
5
+ * chmod, symlink creation, or a numeric POSIX open flag.
6
+ */
7
+ export const windowsNativeCapabilities = (platform) => {
8
+ if (platform !== "win32") {
9
+ const notApplicable = {
10
+ available: false,
11
+ reason: "Windows native authority is not applicable on this host",
12
+ proof: "not-applicable",
13
+ };
14
+ return {
15
+ job_object_process_ownership: notApplicable,
16
+ private_runtime_dacl: notApplicable,
17
+ reparse_safe_path_admission: notApplicable,
18
+ };
19
+ }
20
+ const notProven = {
21
+ available: false,
22
+ reason: WINDOWS_NATIVE_AUTHORITY_UNAVAILABLE_REASON,
23
+ proof: "not-proven",
24
+ };
25
+ return {
26
+ job_object_process_ownership: notProven,
27
+ private_runtime_dacl: notProven,
28
+ reparse_safe_path_admission: notProven,
29
+ };
30
+ };
31
+ /** Whether every native control needed for Windows isolation is proven. */
32
+ export const hasWindowsNativeAuthority = (platform) => Object.values(windowsNativeCapabilities(platform)).every(({ available }) => available);
@@ -1,61 +1,45 @@
1
+ import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
1
2
  import { err, ok } from "../domain/result.js";
2
3
  import { traverseDirectory } from "./ReferenceSourceReaderEntries.js";
3
- import { compareNames } from "./ReferenceSourceReaderPaths.js";
4
4
  import {} from "./ReferenceSourceReaderTypes.js";
5
5
  import { isAborted, noFollowOpenSupported, prepareRoot, } from "./ReferenceSourceReaderValidate.js";
6
- const DEFAULT_LIMITS = {
7
- maxBytes: 16 * 1024 * 1024,
8
- maxEntries: 10_000,
9
- maxDepth: 32,
10
- maxPathBytes: 4_096,
11
- };
12
6
  const PATH_RACE_LIMITATION = "Path identity is revalidated around operations; Node lacks portable descriptor-relative openat traversal, so a syscall-boundary pathname race remains.";
13
- /** Read a bounded source tree without intentionally following symbolic links. */
14
- export const readReferenceSource = async (root, limits = DEFAULT_LIMITS, options = {}) => {
7
+ /** Read a source tree without intentionally following symbolic links. */
8
+ export const readReferenceSource = async (root, options = {}) => {
15
9
  if (!noFollowOpenSupported())
16
10
  return err({
17
11
  tag: "reference-source-reader",
18
12
  code: "unsupported",
19
13
  message: "Safe no-follow file opens are unavailable",
20
14
  });
21
- const prepared = await prepareRoot(root, limits, options.signal);
15
+ const prepared = await prepareRoot(root, options.signal);
22
16
  if (!prepared.ok)
23
17
  return prepared;
24
18
  const { canonicalRoot, rootIdentity } = prepared.value;
25
19
  const state = {
26
20
  root: canonicalRoot,
27
21
  rootIdentity,
28
- limits,
29
22
  ...(options.signal === undefined ? {} : { signal: options.signal }),
30
23
  ...(options.shouldExclude === undefined
31
24
  ? {}
32
25
  : { shouldExclude: options.shouldExclude }),
33
26
  entries: [],
34
- pending: [{ path: canonicalRoot, depth: 0 }],
27
+ pending: [{ path: canonicalRoot }],
35
28
  bytesRead: 0,
36
- filesSeen: 0,
37
- truncated: false,
38
- stopped: false,
39
29
  };
40
30
  const traversal = await traverse(state);
41
31
  if (!traversal.ok)
42
32
  return traversal;
43
- state.entries.sort((left, right) => compareNames(left.path, right.path));
33
+ state.entries.sort((left, right) => compareUnicodeCodePoints(left.path, right.path));
44
34
  return ok({
45
35
  root: canonicalRoot,
46
36
  entries: state.entries,
47
37
  bytesRead: state.bytesRead,
48
- truncated: state.truncated,
49
- limitations: [
50
- PATH_RACE_LIMITATION,
51
- ...(state.stopped
52
- ? ["Traversal stopped because the entry limit was reached."]
53
- : []),
54
- ],
38
+ limitations: [PATH_RACE_LIMITATION],
55
39
  });
56
40
  };
57
41
  const traverse = async (state) => {
58
- while (state.pending.length > 0 && !state.stopped) {
42
+ while (state.pending.length > 0) {
59
43
  if (isAborted(state.signal))
60
44
  return err({
61
45
  tag: "reference-source-reader",
@@ -1,7 +1,9 @@
1
1
  import { readdir, readlink, realpath } from "node:fs/promises";
2
2
  import { dirname, join, resolve } from "node:path";
3
+ import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
3
4
  import { entryFailure, safeSize } from "./ReferenceSourceReaderErrors.js";
4
- import { compareNames, pathFromRoot, withinRoot, } from "./ReferenceSourceReaderPaths.js";
5
+ import { isPathWithinRoot } from "../domain/localPath.js";
6
+ import { pathFromRoot } from "./ReferenceSourceReaderPaths.js";
5
7
  import { readStableFile } from "./ReferenceSourceReaderFile.js";
6
8
  import { isAborted, sameFile, validateDirectory, bigLstat, } from "./ReferenceSourceReaderValidate.js";
7
9
  import {} from "./ReferenceSourceReaderTypes.js";
@@ -35,8 +37,6 @@ export const traverseDirectory = async (state, current) => {
35
37
  const result = await processEntry(state, current, name, directories);
36
38
  if (!result.ok)
37
39
  return result;
38
- if (state.stopped)
39
- break;
40
40
  }
41
41
  directories.reverse();
42
42
  state.pending.push(...directories);
@@ -44,7 +44,10 @@ export const traverseDirectory = async (state, current) => {
44
44
  };
45
45
  const readDirectoryNames = async (path) => {
46
46
  try {
47
- return { ok: true, value: (await readdir(path)).sort(compareNames) };
47
+ return {
48
+ ok: true,
49
+ value: (await readdir(path)).sort(compareUnicodeCodePoints),
50
+ };
48
51
  }
49
52
  catch {
50
53
  return { ok: false, message: "Directory could not be read" };
@@ -82,13 +85,6 @@ const processEntry = async (state, current, name, directories) => {
82
85
  };
83
86
  if (excluded.value)
84
87
  return { ok: true, value: undefined };
85
- if (!reserveEntry(state))
86
- return { ok: true, value: undefined };
87
- if (Buffer.byteLength(path) > state.limits.maxPathBytes) {
88
- state.entries.push(entryFailure(path, "unknown", "limit", "Path exceeds maxPathBytes"));
89
- state.truncated = true;
90
- return { ok: true, value: undefined };
91
- }
92
88
  const metadata = await readMetadata(absolute);
93
89
  if (!metadata.ok) {
94
90
  state.entries.push(entryFailure(path, "unknown", "io", metadata.message));
@@ -106,14 +102,8 @@ const processEntry = async (state, current, name, directories) => {
106
102
  if (metadata.value.isSymbolicLink())
107
103
  state.entries.push(await describeSymlink(state.root, absolute, path));
108
104
  else if (metadata.value.isDirectory()) {
109
- if (current.depth < state.limits.maxDepth) {
110
- state.entries.push({ status: "read", kind: "directory", path });
111
- directories.push({ path: absolute, depth: current.depth + 1 });
112
- }
113
- else {
114
- state.entries.push(entryFailure(path, "directory", "limit", "Directory exceeds maxDepth"));
115
- state.truncated = true;
116
- }
105
+ state.entries.push({ status: "read", kind: "directory", path });
106
+ directories.push({ path: absolute });
117
107
  }
118
108
  else if (!metadata.value.isFile())
119
109
  state.entries.push(entryFailure(path, "other", "unsupported", "Entry is not a regular file", safeSize(metadata.value.size)));
@@ -122,32 +112,23 @@ const processEntry = async (state, current, name, directories) => {
122
112
  return { ok: true, value: undefined };
123
113
  };
124
114
  const processFileEntry = async (state, absolute, path, metadata) => {
125
- const remaining = state.limits.maxBytes - state.bytesRead;
126
- if (metadata.size > BigInt(remaining)) {
127
- state.entries.push(entryFailure(path, "file", "limit", "File exceeds remaining maxBytes", safeSize(metadata.size)));
128
- state.truncated = true;
129
- return;
130
- }
131
115
  const result = await readStableFile({
132
116
  root: state.root,
133
117
  rootIdentity: state.rootIdentity,
134
118
  absolute,
135
119
  path,
136
120
  expected: metadata,
137
- remaining,
138
121
  ...(state.signal === undefined ? {} : { signal: state.signal }),
139
122
  });
140
123
  if (result.status === "read" && result.kind === "file")
141
124
  state.bytesRead += result.bytes.byteLength;
142
- else if (result.status === "failed" && result.code === "limit")
143
- state.truncated = true;
144
125
  state.entries.push(result);
145
126
  };
146
127
  const describeSymlink = async (root, absolute, path) => {
147
128
  try {
148
129
  const rawTarget = await readlink(absolute);
149
130
  const lexicalTarget = resolve(dirname(absolute), rawTarget);
150
- if (!withinRoot(root, lexicalTarget))
131
+ if (!isPathWithinRoot(root, lexicalTarget))
151
132
  return {
152
133
  status: "read",
153
134
  kind: "symlink",
@@ -157,7 +138,7 @@ const describeSymlink = async (root, absolute, path) => {
157
138
  };
158
139
  try {
159
140
  const canonicalTarget = await realpath(lexicalTarget);
160
- return withinRoot(root, canonicalTarget)
141
+ return isPathWithinRoot(root, canonicalTarget)
161
142
  ? {
162
143
  status: "read",
163
144
  kind: "symlink",
@@ -195,12 +176,3 @@ const applyExclusion = (shouldExclude, path) => {
195
176
  return { ok: false };
196
177
  }
197
178
  };
198
- const reserveEntry = (state) => {
199
- if (state.filesSeen < state.limits.maxEntries) {
200
- state.filesSeen += 1;
201
- return true;
202
- }
203
- state.truncated = true;
204
- state.stopped = true;
205
- return false;
206
- };
@@ -5,17 +5,9 @@ import { entryFailure, safeSize } from "./ReferenceSourceReaderErrors.js";
5
5
  import { isAborted, sameFile, validateDirectory, } from "./ReferenceSourceReaderValidate.js";
6
6
  import {} from "./ReferenceSourceReaderTypes.js";
7
7
  const READ_CHUNK_BYTES = 64 * 1024;
8
- const prepareFileRead = async (request) => {
9
- const { root, rootIdentity, absolute, path, expected, signal } = request;
10
- const parentBefore = await validateDirectory(root, rootIdentity, dirname(absolute));
11
- if (!parentBefore.ok)
12
- return {
13
- status: "failed",
14
- entry: entryFailure(path, "file", parentBefore.code, parentBefore.message, safeSize(expected.size)),
15
- };
16
- const handle = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW);
8
+ const prepareFileRead = async (request, handle) => {
9
+ const { path, expected, signal } = request;
17
10
  if (isAborted(signal)) {
18
- await handle.close().catch(() => undefined);
19
11
  return {
20
12
  status: "failed",
21
13
  entry: entryFailure(path, "file", "cancelled", "File read cancelled", safeSize(expected.size)),
@@ -23,16 +15,15 @@ const prepareFileRead = async (request) => {
23
15
  }
24
16
  const before = await handle.stat({ bigint: true });
25
17
  if (!sameFile(expected, before)) {
26
- await handle.close().catch(() => undefined);
27
18
  return {
28
19
  status: "failed",
29
20
  entry: entryFailure(path, "file", "changed", "File changed before it was read", safeSize(before.size)),
30
21
  };
31
22
  }
32
- return { status: "ready", handle, before, parentBefore };
23
+ return { status: "ready", before };
33
24
  };
34
25
  const readFileContents = async (request) => {
35
- const { handle, path, remaining, signal } = request;
26
+ const { handle, path, signal } = request;
36
27
  const chunks = [];
37
28
  let total = 0;
38
29
  for (;;) {
@@ -41,14 +32,8 @@ const readFileContents = async (request) => {
41
32
  status: "failed",
42
33
  entry: entryFailure(path, "file", "cancelled", "File read cancelled", total),
43
34
  };
44
- const capacity = Math.min(READ_CHUNK_BYTES, remaining + 1 - total);
45
- if (capacity <= 0)
46
- return {
47
- status: "failed",
48
- entry: entryFailure(path, "file", "limit", "File exceeds remaining maxBytes", total),
49
- };
50
- const chunk = Buffer.allocUnsafe(capacity);
51
- const read = await handle.read(chunk, 0, capacity, null);
35
+ const chunk = Buffer.allocUnsafe(READ_CHUNK_BYTES);
36
+ const read = await handle.read(chunk, 0, chunk.byteLength, null);
52
37
  if (isAborted(signal))
53
38
  return {
54
39
  status: "failed",
@@ -57,11 +42,6 @@ const readFileContents = async (request) => {
57
42
  if (read.bytesRead === 0)
58
43
  break;
59
44
  total += read.bytesRead;
60
- if (total > remaining)
61
- return {
62
- status: "failed",
63
- entry: entryFailure(path, "file", "limit", "File exceeds remaining maxBytes", total),
64
- };
65
45
  chunks.push(chunk.subarray(0, read.bytesRead));
66
46
  }
67
47
  return { status: "ok", chunks, total };
@@ -83,17 +63,19 @@ const finalizeFileRead = async (request) => {
83
63
  };
84
64
  };
85
65
  export const readStableFile = async (request) => {
86
- const { root, rootIdentity, absolute, path, expected, remaining, signal } = request;
66
+ const { root, rootIdentity, absolute, path, expected, signal } = request;
87
67
  let handle;
88
68
  try {
89
- const prepared = await prepareFileRead(request);
69
+ const parentBefore = await validateDirectory(root, rootIdentity, dirname(absolute));
70
+ if (!parentBefore.ok)
71
+ return entryFailure(path, "file", parentBefore.code, parentBefore.message, safeSize(expected.size));
72
+ handle = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW);
73
+ const prepared = await prepareFileRead(request, handle);
90
74
  if (prepared.status === "failed")
91
75
  return prepared.entry;
92
- handle = prepared.handle;
93
76
  const contents = await readFileContents({
94
77
  handle,
95
78
  path,
96
- remaining,
97
79
  ...(signal === undefined ? {} : { signal }),
98
80
  });
99
81
  if (contents.status === "failed")
@@ -105,7 +87,7 @@ export const readStableFile = async (request) => {
105
87
  path,
106
88
  handle,
107
89
  before: prepared.before,
108
- parentBefore: prepared.parentBefore,
90
+ parentBefore,
109
91
  chunks: contents.chunks,
110
92
  total: contents.total,
111
93
  });
@@ -1,23 +1,8 @@
1
- import { isAbsolute, relative, sep } from "node:path";
2
- export const withinRoot = (root, path) => {
3
- const value = relative(root, path);
4
- return (value === "" ||
5
- (value !== ".." && !value.startsWith(`..${sep}`) && !isAbsolute(value)));
6
- };
1
+ import { relative, sep } from "node:path";
2
+ import { isPathWithinRoot } from "../domain/localPath.js";
7
3
  export const pathFromRoot = (root, path) => {
8
4
  const value = relative(root, path);
9
- return withinRoot(root, path)
5
+ return isPathWithinRoot(root, path)
10
6
  ? value.split(sep).join("/") || "."
11
7
  : "<outside-root>";
12
8
  };
13
- export const compareNames = (left, right) => {
14
- const leftPoints = [...left].map((value) => value.codePointAt(0) ?? 0);
15
- const rightPoints = [...right].map((value) => value.codePointAt(0) ?? 0);
16
- const length = Math.min(leftPoints.length, rightPoints.length);
17
- for (let index = 0; index < length; index += 1) {
18
- const difference = (leftPoints[index] ?? 0) - (rightPoints[index] ?? 0);
19
- if (difference !== 0)
20
- return difference;
21
- }
22
- return leftPoints.length - rightPoints.length;
23
- };
@@ -2,7 +2,7 @@ import { constants } from "node:fs";
2
2
  import { lstat, realpath } from "node:fs/promises";
3
3
  import { err, ok } from "../domain/result.js";
4
4
  import { cancelled, failure } from "./ReferenceSourceReaderErrors.js";
5
- import { withinRoot } from "./ReferenceSourceReaderPaths.js";
5
+ import { isPathWithinRoot } from "../domain/localPath.js";
6
6
  import {} from "./ReferenceSourceReaderTypes.js";
7
7
  export const bigLstat = (path) => lstat(path, { bigint: true });
8
8
  export const sameFile = (left, right) => left.dev === right.dev &&
@@ -11,7 +11,6 @@ export const sameFile = (left, right) => left.dev === right.dev &&
11
11
  left.mtimeNs === right.mtimeNs &&
12
12
  left.ctimeNs === right.ctimeNs;
13
13
  export const isAborted = (signal) => signal?.aborted === true;
14
- const validLimits = (limits) => Object.values(limits).every((value) => Number.isSafeInteger(value) && value > 0);
15
14
  export const noFollowOpenSupported = () => Number.isSafeInteger(constants.O_NOFOLLOW) && constants.O_NOFOLLOW !== 0;
16
15
  export const validateDirectory = async (root, rootIdentity, path) => {
17
16
  try {
@@ -32,7 +31,7 @@ export const validateDirectory = async (root, rootIdentity, path) => {
32
31
  message: "Directory identity changed",
33
32
  };
34
33
  const canonical = await realpath(path);
35
- if (canonical !== path || !withinRoot(root, canonical))
34
+ if (canonical !== path || !isPathWithinRoot(root, canonical))
36
35
  return {
37
36
  ok: false,
38
37
  code: "changed",
@@ -48,9 +47,7 @@ export const validateDirectory = async (root, rootIdentity, path) => {
48
47
  };
49
48
  }
50
49
  };
51
- export const prepareRoot = async (root, limits, signal) => {
52
- if (!validLimits(limits))
53
- return err(failure("invalid-limits", "Reader limits must be positive integers"));
50
+ export const prepareRoot = async (root, signal) => {
54
51
  if (isAborted(signal))
55
52
  return err(cancelled());
56
53
  try {