Implement key sequence execution for tab instructions
Execute the tab instruction flow: - Navigate to target option using arrow keys - Send Tab to enter instruction mode - Type the instruction text - Send Enter to submit The sequence runs asynchronously with proper delays between steps (50ms between arrows, 100ms before Tab, 100ms before instruction).
This commit is contained in:
parent
727f3e0e18
commit
acd75b0303
1 changed files with 61 additions and 5 deletions
|
|
@ -165,12 +165,68 @@ const server = Bun.serve<SessionData>({
|
||||||
} else if (answer.type === "text") {
|
} else if (answer.type === "text") {
|
||||||
inputData = `${answer.value}\n`;
|
inputData = `${answer.value}\n`;
|
||||||
} else if (answer.type === "tab_instructions") {
|
} else if (answer.type === "tab_instructions") {
|
||||||
// TODO: Implement proper key sequence handling for tab instructions
|
// Execute key sequence for tab instructions with delays:
|
||||||
// For now, just send the selected option number
|
// 1. Navigate to selected_option (up/down arrows)
|
||||||
inputData = `${answer.selected_option}\n`;
|
// 2. Wait 100ms
|
||||||
console.debug(
|
// 3. Send Tab key
|
||||||
`TODO: tab_instructions needs key sequence implementation - instruction: "${answer.instruction}"`,
|
// 4. Wait 100ms
|
||||||
|
// 5. Write instruction text
|
||||||
|
// 6. Send Enter key
|
||||||
|
|
||||||
|
const promptData = prompt.prompt_json;
|
||||||
|
if (!promptData || promptData.prompt_type !== "permission") {
|
||||||
|
return new Response("Tab instructions only valid for permission prompts", { status: 400 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentOption = promptData.selected_option;
|
||||||
|
const targetOption = answer.selected_option;
|
||||||
|
|
||||||
|
// Mark as responded in DB first
|
||||||
|
respondToPrompt(
|
||||||
|
promptId,
|
||||||
|
`tab:${answer.selected_option}`,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Broadcast to dashboards
|
||||||
|
broadcastSSE({
|
||||||
|
type: "prompt_response",
|
||||||
|
prompt_id: promptId,
|
||||||
|
response: answer.selected_option === 1 ? "approve" : "reject",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get WebSocket for async execution
|
||||||
|
const ws = sessionWebSockets.get(prompt.session_id);
|
||||||
|
if (!ws) {
|
||||||
|
return new Response("Session WebSocket not found", { status: 404 });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute key sequence asynchronously with delays
|
||||||
|
(async () => {
|
||||||
|
const sendInput = (data: string) => {
|
||||||
|
const message: ServerMessage = { type: "input", data };
|
||||||
|
ws.send(JSON.stringify(message));
|
||||||
|
};
|
||||||
|
|
||||||
|
// Navigate to target option
|
||||||
|
const diff = targetOption - currentOption;
|
||||||
|
const arrow = diff > 0 ? '\x1b[B' : '\x1b[A';
|
||||||
|
for (let i = 0; i < Math.abs(diff); i++) {
|
||||||
|
sendInput(arrow);
|
||||||
|
await Bun.sleep(50); // Small delay between arrows
|
||||||
|
}
|
||||||
|
|
||||||
|
await Bun.sleep(100);
|
||||||
|
sendInput('\t'); // Tab key
|
||||||
|
|
||||||
|
await Bun.sleep(100);
|
||||||
|
sendInput(answer.instruction); // Instruction text
|
||||||
|
sendInput('\n'); // Enter key
|
||||||
|
})().catch((err) => {
|
||||||
|
console.error("Error executing tab instruction sequence:", err);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Return immediately (async execution continues in background)
|
||||||
|
return Response.json({ success: true });
|
||||||
} else {
|
} else {
|
||||||
return new Response("Invalid response type", { status: 400 });
|
return new Response("Invalid response type", { status: 400 });
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue