mirror of
https://github.com/morluto/rea.git
synced 2026-10-26 17:35:11 +00:00
* feat(native): inspect offline ELF layout through pwntools * fix(build): prepare offline ELF verification on clean runners * fix(native): preserve snapshot acquisition cancellation * fix(native): handle sectionless ELF and retain decoder diagnostics * test(native): verify malformed symbol table entry sizes * fix(native): respect inherited limits and unused segment fields * fix(native): preserve packed relocations and decoder launch constraints * fix(native): validate symbol spans and preserve resource failures * fix(native): preserve diagnostic completeness and memory failures * fix(native): guard bridge imports against allocation failures * fix(native): validate relocation symbol and section references * fix(native): retain diagnostics through compounded cleanup failures * fix(native): preserve unresolved relocation section references * fix(native): bound linkage evidence and preserve CPU signal diagnostics * fix(native): preserve file-size resource failure evidence * fix(native): retain opaque linkage names and late cancellation output * test(native): make CPU-limit fixture robust across runners * fix(native): verify resource failure branches before interpreting exits * fix(native): validate declared ELF string references * fix(native): validate section-name table before decoding * fix(native): enforce canonical ELF name-table escapes
73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
import type { CallToolResult } from "@modelcontextprotocol/server";
|
|
|
|
import type { ToolContract } from "../contracts/toolContracts.js";
|
|
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
import { type AnalysisError } from "../domain/analysisErrorBase.js";
|
|
import type { JsonValue } from "../domain/jsonValue.js";
|
|
import type { Result } from "../domain/result.js";
|
|
|
|
/**
|
|
* Serialize an application result as MCP text and structured content.
|
|
* Shared error projection preserves actionable local diagnostics while omitting
|
|
* raw cause objects; explicitly retained bounded command output stays visible.
|
|
*/
|
|
export const toCallToolResult = (
|
|
result: Result<JsonValue, AnalysisError>,
|
|
contract: ToolContract,
|
|
): CallToolResult =>
|
|
result.ok ? successResult(result.value, contract) : errorResult(result.error);
|
|
|
|
const errorResult = (error: AnalysisError): CallToolResult => {
|
|
const projected = projectAnalysisError(error);
|
|
const structuredContent = { error: projected };
|
|
return {
|
|
content: [
|
|
{
|
|
type: "text",
|
|
text: JSON.stringify(structuredContent),
|
|
},
|
|
],
|
|
structuredContent,
|
|
isError: true,
|
|
};
|
|
};
|
|
|
|
const successResult = (
|
|
value: JsonValue,
|
|
contract: ToolContract,
|
|
): CallToolResult => {
|
|
const candidate =
|
|
projectEvidence(value) ??
|
|
(contract.kind === "session" ? { result: value } : value);
|
|
return {
|
|
content: [
|
|
{
|
|
type: "text",
|
|
text: JSON.stringify(candidate),
|
|
},
|
|
],
|
|
structuredContent: candidate,
|
|
};
|
|
};
|
|
|
|
const projectEvidence = (value: JsonValue): JsonValue | undefined => {
|
|
if (
|
|
typeof value !== "object" ||
|
|
value === null ||
|
|
Array.isArray(value) ||
|
|
typeof value.evidence_id !== "string" ||
|
|
!/^ev_[a-f0-9]{64}$/u.test(value.evidence_id) ||
|
|
!("normalized_result" in value)
|
|
)
|
|
return undefined;
|
|
const normalizedResult = value.normalized_result;
|
|
const evidenceId = value.evidence_id;
|
|
if (normalizedResult === undefined || typeof evidenceId !== "string")
|
|
return undefined;
|
|
return {
|
|
result: normalizedResult,
|
|
evidence_id: evidenceId,
|
|
evidence: value,
|
|
};
|
|
};
|