Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions apps/admin/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@
"@tanstack/react-router-devtools": "^1.125.6",
"@tanstack/react-start": "^1.125.6",
"openid-client": "^6.6.2",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"tailwind-merge": "^2.6.0",
"zod": "^3.25.76"
},
"devDependencies": {
"@types/node": "^22.16.2",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@types/react": "^18.3.23",
"@types/react-dom": "^18.3.7",
"autoprefixer": "^10.4.21",
"postcss": "^8.5.6",
"tailwindcss": "^3.4.17",
Expand Down
130 changes: 48 additions & 82 deletions apps/desktop/src/components/editor-area/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,44 @@ import {
streamText,
tool,
} from "@hypr/utils/ai";
import { useOngoingSession, useSession } from "@hypr/utils/contexts";
import { useOngoingSession, useSession, useSessions } from "@hypr/utils/contexts";
import { enhanceFailedToast } from "../toast/shared";
import { FloatingButton } from "./floating-button";
import { NoteHeader } from "./note-header";

async function generateTitleDirect(enhancedContent: string, targetSessionId: string, sessions: Record<string, any>) {
const [config, { type }, provider] = await Promise.all([
dbCommands.getConfig(),
connectorCommands.getLlmConnection(),
modelProvider(),
]);

const [systemMessage, userMessage] = await Promise.all([
templateCommands.render("create_title.system", { config, type }),
templateCommands.render("create_title.user", { type, enhanced_note: enhancedContent }),
]);

const model = provider.languageModel("defaultModel");
const abortSignal = AbortSignal.timeout(30_000);

const { text } = await generateText({
abortSignal,
model,
messages: [
{ role: "system", content: systemMessage },
{ role: "user", content: userMessage },
],
providerOptions: {
[localProviderName]: { metadata: { grammar: "title" } },
},
});

const session = await dbCommands.getSession({ id: targetSessionId });
if (!session?.title && sessions[targetSessionId]?.getState) {
sessions[targetSessionId].getState().updateTitle(text);
}
}

export default function EditorArea({
editable,
sessionId,
Expand Down Expand Up @@ -77,20 +110,20 @@ export default function EditorArea({
queryFn: () => connectorCommands.getLlmConnection(),
});

const sessionsStore = useSessions((s) => s.sessions);

const { enhance, progress } = useEnhanceMutation({
sessionId,
preMeetingNote,
rawContent,
isLocalLlm: llmConnectionQuery.data?.type === "HyprLocal",
onSuccess: (content) => {
if (hasTranscriptWords) {
generateTitle.mutate({ enhancedContent: content });
generateTitleDirect(content, sessionId, sessionsStore).catch(console.error);
}
},
});

const generateTitle = useGenerateTitleMutation({ sessionId });

useAutoEnhance({
sessionId,
enhanceStatus: enhance.status,
Expand Down Expand Up @@ -227,16 +260,10 @@ export function useEnhanceMutation({
const preMeetingText = extractTextFromHtml(preMeetingNote);
const rawText = extractTextFromHtml(rawContent);

// finalInput is the text that will be used to enhance the note
let finalInput = "";
const wordDiff = diffWords(preMeetingText, rawText);
if (wordDiff && wordDiff.length > 0) {
for (const diff of wordDiff) {
if (diff.added && diff.removed == false) {
finalInput += " " + diff.value;
}
}
}
const finalInput = diffWords(preMeetingText, rawText)
?.filter(diff => diff.added && !diff.removed)
.map(diff => diff.value)
.join(" ") || "";

const setEnhanceController = useOngoingSession((s) => s.setEnhanceController);
const { persistSession, setEnhancedContent } = useSession(sessionId, (s) => ({
Expand All @@ -256,21 +283,20 @@ export function useEnhanceMutation({
await queryClient.invalidateQueries({ queryKey: ["llm-connection"] });
await new Promise(resolve => setTimeout(resolve, 100));

const { type } = await connectorCommands.getLlmConnection();
const freshIsLocalLlm = type === "HyprLocal";
const getWordsFunc = sessionId === onboardingSessionId ? dbCommands.getWordsOnboarding : dbCommands.getWords;
const [{ type }, config, words] = await Promise.all([
connectorCommands.getLlmConnection(),
dbCommands.getConfig(),
getWordsFunc(sessionId),
]);

const freshIsLocalLlm = type === "HyprLocal";
setActualIsLocalLlm(freshIsLocalLlm);

if (freshIsLocalLlm) {
setProgress(0);
}

const fn = sessionId === onboardingSessionId
? dbCommands.getWordsOnboarding
: dbCommands.getWords;

const words = await fn(sessionId);

if (!words.length) {
toast({
id: "short-timeline",
Expand All @@ -282,10 +308,6 @@ export function useEnhanceMutation({
return;
}

// Get current config for default template
const config = await dbCommands.getConfig();

// Use provided templateId or fall back to config
const effectiveTemplateId = templateId !== undefined
? templateId
: config.general?.selected_template_id;
Expand Down Expand Up @@ -437,62 +459,6 @@ Sections:`;
return { enhance, progress: actualIsLocalLlm ? progress : undefined };
}

function useGenerateTitleMutation({ sessionId }: { sessionId: string }) {
const { title, updateTitle } = useSession(sessionId, (s) => ({
title: s.session.title,
updateTitle: s.updateTitle,
}));

const generateTitle = useMutation({
mutationKey: ["generateTitle", sessionId],
mutationFn: async ({ enhancedContent }: { enhancedContent: string }) => {
const config = await dbCommands.getConfig();
const { type } = await connectorCommands.getLlmConnection();

const systemMessage = await templateCommands.render(
"create_title.system",
{ config, type },
);

const userMessage = await templateCommands.render(
"create_title.user",
{
type,
enhanced_note: enhancedContent,
},
);

const abortController = new AbortController();
const abortSignal = AbortSignal.any([abortController.signal, AbortSignal.timeout(30 * 1000)]);

const provider = await modelProvider();
const model = provider.languageModel("defaultModel");

const newTitle = await generateText({
abortSignal,
model,
messages: [
{ role: "system", content: systemMessage },
{ role: "user", content: userMessage },
],
providerOptions: {
[localProviderName]: {
metadata: {
grammar: "title",
},
},
},
});

if (!title) {
updateTitle(newTitle.text);
}
},
});

return generateTitle;
}

function useAutoEnhance({
sessionId,
enhanceStatus,
Expand Down
Loading
Loading