summaryrefslogtreecommitdiff
path: root/makima/frontend/src/routes/document-directives.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'makima/frontend/src/routes/document-directives.tsx')
-rw-r--r--makima/frontend/src/routes/document-directives.tsx73
1 files changed, 73 insertions, 0 deletions
diff --git a/makima/frontend/src/routes/document-directives.tsx b/makima/frontend/src/routes/document-directives.tsx
index d442a41..ffd2a8b 100644
--- a/makima/frontend/src/routes/document-directives.tsx
+++ b/makima/frontend/src/routes/document-directives.tsx
@@ -18,6 +18,11 @@ import {
stopTask,
listDirectiveRevisions,
newDirectiveDraft,
+ createDirectivePR,
+ advanceDirective,
+ cleanupDirective,
+ pickUpOrders,
+ sendTaskMessage,
} from "../lib/api";
import type {
DirectiveStatus,
@@ -188,6 +193,10 @@ interface TaskContextMenuProps {
onComplete?: () => void;
onFail?: () => void;
onSkip?: () => void;
+ /** Send a freeform message to the running task (same wire as the inline comment box). */
+ onSendMessage?: () => void;
+ /** Navigate to the standalone task page for full-screen control. */
+ onOpenInTaskPage?: () => void;
}
function TaskContextMenu({
@@ -199,6 +208,8 @@ function TaskContextMenu({
onComplete,
onFail,
onSkip,
+ onSendMessage,
+ onOpenInTaskPage,
}: TaskContextMenuProps) {
const ref = useRef<HTMLDivElement>(null);
@@ -297,6 +308,34 @@ function TaskContextMenu({
Skip
</button>
)}
+
+ {/* Direct task-page actions: send-message and open-in-task-page mirror
+ what the standalone /exec/:taskId page exposes. */}
+ {(onSendMessage || onOpenInTaskPage) && <div className={divider} />}
+ {onSendMessage && (
+ <button
+ className={item}
+ onClick={() => {
+ onSendMessage();
+ onClose();
+ }}
+ >
+ <span className="text-cyan-300">⌨</span>
+ Send message
+ </button>
+ )}
+ {onOpenInTaskPage && (
+ <button
+ className={item}
+ onClick={() => {
+ onOpenInTaskPage();
+ onClose();
+ }}
+ >
+ <span className="text-[#75aafc]">↗</span>
+ Open in task page
+ </button>
+ )}
</div>
);
}
@@ -1188,6 +1227,22 @@ export default function DocumentDirectivesPage() {
// start typing the next iteration immediately.
navigate(`/directives/${contextMenu.directive.id}`);
}}
+ onCreatePR={async () => {
+ await createDirectivePR(contextMenu.directive.id);
+ await refreshList();
+ }}
+ onAdvance={async () => {
+ await advanceDirective(contextMenu.directive.id);
+ await refreshList();
+ }}
+ onCleanup={async () => {
+ await cleanupDirective(contextMenu.directive.id);
+ await refreshList();
+ }}
+ onPickUpOrders={async () => {
+ await pickUpOrders(contextMenu.directive.id);
+ await refreshList();
+ }}
/>
)}
{contextMenu?.kind === "task" && (
@@ -1229,6 +1284,24 @@ export default function DocumentDirectivesPage() {
);
await refreshList();
}}
+ onSendMessage={async () => {
+ // Browser prompt is the lightest-weight surface that doesn't
+ // require redesigning a modal. The same comment box is also
+ // available below the live transcript when the task is selected.
+ const message = window.prompt("Send message to task:");
+ if (!message || !message.trim()) return;
+ try {
+ await sendTaskMessage(contextMenu.task.taskId, message.trim());
+ } catch (err) {
+ // eslint-disable-next-line no-console
+ console.error("[makima] failed to send task message", err);
+ }
+ }}
+ onOpenInTaskPage={() => {
+ // The standalone /exec/:taskId page has the full task UI with
+ // worktree diff viewer, checkpoint controls, etc.
+ navigate(`/exec/${contextMenu.task.taskId}`);
+ }}
/>
)}
</div>