singularity-forge/web/lib/workflow-action-execution.ts
2026-05-05 14:31:16 +02:00

59 lines
1.6 KiB
TypeScript

import type { WorkspaceTerminalLine } from "./sf-workspace-store";
import { getUserMode } from "./use-user-mode";
export type SFViewName =
| "dashboard"
| "power"
| "chat"
| "roadmap"
| "files"
| "activity"
| "visualize";
export function navigateToSFView(view: SFViewName): void {
if (typeof window === "undefined") return;
window.dispatchEvent(
new CustomEvent("sf:navigate-view", { detail: { view } }),
);
}
/**
* Dispatch a workflow action command through the session command pipeline
* and navigate to the Power User Mode view.
*
* `dispatch` should be a function that sends the command through the workspace
* store (e.g. `sendCommand(buildPromptCommand(command, bridge))`), so the
* command is processed by the agent session — not just injected as raw PTY
* keystrokes.
*/
export function executeWorkflowActionInPowerMode({
dispatch,
}: {
dispatch: () => Promise<unknown>;
}): void {
dispatch().catch((error) => {
console.error("[workflow-action] dispatch failed:", error);
});
const mode = getUserMode();
navigateToSFView(mode === "vibe-coder" ? "chat" : "power");
}
export function derivePendingWorkflowCommandLabel({
commandInFlight,
terminalLines,
}: {
commandInFlight: string | null;
terminalLines: WorkspaceTerminalLine[];
}): string | null {
if (!commandInFlight) return null;
for (let index = terminalLines.length - 1; index >= 0; index -= 1) {
const line = terminalLines[index];
if (line.type !== "input") continue;
const text = line.content.trim();
if (text) return text;
}
if (commandInFlight === "prompt") return "Sending command";
return `/${commandInFlight}`;
}