rea-agents 1.6.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +157 -66
  2. package/bridge/ghidra/ReaGhidraBridge.java +2075 -0
  3. package/bridge/hopper_bridge.py +13 -3
  4. package/dist/application/AbortablePromise.js +25 -0
  5. package/dist/application/AnalysisProvider.js +3 -0
  6. package/dist/application/AnalysisProviderEvaluation.js +60 -0
  7. package/dist/application/AnalysisProviderRegistry.js +228 -0
  8. package/dist/application/AnalysisSnapshotCache.js +41 -21
  9. package/dist/application/AnalysisSnapshotFiles.js +5 -6
  10. package/dist/application/BinarySession.js +218 -101
  11. package/dist/application/CapabilityInventory.js +18 -0
  12. package/dist/application/CompositeProvider.js +20 -8
  13. package/dist/application/CrossVersionInvestigation.js +10 -6
  14. package/dist/application/DirectAnalysis.js +49 -35
  15. package/dist/application/Doctor.js +110 -8
  16. package/dist/application/ElectronBoundaryAnalysis.js +96 -0
  17. package/dist/application/ElectronBoundaryGraph.js +9 -0
  18. package/dist/application/ElectronBoundaryGraphContext.js +62 -0
  19. package/dist/application/ElectronBoundaryGraphIpc.js +242 -0
  20. package/dist/application/ElectronBoundaryGraphNative.js +86 -0
  21. package/dist/application/ElectronBoundaryGraphWindows.js +199 -0
  22. package/dist/application/EnhancedTools.js +39 -14
  23. package/dist/application/InvestigationProviders.js +41 -0
  24. package/dist/application/JavaScriptApplicationEvidence.js +26 -0
  25. package/dist/application/JavaScriptApplicationEvidenceGraph.js +89 -0
  26. package/dist/application/JavaScriptApplicationService.js +74 -0
  27. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +29 -0
  28. package/dist/application/JavaScriptApplicationWorkflowService.js +90 -0
  29. package/dist/application/JavaScriptArtifactAnalysis.js +305 -0
  30. package/dist/application/JavaScriptArtifactAnalysisTypes.js +1 -0
  31. package/dist/application/JavaScriptArtifactFiles.js +231 -0
  32. package/dist/application/JavaScriptArtifactGraphAccumulator.js +54 -0
  33. package/dist/application/JavaScriptArtifactGraphBuilder.js +144 -0
  34. package/dist/application/JavaScriptArtifactGraphContext.js +205 -0
  35. package/dist/application/JavaScriptArtifactGraphDocuments.js +108 -0
  36. package/dist/application/JavaScriptArtifactGraphEvidence.js +99 -0
  37. package/dist/application/JavaScriptArtifactGraphFindings.js +271 -0
  38. package/dist/application/JavaScriptArtifactGraphStructure.js +409 -0
  39. package/dist/application/JavaScriptArtifactReconstruction.js +77 -0
  40. package/dist/application/JavaScriptArtifactReconstructionInput.js +18 -0
  41. package/dist/application/JavaScriptReplayPlanning.js +201 -0
  42. package/dist/application/JavaScriptReplayService.js +266 -0
  43. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +25 -0
  44. package/dist/application/JavaScriptRuntimeReconciliationService.js +27 -0
  45. package/dist/application/MacHopper.js +20 -4
  46. package/dist/application/ManagedApplicationGraphService.js +55 -0
  47. package/dist/application/ManagedMemberComparisonService.js +122 -0
  48. package/dist/application/ManagedNativeVerificationService.js +39 -0
  49. package/dist/application/ManagedReconstructionService.js +58 -0
  50. package/dist/application/ManagedRuntimeCorrelationService.js +103 -0
  51. package/dist/application/PermissionAuthority.js +1 -1
  52. package/dist/application/ProcessCaptureLifecycle.js +1 -1
  53. package/dist/application/ProcessHarness.js +1 -1
  54. package/dist/application/ProcessSampling.js +16 -12
  55. package/dist/application/ProjectPermissionStore.js +1 -0
  56. package/dist/application/SessionProviderRouter.js +219 -0
  57. package/dist/application/Setup.js +84 -60
  58. package/dist/application/SetupClients.js +1 -1
  59. package/dist/application/SetupPlan.js +9 -2
  60. package/dist/application/SupportedClients.js +40 -16
  61. package/dist/application/Upgrade.js +1 -1
  62. package/dist/application/runtime.js +11 -6
  63. package/dist/artifacts/AsarArtifactReader.js +23 -3
  64. package/dist/browser/CdpBrowserProvider.js +4 -2
  65. package/dist/browser/CdpCaptureEvents.js +49 -0
  66. package/dist/browser/CdpElectronInspection.js +106 -162
  67. package/dist/browser/CdpElectronProvider.js +9 -3
  68. package/dist/browser/CdpElectronScriptEvents.js +69 -0
  69. package/dist/browser/CdpElectronScripts.js +94 -0
  70. package/dist/browser/CdpElectronWorkers.js +56 -0
  71. package/dist/browser/CdpEndpoint.js +14 -1
  72. package/dist/browser/CdpPageCapture.js +8 -4
  73. package/dist/catalogIdentity.js +6 -42
  74. package/dist/cli.js +446 -34
  75. package/dist/cliApplicationCommands.js +62 -0
  76. package/dist/cliBrowserAdvancedCommands.js +5 -4
  77. package/dist/cliBrowserCommands.js +5 -4
  78. package/dist/cliCommandNames.js +56 -0
  79. package/dist/cliElectronCommands.js +106 -3
  80. package/dist/cliEvidenceCommands.js +4 -3
  81. package/dist/cliInvestigationCommands.js +2 -1
  82. package/dist/cliJsonInput.js +54 -0
  83. package/dist/cliPolicyCommands.js +2 -1
  84. package/dist/cliProcessCommands.js +3 -2
  85. package/dist/config.js +101 -2
  86. package/dist/contracts/applicationToolContracts.js +91 -0
  87. package/dist/contracts/artifactToolContracts.js +5 -9
  88. package/dist/contracts/browserToolContracts.js +14 -62
  89. package/dist/contracts/electronToolContracts.js +45 -19
  90. package/dist/contracts/enhancedInputs.js +2 -2
  91. package/dist/contracts/errorSchemas.js +1 -0
  92. package/dist/contracts/investigationExamples.js +0 -6
  93. package/dist/contracts/javascriptApplicationWorkflowExamples.js +46 -0
  94. package/dist/contracts/javascriptRuntimeReconciliationExample.js +208 -0
  95. package/dist/contracts/managedToolContracts.js +153 -0
  96. package/dist/contracts/managedWorkflowExamples.js +346 -0
  97. package/dist/contracts/managedWorkflowToolContracts.js +203 -0
  98. package/dist/contracts/nativeToolContracts.js +2 -6
  99. package/dist/contracts/promptContracts.js +18 -2
  100. package/dist/contracts/providerSelection.js +28 -0
  101. package/dist/contracts/sessionLifecycleInputs.js +2 -0
  102. package/dist/contracts/toolContractExamples.js +10 -25
  103. package/dist/contracts/toolContracts.js +69 -65
  104. package/dist/contracts/toolEffects.js +160 -0
  105. package/dist/contracts/toolOutputSchemas.js +152 -42
  106. package/dist/doctorRuntime.js +47 -0
  107. package/dist/domain/analysisProfile.js +78 -0
  108. package/dist/domain/analysisSnapshot.js +92 -46
  109. package/dist/domain/artifactComparison.js +3 -4
  110. package/dist/domain/artifactGraph.js +1 -0
  111. package/dist/domain/binaryTarget.js +4 -29
  112. package/dist/domain/browserObservation.js +3 -0
  113. package/dist/domain/bundleComparison.js +4 -4
  114. package/dist/domain/electronObservation.js +13 -0
  115. package/dist/domain/electronStaticAnalysis.js +9 -0
  116. package/dist/domain/electronStaticAnalysisBrowser.js +194 -0
  117. package/dist/domain/electronStaticAnalysisIpc.js +171 -0
  118. package/dist/domain/electronStaticAnalysisNative.js +164 -0
  119. package/dist/domain/electronStaticAnalysisTypes.js +1 -0
  120. package/dist/domain/electronStaticAnalysisValues.js +103 -0
  121. package/dist/domain/errors.js +148 -7
  122. package/dist/domain/evidence.js +44 -5
  123. package/dist/domain/evidenceBundle.js +9 -7
  124. package/dist/domain/functionComparison.js +9 -3
  125. package/dist/domain/functionComparisonNormalization.js +37 -0
  126. package/dist/domain/functionComparisonSchemas.js +3 -8
  127. package/dist/domain/functionDossierEvidence.js +4 -1
  128. package/dist/domain/hopperValues.js +66 -9
  129. package/dist/domain/inputIssueProjection.js +52 -0
  130. package/dist/domain/investigationWorkspace.js +2 -1
  131. package/dist/domain/javascriptApplicationAnalysis.js +155 -0
  132. package/dist/domain/javascriptApplicationChangeGraph.js +231 -0
  133. package/dist/domain/javascriptApplicationEvidenceSchemas.js +379 -0
  134. package/dist/domain/javascriptApplicationGraph.js +282 -0
  135. package/dist/domain/javascriptApplicationGraphSchemas.js +139 -0
  136. package/dist/domain/javascriptApplicationVersionComparison.js +116 -0
  137. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +139 -0
  138. package/dist/domain/javascriptApplicationVersionItems.js +221 -0
  139. package/dist/domain/javascriptApplicationVersionKeys.js +170 -0
  140. package/dist/domain/javascriptAstFingerprint.js +143 -0
  141. package/dist/domain/javascriptFeatureSeed.js +140 -0
  142. package/dist/domain/javascriptFeatureTrace.js +232 -0
  143. package/dist/domain/javascriptFeatureTraceSchemas.js +136 -0
  144. package/dist/domain/javascriptFeatureTraversal.js +88 -0
  145. package/dist/domain/javascriptNativeHandoff.js +85 -0
  146. package/dist/domain/javascriptReplay.js +361 -0
  147. package/dist/domain/javascriptRuntimeLoadState.js +106 -0
  148. package/dist/domain/javascriptRuntimeReconciliation.js +42 -0
  149. package/dist/domain/javascriptRuntimeReconciliationGraph.js +169 -0
  150. package/dist/domain/javascriptRuntimeReconciliationMatching.js +247 -0
  151. package/dist/domain/javascriptRuntimeReconciliationParsing.js +160 -0
  152. package/dist/domain/javascriptRuntimeReconciliationResult.js +119 -0
  153. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +316 -0
  154. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +245 -0
  155. package/dist/domain/javascriptRuntimeStaticCandidates.js +191 -0
  156. package/dist/domain/javascriptStaticAnalysis.js +346 -0
  157. package/dist/domain/javascriptStaticAnalysisFindings.js +39 -0
  158. package/dist/domain/javascriptStaticAnalysisHelpers.js +274 -0
  159. package/dist/domain/javascriptStaticAnalysisState.js +23 -0
  160. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  161. package/dist/domain/managedApplicationGraph.js +556 -0
  162. package/dist/domain/managedArtifact.js +444 -0
  163. package/dist/domain/managedMemberComparison.js +565 -0
  164. package/dist/domain/managedNativeVerification.js +408 -0
  165. package/dist/domain/managedReconstruction.js +183 -0
  166. package/dist/domain/managedRuntimeCorrelation.js +175 -0
  167. package/dist/domain/reconstructionVerificationSchemas.js +1 -3
  168. package/dist/dotnet/ManagedArtifactInspector.js +318 -0
  169. package/dist/dotnet/ManagedMemberInspector.js +887 -0
  170. package/dist/dotnet/ManagedMetadataHeaps.js +131 -0
  171. package/dist/dotnet/ManagedMetadataInventory.js +368 -0
  172. package/dist/dotnet/ManagedMetadataLayout.js +322 -0
  173. package/dist/dotnet/ManagedNativeBoundaryInspector.js +391 -0
  174. package/dist/dotnet/ManagedPeReader.js +157 -0
  175. package/dist/dotnet/ManagedReaderFailure.js +10 -0
  176. package/dist/dotnet/ManagedStaticProvider.js +203 -0
  177. package/dist/generatedPackageMetadata.js +2 -2
  178. package/dist/ghidra/GhidraAnalysisProfile.js +37 -0
  179. package/dist/ghidra/GhidraClient.js +400 -0
  180. package/dist/ghidra/GhidraClientTypes.js +1 -0
  181. package/dist/ghidra/GhidraDefaults.js +20 -0
  182. package/dist/ghidra/GhidraDiagnostics.js +43 -0
  183. package/dist/ghidra/GhidraDoctor.js +59 -0
  184. package/dist/ghidra/GhidraFunctionValues.js +264 -0
  185. package/dist/ghidra/GhidraInstallation.js +239 -0
  186. package/dist/ghidra/GhidraInventoryValues.js +217 -0
  187. package/dist/ghidra/GhidraLauncher.js +139 -0
  188. package/dist/ghidra/GhidraProvider.js +366 -0
  189. package/dist/ghidra/GhidraRequestQueue.js +98 -0
  190. package/dist/ghidra/GhidraResponseBuffer.js +31 -0
  191. package/dist/ghidra/GhidraResponseRouter.js +24 -0
  192. package/dist/ghidra/GhidraSessionError.js +39 -0
  193. package/dist/ghidra/GhidraSessionValues.js +62 -0
  194. package/dist/ghidra/GhidraSocketConnection.js +46 -0
  195. package/dist/ghidra/protocol.js +69 -0
  196. package/dist/hopper/BridgeLauncher.js +19 -54
  197. package/dist/hopper/HopperAnalysisProfile.js +106 -0
  198. package/dist/hopper/HopperClient.js +154 -162
  199. package/dist/hopper/HopperProvider.js +99 -7
  200. package/dist/hopper/HopperSessionValues.js +27 -0
  201. package/dist/hopper/HopperSocketConnection.js +31 -0
  202. package/dist/main.js +14 -0
  203. package/dist/native/NativeMacOSProvider.js +3 -1
  204. package/dist/process/PendingOperations.js +59 -0
  205. package/dist/process/PrivateRuntimeRoot.js +33 -0
  206. package/dist/process/ProviderDeadline.js +95 -0
  207. package/dist/process/ProviderProcess.js +275 -0
  208. package/dist/replay/JavaScriptReplayWorker.js +286 -0
  209. package/dist/replay/LinuxJavaScriptReplayRunner.js +434 -0
  210. package/dist/replay/LinuxRuntimeClosure.js +46 -0
  211. package/dist/replay/LinuxSeccompPolicy.js +40 -0
  212. package/dist/replay/ReplayWorkerProtocol.js +55 -0
  213. package/dist/replay/SystemJavaScriptReplayHost.js +182 -0
  214. package/dist/server/createServer.js +53 -0
  215. package/dist/server/promptCompletion.js +9 -3
  216. package/dist/server/registerApplicationTools.js +115 -0
  217. package/dist/server/registerArtifactComparisonTool.js +16 -9
  218. package/dist/server/registerBrowserTools.js +33 -8
  219. package/dist/server/registerBundleComparisonTool.js +17 -20
  220. package/dist/server/registerElectronTools.js +45 -3
  221. package/dist/server/registerEnhancedTools.js +67 -19
  222. package/dist/server/registerEvidenceTools.js +5 -1
  223. package/dist/server/registerFunctionComparisonTool.js +14 -7
  224. package/dist/server/registerInvestigationTools.js +21 -17
  225. package/dist/server/registerManagedTools.js +6 -0
  226. package/dist/server/registerManagedWorkflowTools.js +277 -0
  227. package/dist/server/registerOfficialTools.js +11 -8
  228. package/dist/server/registerProcessComparisonTool.js +25 -47
  229. package/dist/server/registerSessionStatusTool.js +7 -7
  230. package/dist/server/registerSessionTools.js +57 -87
  231. package/dist/server/sessionEvidence.js +14 -19
  232. package/dist/server/toolInputValidation.js +77 -0
  233. package/dist/server/toolRegistrationOptions.js +79 -2
  234. package/dist/server/toolResult.js +25 -17
  235. package/package.json +17 -7
  236. package/scripts/rea.mjs +36 -2
  237. package/skills/rea-analysis/SKILL.md +59 -3
  238. /package/dist/{application → process}/ProcessOwnership.js +0 -0
@@ -9,43 +9,60 @@ export const toCallToolResult = (result, contract, options = {}) => result.ok
9
9
  : errorResult(result.error);
10
10
  const errorResult = (error) => {
11
11
  const projected = projectAnalysisError(error);
12
+ const structuredContent = { error: projected };
12
13
  return {
13
14
  content: [
14
15
  {
15
16
  type: "text",
16
- text: projected.message,
17
+ text: JSON.stringify(structuredContent),
17
18
  },
18
19
  ],
19
- structuredContent: { error: projected },
20
+ structuredContent,
20
21
  isError: true,
21
22
  };
22
23
  };
23
24
  const successResult = (value, contract, options) => {
24
- const candidate = contract.kind === "session" ? { result: value } : value;
25
+ const candidate = compactEvidence(value) ??
26
+ (contract.kind === "session" ? { result: value } : value);
25
27
  const parsed = contract.outputSchema.safeParse(candidate);
26
28
  if (!parsed.success) {
29
+ const structuredContent = {
30
+ error: projectAnalysisError(new AnalysisOutputError(contract.name, "output does not match the tool contract")),
31
+ };
27
32
  return {
28
33
  content: [
29
34
  {
30
35
  type: "text",
31
- text: "Analysis returned an unreadable result. Retry once; if it continues, run `rea doctor`.",
36
+ text: JSON.stringify(structuredContent),
32
37
  },
33
38
  ],
34
- structuredContent: {
35
- error: projectAnalysisError(new AnalysisOutputError(contract.name, "output does not match the tool contract")),
36
- },
39
+ structuredContent,
37
40
  isError: true,
38
41
  };
39
42
  }
40
43
  return {
41
44
  content: [
42
- { type: "text", text: formatValue(value) },
45
+ { type: "text", text: JSON.stringify(parsed.data) },
43
46
  ...evidenceResourceLinks(value, contract.kind === "session" ||
44
47
  options.evidenceResourcesAvailable === true),
45
48
  ],
46
49
  structuredContent: candidate,
47
50
  };
48
51
  };
52
+ const compactEvidence = (value) => {
53
+ if (typeof value !== "object" ||
54
+ value === null ||
55
+ Array.isArray(value) ||
56
+ typeof value.evidence_id !== "string" ||
57
+ !/^ev_[a-f0-9]{64}$/u.test(value.evidence_id) ||
58
+ !("normalized_result" in value))
59
+ return undefined;
60
+ return {
61
+ result: value.normalized_result,
62
+ evidence_id: value.evidence_id,
63
+ evidence_uri: `rea://evidence/${value.evidence_id}`,
64
+ };
65
+ };
49
66
  const evidenceResourceLinks = (value, available) => {
50
67
  if (!available ||
51
68
  typeof value !== "object" ||
@@ -64,12 +81,3 @@ const evidenceResourceLinks = (value, available) => {
64
81
  },
65
82
  ];
66
83
  };
67
- const formatValue = (value) => {
68
- if (value === null)
69
- return "OK";
70
- if (typeof value === "string")
71
- return value;
72
- if (typeof value === "object")
73
- return JSON.stringify(value, null, 2);
74
- return String(value);
75
- };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rea-agents",
3
- "version": "1.6.0",
3
+ "version": "2.0.0",
4
4
  "description": "Reverse engineer anything from your terminal or agent with one CLI and MCP server.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -40,6 +40,7 @@
40
40
  "dist",
41
41
  "install.sh",
42
42
  "bridge/hopper_bridge.py",
43
+ "bridge/ghidra/ReaGhidraBridge.java",
43
44
  "scripts/rea.mjs",
44
45
  "scripts/prepare-node-pty.mjs",
45
46
  "scripts/rebuild-native.mjs",
@@ -49,10 +50,12 @@
49
50
  "LICENSE"
50
51
  ],
51
52
  "scripts": {
52
- "prebuild": "node scripts/generate-package-metadata.mjs",
53
+ "deps:check": "node scripts/check-dependency-install.mjs",
54
+ "prebuild": "npm run deps:check && node scripts/generate-package-metadata.mjs",
53
55
  "build": "tsc -p tsconfig.build.json",
54
56
  "postbuild": "node scripts/record-build-cache.mjs",
55
- "check": "npm run typecheck && npm run lint && npm run format:check && npm test",
57
+ "precheck": "npm run deps:check",
58
+ "check": "npm run typecheck && npm run lint && npm run format:check && npm run docs:check && npm test",
56
59
  "format": "prettier --write .",
57
60
  "format:check": "prettier --check .",
58
61
  "lint": "oxlint",
@@ -61,7 +64,7 @@
61
64
  "lint:dead": "knip",
62
65
  "jscpd": "jscpd src/ tests/",
63
66
  "scan:todos": "node scripts/scan-todos.mjs",
64
- "start": "node dist/main.js",
67
+ "start": "node scripts/rea.mjs mcp",
65
68
  "pretest": "npm run build",
66
69
  "postinstall": "node scripts/prepare-node-pty.mjs",
67
70
  "test": "vitest run",
@@ -71,7 +74,12 @@
71
74
  "test:watch": "vitest",
72
75
  "typecheck": "tsc --noEmit",
73
76
  "verify:hopper": "npm run build && node scripts/verify-real-hopper.mjs",
77
+ "verify:ghidra": "npm run build && node scripts/verify-real-ghidra.mjs",
74
78
  "verify:browser": "npm run build && node scripts/verify-real-browser.mjs",
79
+ "verify:javascript-runtime": "npm run build && node scripts/verify-local-javascript-runtime.mjs",
80
+ "verify:application-workflows": "npm run build && node scripts/verify-local-application-workflows.mjs",
81
+ "verify:managed": "npm run build && node scripts/verify-managed-conformance.mjs",
82
+ "verify:replay": "npm run build && node scripts/verify-real-javascript-replay.mjs",
75
83
  "verify:hopper:linux": "npm run build && node scripts/verify-real-hopper-linux.mjs",
76
84
  "verify:setup:linux": "npm run build && node scripts/verify-linux-setup-e2e.mjs",
77
85
  "build:fixtures": "node scripts/build-conformance-fixtures.mjs",
@@ -79,10 +87,12 @@
79
87
  "verify:package": "npm run build && node scripts/verify-package.mjs",
80
88
  "verify:published": "node scripts/verify-published-package.mjs",
81
89
  "config:print": "node scripts/print-mcp-config.mjs",
82
- "docs:generate": "npm run build && typedoc && node scripts/generate-error-schema.mjs",
90
+ "docs:generate": "npm run build && node scripts/generate-skill-metadata.mjs && node scripts/generate-product-catalog.mjs && typedoc && node scripts/generate-error-schema.mjs",
91
+ "docs:check": "node scripts/generate-package-metadata.mjs --check && npm run build && node scripts/generate-skill-metadata.mjs --check && node scripts/generate-product-catalog.mjs --check && node scripts/check-doc-facts.mjs && node scripts/check-typedoc.mjs && node scripts/generate-error-schema.mjs --check",
83
92
  "docs:error-schema": "npm run build && node scripts/generate-error-schema.mjs",
84
- "prepack": "npm run build",
85
- "prepare": "husky",
93
+ "prepack": "npm run deps:check && node scripts/generate-skill-metadata.mjs --check",
94
+ "prepublishOnly": "npm run deps:check && node scripts/generate-skill-metadata.mjs --check",
95
+ "prepare": "npm run build && husky",
86
96
  "rebuild:native": "node scripts/rebuild-native.mjs"
87
97
  },
88
98
  "lint-staged": {
package/scripts/rea.mjs CHANGED
@@ -1,7 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ import { access } from "node:fs/promises";
4
+ import { dirname, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
3
7
  // Route production MCP before importing Incur. Incur owns registration helpers
4
- // such as `mcp add`, while only dist/main.js may serve the 78-tool stdio server.
8
+ // such as `mcp add`, while only dist/main.js may serve the stdio tool catalog.
5
9
  const args = process.argv.slice(2);
6
10
  const { default: packageJson } = await import("../package.json", {
7
11
  with: { type: "json" },
@@ -9,8 +13,17 @@ const { default: packageJson } = await import("../package.json", {
9
13
  process.env.REA_PACKAGE_VERSION = packageJson.version;
10
14
  const isMcpMode =
11
15
  args.length === 1 && (args[0] === "--mcp" || args[0] === "mcp");
16
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
17
+ const runtimeFiles = isMcpMode
18
+ ? ["dist/main.js"]
19
+ : ["dist/cli.js", "dist/cliOutput.js"];
12
20
 
13
- if (isMcpMode) {
21
+ if (!(await compiledRuntimeExists(runtimeFiles))) {
22
+ process.stderr.write(
23
+ `REA's compiled runtime is missing. Run \`npm ci\` in ${packageRoot} to install dependencies and build REA, then restart it. If this is an installed package, reinstall rea-agents.\n`,
24
+ );
25
+ process.exitCode = 1;
26
+ } else if (isMcpMode) {
14
27
  const { runEntrypoint } = await import("../dist/main.js");
15
28
  await runEntrypoint();
16
29
  } else {
@@ -20,3 +33,24 @@ if (isMcpMode) {
20
33
  stdout: (output) => process.stdout.write(sanitizeCliOutput(output)),
21
34
  });
22
35
  }
36
+
37
+ async function compiledRuntimeExists(paths) {
38
+ for (const path of paths) {
39
+ try {
40
+ await access(resolve(packageRoot, path));
41
+ } catch (cause) {
42
+ if (isMissing(cause)) return false;
43
+ throw cause;
44
+ }
45
+ }
46
+ return true;
47
+ }
48
+
49
+ function isMissing(cause) {
50
+ return (
51
+ typeof cause === "object" &&
52
+ cause !== null &&
53
+ "code" in cause &&
54
+ cause.code === "ENOENT"
55
+ );
56
+ }
@@ -1,9 +1,10 @@
1
1
  ---
2
2
  name: rea-analysis
3
- description: Reverse engineer apps and websites with REA. Explore how features work, then build a version tailored to your project.
3
+ description: Reverse engineer native, Electron/JavaScript, and web applications with REA. Connect static artifacts to passive runtime evidence, explain how features work, and build a version tailored to the user's project.
4
4
  metadata:
5
- version: "14"
6
- tool_count: 78
5
+ version: "20"
6
+ tool_count: 91
7
+ catalog_digest: "bdf382596e1a00ffc9d59de287b2ad647eeebe629c48a8f8cf158b300363ce53"
7
8
  ---
8
9
 
9
10
  # REA
@@ -35,6 +36,61 @@ Electron `file://` pages use `list_electron_targets` and
35
36
  filesystem-root authority. Never claim that Electron inspection invoked IPC,
36
37
  evaluated renderer JavaScript, navigated, or escaped an approved root.
37
38
 
39
+ For an operator-supplied ASAR or extracted JavaScript/Electron application, use
40
+ `analyze_javascript_application` after the operator configures its canonical
41
+ root in `REA_INVESTIGATION_INPUT_ROOTS_JSON`; every call still requires
42
+ `approved: true`. Source-map contents require the independent
43
+ `source_map_read_approved` flag. Treat BrowserWindow preferences, preload and
44
+ contextBridge surfaces, IPC registrations, utility processes, and native
45
+ binding requests as static syntax observations. Treat only a unique exact
46
+ literal IPC channel match as an inferred pairing; keep dynamic and ambiguous
47
+ channels unresolved. A requested `.node` member is not a verified binary export.
48
+ Never claim that this workflow executed application code or observed runtime
49
+ registration, reachability, defaults, or policy enforcement.
50
+
51
+ When static application Evidence and passive `inspect_web_page` or
52
+ `inspect_electron_page` Evidence already exist, use
53
+ `reconcile_javascript_runtime` to map capture-scoped targets, frames, scripts,
54
+ and workers onto the static graph. Supply exactly one `application` layer and
55
+ add separately analyzed `cache` or `assets` layers only when relevant. Use
56
+ explicit file-root or URL-prefix mappings for relocated runtime paths; mappings
57
+ are inference inputs and never broaden CDP or filesystem authority. Prefer
58
+ approved captured-source digest identity, report path/digest disagreement as a
59
+ mismatch, preserve ambiguity, and never call a module executed merely because
60
+ its containing bundle was observed. Keep source-map authority separate. This
61
+ tool maps JavaScript graph entities; `correlate_static_and_runtime` remains the
62
+ separate workflow for explicit cross-version comparison hypotheses.
63
+
64
+ Use `trace_application_feature` on authenticated static or reconciled
65
+ application Evidence to follow one literal node ID, route, string, API, IPC
66
+ channel, module, or native export. Choose an explicit direction and bounds.
67
+ Preserve every graph authority in the returned subgraph. A native handoff means
68
+ only that the exact artifact digest and requested export frontier are known;
69
+ link Ghidra or Hopper Evidence only on exact subject digest, and never claim the
70
+ workflow opened a provider or verified a requested export by itself.
71
+
72
+ Use `compare_application_versions` after analyzing both versions independently.
73
+ Accept only its unique digest, source-map, structural-fingerprint, or non-module
74
+ semantic matches. Never use module ordinals or minified names as persistent
75
+ identity, and never promote an ambiguous candidate to a match. Report added or
76
+ removed only when opposite-side coverage is complete; otherwise report unknown.
77
+ Use `unknown_registry_approved: true` only after approval to retain unresolved
78
+ version matches. For local operator-provided artifacts, the packaged
79
+ `verify:application-workflows` command reports digests and coverage without
80
+ printing source text.
81
+
82
+ Use `run_controlled_replay` only for operator-selected extracted JavaScript
83
+ modules when the separate `javascript_replay` policy is enabled. First call
84
+ `mode: plan`; review the exact module, stub, runtime, sandbox, case, limit, and
85
+ policy commitments. Execute only with `approved: true` and that exact
86
+ `plan_digest`. Prefer explicit cases plus the parser, sanitizer, or clipboard
87
+ boundary generator. A right manifest produces a derived differential result.
88
+ Treat return values, exceptions, denials, limits, and crashes as observations
89
+ of the isolated experiment with `controlled-replay` authority—not facts about
90
+ the real application. Never substitute passive browser/Electron permission,
91
+ Process Capture, or an in-process `vm` run. Reproducer export requires its own
92
+ literal approval and `evidence_write` authority after sandbox cleanup.
93
+
38
94
  ## Understand the request
39
95
 
40
96
  Identify the app and what the user wants to understand or build. Do not ask for information they already provided.