Commit Graph
131 Commits
Author SHA1 Message Date
iamdoubz dc969df792 feat(ui): pass configured whisper_language when starting a recording (T8.7, M4.2) 2026-07-07 13:09:21 -05:00
iamdoubz 489271964f feat(ui): load language catalog + setWhisperLanguage in settings store (T8.7, M4.2) 2026-07-07 13:08:59 -05:00
iamdoubz 4c00496c09 feat(ui): typed API surface for whisper language selection (T8.7, M4.2) 2026-07-07 13:08:13 -05:00
iamdoubz e966181ab8 Merge branch 'worktree-agent-af5a53986b9441608' into feature_chore_bug_005
# Conflicts:
#	src-tauri/src/llm/mod.rs
#	src/lib/views/Settings.svelte
#	src/lib/views/SummaryPanel.svelte
2026-07-07 08:15:04 -05:00
iamdoubz a68407f059 style(ui): prettier reflow in HostedAiBanner copy 2026-07-07 08:00:08 -05:00
iamdoubz 67fffb0203 style(ui): prettier reflow in Settings.svelte AI banner copy 2026-07-07 08:00:06 -05:00
iamdoubz a211f88ad4 feat(ui): active-provider indicator + per-use quick switch in SummaryPanel (T10.3/M3.3)
Adds a provider row above Summary (dropdown mirroring Settings' AI
options + a local/hosted badge sourced from llm_status) so it's always
visible which provider a summary/tag generation will actually use.
Generate/Regenerate and the quick switch itself route hosted selections
(Anthropic, or "custom" once its endpoint resolves off-network) through
the same HostedAiBanner one-time acknowledgment gate as Settings — the
generate-click gate is the one that actually matters, since selecting a
provider alone sends nothing; it's kept even though the quick-switch
already pre-empts Anthropic specifically.

Also drops a stale svelte-ignore comment (pre-existing, unrelated to
this change — eslint-plugin-svelte no longer flags that element) that
was failing `eslint .` for this file.
2026-07-07 07:59:57 -05:00
iamdoubz 0a597f86f0 feat(ui): Anthropic provider + hosted-AI banner in Settings AI section (T10.1/T10.3/M3.3)
Adds "Anthropic (Claude)" to the provider select, a write-only masked
API key field (show/hide toggle) shown in place of the endpoint field
for that provider (Anthropic's endpoint is fixed server-side), and a
persistent "leaves this device" note.

Save is gated behind HostedAiBanner the first time the user selects a
hosted provider (Anthropic, or "custom" once its endpoint resolves
off-network) and hasn't acknowledged hosted_ai_acknowledged yet;
accepting persists the ack and completes the save in one step.
2026-07-07 07:54:21 -05:00
iamdoubz 754f0f0b6a feat(ui): HostedAiBanner one-time hosted-AI notice component (T10.3/M3.3)
New component mirroring ConsentNotice.svelte's card/overlay pattern:
shown before first use of a hosted (non-local) provider, explains that
the transcript leaves the device to a third party, and offers
accept/cancel. Uses the existing design tokens (--accent, --warning,
--bg-elevated, --radius-lg/sm, --shadow-lg) so it matches the
recording-consent notice visually. Not yet wired into any view — next
commits add it to Settings and SummaryPanel.
2026-07-07 07:52:25 -05:00
iamdoubz 3cdb0abb2d feat(llm): wire apiKey through setLlmProvider, add acknowledgeHostedAi (T10.2/T10.3)
settings.svelte.ts's setLlmProvider now accepts an optional apiKey
(forwarded straight to the set_llm_provider command, which is the only
place it gets stored — the OS credential store) and DEFAULT_SETTINGS
gains hosted_ai_acknowledged. acknowledgeHostedAi() persists the
one-time hosted-AI banner acknowledgment the same way
acknowledgeConsent() does for recording consent.
2026-07-07 07:52:18 -05:00
iamdoubz 11b175dafa feat(llm): add hosted_ai_acknowledged to AppSettings (T10.3/M3.3)
Frontend counterpart of the new Settings field: the one-time "data
leaves your device" acknowledgment for hosted (non-local) AI providers.
2026-07-07 07:52:11 -05:00
iamdoubz 2582d8947f Merge branch 'worktree-agent-af937df502b61b006' into feature_chore_bug_005
# Conflicts:
#	src-tauri/src/storage/mod.rs
2026-07-07 01:15:08 -05:00
iamdoubz e424ecd8d3 style(mcp): prettier 2026-07-07 00:42:01 -05:00
iamdoubz 1ade08a60e feat(mcp): MCP server settings section + privacy panel integration (T10.4/10.5, M2.5/M2.6)
New "MCP server" tab: persistent disclosure banner (agents may forward
served data to their own provider; WA itself adds no egress), enable
toggle, transport/port/scope controls, a reveal-once auth-token callout
(aria-live, never re-shown), and a live access-log list backed by the
settings store's mcp:// access subscription (FR-MCP-5).

Privacy tab gains a compact MCP status row + an explicit "adds nothing
to the egress list" confirmation line (FR-MCP-7, FR-SEC-2) next to the
existing sync/LLM egress rows.

Built with ui-ux-pro-max guidance (disclosure banner wording, reveal-
once secret pattern, aria-live for the token, badge semantics) mapped
onto this file's existing minimal/utilitarian style (banner/badge/row/
confirm classes already used by the Sync and Privacy sections) rather
than introducing a new visual language.
2026-07-07 00:36:54 -05:00
iamdoubz 02fb7de6a8 feat(briefs): Feature briefs UI in SummaryPanel (T10.6, M1.5) 2026-07-07 00:36:20 -05:00
iamdoubz 70b4952366 feat(mcp): settings store gains MCP state/actions (T10.4/10.5)
loadMcpStatus/loadMcpAccessLog/setMcpEnabled/setMcpScope mirror the
existing sync-target patterns; a live "mcp://access" subscription tails
the FR-MCP-5 audit log into the store while the panel is open, on top
of the on-demand loadMcpAccessLog() refresh. mcpLastToken holds the
freshly-minted token from the most recent enable, for the one-time
reveal UI (next commit).
2026-07-07 00:33:16 -05:00
iamdoubz ae0ef563e9 feat(mcp): frontend AppSettings/McpStatus types for the new fields (T10.4)
Adds mcp_transport/mcp_port/mcp_expose/mcp_expose_recordings to
AppSettings and a typed McpStatus for mcp_status()'s response; types
onMcpAccess's payload correctly (the live event is camelCase per
docs/04-api-contracts.md, unlike the snake_case McpAccessEntry rows
mcpAccessLog() returns).
2026-07-07 00:32:22 -05:00
iamdoubz 2603e12b36 feat(ui): load recording from waaudio://; remove download affordance 2026-07-06 18:40:16 -05:00
iamdoubz 0ecba7f055 docs(ui): correct playback requirement id to FR-REC-5 2026-07-06 17:56:18 -05:00
iamdoubz d08d03077c feat(ui): recording player + live per-item sync progress bars 2026-07-06 17:55:05 -05:00
iamdoubz 3b0f27f5d9 feat(ui): Cancel button to discard an accidental recording 2026-07-06 17:55:04 -05:00
iamdoubz f2db826e8c feat(recording): cancel() + handle cancelled state 2026-07-06 17:55:02 -05:00
iamdoubz a5d81bd9e4 feat(api): cancelRecording + recordingPlaybackPath client bindings 2026-07-06 17:55:01 -05:00
iamdoubz 96b30ed99a feat(notes): single-pane Editor/Preview toggle 2026-07-06 17:44:05 -05:00
iamdoubz 3202f884af feat(settings): Microphone device picker under Audio Devices (FR-CAP-7) 2026-07-06 16:26:25 -05:00
iamdoubz 996c7edc99 feat(audio): load input devices + setMicrophone in settings store (FR-CAP-7) 2026-07-06 16:26:24 -05:00
iamdoubz bb688418bf feat(audio): add listInputDevices + mic settings to API client (FR-CAP-7) 2026-07-06 16:26:23 -05:00
iamdoubz b8dc5fc37f feat(settings): Audio Devices section under Hardware
A <select> defaulting to "Default system audio", populated from the
enumerated render devices — picking one overrides which device
WhispAssist loopback-captures from instead of always following
Windows' system default.
2026-07-06 16:01:00 -05:00
iamdoubz 38b9cb2910 feat(audio): add audioDevices state + loadAudioDevices/setAudioOutputDevice 2026-07-06 16:00:59 -05:00
iamdoubz 137605934c feat(audio): add AudioDeviceInfo type + listAudioDevices to the API client 2026-07-06 16:00:57 -05:00
iamdoubz 16fcb154f3 feat(tags): Generate tags button + chip-based tag editor
Generate tags mirrors Generate summary: reads the transcript (the same
build_prompt assembly, non-streamed) and suggests 1-8 tags, merged
into the working tag list rather than replacing it outright so a
manually-added tag never silently disappears.

Replaces the old comma-separated text input with GitHub-topic-style
chips: typing a comma commits everything before it as its own chip
immediately, each chip is removable via its 'x', and clicking a chip's
label filters the meeting list to that tag (meetings.filterByTag).
2026-07-06 15:38:18 -05:00
iamdoubz cf4232cbae feat(tags): sync the sidebar tag dropdown with the shared filter state
Writable $derived instead of local $state, so clicking a tag chip
elsewhere (the Tags panel) is reflected here too, not just changes
made directly in this dropdown.
2026-07-06 15:38:17 -05:00
iamdoubz 4a30674008 feat(tags): add filterByTag to the meetings store
Same mechanism as the sidebar's tag dropdown (load with a tag filter,
drop search mode), just callable from anywhere a tag chip is clicked —
not only the dropdown itself.
2026-07-06 15:38:15 -05:00
iamdoubz e16d9e5ade feat(tags): add a GitHub-topics-style TagChip component
Rounded pill using the existing --accent-soft/--accent tokens.
Clicking the label filters the meeting list to this tag; an optional
'x' removes it from whatever list rendered it (the component doesn't
know or care what "remove" means to its caller).
2026-07-06 15:38:14 -05:00
iamdoubz 1a31cac65b feat(tags): add generateTags to the typed API client 2026-07-06 15:38:03 -05:00
iamdoubz 2efe29558a feat(meetings): editable title header above the transcript/notes pane
Nothing in the UI displayed or let you change a meeting's title
outside the sidebar list — recordings default to "Untitled meeting"
with no way to fix that. Adds an inline-editable header; blur/change
commits the rename.
2026-07-06 15:10:59 -05:00
iamdoubz 3cd267f737 feat(meetings): add renameMeeting; refresh the list after attach/rename
attachEvent and renameMeeting can both change a meeting's title now, so
both refresh the list (not just the selected-detail view) to keep the
sidebar in sync.
2026-07-06 15:10:58 -05:00
iamdoubz f9e75b7d17 feat(meetings): add renameMeeting to the typed API client 2026-07-06 15:10:56 -05:00
iamdoubz 7e646b3e0f feat(calendar): search/date filter on the meeting-linking event picker
A real mailbox import is thousands of events — searching/filtering
belongs where the user is actually tying a meeting to one, not just
the general browse list in Settings. Defaults the date filter to the
selected meeting's own recording date, since that's almost always the
event being linked.
2026-07-06 14:55:50 -05:00
iamdoubz 00de9d3f68 feat(calendar): remember .pst path, add auto-sync-on-launch toggle
Prefills the file path from settings once loaded (without clobbering
an in-progress browse/edit) and persists it after a successful import,
so the user doesn't have to re-browse to the same file every launch.
The new checkbox just flips pst_auto_sync, which lib.rs's one-shot
startup pass reads.
2026-07-06 14:55:49 -05:00
iamdoubz e6a2109c9c feat(settings): default pst_last_path/pst_auto_sync in the fallback settings object 2026-07-06 14:55:47 -05:00
iamdoubz 67ac4c3813 feat(settings): add pst_last_path/pst_auto_sync to AppSettings type 2026-07-06 14:55:46 -05:00
iamdoubz 8f98332cdd feat(calendar): filter imported events by title and date
Client-side filter over the already-loaded events list (T6.3, FR-CAL-2)
— 1700+ events from a real mailbox is unwieldy to browse unfiltered.
2026-07-06 14:19:14 -05:00
iamdoubz 66aae232c5 fix(calendar): use shared errorMessage() for PST import errors
Tauri commands reject with a {kind, message} object, not a native Error,
so `e instanceof Error ? e.message : String(e)` always fell through to
String(e) -> "[object Object]", hiding the actual readpst failure reason.
2026-07-06 13:43:23 -05:00
iamdoubz 9c670f9b6b feat(settings): Nextcloud server-URL hint + edit-mode test uses stored password
Provider-aware Server URL placeholder/hint (Nextcloud/ownCloud: enter just the
server URL); Test in edit mode passes the target id so the backend reuses the
stored credential.
2026-07-06 11:10:46 -05:00
iamdoubz fb790091fd feat(settings): edit a saved sync target (fix URL/username/options)
Each webdav target gets an Edit button that loads it into the form; save routes
to update_sync_target. Password left blank keeps the stored one; kind is locked
during edit. Fixes not being able to correct a mistyped Server URL.
2026-07-06 10:41:02 -05:00
iamdoubz 496a3372c4 feat(sync): store.updateTarget() to edit a saved target 2026-07-06 10:41:01 -05:00
iamdoubz 45b2acbbc6 feat(api): add upload flags to SyncTargetInfo type 2026-07-06 10:40:59 -05:00
iamdoubz 8038918e1d fix(theme): style textarea like inputs so the AI system prompt matches dark mode 2026-07-06 08:01:36 -05:00
iamdoubz 4442f809d1 fix(theme): dark-mode native controls (Templates dropdown)
Set color-scheme on the theme roots so native controls render in the active
theme, and give the header template <select> an explicit elevated background +
themed <option> colors — an author-styled select's popup otherwise defaults to
white in dark mode.
2026-07-06 08:01:36 -05:00