mirror of
https://github.com/morluto/rea.git
synced 2026-11-12 01:41:21 +00:00
inspect-python-pyc and inspect-erlang-beam took their max-* limits through Number(), so 0x10 meant 16 and 1e2 meant 100. Admit decimal text only through cliDecimalField, which now keeps the shared field's description for help.
82 lines
3.1 KiB
TypeScript
82 lines
3.1 KiB
TypeScript
import { z } from "incur";
|
|
import { localPathStringSchema } from "../domain/localPath.js";
|
|
import { absoluteCallerPath } from "../filesystem/callerPath.js";
|
|
import { createBeamService } from "../composition/erlang.js";
|
|
import { CLI_COMMANDS } from "../cliCommandNames.js";
|
|
import { logCliCommand } from "../cliLogging.js";
|
|
import type { Logger } from "pino";
|
|
import type { CliInstance } from "./types.js";
|
|
import { withCommandCancellation } from "./commandCancellation.js";
|
|
import { inspectErlangBeamInputSchema } from "../domain/erlang/beam.js";
|
|
import {
|
|
analysisEvidenceDeliveryOptions,
|
|
deliverCliAnalysisEvidence,
|
|
parseCliAnalysisEvidenceDelivery,
|
|
} from "./analysisEvidenceDelivery.js";
|
|
import { erlangBeamDeliverySchema } from "../domain/analysisView/erlangBeamView.js";
|
|
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
import { cliDecimalField } from "./options.js";
|
|
|
|
/** Inspect operator-selected BEAM files through the same shared workflow as MCP. */
|
|
export const registerErlangCommands = (
|
|
cli: CliInstance,
|
|
logger: Logger,
|
|
): void => {
|
|
cli.command(CLI_COMMANDS.inspectErlangBeam, {
|
|
description:
|
|
"Inspect Erlang BEAM atoms, exports, imports and Code header without executing bytecode",
|
|
args: z.object({
|
|
path: localPathStringSchema.describe("Local BEAM file"),
|
|
}),
|
|
options: z.object({
|
|
// Decimal tokens only, as for inspect-python-pyc.
|
|
maxFileBytes: cliDecimalField(
|
|
inspectErlangBeamInputSchema.shape.max_file_bytes,
|
|
),
|
|
maxChunks: cliDecimalField(inspectErlangBeamInputSchema.shape.max_chunks),
|
|
maxAtoms: cliDecimalField(inspectErlangBeamInputSchema.shape.max_atoms),
|
|
...analysisEvidenceDeliveryOptions,
|
|
view: z
|
|
.string()
|
|
.optional()
|
|
.describe(
|
|
"JSON beam view; requires --detail summary and --evidence_output",
|
|
),
|
|
}),
|
|
run: ({ args, options }) =>
|
|
withCommandCancellation((signal) =>
|
|
logCliCommand(logger, CLI_COMMANDS.inspectErlangBeam, async () => {
|
|
const delivery = parseCliAnalysisEvidenceDelivery(
|
|
"inspect_erlang_beam",
|
|
options,
|
|
erlangBeamDeliverySchema,
|
|
);
|
|
if (!delivery.ok) return projectAnalysisError(delivery.error);
|
|
const service = createBeamService();
|
|
return deliverCliAnalysisEvidence({
|
|
callerInputPath: args.path,
|
|
run: () =>
|
|
service.inspect(
|
|
{
|
|
path: absoluteCallerPath(args.path),
|
|
max_file_bytes: options.maxFileBytes,
|
|
max_chunks: options.maxChunks,
|
|
max_atoms: options.maxAtoms,
|
|
},
|
|
{ signal },
|
|
),
|
|
service,
|
|
providerId: "rea-erlang-beam",
|
|
operation: "inspect_erlang_beam",
|
|
signal,
|
|
detail: delivery.value.detail,
|
|
evidenceOutput: delivery.value.evidenceOutput,
|
|
...(delivery.value.view === undefined
|
|
? {}
|
|
: { view: delivery.value.view }),
|
|
});
|
|
}),
|
|
),
|
|
});
|
|
};
|