rea-agents 2.5.0 → 3.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 (88) hide show
  1. package/README.md +14 -4
  2. package/bridge/ghidra/ReaGhidraBridge.java +477 -4
  3. package/bridge/hopper_bridge.py +54 -4
  4. package/dist/application/AnalysisContextQueries.js +130 -0
  5. package/dist/application/AnalysisSnapshotCache.js +4 -2
  6. package/dist/application/ArtifactInventory/scanCanonical.js +1 -1
  7. package/dist/application/BinarySession.js +5 -4
  8. package/dist/application/BinarySessionComposition.js +21 -0
  9. package/dist/application/BinarySessionRecords.js +79 -9
  10. package/dist/application/CapabilityInventory.js +16 -2
  11. package/dist/application/ClientRegistrationStatus.js +4 -1
  12. package/dist/application/DirectAnalysis.js +6 -2
  13. package/dist/application/EnhancedTools.js +37 -7
  14. package/dist/application/EvidenceLedger.js +45 -16
  15. package/dist/application/JavaScriptArtifactAnalysis.js +13 -4
  16. package/dist/application/LazyAnalysisProvider.js +77 -0
  17. package/dist/application/LoopbackReplay.js +1 -1
  18. package/dist/application/NativeApiInspection.js +80 -0
  19. package/dist/application/SessionProviderRouter.js +6 -6
  20. package/dist/application/SetupClientConfiguration.js +4 -2
  21. package/dist/application/runtime.js +26 -9
  22. package/dist/browser/PlaywrightBrowserScenarioProvider.js +8 -2
  23. package/dist/catalogIdentity.js +3 -3
  24. package/dist/cli/artifactCommands.js +5 -3
  25. package/dist/cli/coreAnalysisCommands.js +41 -0
  26. package/dist/cliCommandNames.js +1 -0
  27. package/dist/contracts/artifactToolContracts.js +8 -3
  28. package/dist/contracts/enhancedInputs.js +10 -0
  29. package/dist/contracts/functionWorkflowToolContracts.js +30 -0
  30. package/dist/contracts/promptContracts.js +14 -15
  31. package/dist/contracts/toolContractExamples.js +3 -0
  32. package/dist/contracts/toolContracts.js +21 -4
  33. package/dist/contracts/toolEffects.js +4 -0
  34. package/dist/contracts/toolOutputSchemaGroups.js +50 -10
  35. package/dist/domain/analysisErrorPresentation.js +8 -2
  36. package/dist/domain/analysisErrorProjection.js +1 -0
  37. package/dist/domain/bytecodeProvider.js +179 -0
  38. package/dist/domain/conformancePackage.js +169 -0
  39. package/dist/domain/conformanceReplay.js +104 -0
  40. package/dist/domain/conformanceTrustGate.js +193 -0
  41. package/dist/domain/customProtocolCapture.js +137 -0
  42. package/dist/domain/eventProcessTree.js +214 -0
  43. package/dist/domain/evidenceBundle.js +47 -0
  44. package/dist/domain/hopperStartupFailure.js +1 -1
  45. package/dist/domain/hopperValues.js +4 -1
  46. package/dist/domain/inputIssueProjection.js +7 -1
  47. package/dist/domain/javascriptSemanticAnalysis.js +8 -12
  48. package/dist/domain/javascriptSourceParser.js +15 -0
  49. package/dist/domain/javascriptStaticAnalysis.js +8 -12
  50. package/dist/domain/mobileApplicationInvestigation.js +159 -0
  51. package/dist/domain/nativeApiBoundary.js +130 -0
  52. package/dist/domain/objcSwiftMetadata.js +150 -0
  53. package/dist/domain/packageAnalysis.js +123 -0
  54. package/dist/domain/peInspection.js +196 -0
  55. package/dist/domain/protocolCapture.js +243 -0
  56. package/dist/dotnet/ManagedStaticProvider.js +34 -5
  57. package/dist/generatedMcpToolCatalog.js +37 -0
  58. package/dist/generatedPackageMetadata.js +4 -4
  59. package/dist/ghidra/GhidraDefaults.js +1 -1
  60. package/dist/ghidra/GhidraFunctionValues.js +27 -1
  61. package/dist/ghidra/GhidraProviderCapabilities.js +40 -38
  62. package/dist/hopper/HopperClient.js +26 -2
  63. package/dist/hopper/HopperProvider.js +42 -30
  64. package/dist/hopper/HopperRequestQueue.js +32 -4
  65. package/dist/hopper/HopperResponseStream.js +2 -2
  66. package/dist/hopper/protocol.js +63 -21
  67. package/dist/main/transport.js +2 -5
  68. package/dist/main.js +14 -12
  69. package/dist/mcpDoctor.js +2 -2
  70. package/dist/mcpStartupPolicy.js +14 -0
  71. package/dist/server/LazyToolCatalog.js +134 -0
  72. package/dist/server/createServer.js +64 -171
  73. package/dist/server/hydrateServerTools.js +191 -0
  74. package/dist/server/registerEnhancedTools.js +13 -3
  75. package/dist/server/registerEvidenceResources.js +50 -101
  76. package/dist/server/registerInvestigationTools.js +1 -2
  77. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -4
  78. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -7
  79. package/dist/server/registerReconstructionReadinessResource.js +0 -7
  80. package/dist/server/registerSessionRecordTools.js +82 -12
  81. package/dist/server/registerSessionStatusTool.js +1 -1
  82. package/dist/server/registerSessionTools.js +21 -1
  83. package/dist/server/toolRegistrationOptions.js +21 -6
  84. package/dist/server/toolResult.js +12 -0
  85. package/package.json +21 -10
  86. package/scripts/package-runner-bootstrap.mjs +72 -0
  87. package/scripts/rea.mjs +11 -1
  88. package/skills/reverse-engineer-anything/SKILL.md +10 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rea-agents",
3
- "version": "2.5.0",
3
+ "version": "3.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": {
@@ -43,6 +43,7 @@
43
43
  "bridge/hopper_bridge.py",
44
44
  "bridge/ghidra/ReaGhidraBridge.java",
45
45
  "scripts/rea.mjs",
46
+ "scripts/package-runner-bootstrap.mjs",
46
47
  "scripts/hopper-demo-x11.py",
47
48
  "scripts/prepack.mjs",
48
49
  "scripts/prepare.mjs",
@@ -54,12 +55,16 @@
54
55
  "deps:check": "node scripts/check-dependency-install.mjs",
55
56
  "metadata:generate": "node scripts/generate-package-metadata.mjs",
56
57
  "metadata:check": "node scripts/generate-package-metadata.mjs --check",
58
+ "mcp-catalog:generate": "npm run build:cached && node scripts/generate-mcp-tool-catalog.mjs",
59
+ "mcp-catalog:check": "node scripts/generate-mcp-tool-catalog.mjs --check",
57
60
  "prebuild": "npm run deps:check && npm run metadata:check",
58
61
  "build": "tsc -p tsconfig.build.json",
59
62
  "precheck": "npm run deps:check",
60
63
  "check": "turbo run typecheck lint format:check knip metadata:check",
61
64
  "precheck:fast": "npm run deps:check",
62
65
  "check:fast": "turbo run typecheck lint",
66
+ "precheck:changed": "npm run deps:check",
67
+ "check:changed": "turbo run typecheck lint && npm run test:changed",
63
68
  "precheck:test": "npm run deps:check",
64
69
  "check:test": "turbo run typecheck lint format:check knip metadata:check test:run",
65
70
  "precheck:pr": "npm run deps:check",
@@ -80,22 +85,28 @@
80
85
  "test": "vitest run",
81
86
  "test:run": "vitest run",
82
87
  "pretest:fast": "npm run build:cached",
83
- "test:fast": "vitest run --project parallel --project subprocess",
88
+ "test:fast": "vitest run --project domain --project services --project adapters --project composition --project boundary --project conformance",
89
+ "pretest:boundary": "npm run build:cached",
90
+ "test:boundary": "vitest run --project boundary --project process-global",
91
+ "pretest:acceptance": "npm run build:cached",
92
+ "test:acceptance": "vitest run --project acceptance",
84
93
  "pretest:changed": "npm run build:cached",
85
- "test:changed": "vitest run --project parallel --project subprocess --changed",
94
+ "test:changed": "vitest run --project domain --project services --project adapters --project composition --project boundary --project conformance --project evaluation --changed",
86
95
  "pretest:integration": "npm run build:cached",
87
- "test:integration": "vitest run --project serial-integration",
96
+ "test:integration": "vitest run --project boundary --project process-global --project acceptance",
88
97
  "pretest:coverage": "npm run build:cached",
89
98
  "test:coverage": "vitest run --coverage.enabled --coverage.provider=v8",
90
99
  "test:ci": "npm run test:coverage -- --reporter=default --reporter=junit --outputFile.junit=test-results.xml",
91
100
  "pretest:ci:shard": "npm run build:cached",
92
101
  "test:ci:shard": "npm run test:ci:shard:run",
93
102
  "test:ci:shard:run": "vitest run --coverage.enabled --coverage.provider=v8 --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.branches=0 --coverage.thresholds.statements=0 --reporter=default --reporter=blob",
94
- "test:ci:merge": "vitest --merge-reports --coverage.enabled --coverage.provider=v8 --reporter=default --reporter=junit --outputFile.junit=test-results.xml",
103
+ "test:ci:merge": "vitest --merge-reports --coverage.enabled --coverage.provider=v8",
95
104
  "pretest:verbose": "npm run build:cached",
96
105
  "test:verbose": "vitest run --reporter=verbose",
97
106
  "pretest:watch": "npm run build:cached",
98
- "test:watch": "vitest --project parallel --project subprocess --changed",
107
+ "test:watch": "vitest --project domain --project services --project adapters --project composition --project boundary --project conformance --project evaluation --changed",
108
+ "pretest:watch:all": "npm run build:cached",
109
+ "test:watch:all": "vitest --changed",
99
110
  "typecheck": "tsc --noEmit",
100
111
  "verify:test-temp-hygiene": "npm run build:cached && node scripts/verify-test-temp-hygiene.mjs",
101
112
  "verify:hopper": "npm run verify:fixtures && npm run build:cached && node scripts/verify-real-hopper.mjs",
@@ -123,9 +134,9 @@
123
134
  "evidence:check": "npm run build:cached && node scripts/generate-completion-ledger.mjs --check",
124
135
  "docs:api": "typedoc",
125
136
  "docs:api:cached": "turbo run docs:api",
126
- "docs:generate": "npm run metadata:generate && npm run build:cached && node scripts/generate-skill-metadata.mjs && node scripts/generate-product-catalog.mjs && node scripts/generate-completion-ledger.mjs && npm run docs:api:cached && node scripts/generate-error-schema.mjs",
137
+ "docs:generate": "npm run metadata:generate && npm run build:cached && node scripts/generate-mcp-tool-catalog.mjs && node scripts/generate-skill-metadata.mjs && node scripts/generate-product-catalog.mjs && node scripts/generate-completion-ledger.mjs && npm run docs:api:cached && node scripts/generate-error-schema.mjs",
127
138
  "docs:check": "turbo run docs:check:built",
128
- "docs:check:built": "node scripts/generate-package-metadata.mjs --check && node scripts/generate-skill-metadata.mjs --check && node scripts/generate-product-catalog.mjs --check && node scripts/generate-completion-ledger.mjs --check && node scripts/check-doc-facts.mjs && node scripts/generate-error-schema.mjs --check",
139
+ "docs:check:built": "node scripts/generate-package-metadata.mjs --check && node scripts/generate-mcp-tool-catalog.mjs --check && node scripts/generate-skill-metadata.mjs --check && node scripts/generate-product-catalog.mjs --check && node scripts/generate-completion-ledger.mjs --check && node scripts/check-doc-facts.mjs && node scripts/generate-error-schema.mjs --check",
129
140
  "docs:error-schema": "npm run build:cached && node scripts/generate-error-schema.mjs",
130
141
  "prepack": "node scripts/prepack.mjs",
131
142
  "prepare": "node scripts/prepare.mjs"
@@ -144,8 +155,8 @@
144
155
  "@electron/asar": "4.2.0",
145
156
  "@jridgewell/trace-mapping": "0.3.31",
146
157
  "@lydell/node-pty": "1.1.0",
147
- "@modelcontextprotocol/client": "2.0.0-beta.4",
148
- "@modelcontextprotocol/server": "2.0.0-beta.4",
158
+ "@modelcontextprotocol/client": "2.0.0",
159
+ "@modelcontextprotocol/server": "2.0.0",
149
160
  "@xterm/addon-serialize": "0.14.0",
150
161
  "@xterm/headless": "6.0.0",
151
162
  "@zip.js/zip.js": "2.8.26",
@@ -0,0 +1,72 @@
1
+ import { spawn } from "node:child_process";
2
+ import { resolve } from "node:path";
3
+
4
+ const BOOTSTRAP_MARKER = "REA_PACKAGE_RUNNER_BOOTSTRAPPED";
5
+
6
+ /**
7
+ * Plan a current-release setup bootstrap when bare npx selected a project-local
8
+ * package. Explicit `npm exec --package=<name>@<version>` rollbacks bypass it.
9
+ */
10
+ export function packageRunnerSetupPlan(input) {
11
+ if (input.args[0] !== "setup") return undefined;
12
+ if (input.environment[BOOTSTRAP_MARKER] === "1") return undefined;
13
+ if (input.environment.npm_lifecycle_event !== "npx") return undefined;
14
+
15
+ const localPrefix = input.environment.npm_config_local_prefix;
16
+ if (localPrefix === undefined || localPrefix.length === 0) return undefined;
17
+ if (
18
+ !isPackageBelowLocalPrefix(
19
+ input.packageRoot,
20
+ localPrefix,
21
+ input.packageName,
22
+ )
23
+ )
24
+ return undefined;
25
+
26
+ const requestedPackage = input.environment.npm_config_package;
27
+ if (
28
+ requestedPackage !== undefined &&
29
+ isExactPackageVersion(requestedPackage, input.packageName)
30
+ )
31
+ return undefined;
32
+
33
+ return {
34
+ command: "npm",
35
+ args: [
36
+ "exec",
37
+ "--yes",
38
+ `--package=${input.packageName}@latest`,
39
+ "--",
40
+ "rea",
41
+ ...input.args,
42
+ ],
43
+ };
44
+ }
45
+
46
+ /** Execute a planned package-runner bootstrap and return its exit status. */
47
+ export async function runPackageRunnerSetupBootstrap(input) {
48
+ const plan = packageRunnerSetupPlan(input);
49
+ if (plan === undefined) return undefined;
50
+
51
+ return await new Promise((resolveExitCode) => {
52
+ const child = spawn(plan.command, plan.args, {
53
+ stdio: "inherit",
54
+ env: { ...input.environment, [BOOTSTRAP_MARKER]: "1" },
55
+ });
56
+ child.once("error", () => resolveExitCode(1));
57
+ child.once("exit", (code) => resolveExitCode(code ?? 1));
58
+ });
59
+ }
60
+
61
+ function isPackageBelowLocalPrefix(packageRoot, localPrefix, packageName) {
62
+ const expectedRoot = resolve(localPrefix, "node_modules", packageName);
63
+ return resolve(packageRoot) === expectedRoot;
64
+ }
65
+
66
+ function isExactPackageVersion(packageSpecifier, packageName) {
67
+ const version = packageSpecifier.slice(`${packageName}@`.length);
68
+ return (
69
+ packageSpecifier.startsWith(`${packageName}@`) &&
70
+ /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u.test(version)
71
+ );
72
+ }
package/scripts/rea.mjs CHANGED
@@ -4,6 +4,8 @@ import { access } from "node:fs/promises";
4
4
  import { dirname, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
 
7
+ import { runPackageRunnerSetupBootstrap } from "./package-runner-bootstrap.mjs";
8
+
7
9
  // Route production MCP before importing Incur. Incur owns registration helpers
8
10
  // such as `mcp add`, while only dist/main.js may serve the stdio tool catalog.
9
11
  const args = process.argv.slice(2);
@@ -15,13 +17,21 @@ const isMcpMode =
15
17
  args.length === 1 && (args[0] === "--mcp" || args[0] === "mcp");
16
18
  const isMcpDoctorMode = args[0] === "mcp" && args[1] === "doctor";
17
19
  const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
20
+ const bootstrapExitCode = await runPackageRunnerSetupBootstrap({
21
+ args,
22
+ environment: process.env,
23
+ packageRoot,
24
+ packageName: packageJson.name,
25
+ });
18
26
  const runtimeFiles = isMcpMode
19
27
  ? ["dist/main.js"]
20
28
  : isMcpDoctorMode
21
29
  ? ["dist/main.js", "dist/mcpDoctor.js"]
22
30
  : ["dist/cli.js", "dist/cliOutput.js"];
23
31
 
24
- if (!(await compiledRuntimeExists(runtimeFiles))) {
32
+ if (bootstrapExitCode !== undefined) {
33
+ process.exitCode = bootstrapExitCode;
34
+ } else if (!(await compiledRuntimeExists(runtimeFiles))) {
25
35
  process.stderr.write(
26
36
  `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`,
27
37
  );
@@ -3,8 +3,8 @@ name: reverse-engineer-anything
3
3
  description: Reverse engineer native, managed, Electron/JavaScript, packaged, and browser applications with REA. Use shipped-artifact or approved runtime evidence to explain features, compare versions, decompile code, or guide a reconstruction. Skip REA for ordinary source-repository architecture analysis.
4
4
  metadata:
5
5
  version: "23"
6
- tool_count: 110
7
- catalog_digest: "e8cac51f2f17a5b9a088c3ff773473c4897823401481fc0875a28fe7daf8eee0"
6
+ tool_count: 114
7
+ catalog_digest: "e83a177f5eca63bbad17886a61f5a1a376d44afe862c51c56e5d38339f7d41f8"
8
8
  ---
9
9
 
10
10
  # REA
@@ -23,7 +23,8 @@ Choose the first tool from the target the user supplied. Do not call
23
23
  - ASAR or extracted JavaScript/Electron tree:
24
24
  `analyze_javascript_application`.
25
25
  - Archive, application package, ZIP/APK/IPA/MSIX/AppX, or DMG:
26
- `inventory_artifact`.
26
+ `open_binary` with the supplied local path, then `inspect_artifact` or
27
+ `inventory_artifact` (both operate on the active target and accept no path).
27
28
  - Managed PE/CLI assembly: `inspect_managed_artifact`.
28
29
  - User-owned browser page already open: `list_browser_targets`.
29
30
  - User-owned Electron runtime already open: `list_electron_targets`.
@@ -34,6 +35,12 @@ If the app is missing, ask which app to inspect. Resolve a human-readable app
34
35
  name to one clear installed artifact when possible; ask only when matches are
35
36
  ambiguous. Never choose an example app on the user's behalf.
36
37
 
38
+ In a target-free session, use `open_binary` to bind any archive/package or
39
+ native target whose analysis tool operates on the active target. Do not call a
40
+ tool hidden from `tools/list`; inspect `binary_session` with
41
+ `detail: "capabilities"` for the exact remediation when a desired capability
42
+ is unavailable.
43
+
37
44
  ## Work summary-first
38
45
 
39
46
  Start with the default summary projection. Do not repeat an identical tool call.