Skip to content

Commit 377d9ec

Browse files
ComputelessComputerComputelessComputer
authored andcommitted
fix: add clean personalization settings flow
Surface chat personalization in Settings, wire the stored values into the chat system prompt, and rename the remaining meeting-note and pricing copy.
1 parent ea60631 commit 377d9ec

16 files changed

Lines changed: 482 additions & 47 deletions

File tree

apps/desktop/src/ai/prompts/details.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export function PromptDetailsColumn({
2323
return (
2424
<div className="flex h-full items-center justify-center">
2525
<p className="text-sm text-neutral-500">
26-
Select a task type to view or customize its prompt
26+
Select a meeting-note task to view or customize its instructions
2727
</p>
2828
</div>
2929
);
@@ -163,7 +163,7 @@ function PromptDetails({ selectedTask }: { selectedTask: TaskType }) {
163163
<PromptEditor
164164
value={localValue}
165165
onChange={setLocalValue}
166-
placeholder="Enter your custom prompt template using Jinja2 syntax..."
166+
placeholder="Enter custom meeting-note instructions using Jinja2 syntax..."
167167
variables={variables as string[]}
168168
filters={[...AVAILABLE_FILTERS]}
169169
/>

apps/desktop/src/ai/prompts/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const TabItemPrompt: TabItem<Extract<Tab, { type: "prompts" }>> = ({
2828
return (
2929
<TabItemBase
3030
icon={<SparklesIcon className="h-4 w-4" />}
31-
title={"Prompts"}
31+
title={"Meeting Notes"}
3232
selected={tab.active}
3333
pinned={tab.pinned}
3434
tabIndex={tabIndex}

apps/desktop/src/ai/prompts/list.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export function PromptsListColumn({
1515
return (
1616
<div className="flex h-full w-full flex-col">
1717
<div className="flex h-12 items-center justify-between border-b border-neutral-200 py-2 pr-1 pl-3">
18-
<h3 className="text-sm font-medium">Custom Prompts</h3>
18+
<h3 className="text-sm font-medium">Meeting Notes</h3>
1919
</div>
2020

2121
<div className="flex-1 overflow-y-auto">

apps/desktop/src/chat/transport/use-transport.ts

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
import { useQuery } from "@tanstack/react-query";
12
import type { LanguageModel, ToolSet } from "ai";
2-
import { useEffect, useMemo, useState } from "react";
3+
import { useMemo } from "react";
34

45
import { commands as templateCommands } from "@hypr/plugin-template";
56

@@ -10,6 +11,7 @@ import { useLanguageModel } from "~/ai/hooks";
1011
import type { ContextRef } from "~/chat/context/entities";
1112
import { hydrateSessionContextFromFs } from "~/chat/context/session-context-hydrator";
1213
import { useToolRegistry } from "~/contexts/tool";
14+
import { useConfigValues } from "~/shared/config";
1315
import * as main from "~/store/tinybase/store/main";
1416

1517
function renderHumanContext(
@@ -82,49 +84,59 @@ export function useTransport(
8284
const registry = useToolRegistry();
8385
const configuredModel = useLanguageModel("chat");
8486
const model = modelOverride ?? configuredModel;
85-
const language = main.UI.useValue("ai_language", main.STORE_ID) ?? "en";
86-
const [systemPrompt, setSystemPrompt] = useState<string | undefined>();
87-
88-
useEffect(() => {
89-
if (systemPromptOverride) {
90-
setSystemPrompt(systemPromptOverride);
91-
return;
92-
}
93-
94-
let stale = false;
95-
96-
templateCommands
97-
.render({
87+
const {
88+
ai_language: language,
89+
chat_style_tone: styleTone,
90+
chat_warmth: warmth,
91+
chat_enthusiasm: enthusiasm,
92+
chat_headers_lists: headersLists,
93+
chat_emoji: emoji,
94+
chat_custom_instructions: customInstructions,
95+
} = useConfigValues([
96+
"ai_language",
97+
"chat_style_tone",
98+
"chat_warmth",
99+
"chat_enthusiasm",
100+
"chat_headers_lists",
101+
"chat_emoji",
102+
"chat_custom_instructions",
103+
] as const);
104+
const normalizedCustomInstructions = customInstructions.trim();
105+
106+
const systemPromptQuery = useQuery({
107+
queryKey: [
108+
"chat-system-prompt",
109+
language,
110+
styleTone,
111+
warmth,
112+
enthusiasm,
113+
headersLists,
114+
emoji,
115+
normalizedCustomInstructions,
116+
],
117+
enabled: systemPromptOverride === undefined,
118+
staleTime: Infinity,
119+
queryFn: async () => {
120+
const result = await templateCommands.render({
98121
chatSystem: {
99122
language,
123+
styleTone,
124+
warmth,
125+
enthusiasm,
126+
headersLists,
127+
emoji,
128+
customInstructions: normalizedCustomInstructions,
100129
},
101-
})
102-
.then((result) => {
103-
if (stale) {
104-
return;
105-
}
106-
107-
if (result.status === "ok") {
108-
setSystemPrompt(result.data);
109-
} else {
110-
setSystemPrompt("");
111-
}
112-
})
113-
.catch((error) => {
114-
console.error(error);
115-
if (!stale) {
116-
setSystemPrompt("");
117-
}
118130
});
119131

120-
return () => {
121-
stale = true;
122-
};
123-
}, [language, systemPromptOverride]);
132+
return result.status === "ok" ? result.data : "";
133+
},
134+
});
124135

125-
const effectiveSystemPrompt = systemPromptOverride ?? systemPrompt;
136+
const effectiveSystemPrompt = systemPromptOverride ?? systemPromptQuery.data;
126137
const isSystemPromptReady =
127-
typeof systemPromptOverride === "string" || systemPrompt !== undefined;
138+
typeof systemPromptOverride === "string" ||
139+
systemPromptQuery.data !== undefined;
128140

129141
const tools = useMemo(() => {
130142
const localTools = registry.getTools("chat-general");

apps/desktop/src/settings/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
import { SettingsLab } from "./lab";
1313
import { AgentIntegrations } from "./lab/agent-integrations";
1414
import { DeveloperSettings } from "./lab/developer";
15+
import { SettingsPersonalization } from "./personalization";
1516
import { SettingsTodo } from "./todo";
1617

1718
import { LLM } from "~/settings/ai/llm";
@@ -85,6 +86,8 @@ function SettingsView({ tab }: { tab: Extract<Tab, { type: "settings" }> }) {
8586
return <STT />;
8687
case "intelligence":
8788
return <LLM />;
89+
case "personalization":
90+
return <SettingsPersonalization />;
8891
case "memory":
8992
return <SettingsMemory />;
9093
case "todo":

0 commit comments

Comments
 (0)