返回 DeepSeek-Reasonix
sessionActionOwner.ts
根目录 / desktop / frontend / src / app-runtime / sessionActionOwner.ts
1 import type { CollaborationMode, QuestionAnswer, ToolApprovalMode } from "../lib/types";
2 import type { InteractionTarget } from "../lib/interactionTarget";
3 export { interactionInstanceKey as sessionPromptInstanceKey } from "../lib/interactionTarget";
4 import type { SessionOperationAuthority } from "./useSessionOperations";
5
6 export type SessionPromptTarget = InteractionTarget;
7
8 export type PlanDecisionAction = "start_execution" | "revise_plan" | "exit_plan";
9 export type RecoveryAction = "continue" | "continue_task" | "revise" | "stop";
10 export type MCPInteractionAction = "accept" | "decline" | "cancel";
11
12
13 export type SessionActionPorts = {
14 approveForTab: (target: SessionPromptTarget, allow: boolean, session: boolean, persist: boolean) => void | Promise<void>;
15 resolvePlanForTab: (target: SessionPromptTarget, action: PlanDecisionAction) => void | Promise<void>;
16 resolveRecoveryForTab: (target: SessionPromptTarget, action: RecoveryAction, feedback: string) => void | Promise<void>;
17 answerQuestionForTab: (target: SessionPromptTarget, answers: QuestionAnswer[]) => Promise<void>;
18 answerMCPForTab: (target: SessionPromptTarget, action: MCPInteractionAction, content?: Record<string, unknown>) => void;
19 setCollaborationModeForTab: (tabId: string, mode: CollaborationMode) => Promise<void>;
20 clearGoalForTab: (tabId: string) => Promise<void>;
21 setRemoteComposerProfile: (
22 tabId: string,
23 mode: CollaborationMode,
24 approvalMode: ToolApprovalMode,
25 goal: string,
26 ) => Promise<string[]>;
27 patchComposerProfile: (tabId: string, mode: CollaborationMode) => void;
28 notePlanMode: (tabId: string, enabled: boolean) => void;
29 drainRemoteApprovals: (tabId: string, ids: string[]) => void;
30 };
31
32 export function submitApproval(
33 target: SessionPromptTarget,
34 input: { allow: boolean; session: boolean; persist: boolean },
35 ports: Pick<SessionActionPorts, "approveForTab">,
36 ): void | Promise<void> {
37 return ports.approveForTab(target, input.allow, input.session, input.persist);
38 }
39
40 export async function submitPlanDecision(
41 target: SessionPromptTarget,
42 input: {
43 action: PlanDecisionAction;
44 leavePlanMode: boolean;
45 remote: boolean;
46 goal: string;
47 toolApprovalMode: ToolApprovalMode;
48 },
49 ports: SessionActionPorts,
50 authority: SessionOperationAuthority,
51 ): Promise<void> {
52 authority.checkpoint();
53 if (input.leavePlanMode) {
54 if (input.remote) {
55 const drained = await ports.setRemoteComposerProfile(target.tabId, "normal", input.toolApprovalMode, "");
56 authority.checkpoint();
57 if (authority.ownsUI()) ports.drainRemoteApprovals(target.tabId, drained);
58 } else {
59 if (input.goal.trim()) {
60 await ports.clearGoalForTab(target.tabId);
61 authority.checkpoint();
62 }
63 await ports.setCollaborationModeForTab(target.tabId, "normal");
64 authority.checkpoint();
65 }
66 ports.notePlanMode(target.tabId, false);
67 ports.patchComposerProfile(target.tabId, "normal");
68 }
69 authority.checkpoint();
70 await ports.resolvePlanForTab(target, input.action);
71 }
72
73 export function submitRecovery(
74 target: SessionPromptTarget,
75 action: RecoveryAction,
76 feedback: string,
77 ports: Pick<SessionActionPorts, "resolveRecoveryForTab">,
78 ): void | Promise<void> {
79 return ports.resolveRecoveryForTab(target, action, feedback);
80 }
81
82 export function submitQuestion(
83 target: SessionPromptTarget,
84 answers: QuestionAnswer[],
85 ports: Pick<SessionActionPorts, "answerQuestionForTab">,
86 ): Promise<void> {
87 return ports.answerQuestionForTab(target, answers);
88 }
89
90 export function submitMCPInteraction(
91 target: SessionPromptTarget,
92 action: MCPInteractionAction,
93 content: Record<string, unknown> | undefined,
94 ports: Pick<SessionActionPorts, "answerMCPForTab">,
95 ): void {
96 ports.answerMCPForTab(target, action, content);
97 }
98
98 lines TYPESCRIPT