Skip to content
Source
Sign inSign up
Open History to see the last commit

threadDetailsItems.ts

64 lines2.8 KB

1import type { ClientSettings } from "@t3tools/contracts";
2​
3// Ids are stored in client settings, so never rename one.
4export const THREAD_DETAILS_ITEMS = [
5 { id: "environment", label: "Environment and worktree", defaultVisible: true },
6 { id: "openIn", label: "Open in editor", defaultVisible: true },
7 { id: "scripts", label: "Project scripts", defaultVisible: true },
8 { id: "branch", label: "Branch and pull request", defaultVisible: true },
9 { id: "gitActions", label: "Git actions", defaultVisible: true },
10 { id: "changes", label: "Changes", defaultVisible: true },
11 { id: "servers", label: "Servers", defaultVisible: true },
12 { id: "automations", label: "Automations", defaultVisible: true },
13 { id: "lineage", label: "Lineage", defaultVisible: true },
14 { id: "sideChats", label: "Side chats", defaultVisible: true },
15 { id: "usage", label: "Usage limits", defaultVisible: false },
16 { id: "context", label: "Context window", defaultVisible: false },
17] as const;
18​
19export type ThreadDetailsItemId = (typeof THREAD_DETAILS_ITEMS)[number]["id"];
20export type ThreadDetailsVisibility = Readonly<Record<ThreadDetailsItemId, boolean>>;
21​
22type ThreadDetailsItem = (typeof THREAD_DETAILS_ITEMS)[number];
23type ThreadDetailsItemSettings = Pick<
24 ClientSettings,
25 "threadDetailsItems" | "threadDetailsUsageEnabled"
26>;
27​
28// People who turned on the retired Labs toggle keep Usage and Context until they change them here.
29function defaultVisible(item: ThreadDetailsItem, settings: ThreadDetailsItemSettings) {
30 return item.id === "usage" || item.id === "context"
31 ? settings.threadDetailsUsageEnabled
32 : item.defaultVisible;
34​
35export function resolveThreadDetailsVisibility(
36 settings: ThreadDetailsItemSettings,
37): ThreadDetailsVisibility {
38 return Object.fromEntries(
39 THREAD_DETAILS_ITEMS.map((item) => [
40 item.id,
41 settings.threadDetailsItems[item.id] ?? defaultVisible(item, settings),
42 ]),
43 ) as Record<ThreadDetailsItemId, boolean>;
45​
46/** Stores only choices that differ from the default, so a later default change reaches everyone else. */
47export function setThreadDetailsItem(
48 settings: ThreadDetailsItemSettings,
49 item: ThreadDetailsItem,
50 visible: boolean,
51): ClientSettings["threadDetailsItems"] {
52 const { [item.id]: _previous, ...rest } = settings.threadDetailsItems;
53 return visible === defaultVisible(item, settings) ? rest : { ...rest, [item.id]: visible };
55​
56export function isDefaultThreadDetailsVisibility(visibility: ThreadDetailsVisibility) {
57 return THREAD_DETAILS_ITEMS.every((item) => visibility[item.id] === item.defaultVisible);
59​
60/** Also clears the retired Labs flag, so Usage and Context return to off. */
61export const RESET_THREAD_DETAILS_ITEMS = {
62 threadDetailsItems: {},
63 threadDetailsUsageEnabled: false,
64} satisfies Partial<ClientSettings>;