rea-agents 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +103 -38
  2. package/bridge/ghidra/ReaGhidraBridge.java +96 -11
  3. package/dist/application/AndroidApplicationService.js +17 -0
  4. package/dist/application/AppleApplicationService.js +17 -0
  5. package/dist/application/ArtifactExtraction.js +1 -1
  6. package/dist/application/ArtifactInventory/classify.js +42 -0
  7. package/dist/application/ArtifactInventory/hash.js +43 -0
  8. package/dist/application/ArtifactInventory/reader.js +41 -0
  9. package/dist/application/ArtifactInventory/scanCanonical.js +155 -0
  10. package/dist/application/ArtifactInventory/scanReader.js +124 -0
  11. package/dist/application/ArtifactInventory/types.js +10 -0
  12. package/dist/application/ArtifactInventory.js +9 -351
  13. package/dist/application/AuthorizedArtifactInventory.js +2 -2
  14. package/dist/application/BinarySession.js +47 -270
  15. package/dist/application/BinarySessionExecution.js +28 -0
  16. package/dist/application/BinarySessionOpen.js +39 -0
  17. package/dist/application/BinarySessionRecords.js +149 -0
  18. package/dist/application/BinarySessionStatus.js +75 -0
  19. package/dist/application/CapabilityInventory.js +24 -2
  20. package/dist/application/ClientRegistrationStatus.js +11 -4
  21. package/dist/application/CrossVersionInventory.js +8 -2
  22. package/dist/application/CrossVersionInvestigation.js +1 -23
  23. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  24. package/dist/application/DirectAnalysis.js +47 -44
  25. package/dist/application/Doctor.js +156 -238
  26. package/dist/application/DoctorDiagnostics.js +180 -0
  27. package/dist/application/ElectronBoundaryAnalysis.js +23 -7
  28. package/dist/application/ElectronBoundaryGraphWindows.js +32 -8
  29. package/dist/application/EnhancedToolPagination.js +22 -0
  30. package/dist/application/EnhancedToolTypes.js +4 -0
  31. package/dist/application/EnhancedTools.js +20 -37
  32. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  33. package/dist/application/InventoryProjectionEvidence.js +41 -0
  34. package/dist/application/InvestigationProviders.js +12 -0
  35. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  36. package/dist/application/JavaScriptArtifactAnalysis.js +45 -6
  37. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  38. package/dist/application/JavaScriptArtifactGraphBuilder.js +23 -1
  39. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  40. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  41. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  42. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  43. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  44. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  45. package/dist/application/JavaScriptArtifactReconstruction.js +1 -1
  46. package/dist/application/JavaScriptJsonModules.js +39 -0
  47. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  48. package/dist/application/JavaScriptReplayPermission.js +16 -0
  49. package/dist/application/JavaScriptReplayService.js +182 -156
  50. package/dist/application/LinuxHopper.js +10 -0
  51. package/dist/application/MacHopper.js +22 -11
  52. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  53. package/dist/application/PermissionAuthority.js +106 -63
  54. package/dist/application/ProcessCaptureCapability.js +1 -1
  55. package/dist/application/ProcessCapturePermission.js +13 -0
  56. package/dist/application/ProcessCli.js +2 -12
  57. package/dist/application/ProcessHarness.js +1 -1
  58. package/dist/application/ProcessPairedExperiment.js +72 -0
  59. package/dist/application/ProjectPermissionStore.js +48 -9
  60. package/dist/application/RealHopperAssertions.js +76 -0
  61. package/dist/application/ReconstructionCoverageService.js +69 -0
  62. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  63. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  64. package/dist/application/Setup.js +148 -260
  65. package/dist/application/SetupClientConfiguration.js +224 -0
  66. package/dist/application/SetupClients.js +24 -2
  67. package/dist/application/SetupPlan.js +124 -12
  68. package/dist/application/SetupSkill.js +54 -36
  69. package/dist/application/SupportedClients.js +1 -0
  70. package/dist/application/Uninstall.js +12 -3
  71. package/dist/application/Upgrade.js +16 -1
  72. package/dist/application/WindowsCapabilities.js +86 -0
  73. package/dist/artifacts/AsarArtifactReader.js +11 -0
  74. package/dist/browser/BrowserProcessStartup.js +88 -0
  75. package/dist/browser/CdpCaptureDocuments.js +12 -8
  76. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  77. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  78. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  79. package/dist/browser/CdpCaptureEventState.js +1 -0
  80. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  81. package/dist/browser/CdpCaptureEvents.js +29 -496
  82. package/dist/browser/CdpObservationSession.js +51 -8
  83. package/dist/browser/CdpPageCapture.js +12 -133
  84. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  85. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  86. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  87. package/dist/browser/PngVisualDiff.js +9 -2
  88. package/dist/catalogIdentity.js +4 -0
  89. package/dist/cli/artifactCommands.js +82 -0
  90. package/dist/cli/coreAnalysisCommands.js +232 -0
  91. package/dist/cli/managedCommands.js +397 -0
  92. package/dist/cli/managedProjectGraphCommand.js +24 -0
  93. package/dist/cli/options.js +9 -0
  94. package/dist/cli/setupCommands.js +113 -0
  95. package/dist/cli/types.js +1 -0
  96. package/dist/cli/utilityCommands.js +122 -0
  97. package/dist/cli.js +10 -768
  98. package/dist/cliApplicationCommands.js +118 -4
  99. package/dist/cliBrowserAdvancedCommands.js +73 -16
  100. package/dist/cliBrowserCommands.js +39 -115
  101. package/dist/cliCommandNames.js +4 -0
  102. package/dist/cliElectronCommands.js +33 -62
  103. package/dist/cliEvidenceCommands.js +13 -2
  104. package/dist/cliInvestigationCommands.js +53 -10
  105. package/dist/cliObservationOptions.js +137 -0
  106. package/dist/cliPolicyCommands.js +80 -46
  107. package/dist/cliSetup.js +306 -0
  108. package/dist/config/environment.js +107 -0
  109. package/dist/config/parseConfig.js +228 -0
  110. package/dist/config/parsers.js +68 -0
  111. package/dist/config/permissions.js +30 -0
  112. package/dist/config/types.js +1 -0
  113. package/dist/config.js +1 -375
  114. package/dist/contracts/applicationToolContracts.js +134 -0
  115. package/dist/contracts/electronToolContracts.js +51 -3
  116. package/dist/contracts/managedToolContracts.js +8 -3
  117. package/dist/contracts/managedWorkflowToolContracts.js +3 -3
  118. package/dist/contracts/providerSelection.js +2 -0
  119. package/dist/contracts/sessionStatusContract.js +26 -0
  120. package/dist/contracts/toolContractTypes.js +12 -1
  121. package/dist/contracts/toolContracts.js +5 -12
  122. package/dist/contracts/toolEffects.js +14 -0
  123. package/dist/contracts/toolOutputSchemaGroups.js +274 -0
  124. package/dist/contracts/toolOutputSchemaPrimitives.js +328 -0
  125. package/dist/contracts/toolOutputSchemas.js +2 -550
  126. package/dist/domain/analysisErrorPresentation.js +234 -0
  127. package/dist/domain/analysisErrorProjection.js +284 -0
  128. package/dist/domain/androidApplication.js +206 -0
  129. package/dist/domain/appleApplication.js +221 -0
  130. package/dist/domain/artifactComparison.js +34 -15
  131. package/dist/domain/binaryTarget.js +87 -37
  132. package/dist/domain/boundedCartesianProjection.js +15 -0
  133. package/dist/domain/browserObservation.js +1 -285
  134. package/dist/domain/browserObservationSchemas.js +286 -0
  135. package/dist/domain/electronStaticAnalysisBrowser.js +14 -2
  136. package/dist/domain/errors.js +4 -486
  137. package/dist/domain/functionComparison.js +4 -165
  138. package/dist/domain/functionComparisonDimensions.js +164 -0
  139. package/dist/domain/javascriptApplicationVersionItems.js +18 -6
  140. package/dist/domain/javascriptApplicationVersionKeys.js +8 -8
  141. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  142. package/dist/domain/javascriptFeatureTraversal.js +19 -7
  143. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -1
  144. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  145. package/dist/domain/javascriptSemanticIr.js +30 -0
  146. package/dist/domain/javascriptSemanticProjection.js +366 -0
  147. package/dist/domain/javascriptSemanticState.js +40 -0
  148. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  149. package/dist/domain/javascriptSemanticValues.js +352 -0
  150. package/dist/domain/javascriptStaticAnalysis.js +5 -221
  151. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  152. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  153. package/dist/domain/javascriptStaticAnalysisHelpers.js +71 -2
  154. package/dist/domain/knownPageCoverage.js +21 -0
  155. package/dist/domain/managedApplicationGraph.js +14 -364
  156. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  157. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  158. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  159. package/dist/domain/managedArtifact.js +16 -8
  160. package/dist/domain/managedMemberComparison.js +37 -391
  161. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  162. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  163. package/dist/domain/managedNativeVerification.js +27 -389
  164. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  165. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  166. package/dist/domain/managedReconstruction.js +82 -69
  167. package/dist/domain/managedRuntimeCorrelation.js +12 -3
  168. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  169. package/dist/domain/permissionPolicy.js +2 -0
  170. package/dist/domain/processComparison.js +19 -0
  171. package/dist/domain/processPairedExperiment.js +128 -0
  172. package/dist/domain/reconstructionCoverage.js +387 -0
  173. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  174. package/dist/domain/reconstructionVerificationSchemas.js +8 -0
  175. package/dist/domain/replayMachine.js +316 -0
  176. package/dist/domain/replayMachineRuntime.js +215 -0
  177. package/dist/domain/runtimeCharacterization.js +85 -0
  178. package/dist/domain/runtimeIdentification.js +210 -0
  179. package/dist/domain/webBundleAnalyzer.js +3 -409
  180. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  181. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  182. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  183. package/dist/dotnet/ManagedArtifactInspector.js +50 -29
  184. package/dist/dotnet/ManagedMemberInspector.js +51 -785
  185. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  186. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  187. package/dist/dotnet/ManagedMemberRows.js +120 -0
  188. package/dist/dotnet/ManagedMetadataInventory.js +42 -306
  189. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  190. package/dist/dotnet/ManagedMetadataLayout.js +48 -111
  191. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  192. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  193. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  194. package/dist/dotnet/ManagedNativeBoundaryInspector.js +102 -350
  195. package/dist/dotnet/ManagedPeReader.js +59 -28
  196. package/dist/evaluation/CodexAgentEval.js +132 -0
  197. package/dist/generatedPackageMetadata.js +2 -2
  198. package/dist/ghidra/GhidraClient.js +76 -91
  199. package/dist/ghidra/GhidraClientStartup.js +29 -0
  200. package/dist/ghidra/GhidraClientWire.js +34 -0
  201. package/dist/ghidra/GhidraDefaults.js +1 -1
  202. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  203. package/dist/ghidra/GhidraInstallation.js +20 -15
  204. package/dist/ghidra/GhidraLauncher.js +93 -29
  205. package/dist/ghidra/GhidraProvider.js +61 -161
  206. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  207. package/dist/ghidra/GhidraSessionValues.js +2 -0
  208. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  209. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  210. package/dist/ghidra/GhidraTransport.js +71 -0
  211. package/dist/identity.js +4 -2
  212. package/dist/main/messages.js +5 -0
  213. package/dist/main/reload.js +49 -0
  214. package/dist/main/shutdown.js +25 -0
  215. package/dist/main/startup.js +14 -0
  216. package/dist/main/state.js +26 -0
  217. package/dist/main/transport.js +61 -0
  218. package/dist/main/types.js +1 -0
  219. package/dist/main.js +35 -146
  220. package/dist/process/PrivateRuntimeRoot.js +3 -2
  221. package/dist/process/ProcessOwnership.js +35 -0
  222. package/dist/process/ProviderProcess.js +2 -0
  223. package/dist/replay/JavaScriptReplayWorker.js +64 -50
  224. package/dist/replay/LinuxJavaScriptReplayRunner.js +173 -390
  225. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  226. package/dist/replay/ReplayOutcome.js +95 -0
  227. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  228. package/dist/server/ProcessCaptureElicitation.js +157 -0
  229. package/dist/server/createServer.js +124 -56
  230. package/dist/server/javascriptApplicationResult.js +85 -0
  231. package/dist/server/registerApplicationTools/characterization.js +57 -0
  232. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  233. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  234. package/dist/server/registerApplicationTools/coverage.js +84 -0
  235. package/dist/server/registerApplicationTools/helpers.js +42 -0
  236. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  237. package/dist/server/registerApplicationTools/types.js +1 -0
  238. package/dist/server/registerApplicationTools.js +10 -112
  239. package/dist/server/registerBrowserTools.js +59 -83
  240. package/dist/server/registerElectronTools.js +48 -49
  241. package/dist/server/registerEnhancedTools.js +34 -42
  242. package/dist/server/registerEvidenceResources.js +56 -0
  243. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  244. package/dist/server/registerInvestigationTools/types.js +1 -0
  245. package/dist/server/registerInvestigationTools.js +83 -116
  246. package/dist/server/registerJavaScriptApplicationGraphResource.js +69 -0
  247. package/dist/server/registerManagedTools.js +18 -1
  248. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  249. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  250. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  251. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  252. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  253. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  254. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  255. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  256. package/dist/server/registerManagedWorkflowTools.js +10 -274
  257. package/dist/server/registerOfficialTools.js +73 -59
  258. package/dist/server/registerSessionRecordTools.js +137 -0
  259. package/dist/server/registerSessionStatusTool.js +97 -26
  260. package/dist/server/registerSessionTools.js +60 -164
  261. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  262. package/dist/server/toolRegistrationOptions.js +101 -3
  263. package/dist/server/toolResult.js +15 -4
  264. package/package.json +11 -11
  265. package/skills/reverse-engineer-anything/SKILL.md +76 -0
  266. package/skills/reverse-engineer-anything/references/controlled-replay.md +12 -0
  267. package/skills/reverse-engineer-anything/references/evidence-workflows.md +33 -0
  268. package/skills/reverse-engineer-anything/references/javascript-applications.md +25 -0
  269. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +36 -0
  270. package/skills/reverse-engineer-anything/references/runtime-observation.md +24 -0
  271. package/scripts/prepare-node-pty.mjs +0 -35
  272. package/scripts/rebuild-native.mjs +0 -22
  273. package/skills/rea-analysis/SKILL.md +0 -222
@@ -1,10 +1,11 @@
1
1
  import { createHash } from "node:crypto";
2
- import { basename } from "node:path";
3
2
  import canonicalize from "canonicalize";
4
3
  import { z } from "zod";
5
4
  import { evidenceSchema, parseEvidence } from "./evidence.js";
6
- import { createJavaScriptApplicationEdge, createJavaScriptApplicationGraph, createJavaScriptApplicationNode, javascriptApplicationGraphSchema, } from "./javascriptApplicationGraph.js";
5
+ import { createJavaScriptApplicationGraph, javascriptApplicationGraphSchema, } from "./javascriptApplicationGraph.js";
7
6
  import { managedArtifactInspectionSchema, managedMemberInspectionSchema, managedNativeBoundaryInspectionSchema, } from "./managedArtifact.js";
7
+ import { assessManagedGraphOmissions, managedGraphEvidenceCoverage, managedGraphResultCoverage, totalManagedGraphOmitted, } from "./managedApplicationGraphCoverage.js";
8
+ import { addArtifactNode, addArtifactIdentityNodes, addBoundaryNodes, addMemberNodes, } from "./managedApplicationGraphNodes.js";
8
9
  const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
9
10
  const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
10
11
  const boundedTextSchema = z.string().min(1).max(4_096);
@@ -114,7 +115,7 @@ export const projectManagedApplicationGraph = (input) => {
114
115
  root_node_ids: [artifactNode.node_id],
115
116
  nodes: state.nodes,
116
117
  edges: state.edges,
117
- coverage: graphCoverage(omissions),
118
+ coverage: managedGraphEvidenceCoverage(omissions),
118
119
  limitations,
119
120
  });
120
121
  const withoutId = {
@@ -134,7 +135,7 @@ export const projectManagedApplicationGraph = (input) => {
134
135
  ...boundaryCounts,
135
136
  },
136
137
  graph,
137
- coverage: resultCoverage(omissions),
138
+ coverage: managedGraphResultCoverage(omissions),
138
139
  evidence_links: evidenceLinks,
139
140
  limitations,
140
141
  };
@@ -177,364 +178,11 @@ const assertSameArtifact = (parsed, sha256Value) => {
177
178
  if (result !== undefined && result.artifact.sha256 !== sha256Value)
178
179
  throw new TypeError("Managed graph projection inputs must describe the same artifact SHA-256");
179
180
  };
180
- const addArtifactNode = (state) => {
181
- const node = createJavaScriptApplicationNode({
182
- kind: "artifact",
183
- identity: {
184
- strategy: "content-digest",
185
- stability: "global-exact",
186
- sha256: state.artifactSha256,
187
- },
188
- observations: [
189
- {
190
- label: basename(state.artifactPath),
191
- properties: {
192
- format: "pe",
193
- source: "managed-application-graph",
194
- },
195
- evidence: managedEvidence(state, "project-managed-artifact"),
196
- },
197
- ],
198
- });
199
- state.nodes.push(node);
200
- return node;
201
- };
202
- const addArtifactIdentityNodes = (state, artifactNode, parsed) => {
203
- const artifact = parsed.artifact?.result;
204
- if (artifact?.assembly !== undefined && artifact.assembly !== null) {
205
- const assembly = createJavaScriptApplicationNode({
206
- kind: "managed-assembly",
207
- identity: artifactLocalIdentity(state.artifactSha256, "managed-assembly", artifact.assembly.token),
208
- observations: [
209
- {
210
- label: artifact.assembly.name,
211
- properties: {
212
- name: artifact.assembly.name,
213
- version: artifact.assembly.version,
214
- culture: artifact.assembly.culture,
215
- public_key_kind: artifact.assembly.public_key.kind,
216
- },
217
- evidence: managedEvidence(state, "inspect_managed_artifact"),
218
- },
219
- ],
220
- });
221
- state.nodes.push(assembly);
222
- addContainsEdge(state, artifactNode, assembly, "declares-managed-assembly");
223
- }
224
- const module = artifact?.module ??
225
- parsed.members?.result.module ??
226
- parsed.boundaries?.result.module;
227
- if (module !== undefined && module !== null) {
228
- const moduleNode = createJavaScriptApplicationNode({
229
- kind: "managed-module",
230
- identity: artifactLocalIdentity(state.artifactSha256, "managed-module", module.mvid ?? module.token),
231
- observations: [
232
- {
233
- label: module.name,
234
- properties: {
235
- name: module.name,
236
- mvid: module.mvid,
237
- generation: module.generation,
238
- token: module.token,
239
- },
240
- evidence: managedEvidence(state, "inspect_managed_artifact"),
241
- },
242
- ],
243
- });
244
- state.nodes.push(moduleNode);
245
- addContainsEdge(state, artifactNode, moduleNode, "declares-managed-module");
246
- }
247
- };
248
- const addMemberNodes = (state, artifactNode, parsed, limits) => {
249
- const members = parsed.members?.result;
250
- if (members === undefined)
251
- return { types: 0, methods: 0, fields: 0 };
252
- const types = members.types.items.slice(0, limits.max_types);
253
- const methods = members.methods.items.slice(0, limits.max_methods);
254
- const fields = members.fields.items.slice(0, limits.max_fields);
255
- for (const type of types) {
256
- const node = typeNode(state, type);
257
- state.nodes.push(node);
258
- state.typeNodes.set(type.token, node);
259
- addContainsEdge(state, artifactNode, node, "declares-managed-type");
260
- }
261
- for (const method of methods) {
262
- const node = methodNode(state, method);
263
- state.nodes.push(node);
264
- state.methodNodes.set(method.token, node);
265
- const owner = method.declaring_type_token === null
266
- ? artifactNode
267
- : (state.typeNodes.get(method.declaring_type_token) ?? artifactNode);
268
- addContainsEdge(state, owner, node, "declares-managed-method");
269
- }
270
- for (const field of fields) {
271
- const node = fieldNode(state, field);
272
- state.nodes.push(node);
273
- state.fieldNodes.set(field.token, node);
274
- const owner = field.declaring_type_token === null
275
- ? artifactNode
276
- : (state.typeNodes.get(field.declaring_type_token) ?? artifactNode);
277
- addContainsEdge(state, owner, node, "declares-managed-field");
278
- }
279
- return {
280
- types: types.length,
281
- methods: methods.length,
282
- fields: fields.length,
283
- };
284
- };
285
- const typeNode = (state, type) => createJavaScriptApplicationNode({
286
- kind: "managed-type",
287
- identity: artifactLocalIdentity(state.artifactSha256, "managed-type-token", type.token),
288
- observations: [
289
- {
290
- label: type.full_name,
291
- properties: {
292
- token: type.token,
293
- namespace: type.namespace,
294
- name: type.name,
295
- full_name: type.full_name,
296
- flags: type.flags,
297
- extends_token: type.extends_token,
298
- },
299
- evidence: managedEvidence(state, "inspect_managed_members"),
300
- },
301
- ],
302
- });
303
- const methodNode = (state, method) => createJavaScriptApplicationNode({
304
- kind: "managed-method",
305
- identity: artifactLocalIdentity(state.artifactSha256, "managed-method-token", method.token),
306
- observations: [
307
- {
308
- label: method.declaring_type === null
309
- ? method.name
310
- : `${method.declaring_type}.${method.name}`,
311
- properties: {
312
- token: method.token,
313
- declaring_type_token: method.declaring_type_token,
314
- declaring_type: method.declaring_type,
315
- name: method.name,
316
- rva: method.rva,
317
- signature_sha256: method.signature.raw_sha256,
318
- signature_status: method.signature.parse_status,
319
- body_status: method.body.status,
320
- normalized_il_sha256: method.body.normalized_il_sha256,
321
- il_size: method.body.il_size,
322
- },
323
- evidence: managedEvidence(state, "inspect_managed_members"),
324
- },
325
- ],
326
- });
327
- const fieldNode = (state, field) => createJavaScriptApplicationNode({
328
- kind: "managed-field",
329
- identity: artifactLocalIdentity(state.artifactSha256, "managed-field-token", field.token),
330
- observations: [
331
- {
332
- label: field.declaring_type === null
333
- ? field.name
334
- : `${field.declaring_type}.${field.name}`,
335
- properties: {
336
- token: field.token,
337
- declaring_type_token: field.declaring_type_token,
338
- declaring_type: field.declaring_type,
339
- name: field.name,
340
- flags: field.flags,
341
- signature_sha256: field.signature.raw_sha256,
342
- signature_status: field.signature.parse_status,
343
- },
344
- evidence: managedEvidence(state, "inspect_managed_members"),
345
- },
346
- ],
347
- });
348
- const addBoundaryNodes = (state, artifactNode, parsed, limits) => {
349
- const boundaries = parsed.boundaries?.result;
350
- if (boundaries === undefined)
351
- return { pinvoke_imports: 0, native_implementations: 0 };
352
- const pinvokes = boundaries.pinvoke_imports.items.slice(0, limits.max_pinvoke_imports);
353
- const implementations = boundaries.native_implementations.items.slice(0, limits.max_native_implementations);
354
- for (const pinvoke of pinvokes) {
355
- const node = pinvokeNode(state, pinvoke);
356
- state.nodes.push(node);
357
- const owner = pinvoke.member_token === null
358
- ? artifactNode
359
- : (state.methodNodes.get(pinvoke.member_token) ?? artifactNode);
360
- state.edges.push(createJavaScriptApplicationEdge({
361
- source_node_id: owner.node_id,
362
- target_node_id: node.node_id,
363
- relation: "imports",
364
- properties: {
365
- kind: "managed-pinvoke",
366
- import_name: pinvoke.import_name,
367
- import_scope_name: pinvoke.import_scope_name,
368
- },
369
- evidence: managedEvidence(state, "inspect_managed_native_boundaries"),
370
- }));
371
- }
372
- for (const implementation of implementations) {
373
- const node = nativeImplementationNode(state, implementation);
374
- state.nodes.push(node);
375
- const owner = state.methodNodes.get(implementation.token) ?? artifactNode;
376
- addContainsEdge(state, owner, node, "declares-managed-native-implementation");
377
- }
378
- return {
379
- pinvoke_imports: pinvokes.length,
380
- native_implementations: implementations.length,
381
- };
382
- };
383
- const pinvokeNode = (state, pinvoke) => createJavaScriptApplicationNode({
384
- kind: "managed-pinvoke-import",
385
- identity: artifactLocalIdentity(state.artifactSha256, "managed-pinvoke-token", pinvoke.token),
386
- observations: [
387
- {
388
- label: pinvoke.import_name,
389
- properties: {
390
- token: pinvoke.token,
391
- member_token: pinvoke.member_token,
392
- member_name: pinvoke.member_name,
393
- import_name: pinvoke.import_name,
394
- import_scope_name: pinvoke.import_scope_name,
395
- char_set: pinvoke.char_set,
396
- call_convention: pinvoke.call_convention,
397
- verification: pinvoke.verification,
398
- },
399
- evidence: managedEvidence(state, "inspect_managed_native_boundaries"),
400
- },
401
- ],
402
- });
403
- const nativeImplementationNode = (state, implementation) => createJavaScriptApplicationNode({
404
- kind: "managed-native-implementation",
405
- identity: artifactLocalIdentity(state.artifactSha256, "managed-native-implementation-token", implementation.token),
406
- observations: [
407
- {
408
- label: implementation.name,
409
- properties: {
410
- token: implementation.token,
411
- name: implementation.name,
412
- rva: implementation.rva,
413
- code_type: implementation.code_type,
414
- managed_kind: implementation.managed_kind,
415
- pinvoke_declared: implementation.pinvoke_declared,
416
- boundary_kind: implementation.boundary_kind,
417
- body_interpretation: implementation.body_interpretation,
418
- },
419
- evidence: managedEvidence(state, "inspect_managed_native_boundaries"),
420
- },
421
- ],
422
- });
423
- const addContainsEdge = (state, source, target, kind) => {
424
- state.edges.push(createJavaScriptApplicationEdge({
425
- source_node_id: source.node_id,
426
- target_node_id: target.node_id,
427
- relation: "contains",
428
- properties: { kind },
429
- evidence: managedEvidence(state, "project-managed-contains"),
430
- }));
431
- };
432
- const artifactLocalIdentity = (artifactSha256, namespace, key) => ({
433
- strategy: "artifact-local-key",
434
- stability: "artifact-version",
435
- artifact_sha256: artifactSha256,
436
- namespace,
437
- key,
438
- });
439
- const managedEvidence = (state, operation) => ({
440
- authority: "managed-static-analysis",
441
- state: "observed",
442
- confidence: "exact",
443
- artifact: {
444
- available: true,
445
- artifact_id: `art_${state.artifactSha256}`,
446
- sha256: state.artifactSha256,
447
- },
448
- location: {
449
- available: true,
450
- value: {
451
- kind: "artifact-path",
452
- path: graphArtifactPath(state.artifactPath),
453
- },
454
- },
455
- extractor: {
456
- name: "rea-dotnet-static",
457
- version: "1",
458
- operation,
459
- executable_sha256: null,
460
- },
461
- coverage: completeCoverage(),
462
- limitations: [],
463
- evidence_ids: state.evidenceLinks,
464
- });
465
- const graphArtifactPath = (path) => {
466
- const name = basename(path).replaceAll(/[^A-Za-z0-9._-]/gu, "_");
467
- return `managed/${name.length === 0 ? "artifact.pe" : name}`;
468
- };
469
- const completeCoverage = () => ({
470
- status: "complete",
471
- truncated: false,
472
- omitted_count: 0,
473
- limits: [],
474
- });
475
- const graphCoverage = (omissions) => {
476
- const omitted = totalOmitted(omissions);
477
- return {
478
- status: omitted === 0 ? "complete" : "partial",
479
- truncated: omitted > 0,
480
- omitted_count: omitted,
481
- limits: [
482
- { name: "max_types", value: omissions.limits.max_types, unit: "items" },
483
- {
484
- name: "max_methods",
485
- value: omissions.limits.max_methods,
486
- unit: "items",
487
- },
488
- { name: "max_fields", value: omissions.limits.max_fields, unit: "items" },
489
- {
490
- name: "max_pinvoke_imports",
491
- value: omissions.limits.max_pinvoke_imports,
492
- unit: "items",
493
- },
494
- {
495
- name: "max_native_implementations",
496
- value: omissions.limits.max_native_implementations,
497
- unit: "items",
498
- },
499
- ],
500
- };
501
- };
502
- const resultCoverage = (omissions) => {
503
- const omitted = totalOmitted(omissions);
504
- return {
505
- status: omitted > 0
506
- ? "truncated"
507
- : omissions.partialInput
508
- ? "partial"
509
- : "complete-within-inputs",
510
- omitted_types: omissions.types,
511
- omitted_methods: omissions.methods,
512
- omitted_fields: omissions.fields,
513
- omitted_pinvoke_imports: omissions.pinvokeImports,
514
- omitted_native_implementations: omissions.nativeImplementations,
515
- };
516
- };
517
- const omittedCounts = (parsed, limits) => ({
518
- limits,
519
- partialInput: (parsed.members !== null &&
520
- parsed.members.result.coverage.state !== "complete") ||
521
- (parsed.boundaries !== null &&
522
- parsed.boundaries.result.coverage.state !== "complete") ||
523
- (parsed.artifact !== null &&
524
- parsed.artifact.result.coverage.state !== "complete"),
525
- types: Math.max(0, (parsed.members?.result.types.items.length ?? 0) - limits.max_types),
526
- methods: Math.max(0, (parsed.members?.result.methods.items.length ?? 0) - limits.max_methods),
527
- fields: Math.max(0, (parsed.members?.result.fields.items.length ?? 0) - limits.max_fields),
528
- pinvokeImports: Math.max(0, (parsed.boundaries?.result.pinvoke_imports.items.length ?? 0) -
529
- limits.max_pinvoke_imports),
530
- nativeImplementations: Math.max(0, (parsed.boundaries?.result.native_implementations.items.length ?? 0) -
531
- limits.max_native_implementations),
532
- });
533
- const totalOmitted = (omissions) => omissions.types +
534
- omissions.methods +
535
- omissions.fields +
536
- omissions.pinvokeImports +
537
- omissions.nativeImplementations;
181
+ const omittedCounts = (parsed, limits) => assessManagedGraphOmissions({
182
+ artifact: parsed.artifact?.result ?? null,
183
+ members: parsed.members?.result ?? null,
184
+ boundaries: parsed.boundaries?.result ?? null,
185
+ }, limits);
538
186
  const projectionLimitations = (parsed, omissions) => [
539
187
  "Managed graph projection preserves static metadata observations only; it does not execute managed code, load assemblies, or map managed tokens to native addresses.",
540
188
  ...(parsed.members === null
@@ -550,7 +198,9 @@ const projectionLimitations = (parsed, omissions) => [
550
198
  ...(omissions.partialInput
551
199
  ? ["At least one supplied managed Evidence record has partial coverage."]
552
200
  : []),
553
- ...(totalOmitted(omissions) > 0
554
- ? ["Projection output was truncated by managed application graph limits."]
201
+ ...(totalManagedGraphOmitted(omissions) > 0
202
+ ? [
203
+ "Projection output omits managed entities because of source pagination or managed application graph limits.",
204
+ ]
555
205
  : []),
556
206
  ];
@@ -0,0 +1,170 @@
1
+ import { assessKnownPageCoverage, } from "./knownPageCoverage.js";
2
+ /** Complete application-graph fact coverage. */
3
+ const completeManagedGraphCoverage = () => ({
4
+ status: "complete",
5
+ truncated: false,
6
+ omitted_count: 0,
7
+ limits: [],
8
+ });
9
+ /** Translate one managed parser coverage state without inventing omissions. */
10
+ export const managedSourceCoverage = (state) => state === "complete"
11
+ ? completeManagedGraphCoverage()
12
+ : {
13
+ status: state,
14
+ truncated: false,
15
+ omitted_count: null,
16
+ limits: [],
17
+ };
18
+ /** Preserve one known source page's coverage on a projected graph fact. */
19
+ export const managedSourcePageCoverage = (state, page, scope) => {
20
+ if (state !== "complete")
21
+ return managedSourceCoverage(state);
22
+ const assessment = assessKnownPageCoverage(page);
23
+ if (assessment.complete)
24
+ return completeManagedGraphCoverage();
25
+ return {
26
+ status: "partial",
27
+ truncated: assessment.omittedCount > 0,
28
+ omitted_count: assessment.omittedCount,
29
+ limits: assessment.omittedCount > 0
30
+ ? [
31
+ { name: `${scope}_offset`, value: page.offset, unit: "items" },
32
+ { name: `${scope}_limit`, value: page.limit, unit: "items" },
33
+ ]
34
+ : [],
35
+ };
36
+ };
37
+ /** Assess exact source-page and local-limit omissions for graph projection. */
38
+ export const assessManagedGraphOmissions = (sources, limits) => {
39
+ const { typeAssessment, methodAssessment, fieldAssessment } = assessMemberPages(sources.members, limits);
40
+ const { pinvokeAssessment, implementationAssessment } = assessBoundaryPages(sources.boundaries, limits);
41
+ const pageAssessments = [
42
+ typeAssessment,
43
+ methodAssessment,
44
+ fieldAssessment,
45
+ pinvokeAssessment,
46
+ implementationAssessment,
47
+ ];
48
+ const unknownInputCoverage = hasUnknownInputCoverage(sources);
49
+ return {
50
+ limits,
51
+ unknownInputCoverage,
52
+ partialInput: pageAssessments.some(({ sourceComplete }) => !sourceComplete) ||
53
+ unknownInputCoverage,
54
+ types: typeAssessment.omittedCount,
55
+ methods: methodAssessment.omittedCount,
56
+ fields: fieldAssessment.omittedCount,
57
+ pinvokeImports: pinvokeAssessment.omittedCount,
58
+ nativeImplementations: implementationAssessment.omittedCount,
59
+ sourceLimits: [
60
+ ...memberSourceLimits(sources.members),
61
+ ...boundarySourceLimits(sources.boundaries),
62
+ ],
63
+ };
64
+ };
65
+ /** Project aggregate omissions into the application graph coverage contract. */
66
+ export const managedGraphEvidenceCoverage = (omissions) => {
67
+ const omitted = totalManagedGraphOmitted(omissions);
68
+ if (omissions.unknownInputCoverage)
69
+ return {
70
+ status: "partial",
71
+ truncated: false,
72
+ omitted_count: null,
73
+ limits: [],
74
+ };
75
+ return {
76
+ status: omitted === 0 && !omissions.partialInput ? "complete" : "partial",
77
+ truncated: omitted > 0,
78
+ omitted_count: omitted > 0 ? omitted : omissions.partialInput ? null : 0,
79
+ limits: omitted > 0 ? projectionLimits(omissions) : [],
80
+ };
81
+ };
82
+ /** Project aggregate omissions into the managed workflow result contract. */
83
+ export const managedGraphResultCoverage = (omissions) => {
84
+ const omitted = totalManagedGraphOmitted(omissions);
85
+ return {
86
+ status: omissions.unknownInputCoverage
87
+ ? "partial"
88
+ : omitted > 0
89
+ ? "truncated"
90
+ : omissions.partialInput
91
+ ? "partial"
92
+ : "complete-within-inputs",
93
+ omitted_types: omissions.types,
94
+ omitted_methods: omissions.methods,
95
+ omitted_fields: omissions.fields,
96
+ omitted_pinvoke_imports: omissions.pinvokeImports,
97
+ omitted_native_implementations: omissions.nativeImplementations,
98
+ };
99
+ };
100
+ /** Sum all exact entity omissions represented by the managed graph result. */
101
+ export const totalManagedGraphOmitted = (omissions) => omissions.types +
102
+ omissions.methods +
103
+ omissions.fields +
104
+ omissions.pinvokeImports +
105
+ omissions.nativeImplementations;
106
+ const COMPLETE_EMPTY_PAGE = {
107
+ complete: true,
108
+ sourceComplete: true,
109
+ includedCount: 0,
110
+ omittedCount: 0,
111
+ sourceOmittedCount: 0,
112
+ };
113
+ const assessMemberPages = (members, limits) => members === null
114
+ ? {
115
+ typeAssessment: COMPLETE_EMPTY_PAGE,
116
+ methodAssessment: COMPLETE_EMPTY_PAGE,
117
+ fieldAssessment: COMPLETE_EMPTY_PAGE,
118
+ }
119
+ : {
120
+ typeAssessment: assessKnownPageCoverage(members.types, limits.max_types),
121
+ methodAssessment: assessKnownPageCoverage(members.methods, limits.max_methods),
122
+ fieldAssessment: assessKnownPageCoverage(members.fields, limits.max_fields),
123
+ };
124
+ const assessBoundaryPages = (boundaries, limits) => boundaries === null
125
+ ? {
126
+ pinvokeAssessment: COMPLETE_EMPTY_PAGE,
127
+ implementationAssessment: COMPLETE_EMPTY_PAGE,
128
+ }
129
+ : {
130
+ pinvokeAssessment: assessKnownPageCoverage(boundaries.pinvoke_imports, limits.max_pinvoke_imports),
131
+ implementationAssessment: assessKnownPageCoverage(boundaries.native_implementations, limits.max_native_implementations),
132
+ };
133
+ const hasUnknownInputCoverage = (sources) => [
134
+ sources.members?.coverage.state,
135
+ sources.boundaries?.coverage.state,
136
+ sources.artifact?.coverage.state,
137
+ ].some((state) => state !== undefined && state !== "complete");
138
+ const pageLimits = (name, page) => [
139
+ { name: `${name}_offset`, value: page.offset, unit: "items" },
140
+ { name: `${name}_limit`, value: page.limit, unit: "items" },
141
+ ];
142
+ const memberSourceLimits = (members) => members === null
143
+ ? []
144
+ : [
145
+ ...pageLimits("source_types", members.types),
146
+ ...pageLimits("source_methods", members.methods),
147
+ ...pageLimits("source_fields", members.fields),
148
+ ];
149
+ const boundarySourceLimits = (boundaries) => boundaries === null
150
+ ? []
151
+ : [
152
+ ...pageLimits("source_pinvoke_imports", boundaries.pinvoke_imports),
153
+ ...pageLimits("source_native_implementations", boundaries.native_implementations),
154
+ ];
155
+ const projectionLimits = (omissions) => [
156
+ { name: "max_types", value: omissions.limits.max_types, unit: "items" },
157
+ { name: "max_methods", value: omissions.limits.max_methods, unit: "items" },
158
+ { name: "max_fields", value: omissions.limits.max_fields, unit: "items" },
159
+ {
160
+ name: "max_pinvoke_imports",
161
+ value: omissions.limits.max_pinvoke_imports,
162
+ unit: "items",
163
+ },
164
+ {
165
+ name: "max_native_implementations",
166
+ value: omissions.limits.max_native_implementations,
167
+ unit: "items",
168
+ },
169
+ ...omissions.sourceLimits,
170
+ ];
@@ -0,0 +1,6 @@
1
+ /** Derive module coverage from the best available managed evidence source. */
2
+ export const moduleCoverageState = (parsed) => parsed.artifact !== null && parsed.artifact.result.module !== null
3
+ ? parsed.artifact.result.coverage.state
4
+ : parsed.members !== null && parsed.members.result.module !== null
5
+ ? parsed.members.result.coverage.state
6
+ : (parsed.boundaries?.result.coverage.state ?? "complete");