mirror of
https://github.com/morluto/rea.git
synced 2026-10-30 19:35:56 +00:00
Scope MCP discovery, setup, doctor, status and recovery guidance by selected tool families using one contract inventory and shared catalog identity. Preserve default discovery, canonical validation and complete Evidence. Fixes #3246. Builds on #3026. Real libcrypto workflow verifies all 5,367 exports and identical complete Evidence. Static/source/build/docs/Windows/package/Greptile checks pass; ten assertions reproduced identically on clean main and feature across Node 24/22, with cancelled coverage explicitly unverified. Merge uses the user-authorized bypass for baseline failures and unchecked human-readiness declarations, without attesting human review. Co-authored-by: 0xLLVEL <fakhrezan1@gmail.com> Co-authored-by: Codebuff <noreply@codebuff.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
45 lines
2.4 KiB
TypeScript
45 lines
2.4 KiB
TypeScript
import { toolFamilyId } from "../contracts/toolFamilies.js";
|
|
import { UNTRUSTED_CONTENT_INSTRUCTIONS } from "./toolResultEncoding.js";
|
|
import { recoveryInstructions } from "./recoveryInstructions.js";
|
|
|
|
const TARGET_FREE_INSTRUCTIONS =
|
|
"REA provides reverse-engineering tools for local artifacts, native binaries, managed code, browser pages, and runtimes. Use the tool that directly answers the question; discover targets or inspect inventory only when needed. Tool results include inline Evidence and report their coverage and limitations.";
|
|
|
|
// Only advertise the lifecycle when `session` is in scope: otherwise
|
|
// `open_binary` and `close_binary` are disabled and the guidance would direct
|
|
// initialization to a call that always fails.
|
|
const SESSION_LIFECYCLE_INSTRUCTIONS =
|
|
"An opened target persists across turns. When finished, export needed Evidence and call close_binary; its snapshot_path can retain analysis.";
|
|
|
|
const ACTIVE_TARGET_INSTRUCTIONS =
|
|
"REA analyzes the active reverse-engineering target. Use the analysis tool that answers the question directly. Search or list symbols when discovery is needed.";
|
|
|
|
// Only name the enhanced-family dossier tool when that family is in scope:
|
|
// otherwise `analyze_function` is disabled and the recommendation always fails.
|
|
const FUNCTION_DOSSIER_INSTRUCTIONS =
|
|
"analyze_function provides a function dossier, and focused procedure tools return individual facets.";
|
|
|
|
/** Whether the scope advertises the family that owns a named tool. */
|
|
const advertisesToolFamily = (
|
|
advertisedToolFamilies: ReadonlySet<string> | undefined,
|
|
tool: string,
|
|
): boolean => {
|
|
if (advertisedToolFamilies === undefined) return true;
|
|
const family = toolFamilyId(tool);
|
|
return family !== undefined && advertisedToolFamilies.has(family);
|
|
};
|
|
|
|
export const serverInstructions = (
|
|
hasSession: boolean,
|
|
advertisedToolFamilies: ReadonlySet<string> | undefined,
|
|
): string => {
|
|
const guidance = (tool: string, text: string): string =>
|
|
advertisesToolFamily(advertisedToolFamilies, tool) ? ` ${text}` : "";
|
|
const recovery = recoveryInstructions(
|
|
advertisesToolFamily(advertisedToolFamilies, "update_analysis_settings"),
|
|
);
|
|
if (!hasSession)
|
|
return `${ACTIVE_TARGET_INSTRUCTIONS}${guidance("analyze_function", FUNCTION_DOSSIER_INSTRUCTIONS)} ${recovery} ${UNTRUSTED_CONTENT_INSTRUCTIONS}`;
|
|
return `${TARGET_FREE_INSTRUCTIONS}${guidance("close_binary", SESSION_LIFECYCLE_INSTRUCTIONS)} ${recovery} ${UNTRUSTED_CONTENT_INSTRUCTIONS}`;
|
|
};
|