fix(bridge): resolve missing Discord embed bodies by extracting detailed RPC payload from step_probe
This commit is contained in:
@@ -102,6 +102,36 @@ export function resetPendingStateForReconnect(): void {
|
||||
|
||||
// handleDiffReviewResponse → moved to ./approval-handler.ts
|
||||
|
||||
export function formatStepProbeCommand(toolName: string, actualIndex: number, stepType: string, toolCall: any): { cmd: string, desc: string, isSafe: boolean } {
|
||||
let cmd = toolName;
|
||||
let desc = `Step #${actualIndex} (${stepType.replace('CORTEX_STEP_TYPE_', '')})`;
|
||||
let isSafe = false;
|
||||
if (toolCall?.argumentsJson) {
|
||||
try {
|
||||
const args = JSON.parse(toolCall.argumentsJson);
|
||||
isSafe = args.SafeToAutoRun === true;
|
||||
if (args.CommandLine) {
|
||||
cmd = toolName;
|
||||
desc = args.CommandLine;
|
||||
} else if (args.TargetFile) {
|
||||
cmd = `${toolName}: ${args.TargetFile.split(/[\\/]/).pop()}`;
|
||||
if (args.CodeContent) desc = args.CodeContent;
|
||||
else if (args.ReplacementChunks) desc = JSON.stringify(args.ReplacementChunks, null, 2);
|
||||
else desc = toolCall.argumentsJson;
|
||||
} else {
|
||||
const val = args.DirectoryPath || args.SearchPath || args.AbsolutePath || args.Url || args.Query || args.Prompt || Object.values(args).find((v: any) => typeof v === 'string' && v.length > 2);
|
||||
if (val) {
|
||||
cmd = toolName;
|
||||
desc = String(val);
|
||||
} else {
|
||||
cmd = `${toolName}: ${Object.keys(args).join(', ')}`;
|
||||
}
|
||||
}
|
||||
} catch { }
|
||||
}
|
||||
return { cmd, desc, isSafe };
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a registration file for the Bot to discover session → project mapping.
|
||||
* Called automatically on first step event per session.
|
||||
@@ -481,20 +511,8 @@ function setupMonitor() {
|
||||
if (oStep?.status === 'CORTEX_STEP_STATUS_WAITING') {
|
||||
const toolCall = oStep?.metadata?.toolCall;
|
||||
const toolName = toolCall?.name || (oStep.type || '').replace('CORTEX_STEP_TYPE_', '').toLowerCase();
|
||||
let command = toolName;
|
||||
if (toolCall?.argumentsJson) {
|
||||
try {
|
||||
const args = JSON.parse(toolCall.argumentsJson);
|
||||
if (args.CommandLine) command = `${toolName}: ${args.CommandLine.substring(0, 1500)}`;
|
||||
else if (args.TargetFile) command = `${toolName}: ${args.TargetFile}`;
|
||||
else {
|
||||
// Show first meaningful value (path, query, etc.)
|
||||
const val = args.DirectoryPath || args.SearchPath || args.AbsolutePath || args.Url || args.Query || args.Prompt || Object.values(args).find((v: any) => typeof v === 'string' && v.length > 2);
|
||||
command = val ? `${toolName}: ${String(val).substring(0, 500)}` : `${toolName}: ${Object.keys(args).join(', ')}`;
|
||||
}
|
||||
} catch { command = toolName; }
|
||||
}
|
||||
const actualIndex = offset + osi;
|
||||
const { cmd: command, desc: detailedDescription, isSafe: isSafeToAutoRun } = formatStepProbeCommand(toolName, actualIndex, oStep.type || '', toolCall);
|
||||
ctx.logToFile(`[STEP-PROBE] ★ WAITING (via offset)! step=${actualIndex} type=${oStep.type} cmd='${command}'`);
|
||||
if (actualIndex !== ctx.lastPendingStepIndex) {
|
||||
ctx.stallProbed = true;
|
||||
@@ -512,13 +530,14 @@ function setupMonitor() {
|
||||
writePendingApproval({
|
||||
conversation_id: ctx.activeSessionId,
|
||||
command,
|
||||
description: `Step #${actualIndex} (${(oStep.type || '').replace('CORTEX_STEP_TYPE_', '')})`,
|
||||
description: detailedDescription,
|
||||
step_type: ['view_file', 'list_dir', 'find_by_name', 'read_file', 'grep_search'].includes(toolName) ? 'file_permission'
|
||||
: ['write_to_file', 'replace_file_content', 'multi_replace_file_content'].includes(toolName) ? 'code_edit'
|
||||
: ['browser_subagent', 'open_browser_url'].includes(toolName) ? 'browser_subagent'
|
||||
: toolName,
|
||||
step_index: actualIndex,
|
||||
source: 'step_probe_offset',
|
||||
safe_to_auto_run: isSafeToAutoRun,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -543,27 +562,9 @@ function setupMonitor() {
|
||||
// Extract command from metadata.toolCall or direct fields
|
||||
const toolCall = step?.metadata?.toolCall;
|
||||
const toolName = toolCall?.name || stepType.replace('CORTEX_STEP_TYPE_', '').toLowerCase();
|
||||
let command = toolName;
|
||||
|
||||
let isSafeToAutoRun = false;
|
||||
const { cmd: command, desc: description, isSafe: isSafeToAutoRun } = formatStepProbeCommand(toolName, si, stepType, toolCall);
|
||||
|
||||
// Parse argumentsJson for command details
|
||||
if (toolCall?.argumentsJson) {
|
||||
try {
|
||||
const args = JSON.parse(toolCall.argumentsJson);
|
||||
isSafeToAutoRun = args.SafeToAutoRun === true;
|
||||
if (args.CommandLine) {
|
||||
command = `${toolName}: ${args.CommandLine.substring(0, 1500)}`;
|
||||
} else if (args.TargetFile) {
|
||||
command = `${toolName}: ${args.TargetFile}`;
|
||||
} else {
|
||||
const val = args.DirectoryPath || args.SearchPath || args.AbsolutePath || args.Url || args.Query || args.Prompt || Object.values(args).find((v: any) => typeof v === 'string' && v.length > 2);
|
||||
command = val ? `${toolName}: ${String(val).substring(0, 500)}` : `${toolName}: ${Object.keys(args).join(', ')}`;
|
||||
}
|
||||
} catch { command = toolName; }
|
||||
}
|
||||
|
||||
const description = `Step #${si} (${stepType.replace('CORTEX_STEP_TYPE_', '')})`;
|
||||
ctx.logToFile(`[STEP-PROBE] ★ WAITING! step=${si} type=${stepType} cmd='${command}'`);
|
||||
|
||||
if (si !== ctx.lastPendingStepIndex) {
|
||||
@@ -629,21 +630,8 @@ function setupMonitor() {
|
||||
foundWaitingInOffset = true;
|
||||
const toolCall = oStep?.metadata?.toolCall;
|
||||
const toolName = toolCall?.name || (oStep.type || '').replace('CORTEX_STEP_TYPE_', '').toLowerCase();
|
||||
let command = toolName;
|
||||
let isSafeToAutoRun = false;
|
||||
if (toolCall?.argumentsJson) {
|
||||
try {
|
||||
const args = JSON.parse(toolCall.argumentsJson);
|
||||
isSafeToAutoRun = args.SafeToAutoRun === true;
|
||||
if (args.CommandLine) command = `${toolName}: ${args.CommandLine.substring(0, 1500)}`;
|
||||
else if (args.TargetFile) command = `${toolName}: ${args.TargetFile}`;
|
||||
else {
|
||||
const val = args.DirectoryPath || args.SearchPath || args.AbsolutePath || args.Url || args.Query || args.Prompt || Object.values(args).find((v: any) => typeof v === 'string' && v.length > 2);
|
||||
command = val ? `${toolName}: ${String(val).substring(0, 500)}` : `${toolName}: ${Object.keys(args).join(', ')}`;
|
||||
}
|
||||
} catch { command = toolName; }
|
||||
}
|
||||
const actualIndex = utf8Offset + osi;
|
||||
const { cmd: command, desc: detailedDescription, isSafe: isSafeToAutoRun } = formatStepProbeCommand(toolName, actualIndex, oStep.type || '', toolCall);
|
||||
ctx.logToFile(`[STEP-PROBE] ★ WAITING (via UTF-8 offset)! step=${actualIndex} type=${oStep.type} cmd='${command}'`);
|
||||
if (actualIndex !== ctx.lastPendingStepIndex) {
|
||||
ctx.stallProbed = true;
|
||||
@@ -654,7 +642,7 @@ function setupMonitor() {
|
||||
writePendingApproval({
|
||||
conversation_id: ctx.activeSessionId,
|
||||
command,
|
||||
description: `Step #${actualIndex} (${(oStep.type || '').replace('CORTEX_STEP_TYPE_', '')})`,
|
||||
description: detailedDescription,
|
||||
step_type: ['view_file', 'list_dir', 'find_by_name', 'read_file', 'grep_search'].includes(toolName) ? 'file_permission'
|
||||
: ['write_to_file', 'replace_file_content', 'multi_replace_file_content'].includes(toolName) ? 'code_edit'
|
||||
: ['browser_subagent', 'open_browser_url'].includes(toolName) ? 'browser_subagent'
|
||||
|
||||
Reference in New Issue
Block a user