rea-agents 2.4.0 → 2.5.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 +80 -18
- package/bridge/ghidra/ReaGhidraBridge.java +48 -1
- package/bridge/hopper_bridge.py +259 -24
- package/dist/application/AnalysisClientCleanup.js +14 -0
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +31 -13
- package/dist/application/BinarySession.js +15 -4
- package/dist/application/BinarySessionStatus.js +31 -1
- package/dist/application/BrowserEvidence.js +14 -0
- package/dist/application/BrowserScenarioCapturePort.js +1 -0
- package/dist/application/BrowserScenarioCaptureService.js +53 -0
- package/dist/application/BrowserScenarioEvidence.js +40 -0
- package/dist/application/CallPathTracing.js +160 -0
- package/dist/application/CapabilityInventory.js +68 -12
- package/dist/application/CompositeProvider.js +10 -1
- package/dist/application/DirectAnalysis.js +7 -2
- package/dist/application/EnhancedLiteralTracing.js +118 -0
- package/dist/application/EnhancedTools.js +35 -121
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +13 -0
- package/dist/application/JavaScriptApplicationWorkflowService.js +27 -1
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +34 -0
- package/dist/application/JavaScriptRuntimeObservationPort.js +1 -0
- package/dist/application/JavaScriptRuntimeObservationService.js +46 -0
- package/dist/application/JavaScriptSemanticGraphAsyncProjection.js +147 -0
- package/dist/application/JavaScriptSemanticGraphBuilder.js +34 -6
- package/dist/application/JavaScriptSemanticGraphChildProcessProjection.js +156 -0
- package/dist/application/JavaScriptSemanticGraphConstruction.js +2 -2
- package/dist/application/JavaScriptSemanticGraphDataProjection.js +203 -0
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +25 -0
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +129 -8
- package/dist/application/JavaScriptSemanticGraphObjectProjection.js +81 -0
- package/dist/application/JavaScriptSemanticGraphProjection.js +14 -7
- package/dist/application/JavaScriptSemanticGraphResourceProjection.js +59 -0
- package/dist/application/JavaScriptSemanticGraphValueProjection.js +77 -0
- package/dist/application/ProcessReactiveEffects.js +6 -0
- package/dist/application/ProcessReactiveHarness.js +16 -1
- package/dist/application/ProjectPermissionStore.js +1 -0
- package/dist/application/ReconstructionObligationAuthority.js +72 -0
- package/dist/application/ReconstructionObligationCandidates.js +265 -0
- package/dist/application/ReconstructionObligationLedgerDiagnostics.js +47 -0
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +263 -0
- package/dist/application/ReconstructionObligationLedgerProjection.js +86 -0
- package/dist/application/ReconstructionObligationLedgerService.js +72 -0
- package/dist/application/ReconstructionObligationOriginalCases.js +33 -0
- package/dist/application/ReconstructionObligationPolicies.js +132 -0
- package/dist/application/ReconstructionReadinessService.js +48 -0
- package/dist/artifacts/ArtifactProvider.js +87 -22
- package/dist/browser/BrowserScenarioSecrets.js +53 -0
- package/dist/browser/BrowserScenarioSessionPort.js +1 -0
- package/dist/browser/CdpBrowserProvider.js +2 -2
- package/dist/browser/CdpCaptureDocuments.js +57 -0
- package/dist/browser/CdpCaptureStorage.js +71 -29
- package/dist/browser/CdpCaptureStorageFingerprints.js +328 -0
- package/dist/browser/CdpEndpoint.js +8 -6
- package/dist/browser/CdpPageCapture.js +2 -0
- package/dist/browser/JavaScriptRuntimeScope.js +38 -0
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +253 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +42 -0
- package/dist/browser/PlaywrightScenarioActions.js +62 -0
- package/dist/browser/PlaywrightScenarioArtifacts.js +238 -0
- package/dist/browser/PlaywrightScenarioBrowser.js +144 -0
- package/dist/browser/PlaywrightScenarioEvents.js +301 -0
- package/dist/browser/PlaywrightScenarioSession.js +300 -0
- package/dist/browser/V8InspectorCaptureProjection.js +110 -0
- package/dist/browser/V8InspectorEndpoint.js +72 -0
- package/dist/browser/V8InspectorProvider.js +267 -0
- package/dist/catalogIdentity.js +8 -0
- package/dist/cli/artifactCommands.js +39 -0
- package/dist/cli/coreAnalysisCommands.js +37 -0
- package/dist/cli.js +4 -0
- package/dist/cliApplicationCommands.js +30 -2
- package/dist/cliBrowserAdvancedCommands.js +17 -5
- package/dist/cliBrowserCommands.js +1 -0
- package/dist/cliBrowserScenarioCommands.js +43 -0
- package/dist/cliCommandNames.js +8 -0
- package/dist/cliJavaScriptRuntimeCommands.js +164 -0
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliPolicyCommands.js +1 -0
- package/dist/config/environment.js +12 -0
- package/dist/config/parseConfig.js +88 -17
- package/dist/contracts/analysisSearchContract.js +14 -0
- package/dist/contracts/applicationToolContracts.js +86 -2
- package/dist/contracts/applicationWorkflowInputContracts.js +18 -0
- package/dist/contracts/artifactToolContracts.js +22 -0
- package/dist/contracts/browserProviderToolContracts.js +7 -0
- package/dist/contracts/browserScenarioToolContracts.js +81 -0
- package/dist/contracts/browserToolContracts.js +88 -98
- package/dist/contracts/enhancedInputs.js +25 -6
- package/dist/contracts/functionInstructionContract.js +8 -0
- package/dist/contracts/hopperMemoryContracts.js +22 -0
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +42 -0
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +58 -0
- package/dist/contracts/reconstructionReadinessExample.js +436 -0
- package/dist/contracts/toolContractExamples.js +5 -0
- package/dist/contracts/toolContractTypes.js +1 -0
- package/dist/contracts/toolContracts.js +13 -21
- package/dist/contracts/toolEffects.js +21 -0
- package/dist/contracts/toolOutputSchemaGroups.js +70 -20
- package/dist/contracts/toolOutputSchemaPrimitives.js +37 -0
- package/dist/domain/analysisErrorProjection.js +8 -0
- package/dist/domain/artifactInspection.js +347 -0
- package/dist/domain/browserCaptureComparison.js +82 -0
- package/dist/domain/browserObservation.js +8 -1
- package/dist/domain/browserObservationErrors.js +1 -0
- package/dist/domain/browserObservationSchemas.js +26 -0
- package/dist/domain/browserScenario.js +165 -0
- package/dist/domain/browserScenarioCapture.js +57 -0
- package/dist/domain/browserScenarioCaptureValues.js +204 -0
- package/dist/domain/browserScenarioDiff.js +324 -0
- package/dist/domain/browserScenarioDiffValues.js +157 -0
- package/dist/domain/browserScenarioNormalization.js +45 -0
- package/dist/domain/browserScenarioValues.js +372 -0
- package/dist/domain/hopperValues.js +10 -0
- package/dist/domain/javascriptRuntimeObservation.js +170 -0
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +120 -2
- package/dist/domain/javascriptRuntimeReconciliationResult.js +3 -3
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +2 -2
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +1 -1
- package/dist/domain/javascriptSemanticAnalysis.js +5 -4
- package/dist/domain/javascriptSemanticAsyncEffects.js +253 -0
- package/dist/domain/javascriptSemanticChildProcesses.js +237 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +125 -0
- package/dist/domain/javascriptSemanticDataEffects.js +284 -0
- package/dist/domain/javascriptSemanticDerivedAnalysis.js +41 -0
- package/dist/domain/javascriptSemanticFingerprints.js +174 -0
- package/dist/domain/javascriptSemanticIr.js +21 -1
- package/dist/domain/javascriptSemanticObjects.js +115 -0
- package/dist/domain/javascriptSemanticPromises.js +290 -0
- package/dist/domain/javascriptSemanticResources.js +136 -0
- package/dist/domain/javascriptStaticAnalysis.js +4 -3
- package/dist/domain/javascriptStaticAnalysisBundler.js +38 -0
- package/dist/domain/javascriptStaticAnalysisCalls.js +23 -1
- package/dist/domain/javascriptStaticAnalysisHelpers.js +8 -0
- package/dist/domain/processCapture.js +8 -2
- package/dist/domain/processReactiveScenario.js +1 -0
- package/dist/domain/processReactiveTransition.js +9 -4
- package/dist/domain/providerCleanupError.js +11 -0
- package/dist/domain/reconstructionObligationLedgerSchemas.js +278 -0
- package/dist/domain/reconstructionReadiness.js +121 -0
- package/dist/domain/reconstructionReadinessFindingHelpers.js +17 -0
- package/dist/domain/reconstructionReadinessIntegrityFindings.js +118 -0
- package/dist/domain/reconstructionReadinessJourneyFindings.js +193 -0
- package/dist/domain/reconstructionReadinessSchemas.js +240 -0
- package/dist/domain/sourceToBundleComparison.js +335 -0
- package/dist/domain/sourceToBundleComparisonSchemas.js +133 -0
- package/dist/domain/sourceToBundleSignals.js +202 -0
- package/dist/domain/webCaptureDiff.js +141 -27
- package/dist/domain/webScreenshot.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraDefaults.js +1 -1
- package/dist/ghidra/GhidraFunctionValues.js +13 -1
- package/dist/ghidra/GhidraProviderCapabilities.js +7 -0
- package/dist/hopper/HopperCleanup.js +158 -0
- package/dist/hopper/HopperClient.js +69 -99
- package/dist/hopper/HopperProvider.js +20 -1
- package/dist/hopper/HopperRequestQueue.js +187 -0
- package/dist/hopper/HopperResponseStream.js +46 -0
- package/dist/hopper/protocol.js +1 -0
- package/dist/main/transport.js +24 -24
- package/dist/main.js +6 -0
- package/dist/mcpDoctor.js +25 -2
- package/dist/process/ProcessCommandIdentity.js +19 -0
- package/dist/process/ProcessOwnership.js +11 -8
- package/dist/server/DynamicToolAvailability.js +70 -0
- package/dist/server/createServer.js +46 -1
- package/dist/server/lifecycleProgress.js +10 -0
- package/dist/server/permissionFailure.js +12 -0
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +35 -0
- package/dist/server/registerApplicationTools/helpers.js +11 -7
- package/dist/server/registerApplicationTools/obligationLedger.js +27 -0
- package/dist/server/registerApplicationTools/readiness.js +55 -0
- package/dist/server/registerApplicationTools.js +6 -0
- package/dist/server/registerArtifactTools.js +9 -1
- package/dist/server/registerBrowserScenarioTool.js +25 -0
- package/dist/server/registerBrowserTools.js +2 -2
- package/dist/server/registerCloseLifecycleTool.js +57 -0
- package/dist/server/registerEnhancedTools.js +16 -5
- package/dist/server/registerEvidenceResources.js +4 -0
- package/dist/server/registerEvidenceTools.js +9 -2
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +37 -0
- package/dist/server/registerReconstructionObligationLedgerResource.js +39 -0
- package/dist/server/registerReconstructionReadinessResource.js +39 -0
- package/dist/server/registerSessionStatusTool.js +11 -8
- package/dist/server/registerSessionTools.js +11 -57
- package/dist/server/sessionAvailabilityPolicy.js +10 -8
- package/package.json +12 -6
- package/skills/reverse-engineer-anything/SKILL.md +2 -2
|
@@ -12,9 +12,8 @@ import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
|
12
12
|
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
13
13
|
/** Register composed workflows against the same port as direct bridge tools. */
|
|
14
14
|
export const registerEnhancedTools = (server, analysis, options) => {
|
|
15
|
-
const services = new EnhancedTools(analysis);
|
|
16
15
|
for (const contract of ENHANCED_TOOL_CONTRACTS) {
|
|
17
|
-
registerEnhancedTool(server,
|
|
16
|
+
registerEnhancedTool(server, analysis, contract, {
|
|
18
17
|
logger: options.logger,
|
|
19
18
|
activeTarget: options.activeTarget,
|
|
20
19
|
analysisProfile: options.analysisProfile,
|
|
@@ -23,7 +22,7 @@ export const registerEnhancedTools = (server, analysis, options) => {
|
|
|
23
22
|
});
|
|
24
23
|
}
|
|
25
24
|
};
|
|
26
|
-
const registerEnhancedTool = (server,
|
|
25
|
+
const registerEnhancedTool = (server, analysis, contract, registration) => {
|
|
27
26
|
const name = enhancedToolNameSchema.parse(contract.name);
|
|
28
27
|
server.registerTool(name, toolRegistrationOptions(contract), async (input, context) => {
|
|
29
28
|
const progress = mcpProgressReporter(context);
|
|
@@ -38,6 +37,12 @@ const registerEnhancedTool = (server, services, contract, registration) => {
|
|
|
38
37
|
return toCallToolResult(validatedCall, contract);
|
|
39
38
|
const parsedInput = validatedCall.value.input;
|
|
40
39
|
const parameters = jsonParameters(parsedInput);
|
|
40
|
+
const services = new EnhancedTools({
|
|
41
|
+
execute: (operation, operationParameters, executionOptions) => analysis.execute(operation, operationParameters, {
|
|
42
|
+
...executionOptions,
|
|
43
|
+
progress,
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
41
46
|
const result = await logToolExecution(registration.logger, name, () => services.executeValidated(validatedCall.value, context.mcpReq.signal));
|
|
42
47
|
await progress.report({
|
|
43
48
|
phase: name,
|
|
@@ -93,6 +98,8 @@ const ENHANCED_INPUT_PARSERS = {
|
|
|
93
98
|
binary_overview: (input) => safeParseToolInput(enhancedInputSchemas.binary_overview, input, "binary_overview"),
|
|
94
99
|
analyze_function: (input) => safeParseToolInput(enhancedInputSchemas.analyze_function, input, "analyze_function"),
|
|
95
100
|
trace_feature: (input) => safeParseToolInput(enhancedInputSchemas.trace_feature, input, "trace_feature"),
|
|
101
|
+
find_code_for_string: (input) => safeParseToolInput(enhancedInputSchemas.find_code_for_string, input, "find_code_for_string"),
|
|
102
|
+
trace_call_path: (input) => safeParseToolInput(enhancedInputSchemas.trace_call_path, input, "trace_call_path"),
|
|
96
103
|
};
|
|
97
104
|
const parseEnhancedCall = (name, input) => {
|
|
98
105
|
switch (name) {
|
|
@@ -116,11 +123,15 @@ const parseEnhancedCall = (name, input) => {
|
|
|
116
123
|
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.analyze_function(input), (value) => ({ name, input: value }));
|
|
117
124
|
case "trace_feature":
|
|
118
125
|
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.trace_feature(input), (value) => ({ name, input: value }));
|
|
126
|
+
case "find_code_for_string":
|
|
127
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.find_code_for_string(input), (value) => ({ name, input: value }));
|
|
128
|
+
case "trace_call_path":
|
|
129
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.trace_call_path(input), (value) => ({ name, input: value }));
|
|
119
130
|
}
|
|
120
131
|
};
|
|
121
132
|
const mapEnhancedCall = (parsed, project) => parsed.ok ? ok(project(parsed.value)) : parsed;
|
|
122
133
|
const recordWorkflowUnknowns = ({ name, input, result, evidenceId, recordUnknown, }) => {
|
|
123
|
-
if (
|
|
134
|
+
if (!["trace_feature", "find_code_for_string", "trace_call_path"].includes(name) ||
|
|
124
135
|
input.unknown_registry_approved !== true ||
|
|
125
136
|
recordUnknown === undefined ||
|
|
126
137
|
typeof result !== "object" ||
|
|
@@ -143,7 +154,7 @@ const recordWorkflowUnknowns = ({ name, input, result, evidenceId, recordUnknown
|
|
|
143
154
|
required_environment: null,
|
|
144
155
|
recommended_probes: [
|
|
145
156
|
{
|
|
146
|
-
operation:
|
|
157
|
+
operation: name,
|
|
147
158
|
rationale: "Continue with a larger bounded budget.",
|
|
148
159
|
},
|
|
149
160
|
],
|
|
@@ -2,6 +2,8 @@ import { ResourceNotFoundError, ResourceTemplate, } from "@modelcontextprotocol/
|
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
3
|
import canonicalize from "canonicalize";
|
|
4
4
|
import { registerJavaScriptApplicationGraphResource } from "./registerJavaScriptApplicationGraphResource.js";
|
|
5
|
+
import { registerReconstructionObligationLedgerResource } from "./registerReconstructionObligationLedgerResource.js";
|
|
6
|
+
import { registerReconstructionReadinessResource } from "./registerReconstructionReadinessResource.js";
|
|
5
7
|
const evidenceUri = (evidenceId) => `rea://evidence/${evidenceId}`;
|
|
6
8
|
/** Expose immutable session-owned Evidence v2 records as MCP resources. */
|
|
7
9
|
export const registerEvidenceResources = (server, session) => {
|
|
@@ -13,6 +15,8 @@ export const registerEvidenceResources = (server, session) => {
|
|
|
13
15
|
registerArtifactPageResource(server, session);
|
|
14
16
|
registerFunctionDossierResource(server, session);
|
|
15
17
|
registerEvidenceSectionResource(server, session);
|
|
18
|
+
registerReconstructionObligationLedgerResource(server, session);
|
|
19
|
+
registerReconstructionReadinessResource(server, session);
|
|
16
20
|
registerJavaScriptApplicationGraphResource(server, session);
|
|
17
21
|
registerResidualUnknownResource(server, session);
|
|
18
22
|
};
|
|
@@ -47,6 +47,7 @@ export const registerEvidenceTools = (server, analysis, contracts, options) => {
|
|
|
47
47
|
});
|
|
48
48
|
if (!execution.ok)
|
|
49
49
|
return toCallToolResult(execution, contract);
|
|
50
|
+
const sourceEvidence = options.sourceEvidence?.(contract.name, execution.value.result) ?? [];
|
|
50
51
|
const evidence = createEvidence(execution.value.subject ?? options.activeTarget?.(), execution.value.provider, {
|
|
51
52
|
operation: contract.name,
|
|
52
53
|
parameters,
|
|
@@ -54,7 +55,13 @@ export const registerEvidenceTools = (server, analysis, contracts, options) => {
|
|
|
54
55
|
rawResult: execution.value.rawResult,
|
|
55
56
|
limitations: execution.value.limitations,
|
|
56
57
|
locations: execution.value.locations,
|
|
58
|
+
evidenceLinks: sourceEvidence.map(({ evidence_id: id }) => id),
|
|
57
59
|
});
|
|
60
|
+
for (const source of sourceEvidence) {
|
|
61
|
+
const sourceRecorded = options.recordEvidence?.(source);
|
|
62
|
+
if (sourceRecorded !== undefined && !sourceRecorded.ok)
|
|
63
|
+
return toCallToolResult(sourceRecorded, contract);
|
|
64
|
+
}
|
|
58
65
|
const recorded = options.recordEvidence?.(evidence);
|
|
59
66
|
return recorded !== undefined && !recorded.ok
|
|
60
67
|
? toCallToolResult(recorded, contract)
|
|
@@ -76,7 +83,7 @@ const permissionRequest = (operation, parameters) => {
|
|
|
76
83
|
mount: false,
|
|
77
84
|
operation_identity: `extract_artifact:${parameters.output_root}`,
|
|
78
85
|
};
|
|
79
|
-
if (
|
|
86
|
+
if (["inventory_artifact", "inspect_artifact"].includes(operation) &&
|
|
80
87
|
parameters.native_mount_approved === true)
|
|
81
88
|
return {
|
|
82
89
|
capability: "native_mount",
|
|
@@ -85,7 +92,7 @@ const permissionRequest = (operation, parameters) => {
|
|
|
85
92
|
environment_names: [],
|
|
86
93
|
network: "none",
|
|
87
94
|
mount: true,
|
|
88
|
-
operation_identity:
|
|
95
|
+
operation_identity: `${operation}:native_mount`,
|
|
89
96
|
};
|
|
90
97
|
return undefined;
|
|
91
98
|
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { listJavaScriptRuntimeTargets, observeJavaScriptRuntime, } from "../application/JavaScriptRuntimeObservationService.js";
|
|
2
|
+
import { JAVASCRIPT_RUNTIME_OBSERVATION_TOOL_CONTRACTS } from "../contracts/javascriptRuntimeObservationToolContracts.js";
|
|
3
|
+
import { listJavaScriptRuntimeTargetsInputSchema, observeJavaScriptRuntimeInputSchema, } from "../domain/javascriptRuntimeObservation.js";
|
|
4
|
+
import { logToolExecution } from "./toolLogging.js";
|
|
5
|
+
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
6
|
+
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
7
|
+
import { toCallToolResult } from "./toolResult.js";
|
|
8
|
+
/** Register passive Inspector tools even when policy keeps them unavailable. */
|
|
9
|
+
export const registerJavaScriptRuntimeObservationTools = (server, options) => {
|
|
10
|
+
const [listContract, observeContract] = JAVASCRIPT_RUNTIME_OBSERVATION_TOOL_CONTRACTS;
|
|
11
|
+
registerRuntimeTool(server, options, {
|
|
12
|
+
contract: listContract,
|
|
13
|
+
schema: listJavaScriptRuntimeTargetsInputSchema,
|
|
14
|
+
execute: (parsed, signal) => listJavaScriptRuntimeTargets(options.runtime, options.permissionAuthority, parsed, { signal }),
|
|
15
|
+
});
|
|
16
|
+
registerRuntimeTool(server, options, {
|
|
17
|
+
contract: observeContract,
|
|
18
|
+
schema: observeJavaScriptRuntimeInputSchema,
|
|
19
|
+
execute: (parsed, signal) => observeJavaScriptRuntime(options.runtime, options.permissionAuthority, parsed, { signal }),
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
const registerRuntimeTool = (server, options, spec) => {
|
|
23
|
+
server.registerTool(spec.contract.name, toolRegistrationOptions(spec.contract), async (input, context) => {
|
|
24
|
+
const parsed = safeParseToolInput(spec.schema, input, spec.contract.name);
|
|
25
|
+
if (!parsed.ok)
|
|
26
|
+
return toCallToolResult(parsed, spec.contract);
|
|
27
|
+
const result = await logToolExecution(options.logger, spec.contract.name, () => spec.execute(parsed.value, context.mcpReq.signal));
|
|
28
|
+
if (!result.ok)
|
|
29
|
+
return toCallToolResult(result, spec.contract);
|
|
30
|
+
const recorded = options.recordEvidence?.(result.value);
|
|
31
|
+
return recorded !== undefined && !recorded.ok
|
|
32
|
+
? toCallToolResult(recorded, spec.contract)
|
|
33
|
+
: toCallToolResult({ ok: true, value: result.value }, spec.contract, {
|
|
34
|
+
evidenceResourcesAvailable: recorded !== undefined,
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ResourceNotFoundError, ResourceTemplate, } from "@modelcontextprotocol/server";
|
|
2
|
+
import { reconstructionObligationLedgerPageSchema } from "../domain/reconstructionObligationLedgerSchemas.js";
|
|
3
|
+
/** Expose retained obligation-ledger pages as typed Evidence resources. */
|
|
4
|
+
export const registerReconstructionObligationLedgerResource = (server, session) => {
|
|
5
|
+
server.registerResource("reconstruction-obligation-ledger-page", new ResourceTemplate("rea://evidence/{evidenceId}/reconstruction-obligation-ledger", {
|
|
6
|
+
list: undefined,
|
|
7
|
+
complete: {
|
|
8
|
+
evidenceId: (prefix) => session
|
|
9
|
+
.exportEvidenceBundle()
|
|
10
|
+
.records.filter(({ predicate_type: predicateType }) => predicateType === "rea.reconstruction-obligation-ledger/v1")
|
|
11
|
+
.map(({ evidence_id: evidenceId }) => evidenceId)
|
|
12
|
+
.filter((evidenceId) => evidenceId.startsWith(prefix)),
|
|
13
|
+
},
|
|
14
|
+
}), {
|
|
15
|
+
title: "Reconstruction obligation ledger page",
|
|
16
|
+
description: "One deterministic Evidence v2-backed obligation page with full-ledger closure digest and summaries.",
|
|
17
|
+
mimeType: "application/json",
|
|
18
|
+
}, (uri, variables) => {
|
|
19
|
+
const evidenceId = variables.evidenceId;
|
|
20
|
+
if (typeof evidenceId !== "string")
|
|
21
|
+
throw new ResourceNotFoundError(uri.href);
|
|
22
|
+
const evidence = session.evidenceById(evidenceId);
|
|
23
|
+
if (evidence === undefined ||
|
|
24
|
+
evidence.predicate_type !== "rea.reconstruction-obligation-ledger/v1")
|
|
25
|
+
throw new ResourceNotFoundError(uri.href);
|
|
26
|
+
const page = reconstructionObligationLedgerPageSchema.safeParse(evidence.normalized_result);
|
|
27
|
+
if (!page.success)
|
|
28
|
+
throw new ResourceNotFoundError(uri.href);
|
|
29
|
+
return {
|
|
30
|
+
contents: [
|
|
31
|
+
{
|
|
32
|
+
uri: uri.href,
|
|
33
|
+
mimeType: "application/json",
|
|
34
|
+
text: JSON.stringify({ evidence_id: evidence.evidence_id, page: page.data }, null, 2),
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ResourceNotFoundError, ResourceTemplate, } from "@modelcontextprotocol/server";
|
|
2
|
+
import { reconstructionReadinessReportSchema } from "../domain/reconstructionReadinessSchemas.js";
|
|
3
|
+
/** Expose retained full readiness reports outside compact tool responses. */
|
|
4
|
+
export const registerReconstructionReadinessResource = (server, session) => {
|
|
5
|
+
server.registerResource("reconstruction-readiness-report", new ResourceTemplate("rea://evidence/{evidenceId}/reconstruction-readiness-report", {
|
|
6
|
+
list: undefined,
|
|
7
|
+
complete: {
|
|
8
|
+
evidenceId: (prefix) => session
|
|
9
|
+
.exportEvidenceBundle()
|
|
10
|
+
.records.filter(({ predicate_type: predicateType }) => predicateType === "rea.reconstruction-readiness-report/v1")
|
|
11
|
+
.map(({ evidence_id: evidenceId }) => evidenceId)
|
|
12
|
+
.filter((evidenceId) => evidenceId.startsWith(prefix)),
|
|
13
|
+
},
|
|
14
|
+
}), {
|
|
15
|
+
title: "Reconstruction readiness report",
|
|
16
|
+
description: "Full deterministic nine-stage conformance report and replay identity.",
|
|
17
|
+
mimeType: "application/json",
|
|
18
|
+
}, (uri, variables) => {
|
|
19
|
+
const evidenceId = variables.evidenceId;
|
|
20
|
+
if (typeof evidenceId !== "string")
|
|
21
|
+
throw new ResourceNotFoundError(uri.href);
|
|
22
|
+
const evidence = session.evidenceById(evidenceId);
|
|
23
|
+
if (evidence === undefined ||
|
|
24
|
+
evidence.predicate_type !== "rea.reconstruction-readiness-report/v1")
|
|
25
|
+
throw new ResourceNotFoundError(uri.href);
|
|
26
|
+
const report = reconstructionReadinessReportSchema.safeParse(evidence.normalized_result);
|
|
27
|
+
if (!report.success)
|
|
28
|
+
throw new ResourceNotFoundError(uri.href);
|
|
29
|
+
return {
|
|
30
|
+
contents: [
|
|
31
|
+
{
|
|
32
|
+
uri: uri.href,
|
|
33
|
+
mimeType: "application/json",
|
|
34
|
+
text: JSON.stringify({ evidence_id: evidence.evidence_id, report: report.data }, null, 2),
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
};
|
|
@@ -15,9 +15,15 @@ export const registerSessionStatusTool = (options) => {
|
|
|
15
15
|
const parsed = parsedInput.value;
|
|
16
16
|
const client = server.server.getClientVersion();
|
|
17
17
|
const clientCapabilities = server.server.getClientCapabilities();
|
|
18
|
+
const clientFeatures = {
|
|
19
|
+
elicitation_form: clientCapabilities?.elicitation?.form !== undefined,
|
|
20
|
+
elicitation_url: clientCapabilities?.elicitation?.url !== undefined,
|
|
21
|
+
roots: clientCapabilities?.roots !== undefined,
|
|
22
|
+
sampling: clientCapabilities?.sampling !== undefined,
|
|
23
|
+
};
|
|
18
24
|
const status = session.status();
|
|
19
25
|
const statusObject = jsonObjectSchema.parse(status);
|
|
20
|
-
const toolAvailability = buildCapabilityInventory(status, availabilityPolicy());
|
|
26
|
+
const toolAvailability = buildCapabilityInventory(status, availabilityPolicy(), clientFeatures);
|
|
21
27
|
const serverIdentity = createServerIdentity({
|
|
22
28
|
startedAt,
|
|
23
29
|
expected: {
|
|
@@ -45,12 +51,7 @@ export const registerSessionStatusTool = (options) => {
|
|
|
45
51
|
status: statusObject,
|
|
46
52
|
toolAvailability,
|
|
47
53
|
serverIdentity,
|
|
48
|
-
clientFeatures
|
|
49
|
-
elicitation_form: clientCapabilities?.elicitation?.form !== undefined,
|
|
50
|
-
elicitation_url: clientCapabilities?.elicitation?.url !== undefined,
|
|
51
|
-
roots: clientCapabilities?.roots !== undefined,
|
|
52
|
-
sampling: clientCapabilities?.sampling !== undefined,
|
|
53
|
-
},
|
|
54
|
+
clientFeatures,
|
|
54
55
|
}),
|
|
55
56
|
}, contract);
|
|
56
57
|
});
|
|
@@ -86,6 +87,7 @@ const projectSessionStatus = (options) => {
|
|
|
86
87
|
next_cursor: nextCursor < filtered.length ? nextCursor : null,
|
|
87
88
|
has_more: nextCursor < filtered.length,
|
|
88
89
|
},
|
|
90
|
+
client_features: options.clientFeatures,
|
|
89
91
|
});
|
|
90
92
|
}
|
|
91
93
|
return jsonObjectSchema.parse({
|
|
@@ -95,6 +97,7 @@ const projectSessionStatus = (options) => {
|
|
|
95
97
|
active_provider: activeProvider,
|
|
96
98
|
target: open ? targetFrom(options.status) : null,
|
|
97
99
|
alignment: options.serverIdentity.alignment,
|
|
100
|
+
analysis_activity: options.status.analysis_activity,
|
|
98
101
|
recommended_actions: recommendedActions(open, options.serverIdentity.alignment.state),
|
|
99
102
|
});
|
|
100
103
|
};
|
|
@@ -115,7 +118,7 @@ const recommendedActions = (open, alignment) => [
|
|
|
115
118
|
: []),
|
|
116
119
|
...(!open
|
|
117
120
|
? [
|
|
118
|
-
"Route the supplied target directly: ASAR/JavaScript to analyze_javascript_application, packages to
|
|
121
|
+
"Route the supplied target directly: ASAR/JavaScript to analyze_javascript_application, unfamiliar packages to inspect_artifact, managed PE/CLI to inspect_managed_artifact, browser/Electron runtimes to their list-target tools, and native binaries to open_binary.",
|
|
119
122
|
]
|
|
120
123
|
: [
|
|
121
124
|
"Continue from the active target with binary_overview or a bounded target-specific query.",
|
|
@@ -2,12 +2,12 @@ import { z } from "zod";
|
|
|
2
2
|
import { SESSION_TOOL_CONTRACTS } from "../contracts/toolContracts.js";
|
|
3
3
|
import { toCallToolResult } from "./toolResult.js";
|
|
4
4
|
import { logToolExecution } from "./toolLogging.js";
|
|
5
|
-
import {
|
|
5
|
+
import { ok } from "../domain/result.js";
|
|
6
6
|
import { processScenarioSchema } from "../domain/processCapture.js";
|
|
7
7
|
import { captureProcessScenario } from "../application/ProcessHarness.js";
|
|
8
8
|
import { processCapturePermissionRequest } from "../application/ProcessCapturePermission.js";
|
|
9
|
-
import { readAnalysisSnapshot
|
|
10
|
-
import {
|
|
9
|
+
import { readAnalysisSnapshot } from "../application/AnalysisSnapshotFiles.js";
|
|
10
|
+
import { UnknownRegistryError } from "../domain/errors.js";
|
|
11
11
|
import { DENY_EVIDENCE_FILE_POLICY, DENY_PROCESS_POLICY, } from "./sessionToolPolicies.js";
|
|
12
12
|
import { createProcessCaptureEvidence } from "../application/ProcessEvidence.js";
|
|
13
13
|
import { registerProcessComparisonTool } from "./registerProcessComparisonTool.js";
|
|
@@ -17,7 +17,7 @@ import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
|
17
17
|
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
18
18
|
import { registerBundleComparisonTool } from "./registerBundleComparisonTool.js";
|
|
19
19
|
import { registerInvestigationTools } from "./registerInvestigationTools.js";
|
|
20
|
-
import {
|
|
20
|
+
import { openBinaryInputSchema } from "../contracts/sessionLifecycleInputs.js";
|
|
21
21
|
import { registerSessionStatusTool } from "./registerSessionStatusTool.js";
|
|
22
22
|
import { mcpProgressReporter } from "./mcpProgress.js";
|
|
23
23
|
import { authorizeProcessCaptureWithElicitation, } from "./ProcessCaptureElicitation.js";
|
|
@@ -25,15 +25,8 @@ import { isInputRequiredResult } from "@modelcontextprotocol/server";
|
|
|
25
25
|
import { registerEvidenceTools, registerUnknownTools, } from "./registerSessionRecordTools.js";
|
|
26
26
|
import { registerReplayMachineTool } from "./registerReplayMachineTool.js";
|
|
27
27
|
import { sessionAvailabilityPolicy, } from "./sessionAvailabilityPolicy.js";
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return err(new AnalysisProtocolError("Expected a denied permission"));
|
|
31
|
-
return err(failure.error instanceof PermissionRequiredError
|
|
32
|
-
? failure.error
|
|
33
|
-
: new AnalysisProtocolError(failure.error.message, {
|
|
34
|
-
cause: failure.error,
|
|
35
|
-
}));
|
|
36
|
-
};
|
|
28
|
+
import { permissionFailure } from "./permissionFailure.js";
|
|
29
|
+
import { registerCloseLifecycleTool } from "./registerCloseLifecycleTool.js";
|
|
37
30
|
const recordProcessResidualUnknowns = (session, scenario, evidence, residuals) => {
|
|
38
31
|
if (scenario.unknown_registry_approved !== true)
|
|
39
32
|
return ok(null);
|
|
@@ -170,49 +163,6 @@ const registerOpenLifecycleTool = ({ server, session, logger, contracts: [openCo
|
|
|
170
163
|
: toCallToolResult(opened, openContract);
|
|
171
164
|
});
|
|
172
165
|
};
|
|
173
|
-
const registerCloseLifecycleTool = ({ server, session, logger, contracts: [, closeContract], snapshotFilePolicy, permissionAuthority, }) => {
|
|
174
|
-
server.registerTool(closeContract.name, toolRegistrationOptions(closeContract), async (input) => {
|
|
175
|
-
const parsedInput = safeParseToolInput(closeBinaryInputSchema, input, closeContract.name);
|
|
176
|
-
if (!parsedInput.ok)
|
|
177
|
-
return toCallToolResult(parsedInput, closeContract);
|
|
178
|
-
const parsed = parsedInput.value;
|
|
179
|
-
if (parsed.snapshot_path === undefined) {
|
|
180
|
-
const closed = await logToolExecution(logger, closeContract.name, () => session.close());
|
|
181
|
-
if (closed.ok)
|
|
182
|
-
server.sendToolListChanged();
|
|
183
|
-
return toCallToolResult(closed, closeContract);
|
|
184
|
-
}
|
|
185
|
-
if (permissionAuthority !== undefined) {
|
|
186
|
-
const authorized = await permissionAuthority.authorize({
|
|
187
|
-
capability: "snapshot_write",
|
|
188
|
-
roots: [parsed.snapshot_path],
|
|
189
|
-
executables: [],
|
|
190
|
-
environment_names: [],
|
|
191
|
-
network: "none",
|
|
192
|
-
mount: false,
|
|
193
|
-
operation_identity: `close_binary:snapshot:${parsed.snapshot_path}`,
|
|
194
|
-
}, "write");
|
|
195
|
-
if (!authorized.ok)
|
|
196
|
-
return toCallToolResult(permissionFailure(authorized), closeContract);
|
|
197
|
-
}
|
|
198
|
-
const snapshot = session.exportAnalysisSnapshot();
|
|
199
|
-
if (!snapshot.ok)
|
|
200
|
-
return toCallToolResult(snapshot, closeContract);
|
|
201
|
-
const written = await writeAnalysisSnapshot(snapshot.value, parsed.snapshot_path, parsed.overwrite, snapshotFilePolicy);
|
|
202
|
-
if (!written.ok)
|
|
203
|
-
return toCallToolResult(written, closeContract);
|
|
204
|
-
const closed = await logToolExecution(logger, closeContract.name, () => session.close());
|
|
205
|
-
if (closed.ok)
|
|
206
|
-
server.sendToolListChanged();
|
|
207
|
-
return closed.ok
|
|
208
|
-
? toCallToolResult(ok({
|
|
209
|
-
path: written.value.path,
|
|
210
|
-
bytes: written.value.bytes,
|
|
211
|
-
entries: snapshot.value.entries.length,
|
|
212
|
-
}), closeContract)
|
|
213
|
-
: toCallToolResult(closed, closeContract);
|
|
214
|
-
});
|
|
215
|
-
};
|
|
216
166
|
const registerRecordAndReplayTools = (server, session, logger) => {
|
|
217
167
|
registerUnknownTools({
|
|
218
168
|
server,
|
|
@@ -233,7 +183,11 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
|
|
|
233
183
|
contracts: [openContract, closeContract, statusContract],
|
|
234
184
|
snapshotFilePolicy: analysisSnapshotFilePolicy,
|
|
235
185
|
startedAt: options.startedAt ?? new Date().toISOString(),
|
|
236
|
-
availabilityPolicy: sessionAvailabilityPolicy(options.availabilityPolicy,
|
|
186
|
+
availabilityPolicy: sessionAvailabilityPolicy(options.availabilityPolicy, {
|
|
187
|
+
processPolicy,
|
|
188
|
+
evidenceFilePolicy,
|
|
189
|
+
investigationInputRoots: options.investigationInputRoots ?? [],
|
|
190
|
+
}),
|
|
237
191
|
...(options.permissionAuthority === undefined
|
|
238
192
|
? {}
|
|
239
193
|
: { permissionAuthority: options.permissionAuthority }),
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/** Select configured availability reporting or the target-free defaults. */
|
|
2
|
-
export const sessionAvailabilityPolicy = (configured,
|
|
2
|
+
export const sessionAvailabilityPolicy = (configured, defaults) => configured ??
|
|
3
3
|
(() => ({
|
|
4
|
-
processCaptureEnabled: processPolicy.enabled,
|
|
5
|
-
evidenceFileRoots: evidenceFilePolicy.roots.length,
|
|
6
|
-
investigationInputRoots: investigationInputRoots.length,
|
|
7
|
-
browserObservationEnabled: false,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
processCaptureEnabled: defaults.processPolicy.enabled,
|
|
5
|
+
evidenceFileRoots: defaults.evidenceFilePolicy.roots.length,
|
|
6
|
+
investigationInputRoots: defaults.investigationInputRoots.length,
|
|
7
|
+
browserObservationEnabled: defaults.optionalFeatures?.browserObservationEnabled ?? false,
|
|
8
|
+
browserScenarioEnabled: defaults.optionalFeatures?.browserScenarioEnabled ?? false,
|
|
9
|
+
electronObservationEnabled: defaults.optionalFeatures?.electronObservationEnabled ?? false,
|
|
10
|
+
v8InspectorObservationEnabled: defaults.optionalFeatures?.v8InspectorObservationEnabled ?? false,
|
|
11
|
+
javascriptReplayEnabled: defaults.optionalFeatures?.javascriptReplayEnabled ?? false,
|
|
12
|
+
managedRuntimeEnabled: defaults.optionalFeatures?.managedRuntimeEnabled ?? false,
|
|
11
13
|
}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rea-agents",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.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": {
|
|
@@ -80,25 +80,29 @@
|
|
|
80
80
|
"test": "vitest run",
|
|
81
81
|
"test:run": "vitest run",
|
|
82
82
|
"pretest:fast": "npm run build:cached",
|
|
83
|
-
"test:fast": "vitest run --project parallel",
|
|
83
|
+
"test:fast": "vitest run --project parallel --project subprocess",
|
|
84
|
+
"pretest:changed": "npm run build:cached",
|
|
85
|
+
"test:changed": "vitest run --project parallel --project subprocess --changed",
|
|
84
86
|
"pretest:integration": "npm run build:cached",
|
|
85
87
|
"test:integration": "vitest run --project serial-integration",
|
|
86
88
|
"pretest:coverage": "npm run build:cached",
|
|
87
89
|
"test:coverage": "vitest run --coverage.enabled --coverage.provider=v8",
|
|
88
90
|
"test:ci": "npm run test:coverage -- --reporter=default --reporter=junit --outputFile.junit=test-results.xml",
|
|
89
91
|
"pretest:ci:shard": "npm run build:cached",
|
|
90
|
-
"test:ci:shard": "
|
|
92
|
+
"test:ci:shard": "npm run test:ci:shard:run",
|
|
93
|
+
"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",
|
|
91
94
|
"test:ci:merge": "vitest --merge-reports --coverage.enabled --coverage.provider=v8 --reporter=default --reporter=junit --outputFile.junit=test-results.xml",
|
|
92
95
|
"pretest:verbose": "npm run build:cached",
|
|
93
96
|
"test:verbose": "vitest run --reporter=verbose",
|
|
94
97
|
"pretest:watch": "npm run build:cached",
|
|
95
|
-
"test:watch": "vitest --project parallel --changed",
|
|
98
|
+
"test:watch": "vitest --project parallel --project subprocess --changed",
|
|
96
99
|
"typecheck": "tsc --noEmit",
|
|
97
100
|
"verify:test-temp-hygiene": "npm run build:cached && node scripts/verify-test-temp-hygiene.mjs",
|
|
98
101
|
"verify:hopper": "npm run verify:fixtures && npm run build:cached && node scripts/verify-real-hopper.mjs",
|
|
99
102
|
"verify:ghidra": "npm run build:cached && node scripts/verify-real-ghidra.mjs",
|
|
100
103
|
"verify:ghidra:windows": "npm run build:cached && npm run build:ghidra-windows-fixture && node scripts/verify-real-ghidra-windows.mjs",
|
|
101
104
|
"verify:browser": "npm run build:cached && node scripts/verify-real-browser.mjs",
|
|
105
|
+
"verify:inspector": "npm run build:cached && node scripts/verify-real-javascript-runtime-observation.mjs",
|
|
102
106
|
"verify:javascript-runtime": "npm run build:cached && node scripts/verify-local-javascript-runtime.mjs",
|
|
103
107
|
"verify:application-workflows": "npm run build:cached && node scripts/verify-local-application-workflows.mjs",
|
|
104
108
|
"verify:managed": "npm run build:cached && node scripts/verify-managed-conformance.mjs",
|
|
@@ -109,6 +113,7 @@
|
|
|
109
113
|
"build:fixtures": "node scripts/build-conformance-fixtures.mjs",
|
|
110
114
|
"build:ghidra-windows-fixture": "node scripts/create-ghidra-windows-fixture.mjs",
|
|
111
115
|
"verify:fixtures": "npm run build:fixtures && node scripts/verify-conformance-fixtures.mjs",
|
|
116
|
+
"verify:readiness": "npm run build:cached && npm run verify:fixtures && node scripts/verify-reconstruction-readiness.mjs",
|
|
112
117
|
"verify:package": "npm run build:cached && node scripts/verify-package.mjs",
|
|
113
118
|
"verify:package:windows": "npm run build:cached && node scripts/verify-windows-package.mjs",
|
|
114
119
|
"probe:windows-capabilities": "npm run build:cached && node scripts/windows-capabilities.mjs",
|
|
@@ -139,8 +144,8 @@
|
|
|
139
144
|
"@electron/asar": "4.2.0",
|
|
140
145
|
"@jridgewell/trace-mapping": "0.3.31",
|
|
141
146
|
"@lydell/node-pty": "1.1.0",
|
|
142
|
-
"@modelcontextprotocol/server": "2.0.0-beta.4",
|
|
143
147
|
"@modelcontextprotocol/client": "2.0.0-beta.4",
|
|
148
|
+
"@modelcontextprotocol/server": "2.0.0-beta.4",
|
|
144
149
|
"@xterm/addon-serialize": "0.14.0",
|
|
145
150
|
"@xterm/headless": "6.0.0",
|
|
146
151
|
"@zip.js/zip.js": "2.8.26",
|
|
@@ -152,6 +157,7 @@
|
|
|
152
157
|
"incur": "0.4.13",
|
|
153
158
|
"isomorphic-git": "1.38.7",
|
|
154
159
|
"pino": "9.14.0",
|
|
160
|
+
"playwright-core": "1.58.2",
|
|
155
161
|
"plist": "5.0.0",
|
|
156
162
|
"semver": "7.8.5",
|
|
157
163
|
"smol-toml": "^1.7.0",
|
|
@@ -172,8 +178,8 @@
|
|
|
172
178
|
"lint-staged": "16.4.0",
|
|
173
179
|
"oxlint": "1.73.0",
|
|
174
180
|
"prettier": "3.6.2",
|
|
175
|
-
"typedoc": "0.28.20",
|
|
176
181
|
"turbo": "2.10.5",
|
|
182
|
+
"typedoc": "0.28.20",
|
|
177
183
|
"typescript": "5.9.3",
|
|
178
184
|
"vitest": "4.1.10"
|
|
179
185
|
}
|
|
@@ -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: 110
|
|
7
|
+
catalog_digest: "e8cac51f2f17a5b9a088c3ff773473c4897823401481fc0875a28fe7daf8eee0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# REA
|