rea-agents 6.1.0 → 6.3.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 (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,5 +1,11 @@
1
1
  import { z } from "zod";
2
2
  import { jsonValueSchema } from "../jsonValue.js";
3
+ /** Project normalized PTY facts without source text used only for audit. */
4
+ export const comparableTerminalFrame = (frame) => ({
5
+ sequence: frame.sequence,
6
+ at_ms: frame.at_ms,
7
+ data: frame.data,
8
+ });
3
9
  /** Process-capture observation families shared by live drivers and trace assertions. */
4
10
  export const processObservationSourceSchema = z.enum([
5
11
  "terminal_raw",
@@ -67,11 +73,13 @@ export const processObservationSubject = (source, value) => {
67
73
  const projectedRecord = (capture, location) => {
68
74
  const projected = (() => {
69
75
  switch (location.collection) {
70
- case "frames":
76
+ case "frames": {
77
+ const frame = capture.frames[location.index];
71
78
  return {
72
79
  source: "terminal_raw",
73
- value: capture.frames[location.index],
80
+ value: frame === undefined ? undefined : comparableTerminalFrame(frame),
74
81
  };
82
+ }
75
83
  case "rendered_frames":
76
84
  return {
77
85
  source: "terminal_rendered",
@@ -4,17 +4,36 @@ import { z } from "zod";
4
4
  const positiveBudget = z.number().int().safe().positive();
5
5
  const timedEventBase = { at_ms: z.number().int().safe().nonnegative() };
6
6
  const reservedRunIdEnvironmentName = "REA_PROCESS_RUN_ID";
7
+ const ENVIRONMENT_NAME_CHARACTER = "[^=\\x00]";
8
+ /**
9
+ * Nonempty environment names other than the reserved run identifier. The
10
+ * exclusion is spelled as a complement instead of a negative look-ahead,
11
+ * because RE2 and Rust schema validators reject look-around and would refuse
12
+ * every tool in the advertised catalog.
13
+ */
14
+ const environmentNamePattern = (reserved) => {
15
+ // After the complete reserved name, at least one more character is needed.
16
+ let rest = `${ENVIRONMENT_NAME_CHARACTER}+`;
17
+ for (let index = reserved.length - 1; index >= 0; index -= 1) {
18
+ const character = reserved[index] ?? "";
19
+ // Diverge here, match the next reserved character, or (after a nonempty
20
+ // prefix) end the name early.
21
+ const choice = `[^=\\x00${character}]${ENVIRONMENT_NAME_CHARACTER}*|${character}${rest}`;
22
+ rest = index === 0 ? choice : `(?:${choice})?`;
23
+ }
24
+ return new RegExp(`^(?:${rest})$`, "u");
25
+ };
7
26
  const environmentName = z
8
27
  .string()
9
28
  .min(1, "Environment names must not be empty")
10
- .regex(/^(?!REA_PROCESS_RUN_ID(?![\s\S]))[^=\0]+$/u, {
29
+ .regex(environmentNamePattern(reservedRunIdEnvironmentName), {
11
30
  error: (issue) => issue.input === reservedRunIdEnvironmentName
12
31
  ? `${reservedRunIdEnvironmentName} is reserved by the process adapter`
13
32
  : "Environment names cannot contain '=' or NUL",
14
33
  });
15
34
  const childProcessString = z
16
35
  .string()
17
- .regex(/^[^\0]*$/u, "Values passed to operating-system APIs cannot contain NUL");
36
+ .regex(/^[^\x00]*$/u, "Values passed to operating-system APIs cannot contain NUL");
18
37
  export const normalizationSchema = z.object({
19
38
  paths: z.boolean(),
20
39
  pids: z.boolean(),
@@ -62,6 +81,9 @@ export const processComparisonContract = (scenario) => ({
62
81
  settle_ms: scenario.settle_ms,
63
82
  limits: scenario.limits,
64
83
  normalization: scenario.normalization,
84
+ ...(scenario.normalization.ports
85
+ ? { port_normalization_version: "contextual-endpoints-v2" }
86
+ : {}),
65
87
  });
66
88
  /**
67
89
  * Boundary schema for one bounded process experiment.
@@ -1,7 +1,5 @@
1
1
  import { evaluateProcessTraceSide, processTraceComparisonResultSchema, } from "./processTraceEvaluation.js";
2
2
  import { processTraceSpecificationSchema, } from "./processTraceSpecification.js";
3
- export { processTraceComparisonResultSchema, } from "./processTraceEvaluation.js";
4
- export { processTraceSpecificationSchema, } from "./processTraceSpecification.js";
5
3
  /** Compare two captures against an explicit finite trace language. */
6
4
  export const compareProcessTraces = (left, right, specificationInput) => {
7
5
  const specification = processTraceSpecificationSchema.parse(specificationInput);
@@ -1,4 +1,4 @@
1
- /** Map declared trace sources to legacy process-comparison dimensions. */
1
+ /** Map declared trace sources to process-comparison dimensions. */
2
2
  export const dimensionsForTraceSources = (sources) => {
3
3
  const dimensions = new Set();
4
4
  for (const source of sources) {
@@ -1,11 +1,11 @@
1
1
  import { z } from "zod";
2
- import { processObservationLocationSchema, projectProcessObservation, } from "./processObservation.js";
3
- import { canonicalTraceJson, comparableTracePayload, processTraceCardinalityBounds, } from "./processTraceSpecification.js";
4
- const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]{0,63}$/u);
5
- const locationSchema = processObservationLocationSchema;
2
+ import { processSourceTruncated } from "./processCaptureCoverage.js";
3
+ import { comparableProcessObservationPayload, processObservationLocationSchema, projectProcessObservation, } from "./processObservation.js";
4
+ import { canonicalTraceJson, processTraceCardinalityBounds, } from "./processTraceSpecification.js";
5
+ const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._\x2d]{0,63}$/u);
6
6
  const matchedEventSchema = z.strictObject({
7
7
  event_id: identifierSchema,
8
- location: locationSchema,
8
+ location: processObservationLocationSchema,
9
9
  });
10
10
  const sideResultShape = {
11
11
  satisfied_constraints: z.array(z.string()),
@@ -36,7 +36,7 @@ const diagnosticSchema = z.strictObject({
36
36
  side: z.enum(["left", "right"]),
37
37
  message: z.string(),
38
38
  event_ids: z.array(identifierSchema),
39
- locations: z.array(locationSchema),
39
+ locations: z.array(processObservationLocationSchema),
40
40
  });
41
41
  /** Structured verdict for one declared process trace language. */
42
42
  export const processTraceComparisonResultSchema = z.strictObject({
@@ -56,11 +56,11 @@ const scopesFor = (sources) => new Set([...sources].map((source) => {
56
56
  return "process";
57
57
  return "interaction";
58
58
  }));
59
- const unknownSide = () => ({
59
+ const unknownSide = (rawTrace = []) => ({
60
60
  status: "unknown",
61
61
  matched_variant: null,
62
62
  satisfied_constraints: [],
63
- raw_trace: [],
63
+ raw_trace: rawTrace,
64
64
  });
65
65
  const failure = (input) => ({
66
66
  result: {
@@ -102,7 +102,7 @@ const evaluateFiniteTrace = (ids, specification) => {
102
102
  };
103
103
  const collectRecords = (capture, sources) => {
104
104
  const records = [];
105
- for (const location of capture.event_journal ?? []) {
105
+ for (const location of capture.event_journal) {
106
106
  const record = projectProcessObservation(capture, location);
107
107
  if (record !== null && sources.has(record.source))
108
108
  records.push({
@@ -121,10 +121,10 @@ const matchRecords = (records, specification) => {
121
121
  for (const event of specification.events) {
122
122
  const ignoredFields = event.ignore_fields ?? [];
123
123
  ignoredFieldsBySource.set(event.source, ignoredFields);
124
- eventsByKey.set(`${event.source}\0${canonicalTraceJson(comparableTracePayload(event.exact, ignoredFields))}`, event);
124
+ eventsByKey.set(`${event.source}\0${canonicalTraceJson(comparableProcessObservationPayload(event.exact, ignoredFields))}`, event);
125
125
  }
126
126
  for (const record of records) {
127
- const match = eventsByKey.get(`${record.source}\0${canonicalTraceJson(comparableTracePayload(record.payload, ignoredFieldsBySource.get(record.source)))}`);
127
+ const match = eventsByKey.get(`${record.source}\0${canonicalTraceJson(comparableProcessObservationPayload(record.payload, ignoredFieldsBySource.get(record.source)))}`);
128
128
  if (match === undefined)
129
129
  return failure({
130
130
  kind: "predicate",
@@ -296,10 +296,9 @@ const evaluateMatchedTrace = (trace, specification) => {
296
296
  export const evaluateProcessTraceSide = (capture, specification) => {
297
297
  const sources = new Set(specification.events.map(({ source }) => source));
298
298
  const relevantScopes = scopesFor(sources);
299
- if (capture.truncated ||
300
- capture.residual_unknowns.some(({ scope }) => relevantScopes.has(scope)))
301
- return { result: unknownSide(), diagnostic: null };
302
- if ((capture.event_journal ?? []).length === 0)
299
+ const incomplete = [...sources].some((source) => processSourceTruncated(capture, source)) ||
300
+ capture.residual_unknowns.some(({ scope }) => relevantScopes.has(scope));
301
+ if (capture.event_journal.length === 0)
303
302
  return {
304
303
  result: unknownSide(),
305
304
  diagnostic: {
@@ -310,6 +309,11 @@ export const evaluateProcessTraceSide = (capture, specification) => {
310
309
  },
311
310
  };
312
311
  const matched = matchRecords(collectRecords(capture, sources), specification);
312
+ if (incomplete)
313
+ return {
314
+ result: unknownSide("rawTrace" in matched ? matched.rawTrace : matched.result.raw_trace),
315
+ diagnostic: null,
316
+ };
313
317
  return "rawTrace" in matched
314
318
  ? evaluateMatchedTrace(matched, specification)
315
319
  : matched;
@@ -1,10 +1,9 @@
1
1
  import canonicalize from "canonicalize";
2
2
  import { z } from "zod";
3
+ import { IDENTIFIER_PATTERN } from "../stringPatterns.js";
3
4
  import { jsonValueSchema } from "../jsonValue.js";
4
5
  import { comparableProcessObservationPayload, processObservationSourceSchema, } from "./processObservation.js";
5
- const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
6
- /** Process observation families admitted by a declared trace specification. */
7
- export const processTraceSourceSchema = processObservationSourceSchema;
6
+ const identifierSchema = z.string().regex(IDENTIFIER_PATTERN);
8
7
  const cardinalitySchema = z.discriminatedUnion("kind", [
9
8
  z.strictObject({ kind: z.literal("required") }),
10
9
  z.strictObject({ kind: z.literal("optional") }),
@@ -25,7 +24,7 @@ const cardinalitySchema = z.discriminatedUnion("kind", [
25
24
  ]);
26
25
  const eventDeclarationSchema = z.strictObject({
27
26
  id: identifierSchema,
28
- source: processTraceSourceSchema,
27
+ source: processObservationSourceSchema,
29
28
  exact: jsonValueSchema,
30
29
  ignore_fields: z
31
30
  .array(z.enum([
@@ -87,8 +86,6 @@ export const canonicalTraceJson = (value) => {
87
86
  throw new TypeError("Trace specification contains a non-JSON value");
88
87
  return serialized;
89
88
  };
90
- /** Remove only explicitly declared schedule metadata before exact matching. */
91
- export const comparableTracePayload = (value, ignoredFields = []) => comparableProcessObservationPayload(value, ignoredFields);
92
89
  export const processTraceCardinalityBounds = (cardinality) => {
93
90
  switch (cardinality.kind) {
94
91
  case "required":
@@ -353,7 +350,7 @@ export const processTraceSpecificationSchema = specificationShapeSchema.superRef
353
350
  message: "exact payload must omit every ignored schedule field",
354
351
  path: ["events", index, "exact"],
355
352
  });
356
- const predicate = `${event.source}\0${canonicalTraceJson(comparableTracePayload(event.exact, ignoredFields))}`;
353
+ const predicate = `${event.source}\0${canonicalTraceJson(comparableProcessObservationPayload(event.exact, ignoredFields))}`;
357
354
  if (predicates.has(predicate))
358
355
  context.addIssue({
359
356
  code: "custom",
@@ -4,11 +4,13 @@ export class ProviderAdapterError extends AnalysisError {
4
4
  providerId;
5
5
  operation;
6
6
  _tag = "ProviderAdapterError";
7
+ userMessage;
7
8
  diagnostics;
8
9
  constructor(providerId, operation, options = {}) {
9
10
  super(`Provider ${providerId} adapter failed during ${operation}`, options);
10
11
  this.providerId = providerId;
11
12
  this.operation = operation;
13
+ this.userMessage = options.userMessage;
12
14
  this.diagnostics =
13
15
  options.diagnostics === undefined
14
16
  ? undefined
@@ -7,8 +7,12 @@ export class ProviderCleanupError extends ProviderAdapterError {
7
7
  constructor(providerId, resources, diagnostics,
8
8
  /** Identify the operation owning these resources; binary callers retain their default. */
9
9
  options) {
10
- const { operation = "close_binary", ...errorOptions } = options ?? {};
11
- super(providerId, operation, { ...errorOptions, diagnostics });
10
+ const { operation = "close_binary", partialObservation, ...errorOptions } = options ?? {};
11
+ super(providerId, operation, {
12
+ ...errorOptions,
13
+ ...(partialObservation === undefined ? {} : { partialObservation }),
14
+ diagnostics,
15
+ });
12
16
  this.cleanupResources = [...resources];
13
17
  }
14
18
  }
@@ -1,12 +1,16 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
+ import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
4
5
  import { evidenceBundleSchema, parseEvidenceBundle } from "./evidenceBundle.js";
5
6
  import { evaluateReconstructionClaims, evaluateReconstructionPackageProofs, evaluateReconstructionSurfaces, evaluateReconstructionCoverageRisks, recommendedReconstructionProbes, } from "./reconstructionCoverageEvaluation.js";
6
7
  import { digestSchema } from "./../domain/digests.js";
7
8
  import { prefixedDigestSchema } from "./../domain/digests.js";
9
+ import { offsetDateTimeSchema } from "./offsetDateTime.js";
8
10
  const evidenceIdSchema = prefixedDigestSchema("ev");
9
- const stableIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._:/-]{0,199}$/u);
11
+ const stableIdSchema = z
12
+ .string()
13
+ .regex(/^[A-Za-z][A-Za-z0-9._:\x2f\x2d]{0,199}$/u);
10
14
  const boundedTextSchema = z.string().trim().min(1);
11
15
  const authoritySchema = z.enum([
12
16
  "observed",
@@ -86,7 +90,7 @@ const verifierContractSchema = verifierContractBaseSchema.extend({
86
90
  const verifierResultSchema = z.strictObject({
87
91
  verifier_id: stableIdSchema,
88
92
  contract_sha256: digestSchema,
89
- observed_at: z.string().datetime({ offset: true }),
93
+ observed_at: offsetDateTimeSchema,
90
94
  status: z.enum([
91
95
  "pass",
92
96
  "fail",
@@ -312,7 +316,7 @@ const closureStatus = (reasons) => {
312
316
  return "unknown";
313
317
  return "partial";
314
318
  };
315
- const reasonOrder = (left, right) => `${left.code}:${left.subject_id}`.localeCompare(`${right.code}:${right.subject_id}`);
319
+ const reasonOrder = (left, right) => compareUnicodeCodePoints(compositeKey([left.code, left.subject_id]), compositeKey([right.code, right.subject_id]));
316
320
  const digest = (value) => {
317
321
  const encoded = canonicalize(value);
318
322
  if (encoded === undefined)
@@ -1,9 +1,10 @@
1
1
  import { z } from "zod";
2
+ import { STABLE_IDENTIFIER_PATTERN } from "./stringPatterns.js";
2
3
  import { evidenceBundleSchema } from "./evidenceBundle.js";
3
4
  import { digestSchema } from "./../domain/digests.js";
4
5
  import { prefixedDigestSchema } from "./../domain/digests.js";
5
6
  const evidenceIdSchema = prefixedDigestSchema("ev");
6
- const stableIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._:/-]*$/u);
7
+ const stableIdSchema = z.string().regex(STABLE_IDENTIFIER_PATTERN);
7
8
  const textSchema = z.string().trim().min(1);
8
9
  export const obligationStatusSchema = z.enum([
9
10
  "unowned",
@@ -1,10 +1,11 @@
1
1
  import { z } from "zod";
2
+ import { STABLE_IDENTIFIER_PATTERN } from "./stringPatterns.js";
2
3
  import { evidenceBundleSchema } from "./evidenceBundle.js";
3
4
  import { reconstructionObligationLedgerSchema } from "./reconstructionObligationLedgerSchemas.js";
4
5
  import { digestSchema } from "./../domain/digests.js";
5
6
  import { prefixedDigestSchema } from "./../domain/digests.js";
6
7
  const evidenceIdSchema = prefixedDigestSchema("ev");
7
- const stableIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._:/-]*$/u);
8
+ const stableIdSchema = z.string().regex(STABLE_IDENTIFIER_PATTERN);
8
9
  const boundedTextSchema = z.string().trim().min(1);
9
10
  export const readinessStatusSchema = z.enum([
10
11
  "pass",
@@ -1,4 +1,5 @@
1
1
  import { uniqueSorted } from "./canonicalOrdering.js";
2
+ import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
2
3
  /** Select the latest revision of each residual unknown. */
3
4
  export const reconstructionUnknownHeads = (revisions) => {
4
5
  const heads = new Map();
@@ -44,7 +45,7 @@ export const reconstructionClaimUnknowns = (heads, comparisonId, sourceIds) => {
44
45
  const unknown = heads.get(id);
45
46
  return unknown === undefined ? [] : [unknown];
46
47
  })
47
- .sort((left, right) => left.unknown_id.localeCompare(right.unknown_id, "en"));
48
+ .sort((left, right) => compareUnicodeCodePoints(left.unknown_id, right.unknown_id));
48
49
  };
49
50
  /** Aggregate deterministic probes for unresolved claims. */
50
51
  export const reconstructionProbes = (results, heads) => {
@@ -57,7 +58,7 @@ export const reconstructionProbes = (results, heads) => {
57
58
  const probes = unknowns.flatMap(({ recommended_probes: items }) => items);
58
59
  const candidates = probes.length > 0 ? probes : [defaultProbe(result.kind)];
59
60
  for (const probe of candidates) {
60
- const key = `${probe.operation}\0${probe.rationale}`;
61
+ const key = compositeKey([probe.operation, probe.rationale]);
61
62
  const current = output.get(key) ?? {
62
63
  ...probe,
63
64
  claim_ids: [],
@@ -71,7 +72,7 @@ export const reconstructionProbes = (results, heads) => {
71
72
  output.set(key, current);
72
73
  }
73
74
  }
74
- const sorted = [...output.values()].sort((left, right) => `${left.operation}\0${left.rationale}`.localeCompare(`${right.operation}\0${right.rationale}`, "en"));
75
+ const sorted = [...output.values()].sort((left, right) => compareUnicodeCodePoints(compositeKey([left.operation, left.rationale]), compositeKey([right.operation, right.rationale])));
75
76
  return sorted;
76
77
  };
77
78
  const defaultProbe = (kind) => kind === "behavioral"
@@ -4,16 +4,17 @@ import { z } from "zod";
4
4
  import { artifactComparisonResultSchema } from "./artifactComparison.js";
5
5
  import { artifactInventoryResultSchema } from "./artifactGraph.js";
6
6
  import { uniqueSorted } from "./canonicalOrdering.js";
7
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
7
8
  import { comparisonSourceEvidenceSides } from "./comparisonSourceEvidence.js";
8
9
  import { parseEvidence } from "./evidence.js";
9
10
  import { parseEvidenceBundle } from "./evidenceBundle.js";
10
- import { functionComparisonResultSchema } from "./functionComparison.js";
11
+ import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
11
12
  import { PROCESS_PROVIDER, isProcessEvidenceProvider, } from "./process/processEvidenceProvider.js";
12
13
  import { functionDossierSchema } from "./hopperValues.js";
13
- import { deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, parseProcessCapture, } from "./process/processCapture.js";
14
+ import { deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/processComparison.js";
15
+ import { parseProcessCapture } from "./process/processCaptureParsing.js";
14
16
  import { reconstructionClaimResultSchema, reconstructionSpecificationSchema, reconstructionVerificationResultSchema, } from "./reconstructionVerificationSchemas.js";
15
17
  import { reconstructionClaimUnknowns, reconstructionProbes, reconstructionUnknownHeads, } from "./reconstructionUnknowns.js";
16
- export { reconstructionVerificationInputSchema, reconstructionVerificationResultSchema, } from "./reconstructionVerificationSchemas.js";
17
18
  const providers = {
18
19
  behavioral: {
19
20
  operation: "compare_process_captures",
@@ -42,7 +43,7 @@ export const verifyReconstruction = (specificationInput, bundleInput) => {
42
43
  const heads = reconstructionUnknownHeads(bundle.unknowns);
43
44
  const results = specification.claims
44
45
  .map((claim) => evaluateClaim(claim, records, heads))
45
- .sort((left, right) => left.claim_id.localeCompare(right.claim_id, "en"));
46
+ .sort((left, right) => compareUnicodeCodePoints(left.claim_id, right.claim_id));
46
47
  const failed = count(results, "fail");
47
48
  const unresolved = count(results, "unknown");
48
49
  const probes = reconstructionProbes(results, heads);
@@ -51,7 +52,7 @@ export const verifyReconstruction = (specificationInput, bundleInput) => {
51
52
  status: failed > 0 ? "fail" : unresolved > 0 ? "unknown" : "pass",
52
53
  specification_sha256: digest({
53
54
  ...specification,
54
- claims: [...specification.claims].sort((left, right) => left.claim_id.localeCompare(right.claim_id, "en")),
55
+ claims: [...specification.claims].sort((left, right) => compareUnicodeCodePoints(left.claim_id, right.claim_id)),
55
56
  }),
56
57
  summary: {
57
58
  total: results.length,
@@ -1,10 +1,11 @@
1
1
  import { z } from "zod";
2
+ import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
2
3
  import { digestSchema } from "./../domain/digests.js";
3
4
  import { prefixedDigestSchema } from "./../domain/digests.js";
4
5
  import { PROCESS_COMPARISON_DIMENSIONS } from "./process/processComparison.js";
5
6
  const evidenceIdSchema = prefixedDigestSchema("ev");
6
7
  const unknownIdSchema = prefixedDigestSchema("unk");
7
- const claimIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
8
+ const claimIdSchema = z.string().regex(IDENTIFIER_PATTERN);
8
9
  const titleSchema = z.string().trim().min(1);
9
10
  const verificationStatusSchema = z.enum(["pass", "fail", "unknown"]);
10
11
  const commonClaim = {
@@ -1,6 +1,7 @@
1
1
  import { posix } from "node:path";
2
2
  import { z } from "zod";
3
- import { canonicalDigest, canonicalJson } from "./comparisonSemantics.js";
3
+ import { canonicalJson } from "./comparisonSemantics.js";
4
+ import { digestCanonicalValue } from "./canonicalDigest.js";
4
5
  import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
5
6
  import { digestSchema } from "./../domain/digests.js";
6
7
  import { prefixedDigestSchema } from "./../domain/digests.js";
@@ -66,26 +67,27 @@ const sourceDirectorySchema = z.strictObject({
66
67
  const symlinkTargetSchema = z
67
68
  .string()
68
69
  .min(1)
69
- .refine((target) => target === "<outside-root>" ||
70
- isPortableAbsoluteSymlinkTarget(target) ||
70
+ .refine((target) => isPortableAbsoluteSymlinkTarget(target) ||
71
71
  (!target.startsWith("/") &&
72
72
  !target.includes("\\") &&
73
73
  posix.normalize(target) === target), "Expected a normalized POSIX symlink target");
74
74
  const isPortableAbsoluteSymlinkTarget = (target) => target.startsWith("/") ||
75
75
  /^[A-Za-z]:[\\/]/u.test(target) ||
76
76
  /^\\\\[^\\/]+[\\/][^\\/]+/u.test(target);
77
- const sourceSymlinkSchema = z.strictObject({
78
- ...entryBaseShape,
79
- kind: z.literal("symlink"),
80
- target: symlinkTargetSchema,
81
- target_state: z.enum([
82
- "internal",
83
- "external",
84
- "missing",
85
- "unreadable",
86
- "unknown",
87
- ]),
88
- });
77
+ const sourceSymlinkSchema = z.union([
78
+ z.strictObject({
79
+ ...entryBaseShape,
80
+ kind: z.literal("symlink"),
81
+ target: symlinkTargetSchema,
82
+ target_state: z.enum(["internal", "external", "missing"]),
83
+ }),
84
+ z.strictObject({
85
+ ...entryBaseShape,
86
+ kind: z.literal("symlink"),
87
+ target: z.null(),
88
+ target_state: z.enum(["unreadable", "unknown"]),
89
+ }),
90
+ ]);
89
91
  const sourceEntrySchema = z.union([
90
92
  sourceFileSchema,
91
93
  sourceDirectorySchema,
@@ -108,8 +110,6 @@ const exclusionSchema = z.strictObject({
108
110
  reason: z.enum([
109
111
  "configured-secret",
110
112
  "symlink-escape",
111
- "size-limit",
112
- "inventory-limit",
113
113
  "unreadable",
114
114
  "caller-excluded",
115
115
  ]),
@@ -152,7 +152,7 @@ const graphShape = {
152
152
  caller: z
153
153
  .string()
154
154
  .min(1)
155
- .regex(/^[\w .:@/+-]+$/u),
155
+ .regex(/^[\w .:@\x2f+\x2d]+$/u),
156
156
  }),
157
157
  limitations: z.array(boundedTextSchema),
158
158
  };
@@ -232,13 +232,11 @@ const checkSymlinks = (graph, paths, context) => {
232
232
  for (const [index, entry] of graph.entries.entries()) {
233
233
  if (entry.kind !== "symlink")
234
234
  continue;
235
+ if (entry.target === null)
236
+ continue;
235
237
  const absolute = isPortableAbsoluteSymlinkTarget(entry.target);
236
- if ((entry.target_state === "external" &&
237
- entry.target !== "<outside-root>" &&
238
- !absolute) ||
239
- (entry.target_state === "internal" &&
240
- (entry.target === "<outside-root>" || absolute)) ||
241
- (entry.target_state === "missing" && entry.target === "<outside-root>"))
238
+ if ((entry.target_state === "external" && !absolute) ||
239
+ (entry.target_state === "internal" && absolute))
242
240
  context.addIssue({
243
241
  code: "custom",
244
242
  message: "Symlink target path does not match its target state",
@@ -332,7 +330,7 @@ const rootCommitment = (entries, exclusions) => ({
332
330
  }),
333
331
  exclusions,
334
332
  });
335
- const computeRootSha256 = (entries, exclusions) => canonicalDigest(rootCommitment(entries, exclusions), "Reference source graph");
333
+ const computeRootSha256 = (entries, exclusions) => digestCanonicalValue(rootCommitment(entries, exclusions), "Reference source graph");
336
334
  /** Build and internally commit a normalized historical source graph. */
337
335
  export const createHistoricalSourceGraph = (input) => {
338
336
  const parsed = historicalSourceGraphInputSchema.parse(input);
@@ -344,7 +342,7 @@ export const createHistoricalSourceGraph = (input) => {
344
342
  /** Parse a graph and reject stale or caller-invented root commitments. */
345
343
  export const parseHistoricalSourceGraph = (input) => historicalSourceGraphSchema.parse(input);
346
344
  /** Compute a deterministic graph commitment containing no absolute root path. */
347
- export const computeHistoricalSourceGraphSha256 = (input) => canonicalDigest(parseHistoricalSourceGraph(input), "Reference source graph");
345
+ export const computeHistoricalSourceGraphSha256 = (input) => digestCanonicalValue(parseHistoricalSourceGraph(input), "Reference source graph");
348
346
  /** Build a deterministic, relocation-independent manifest for a source graph. */
349
347
  export const createHistoricalSourceManifest = (input) => {
350
348
  const graph = parseHistoricalSourceGraph(input);
@@ -359,14 +357,15 @@ export const createHistoricalSourceManifest = (input) => {
359
357
  };
360
358
  return historicalSourceManifestBaseSchema.parse({
361
359
  ...semantic,
362
- manifest_id: `hsm_${canonicalDigest(semantic, "Reference source graph")}`,
360
+ manifest_id: `hsm_${digestCanonicalValue(semantic, "Reference source graph")}`,
363
361
  });
364
362
  };
365
363
  /** Parse and verify a historical source manifest's semantic identifier. */
366
364
  export const parseHistoricalSourceManifest = (input) => {
367
365
  const manifest = historicalSourceManifestBaseSchema.parse(input);
368
366
  const { manifest_id: manifestId, ...semantic } = manifest;
369
- if (`hsm_${canonicalDigest(semantic, "Reference source graph")}` !== manifestId)
367
+ if (`hsm_${digestCanonicalValue(semantic, "Reference source graph")}` !==
368
+ manifestId)
370
369
  throw new TypeError("Historical source manifest identifier does not match");
371
370
  return manifest;
372
371
  };
@@ -1,5 +1,7 @@
1
1
  import { parse } from "@babel/parser";
2
- import { isCallExpression, isExportAllDeclaration, isExportNamedDeclaration, isIdentifier, isImport, isImportDeclaration, isImportExpression, isMemberExpression, isNode, isStringLiteral, isTSExternalModuleReference, isTSImportEqualsDeclaration, isTSModuleDeclaration, } from "@babel/types";
2
+ import { traverseJavaScriptAst } from "./javascript/javascriptSemanticTraversal.js";
3
+ import { parserPluginsForPath } from "./javascript/javascriptSourceParser.js";
4
+ import { isCallExpression, isExportAllDeclaration, isExportNamedDeclaration, isIdentifier, isImport, isImportDeclaration, isImportExpression, isMemberExpression, isStringLiteral, isTSExternalModuleReference, isTSImportEqualsDeclaration, isTSModuleDeclaration, } from "@babel/types";
3
5
  const codeSourceLanguages = new Set(["JavaScript", "TypeScript", "JSX", "TSX"]);
4
6
  const safeModuleName = (node) => {
5
7
  if (isStringLiteral(node))
@@ -112,40 +114,18 @@ const isRequireCallee = (callee) => {
112
114
  }
113
115
  return false;
114
116
  };
115
- const isImportCallee = (callee) => isImport(callee);
116
- const collectModuleExpressions = (node, targets) => {
117
- if (node === null || node === undefined)
118
- return;
119
- if (typeof node !== "object")
120
- return;
121
- if (Array.isArray(node)) {
122
- for (const item of node)
123
- collectModuleExpressions(item, targets);
124
- return;
125
- }
126
- if (!isNode(node))
127
- return;
128
- if (isCallExpression(node) || isImportExpression(node)) {
129
- targets.push(node);
130
- }
131
- for (const value of Object.values(node)) {
132
- if (value !== null &&
133
- value !== undefined &&
134
- typeof value === "object" &&
135
- !isSourceLocation(value)) {
136
- collectModuleExpressions(value, targets);
137
- }
138
- }
139
- };
140
- const isSourceLocation = (value) => typeof value === "object" &&
141
- value !== null &&
142
- "start" in value &&
143
- "end" in value &&
144
- !("type" in value);
145
117
  const extractRequireAndDynamicImports = (body, from_path, relationships) => {
118
+ // Single traversal owner: iterative, VISITOR_KEYS-gated, no recursion over
119
+ // loc/comment objects. Survives deeply nested generated member chains that
120
+ // overflowed the previous hand-rolled Object.values walker.
146
121
  const expressions = [];
147
122
  for (const statement of body)
148
- collectModuleExpressions(statement, expressions);
123
+ traverseJavaScriptAst(statement, {
124
+ enter: (node) => {
125
+ if (isCallExpression(node) || isImportExpression(node))
126
+ expressions.push(node);
127
+ },
128
+ });
149
129
  for (const call of expressions) {
150
130
  if (isImportExpression(call)) {
151
131
  const specifier = safeModuleName(call.source);
@@ -171,7 +151,7 @@ const extractRequireAndDynamicImports = (body, from_path, relationships) => {
171
151
  }
172
152
  continue;
173
153
  }
174
- if (isImportCallee(call.callee) && isModuleExpression(first)) {
154
+ if (isImport(call.callee) && isModuleExpression(first)) {
175
155
  const result = moduleSpecifierFromExpression(first);
176
156
  if (result !== undefined) {
177
157
  appendRelationship(relationships, {
@@ -185,17 +165,11 @@ const extractRequireAndDynamicImports = (body, from_path, relationships) => {
185
165
  }
186
166
  };
187
167
  const parseWithBabel = (path, source, language) => {
188
- const plugins = ["jsx"];
189
- if (language === "TypeScript" || language === "TSX") {
190
- plugins.push([
191
- "typescript",
192
- {
193
- dts: path.endsWith(".d.ts") ||
194
- path.endsWith(".d.mts") ||
195
- path.endsWith(".d.cts"),
196
- },
197
- ]);
198
- }
168
+ // Single parser-mode owner: path-driven plugins (dts/JSX/mts) shared with
169
+ // the semantic pipeline. `language` only gates non-JS/TS callers upstream;
170
+ // TypeScript syntax must parse identically here and in semantic analysis.
171
+ void language;
172
+ const plugins = parserPluginsForPath(path);
199
173
  try {
200
174
  const ast = parse(source, {
201
175
  sourceType: "unambiguous",
@@ -218,7 +192,22 @@ const parseWithBabel = (path, source, language) => {
218
192
  export const parseReferenceSourceImports = (path, bytes, language) => {
219
193
  if (language !== null && !codeSourceLanguages.has(language))
220
194
  return { relationships: [], parse_failures: [] };
221
- const source = new TextDecoder("utf-8", { fatal: false }).decode(bytes);
195
+ let source;
196
+ try {
197
+ source = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
198
+ }
199
+ catch {
200
+ return {
201
+ relationships: [],
202
+ parse_failures: [
203
+ {
204
+ path,
205
+ parser: "utf-8",
206
+ reason: "Source bytes are not valid UTF-8; import targets were not parsed.",
207
+ },
208
+ ],
209
+ };
210
+ }
222
211
  const { ast, reasons } = parseWithBabel(path, source, language);
223
212
  const parseFailures = reasons.map((reason) => ({
224
213
  path,