Repository navigation
Expand file tree
/
Copy pathchatThreadActions.ts
More file actions
95 lines (85 loc) · 2.69 KB
/
Copy pathchatThreadActions.ts
File metadata and controls
95 lines (85 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import { scopeProjectRef } from "@t3tools/client-runtime/environment";
import type {
EnvironmentId,
ModelSelection,
ProjectId,
ScopedProjectRef,
} from "@t3tools/contracts";
import type { ComposerThreadDraftState, DraftThreadEnvMode } from "../composerDraftStore";
type ComposerModelSelectionState = Pick<
ComposerThreadDraftState,
"activeProvider" | "modelSelectionByProvider" | "modelSelectionExplicit"
>;
interface ThreadContextLike {
environmentId: EnvironmentId;
projectId: ProjectId;
}
interface NewThreadHandler {
(
projectRef: ScopedProjectRef,
options?: {
branch?: string | null;
worktreePath?: string | null;
envMode?: DraftThreadEnvMode;
startFromOrigin?: boolean;
},
): Promise<unknown>;
}
export interface ChatThreadActionContext {
readonly activeDraftThread: ThreadContextLike | null;
readonly activeThread: ThreadContextLike | undefined;
readonly defaultProjectRef: ScopedProjectRef | null;
readonly handleNewThread: NewThreadHandler;
}
export function resolveNewDraftStartFromOrigin(input: {
envMode: DraftThreadEnvMode;
newWorktreesStartFromOrigin: boolean;
}): boolean {
return input.envMode === "worktree" && input.newWorktreesStartFromOrigin;
}
export function resolveNewThreadModelSelectionOverride(input: {
readonly projectDefaultSelection: ModelSelection | null;
readonly carrySelection: ModelSelection | null;
readonly carrySourceDraftId: string | null;
readonly destinationDraftId: string;
}): ModelSelection | null {
return (
input.projectDefaultSelection ??
(input.carrySourceDraftId === input.destinationDraftId ? null : input.carrySelection)
);
}
export function hasExplicitComposerModelSelection(
draft: ComposerModelSelectionState | null | undefined,
): boolean {
const activeProvider = draft?.activeProvider;
return (
draft?.modelSelectionExplicit === true &&
activeProvider !== null &&
activeProvider !== undefined &&
draft.modelSelectionByProvider[activeProvider] !== undefined
);
}
export function resolveThreadActionProjectRef(
context: ChatThreadActionContext,
): ScopedProjectRef | null {
if (context.activeThread) {
return scopeProjectRef(context.activeThread.environmentId, context.activeThread.projectId);
}
if (context.activeDraftThread) {
return scopeProjectRef(
context.activeDraftThread.environmentId,
context.activeDraftThread.projectId,
);
}
return context.defaultProjectRef;
}
export async function startNewThreadFromContext(
context: ChatThreadActionContext,
): Promise<boolean> {
const projectRef = resolveThreadActionProjectRef(context);
if (!projectRef) {
return false;
}
await context.handleNewThread(projectRef);
return true;
}