Skip to content
Merged
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
4 changes: 2 additions & 2 deletions apps/desktop/src/components/right-panel/hooks/useChatLogic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -241,14 +241,14 @@ export function useChatLogic({
return;
}

if (messages.length >= 14 && !getLicense.data?.valid) {
if (messages.length >= 6 && !getLicense.data?.valid) {
if (userId) {
await analyticsCommands.event({
event: "pro_license_required_chat",
distinct_id: userId,
});
}
await message("7 messages are allowed per conversation for free users.", {
await message("3 messages are allowed per conversation for free users.", {
title: "Pro License Required",
kind: "info",
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ const openaiModels = [
"gpt-4o-mini",
"gpt-4.1-nano",
"gpt-4.1",
"gpt-5-chat-latest",
"chatgpt-4o-latest",
];

Expand Down
27 changes: 24 additions & 3 deletions apps/desktop/src/components/settings/views/ai.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { zodResolver } from "@hookform/resolvers/zod";
import { Trans } from "@lingui/react/macro";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { openPath } from "@tauri-apps/plugin-opener";
import { open } from "@tauri-apps/plugin-shell";
import { InfoIcon } from "lucide-react";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { z } from "zod";
Expand All @@ -13,6 +15,7 @@ import { commands as dbCommands } from "@hypr/plugin-db";
import { commands as localLlmCommands, SupportedModel } from "@hypr/plugin-local-llm";

import { commands as localSttCommands } from "@hypr/plugin-local-stt";
import { Button } from "@hypr/ui/components/ui/button";
import {
Form,
FormControl,
Expand All @@ -23,6 +26,7 @@ import {
FormMessage,
} from "@hypr/ui/components/ui/form";
import { Tabs, TabsList, TabsTrigger } from "@hypr/ui/components/ui/tabs";
import { Tooltip, TooltipContent, TooltipTrigger } from "@hypr/ui/components/ui/tooltip";
import { cn } from "@hypr/ui/lib/utils";
import { showLlmModelDownloadToast, showSttModelDownloadToast } from "../../toast/shared";

Expand Down Expand Up @@ -824,9 +828,26 @@ export default function LocalAI() {
name="aiSpecificity"
render={({ field }) => (
<FormItem>
<FormLabel className="text-sm font-medium">
<Trans>Autonomy Selector</Trans>
</FormLabel>
<div className="flex items-center gap-2">
<FormLabel className="text-sm font-medium">
<Trans>Autonomy Selector</Trans>
</FormLabel>
<Tooltip>
<TooltipTrigger asChild>
<Button
size="icon"
variant="ghost"
onClick={() => open("https://docs.hyprnote.com/features/ai-autonomy")}
className="h-8 w-8"
>
<InfoIcon className="w-4 h-4" />
</Button>
</TooltipTrigger>
<TooltipContent>
<Trans>Learn more about AI autonomy</Trans>
</TooltipContent>
</Tooltip>
</div>
<FormDescription className="text-xs">
<Trans>Control how autonomous the AI enhancement should be</Trans>
</FormDescription>
Expand Down
25 changes: 22 additions & 3 deletions apps/desktop/src/components/settings/views/templates.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Trans } from "@lingui/react/macro";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { message } from "@tauri-apps/plugin-dialog";
import { ArrowLeftIcon, CheckIcon, Loader2Icon, PlusIcon } from "lucide-react";
import { open } from "@tauri-apps/plugin-shell";
import { ArrowLeftIcon, CheckIcon, InfoIcon, Loader2Icon, PlusIcon } from "lucide-react";
import { useEffect, useState } from "react";

import { useHypr } from "@/contexts";
Expand All @@ -11,6 +12,7 @@ import { commands as analyticsCommands } from "@hypr/plugin-analytics";
import { type Template } from "@hypr/plugin-db";
import { commands as dbCommands } from "@hypr/plugin-db";
import { Button } from "@hypr/ui/components/ui/button";
import { Tooltip, TooltipContent, TooltipTrigger } from "@hypr/ui/components/ui/tooltip";
import { cn } from "@hypr/ui/lib/utils";
import TemplateEditor from "./template";

Expand Down Expand Up @@ -248,8 +250,25 @@ export default function TemplatesView() {
{/* Header */}
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<div className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
<Trans>Your Templates</Trans>
<div className="flex items-center gap-2">
<div className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
<Trans>Your Templates</Trans>
</div>
<Tooltip>
<TooltipTrigger asChild>
<Button
size="icon"
variant="ghost"
onClick={() => open("https://docs.hyprnote.com/features/templates.mdx")}
className="h-8 w-8"
>
<InfoIcon className="w-4 h-4" />
</Button>
</TooltipTrigger>
<TooltipContent>
<Trans>Learn more about templates</Trans>
</TooltipContent>
</Tooltip>
Comment on lines +254 to +271
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Use an accessible label and verify the docs URL (avoid .mdx if the site doesn’t serve extensions).

  • Add aria-label/title for accessibility.
  • The link ends with .mdx; many docs sites don’t serve that path publicly. Prefer the route without extension if available.
-                  <Button
+                  <Button
                     size="icon"
                     variant="ghost"
-                    onClick={() => open("https://docs.hyprnote.com/features/templates.mdx")}
+                    onClick={() => open("https://docs.hyprnote.com/features/templates")}
                     className="h-8 w-8"
+                    aria-label="Learn more about templates"
+                    title="Learn more about templates"
                   >
                     <InfoIcon className="w-4 h-4" />
                   </Button>

Check which URL returns 200/301:


🏁 Script executed:

#!/bin/bash
set -e
for url in \
  "https://docs.hyprnote.com/features/templates.mdx" \
  "https://docs.hyprnote.com/features/templates"
do
  echo "Testing: $url"
  curl -sI "$url" | sed -n '1,3p'
  echo
done

Length of output: 776


Add an accessible label to the Info button and use the extension-less docs URL

The .mdx URL does work (HTTP 200), and the extension-less route returns a 307 redirect, so you can safely link to:

https://docs.hyprnote.com/features/templates

This masks the file extension and still resolves correctly. Also, for screen-reader users, add both an aria-label and a title to the icon button.

• File: apps/desktop/src/components/settings/views/templates.tsx
Lines: ~259 (the <Button size="icon"…> block)

                   <Button
                     size="icon"
                     variant="ghost"
-                    onClick={() => open("https://docs.hyprnote.com/features/templates.mdx")}
+                    onClick={() => open("https://docs.hyprnote.com/features/templates")}
                     className="h-8 w-8"
+                    aria-label="Learn more about templates"
+                    title="Learn more about templates"
                   >
                     <InfoIcon className="w-4 h-4" />
                   </Button>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
<Trans>Your Templates</Trans>
</div>
<Tooltip>
<TooltipTrigger asChild>
<Button
size="icon"
variant="ghost"
onClick={() => open("https://docs.hyprnote.com/features/templates.mdx")}
className="h-8 w-8"
>
<InfoIcon className="w-4 h-4" />
</Button>
</TooltipTrigger>
<TooltipContent>
<Trans>Learn more about templates</Trans>
</TooltipContent>
</Tooltip>
<div className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
<Trans>Your Templates</Trans>
</div>
<Tooltip>
<TooltipTrigger asChild>
<Button
size="icon"
variant="ghost"
onClick={() => open("https://docs.hyprnote.com/features/templates")}
className="h-8 w-8"
aria-label="Learn more about templates"
title="Learn more about templates"
>
<InfoIcon className="w-4 h-4" />
</Button>
</TooltipTrigger>
<TooltipContent>
<Trans>Learn more about templates</Trans>
</TooltipContent>
</Tooltip>
🤖 Prompt for AI Agents
In apps/desktop/src/components/settings/views/templates.tsx around line 259,
update the Button component's onClick URL to
"https://docs.hyprnote.com/features/templates" without the .mdx extension to use
the cleaner route. Also, add an accessible label by including both an aria-label
and a title attribute on the Button to improve screen reader accessibility,
describing the button's purpose such as "Learn more about templates".

</div>
<div className="text-sm text-muted-foreground">
<Trans>Select a template to enhance your meeting notes</Trans>
Expand Down
76 changes: 42 additions & 34 deletions apps/desktop/src/locales/en/messages.po
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ msgstr "(Beta) Detect meetings automatically"
msgid "(Beta) Upcoming meeting notifications"
msgstr "(Beta) Upcoming meeting notifications"

#: src/components/settings/components/ai/llm-custom-view.tsx:602
#: src/components/settings/components/ai/llm-custom-view.tsx:603
msgid "(Optional for localhost)"
msgstr "(Optional for localhost)"

Expand All @@ -267,7 +267,7 @@ msgstr "(Optional)"
#. placeholder {0}: isViewingTemplate ? "Back" : "Save and close"
#. placeholder {0}: lang.language
#. placeholder {0}: disabled ? "Wait..." : isHovered ? "Resume" : "Ended"
#: src/components/settings/views/templates.tsx:215
#: src/components/settings/views/templates.tsx:217
#: src/components/settings/components/wer-modal.tsx:116
#: src/components/editor-area/note-header/listen-button.tsx:216
#: src/components/editor-area/note-header/listen-button.tsx:238
Expand Down Expand Up @@ -324,7 +324,7 @@ msgstr "Access granted"
msgid "Access Granted"
msgstr "Access Granted"

#: src/components/settings/components/ai/llm-custom-view.tsx:467
#: src/components/settings/components/ai/llm-custom-view.tsx:468
msgid "Access multiple AI models through OpenRouter with your API key"
msgstr "Access multiple AI models through OpenRouter with your API key"

Expand Down Expand Up @@ -399,7 +399,7 @@ msgid "Anyone with the link can view this page"
msgstr "Anyone with the link can view this page"

#: src/components/welcome-modal/custom-endpoint-view.tsx:498
#: src/components/settings/components/ai/llm-custom-view.tsx:577
#: src/components/settings/components/ai/llm-custom-view.tsx:578
msgid "API Base URL"
msgstr "API Base URL"

Expand All @@ -408,10 +408,10 @@ msgstr "API Base URL"
#: src/components/welcome-modal/custom-endpoint-view.tsx:438
#: src/components/welcome-modal/custom-endpoint-view.tsx:518
#: src/components/settings/views/integrations.tsx:197
#: src/components/settings/components/ai/llm-custom-view.tsx:285
#: src/components/settings/components/ai/llm-custom-view.tsx:381
#: src/components/settings/components/ai/llm-custom-view.tsx:487
#: src/components/settings/components/ai/llm-custom-view.tsx:599
#: src/components/settings/components/ai/llm-custom-view.tsx:286
#: src/components/settings/components/ai/llm-custom-view.tsx:382
#: src/components/settings/components/ai/llm-custom-view.tsx:488
#: src/components/settings/components/ai/llm-custom-view.tsx:600
msgid "API Key"
msgstr "API Key"

Expand Down Expand Up @@ -440,7 +440,7 @@ msgstr "Audio Permissions"
#~ msgid "Auto (Default)"
#~ msgstr "Auto (Default)"

#: src/components/settings/views/ai.tsx:828
#: src/components/settings/views/ai.tsx:833
msgid "Autonomy Selector"
msgstr "Autonomy Selector"

Expand All @@ -465,7 +465,7 @@ msgstr "Base URL"
#~ msgid "Billing features are currently under development and will be available in a future update."
#~ msgstr "Billing features are currently under development and will be available in a future update."

#: src/components/settings/views/templates.tsx:300
#: src/components/settings/views/templates.tsx:319
#: src/components/settings/components/templates-sidebar.tsx:68
msgid "Built-in Templates"
msgstr "Built-in Templates"
Expand Down Expand Up @@ -566,7 +566,7 @@ msgstr "Configure Your LLM"
#~ msgid "Connect"
#~ msgstr "Connect"

#: src/components/settings/components/ai/llm-custom-view.tsx:557
#: src/components/settings/components/ai/llm-custom-view.tsx:558
msgid "Connect to a self-hosted or third-party LLM endpoint (OpenAI API compatible)"
msgstr "Connect to a self-hosted or third-party LLM endpoint (OpenAI API compatible)"

Expand Down Expand Up @@ -615,7 +615,7 @@ msgstr "Continue"
#~ msgid "Continue Setup"
#~ msgstr "Continue Setup"

#: src/components/settings/views/ai.tsx:831
#: src/components/settings/views/ai.tsx:852
msgid "Control how autonomous the AI enhancement should be"
msgstr "Control how autonomous the AI enhancement should be"

Expand Down Expand Up @@ -644,7 +644,7 @@ msgstr "Create new note"
msgid "Create Note"
msgstr "Create Note"

#: src/components/settings/views/templates.tsx:290
#: src/components/settings/views/templates.tsx:309
msgid "Create your first template to get started"
msgstr "Create your first template to get started"

Expand All @@ -660,7 +660,7 @@ msgstr "Create your first template to get started"
#~ msgid "Custom Endpoint"
#~ msgstr "Custom Endpoint"

#: src/components/settings/components/ai/llm-custom-view.tsx:234
#: src/components/settings/components/ai/llm-custom-view.tsx:235
msgid "Custom Endpoints"
msgstr "Custom Endpoints"

Expand Down Expand Up @@ -758,7 +758,7 @@ msgstr "Enter a section title"
#~ msgid "Enter the API key for your custom LLM endpoint"
#~ msgstr "Enter the API key for your custom LLM endpoint"

#: src/components/settings/components/ai/llm-custom-view.tsx:580
#: src/components/settings/components/ai/llm-custom-view.tsx:581
msgid "Enter the base URL for your custom LLM endpoint"
msgstr "Enter the base URL for your custom LLM endpoint"

Expand Down Expand Up @@ -835,7 +835,7 @@ msgstr "Generating title..."
msgid "Get Started"
msgstr "Get Started"

#: src/components/settings/components/ai/llm-custom-view.tsx:357
#: src/components/settings/components/ai/llm-custom-view.tsx:358
msgid "Google Gemini"
msgstr "Google Gemini"

Expand Down Expand Up @@ -932,10 +932,18 @@ msgstr "Join meeting"
#~ msgid "Language"
#~ msgstr "Language"

#: src/components/settings/views/ai.tsx:847
msgid "Learn more about AI autonomy"
msgstr "Learn more about AI autonomy"

#: src/components/settings/views/billing.tsx:200
#~ msgid "Learn more about our pricing plans"
#~ msgstr "Learn more about our pricing plans"

#: src/components/settings/views/templates.tsx:269
msgid "Learn more about templates"
msgstr "Learn more about templates"

#: src/routes/app.settings.tsx:82
msgid "License"
msgstr "License"
Expand All @@ -948,15 +956,15 @@ msgstr "LinkedIn username"
#~ msgid "Live summary of the meeting"
#~ msgstr "Live summary of the meeting"

#: src/components/settings/views/ai.tsx:804
#: src/components/settings/views/ai.tsx:808
msgid "LLM - Custom"
msgstr "LLM - Custom"

#: src/components/settings/views/ai.tsx:801
#: src/components/settings/views/ai.tsx:805
msgid "LLM - Local"
msgstr "LLM - Local"

#: src/components/settings/components/ai/llm-custom-view.tsx:636
#: src/components/settings/components/ai/llm-custom-view.tsx:637
msgid "Loading available models..."
msgstr "Loading available models..."

Expand All @@ -968,7 +976,7 @@ msgstr "Loading events..."
msgid "Loading models..."
msgstr "Loading models..."

#: src/components/settings/views/templates.tsx:238
#: src/components/settings/views/templates.tsx:240
msgid "Loading templates..."
msgstr "Loading templates..."

Expand Down Expand Up @@ -1013,14 +1021,14 @@ msgstr "Microphone Access"
#: src/components/welcome-modal/custom-endpoint-view.tsx:315
#: src/components/welcome-modal/custom-endpoint-view.tsx:382
#: src/components/welcome-modal/custom-endpoint-view.tsx:459
#: src/components/settings/components/ai/llm-custom-view.tsx:305
#: src/components/settings/components/ai/llm-custom-view.tsx:401
#: src/components/settings/components/ai/llm-custom-view.tsx:507
#: src/components/settings/components/ai/llm-custom-view.tsx:306
#: src/components/settings/components/ai/llm-custom-view.tsx:402
#: src/components/settings/components/ai/llm-custom-view.tsx:508
msgid "Model"
msgstr "Model"

#: src/components/welcome-modal/custom-endpoint-view.tsx:544
#: src/components/settings/components/ai/llm-custom-view.tsx:624
#: src/components/settings/components/ai/llm-custom-view.tsx:625
msgid "Model Name"
msgstr "Model Name"

Expand Down Expand Up @@ -1097,7 +1105,7 @@ msgstr "No recent notes for this organization"
msgid "No Template (Default)"
msgstr "No Template (Default)"

#: src/components/settings/views/templates.tsx:287
#: src/components/settings/views/templates.tsx:306
msgid "No templates yet"
msgstr "No templates yet"

Expand Down Expand Up @@ -1148,11 +1156,11 @@ msgstr "Open in new window"
#~ msgid "Open Note"
#~ msgstr "Open Note"

#: src/components/settings/components/ai/llm-custom-view.tsx:261
#: src/components/settings/components/ai/llm-custom-view.tsx:262
msgid "OpenAI"
msgstr "OpenAI"

#: src/components/settings/components/ai/llm-custom-view.tsx:463
#: src/components/settings/components/ai/llm-custom-view.tsx:464
msgid "OpenRouter"
msgstr "OpenRouter"

Expand All @@ -1164,7 +1172,7 @@ msgstr "Optional base folder path within your Obsidian vault."
msgid "Optional for participant suggestions"
msgstr "Optional for participant suggestions"

#: src/components/settings/components/ai/llm-custom-view.tsx:554
#: src/components/settings/components/ai/llm-custom-view.tsx:555
msgid "Others"
msgstr "Others"

Expand Down Expand Up @@ -1305,15 +1313,15 @@ msgstr "Search..."
msgid "Sections"
msgstr "Sections"

#: src/components/settings/components/ai/llm-custom-view.tsx:627
#: src/components/settings/components/ai/llm-custom-view.tsx:628
msgid "Select a model from the dropdown (if available) or manually enter the model name required by your endpoint."
msgstr "Select a model from the dropdown (if available) or manually enter the model name required by your endpoint."

#: src/components/welcome-modal/custom-endpoint-view.tsx:271
msgid "Select a provider above to configure"
msgstr "Select a provider above to configure"

#: src/components/settings/views/templates.tsx:255
#: src/components/settings/views/templates.tsx:274
msgid "Select a template to enhance your meeting notes"
msgstr "Select a template to enhance your meeting notes"

Expand Down Expand Up @@ -1506,7 +1514,7 @@ msgstr "Toggle widget panel"
msgid "Transcribing"
msgstr "Transcribing"

#: src/components/settings/views/ai.tsx:798
#: src/components/settings/views/ai.tsx:802
msgid "Transcription"
msgstr "Transcription"

Expand Down Expand Up @@ -1546,11 +1554,11 @@ msgstr "Upcoming Events"
#~ msgid "Upgrade"
#~ msgstr "Upgrade"

#: src/components/settings/components/ai/llm-custom-view.tsx:361
#: src/components/settings/components/ai/llm-custom-view.tsx:362
msgid "Use Google's Gemini models with your API key"
msgstr "Use Google's Gemini models with your API key"

#: src/components/settings/components/ai/llm-custom-view.tsx:265
#: src/components/settings/components/ai/llm-custom-view.tsx:266
msgid "Use OpenAI's GPT models with your API key"
msgstr "Use OpenAI's GPT models with your API key"

Expand Down Expand Up @@ -1651,7 +1659,7 @@ msgstr "Your LinkedIn username (the part after linkedin.com/in/)"
msgid "Your Name"
msgstr "Your Name"

#: src/components/settings/views/templates.tsx:252
#: src/components/settings/views/templates.tsx:255
#: src/components/settings/components/templates-sidebar.tsx:45
msgid "Your Templates"
msgstr "Your Templates"
Loading
Loading