1+ import { useQuery } from "@tanstack/react-query" ;
12import type { LanguageModel , ToolSet } from "ai" ;
2- import { useEffect , useMemo , useState } from "react" ;
3+ import { useMemo } from "react" ;
34
45import { commands as templateCommands } from "@hypr/plugin-template" ;
56
@@ -10,6 +11,7 @@ import { useLanguageModel } from "~/ai/hooks";
1011import type { ContextRef } from "~/chat/context/entities" ;
1112import { hydrateSessionContextFromFs } from "~/chat/context/session-context-hydrator" ;
1213import { useToolRegistry } from "~/contexts/tool" ;
14+ import { useConfigValues } from "~/shared/config" ;
1315import * as main from "~/store/tinybase/store/main" ;
1416
1517function 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" ) ;
0 commit comments