rea-agents 4.1.0 → 5.0.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 (577) hide show
  1. package/README.md +184 -86
  2. package/bridge/android/ReaJadxBridge.java +247 -0
  3. package/bridge/native/NativeUIChildren.swift +27 -0
  4. package/bridge/native/ReaNativeUI.swift +30 -16
  5. package/dist/android/AndroidTargetSnapshot.js +5 -3
  6. package/dist/android/JadxAnalysis.js +8 -6
  7. package/dist/android/JadxConfiguration.js +19 -3
  8. package/dist/android/JadxMcpTransport.js +43 -16
  9. package/dist/android/JadxProtocol.js +8 -0
  10. package/dist/android/JadxProvider.js +117 -28
  11. package/dist/android/JadxRelease.js +8 -0
  12. package/dist/android/JadxSession.js +32 -18
  13. package/dist/application/AppBundleExecutable.js +141 -0
  14. package/dist/application/ArtifactInventory/classify.js +1 -1
  15. package/dist/application/ArtifactInventory/scanCanonical.js +1 -1
  16. package/dist/application/ArtifactInventory/scanReader.js +1 -1
  17. package/dist/application/ArtifactInventory.js +1 -1
  18. package/dist/application/BinaryTargetResolver.js +9 -64
  19. package/dist/application/CapabilityInventory.js +61 -3
  20. package/dist/application/ClientConfigurationDocument.js +72 -12
  21. package/dist/application/ClientRegistrationStatus.js +7 -8
  22. package/dist/application/DirectAnalysis.js +12 -14
  23. package/dist/application/DirectAnalysisStatus.js +4 -5
  24. package/dist/application/DoctorDiagnostics.js +3 -3
  25. package/dist/application/EnhancedTools.js +4 -4
  26. package/dist/application/EvidenceBundleCommands.js +1 -1
  27. package/dist/application/FilesystemSnapshot.js +20 -5
  28. package/dist/application/InvestigationProviders.js +6 -0
  29. package/dist/application/LinuxHopper.js +8 -2
  30. package/dist/application/OptionalObservationProviders.js +3 -0
  31. package/dist/application/ProcessCaptureCapability.js +1 -1
  32. package/dist/application/ProcessCaptureLifecycle.js +2 -2
  33. package/dist/application/ProcessCli.js +5 -1
  34. package/dist/application/ProcessHarness.js +20 -9
  35. package/dist/application/ReconstructionCoverageService.js +2 -6
  36. package/dist/application/ReconstructionObligationCandidates.js +5 -2
  37. package/dist/application/ReferenceSourceImport.js +2 -0
  38. package/dist/application/ReferenceSourceImportEntries.js +20 -3
  39. package/dist/application/ReferenceSourceImportTypes.js +5 -0
  40. package/dist/application/Setup.js +10 -2
  41. package/dist/application/SetupClientConfiguration.js +19 -16
  42. package/dist/application/SetupHost.js +18 -3
  43. package/dist/application/SetupPlan.js +1 -1
  44. package/dist/application/Uninstall.js +23 -17
  45. package/dist/application/UpdateMaintenance.js +3 -3
  46. package/dist/application/ValidateSelectedWebScript.js +27 -0
  47. package/dist/application/WebModuleTraceService.js +209 -0
  48. package/dist/application/WebRuntimeService.js +73 -0
  49. package/dist/application/WebScriptExportService.js +115 -0
  50. package/dist/application/WebSourceLocationService.js +160 -0
  51. package/dist/application/{AndroidAnalysisService.js → android/AndroidAnalysisService.js} +6 -6
  52. package/dist/application/{AndroidApplicationService.js → android/AndroidApplicationService.js} +3 -3
  53. package/dist/application/{AppleApplicationService.js → apple/AppleApplicationService.js} +5 -5
  54. package/dist/application/{AnalysisClientCleanup.js → binary/AnalysisClientCleanup.js} +2 -2
  55. package/dist/application/{AnalysisProviderEvaluation.js → binary/AnalysisProviderEvaluation.js} +4 -4
  56. package/dist/application/{AnalysisProviderRegistry.js → binary/AnalysisProviderRegistry.js} +5 -5
  57. package/dist/application/{AnalysisSnapshotCache.js → binary/AnalysisSnapshotCache.js} +7 -9
  58. package/dist/application/{AnalysisSnapshotFiles.js → binary/AnalysisSnapshotFiles.js} +4 -4
  59. package/dist/application/{BinarySession.js → binary/BinarySession.js} +12 -10
  60. package/dist/application/{BinarySessionComposition.js → binary/BinarySessionComposition.js} +2 -1
  61. package/dist/application/{BinarySessionExecution.js → binary/BinarySessionExecution.js} +9 -7
  62. package/dist/application/{BinarySessionOpen.js → binary/BinarySessionOpen.js} +6 -6
  63. package/dist/application/{BinarySessionRecords.js → binary/BinarySessionRecords.js} +28 -40
  64. package/dist/application/{CompositeProvider.js → binary/CompositeProvider.js} +2 -2
  65. package/dist/application/{LazyAnalysisProvider.js → binary/LazyAnalysisProvider.js} +6 -6
  66. package/dist/application/{SessionProviderRouter.js → binary/SessionProviderRouter.js} +7 -7
  67. package/dist/application/{FirmwareAnalysisService.js → firmware/FirmwareAnalysisService.js} +5 -5
  68. package/dist/application/{EvidenceLedger.js → investigation/EvidenceLedger.js} +44 -7
  69. package/dist/application/investigation/InvestigationRecords.js +69 -0
  70. package/dist/application/{UnknownEvidence.js → investigation/UnknownEvidence.js} +1 -1
  71. package/dist/application/{ElectronActiveEvidence.js → javascript/ElectronActiveEvidence.js} +3 -3
  72. package/dist/application/javascript/ElectronActiveObservationPort.js +1 -0
  73. package/dist/application/{ElectronActiveObservationService.js → javascript/ElectronActiveObservationService.js} +3 -3
  74. package/dist/application/{ElectronBoundaryAnalysis.js → javascript/ElectronBoundaryAnalysis.js} +1 -1
  75. package/dist/application/{ElectronBoundaryGraphContext.js → javascript/ElectronBoundaryGraphContext.js} +1 -1
  76. package/dist/application/{ElectronEvidence.js → javascript/ElectronEvidence.js} +2 -2
  77. package/dist/application/javascript/ElectronObservationPort.js +1 -0
  78. package/dist/application/{ElectronObservationService.js → javascript/ElectronObservationService.js} +3 -3
  79. package/dist/application/{JavaScriptApplicationEvidence.js → javascript/JavaScriptApplicationEvidence.js} +3 -3
  80. package/dist/application/{JavaScriptApplicationEvidenceGraph.js → javascript/JavaScriptApplicationEvidenceGraph.js} +5 -5
  81. package/dist/application/{JavaScriptApplicationService.js → javascript/JavaScriptApplicationService.js} +10 -10
  82. package/dist/application/{JavaScriptApplicationWorkflowEvidence.js → javascript/JavaScriptApplicationWorkflowEvidence.js} +3 -3
  83. package/dist/application/{JavaScriptApplicationWorkflowService.js → javascript/JavaScriptApplicationWorkflowService.js} +12 -12
  84. package/dist/application/{JavaScriptArtifactAnalysis.js → javascript/JavaScriptArtifactAnalysis.js} +8 -24
  85. package/dist/application/javascript/JavaScriptArtifactAnalysisTypes.js +1 -0
  86. package/dist/application/{JavaScriptArtifactGraphAccumulator.js → javascript/JavaScriptArtifactGraphAccumulator.js} +16 -2
  87. package/dist/application/{JavaScriptArtifactGraphBuilder.js → javascript/JavaScriptArtifactGraphBuilder.js} +2 -2
  88. package/dist/application/{JavaScriptArtifactGraphContext.js → javascript/JavaScriptArtifactGraphContext.js} +1 -1
  89. package/dist/application/{JavaScriptArtifactGraphDocuments.js → javascript/JavaScriptArtifactGraphDocuments.js} +1 -1
  90. package/dist/application/{JavaScriptArtifactGraphFindings.js → javascript/JavaScriptArtifactGraphFindings.js} +20 -7
  91. package/dist/application/{JavaScriptArtifactGraphStructure.js → javascript/JavaScriptArtifactGraphStructure.js} +1 -1
  92. package/dist/application/{JavaScriptArtifactPathResolution.js → javascript/JavaScriptArtifactPathResolution.js} +6 -12
  93. package/dist/application/{JavaScriptArtifactReconstruction.js → javascript/JavaScriptArtifactReconstruction.js} +4 -8
  94. package/dist/application/{JavaScriptJsonModules.js → javascript/JavaScriptJsonModules.js} +1 -1
  95. package/dist/application/{JavaScriptModuleRelationships.js → javascript/JavaScriptModuleRelationships.js} +2 -2
  96. package/dist/application/javascript/JavaScriptRecoveryPort.js +1 -0
  97. package/dist/application/javascript/JavaScriptRecoveryService.js +52 -0
  98. package/dist/application/{JavaScriptReturnShapeProjection.js → javascript/JavaScriptReturnShapeProjection.js} +3 -3
  99. package/dist/application/{JavaScriptRuntimeObservationEvidence.js → javascript/JavaScriptRuntimeObservationEvidence.js} +2 -2
  100. package/dist/application/javascript/JavaScriptRuntimeObservationPort.js +1 -0
  101. package/dist/application/{JavaScriptRuntimeObservationService.js → javascript/JavaScriptRuntimeObservationService.js} +3 -3
  102. package/dist/application/{JavaScriptRuntimeReconciliationEvidence.js → javascript/JavaScriptRuntimeReconciliationEvidence.js} +3 -3
  103. package/dist/application/{JavaScriptRuntimeReconciliationService.js → javascript/JavaScriptRuntimeReconciliationService.js} +6 -6
  104. package/dist/application/{JavaScriptSemanticGraphAsyncProjection.js → javascript/JavaScriptSemanticGraphAsyncProjection.js} +1 -1
  105. package/dist/application/{JavaScriptSemanticGraphBuilder.js → javascript/JavaScriptSemanticGraphBuilder.js} +5 -3
  106. package/dist/application/{JavaScriptSemanticGraphChildProcessProjection.js → javascript/JavaScriptSemanticGraphChildProcessProjection.js} +1 -1
  107. package/dist/application/{JavaScriptSemanticGraphConstruction.js → javascript/JavaScriptSemanticGraphConstruction.js} +3 -2
  108. package/dist/application/{JavaScriptSemanticGraphDataProjection.js → javascript/JavaScriptSemanticGraphDataProjection.js} +1 -1
  109. package/dist/application/{JavaScriptSemanticGraphFingerprintProjection.js → javascript/JavaScriptSemanticGraphFingerprintProjection.js} +1 -1
  110. package/dist/application/{JavaScriptSemanticGraphFlowProjection.js → javascript/JavaScriptSemanticGraphFlowProjection.js} +2 -2
  111. package/dist/application/{JavaScriptSemanticGraphObjectProjection.js → javascript/JavaScriptSemanticGraphObjectProjection.js} +1 -1
  112. package/dist/application/{JavaScriptSemanticGraphProjection.js → javascript/JavaScriptSemanticGraphProjection.js} +2 -2
  113. package/dist/application/{JavaScriptSemanticGraphResourceProjection.js → javascript/JavaScriptSemanticGraphResourceProjection.js} +1 -1
  114. package/dist/application/{JavaScriptSemanticTraceService.js → javascript/JavaScriptSemanticTraceService.js} +6 -6
  115. package/dist/application/{ManagedApplicationGraphService.js → managed/ManagedApplicationGraphService.js} +7 -7
  116. package/dist/application/{ManagedMemberComparisonService.js → managed/ManagedMemberComparisonService.js} +10 -10
  117. package/dist/application/{ManagedNativeVerificationService.js → managed/ManagedNativeVerificationService.js} +7 -7
  118. package/dist/application/{ManagedReconstructionService.js → managed/ManagedReconstructionService.js} +7 -7
  119. package/dist/application/{NativeApiInspection.js → native/NativeApiInspection.js} +1 -1
  120. package/dist/application/{NativeCallRoutes.js → native/NativeCallRoutes.js} +3 -3
  121. package/dist/application/{NativeDispatchMetadataInspection.js → native/NativeDispatchMetadataInspection.js} +4 -4
  122. package/dist/application/{NativeUiActionTrace.js → native/NativeUiActionTrace.js} +7 -7
  123. package/dist/application/{NativeValueTrace.js → native/NativeValueTrace.js} +6 -6
  124. package/dist/{application/ArtifactInventory/hash.js → artifacts/ArtifactHash.js} +4 -2
  125. package/dist/artifacts/ArtifactPaths.js +3 -3
  126. package/dist/artifacts/ArtifactProvider.js +7 -37
  127. package/dist/artifacts/ArtifactProviderMetadata.js +36 -0
  128. package/dist/artifacts/AsarArtifactReader.js +195 -23
  129. package/dist/artifacts/AsarEntryStream.js +76 -0
  130. package/dist/artifacts/DirectoryArtifactReader.js +41 -7
  131. package/dist/artifacts/NativeDmgArtifactReader.js +161 -9
  132. package/dist/{application → artifacts/apple}/AppleAssetCatalogAnalysis.js +4 -4
  133. package/dist/{application → artifacts/apple}/InterfaceBuilderAnalysis.js +125 -51
  134. package/dist/artifacts/{KeyedArchiveReader.js → apple/KeyedArchiveReader.js} +21 -27
  135. package/dist/artifacts/apple/NibViewHierarchy.js +150 -0
  136. package/dist/{application → artifacts/javascript}/JavaScriptArtifactFiles.js +27 -6
  137. package/dist/artifacts/javascript/JavaScriptArtifactReader.js +6 -0
  138. package/dist/artifacts/readStableArtifact.js +52 -0
  139. package/dist/browser/BrowserScenarioSecrets.js +50 -8
  140. package/dist/browser/CdpAuthorizedMainFrame.js +4 -4
  141. package/dist/browser/CdpAuthorizedTarget.js +22 -0
  142. package/dist/browser/CdpBrowserProvider.js +4 -15
  143. package/dist/browser/CdpCaptureDocuments.js +33 -21
  144. package/dist/browser/CdpCaptureEventBodyShapes.js +3 -3
  145. package/dist/browser/CdpCaptureEventHandlers.js +26 -26
  146. package/dist/browser/CdpCaptureEventHelpers.js +6 -6
  147. package/dist/browser/CdpCaptureStorage.js +10 -8
  148. package/dist/browser/CdpCaptureStorageFingerprints.js +24 -22
  149. package/dist/browser/CdpCaptureValues.js +2 -2
  150. package/dist/browser/CdpCommandRejection.js +17 -0
  151. package/dist/browser/CdpConnection.js +51 -11
  152. package/dist/browser/CdpElectronInspection.js +10 -10
  153. package/dist/browser/CdpElectronProvider.js +3 -6
  154. package/dist/browser/CdpElectronScriptEvents.js +6 -6
  155. package/dist/browser/CdpElectronScripts.js +2 -2
  156. package/dist/browser/CdpElectronWorkers.js +4 -4
  157. package/dist/browser/CdpObservationSession.js +18 -23
  158. package/dist/browser/CdpPageCapture.js +4 -4
  159. package/dist/browser/CdpPageCaptureScripts.js +2 -2
  160. package/dist/browser/CdpPageCaptureWorkers.js +9 -9
  161. package/dist/browser/CdpSafeMetadata.js +48 -10
  162. package/dist/browser/CdpScreenshot.js +5 -5
  163. package/dist/browser/CdpTargetEvents.js +8 -0
  164. package/dist/browser/CdpTargetSession.js +2 -2
  165. package/dist/browser/CdpWebMcpDiscovery.js +22 -16
  166. package/dist/browser/PlaywrightBrowserScenarioProvider.js +7 -6
  167. package/dist/browser/PlaywrightElectronActiveProvider.js +3 -6
  168. package/dist/browser/PlaywrightScenarioEvents.js +59 -51
  169. package/dist/browser/PlaywrightScenarioSession.js +8 -1
  170. package/dist/browser/WebSourceMapFetcher.js +37 -53
  171. package/dist/browser/assets/LocalWebScriptArtifacts.js +87 -0
  172. package/dist/browser/assets/PageScriptCapture.js +32 -0
  173. package/dist/browser/assets/PublishWebScripts.js +74 -0
  174. package/dist/browser/assets/ScenarioScriptCapture.js +76 -0
  175. package/dist/browser/assets/ScriptCaptureAdapters.js +57 -0
  176. package/dist/browser/assets/WebArtifactReads.js +56 -0
  177. package/dist/browser/assets/WebSourceLocationArtifacts.js +40 -0
  178. package/dist/browser/execution/CdpEventListeners.js +79 -0
  179. package/dist/browser/execution/CdpExecutionCapture.js +135 -0
  180. package/dist/browser/execution/CdpExecutionCollection.js +57 -0
  181. package/dist/browser/execution/CdpExecutionWindow.js +100 -0
  182. package/dist/browser/execution/CdpListenerSelector.js +22 -0
  183. package/dist/browser/execution/CdpPreciseCoverage.js +48 -0
  184. package/dist/browser/execution/CdpRuntimeInitiator.js +18 -0
  185. package/dist/browser/execution/CdpRuntimeProtocol.js +106 -0
  186. package/dist/browser/execution/CdpRuntimeRequests.js +81 -0
  187. package/dist/browser/execution/CdpRuntimeSession.js +163 -0
  188. package/dist/browser/execution/CdpRuntimeSources.js +223 -0
  189. package/dist/browser/execution/CdpWebRuntimeProvider.js +51 -0
  190. package/dist/browser/modules/NativeModuleResolver.js +210 -0
  191. package/dist/browser/modules/WebModuleArtifacts.js +40 -0
  192. package/dist/browser/network/PlaywrightNetworkContent.js +71 -0
  193. package/dist/browser/network/PlaywrightScenarioNetwork.js +180 -0
  194. package/dist/browser/providerIdentities.js +24 -0
  195. package/dist/catalogIdentity.js +23 -15
  196. package/dist/cli/androidCommands.js +13 -3
  197. package/dist/cli/applicationCommands.js +39 -8
  198. package/dist/cli/artifactCommands.js +1 -1
  199. package/dist/cli/browserAdvancedCommands.js +27 -9
  200. package/dist/cli/coreAnalysisCommands.js +5 -493
  201. package/dist/cli/coreBinaryCommands.js +211 -0
  202. package/dist/cli/coreNativeCommands.js +293 -0
  203. package/dist/cli/electronCommands.js +13 -18
  204. package/dist/cli/firmwareCommands.js +3 -3
  205. package/dist/cli/javascriptApplicationAnalysis.js +1 -1
  206. package/dist/cli/javascriptRecoveryCommands.js +45 -0
  207. package/dist/cli/managedCommands.js +4 -4
  208. package/dist/cli/managedProjectGraphCommand.js +1 -1
  209. package/dist/cli/referenceSourceImportStatus.js +6 -1
  210. package/dist/cli/utilityCommands.js +47 -23
  211. package/dist/cli/webModuleCommands.js +56 -0
  212. package/dist/cli/webRuntimeCommands.js +60 -0
  213. package/dist/cli/webScriptCommands.js +31 -0
  214. package/dist/cli/webSourceLocationCommands.js +42 -0
  215. package/dist/cli.js +10 -0
  216. package/dist/cliBrowserContext.js +4 -2
  217. package/dist/cliBrowserScenarioCommands.js +4 -3
  218. package/dist/cliCommandNames.js +8 -0
  219. package/dist/cliJavaScriptRuntimeCommands.js +6 -4
  220. package/dist/cliJsonInput.js +9 -2
  221. package/dist/cliOutput.js +37 -11
  222. package/dist/composition/android.js +3 -0
  223. package/dist/composition/auxiliaryAnalysisProviders.js +30 -0
  224. package/dist/composition/binary.js +25 -0
  225. package/dist/composition/browserObservation.js +3 -0
  226. package/dist/composition/browserScenario.js +3 -0
  227. package/dist/composition/directAnalysis.js +17 -0
  228. package/dist/composition/electronObservation.js +3 -0
  229. package/dist/composition/electronScenario.js +3 -0
  230. package/dist/composition/firmware.js +3 -0
  231. package/dist/composition/javascriptRecovery.js +3 -0
  232. package/dist/composition/javascriptRuntimeObservation.js +3 -0
  233. package/dist/composition/optionalObservationProviders.js +49 -0
  234. package/dist/composition/webModules.js +5 -0
  235. package/dist/composition/webRuntime.js +4 -0
  236. package/dist/composition/webSourceLocations.js +5 -0
  237. package/dist/config/parseConfig.js +22 -3
  238. package/dist/contracts/{androidToolContracts.js → android/androidToolContracts.js} +5 -5
  239. package/dist/contracts/applicationToolContracts.js +43 -8
  240. package/dist/contracts/artifactToolContracts.js +2 -2
  241. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  242. package/dist/contracts/enhancedInputs.js +1 -1
  243. package/dist/contracts/{firmwareToolContracts.js → firmware/firmwareToolContracts.js} +5 -5
  244. package/dist/contracts/{applicationWorkflowInputContracts.js → javascript/applicationWorkflowInputContracts.js} +6 -6
  245. package/dist/contracts/{electronToolContracts.js → javascript/electronToolContracts.js} +6 -6
  246. package/dist/contracts/{javascriptApplicationWorkflowExamples.js → javascript/javascriptApplicationWorkflowExamples.js} +3 -3
  247. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +23 -0
  248. package/dist/contracts/{javascriptRuntimeObservationToolContracts.js → javascript/javascriptRuntimeObservationToolContracts.js} +3 -3
  249. package/dist/contracts/{javascriptRuntimeReconciliationExample.js → javascript/javascriptRuntimeReconciliationExample.js} +5 -5
  250. package/dist/contracts/{managedToolContracts.js → managed/managedToolContracts.js} +3 -3
  251. package/dist/contracts/{managedWorkflowExamples.js → managed/managedWorkflowExamples.js} +1 -1
  252. package/dist/contracts/{managedWorkflowToolContracts.js → managed/managedWorkflowToolContracts.js} +6 -6
  253. package/dist/contracts/mobileApplicationGraphExamples.js +105 -0
  254. package/dist/contracts/{nativeToolContracts.js → native/nativeToolContracts.js} +14 -7
  255. package/dist/contracts/officialToolContracts.js +3 -3
  256. package/dist/contracts/sessionToolContracts.js +1 -1
  257. package/dist/contracts/toolContracts.js +13 -7
  258. package/dist/contracts/toolEffects.js +32 -0
  259. package/dist/contracts/toolOutputSchemaGroups.js +18 -18
  260. package/dist/contracts/webRuntimeToolContracts.js +43 -0
  261. package/dist/contracts/webScriptToolContracts.js +68 -0
  262. package/dist/domain/analysisErrorCore.js +4 -2
  263. package/dist/domain/analysisErrorProjection.js +1 -0
  264. package/dist/domain/{androidApplication.js → android/androidApplication.js} +7 -6
  265. package/dist/domain/apple/appleApplication.js +277 -0
  266. package/dist/domain/{appleAssetCatalog.js → apple/appleAssetCatalog.js} +2 -2
  267. package/dist/domain/apple/appleBundleAnatomy.js +236 -0
  268. package/dist/domain/{interfaceBuilderGraph.js → apple/interfaceBuilderGraph.js} +47 -314
  269. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +411 -0
  270. package/dist/domain/{keyedArchive.js → apple/keyedArchive.js} +10 -9
  271. package/dist/domain/apple/plistValue.js +35 -0
  272. package/dist/domain/artifactInventoryEvidence.js +12 -2
  273. package/dist/domain/artifactInventorySnapshot.js +1 -0
  274. package/dist/domain/artifactOperationError.js +5 -1
  275. package/dist/domain/artifactPathSyntax.js +26 -0
  276. package/dist/domain/browserNetworkEvidence.js +82 -0
  277. package/dist/domain/browserObservationError.js +2 -0
  278. package/dist/domain/browserObservationSchemas.js +2 -1
  279. package/dist/domain/browserScenarioCapture.js +22 -0
  280. package/dist/domain/browserScenarioCaptureValues.js +25 -0
  281. package/dist/domain/browserScenarioDiff.js +6 -3
  282. package/dist/domain/browserScenarioDiffEvidence.js +35 -1
  283. package/dist/domain/browserScenarioValues.js +12 -1
  284. package/dist/domain/browserSession.js +2 -7
  285. package/dist/domain/bundleComparison.js +2 -1
  286. package/dist/domain/callPath.js +52 -44
  287. package/dist/domain/comparisonStatus.js +39 -0
  288. package/dist/domain/evidenceBundle.js +98 -35
  289. package/dist/domain/{firmwareAnalysis.js → firmware/firmwareAnalysis.js} +2 -2
  290. package/dist/domain/functionComparisonNormalization.js +11 -13
  291. package/dist/domain/hopperValues.js +2 -2
  292. package/dist/domain/inputIssueProjection.js +17 -2
  293. package/dist/domain/{electronObservation.js → javascript/electronObservation.js} +5 -11
  294. package/dist/domain/{electronStaticAnalysisBrowser.js → javascript/electronStaticAnalysisBrowser.js} +4 -3
  295. package/dist/domain/{electronStaticAnalysisIpc.js → javascript/electronStaticAnalysisIpc.js} +2 -2
  296. package/dist/domain/{electronStaticAnalysisNative.js → javascript/electronStaticAnalysisNative.js} +12 -13
  297. package/dist/domain/javascript/electronStaticAnalysisTypes.js +1 -0
  298. package/dist/domain/{electronStaticAnalysisValues.js → javascript/electronStaticAnalysisValues.js} +3 -3
  299. package/dist/domain/{javascriptApplicationAnalysis.js → javascript/javascriptApplicationAnalysis.js} +2 -2
  300. package/dist/domain/{javascriptApplicationChangeGraph.js → javascript/javascriptApplicationChangeGraph.js} +1 -1
  301. package/dist/domain/{javascriptApplicationEvidenceSchemas.js → javascript/javascriptApplicationEvidenceSchemas.js} +6 -4
  302. package/dist/domain/{javascriptApplicationGraph.js → javascript/javascriptApplicationGraph.js} +2 -2
  303. package/dist/domain/{javascriptApplicationGraphSchemas.js → javascript/javascriptApplicationGraphSchemas.js} +2 -2
  304. package/dist/domain/{javascriptApplicationVersionComparison.js → javascript/javascriptApplicationVersionComparison.js} +2 -2
  305. package/dist/domain/{javascriptApplicationVersionComparisonSchemas.js → javascript/javascriptApplicationVersionComparisonSchemas.js} +3 -3
  306. package/dist/domain/{javascriptApplicationVersionItems.js → javascript/javascriptApplicationVersionItems.js} +2 -2
  307. package/dist/domain/{javascriptApplicationVersionKeys.js → javascript/javascriptApplicationVersionKeys.js} +16 -9
  308. package/dist/domain/javascript/javascriptArtifactFiles.js +1 -0
  309. package/dist/domain/{javascriptAstFingerprint.js → javascript/javascriptAstFingerprint.js} +38 -22
  310. package/dist/domain/javascript/javascriptAstValues.js +23 -0
  311. package/dist/domain/{javascriptExportShapeComparison.js → javascript/javascriptExportShapeComparison.js} +1 -1
  312. package/dist/domain/{javascriptExportShapeComparisonSchemas.js → javascript/javascriptExportShapeComparisonSchemas.js} +2 -2
  313. package/dist/domain/{javascriptExportShapeSelection.js → javascript/javascriptExportShapeSelection.js} +1 -1
  314. package/dist/domain/{javascriptExportShapeVariants.js → javascript/javascriptExportShapeVariants.js} +1 -1
  315. package/dist/domain/{javascriptFeatureSeed.js → javascript/javascriptFeatureSeed.js} +4 -3
  316. package/dist/domain/{javascriptFeatureTrace.js → javascript/javascriptFeatureTrace.js} +2 -2
  317. package/dist/domain/{javascriptFeatureTraceSchemas.js → javascript/javascriptFeatureTraceSchemas.js} +32 -18
  318. package/dist/domain/{javascriptFeatureTraversal.js → javascript/javascriptFeatureTraversal.js} +6 -2
  319. package/dist/domain/{javascriptNativeHandoff.js → javascript/javascriptNativeHandoff.js} +1 -1
  320. package/dist/domain/javascript/javascriptRecovery.js +88 -0
  321. package/dist/domain/{javascriptRuntimeLoadState.js → javascript/javascriptRuntimeLoadState.js} +1 -1
  322. package/dist/domain/{javascriptRuntimeObservation.js → javascript/javascriptRuntimeObservation.js} +2 -2
  323. package/dist/domain/{javascriptRuntimeReconciliationActive.js → javascript/javascriptRuntimeReconciliationActive.js} +3 -3
  324. package/dist/domain/{javascriptRuntimeReconciliationGraph.js → javascript/javascriptRuntimeReconciliationGraph.js} +1 -1
  325. package/dist/domain/{javascriptRuntimeReconciliationMatching.js → javascript/javascriptRuntimeReconciliationMatching.js} +2 -2
  326. package/dist/domain/{javascriptRuntimeReconciliationParsing.js → javascript/javascriptRuntimeReconciliationParsing.js} +5 -5
  327. package/dist/domain/{javascriptRuntimeReconciliationResult.js → javascript/javascriptRuntimeReconciliationResult.js} +2 -2
  328. package/dist/domain/{javascriptRuntimeReconciliationSchemas.js → javascript/javascriptRuntimeReconciliationSchemas.js} +4 -4
  329. package/dist/domain/{javascriptRuntimeStaticCandidates.js → javascript/javascriptRuntimeStaticCandidates.js} +1 -1
  330. package/dist/domain/{javascriptSemanticAnalysis.js → javascript/javascriptSemanticAnalysis.js} +40 -14
  331. package/dist/domain/{javascriptSemanticAsyncEffects.js → javascript/javascriptSemanticAsyncEffects.js} +2 -1
  332. package/dist/domain/{javascriptSemanticCallResolution.js → javascript/javascriptSemanticCallResolution.js} +10 -5
  333. package/dist/domain/{javascriptSemanticCalls.js → javascript/javascriptSemanticCalls.js} +7 -4
  334. package/dist/domain/{javascriptSemanticChildProcesses.js → javascript/javascriptSemanticChildProcesses.js} +4 -2
  335. package/dist/domain/{javascriptSemanticDataEffectHelpers.js → javascript/javascriptSemanticDataEffectHelpers.js} +7 -6
  336. package/dist/domain/{javascriptSemanticDataEffects.js → javascript/javascriptSemanticDataEffects.js} +8 -6
  337. package/dist/domain/{javascriptSemanticFingerprints.js → javascript/javascriptSemanticFingerprints.js} +40 -16
  338. package/dist/domain/{javascriptSemanticGraph.js → javascript/javascriptSemanticGraph.js} +2 -2
  339. package/dist/domain/{javascriptSemanticGraphSchemas.js → javascript/javascriptSemanticGraphSchemas.js} +3 -3
  340. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +116 -0
  341. package/dist/domain/javascript/javascriptSemanticMutationValues.js +53 -0
  342. package/dist/domain/{javascriptSemanticObjects.js → javascript/javascriptSemanticObjects.js} +5 -5
  343. package/dist/domain/{javascriptSemanticPrimitives.js → javascript/javascriptSemanticPrimitives.js} +1 -1
  344. package/dist/domain/{javascriptSemanticProjection.js → javascript/javascriptSemanticProjection.js} +31 -44
  345. package/dist/domain/{javascriptSemanticPromises.js → javascript/javascriptSemanticPromises.js} +77 -22
  346. package/dist/domain/{javascriptSemanticProvenance.js → javascript/javascriptSemanticProvenance.js} +4 -1
  347. package/dist/domain/{javascriptSemanticQuery.js → javascript/javascriptSemanticQuery.js} +1 -1
  348. package/dist/domain/{javascriptSemanticQueryAssessment.js → javascript/javascriptSemanticQueryAssessment.js} +1 -1
  349. package/dist/domain/{javascriptSemanticQueryIdentity.js → javascript/javascriptSemanticQueryIdentity.js} +1 -1
  350. package/dist/domain/{javascriptSemanticQuerySchemas.js → javascript/javascriptSemanticQuerySchemas.js} +3 -3
  351. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +25 -0
  352. package/dist/domain/{javascriptSemanticResources.js → javascript/javascriptSemanticResources.js} +2 -1
  353. package/dist/domain/{javascriptSemanticReturns.js → javascript/javascriptSemanticReturns.js} +1 -1
  354. package/dist/domain/{javascriptSemanticTraceSchemas.js → javascript/javascriptSemanticTraceSchemas.js} +2 -2
  355. package/dist/domain/javascript/javascriptSemanticTraversal.js +55 -0
  356. package/dist/domain/javascript/javascriptSemanticValueTypes.js +1 -0
  357. package/dist/domain/{javascriptSemanticValues.js → javascript/javascriptSemanticValues.js} +72 -48
  358. package/dist/domain/{javascriptStaticAnalysis.js → javascript/javascriptStaticAnalysis.js} +7 -4
  359. package/dist/domain/{javascriptStaticAnalysisBundler.js → javascript/javascriptStaticAnalysisBundler.js} +14 -11
  360. package/dist/domain/{javascriptStaticAnalysisCalls.js → javascript/javascriptStaticAnalysisCalls.js} +2 -2
  361. package/dist/domain/{javascriptStaticAnalysisHelpers.js → javascript/javascriptStaticAnalysisHelpers.js} +231 -40
  362. package/dist/domain/{sourceToBundleComparison.js → javascript/sourceToBundleComparison.js} +2 -2
  363. package/dist/domain/{sourceToBundleComparisonSchemas.js → javascript/sourceToBundleComparisonSchemas.js} +4 -4
  364. package/dist/domain/{sourceToBundleSignals.js → javascript/sourceToBundleSignals.js} +2 -2
  365. package/dist/domain/{managedApplicationGraph.js → managed/managedApplicationGraph.js} +4 -4
  366. package/dist/domain/{managedApplicationGraphNodes.js → managed/managedApplicationGraphNodes.js} +1 -1
  367. package/dist/domain/{managedArtifact.js → managed/managedArtifact.js} +1 -1
  368. package/dist/domain/{managedMemberComparison.js → managed/managedMemberComparison.js} +4 -4
  369. package/dist/domain/{managedMemberComparisonCoverage.js → managed/managedMemberComparisonCoverage.js} +2 -1
  370. package/dist/domain/{managedMemberComparisonItems.js → managed/managedMemberComparisonItems.js} +97 -40
  371. package/dist/domain/{managedMemberComparisonMatch.js → managed/managedMemberComparisonMatch.js} +22 -11
  372. package/dist/domain/{managedNativeVerification.js → managed/managedNativeVerification.js} +1 -1
  373. package/dist/domain/{managedNativeVerificationMatch.js → managed/managedNativeVerificationMatch.js} +3 -3
  374. package/dist/domain/{managedNativeVerificationSchemas.js → managed/managedNativeVerificationSchemas.js} +6 -5
  375. package/dist/domain/{managedReconstruction.js → managed/managedReconstruction.js} +3 -3
  376. package/dist/domain/{nativeFunctionAnnotations.js → native/nativeFunctionAnnotations.js} +1 -1
  377. package/dist/domain/{nativeInspection.js → native/nativeInspection.js} +1 -1
  378. package/dist/domain/{nativeInvestigationGraph.js → native/nativeInvestigationGraph.js} +13 -4
  379. package/dist/domain/{nativeLoadImage.js → native/nativeLoadImage.js} +1 -1
  380. package/dist/domain/{nativeUiObservation.js → native/nativeUiObservation.js} +20 -6
  381. package/dist/domain/{objcSwiftMetadata.js → native/objcSwiftMetadata.js} +17 -0
  382. package/dist/domain/processCapture.js +4 -2
  383. package/dist/domain/processScenario.js +17 -17
  384. package/dist/domain/propertyListKeys.js +69 -0
  385. package/dist/domain/providerCleanupError.js +5 -2
  386. package/dist/domain/reconstructionCoverageEvaluation.js +46 -24
  387. package/dist/domain/reconstructionCoverageInput.js +7 -0
  388. package/dist/domain/runtimeVersion.js +2 -0
  389. package/dist/domain/sourceMapEnvelope.js +38 -0
  390. package/dist/domain/unicodeCodePointOrder.js +11 -6
  391. package/dist/domain/webBundleAnalyzerAst.js +2 -34
  392. package/dist/domain/webBundleAnalyzerInspection.js +12 -9
  393. package/dist/domain/webEventListeners.js +28 -0
  394. package/dist/domain/webExecution.js +74 -0
  395. package/dist/domain/webMcpDiscovery.js +1 -7
  396. package/dist/domain/webModuleImports.js +104 -0
  397. package/dist/domain/webModuleTrace.js +106 -0
  398. package/dist/domain/webRuntime.js +69 -0
  399. package/dist/domain/webScreenshot.js +1 -7
  400. package/dist/domain/webScriptArtifacts.js +39 -0
  401. package/dist/domain/webScriptExport.js +86 -0
  402. package/dist/domain/webScriptExportError.js +13 -0
  403. package/dist/domain/webScriptExportPlan.js +108 -0
  404. package/dist/domain/webSourceLocation.js +106 -0
  405. package/dist/domain/webSourcePosition.js +21 -0
  406. package/dist/dotnet/ManagedArtifactInspector.js +1 -1
  407. package/dist/dotnet/ManagedMemberInspector.js +1 -1
  408. package/dist/dotnet/ManagedMemberInspectorCore.js +34 -0
  409. package/dist/dotnet/ManagedMemberRows.js +5 -3
  410. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +22 -16
  411. package/dist/dotnet/ManagedNativeBoundaryInspector.js +56 -50
  412. package/dist/dotnet/ManagedStaticProvider.js +3 -33
  413. package/dist/dotnet/ManagedStaticProviderMetadata.js +36 -0
  414. package/dist/evaluation/CodexAgentEval.js +2 -1
  415. package/dist/firmware/FirmwareProvider.js +18 -12
  416. package/dist/firmware/FirmwarePublication.js +1 -1
  417. package/dist/firmware/FirmwareRelease.js +1 -1
  418. package/dist/firmware/FirmwareReports.js +12 -0
  419. package/dist/firmware/FirmwareVersion.js +80 -0
  420. package/dist/generatedMcpToolCatalog.js +1 -1
  421. package/dist/generatedPackageMetadata.js +2 -2
  422. package/dist/ghidra/GhidraFunctionValues.js +5 -5
  423. package/dist/ghidra/GhidraInstallation.js +38 -34
  424. package/dist/ghidra/GhidraInstallationPolicy.js +140 -0
  425. package/dist/ghidra/GhidraInventoryValues.js +1 -1
  426. package/dist/ghidra/GhidraLauncher.js +12 -4
  427. package/dist/ghidra/GhidraLoadImageAttest.js +36 -0
  428. package/dist/ghidra/GhidraLoadImageValues.js +1 -1
  429. package/dist/ghidra/GhidraProvider.js +15 -233
  430. package/dist/ghidra/GhidraProviderCapabilities.js +7 -14
  431. package/dist/ghidra/GhidraProviderClient.js +209 -0
  432. package/dist/ghidra/GhidraResponseBuffer.js +7 -1
  433. package/dist/ghidra/extensions/nativeaot/NativeAotReport.js +17 -1
  434. package/dist/hopper/HopperProvider.js +2 -48
  435. package/dist/hopper/HopperProviderCapabilities.js +73 -0
  436. package/dist/hopper/HopperResponseStream.js +7 -1
  437. package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -4
  438. package/dist/ida/IdaProviderCapabilities.js +3 -11
  439. package/dist/ida/IdaSessionClient.js +12 -0
  440. package/dist/{browser → inspector}/JavaScriptRuntimeScope.js +16 -5
  441. package/dist/{browser → inspector}/V8InspectorCaptureProjection.js +46 -8
  442. package/dist/{browser → inspector}/V8InspectorEndpoint.js +1 -1
  443. package/dist/{browser → inspector}/V8InspectorProvider.js +10 -13
  444. package/dist/inspector/providerIdentity.js +6 -0
  445. package/dist/javascript/recovery/RecoveryFiles.js +122 -0
  446. package/dist/javascript/recovery/WakaruCommand.js +116 -0
  447. package/dist/javascript/recovery/WakaruExecution.js +100 -0
  448. package/dist/javascript/recovery/WakaruProvider.js +96 -0
  449. package/dist/javascript/recovery/WakaruPublication.js +102 -0
  450. package/dist/javascript/recovery/WakaruRelease.js +29 -0
  451. package/dist/javascript/recovery/WakaruReport.js +134 -0
  452. package/dist/javascript/sourceMaps/SourceMapCodecProcess.js +37 -0
  453. package/dist/javascript/sourceMaps/SourceMapCodecProtocol.js +20 -0
  454. package/dist/javascript/sourceMaps/SourceMapCommand.js +176 -0
  455. package/dist/javascript/sourceMaps/SourceMapDecoder.js +61 -0
  456. package/dist/javascript/sourceMaps/SourceMapFormat.js +185 -0
  457. package/dist/javascript/sourceMaps/TraceSourceMap.js +138 -0
  458. package/dist/main/shutdown.js +8 -2
  459. package/dist/main/transport.js +24 -7
  460. package/dist/main.js +4 -18
  461. package/dist/native/AppleDispatchCoverage.js +58 -0
  462. package/dist/native/AppleDispatchMetadata.js +71 -509
  463. package/dist/native/AppleMachoFixups.js +292 -0
  464. package/dist/native/AppleMachoSelection.js +188 -0
  465. package/dist/native/AppleObjcCategories.js +59 -0
  466. package/dist/native/AppleObjcDispatchFacets.js +257 -0
  467. package/dist/native/AppleObjcProperties.js +68 -0
  468. package/dist/native/AppleObjcProtocols.js +2 -1
  469. package/dist/native/AppleSwiftDispatchFacets.js +150 -0
  470. package/dist/native/NativeMacOSProvider.js +132 -72
  471. package/dist/native/NativeMacOSProviderMetadata.js +42 -0
  472. package/dist/native/NativeMachoInspection.js +45 -14
  473. package/dist/native/NativeUiHelperRuntime.js +7 -3
  474. package/dist/native/NativeUiObservation.js +8 -4
  475. package/dist/native/NativeUiOutputBudget.js +8 -0
  476. package/dist/native/parsers/codesign.js +40 -5
  477. package/dist/native/parsers/demangle.js +6 -2
  478. package/dist/native/parsers/dyldInfo.js +13 -4
  479. package/dist/native/parsers/echoedPath.js +14 -0
  480. package/dist/native/parsers/lipo.js +14 -0
  481. package/dist/native/parsers/otool.js +1 -1
  482. package/dist/native/parsers/plist.js +174 -19
  483. package/dist/process/ExecFileOutput.js +2 -0
  484. package/dist/process/ProviderProcess.js +38 -17
  485. package/dist/reference/ReferenceSourceReaderEntries.js +6 -1
  486. package/dist/server/createServer.js +48 -6
  487. package/dist/server/mcpClientMetadata.js +6 -3
  488. package/dist/server/registerAndroidTools.js +1 -1
  489. package/dist/server/registerApplicationTools/compareExportShapes.js +2 -2
  490. package/dist/server/registerApplicationTools/compareSourceToBundle.js +2 -2
  491. package/dist/server/registerApplicationTools/compareVersions.js +2 -2
  492. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +43 -0
  493. package/dist/server/registerApplicationTools/traceFeature.js +1 -1
  494. package/dist/server/registerApplicationTools/traceSemantics.js +1 -1
  495. package/dist/server/registerApplicationTools.js +2 -0
  496. package/dist/server/registerBrowserScenarioTool.js +6 -2
  497. package/dist/server/registerBrowserTools.js +13 -2
  498. package/dist/server/registerCloseLifecycleTool.js +1 -1
  499. package/dist/server/registerElectronTools.js +21 -7
  500. package/dist/server/registerJavaScriptRecoveryTool.js +17 -0
  501. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -4
  502. package/dist/server/registerManagedTools.js +3 -3
  503. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -2
  504. package/dist/server/registerManagedWorkflowTools/contract.js +1 -1
  505. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +1 -1
  506. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +1 -1
  507. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -2
  508. package/dist/server/registerNativeTools.js +1 -1
  509. package/dist/server/registerPrompts.js +5 -1
  510. package/dist/server/registerSessionTools.js +1 -1
  511. package/dist/server/registerWebModuleTool.js +17 -0
  512. package/dist/server/registerWebRuntimeTools.js +31 -0
  513. package/dist/server/registerWebScriptTool.js +18 -0
  514. package/dist/server/registerWebSourceLocationTool.js +17 -0
  515. package/dist/server/sessionAvailabilityPolicy.js +24 -12
  516. package/dist/windows/WindowsOwnedProcess.js +3 -1
  517. package/install.sh +12 -2
  518. package/native/windows/README.md +5 -0
  519. package/native/windows/build/manifest.json +2 -2
  520. package/native/windows/build/rea-windows-x64.node +0 -0
  521. package/package.json +40 -19
  522. package/scripts/hopper-demo-x11.py +67 -8
  523. package/scripts/rea.mjs +9 -1
  524. package/skills/reverse-engineer-anything/SKILL.md +3 -3
  525. package/skills/reverse-engineer-anything/references/android-applications.md +2 -2
  526. package/skills/reverse-engineer-anything/references/javascript-applications.md +1 -1
  527. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +32 -23
  528. package/dist/application/runtime.js +0 -53
  529. package/dist/domain/appleApplication.js +0 -181
  530. package/dist/domain/javascriptAstValues.js +0 -13
  531. package/dist/domain/javascriptSemanticTraversal.js +0 -30
  532. package/dist/native/NativeHostCapabilities.js +0 -23
  533. /package/dist/application/{AndroidAnalysisPort.js → DirectAnalysisDependencies.js} +0 -0
  534. /package/dist/application/{BinarySessionPort.js → WebModulePorts.js} +0 -0
  535. /package/dist/application/{ElectronActiveObservationPort.js → WebRuntimePort.js} +0 -0
  536. /package/dist/application/{ElectronObservationPort.js → WebScriptArtifactPort.js} +0 -0
  537. /package/dist/application/{FirmwareAnalysisPort.js → WebSourceLocationPorts.js} +0 -0
  538. /package/dist/application/{JavaScriptArtifactAnalysisTypes.js → android/AndroidAnalysisPort.js} +0 -0
  539. /package/dist/application/{AbortablePromise.js → binary/AbortablePromise.js} +0 -0
  540. /package/dist/application/{JavaScriptRuntimeObservationPort.js → binary/BinarySessionPort.js} +0 -0
  541. /package/dist/application/{BinarySessionStatus.js → binary/BinarySessionStatus.js} +0 -0
  542. /package/dist/{domain/electronStaticAnalysisTypes.js → application/firmware/FirmwareAnalysisPort.js} +0 -0
  543. /package/dist/{domain/javascriptSemanticValueTypes.js → application/investigation/InvestigationRecordPort.js} +0 -0
  544. /package/dist/application/{ElectronBoundaryGraph.js → javascript/ElectronBoundaryGraph.js} +0 -0
  545. /package/dist/application/{ElectronBoundaryGraphIpc.js → javascript/ElectronBoundaryGraphIpc.js} +0 -0
  546. /package/dist/application/{ElectronBoundaryGraphNative.js → javascript/ElectronBoundaryGraphNative.js} +0 -0
  547. /package/dist/application/{ElectronBoundaryGraphWindows.js → javascript/ElectronBoundaryGraphWindows.js} +0 -0
  548. /package/dist/application/{JavaScriptArtifactGraphBundlers.js → javascript/JavaScriptArtifactGraphBundlers.js} +0 -0
  549. /package/dist/application/{JavaScriptArtifactGraphEvidence.js → javascript/JavaScriptArtifactGraphEvidence.js} +0 -0
  550. /package/dist/application/{JavaScriptArtifactReconstructionInput.js → javascript/JavaScriptArtifactReconstructionInput.js} +0 -0
  551. /package/dist/application/{JavaScriptSemanticGraphEvidence.js → javascript/JavaScriptSemanticGraphEvidence.js} +0 -0
  552. /package/dist/application/{JavaScriptSemanticGraphValueProjection.js → javascript/JavaScriptSemanticGraphValueProjection.js} +0 -0
  553. /package/dist/artifacts/{NibArchive.js → apple/NibArchive.js} +0 -0
  554. /package/dist/domain/{androidAnalysis.js → android/androidAnalysis.js} +0 -0
  555. /package/dist/domain/{electronActiveObservation.js → javascript/electronActiveObservation.js} +0 -0
  556. /package/dist/domain/{electronStaticAnalysis.js → javascript/electronStaticAnalysis.js} +0 -0
  557. /package/dist/domain/{javascriptExportShapeComparisonIdentity.js → javascript/javascriptExportShapeComparisonIdentity.js} +0 -0
  558. /package/dist/domain/{javascriptRuntimeReconciliation.js → javascript/javascriptRuntimeReconciliation.js} +0 -0
  559. /package/dist/domain/{javascriptRuntimeReconciliationRuntime.js → javascript/javascriptRuntimeReconciliationRuntime.js} +0 -0
  560. /package/dist/domain/{javascriptSemanticCoverage.js → javascript/javascriptSemanticCoverage.js} +0 -0
  561. /package/dist/domain/{javascriptSemanticDerivedAnalysis.js → javascript/javascriptSemanticDerivedAnalysis.js} +0 -0
  562. /package/dist/domain/{javascriptSemanticGraphSerialization.js → javascript/javascriptSemanticGraphSerialization.js} +0 -0
  563. /package/dist/domain/{javascriptSemanticIr.js → javascript/javascriptSemanticIr.js} +0 -0
  564. /package/dist/domain/{javascriptSemanticQueryRelations.js → javascript/javascriptSemanticQueryRelations.js} +0 -0
  565. /package/dist/domain/{javascriptSemanticState.js → javascript/javascriptSemanticState.js} +0 -0
  566. /package/dist/domain/{javascriptSourceParser.js → javascript/javascriptSourceParser.js} +0 -0
  567. /package/dist/domain/{javascriptStaticAnalysisFindings.js → javascript/javascriptStaticAnalysisFindings.js} +0 -0
  568. /package/dist/domain/{javascriptStaticAnalysisState.js → javascript/javascriptStaticAnalysisState.js} +0 -0
  569. /package/dist/domain/{javascriptStaticAnalysisTypes.js → javascript/javascriptStaticAnalysisTypes.js} +0 -0
  570. /package/dist/domain/{managedApplicationGraphCoverage.js → managed/managedApplicationGraphCoverage.js} +0 -0
  571. /package/dist/domain/{managedApplicationGraphNodeCoverage.js → managed/managedApplicationGraphNodeCoverage.js} +0 -0
  572. /package/dist/domain/{nativeApiBoundary.js → native/nativeApiBoundary.js} +0 -0
  573. /package/dist/domain/{nativeDataType.js → native/nativeDataType.js} +0 -0
  574. /package/dist/domain/{nativeInstruction.js → native/nativeInstruction.js} +0 -0
  575. /package/dist/domain/{nativeMetadataRecovery.js → native/nativeMetadataRecovery.js} +0 -0
  576. /package/dist/domain/{nativeValueFlow.js → native/nativeValueFlow.js} +0 -0
  577. /package/dist/domain/{nativeValueTrace.js → native/nativeValueTrace.js} +0 -0
@@ -0,0 +1,411 @@
1
+ import { z } from "zod";
2
+ import { jsonValueSchema } from "../jsonValue.js";
3
+ const recordSchema = z.record(z.string(), z.unknown());
4
+ const objectNode = z.strictObject({
5
+ id: z.string().min(1),
6
+ kind: z.enum([
7
+ "view_controller",
8
+ "view",
9
+ "control",
10
+ "constraint",
11
+ "layout_guide",
12
+ "resource",
13
+ "placeholder",
14
+ "external_object",
15
+ "other",
16
+ ]),
17
+ class_name: z.string().nullable(),
18
+ name: z.string().min(1),
19
+ attributes: z.record(z.string(), jsonValueSchema),
20
+ });
21
+ const connection = z.strictObject({
22
+ id: z.string().min(1),
23
+ kind: z.enum(["outlet", "action", "segue", "other"]),
24
+ source_id: z.string().min(1),
25
+ destination_id: z.string().nullable(),
26
+ label: z.string().nullable(),
27
+ attributes: z.record(z.string(), jsonValueSchema),
28
+ });
29
+ /** Parse ibtool dictionaries or compiled keyed archives into typed records. */
30
+ export const parseInterfaceBuilderRecords = (value) => {
31
+ const root = record(value);
32
+ const keyed = parseKeyedArchive(root);
33
+ if (keyed !== null)
34
+ return keyed;
35
+ const objectsRaw = record(root["com.apple.ibtool.document.objects"]);
36
+ const connectionsRaw = record(root["com.apple.ibtool.document.connections"]);
37
+ const hierarchyRaw = root["com.apple.ibtool.document.hierarchy"];
38
+ const classesRaw = record(root["com.apple.ibtool.document.classes"]);
39
+ const objects = [];
40
+ const connections = [];
41
+ let omittedConnections = 0;
42
+ const objectEntries = Object.entries(objectsRaw);
43
+ for (const [id, raw] of objectEntries.slice(0, 20_000)) {
44
+ const attributes = record(raw);
45
+ const className = firstString(attributes["customClass"], attributes["class"], attributes["isa"]);
46
+ const label = firstString(attributes["label"], attributes["title"], attributes["name"], className);
47
+ objects.push(objectNode.parse({
48
+ id,
49
+ kind: classifyObject(className),
50
+ class_name: className,
51
+ name: label ?? id,
52
+ attributes: jsonSafeRecord(attributes),
53
+ }));
54
+ }
55
+ for (const [sourceId, rawConnections] of Object.entries(connectionsRaw)) {
56
+ if (!Array.isArray(rawConnections))
57
+ continue;
58
+ for (const [index, raw] of rawConnections.entries()) {
59
+ if (connections.length >= 40_000) {
60
+ omittedConnections += rawConnections.length - index;
61
+ break;
62
+ }
63
+ const item = record(raw);
64
+ const type = firstString(item.type, item.connectionType) ?? "unknown";
65
+ const destination = firstString(item["destination-id"], item.destinationId);
66
+ const label = firstString(item.label, item.selector, item.identifier);
67
+ connections.push(connection.parse({
68
+ id: `${sourceId}:connection:${index}`,
69
+ kind: classifyConnection(type),
70
+ source_id: sourceId,
71
+ destination_id: destination,
72
+ label,
73
+ attributes: jsonSafeRecord(item),
74
+ }));
75
+ }
76
+ }
77
+ return {
78
+ objects,
79
+ connections,
80
+ hierarchy: Array.isArray(hierarchyRaw) ? hierarchyRaw.slice(0, 20_000) : [],
81
+ classes: classesRaw,
82
+ objectCount: objectEntries.length,
83
+ omittedObjects: Math.max(0, objectEntries.length - 20_000),
84
+ omittedConnections,
85
+ };
86
+ };
87
+ /**
88
+ * A UID decodes as a one-key `UID` (binary) or `CF$UID` (XML) dictionary with
89
+ * an integer value. Any other dictionary is ordinary archive data.
90
+ */
91
+ const archiveUid = (value) => {
92
+ if (typeof value !== "object" || value === null || Array.isArray(value))
93
+ return undefined;
94
+ if (Object.keys(value).length !== 1)
95
+ return undefined;
96
+ const item = record(value);
97
+ const marker = Object.hasOwn(item, "UID") ? item.UID : item["CF$UID"];
98
+ return typeof marker === "number" && Number.isInteger(marker)
99
+ ? marker
100
+ : undefined;
101
+ };
102
+ const HIERARCHY_KEY = /(?:subviews|contentview|childviewcontrollers|children|views)$/iu;
103
+ /**
104
+ * Read an NSKeyedArchiver object table without expanding it into a tree.
105
+ * Archived objects reference each other freely, including cycles such as a
106
+ * view and its superview, so inlining every reference grows exponentially.
107
+ * A reference instead resolves to the referenced string, or to a stub that
108
+ * names the referenced object; the hierarchy walk visits each object once.
109
+ */
110
+ const keyedArchiveTable = (objectTable) => {
111
+ const classNameOf = (value) => {
112
+ const classReference = record(value).$class;
113
+ const uid = archiveUid(classReference);
114
+ return firstString(record(uid === undefined ? classReference : objectTable[uid]).$classname);
115
+ };
116
+ /** The string an archived string object holds, if it is one. */
117
+ const archivedString = (target) => {
118
+ if (typeof target === "string")
119
+ return target;
120
+ const text = record(target)["NS.string"];
121
+ return typeof text === "string" &&
122
+ /^NS(?:Mutable)?String$/u.test(classNameOf(target) ?? "")
123
+ ? text
124
+ : undefined;
125
+ };
126
+ const text = (value) => {
127
+ const uid = archiveUid(value);
128
+ return firstString(uid === undefined ? value : archivedString(objectTable[uid]));
129
+ };
130
+ const authoredId = (item) => firstString(text(item.objectID), text(item["object-id"]));
131
+ const reference = (uid) => {
132
+ // UID 0 is the archived nil.
133
+ const target = uid === 0 ? null : objectTable[uid];
134
+ if (target === undefined || target === null)
135
+ return null;
136
+ if (typeof target !== "object")
137
+ return target;
138
+ const string = archivedString(target);
139
+ if (string !== undefined)
140
+ return string;
141
+ const objectId = authoredId(record(target));
142
+ return {
143
+ archiveUID: uid,
144
+ ...(objectId === null ? {} : { objectID: objectId }),
145
+ className: classNameOf(target),
146
+ };
147
+ };
148
+ /** Resolve one object's own fields, leaving references to other objects as stubs. */
149
+ const resolve = (value) => {
150
+ const uid = archiveUid(value);
151
+ if (uid !== undefined)
152
+ return reference(uid);
153
+ if (Array.isArray(value))
154
+ return value.map(resolve);
155
+ if (typeof value !== "object" || value === null)
156
+ return value;
157
+ const output = {};
158
+ for (const [key, child] of Object.entries(value)) {
159
+ if (key === "$class")
160
+ output.className = classNameOf(value);
161
+ else
162
+ output[key] = resolve(child);
163
+ }
164
+ return output;
165
+ };
166
+ const hierarchy = (start) => {
167
+ const visited = new Set();
168
+ const root = [];
169
+ const pending = [
170
+ { value: start, output: root },
171
+ ];
172
+ const appendNode = (item, uid, output) => {
173
+ const objectId = firstString(authoredId(item), text(item.id), uid === undefined ? null : String(uid));
174
+ if (objectId === null) {
175
+ for (const [key, child] of Object.entries(item).reverse())
176
+ if (HIERARCHY_KEY.test(key))
177
+ pending.push({ value: child, output });
178
+ return;
179
+ }
180
+ const children = [];
181
+ output.push({ objectID: objectId, children });
182
+ for (const [key, child] of Object.entries(item).reverse())
183
+ if (HIERARCHY_KEY.test(key))
184
+ pending.push({ value: child, output: children });
185
+ };
186
+ while (pending.length > 0) {
187
+ const entry = pending.pop();
188
+ if (entry === undefined)
189
+ break;
190
+ const { value, output } = entry;
191
+ const uid = archiveUid(value);
192
+ if (uid !== undefined) {
193
+ if (visited.has(uid))
194
+ continue;
195
+ visited.add(uid);
196
+ const target = objectTable[uid];
197
+ if (Array.isArray(target)) {
198
+ for (let index = target.length - 1; index >= 0; index -= 1) {
199
+ const child = target[index];
200
+ if (child !== undefined)
201
+ pending.push({ value: child, output });
202
+ }
203
+ continue;
204
+ }
205
+ if (typeof target !== "object" || target === null)
206
+ continue;
207
+ const item = record(target);
208
+ if (archivedArrayClass(item.$class)) {
209
+ const members = item["NS.objects"];
210
+ if (Array.isArray(members))
211
+ for (let index = members.length - 1; index >= 0; index -= 1) {
212
+ const child = members[index];
213
+ if (child !== undefined)
214
+ pending.push({ value: child, output });
215
+ }
216
+ continue;
217
+ }
218
+ appendNode(item, uid, output);
219
+ continue;
220
+ }
221
+ if (Array.isArray(value)) {
222
+ for (let index = value.length - 1; index >= 0; index -= 1) {
223
+ const child = value[index];
224
+ if (child !== undefined)
225
+ pending.push({ value: child, output });
226
+ }
227
+ }
228
+ else if (typeof value === "object" && value !== null) {
229
+ appendNode(record(value), undefined, output);
230
+ }
231
+ }
232
+ return root;
233
+ };
234
+ const archivedArrayClass = (classReference) => {
235
+ const uid = archiveUid(classReference);
236
+ const descriptor = record(uid === undefined ? classReference : objectTable[uid]);
237
+ const classNames = Array.isArray(descriptor.$classes)
238
+ ? descriptor.$classes.filter((name) => typeof name === "string")
239
+ : [];
240
+ return (classNames.includes("NSArray") || classNames.includes("NSMutableArray"));
241
+ };
242
+ return { resolve, hierarchy };
243
+ };
244
+ /** Project class and connection objects from an NSKeyedArchiver object table. */
245
+ const parseKeyedArchive = (root) => {
246
+ if (root.$archiver !== "NSKeyedArchiver" || !Array.isArray(root.$objects))
247
+ return null;
248
+ const objectTable = root.$objects;
249
+ const { resolve, hierarchy: toHierarchy } = keyedArchiveTable(objectTable);
250
+ const objects = [];
251
+ const connections = [];
252
+ let objectCount = 0;
253
+ let omittedConnections = 0;
254
+ for (const [index, raw] of objectTable.entries()) {
255
+ if (index === 0)
256
+ continue;
257
+ const resolved = record(resolve(raw));
258
+ const className = firstString(resolved.className);
259
+ if (className === null)
260
+ continue;
261
+ objectCount += 1;
262
+ const fields = Object.fromEntries(Object.entries(resolved).filter(([key]) => key !== "className"));
263
+ const authoredId = firstString(fields.objectID, fields["object-id"]);
264
+ const objectId = authoredId ??
265
+ (typeof fields.archiveUID === "number"
266
+ ? String(fields.archiveUID)
267
+ : String(index));
268
+ const kind = classifyObject(className);
269
+ if (objects.length < 20_000)
270
+ objects.push(objectNode.parse({
271
+ id: objectId,
272
+ kind,
273
+ class_name: className,
274
+ name: firstString(fields.label, fields.title, fields.identifier, fields.accessibilityLabel, className) ?? `object ${String(index)}`,
275
+ attributes: jsonSafeRecord(fields),
276
+ }));
277
+ if (/(?:Outlet|Connection|Segue|ActionConnection|ControlConnector)/iu.test(className)) {
278
+ const controlAction = /ControlConnector/iu.test(className);
279
+ // AppKit connectors (NSNibOutletConnector, NSNibControlConnector)
280
+ // archive NSSource as the outlet owner or sending control and
281
+ // NSDestination as the outlet value or action target, so they are read
282
+ // in that order without the inversion the unprefixed fields use.
283
+ const source = firstObjectReference(controlAction ? fields.destination : fields.source, archivedObjectReference(fields.NSSource), controlAction ? fields.to : fields.from, controlAction ? fields.target : fields.owner);
284
+ if (source === null)
285
+ continue;
286
+ const kind = controlAction ? "action" : classifyConnection(className);
287
+ const parsedConnection = connection.parse({
288
+ id: `archive:${objectId}`,
289
+ kind,
290
+ source_id: source,
291
+ destination_id: firstObjectReference(controlAction ? fields.source : fields.destination, archivedObjectReference(fields.NSDestination), controlAction ? fields.from : fields.to, controlAction ? fields.owner : fields.target),
292
+ label: firstString(fields.label, fields.NSLabel, fields.selector, fields.identifier, fields.action),
293
+ attributes: jsonSafeRecord(fields),
294
+ });
295
+ if (connections.length < 40_000)
296
+ connections.push(parsedConnection);
297
+ else
298
+ omittedConnections += 1;
299
+ }
300
+ }
301
+ const top = record(root.$top);
302
+ const hierarchy = toHierarchy(top.root ?? top.UITopLevelObjectsKey);
303
+ const classes = Object.fromEntries(objectTable.flatMap((raw) => {
304
+ const item = record(raw);
305
+ const name = firstString(item.$classname);
306
+ return name === null
307
+ ? []
308
+ : [
309
+ [
310
+ name,
311
+ {
312
+ superclasses: Array.isArray(item.$classes) ? item.$classes : [],
313
+ },
314
+ ],
315
+ ];
316
+ }));
317
+ return {
318
+ objects,
319
+ connections,
320
+ hierarchy,
321
+ classes,
322
+ objectCount,
323
+ omittedObjects: Math.max(0, objectCount - 20_000),
324
+ omittedConnections,
325
+ };
326
+ };
327
+ /** Coerce unknown values to a string-keyed record; non-objects become `{}`. */
328
+ export const record = (value) => recordSchema.safeParse(value).data ?? {};
329
+ /** First non-empty string among the candidates, otherwise null. */
330
+ export const firstString = (...values) => {
331
+ for (const value of values)
332
+ if (typeof value === "string" && value.length > 0)
333
+ return value;
334
+ return null;
335
+ };
336
+ /**
337
+ * The node identity of a resolved archive reference: its authored object ID,
338
+ * otherwise its archive UID, which is how the referenced object's node is keyed.
339
+ */
340
+ const archivedObjectReference = (value) => {
341
+ const item = record(value);
342
+ if (typeof item.archiveUID !== "number")
343
+ return null;
344
+ return (firstString(item.objectID, item["object-id"]) ?? String(item.archiveUID));
345
+ };
346
+ const firstObjectReference = (...values) => {
347
+ for (const value of values) {
348
+ const direct = firstString(value);
349
+ if (direct !== null)
350
+ return direct;
351
+ const item = record(value);
352
+ const objectId = firstString(item.objectID, item["object-id"], item.id, item.identifier, typeof item.archiveUID === "number" ? String(item.archiveUID) : null);
353
+ if (objectId !== null)
354
+ return objectId;
355
+ }
356
+ return null;
357
+ };
358
+ const classifyObject = (className) => {
359
+ const value = className?.toLowerCase() ?? "";
360
+ if (value.includes("constraint"))
361
+ return "constraint";
362
+ if (value.includes("layoutguide"))
363
+ return "layout_guide";
364
+ if (value.includes("placeholder") ||
365
+ value.includes("firstresponder") ||
366
+ value === "uiproxyobject")
367
+ return "placeholder";
368
+ if (value.includes("image") ||
369
+ value.includes("color") ||
370
+ value.includes("font"))
371
+ return "resource";
372
+ if (value.includes("external"))
373
+ return "external_object";
374
+ if (value.includes("viewcontroller") || value.includes("windowcontroller"))
375
+ return "view_controller";
376
+ if (value.includes("button") ||
377
+ value.includes("control") ||
378
+ value.includes("textfield") ||
379
+ value.includes("slider") ||
380
+ value.includes("menuitem"))
381
+ return "control";
382
+ if (value.includes("view") ||
383
+ value.includes("window") ||
384
+ value.includes("cell"))
385
+ return "view";
386
+ return "other";
387
+ };
388
+ const classifyConnection = (type) => {
389
+ const value = type.toLowerCase();
390
+ if (value.includes("outlet"))
391
+ return "outlet";
392
+ if (value.includes("action"))
393
+ return "action";
394
+ if (value.includes("segue"))
395
+ return "segue";
396
+ return "other";
397
+ };
398
+ const jsonSafeRecord = (value) => Object.fromEntries(Object.entries(value).flatMap(([key, item]) => {
399
+ try {
400
+ const serialized = JSON.stringify(item);
401
+ if (serialized === undefined)
402
+ return [];
403
+ const parsed = jsonValueSchema.safeParse(JSON.parse(serialized));
404
+ return parsed.success ? [[key, parsed.data]] : [];
405
+ }
406
+ catch (cause) {
407
+ // Unserializable entries are omitted from the record.
408
+ void cause;
409
+ return [];
410
+ }
411
+ }));
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { jsonValueSchema } from "./jsonValue.js";
2
+ import { jsonValueSchema } from "../jsonValue.js";
3
3
  /** Select one archive within the active bundle and optionally one named root. */
4
4
  export const keyedArchiveInputSchema = z.strictObject({
5
5
  path: z.string().min(1).default("."),
@@ -47,11 +47,17 @@ export const keyedArchiveResultSchema = z.strictObject({
47
47
  const record = (value) => value !== null && typeof value === "object" && !Array.isArray(value)
48
48
  ? value
49
49
  : undefined;
50
+ /**
51
+ * A UID decodes as a one-key `UID` (binary) or `CF$UID` (XML) dictionary with
52
+ * a numeric value. Any other value means an ordinary dictionary, such as a
53
+ * `$top` that holds a root encoded under the key `UID`.
54
+ */
50
55
  const uid = (value) => {
51
56
  const object = record(value);
52
57
  if (object === undefined || Object.keys(object).length !== 1)
53
58
  return undefined;
54
- return Object.hasOwn(object, "UID") ? object.UID : object["CF$UID"];
59
+ const marker = Object.hasOwn(object, "UID") ? object.UID : object["CF$UID"];
60
+ return typeof marker === "number" ? marker : undefined;
55
61
  };
56
62
  /** Interpret serialized Foundation references without instantiating archive classes. */
57
63
  export const projectKeyedArchive = (value, selection) => {
@@ -84,10 +90,7 @@ export const projectKeyedArchive = (value, selection) => {
84
90
  throw new RangeError("Archive exceeds 200000 values per object or 128 nesting levels");
85
91
  const target = uid(item.value);
86
92
  if (target !== undefined) {
87
- const valid = typeof target === "number" &&
88
- Number.isSafeInteger(target) &&
89
- target >= 0;
90
- const index = valid ? target : null;
93
+ const index = Number.isSafeInteger(target) && target >= 0 ? target : null;
91
94
  references.push({
92
95
  source,
93
96
  path: item.path,
@@ -127,9 +130,7 @@ export const projectKeyedArchive = (value, selection) => {
127
130
  scan(id, value);
128
131
  const fields = record(value);
129
132
  const classUid = uid(fields?.$class);
130
- const classId = typeof classUid === "number" &&
131
- Number.isSafeInteger(classUid) &&
132
- classUid >= 0
133
+ const classId = classUid !== undefined && Number.isSafeInteger(classUid) && classUid >= 0
133
134
  ? classUid
134
135
  : null;
135
136
  const descriptor = classId === null ? undefined : record(table[classId]);
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ const MAX_PLIST_DEPTH = 128;
3
+ /**
4
+ * Project a decoded plist into JSON. Data and dates become explicit
5
+ * `$plist_type` objects; a non-finite real becomes an explicit unknown
6
+ * because the XML decoder reports NaN and ±infinity alike.
7
+ */
8
+ export const projectPlistValue = (value) => {
9
+ let unknownRealCount = 0;
10
+ const project = (item, depth) => {
11
+ if (depth > MAX_PLIST_DEPTH)
12
+ throw new RangeError(`Plist exceeds ${String(MAX_PLIST_DEPTH)} nesting levels`);
13
+ if (item instanceof Uint8Array)
14
+ return {
15
+ $plist_type: "data",
16
+ base64: Buffer.from(item).toString("base64"),
17
+ };
18
+ if (item instanceof Date)
19
+ return { $plist_type: "date", iso8601: item.toISOString() };
20
+ if (typeof item === "number" && !Number.isFinite(item)) {
21
+ unknownRealCount += 1;
22
+ return { $plist_type: "real", value: null };
23
+ }
24
+ if (Array.isArray(item))
25
+ return item.map((entry) => project(entry, depth + 1));
26
+ if (item !== null && typeof item === "object")
27
+ return Object.fromEntries(Object.entries(item).map(([key, entry]) => [
28
+ key,
29
+ project(entry, depth + 1),
30
+ ]));
31
+ return z.union([z.string(), z.number(), z.boolean(), z.null()]).parse(item);
32
+ };
33
+ const projected = project(value, 0);
34
+ return { value: projected, unknownRealCount };
35
+ };
@@ -2,6 +2,7 @@ import { artifactInventoryResultSchema, } from "./artifactGraph.js";
2
2
  import { canonicalDigest, canonicalJson } from "./comparisonSemantics.js";
3
3
  import { parseEvidence } from "./evidence.js";
4
4
  import { artifactInspectionResultSchema } from "./artifactInspection.js";
5
+ import { err, ok } from "./result.js";
5
6
  /** Parse, merge, and verify inventory Evidence pages. */
6
7
  export const parseArtifactInventoryEvidence = (input) => assembleInventorySet((Array.isArray(input) ? input : [input]).map((value) => {
7
8
  const evidence = parseEvidence(value);
@@ -32,9 +33,18 @@ const validateInventoryPage = (inventory) => {
32
33
  `art_${canonicalDigest({ sha256: node.sha256 }, "Artifact inventory")}`)
33
34
  throw new TypeError("Artifact node ID is not content-addressed");
34
35
  };
36
+ /**
37
+ * Result-returning seam for the empty-pages leaf. Other assembly failures
38
+ * still throw TypeError (migration in progress); parseArtifactInventoryEvidence
39
+ * keeps its throwing contract until callers switch.
40
+ */
41
+ export const tryAssembleInventorySet = (pages) => pages.length === 0
42
+ ? err({
43
+ code: "empty",
44
+ message: "Artifact inventory requires Evidence pages",
45
+ })
46
+ : ok(assembleInventorySet(pages));
35
47
  const assembleInventorySet = (pages) => {
36
- if (pages.length === 0)
37
- throw new TypeError("Artifact inventory requires Evidence pages");
38
48
  const first = pages[0];
39
49
  if (first === undefined)
40
50
  throw new TypeError("Artifact inventory requires Evidence pages");
@@ -0,0 +1 @@
1
+ export {};
@@ -4,13 +4,17 @@ export class ArtifactOperationError extends AnalysisError {
4
4
  operation;
5
5
  reason;
6
6
  artifactDetails;
7
+ detail;
7
8
  _tag = "ArtifactOperationError";
8
- constructor(operation, reason, artifactDetails) {
9
+ constructor(operation, reason, artifactDetails,
10
+ /** The specific constraint that failed, such as the colliding path. */
11
+ detail) {
9
12
  super(artifactDetails === undefined
10
13
  ? `Artifact ${operation} failed: ${reason}`
11
14
  : `Artifact ${operation} failed: ${reason} at ${artifactDetails.logicalPath} (declared_sha256=${artifactDetails.declaredSha256 ?? "unavailable"}, calculated_sha256=${artifactDetails.calculatedSha256 ?? "unavailable"}, unpacked=${String(artifactDetails.unpacked)})`);
12
15
  this.operation = operation;
13
16
  this.reason = reason;
14
17
  this.artifactDetails = artifactDetails;
18
+ this.detail = detail;
15
19
  }
16
20
  }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Pure string predicates for artifact path syntax. The local artifact
3
+ * resolver, the Electron native specifier check, and (by reference) the
4
+ * live-DOM and source-map URL handling share these character-level rules.
5
+ *
6
+ * Policy divergence (deliberate, not yet unified):
7
+ * - Local artifact paths resolve against an inventoried container root and
8
+ * report rejected | external | not-found. Confinement is lexical
9
+ * (posix.normalize must stay inside the root).
10
+ * - Live DOM destinations resolve against the document base URL and report
11
+ * approved | outside_policy | unsupported against allowedOrigins
12
+ * (see CdpCaptureDocuments.domDestination).
13
+ * - Source-map fetches require exact-origin http(s) without credentials
14
+ * (see WebSourceMapFetcher.approvedUrl).
15
+ * Unifying those outcome vocabularies is a separate, observable change.
16
+ */
17
+ /** Whether a reference carries a URI scheme (`https:`, `file:`, …). */
18
+ export const hasScheme = (value) => /^[A-Za-z][A-Za-z+.-]*:/u.test(value);
19
+ /** Whether a reference is scheme-qualified or protocol-relative. */
20
+ export const looksExternal = (value) => hasScheme(value) || value.startsWith("//");
21
+ /** Drop any query string and fragment from a declared reference. */
22
+ export const stripQueryAndFragment = (value) => value.split("#", 1)[0]?.split("?", 1)[0] ?? "";
23
+ /** Path syntax admitted for a canonical artifact path. */
24
+ export const admitsCanonicalPathSyntax = (value) => !value.includes("\0") &&
25
+ !value.includes("\\") &&
26
+ !/%(?:2e|2f|5c)/iu.test(value);
@@ -0,0 +1,82 @@
1
+ import { createHash } from "node:crypto";
2
+ import { z } from "zod";
3
+ /** Caller-selected network content; omission retains metadata alone. */
4
+ export const browserNetworkContentSelectionValuesSchema = z.strictObject({
5
+ request_body: z.boolean().default(false),
6
+ response_body: z.boolean().default(false),
7
+ header_values: z.boolean().default(false),
8
+ });
9
+ /** Input omission selects metadata without defaulting legacy capture coverage. */
10
+ export const browserNetworkContentSelectionSchema = browserNetworkContentSelectionValuesSchema.default({
11
+ request_body: false,
12
+ response_body: false,
13
+ header_values: false,
14
+ });
15
+ /** Self-verifying retained bytes, after any declared-secret redaction. */
16
+ export const browserNetworkBodySchema = z.union([
17
+ z.strictObject({ state: z.literal("not_requested") }),
18
+ z.strictObject({ state: z.literal("not_exposed") }),
19
+ z.strictObject({
20
+ state: z.literal("unavailable"),
21
+ reason: z.enum([
22
+ "request-failed",
23
+ "response-unfinished",
24
+ "body-read-failed",
25
+ "body-read-timeout",
26
+ "cancelled",
27
+ "capture-ended",
28
+ ]),
29
+ message: z.string().min(1),
30
+ }),
31
+ z
32
+ .strictObject({
33
+ state: z.literal("captured"),
34
+ representation: z.enum([
35
+ "browser-exposed-request-bytes",
36
+ "browser-decoded-response-bytes",
37
+ ]),
38
+ encoding: z.literal("base64"),
39
+ content: z.string(),
40
+ bytes: z.number().int().min(0),
41
+ sha256: z.string().regex(/^[a-f0-9]{64}$/u),
42
+ media_type: z.string().nullable(),
43
+ redacted: z.boolean(),
44
+ })
45
+ .superRefine((artifact, context) => {
46
+ const bytes = Buffer.from(artifact.content, "base64");
47
+ if (bytes.toString("base64") !== artifact.content)
48
+ context.addIssue({
49
+ code: "custom",
50
+ path: ["content"],
51
+ message: "Network body must use canonical base64",
52
+ });
53
+ if (bytes.length !== artifact.bytes)
54
+ context.addIssue({
55
+ code: "custom",
56
+ path: ["bytes"],
57
+ message: "Network body byte count disagrees with retained bytes",
58
+ });
59
+ if (createHash("sha256").update(bytes).digest("hex") !== artifact.sha256)
60
+ context.addIssue({
61
+ code: "custom",
62
+ path: ["sha256"],
63
+ message: "Network body digest disagrees with retained bytes",
64
+ });
65
+ }),
66
+ ]);
67
+ /** Headers retain producer order and duplicates, with credential values removed. */
68
+ export const browserNetworkHeadersSchema = z.union([
69
+ z.strictObject({ state: z.literal("not_requested") }),
70
+ z.strictObject({
71
+ state: z.literal("unavailable"),
72
+ message: z.string().min(1),
73
+ }),
74
+ z.strictObject({
75
+ state: z.literal("captured"),
76
+ items: z.array(z.strictObject({
77
+ name: z.string().min(1),
78
+ value: z.string().nullable(),
79
+ redacted: z.boolean(),
80
+ })),
81
+ }),
82
+ ]);
@@ -8,10 +8,12 @@ export class BrowserObservationError extends AnalysisError {
8
8
  cleanupIncomplete;
9
9
  cleanupResources;
10
10
  userCategory;
11
+ userMessage;
11
12
  constructor(operation, reason, options) {
12
13
  super(`Browser observation ${operation} failed: ${reason}`, options);
13
14
  this.operation = operation;
14
15
  this.reason = reason;
16
+ this.userMessage = options?.detail;
15
17
  this.cleanupIncomplete = reason === "cleanup_failed";
16
18
  this.cleanupResources =
17
19
  reason === "cleanup_failed" ? ["browser_transport"] : [];