Commit Graph
53 Commits
Author SHA1 Message Date
iamdoubz a341afc52f fix(commands): reindex search after generate_summary writes summary.json
summary.json is sealed straight to disk, not through a store write, so
the FTS index needs an explicit nudge to pick up newly generated
summaries (FR-SEARCH-1).
2026-07-10 19:22:04 -05:00
iamdoubz b5f5ef172c feat(commands): auto-label the mic speaker "You" at stop_recording
Wires VoiceSample creation into start_recording (mic-enabled path) and
runs the voiceprint match after the final diarization pass in
stop_recording: on a confident match, persists "You" and "Speaker 2",
"Speaker 3"... via the existing rename_speaker store path, skipping any
label the user already renamed live.
2026-07-10 19:05:28 -05:00
iamdoubz 1cf0be1259 test(commands): cover graph_calendar_enabled in the privacy egress allowlist test (M4.4) 2026-07-07 18:00:20 -05:00
iamdoubz ce4c54c93b style(commands): cargo fmt 2026-07-07 17:57:12 -05:00
iamdoubz d81b4726f9 feat(commands): MS Graph calendar link/import/disconnect + egress allowlist (T8.9, M4.4, FR-CAL-6) 2026-07-07 17:53:13 -05:00
iamdoubz 7490ff5db4 feat(transcription): wire language selection through recording/reprocess/recovery (T8.7, M4.2) 2026-07-07 13:06:00 -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 b986c570f7 fix(llm): reset stale hosted endpoint when quick-switching away from Anthropic
apply_llm_provider_args now resets llm_endpoint to Ollama's local
default when switching to a non-Anthropic provider without an explicit
endpoint and the stored endpoint is still Anthropic's fixed hosted
URL. Prevents a future per-use provider switch (SummaryPanel) that
only sends `provider` from silently leaving llm_endpoint pointed at a
third party for a provider that has no business talking to it.
2026-07-07 07:56:09 -05:00
iamdoubz d73af49742 feat(llm): set_llm_provider stores Anthropic key in credential store, extends egress allowlist (T10.2/M3.2)
set_llm_provider now accepts provider "anthropic": the apiKey argument
is written straight to crate::llm::credentials (OS credential store)
and never assigned into Settings, so it structurally cannot reach
settings.json/wa.db (FR-SEC-1). apply_llm_provider_args pulls the
settings-mutation logic into a small pure function specifically so
that guarantee is unit-testable without touching a real keyring.

llm_provider_from_settings gets an "anthropic" arm; api.anthropic.com
joins the settings-derived egress allowlist through the exact same
generic is_local()-based path privacy_self_check_json already uses for
every other provider — no anthropic-specific allowlist code, and the
host only appears once the provider is actually selected (never
unconditionally).

Also fixes pre-existing cargo-fmt drift on one unrelated line this
file's formatter pass touched (CONTENT_RANGE header call).
2026-07-07 07:50:15 -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 63bfc293cb feat(briefs): create/list/get_feature_brief + set_brief_exposed command bodies (T10.6, M1.4/M1.6) 2026-07-07 00:30:04 -05:00
iamdoubz bd97032550 style: rustfmt (incl. one pre-existing long line in serve_recording) 2026-07-07 00:30:00 -05:00
iamdoubz 0ecc72f18f feat(mcp): wire mcp_status/set_mcp_enabled/set_mcp_scope/mcp_access_log (T10.4)
Replaces the four not_implemented() stubs. mcp_status/set_mcp_enabled
reach the process-wide RmcpServer singleton (behind `#[cfg(feature =
"mcp")]`, with a not_implemented fallback for builds without it);
set_mcp_scope/mcp_access_log are plain settings/Store I/O and work in
every build regardless of the `mcp` cargo feature. The token is only
ever returned once, right when set_mcp_enabled mints it -- it is never
re-readable afterwards, same as any other freshly-issued secret.
2026-07-07 00:26:11 -05:00
iamdoubz 999084ab3f feat(mcp): default_settings() covers the new MCP fields (T10.4)
Keeps default_settings() exhaustive now that Settings grew mcp_* fields.
2026-07-07 00:10:37 -05:00
iamdoubz 1634820523 feat(recording): stream + decrypt recordings in memory via waaudio:// (FR-REC-5) 2026-07-06 18:40:12 -05:00
iamdoubz 49893d5874 feat(audio): wire MicBridge so recordings include the user's voice 2026-07-06 18:25:57 -05:00
iamdoubz ea79fb656d docs(commands): correct playback requirement id to FR-REC-5 2026-07-06 17:56:16 -05:00
iamdoubz da25ccaec6 feat: cancel_recording, recording_playback_path, live sync progress 2026-07-06 17:51:57 -05:00
iamdoubz 97b5f67049 feat(audio): wire mic capture + mixer into recording lifecycle (FR-CAP-7) 2026-07-06 16:26:17 -05:00
iamdoubz 2759a0e49a feat(audio): add list_audio_devices command; wire device into start_recording
list_audio_devices runs the (blocking, COM-based) enumeration off the
async runtime via spawn_blocking, same pattern as import_pst_core.
start_recording now passes settings.audio_output_device through to
WasapiCapture::start instead of always capturing the default device.
2026-07-06 16:00:49 -05:00
iamdoubz fb406d62da feat(llm): add generate_tags command
Reuses build_prompt's transcript+metadata assembly (same as
generate_summary) and the same recording-in-progress guard.
2026-07-06 15:38:00 -05:00
iamdoubz 4f80c14f72 feat(meetings): add rename_meeting command
Validates a non-empty trimmed title before delegating to the store.
2026-07-06 15:10:54 -05:00
iamdoubz 871b11d75e refactor(calendar): split import_pst into a reusable core fn
import_pst_core takes &AppHandle/&dyn Store directly instead of the
State<AppState> extractor, so the startup auto-sync pass (lib.rs) can
run the same import logic without going through a Tauri command.
2026-07-06 14:55:34 -05:00
iamdoubz 8f6e8041d6 feat(sync): auto-build Nextcloud/ownCloud DAV path from the server URL
For nextcloud/owncloud, WebDavTarget now derives the canonical
…/remote.php/dav/files/<user>/ path from the entered server URL (origin only, so
a pasted full path normalizes too); other providers use the URL verbatim.
test_sync_target also reuses the stored password when editing an existing
webdav target (unless a new one is typed), so Test works after a URL fix without
re-entering the password. Fixes the confusing 'bare host connects, full URL
fails' behavior (the former was a 404 false-positive, the latter a blank-secret
401).
2026-07-06 11:10:44 -05:00
iamdoubz 224aaf9994 fix(runtime): use gitea /media/ URLs so Git LFS bundles resolve (not the pointer) 2026-07-06 09:45:01 -05:00
iamdoubz e6f19168f8 feat(runtime): download NPU/DirectML runtimes as 7z from the repo raw URLs
extract_7z_flat replaces extract_zip_flat; NPU + DirectML now default to
git.dou.bet raw/branch/main/runtime/{openvino,directml}.7z with pinned SHA-256s
(DirectML no longer requires WA_DIRECTML_RUNTIME_URL). Adds an extraction test
against the real bundle (proves LZMA2+BCJ decode + flatten).
2026-07-06 08:23:49 -05:00
iamdoubz 0317649b48 feat(commands): app_info (version+commit) and open_url for the About page 2026-07-06 07:46:18 -05:00
iamdoubz ceb7e59164 feat(commands): expose directml.applicable in hardware_status (P2) 2026-07-06 07:21:50 -05:00
iamdoubz b69c91a598 feat(commands): route AMD/Intel to DirectML ONNX engine + download_directml_package (P2)
load_transcriber dispatches OnnxOpenVino/OnnxDirectML through one OnnxTranscriber
block. download_and_extract_runtime is parameterized (sha + readiness) so the new
stage_directml_runtime reuses it; hardware_status reports a directml package field.
2026-07-05 19:40:27 -05:00
iamdoubz 7fe0d87e55 feat(transcription): drive engine choice from AccelPath resolver (P0)
load_transcriber now resolves the accel path instead of assuming a GPU
BackendId has a working offload. Only requests whisper GPU offload for
WhisperCuda/WhisperVulkan; NPU goes to the ONNX engine; everything else decodes
on CPU and reports the backend actually used.
2026-07-05 19:27:28 -05:00
iamdoubz 606bf67943 feat(llm): wire llm_advanced through provider construction + defaults (T5.2) 2026-07-04 09:21:27 -05:00
iamdoubz a38bf20e79 feat(npu): download+unzip the hosted OpenVINO runtime bundle w/ progress + sha256 (T3.4) 2026-07-03 09:16:41 -05:00
iamdoubz 1824475cef feat(sync): seal recording on finalize; encrypt-before-upload in pump; honor config flag (T9.12/T8.8) 2026-07-03 08:47:36 -05:00
iamdoubz e194b76f6f feat(vault): vault lifecycle commands; seal summary; decrypt on export (T8.8) 2026-07-03 08:06:05 -05:00
iamdoubz 575118ceba feat(sync): begin_oauth_link command; pump/test dispatch via build_sync_target (T9.9/9.10) 2026-07-03 07:54:29 -05:00
iamdoubz 2969008d8b feat(sync): upload queue pump w/ backoff, sync_meeting/status/retry, finalize hook, sync://job events (T9.5) 2026-07-02 21:56:58 -05:00
iamdoubz e6911a6bff feat(sync): target management + test-connection commands; wire allowlist (T9.3/9.8) 2026-07-02 20:17:03 -05:00
iamdoubz 69ed6256db feat(transcription): dispatch NPU backend + NPU package download command (T3.4) 2026-07-02 17:16:43 -05:00
iamdoubz 8a28854250 feat(reminders): schedule/cancel from confirm_action_items (T8.6, FR-CAL-5) 2026-07-02 11:59:15 -05:00
iamdoubz 5a5afa51e4 feat(export): add bulk_export_meetings (T8.5, FR-STORE-4)
Extracts export_meeting_to as a shared helper (was duplicated inline
in export_meeting) so single and bulk export share identical
fetch+render logic. bulk_export_stem sanitizes+suffixes filenames with
an id prefix — meeting titles are very often duplicates ("Untitled
meeting") and would otherwise silently overwrite each other in a
batch. A meeting that fails to export is skipped rather than aborting
the whole run; also fixes export_meeting's doc comment, stale since
T8.4 added pdf/docx.
2026-07-02 11:35:24 -05:00
iamdoubz 2f56891d40 feat(templates): apply templates at all 4 notes-render call sites (T8.1, FR-NOTE-5)
Adds StartRecordingArgs.template_id + list_note_templates command;
renames built_in_template to summary_prompt_bias to disambiguate it
from the new NoteTemplate concept (same meeting-type identifiers,
different purpose). Also fixes refresh_notes_and_notify (the
rename/merge-speaker refresh path) to route through
Store::update_notes instead of a raw std::fs::write — it was bypassing
T8.2's FTS reindexing, a gap missed there because this call site uses
meeting_dir(meeting_id) without the & that my earlier grep matched on.
2026-07-02 11:25:48 -05:00
iamdoubz 06bdf6d469 feat(export): wire pdf/docx formats into export_meeting (T8.4, FR-NOTE-4) 2026-07-02 11:02:52 -05:00
iamdoubz d1ca2f63dd feat(tags): add set_tags/list_tags commands; extend list_meetings (T8.3, FR-SEARCH-2) 2026-07-02 10:38:31 -05:00
iamdoubz d928dfd51d feat(search): add search command; route notes.md writes through the store (T8.2, FR-SEARCH-1)
The initial notes.md render after finalize/resume/recovery bypassed
the Store abstraction entirely (raw std::fs::write) — routing it
through update_notes means that first render also gets FTS-indexed and
bumps updated_at, instead of only later manual edits doing either.
2026-07-02 10:07:29 -05:00
iamdoubz fc9c1d9fc2 feat(audio): forward capture-event sink to recording://level/device (T7.3)
start_recording now creates the EventSink alongside the existing frame
channel and forwards Level/DeviceChanged onto a small fire-and-forget
thread that emits "recording://level" and "recording://device".
2026-07-01 21:09:34 -05:00
iamdoubz 70c8c61af5 feat(privacy): implement privacy_self_check command (T7.6, FR-SEC-2)
Reports LLM endpoint/local-only status and enabled sync targets so the
UI can prove local-only handling, per the shape fixed in
docs/04-api-contracts.md. Sync targets stay empty until Phase 9 lands
SyncManager; list_sync_targets' not_implemented error is swallowed
rather than failing the whole self-check.
2026-07-01 17:01:40 -05:00
iamdoubz 6229b58645 Add calendar commands; replace todo!() stubs with typed errors to avoid panics 2026-07-01 15:07:25 -05:00
iamdoubz 27373effb7 Phase 5 2026-07-01 10:54:03 -05:00
iamdoubz 5757cd7345 Phase 4 2026-07-01 07:53:23 -05:00
iamdoubz ba48f0afc2 Phase 3 2026-06-30 23:53:33 -05:00