rea-agents 6.2.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 (297) hide show
  1. package/README.md +18 -20
  2. package/bridge/hopper_bridge.py +2 -0
  3. package/dist/android/JadxProvider.js +8 -2
  4. package/dist/android/JadxSession.js +51 -9
  5. package/dist/application/BinaryTargetResolver.js +63 -17
  6. package/dist/application/BrowserScenarioEvidence.js +2 -2
  7. package/dist/application/ClientConfigurationDocument.js +28 -0
  8. package/dist/application/ClientRegistrationStatus.js +19 -6
  9. package/dist/application/DirectAnalysis.js +12 -6
  10. package/dist/application/DirectAnalysisCleanup.js +0 -1
  11. package/dist/application/DirectAnalysisStatus.js +2 -5
  12. package/dist/application/Doctor.js +25 -34
  13. package/dist/application/DoctorDiagnostics.js +1 -1
  14. package/dist/application/EvidenceBundleFiles.js +1 -1
  15. package/dist/application/InvestigationProviders.js +4 -4
  16. package/dist/application/JsonFiles.js +15 -15
  17. package/dist/application/LinuxHopper.js +2 -1
  18. package/dist/application/ReconstructionObligationCandidates.js +9 -2
  19. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  20. package/dist/application/RegularFileRead.js +17 -0
  21. package/dist/application/Setup.js +18 -7
  22. package/dist/application/SetupClientConfiguration.js +18 -7
  23. package/dist/application/SetupHost.js +6 -4
  24. package/dist/application/SetupPlan.js +19 -15
  25. package/dist/application/SetupSkill.js +57 -8
  26. package/dist/application/SupportedClients.js +43 -0
  27. package/dist/application/Uninstall.js +18 -2
  28. package/dist/application/UpdateMaintenance.js +6 -2
  29. package/dist/application/Utf8JsonInput.js +64 -0
  30. package/dist/application/WebScriptExportService.js +13 -6
  31. package/dist/application/android/AndroidAnalysisService.js +1 -1
  32. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  33. package/dist/application/binary/BinarySession.js +16 -0
  34. package/dist/application/binary/BinarySessionOpen.js +9 -1
  35. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  36. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  37. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  38. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  39. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  40. package/dist/application/javascript/JavaScriptApplicationService.js +1 -0
  41. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  42. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +0 -6
  43. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +8 -18
  44. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +34 -26
  45. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +44 -12
  46. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +6 -3
  47. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  48. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  49. package/dist/application/javascript/JavaScriptModuleRelationships.js +5 -17
  50. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  51. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -2
  52. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  53. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  54. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  55. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +1 -1
  56. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  57. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  58. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +2 -2
  59. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +1 -1
  60. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  61. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  62. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +10 -7
  63. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  64. package/dist/application/native/NativeCallRoutes.js +2 -4
  65. package/dist/artifacts/ArtifactProvider.js +14 -16
  66. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  67. package/dist/artifacts/AsarArtifactReader.js +81 -17
  68. package/dist/artifacts/DirectoryArtifactReader.js +2 -2
  69. package/dist/artifacts/NativeDmgArtifactReader.js +152 -67
  70. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  71. package/dist/artifacts/apple/KeyedArchiveReader.js +54 -46
  72. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  73. package/dist/artifacts/extraction/ArtifactExtraction.js +29 -11
  74. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +7 -8
  75. package/dist/artifacts/inventory/classify.js +33 -14
  76. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  77. package/dist/artifacts/inventory/scanCanonical.js +28 -22
  78. package/dist/artifacts/inventory/scanReader.js +7 -11
  79. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  80. package/dist/browser/CdpBrowserProvider.js +4 -3
  81. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  82. package/dist/browser/CdpElectronInspection.js +2 -2
  83. package/dist/browser/CdpElectronProvider.js +4 -3
  84. package/dist/browser/CdpElectronScripts.js +2 -2
  85. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  86. package/dist/browser/PlaywrightBrowserScenarioProvider.js +6 -6
  87. package/dist/browser/PlaywrightScenarioBrowser.js +145 -42
  88. package/dist/browser/PlaywrightScenarioSession.js +3 -11
  89. package/dist/browser/WebSourceMapFetcher.js +32 -6
  90. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  91. package/dist/cli/coreAnalysisCommands.js +2 -2
  92. package/dist/cli/coreBinaryCommands.js +13 -9
  93. package/dist/cli/electronCommands.js +9 -10
  94. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  95. package/dist/cli/jsonOutput.js +3 -2
  96. package/dist/cli/streamedJsonOutput.js +83 -4
  97. package/dist/cli/utilityCommands.js +2 -4
  98. package/dist/cli.js +5 -2
  99. package/dist/cliJsonFile.js +179 -0
  100. package/dist/cliJsonInput.js +47 -34
  101. package/dist/cliObservationOptions.js +4 -0
  102. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  103. package/dist/composition/browserScenario.js +2 -2
  104. package/dist/composition/directAnalysis.js +2 -3
  105. package/dist/contracts/artifactComparisonExample.js +5 -5
  106. package/dist/contracts/errorSchemas.js +3 -1
  107. package/dist/contracts/functionComparisonExample.js +8 -0
  108. package/dist/contracts/inputSchemaPresentation.js +94 -3
  109. package/dist/contracts/javascript/electronToolContracts.js +2 -1
  110. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  111. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  112. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  113. package/dist/contracts/managed/managedToolContracts.js +3 -2
  114. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  115. package/dist/contracts/native/nativeToolContracts.js +1 -1
  116. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  117. package/dist/contracts/sessionStatusContract.js +3 -2
  118. package/dist/contracts/sessionToolContracts.js +3 -2
  119. package/dist/contracts/sessionToolSchemas.js +3 -2
  120. package/dist/contracts/toolOutputSchemaGroups.js +2 -2
  121. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  122. package/dist/domain/analysisErrorBase.js +5 -0
  123. package/dist/domain/analysisErrorPresentation.js +4 -2
  124. package/dist/domain/analysisSnapshot.js +3 -1
  125. package/dist/domain/analysisView/analysisView.js +1 -3
  126. package/dist/domain/android/androidPartialObservation.js +36 -0
  127. package/dist/domain/apple/dylibResolution.js +1 -1
  128. package/dist/domain/artifactComparison.js +4 -4
  129. package/dist/domain/artifactGraph.js +1 -1
  130. package/dist/domain/artifactIdentity.js +8 -8
  131. package/dist/domain/artifactInspection.js +8 -8
  132. package/dist/domain/artifactInventoryEvidence.js +5 -5
  133. package/dist/domain/browserCompleteness.js +3 -2
  134. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  135. package/dist/domain/browserScenarioNormalization.js +3 -3
  136. package/dist/domain/browserScenarioValues.js +3 -2
  137. package/dist/domain/callPath.js +8 -10
  138. package/dist/domain/canonicalDigest.js +7 -1
  139. package/dist/domain/canonicalOrdering.js +1 -13
  140. package/dist/domain/changedBehavior.js +2 -3
  141. package/dist/domain/comparisonSemantics.js +0 -5
  142. package/dist/domain/digests.js +0 -3
  143. package/dist/domain/evidence.js +10 -5
  144. package/dist/domain/evidenceBundle.js +51 -33
  145. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  146. package/dist/domain/functionComparison.js +2 -1
  147. package/dist/domain/functionComparisonNormalization.js +4 -3
  148. package/dist/domain/functionComparisonResults.js +2 -2
  149. package/dist/domain/functionDossierEvidence.js +2 -1
  150. package/dist/domain/hopperValues.js +11 -15
  151. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  152. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +2 -2
  153. package/dist/domain/javascript/electronStaticAnalysisIpc.js +9 -1
  154. package/dist/domain/javascript/electronStaticAnalysisNative.js +5 -3
  155. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  156. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  157. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  158. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  159. package/dist/domain/javascript/javascriptApplicationGraph.js +15 -13
  160. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  161. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  162. package/dist/domain/javascript/javascriptApplicationVersionItems.js +45 -34
  163. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +7 -7
  164. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  165. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  166. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  167. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  168. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  169. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  170. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  171. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  172. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  173. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  174. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -6
  175. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  176. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  177. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  178. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  179. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  180. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  181. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  182. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  183. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  184. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  185. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  186. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -6
  187. package/dist/domain/javascript/javascriptSemanticAnalysis.js +200 -8
  188. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  189. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  190. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  191. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  192. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  193. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  194. package/dist/domain/javascript/javascriptSemanticGraph.js +142 -35
  195. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  196. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  197. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  198. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +497 -113
  199. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  200. package/dist/domain/javascript/javascriptSemanticMutationValues.js +41 -27
  201. package/dist/domain/javascript/javascriptSemanticObjects.js +2 -6
  202. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  203. package/dist/domain/javascript/javascriptSemanticProjection.js +20 -14
  204. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  205. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  206. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  207. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  208. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  209. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  210. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  211. package/dist/domain/javascript/javascriptSemanticReturns.js +23 -27
  212. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  213. package/dist/domain/javascript/javascriptSemanticValues.js +135 -24
  214. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  215. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  216. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  217. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  218. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  219. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  220. package/dist/domain/jsonSerialization.js +109 -55
  221. package/dist/domain/jsonShape.js +46 -19
  222. package/dist/domain/localPath.js +10 -4
  223. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  224. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  225. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  226. package/dist/domain/native/nativeCallObservation.js +2 -4
  227. package/dist/domain/native/nativeValueFlow.js +5 -11
  228. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  229. package/dist/domain/process/processCapture.js +11 -10
  230. package/dist/domain/process/processCaptureCoverage.js +8 -5
  231. package/dist/domain/process/processCaptureExample.js +43 -0
  232. package/dist/domain/process/processCaptureValidation.js +4 -3
  233. package/dist/domain/process/processComparison.js +0 -23
  234. package/dist/domain/process/processScenario.js +3 -3
  235. package/dist/domain/process/processTraceEvaluation.js +4 -4
  236. package/dist/domain/process/processTraceSpecification.js +1 -3
  237. package/dist/domain/providerCleanupError.js +6 -2
  238. package/dist/domain/reconstructionCoverage.js +2 -1
  239. package/dist/domain/reconstructionUnknowns.js +4 -3
  240. package/dist/domain/reconstructionVerification.js +3 -2
  241. package/dist/domain/referenceSourceGraph.js +7 -7
  242. package/dist/domain/referenceSourceImportParsing.js +34 -45
  243. package/dist/domain/residualUnknown.js +3 -2
  244. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  245. package/dist/domain/swiftSymbolClassification.js +6 -1
  246. package/dist/domain/symbolAnalysis.js +17 -2
  247. package/dist/domain/unicodeCodePointOrder.js +6 -0
  248. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  249. package/dist/domain/webCaptureDiff.js +71 -29
  250. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  251. package/dist/domain/webInventory.js +3 -2
  252. package/dist/domain/webMcpDiscovery.js +4 -3
  253. package/dist/domain/webScriptExport.js +1 -1
  254. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  255. package/dist/dotnet/ManagedStaticProvider.js +10 -7
  256. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  257. package/dist/filesystem/RegularFile.js +41 -0
  258. package/dist/generatedPackageMetadata.js +1 -1
  259. package/dist/ghidra/GhidraClient.js +14 -4
  260. package/dist/ghidra/GhidraInstallation.js +111 -10
  261. package/dist/ghidra/GhidraLauncher.js +43 -19
  262. package/dist/hopper/HopperCleanup.js +1 -1
  263. package/dist/ida/IdaOperationRunner.js +2 -0
  264. package/dist/ida/IdaSessionClient.js +4 -2
  265. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  266. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  267. package/dist/inspector/V8InspectorProvider.js +60 -8
  268. package/dist/main/shutdown.js +76 -32
  269. package/dist/main/transport.js +1 -1
  270. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  271. package/dist/native/AppleObjcProperties.js +17 -7
  272. package/dist/native/LldbCallTracer.js +241 -75
  273. package/dist/native/NativeMacOSProvider.js +10 -5
  274. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  275. package/dist/process/ProcessOwnershipObservation.js +9 -13
  276. package/dist/process/capture/FilesystemSnapshot.js +88 -18
  277. package/dist/process/capture/ProcessCaptureLifecycle.js +13 -27
  278. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  279. package/dist/process/capture/ProcessHarness.js +8 -21
  280. package/dist/server/analysisAdmission.js +8 -0
  281. package/dist/server/createServer.js +22 -23
  282. package/dist/server/registerApplicationTools/compareExportShapes.js +2 -1
  283. package/dist/server/registerApplicationTools/helpers.js +3 -2
  284. package/dist/server/registerArtifactTools.js +2 -2
  285. package/dist/server/registerCloseLifecycleTool.js +6 -4
  286. package/dist/server/registerEnhancedTools.js +78 -73
  287. package/dist/server/registerEvidenceTools.js +54 -46
  288. package/dist/server/registerManagedTools.js +7 -4
  289. package/dist/server/registerOfficialTools.js +31 -25
  290. package/dist/server/registerSessionTools.js +9 -3
  291. package/native/windows/build/manifest.json +1 -1
  292. package/package.json +6 -3
  293. package/skills/reverse-engineer-anything/SKILL.md +5 -5
  294. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  295. package/dist/artifacts/inventory/policy.js +0 -2
  296. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  297. package/dist/server/registerNativeTools.js +0 -6
@@ -1,8 +1,21 @@
1
1
  import { JAVASCRIPT_APPLICATION_PROVIDER, JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER, MANAGED_WORKFLOW_PROVIDER, } from "../InvestigationProviders.js";
2
2
  import { isImmutableEvidence, parseEvidence, } from "../../domain/evidence.js";
3
+ import { AnalysisInputError, } from "../../domain/analysisErrorCore.js";
4
+ import { projectInputIssues } from "../../domain/inputIssueProjection.js";
5
+ import { err, ok } from "../../domain/result.js";
6
+ import { z } from "zod";
3
7
  import { analyzeJavaScriptApplicationInputSchema, javascriptApplicationAnalysisResultSchema, } from "../../domain/javascript/javascriptApplicationAnalysis.js";
4
8
  import { javascriptRuntimeReconciliationResultSchema } from "../../domain/javascript/javascriptRuntimeReconciliationSchemas.js";
5
9
  import { managedApplicationGraphResultSchema } from "../../domain/managed/managedApplicationGraph.js";
10
+ /** Convert typed parser issues into this workflow's caller-facing input error. */
11
+ export const applicationGraphEvidenceInputError = (operation, failure) => new AnalysisInputError(operation, undefined, failure.issues);
12
+ class InvalidApplicationGraphEvidence extends Error {
13
+ issues;
14
+ constructor(issues) {
15
+ super("Application graph Evidence failed input validation");
16
+ this.issues = issues;
17
+ }
18
+ }
6
19
  const ownedApplicationSources = new WeakMap();
7
20
  /** Retain the producer-validated meaning of its exact immutable result snapshot. */
8
21
  export const rememberOwnedApplicationGraphEvidence = (evidence, result) => {
@@ -11,44 +24,44 @@ export const rememberOwnedApplicationGraphEvidence = (evidence, result) => {
11
24
  evidence.operation !== "analyze_javascript_application" ||
12
25
  !providerMatches(evidence, JAVASCRIPT_APPLICATION_PROVIDER))
13
26
  throw new TypeError("Owned application Evidence must bind its exact validated immutable result");
14
- ownedApplicationSources.set(evidence, Object.freeze(staticApplicationSourceForResult(evidence, result)));
27
+ ownedApplicationSources.set(evidence, Object.freeze(staticApplicationSourceForResult(evidence, result, [])));
15
28
  return evidence;
16
29
  };
17
30
  /** Parse and authenticate one REA-produced JavaScript Application Graph Evidence. */
18
- export const parseApplicationGraphEvidence = (input) => {
19
- const evidence = parseEvidence(input);
31
+ export const parseApplicationGraphEvidence = (input, path = []) => captureInputValidation(() => {
32
+ const evidence = parseEvidenceInput(input, path);
20
33
  const owned = ownedApplicationSources.get(evidence);
21
34
  if (owned !== undefined)
22
35
  return owned;
23
- if (evidence.operation === "analyze_javascript_application" &&
24
- evidence.predicate_type === "rea.javascript-application-analysis" &&
25
- providerMatches(evidence, JAVASCRIPT_APPLICATION_PROVIDER))
26
- return staticApplicationSource(evidence);
27
- if (evidence.operation === "reconcile_javascript_runtime" &&
28
- evidence.predicate_type === "rea.javascript-runtime-reconciliation" &&
29
- providerMatches(evidence, JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER))
30
- return staticRuntimeSource(evidence);
31
- if (evidence.operation === "project_managed_application_graph" &&
32
- evidence.predicate_type === "rea.managed-application-graph" &&
33
- providerMatches(evidence, MANAGED_WORKFLOW_PROVIDER))
34
- return managedApplicationSource(evidence);
35
- throw new TypeError("Application workflow requires authenticated analyze_javascript_application, reconcile_javascript_runtime, or project_managed_application_graph Evidence");
36
+ if (evidence.operation === "analyze_javascript_application") {
37
+ requirePredicate(evidence, "rea.javascript-application-analysis", path);
38
+ requireProvider(evidence, JAVASCRIPT_APPLICATION_PROVIDER, path);
39
+ return staticApplicationSource(evidence, path);
40
+ }
41
+ if (evidence.operation === "reconcile_javascript_runtime") {
42
+ requirePredicate(evidence, "rea.javascript-runtime-reconciliation", path);
43
+ requireProvider(evidence, JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER, path);
44
+ return staticRuntimeSource(evidence, path);
45
+ }
46
+ if (evidence.operation === "project_managed_application_graph") {
47
+ requirePredicate(evidence, "rea.managed-application-graph", path);
48
+ requireProvider(evidence, MANAGED_WORKFLOW_PROVIDER, path);
49
+ return managedApplicationSource(evidence, path);
50
+ }
51
+ throw invalidEvidence(path, "operation", "Expected authenticated JavaScript analysis, runtime reconciliation, or managed application graph Evidence.");
52
+ });
53
+ const staticApplicationSource = (evidence, path) => {
54
+ const result = parseCallerValue((input) => javascriptApplicationAnalysisResultSchema.parse(input), evidence.normalized_result, [...path, "normalized_result"]);
55
+ return staticApplicationSourceForResult(evidence, result, path);
36
56
  };
37
- const staticApplicationSource = (evidence) => {
38
- const result = javascriptApplicationAnalysisResultSchema.parse(evidence.normalized_result);
39
- return staticApplicationSourceForResult(evidence, result);
40
- };
41
- const staticApplicationSourceForResult = (evidence, result) => {
57
+ const staticApplicationSourceForResult = (evidence, result, path) => {
42
58
  if (evidence.authority !== "shipped-artifact" ||
43
59
  evidence.confidence !== "derived")
44
- throw new TypeError("JavaScript application Evidence authority or confidence is invalid");
60
+ throw invalidEvidence(path, "authority", "JavaScript application Evidence must use shipped-artifact authority and derived confidence.");
45
61
  if (evidence.predicate_type !== "rea.javascript-application-analysis")
46
- throw new TypeError("JavaScript application Evidence predicate does not match its result shape");
47
- analyzeJavaScriptApplicationInputSchema.parse({
48
- input_path: result.input_path,
49
- ...evidence.parameters,
50
- });
51
- assertApplicationSubject(evidence, result);
62
+ throw invalidEvidence(path, "predicate_type", "JavaScript application Evidence predicate does not match its result shape.");
63
+ parseCallerValue((input) => analyzeJavaScriptApplicationInputSchema.parse(input), { input_path: result.input_path, ...evidence.parameters }, [...path, "parameters"]);
64
+ assertApplicationSubject(evidence, result, path);
52
65
  return {
53
66
  evidence,
54
67
  graph: result.graph,
@@ -57,16 +70,17 @@ const staticApplicationSourceForResult = (evidence, result) => {
57
70
  semanticGraph: result.semantic_graph,
58
71
  };
59
72
  };
60
- const staticRuntimeSource = (evidence) => {
73
+ const staticRuntimeSource = (evidence, path) => {
61
74
  if (evidence.authority !== "analyst-inference" ||
62
75
  evidence.confidence !== "inferred")
63
- throw new TypeError("JavaScript runtime reconciliation Evidence authority or confidence is invalid");
64
- const result = javascriptRuntimeReconciliationResultSchema.parse(evidence.normalized_result);
65
- if (result.evidence_links.some((evidenceId) => !evidence.evidence_links.includes(evidenceId)))
66
- throw new TypeError("Runtime reconciliation result references Evidence outside its envelope");
76
+ throw invalidEvidence(path, "authority", "Runtime reconciliation Evidence must use analyst-inference authority and inferred confidence.");
77
+ const result = parseCallerValue((input) => javascriptRuntimeReconciliationResultSchema.parse(input), evidence.normalized_result, [...path, "normalized_result"]);
78
+ const unmatchedLink = result.evidence_links.find((evidenceId) => !evidence.evidence_links.includes(evidenceId));
79
+ if (unmatchedLink !== undefined)
80
+ throw invalidEvidence([...path, "normalized_result"], "evidence_links", `Runtime reconciliation result references Evidence ${unmatchedLink} outside its envelope.`);
67
81
  const applicationLayer = result.static_layers.find(({ role }) => role === "application");
68
82
  if (applicationLayer === undefined)
69
- throw new TypeError("Runtime reconciliation application layer is missing");
83
+ throw invalidEvidence([...path, "normalized_result"], "static_layers", "Runtime reconciliation Evidence must include its application layer.");
70
84
  return {
71
85
  evidence,
72
86
  graph: result.graph,
@@ -75,13 +89,14 @@ const staticRuntimeSource = (evidence) => {
75
89
  semanticGraph: null,
76
90
  };
77
91
  };
78
- const managedApplicationSource = (evidence) => {
92
+ const managedApplicationSource = (evidence, path) => {
79
93
  if (evidence.authority !== "analyst-inference" ||
80
94
  evidence.confidence !== "inferred")
81
- throw new TypeError("Managed application graph Evidence authority or confidence is invalid");
82
- const result = managedApplicationGraphResultSchema.parse(evidence.normalized_result);
83
- if (result.evidence_links.some((evidenceId) => !evidence.evidence_links.includes(evidenceId)))
84
- throw new TypeError("Managed application graph result references Evidence outside its envelope");
95
+ throw invalidEvidence(path, "authority", "Managed application graph Evidence must use analyst-inference authority and inferred confidence.");
96
+ const result = parseCallerValue((input) => managedApplicationGraphResultSchema.parse(input), evidence.normalized_result, [...path, "normalized_result"]);
97
+ const unmatchedLink = result.evidence_links.find((evidenceId) => !evidence.evidence_links.includes(evidenceId));
98
+ if (unmatchedLink !== undefined)
99
+ throw invalidEvidence([...path, "normalized_result"], "evidence_links", `Managed application graph result references Evidence ${unmatchedLink} outside its envelope.`);
85
100
  return {
86
101
  evidence,
87
102
  graph: result.graph,
@@ -90,23 +105,69 @@ const managedApplicationSource = (evidence) => {
90
105
  semanticGraph: null,
91
106
  };
92
107
  };
93
- const assertApplicationSubject = (evidence, result) => {
108
+ const assertApplicationSubject = (evidence, result, path) => {
94
109
  if (evidence.subject === null ||
95
110
  evidence.subject.digest.sha256 !== result.root_artifact_sha256 ||
96
111
  evidence.subject.format !== result.format ||
97
112
  evidence.subject.local_path !== result.input_path)
98
- throw new TypeError("JavaScript application Evidence subject does not match its result");
113
+ throw invalidEvidence(path, "subject", "JavaScript application Evidence subject must match the analyzed artifact identity and input path.");
99
114
  };
100
115
  const providerMatches = (evidence, provider) => evidence.provider.id === provider.id &&
101
116
  evidence.provider.name === provider.name &&
102
117
  evidence.provider.version === provider.version;
118
+ const requirePredicate = (evidence, expected, path) => {
119
+ if (evidence.predicate_type !== expected)
120
+ throw invalidEvidence(path, "predicate_type", `Expected predicate ${expected} for operation ${evidence.operation}.`);
121
+ };
122
+ const requireProvider = (evidence, expected, path) => {
123
+ if (!providerMatches(evidence, expected))
124
+ throw invalidEvidence(path, "provider", `Expected provider ${expected.id} v${expected.version} for operation ${evidence.operation}.`);
125
+ };
103
126
  /** Parse unique, artifact-bound Evidence that may extend a native handoff. */
104
- export const parseNativeApplicationEvidence = (inputs) => {
105
- const parsed = inputs.map((input) => parseEvidence(input));
106
- if (parsed.some(({ subject }) => subject === null))
107
- throw new TypeError("Native handoff Evidence requires an artifact subject");
127
+ export const parseNativeApplicationEvidence = (inputs, path = []) => captureInputValidation(() => {
128
+ const parsed = inputs.map((input, index) => parseEvidenceInput(input, [...path, index]));
129
+ const withoutSubject = parsed.findIndex(({ subject }) => subject === null);
130
+ if (withoutSubject !== -1)
131
+ throw invalidEvidence([...path, withoutSubject], "subject", "Native handoff Evidence requires an artifact subject.");
108
132
  const ids = parsed.map(({ evidence_id: id }) => id);
109
133
  if (new Set(ids).size !== ids.length)
110
- throw new TypeError("Native handoff Evidence must be unique");
134
+ throw invalidEvidence(path, "evidence_id", "Native handoff Evidence must be unique.");
111
135
  return parsed;
136
+ });
137
+ const captureInputValidation = (operation) => {
138
+ try {
139
+ return ok(operation());
140
+ }
141
+ catch (cause) {
142
+ if (cause instanceof InvalidApplicationGraphEvidence)
143
+ return err({ issues: cause.issues });
144
+ throw cause;
145
+ }
146
+ };
147
+ const parseEvidenceInput = (input, path) => {
148
+ try {
149
+ return parseEvidence(input);
150
+ }
151
+ catch (cause) {
152
+ if (cause instanceof z.ZodError)
153
+ throw zodInputFailure(cause, input, path);
154
+ throw cause;
155
+ }
156
+ };
157
+ const parseCallerValue = (parse, input, path) => {
158
+ try {
159
+ return parse(input);
160
+ }
161
+ catch (cause) {
162
+ if (cause instanceof z.ZodError)
163
+ throw zodInputFailure(cause, input, path);
164
+ throw cause;
165
+ }
112
166
  };
167
+ const zodInputFailure = (cause, input, path) => new InvalidApplicationGraphEvidence(projectInputIssues(cause.issues, input).map((issue) => ({
168
+ ...issue,
169
+ path: [...path, ...issue.path],
170
+ })));
171
+ const invalidEvidence = (path, field, message) => new InvalidApplicationGraphEvidence([
172
+ { path: [...path, field], reason: "invalid_value", message },
173
+ ]);
@@ -33,6 +33,7 @@ export const analyzeJavaScriptApplicationValidated = async (input, options = {})
33
33
  const reconstructed = await reconstructJavaScriptArtifact({
34
34
  input_path: input.input_path,
35
35
  format: input.format,
36
+ integrity_policy: input.integrity_policy,
36
37
  }, options.signal, options.progress);
37
38
  const { electron_summary: summary, ...application } = reconstructed;
38
39
  await options.progress?.report({
@@ -1,17 +1,17 @@
1
1
  import { z } from "zod";
2
- import { AnalysisInputError, AnalysisProtocolError, } from "../../domain/analysisErrorCore.js";
2
+ import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
3
3
  import {} from "../../domain/analysisErrorBase.js";
4
4
  import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
5
5
  import { compareJavaScriptApplicationVersions } from "../../domain/javascript/javascriptApplicationVersionComparison.js";
6
- import { compareApplicationVersionsInputSchema } from "../../domain/javascript/javascriptApplicationVersionComparisonSchemas.js";
6
+ import { compareApplicationVersionsInputSchema, applicationVersionIdentitiesSchema, } from "../../domain/javascript/javascriptApplicationVersionComparisonSchemas.js";
7
7
  import { compareJavaScriptExportShapes } from "../../domain/javascript/javascriptExportShapeComparison.js";
8
- import { compareJavaScriptExportShapesInputSchema } from "../../domain/javascript/javascriptExportShapeComparisonSchemas.js";
8
+ import { compareJavaScriptExportShapesInputSchema, javaScriptExportShapeIdentitiesSchema, } from "../../domain/javascript/javascriptExportShapeComparisonSchemas.js";
9
9
  import { traceApplicationFeature } from "../../domain/javascript/javascriptFeatureTrace.js";
10
- import { traceApplicationFeatureInputSchema } from "../../domain/javascript/javascriptFeatureTraceSchemas.js";
10
+ import { traceApplicationFeatureInputSchema, applicationTraceIdentitiesSchema, } from "../../domain/javascript/javascriptFeatureTraceSchemas.js";
11
11
  import { err, ok } from "../../domain/result.js";
12
12
  import { compareSourceToBundle } from "../../domain/javascript/sourceToBundleComparison.js";
13
13
  import { compareSourceToBundleInputSchema } from "../../domain/javascript/sourceToBundleComparisonSchemas.js";
14
- import { parseApplicationGraphEvidence, parseNativeApplicationEvidence, } from "./JavaScriptApplicationEvidenceGraph.js";
14
+ import { applicationGraphEvidenceInputError, parseApplicationGraphEvidence, parseNativeApplicationEvidence, } from "./JavaScriptApplicationEvidenceGraph.js";
15
15
  import { createApplicationFeatureTraceEvidence, createApplicationVersionComparisonEvidence, createJavaScriptExportShapeComparisonEvidence, createSourceToBundleComparisonEvidence, } from "./JavaScriptApplicationWorkflowEvidence.js";
16
16
  /** Authenticate Evidence and derive one bounded cross-layer feature trace. */
17
17
  export const traceApplicationFeatureEvidence = (rawInput) => {
@@ -24,9 +24,20 @@ export const traceApplicationFeatureEvidence = (rawInput) => {
24
24
  /** Derive one feature trace from input parsed by a trusted adapter. */
25
25
  export const traceApplicationFeatureEvidenceValidated = (input) => {
26
26
  const operation = "trace_application_feature";
27
+ const identities = applicationTraceIdentitiesSchema.safeParse(input);
28
+ if (!identities.success)
29
+ return err(analysisInputErrorFromIssues(operation, identities.error.issues, input));
30
+ const sourceResult = parseApplicationGraphEvidence(input.application, [
31
+ "application",
32
+ ]);
33
+ if (!sourceResult.ok)
34
+ return err(applicationGraphEvidenceInputError(operation, sourceResult.error));
35
+ const nativeResult = parseNativeApplicationEvidence(input.native_observations, ["native_observations"]);
36
+ if (!nativeResult.ok)
37
+ return err(applicationGraphEvidenceInputError(operation, nativeResult.error));
27
38
  try {
28
- const source = parseApplicationGraphEvidence(input.application);
29
- const nativeEvidence = parseNativeApplicationEvidence(input.native_observations);
39
+ const source = sourceResult.value;
40
+ const nativeEvidence = nativeResult.value;
30
41
  const result = traceApplicationFeature({
31
42
  sourceEvidenceId: source.evidence.evidence_id,
32
43
  graph: source.graph,
@@ -42,7 +53,7 @@ export const traceApplicationFeatureEvidenceValidated = (input) => {
42
53
  }, result));
43
54
  }
44
55
  catch (cause) {
45
- return workflowFailure(operation, cause, input);
56
+ return workflowFailure(operation, cause);
46
57
  }
47
58
  };
48
59
  /** Authenticate both graphs and derive a tiered cross-version change graph. */
@@ -56,11 +67,26 @@ export const compareApplicationVersionsEvidence = (rawInput) => {
56
67
  /** Compare versions from input parsed by a trusted adapter. */
57
68
  export const compareApplicationVersionsEvidenceValidated = (input) => {
58
69
  const operation = "compare_application_versions";
70
+ const identities = applicationVersionIdentitiesSchema.safeParse(input);
71
+ if (!identities.success)
72
+ return err(analysisInputErrorFromIssues(operation, identities.error.issues, input));
73
+ const leftResult = parseApplicationGraphEvidence(input.left, ["left"]);
74
+ if (!leftResult.ok)
75
+ return err(applicationGraphEvidenceInputError(operation, leftResult.error));
76
+ const rightResult = parseApplicationGraphEvidence(input.right, ["right"]);
77
+ if (!rightResult.ok)
78
+ return err(applicationGraphEvidenceInputError(operation, rightResult.error));
79
+ const leftNativeResult = parseNativeApplicationEvidence(input.left_native_observations, ["left_native_observations"]);
80
+ if (!leftNativeResult.ok)
81
+ return err(applicationGraphEvidenceInputError(operation, leftNativeResult.error));
82
+ const rightNativeResult = parseNativeApplicationEvidence(input.right_native_observations, ["right_native_observations"]);
83
+ if (!rightNativeResult.ok)
84
+ return err(applicationGraphEvidenceInputError(operation, rightNativeResult.error));
59
85
  try {
60
- const left = parseApplicationGraphEvidence(input.left);
61
- const right = parseApplicationGraphEvidence(input.right);
62
- const leftNative = parseNativeApplicationEvidence(input.left_native_observations);
63
- const rightNative = parseNativeApplicationEvidence(input.right_native_observations);
86
+ const left = leftResult.value;
87
+ const right = rightResult.value;
88
+ const leftNative = leftNativeResult.value;
89
+ const rightNative = rightNativeResult.value;
64
90
  const result = compareJavaScriptApplicationVersions({
65
91
  left: {
66
92
  evidenceId: left.evidence.evidence_id,
@@ -83,14 +109,19 @@ export const compareApplicationVersionsEvidenceValidated = (input) => {
83
109
  }, result));
84
110
  }
85
111
  catch (cause) {
86
- return workflowFailure(operation, cause, input);
112
+ return workflowFailure(operation, cause);
87
113
  }
88
114
  };
89
115
  /** Compare source and bundle inputs already parsed by a trusted adapter. */
90
116
  export const compareSourceToBundleEvidenceValidated = (input) => {
91
117
  const operation = "compare_source_to_bundle";
118
+ const applicationResult = parseApplicationGraphEvidence(input.application, [
119
+ "application",
120
+ ]);
121
+ if (!applicationResult.ok)
122
+ return err(applicationGraphEvidenceInputError(operation, applicationResult.error));
92
123
  try {
93
- const application = parseApplicationGraphEvidence(input.application);
124
+ const application = applicationResult.value;
94
125
  const result = compareSourceToBundle({
95
126
  reference: input.reference,
96
127
  application: {
@@ -105,7 +136,7 @@ export const compareSourceToBundleEvidenceValidated = (input) => {
105
136
  }, result));
106
137
  }
107
138
  catch (cause) {
108
- return workflowFailure(operation, cause, input);
139
+ return workflowFailure(operation, cause);
109
140
  }
110
141
  };
111
142
  /**
@@ -122,9 +153,18 @@ export const compareJavaScriptExportShapesEvidence = (rawInput) => {
122
153
  /** Compare exact export shapes from input parsed by a trusted adapter. */
123
154
  export const compareJavaScriptExportShapesEvidenceValidated = (input) => {
124
155
  const operation = "compare_javascript_export_shapes";
156
+ const identities = javaScriptExportShapeIdentitiesSchema.safeParse(input);
157
+ if (!identities.success)
158
+ return err(analysisInputErrorFromIssues(operation, identities.error.issues, input));
159
+ const leftResult = parseApplicationGraphEvidence(input.left, ["left"]);
160
+ if (!leftResult.ok)
161
+ return err(applicationGraphEvidenceInputError(operation, leftResult.error));
162
+ const rightResult = parseApplicationGraphEvidence(input.right, ["right"]);
163
+ if (!rightResult.ok)
164
+ return err(applicationGraphEvidenceInputError(operation, rightResult.error));
125
165
  try {
126
- const left = parseApplicationGraphEvidence(input.left);
127
- const right = parseApplicationGraphEvidence(input.right);
166
+ const left = leftResult.value;
167
+ const right = rightResult.value;
128
168
  const result = compareJavaScriptExportShapes({
129
169
  left: {
130
170
  evidenceId: left.evidence.evidence_id,
@@ -149,33 +189,7 @@ export const compareJavaScriptExportShapesEvidenceValidated = (input) => {
149
189
  }, result));
150
190
  }
151
191
  catch (cause) {
152
- return workflowFailure(operation, cause, input);
192
+ return workflowFailure(operation, cause);
153
193
  }
154
194
  };
155
- const workflowFailure = (operation, cause, input) => cause instanceof z.ZodError
156
- ? err(analysisInputErrorFromIssues(operation, cause.issues, input))
157
- : cause instanceof TypeError &&
158
- SAFE_APPLICATION_INPUT_CONSTRAINTS.has(cause.message)
159
- ? err(new AnalysisInputError(operation, undefined, [
160
- { path: [], reason: "invalid_value", message: cause.message },
161
- ]))
162
- : err(new AnalysisProtocolError("JavaScript application workflow produced an invalid result", { cause }));
163
- const SAFE_APPLICATION_INPUT_CONSTRAINTS = new Set([
164
- "Evidence semantic identifier does not match its record",
165
- "Application workflow requires authenticated analyze_javascript_application, reconcile_javascript_runtime, or project_managed_application_graph Evidence",
166
- "JavaScript application Evidence authority or confidence is invalid",
167
- "JavaScript application Evidence predicate does not match its result shape",
168
- "JavaScript application Evidence subject does not match its result",
169
- "Runtime reconciliation Evidence authority or confidence is invalid",
170
- "Runtime reconciliation result references Evidence outside its envelope",
171
- "Runtime reconciliation application layer is missing",
172
- "Managed application graph Evidence authority or confidence is invalid",
173
- "Managed application graph result references Evidence outside its envelope",
174
- "Native handoff Evidence requires an artifact subject",
175
- "Native handoff Evidence must be unique",
176
- ...[
177
- "analyze_javascript_application",
178
- "reconcile_javascript_runtime",
179
- "project_managed_application_graph",
180
- ].map((operation) => `Evidence does not match the supported ${operation} contract`),
181
- ]);
195
+ const workflowFailure = (operation, cause) => err(new AnalysisProtocolError(`JavaScript application workflow failed while producing ${operation}`, { cause }));
@@ -46,7 +46,6 @@ const analyzeArtifactFiles = (fileSet, projectSemantics) => {
46
46
  return finalizeArtifactAnalysis(state);
47
47
  };
48
48
  const finalizeArtifactAnalysis = (state) => {
49
- const truncatedScopes = state.truncatedScopes;
50
49
  return {
51
50
  files: state.files,
52
51
  packages: state.packages,
@@ -57,13 +56,9 @@ const finalizeArtifactAnalysis = (state) => {
57
56
  findings: state.findings + state.htmlScripts.length,
58
57
  modules: state.modules,
59
58
  parse_failures: state.parseFailures,
60
- truncated_scopes: truncatedScopes,
61
59
  limitations: [
62
60
  "JavaScript and HTML were parsed as inert text; bundle bootstrap code was never executed.",
63
61
  "Static paths and relationships may remain unresolved when expressions are dynamic or obfuscated.",
64
- ...(truncatedScopes === 0
65
- ? []
66
- : ["Some static-analysis scopes were truncated."]),
67
62
  ],
68
63
  };
69
64
  };
@@ -118,7 +113,6 @@ const emptyArtifactAnalysis = () => ({
118
113
  findings: 0,
119
114
  modules: 0,
120
115
  parseFailures: 0,
121
- truncatedScopes: 0,
122
116
  });
123
117
  const addStructuredObservations = (file, state) => {
124
118
  if (file.kind === "package-json")
@@ -5,8 +5,8 @@ import { addJavaScriptHtmlRoles, addJavaScriptSourceMapOriginals, } from "./Java
5
5
  import { addJavaScriptStaticFindings } from "./JavaScriptArtifactGraphFindings.js";
6
6
  import { addJavaScriptModuleRelationships, addJavaScriptSourceModules, } from "./JavaScriptModuleRelationships.js";
7
7
  import { completeApplicationCoverage, partialApplicationCoverage, } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
8
- import { semanticCoverageResourceLimits } from "../../domain/javascript/javascriptSemanticCoverage.js";
9
- import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT, semanticResourceLimitReason, } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
8
+ import { semanticCoverageResourceLimits, semanticResourceLimitCoverage, } from "../../domain/javascript/javascriptSemanticCoverage.js";
9
+ import { semanticResourceLimitReason } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
10
10
  import { addJavaScriptArtifactContainers, addJavaScriptArtifactFiles, addJavaScriptPackageNodes, createJavaScriptArtifactRootNode, } from "./JavaScriptArtifactGraphStructure.js";
11
11
  import { addJavaScriptBundlerNodes } from "./JavaScriptArtifactGraphBundlers.js";
12
12
  import { addElectronBoundaries } from "./ElectronBoundaryGraph.js";
@@ -70,12 +70,14 @@ const graphCoverage = (context) => {
70
70
  sourceMapPolicyGap ||
71
71
  malformedStructuredData ||
72
72
  partialJavaScript;
73
- if (context.analysis.truncated_scopes > 0)
74
- return partialApplicationCoverage([], null);
75
73
  if (resourceLimits.length > 0)
76
- return partialApplicationCoverage(resourceLimits.map(applicationGraphResourceLimit), null);
74
+ return partialApplicationCoverage(semanticResourceLimitCoverage(resourceLimits), null);
77
75
  if (unknownGap)
78
76
  return partialApplicationCoverage([], null);
77
+ if (context.snapshot.integrity_contradictions.length > 0) {
78
+ const nestedArchiveWasOpaque = context.snapshot.integrity_contradictions.some(({ logical_path }) => logical_path.toLowerCase().endsWith(".asar"));
79
+ return partialApplicationCoverage([], nestedArchiveWasOpaque ? null : 0);
80
+ }
79
81
  return completeApplicationCoverage();
80
82
  };
81
83
  const semanticResourceLimits = (context) => [
@@ -83,19 +85,6 @@ const semanticResourceLimits = (context) => [
83
85
  ? []
84
86
  : semanticCoverageResourceLimits(semantic.ir.coverage))),
85
87
  ].sort();
86
- const applicationGraphResourceLimit = (resourceLimit) => ({
87
- name: `javascript_semantic_${resourceLimit.replaceAll("-", "_")}`,
88
- value: resourceLimit === "primitive-candidates"
89
- ? SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT
90
- : resourceLimit === "primitive-bytes"
91
- ? SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT
92
- : SEMANTIC_EXPRESSION_DEPTH_LIMIT,
93
- unit: resourceLimit === "expression-depth"
94
- ? "depth"
95
- : resourceLimit === "primitive-bytes"
96
- ? "bytes"
97
- : "items",
98
- });
99
88
  const graphLimitations = (context, coverage, relationshipOmissions) => {
100
89
  const ipc = collectElectronIpcRecords(context.analysis);
101
90
  const pairings = classifyElectronIpcPairings(ipc);
@@ -110,6 +99,7 @@ const graphLimitations = (context, coverage, relationshipOmissions) => {
110
99
  javascript.electron.native_addon_bindings.length), 0);
111
100
  return [
112
101
  ...context.analysis.limitations,
102
+ ...context.snapshot.integrity_contradictions.map(({ logical_path: path }) => `Artifact integrity metadata contradicts observed bytes at ${path}; the observed bytes are untrusted.`),
113
103
  ...selfReferenceOmissions(relationshipOmissions.selfImports, ["import specifier", "import specifiers"], "the importing module"),
114
104
  "CommonJS and ESM binding relationships were recovered from inert syntax and resolved only within the inventoried artifact container.",
115
105
  "Webpack/Rspack factories were recovered from AST literals; REA did not invoke push handlers or bundle bootstrap code.",
@@ -1,3 +1,4 @@
1
+ import { createHash } from "node:crypto";
1
2
  import { addStaticInferenceEdge, artifactLocalIdentity, chunkLookupKey, createElectronRoleNode, javascriptAnalysisCoverage, linkElectronRoleToAsset, moduleLookupKey, resolveArtifactPath, selfReferenceOmissions, sourceNodeFor, } from "./JavaScriptArtifactGraphContext.js";
2
3
  import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
3
4
  import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js";
@@ -199,6 +200,9 @@ const addDiscoveredRole = (context, input) => {
199
200
  });
200
201
  };
201
202
  const addSourceMapEdge = (context, input) => {
203
+ const declaredUrlSha256 = createHash("sha256")
204
+ .update(input.value.declared_url)
205
+ .digest("hex");
202
206
  const resolvedPath = resolveArtifactPathByContext({
203
207
  declaredPath: input.value.declared_url,
204
208
  sourcePath: input.file.path,
@@ -207,33 +211,37 @@ const addSourceMapEdge = (context, input) => {
207
211
  }).resolved_path;
208
212
  const resolvedFile = resolvedPath === null ? undefined : context.filesByPath.get(resolvedPath);
209
213
  const resolvedNode = resolvedPath === null ? undefined : context.fileNodes.get(resolvedPath);
210
- const target = resolvedFile?.kind === "source-map" && resolvedNode !== undefined
211
- ? resolvedNode
212
- : context.accumulator.addNode({
213
- kind: "source-map",
214
- identity: artifactLocalIdentity(input.file.sha256, "unresolved-source-map", input.value.declared_url),
215
- observations: [
216
- {
217
- label: input.value.declared_url,
218
- properties: {
219
- declared_url: input.value.declared_url,
220
- resolved_path: resolvedPath,
221
- available: false,
222
- },
223
- evidence: staticInferenceEvidence({
224
- sha256: input.file.sha256,
225
- path: input.file.path,
226
- range: input.value.location,
227
- operation: "discover-source-map",
228
- coverage: input.coverage,
229
- confidence: "medium",
230
- limitations: [
214
+ const isAvailable = resolvedFile?.kind === "source-map" && resolvedNode !== undefined;
215
+ const target = context.accumulator.addNode({
216
+ kind: "source-map",
217
+ identity: isAvailable && resolvedNode !== undefined
218
+ ? resolvedNode.identity
219
+ : artifactLocalIdentity(input.file.sha256, "unresolved-source-map", declaredUrlSha256),
220
+ observations: [
221
+ {
222
+ label: "source map reference",
223
+ properties: {
224
+ declared_url: input.value.declared_url,
225
+ declared_url_sha256: declaredUrlSha256,
226
+ resolved_path: resolvedPath,
227
+ available: isAvailable,
228
+ },
229
+ evidence: staticInferenceEvidence({
230
+ sha256: input.file.sha256,
231
+ path: input.file.path,
232
+ range: input.value.location,
233
+ operation: "discover-source-map",
234
+ coverage: input.coverage,
235
+ confidence: "medium",
236
+ limitations: isAvailable
237
+ ? []
238
+ : [
231
239
  "The declared source map was not present in the inventoried artifact.",
232
240
  ],
233
- }),
234
- },
235
- ],
236
- });
241
+ }),
242
+ },
243
+ ],
244
+ });
237
245
  addStaticInferenceEdge(context, {
238
246
  source: input.asset,
239
247
  target,
@@ -242,7 +250,7 @@ const addSourceMapEdge = (context, input) => {
242
250
  coverage: input.coverage,
243
251
  relation: "maps_to",
244
252
  properties: {
245
- declared_url: input.value.declared_url,
253
+ declared_url_sha256: declaredUrlSha256,
246
254
  resolved_path: resolvedPath,
247
255
  },
248
256
  });