Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
e2ff9de
feat: add 6 Boost VC AI capability domains
Sathvik-1007 May 19, 2026
e6e4843
fix: add schema registrations + fix deadlock
Sathvik-1007 May 19, 2026
e284445
fix: prevent panics on UTF-8 slice + short ID
Sathvik-1007 May 19, 2026
51c76c1
feat: add RPC E2E tests + capability plan doc
Sathvik-1007 May 20, 2026
cec9af6
fix: correct E2E test params + fmt
Sathvik-1007 May 20, 2026
f59a324
ci: retrigger checks
Sathvik-1007 May 20, 2026
f396b2e
feat(chat-with-data): add real SQL generation via sqlparser
Sathvik-1007 May 20, 2026
0d801f3
feat(operator-inbox): add real email parsing via mail-parser
Sathvik-1007 May 20, 2026
163fce1
feat(boost-vc): add real engines — scoring, LLM intent, IMAP, anomaly
Sathvik-1007 May 20, 2026
c4f053e
feat: wire LLM into draft gen, summarization, SQL gen
Sathvik-1007 May 20, 2026
43047a0
refactor: use create_chat_provider for LLM calls
Sathvik-1007 May 20, 2026
c96c58c
fix: correct LLM provider method + cleanup
Sathvik-1007 May 20, 2026
1bee788
fix: sql_gen empty validation + group-by priority
Sathvik-1007 May 20, 2026
656fa39
fix: align test assertions with wired implementations
Sathvik-1007 May 20, 2026
0cc213e
feat: make LLM primary intelligence across all modules
Sathvik-1007 May 20, 2026
30049ea
fix(voice_actions): remove fake execute_action, store LLM intents, au…
Sathvik-1007 May 20, 2026
8a96796
style: cargo fmt
Sathvik-1007 May 20, 2026
ac95e8d
feat(chat_with_data): add in-memory query execution, proactive anomal…
Sathvik-1007 May 20, 2026
ab4e226
refactor: remove dead code, add tool_recommendation flow, harden SQL …
Sathvik-1007 May 21, 2026
e838267
fix: block subqueries in is_safe_query
Sathvik-1007 May 21, 2026
1b5e4e4
fix: harden voice brain error propagation, SQL AST execution, E2E cov…
Sathvik-1007 May 21, 2026
e98347b
style: cargo fmt
Sathvik-1007 May 21, 2026
6f20b73
fix: harden voice domains — session eviction, race guard, store caps,…
Sathvik-1007 May 21, 2026
d4f5e23
refactor: dedup audio utils, add session_id validation
Sathvik-1007 May 21, 2026
f274c0c
feat(voice): harden mutex safety, rename password field, add ws route…
Sathvik-1007 May 21, 2026
713f48a
feat: replace hand-rolled algos with proper crates
Sathvik-1007 May 21, 2026
ba4fc08
fix: audit fixes — sql inject, race cond, perf, validation
Sathvik-1007 May 22, 2026
0470150
fix: clippy never_loop + coderabbit nits
Sathvik-1007 May 22, 2026
30bbe08
fix: propagate non-retryable stream errors
Sathvik-1007 May 22, 2026
315a23f
fix: update streaming test for non-retryable error forwarding
Sathvik-1007 May 22, 2026
36b63f4
fix: address 20 CodeRabbit review issues
Sathvik-1007 May 22, 2026
82a59dd
fix: propagate row decode errors in schema/tables queries
Sathvik-1007 May 22, 2026
8ea1f97
refactor: adopt RpcOutcome<T> for guided_flows
Sathvik-1007 May 22, 2026
9496590
fix: scheme validation + diarize fallback segment
Sathvik-1007 May 22, 2026
d211054
fix: block IPv6 link-local+unique-local in SSRF check
Sathvik-1007 May 22, 2026
2c314e3
chore: trigger CI
Sathvik-1007 May 22, 2026
78dbfc1
chore: retrigger CI
Sathvik-1007 May 23, 2026
0535921
merge: upstream/main into feat/boost-vc-ai-capabilities
Sathvik-1007 May 23, 2026
1b5d189
merge: upstream/main — resolve all.rs + catalog.rs conflicts
Sathvik-1007 May 23, 2026
b3cbb69
ci: retrigger
Sathvik-1007 May 23, 2026
7edf358
ci: retrigger coverage gate
Sathvik-1007 May 23, 2026
ab07bce
chore: retrigger ci
Sathvik-1007 May 24, 2026
4eb7d48
fix: persist test race — unique tmp dir per test
Sathvik-1007 May 24, 2026
9b73ef1
Merge remote-tracking branch 'upstream/main' into pr/2261
senamakel May 25, 2026
1a358d3
Merge remote-tracking branch 'upstream/main' into pr/2261
senamakel May 25, 2026
b46e6d7
Merge branch 'main' into feat/boost-vc-ai-capabilities
Sathvik-1007 May 25, 2026
8897b42
merge: upstream/main — resolve json_rpc_e2e conflict
Sathvik-1007 May 25, 2026
9d4452b
fix: missing closing brace in e2e test
Sathvik-1007 May 25, 2026
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
456 changes: 431 additions & 25 deletions Cargo.lock

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ dotenvy = "0.15"
console = "0.16"
regex = "1.10"
walkdir = "2"
sqlparser = "0.62"
glob = "0.3"
unicode-segmentation = "1"
unicode-width = "0.2"
Expand All @@ -126,7 +127,7 @@ sysinfo = { version = "0.33", default-features = false, features = ["system"] }
keyring = { version = "3", features = ["apple-native", "windows-native", "linux-native"] }
clap = { version = "4.5", features = ["derive"] }
clap_complete = "4.5"
lettre = { version = "0.11.22", default-features = false, features = ["builder", "smtp-transport", "rustls-tls"] }
lettre = { version = "0.11.22", default-features = false, features = ["builder", "smtp-transport", "tokio1-rustls-tls"] }
mail-parser = "0.11.2"
async-imap = { version = "0.11", features = ["runtime-tokio"], default-features = false }
axum = { version = "0.8", default-features = false, features = ["http1", "json", "tokio", "query", "ws", "macros"] }
Expand Down Expand Up @@ -154,6 +155,9 @@ fs2 = "0.4"
starship-battery = "0.10"
ethers-core = { version = "2.0.14", default-features = false }
ethers-signers = { version = "2.0.14", default-features = false }
whatlang = "0.18"
nnnoiseless = "0.5"
strsim = "0.11"
# Multi-chain wallet signing.
# - bitcoin: P2WPKH PSBT build/sign/broadcast (includes secp256k1).
# - ed25519-dalek: Solana transaction signing.
Expand Down
381 changes: 381 additions & 0 deletions docs/YC_CAPABILITIES.md

Large diffs are not rendered by default.

77 changes: 77 additions & 0 deletions docs/boost-vc-capability-plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Boost VC AI Capability Plan

## Commercial Inspirations

| Capability | Inspiration | What we replicate |
|-----------|-------------|-------------------|
| Voice Foundation | Siri, Google Assistant | Local STT (Whisper) + TTS (Piper) desktop assistant |
| Live Captions | Otter.ai, Microsoft Teams captions | Real-time transcription with saved transcripts |
| Voice Actions | Alexa Skills, Siri Shortcuts | Utterance → controller-backed action routing |
| Operator Inbox | Front, Superhuman | Triage, draft replies, follow-up scheduling |
| Chat-with-Data | Julius AI, ChatGPT Code Interpreter | NL queries over local/connected datasets |
| Guided Recommendations | Typeform, Intercom Product Tours | Quiz-style intake flows with branching logic |

## Features Replicated (v1)

### Voice Foundation (#1831)
- Session lifecycle (start/stop/status)
- PCM buffering with VAD (voice activity detection)
- STT via whisper-rs (local, open-source)
- TTS via Piper (local, open-source)
- LLM turn orchestration (STT → LLM → TTS)
- Conversation history context

### Live Captions (#1832)
- Transcript lifecycle (start/pause/resume/complete)
- Real-time segment appending with timestamps
- Extractive summarization on completed transcripts
- Source-agnostic (microphone or desktop audio)

### Voice Actions (#1833)
- Action registration with trigger phrases
- Fuzzy intent recognition (word overlap scoring)
- Safety levels (safe/confirmation_required/destructive)
- Confirmation flow for non-safe actions
- Execution tracking with status

### Operator Inbox (#1834)
- Priority scoring (urgent/high/medium/low)
- Multi-tone draft generation (professional/casual/formal)
- Follow-up scheduling
- Archive workflow

### Chat-with-Data (#1835)
- Dataset registration (CSV, database, API sources)
- Natural language query routing
- Proactive insight generation (anomaly detection)
- Dataset listing and metadata

### Guided Recommendations (#1836)
- Flow definition with branching steps
- Answer validation (type checking, choice validation)
- State machine (active → completed)
- Recommendation generation based on answers
- Builtin onboarding setup flow

## Explicit Non-Goals (v1)

- **No real-time streaming STT** — batch transcription per VAD segment only
- **No speaker diarization** — single-speaker assumption for v1
- **No actual email/Slack integration** — operator inbox is schema-only, no transport
- **No real SQL execution** — chat-with-data generates mock query results
- **No ML-based intent recognition** — word overlap heuristic, not a trained model
- **No persistent storage** — all state is in-memory (process-lifetime)
- **No frontend components** — backend domain modules only, frontend wiring is follow-up
- **No multi-language TTS** — English-only for Piper in v1

## Architecture

All capabilities follow the same pattern:
- Rust domain module under `src/openhuman/<domain>/`
- `types.rs` — domain types with serde
- `engine.rs` — business logic + state machine
- `rpc.rs` — JSON-RPC handlers
- `schemas.rs` — controller registry schemas (Def pattern)
- Wired into `core/all.rs` (controller registry + namespace description)
- Catalog entry in `about_app/catalog.rs`
- Structured tracing (`debug!`/`info!`/`warn!`) at all state transitions
45 changes: 45 additions & 0 deletions src/core/all.rs
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,21 @@ fn build_registered_controllers() -> Vec<RegisteredController> {
controllers.extend(
crate::openhuman::desktop_companion::all_desktop_companion_registered_controllers(),
);
// Standalone voice assistant: local STT/TTS conversational loop.
controllers
.extend(crate::openhuman::voice_assistant::all_voice_assistant_registered_controllers());
// Guided recommendation flows: quiz-style intake and recommendation engine.
controllers.extend(crate::openhuman::guided_flows::all_guided_flows_registered_controllers());
// Live captions: real-time transcription, transcript storage, and summarization.
controllers.extend(crate::openhuman::live_captions::all_live_captions_registered_controllers());
// Voice actions: intent recognition and controller-backed action execution.
controllers.extend(crate::openhuman::voice_actions::all_voice_actions_registered_controllers());
// Operator inbox: message triage, draft generation, and follow-up scheduling.
controllers
.extend(crate::openhuman::operator_inbox::all_operator_inbox_registered_controllers());
// Chat-with-data: NL querying over datasets and proactive insight generation.
controllers
.extend(crate::openhuman::chat_with_data::all_chat_with_data_registered_controllers());
Comment thread
coderabbitai[bot] marked this conversation as resolved.
// Structured WhatsApp Web data — agent-facing read-only controllers (list/search).
// The write-path ingest controller is registered separately in build_internal_only_controllers.
controllers.extend(crate::openhuman::whatsapp_data::all_whatsapp_data_registered_controllers());
Expand Down Expand Up @@ -362,6 +377,18 @@ fn build_declared_controller_schemas() -> Vec<ControllerSchema> {
schemas.extend(crate::openhuman::desktop_companion::all_desktop_companion_controller_schemas());
// Structured WhatsApp Web data — local SQLite store, agent-queryable
schemas.extend(crate::openhuman::whatsapp_data::all_whatsapp_data_controller_schemas());
// Standalone voice assistant
schemas.extend(crate::openhuman::voice_assistant::all_voice_assistant_controller_schemas());
// Guided recommendation flows
schemas.extend(crate::openhuman::guided_flows::all_guided_flows_controller_schemas());
// Live captions and transcripts
schemas.extend(crate::openhuman::live_captions::all_live_captions_controller_schemas());
// Voice-driven actions
schemas.extend(crate::openhuman::voice_actions::all_voice_actions_controller_schemas());
// Operator inbox triage
schemas.extend(crate::openhuman::operator_inbox::all_operator_inbox_controller_schemas());
// Chat-with-data analytics
schemas.extend(crate::openhuman::chat_with_data::all_chat_with_data_controller_schemas());
// Mobile device pairing and management
schemas.extend(crate::openhuman::devices::all_devices_controller_schemas());
schemas
Expand Down Expand Up @@ -486,6 +513,24 @@ pub fn namespace_description(namespace: &str) -> Option<&'static str> {
"companion" => Some(
"Desktop companion — Clicky-style hotkey-driven interaction loop with STT, LLM, TTS, and visual pointing.",
),
"voice_assistant" => Some(
"Standalone local-first voice assistant — mic → VAD → STT → LLM → TTS → speaker loop with session management.",
),
"guided_flows" => Some(
"Reusable guided recommendation and intake flows — quiz-style state machine with branching, validation, and recommendation generation.",
),
"live_captions" => Some(
"Real-time captioning, transcript persistence, and meeting-note summarization from microphone or system audio.",
),
"voice_actions" => Some(
"Voice-driven desktop actions — maps utterances to controller-backed commands with safety levels and confirmation flows.",
),
"operator_inbox" => Some(
"Operator inbox assistant — message triage, priority scoring, draft reply generation, and follow-up scheduling.",
),
"chat_with_data" => Some(
"Chat-with-data analytics — natural-language querying over datasets with proactive insight and anomaly detection.",
),
_ => None,
}
}
Expand Down
100 changes: 100 additions & 0 deletions src/openhuman/about_app/catalog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1230,6 +1230,106 @@ const CAPABILITIES: &[Capability] = &[
destinations: &["Google Meet", "ElevenLabs (STT/TTS via hosted backend)"],
}),
},
// ── Voice Assistant ─────────────────────────────────────────────────────
Capability {
id: "voice_assistant.session",
name: "Standalone Voice Assistant",
domain: "voice_assistant",
category: CapabilityCategory::Automation,
description: "A local-first conversational voice assistant that uses free/open STT \
(Whisper via whisper.cpp) and TTS (Piper) to provide hands-free desktop \
interaction. Mic audio is processed locally by default; cloud fallback \
available when configured.",
Comment thread
coderabbitai[bot] marked this conversation as resolved.
how_to: "Start a voice session via RPC: openhuman.voice_assistant_start_session.",
status: CapabilityStatus::Beta,
privacy: Some(CapabilityPrivacy {
leaves_device: true,
data_kind: PrivacyDataKind::UserContent,
destinations: &["OpenHuman backend", "TinyHumans Neocortex"],
}),
},
// ── Guided Flows ────────────────────────────────────────────────────────
Capability {
id: "guided_flows.recommendation",
name: "Guided Recommendation Flows",
domain: "guided_flows",
category: CapabilityCategory::Automation,
description: "Reusable quiz-style or conversational intake flows that guide users to \
recommendations, decisions, or next actions. Includes a built-in onboarding \
setup guide with branching logic and rule-based recommendation generation.",
how_to: "Start a flow via RPC: openhuman.guided_flows_start_flow with flow_id.",
status: CapabilityStatus::Beta,
privacy: Some(CapabilityPrivacy {
leaves_device: true,
data_kind: PrivacyDataKind::UserContent,
destinations: &["OpenHuman backend", "TinyHumans Neocortex"],
}),
},
// ── Live Captions ───────────────────────────────────────────────────────
Capability {
id: "live_captions.transcript",
name: "Live Captions & Transcripts",
domain: "live_captions",
category: CapabilityCategory::Automation,
description: "Real-time captioning from microphone or system audio with transcript \
persistence and meeting-note summarization. Segments are streamed as \
they arrive from the STT engine.",
how_to: "Start via RPC: openhuman.live_captions_start_transcript with source.",
status: CapabilityStatus::Beta,
privacy: Some(CapabilityPrivacy {
leaves_device: true,
data_kind: PrivacyDataKind::UserContent,
destinations: &["OpenHuman backend", "TinyHumans Neocortex"],
}),
},
// ── Voice Actions ────────────────────────────────────────────────────────
Capability {
id: "voice_actions.intent",
name: "Voice-Driven Actions",
domain: "voice_actions",
category: CapabilityCategory::Automation,
description: "Maps recognized utterances to controller-backed desktop actions with \
safety levels (safe, requires_confirmation, destructive) and execution tracking.",
how_to: "Recognize via RPC: openhuman.voice_actions_recognize with utterance.",
status: CapabilityStatus::Beta,
privacy: Some(CapabilityPrivacy {
leaves_device: false,
data_kind: PrivacyDataKind::Derived,
destinations: &[],
}),
},
// ── Operator Inbox ──────────────────────────────────────────────────────
Capability {
id: "operator_inbox.triage",
name: "Operator Inbox Assistant",
domain: "operator_inbox",
category: CapabilityCategory::Automation,
description: "Channel-agnostic message triage with priority scoring, contextual draft \
reply generation, and follow-up scheduling.",
how_to: "Triage via RPC: openhuman.operator_inbox_triage_message with sender/subject/body.",
status: CapabilityStatus::Beta,
privacy: Some(CapabilityPrivacy {
leaves_device: true,
data_kind: PrivacyDataKind::UserContent,
destinations: &["OpenHuman backend", "TinyHumans Neocortex"],
}),
},
// ── Chat with Data ──────────────────────────────────────────────────────
Capability {
id: "chat_with_data.query",
name: "Chat-with-Data Analytics",
domain: "chat_with_data",
category: CapabilityCategory::Automation,
description: "Natural-language querying over local/connected datasets with proactive \
insight generation (anomaly detection, trend analysis, summaries).",
how_to: "Query via RPC: openhuman.chat_with_data_query with dataset_id and question.",
status: CapabilityStatus::Beta,
privacy: Some(CapabilityPrivacy {
leaves_device: true,
data_kind: PrivacyDataKind::UserContent,
destinations: &["OpenHuman backend", "TinyHumans Neocortex"],
}),
},
// ── Mobile (iOS client) ─────────────────────────────────────────────────
Capability {
id: "mobile.device_pairing",
Expand Down
2 changes: 2 additions & 0 deletions src/openhuman/about_app/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,8 @@ pub enum PrivacyDataKind {
Diagnostics,
/// Non-sensitive metadata (capability ids, feature flags, settings shape).
Metadata,
/// User-generated content (audio, text, queries) sent to cloud LLM for inference.
UserContent,
}

#[cfg(test)]
Expand Down
Loading
Loading