diff options
Diffstat (limited to 'makima/frontend/src/routes/document-directives.tsx')
| -rw-r--r-- | makima/frontend/src/routes/document-directives.tsx | 73 |
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> |
