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.
- package/README.md +14 -4
- package/bridge/ghidra/ReaGhidraBridge.java +477 -4
- package/bridge/hopper_bridge.py +54 -4
- package/dist/application/AnalysisContextQueries.js +130 -0
- package/dist/application/AnalysisSnapshotCache.js +4 -2
- package/dist/application/ArtifactInventory/scanCanonical.js +1 -1
- package/dist/application/BinarySession.js +5 -4
- package/dist/application/BinarySessionComposition.js +21 -0
- package/dist/application/BinarySessionRecords.js +79 -9
- package/dist/application/CapabilityInventory.js +16 -2
- package/dist/application/ClientRegistrationStatus.js +4 -1
- package/dist/application/DirectAnalysis.js +6 -2
- package/dist/application/EnhancedTools.js +37 -7
- package/dist/application/EvidenceLedger.js +45 -16
- package/dist/application/JavaScriptArtifactAnalysis.js +13 -4
- package/dist/application/LazyAnalysisProvider.js +77 -0
- package/dist/application/LoopbackReplay.js +1 -1
- package/dist/application/NativeApiInspection.js +80 -0
- package/dist/application/SessionProviderRouter.js +6 -6
- package/dist/application/SetupClientConfiguration.js +4 -2
- package/dist/application/runtime.js +26 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +8 -2
- package/dist/catalogIdentity.js +3 -3
- package/dist/cli/artifactCommands.js +5 -3
- package/dist/cli/coreAnalysisCommands.js +41 -0
- package/dist/cliCommandNames.js +1 -0
- package/dist/contracts/artifactToolContracts.js +8 -3
- package/dist/contracts/enhancedInputs.js +10 -0
- package/dist/contracts/functionWorkflowToolContracts.js +30 -0
- package/dist/contracts/promptContracts.js +14 -15
- package/dist/contracts/toolContractExamples.js +3 -0
- package/dist/contracts/toolContracts.js +21 -4
- package/dist/contracts/toolEffects.js +4 -0
- package/dist/contracts/toolOutputSchemaGroups.js +50 -10
- package/dist/domain/analysisErrorPresentation.js +8 -2
- package/dist/domain/analysisErrorProjection.js +1 -0
- package/dist/domain/bytecodeProvider.js +179 -0
- package/dist/domain/conformancePackage.js +169 -0
- package/dist/domain/conformanceReplay.js +104 -0
- package/dist/domain/conformanceTrustGate.js +193 -0
- package/dist/domain/customProtocolCapture.js +137 -0
- package/dist/domain/eventProcessTree.js +214 -0
- package/dist/domain/evidenceBundle.js +47 -0
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +4 -1
- package/dist/domain/inputIssueProjection.js +7 -1
- package/dist/domain/javascriptSemanticAnalysis.js +8 -12
- package/dist/domain/javascriptSourceParser.js +15 -0
- package/dist/domain/javascriptStaticAnalysis.js +8 -12
- package/dist/domain/mobileApplicationInvestigation.js +159 -0
- package/dist/domain/nativeApiBoundary.js +130 -0
- package/dist/domain/objcSwiftMetadata.js +150 -0
- package/dist/domain/packageAnalysis.js +123 -0
- package/dist/domain/peInspection.js +196 -0
- package/dist/domain/protocolCapture.js +243 -0
- package/dist/dotnet/ManagedStaticProvider.js +34 -5
- package/dist/generatedMcpToolCatalog.js +37 -0
- package/dist/generatedPackageMetadata.js +4 -4
- package/dist/ghidra/GhidraDefaults.js +1 -1
- package/dist/ghidra/GhidraFunctionValues.js +27 -1
- package/dist/ghidra/GhidraProviderCapabilities.js +40 -38
- package/dist/hopper/HopperClient.js +26 -2
- package/dist/hopper/HopperProvider.js +42 -30
- package/dist/hopper/HopperRequestQueue.js +32 -4
- package/dist/hopper/HopperResponseStream.js +2 -2
- package/dist/hopper/protocol.js +63 -21
- package/dist/main/transport.js +2 -5
- package/dist/main.js +14 -12
- package/dist/mcpDoctor.js +2 -2
- package/dist/mcpStartupPolicy.js +14 -0
- package/dist/server/LazyToolCatalog.js +134 -0
- package/dist/server/createServer.js +64 -171
- package/dist/server/hydrateServerTools.js +191 -0
- package/dist/server/registerEnhancedTools.js +13 -3
- package/dist/server/registerEvidenceResources.js +50 -101
- package/dist/server/registerInvestigationTools.js +1 -2
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -4
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -7
- package/dist/server/registerReconstructionReadinessResource.js +0 -7
- package/dist/server/registerSessionRecordTools.js +82 -12
- package/dist/server/registerSessionStatusTool.js +1 -1
- package/dist/server/registerSessionTools.js +21 -1
- package/dist/server/toolRegistrationOptions.js +21 -6
- package/dist/server/toolResult.js +12 -0
- package/package.json +21 -10
- package/scripts/package-runner-bootstrap.mjs +72 -0
- package/scripts/rea.mjs +11 -1
- 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": "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
148
|
-
"@modelcontextprotocol/server": "2.0.0
|
|
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 (
|
|
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:
|
|
7
|
-
catalog_digest: "
|
|
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
|
-
`
|
|
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.
|