File size: 1,673 Bytes
06671aa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
/**
 * Canonical assistant requested-mode ownership.
 *
 * Source of truth for the `requested_mode` chat request field. During
 * migration `documentMode.ts` may re-export these symbols for legacy
 * callers; assistant routes must import them from here.
 */

export type RequestedAssistantMode =
    | "auto"
    | "answer"
    | "comments"
    | "document_edit"
    | "workflow_review"
    | "document_generation"
    | "web_search";

export const REQUESTED_ASSISTANT_MODES: readonly RequestedAssistantMode[] = [
    "auto",
    "answer",
    "comments",
    "document_edit",
    "workflow_review",
    "document_generation",
    "web_search",
];

/**
 * Validate an untrusted `requested_mode` request field. Throws a tagged error
 * whose message contains `invalid_requested_mode` so routes can translate it to
 * an HTTP 400 before any model/provider/tool/storage/database side effect.
 *
 * Preserves legacy behavior:
 * - missing, null, or empty returns "auto";
 * - any non-matching value throws a tagged error.
 */
export function parseRequestedAssistantMode(
    value: unknown,
): RequestedAssistantMode {
    if (value === undefined || value === null || value === "") return "auto";
    if (
        typeof value === "string" &&
        (REQUESTED_ASSISTANT_MODES as readonly string[]).includes(value)
    ) {
        return value as RequestedAssistantMode;
    }
    throw new Error(`invalid_requested_mode: ${String(value)}`);
}

export function isRequestedAssistantMode(
    value: unknown,
): value is RequestedAssistantMode {
    return (
        typeof value === "string" &&
        (REQUESTED_ASSISTANT_MODES as readonly string[]).includes(value)
    );
}