Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
d0543e7
perf(windows): move local KG writes off main thread
karthikyeluripati Jun 18, 2026
0394af6
fix(windows): address Greptile P1 review findings in kg.ts
karthikyeluripati Jun 18, 2026
9076538
feat(windows): add Memories nav and enable Rewind search
karthikyeluripati Jun 19, 2026
ab89710
feat(windows): add system tray icon matching macOS menu bar behavior
karthikyeluripati Jun 19, 2026
e0d81ca
feat(windows): dashboard parity — rename Home to Dashboard, add conve…
karthikyeluripati Jun 19, 2026
b50dd20
feat(windows): recording/listening status indicator in sidebar
karthikyeluripati Jun 19, 2026
e073f24
fix(windows): restore Memory Graph interactivity
karthikyeluripati Jun 19, 2026
492c90e
ui(windows): improve chat markdown and text selection parity
karthikyeluripati Jun 19, 2026
b897bfd
ui(windows): add Settings as first-class sidebar nav item (Batch 6)
karthikyeluripati Jun 19, 2026
8149f39
chore(windows): final Track 1 validation pass + submission docs
karthikyeluripati Jun 19, 2026
8c0fe55
feat(windows): improve floating overlay parity (Batch 7)
karthikyeluripati Jun 19, 2026
35c5af6
feat(windows): Batch 8 — citations, shortcuts+integrations settings t…
karthikyeluripati Jun 19, 2026
b753e79
feat(windows): surface Rewind OCR panel, fullscreen button, and JSON …
karthikyeluripati Jun 19, 2026
a765566
feat(windows): conversations parity - date filter, folder strip, comp…
karthikyeluripati Jun 19, 2026
44e5c97
feat(windows): add Support/About tab and reorder Settings tabs for ma…
karthikyeluripati Jun 19, 2026
35b2822
feat(windows): add Insights page, Rewind date filter, Markdown export…
karthikyeluripati Jun 19, 2026
42df742
feat(windows): conversation row actions — edit title, copy preview, d…
karthikyeluripati Jun 19, 2026
0a0302d
feat(windows): Rewind date filter + Markdown export, Memories categor…
karthikyeluripati Jun 19, 2026
e567829
feat(windows): add move-to-folder, memory edit, copy link, merge, spe…
karthikyeluripati Jun 19, 2026
046b637
feat(windows): BYOK settings/headers, chat audio attachment, speaker …
karthikyeluripati Jun 19, 2026
45a3ca5
feat(windows): chat audio sendAudio, speaker picker in ConversationDe…
karthikyeluripati Jun 19, 2026
25179cd
docs(windows): update Track 1 gap table with BYOK, audio, speaker ass…
karthikyeluripati Jun 19, 2026
5c23492
feat(windows): Focus page, Notifications tab, Devices tab, update che…
karthikyeluripati Jun 19, 2026
e212528
docs(windows): update Track 1 gap table — Focus/Notifications/Devices…
karthikyeluripati Jun 19, 2026
6098cdd
feat(windows): proactive focus engine, BLE scan, expanded notifications
karthikyeluripati Jun 19, 2026
9f73b42
feat(windows): vision-based focus analysis via Gemini Vision + Rewind…
karthikyeluripati Jun 19, 2026
76c895b
docs(windows): mark vision focus detection done in Track 1 source trace
karthikyeluripati Jun 19, 2026
be308fe
feat(windows): Web Bluetooth connect + battery read, improved update UX
karthikyeluripati Jun 19, 2026
fbd12ab
docs(windows): update Track 1 docs for BLE connect, battery read, upd…
karthikyeluripati Jun 19, 2026
7fa841c
feat(windows): macOS-feel parity — keyboard shortcuts, state persiste…
karthikyeluripati Jun 19, 2026
0a8b8de
docs(windows): update Track 1 docs for parity audit wins
karthikyeluripati Jun 19, 2026
18d4ba5
feat(windows): Rewind PDF export + font scaling (Ctrl+=/-)
karthikyeluripati Jun 19, 2026
4740fd3
docs(windows): update Track 1 docs — PDF export, font scaling, agent …
karthikyeluripati Jun 19, 2026
9703bc9
fix(backend): route conversations_collected through agent_config_cont…
karthikyeluripati Jun 19, 2026
5f9e7f1
debug(windows): always-on console.error for citation pipeline diagnos…
karthikyeluripati Jun 19, 2026
7764e8b
feat(windows): custom titlebar, Inter font, thin scrollbars for macOS…
karthikyeluripati Jun 20, 2026
d0774ad
feat(windows): apply Win11 Mica/Acrylic backdrop to main window
karthikyeluripati Jun 20, 2026
14bc7e5
feat(windows): goal celebration, insight badge, rewind pulse — macOS …
karthikyeluripati Jun 20, 2026
395210c
feat(windows): sidebar macOS parity — audio bars, nav spinners, devic…
karthikyeluripati Jun 20, 2026
4e88b4b
feat(windows): new pages — Chat, Help (Crisp), Permissions, Persona
karthikyeluripati Jun 20, 2026
0b7f5a5
feat(windows): new settings tabs — AI Chat, About, Transcription
karthikyeluripati Jun 20, 2026
862001a
feat(windows): wire new settings tabs and pages into routing
karthikyeluripati Jun 20, 2026
234fe77
feat(windows): focus engine, tasks goals toggle, preferences — macOS …
karthikyeluripati Jun 20, 2026
f93ab58
feat(windows): chat, overlay, device improvements — macOS parity
karthikyeluripati Jun 20, 2026
256e7b5
feat(windows): overlay settings gear + visible resize grip — macOS pa…
karthikyeluripati Jun 20, 2026
d7c46b5
feat(windows): profile menu popover + update widget in sidebar — macO…
karthikyeluripati Jun 20, 2026
495c2f9
feat(windows): insights dismissed filter + Show Dismissed toggle
karthikyeluripati Jun 20, 2026
45f24b0
feat(windows): real audio waveform bars via AnalyserNode
karthikyeluripati Jun 20, 2026
f85f7af
feat(windows): RAF-driven AudioBars + tier gating UI in sidebar
karthikyeluripati Jun 20, 2026
3a34e1d
feat(windows): floating live transcript panel with speaker bubbles
karthikyeluripati Jun 20, 2026
7e18418
feat(windows): Chat sessions sidebar — left rail with named sessions …
karthikyeluripati Jun 20, 2026
38e049d
feat(windows): useSessionChat hook — session-aware chat with history …
karthikyeluripati Jun 20, 2026
29665b3
feat(windows): Chat page — two-pane layout with sessions sidebar + us…
karthikyeluripati Jun 20, 2026
8faa3d7
feat(windows): LiveNotesPanel — AI-generated + manual notes during li…
karthikyeluripati Jun 20, 2026
2153ffb
feat(windows): LiveTranscriptPanel speaker naming + LiveNotesPanel mount
karthikyeluripati Jun 20, 2026
e61ce05
feat(windows): ChatLab — prompt engineering + evaluation tool
karthikyeluripati Jun 20, 2026
b7aa7ee
feat(windows): Memory export destinations — Obsidian, Notion, ChatGPT…
karthikyeluripati Jun 20, 2026
64f0bb9
feat(windows): Chat follow-up suggestion chips + send-while-streaming
karthikyeluripati Jun 20, 2026
e7f53c6
fix(windows): pixel-perfect macOS parity — colors, bubbles, sidebar, …
karthikyeluripati Jun 20, 2026
c6e654d
feat(windows): sidebar ease-in-out + device battery % + Focus macOS-s…
karthikyeluripati Jun 20, 2026
bc9d405
feat(windows): save battery level to localStorage after GATT read
karthikyeluripati Jun 20, 2026
2637dfa
feat(windows): Focus page macOS-style status card visual
karthikyeluripati Jun 20, 2026
ea4d82d
feat(windows): Tasks rich filter + detail modal + daily plan, convers…
karthikyeluripati Jun 20, 2026
235c573
feat(windows): People library, 34 filter tags, multi-agent pills, Use…
karthikyeluripati Jun 20, 2026
55335d1
fix(windows): fix emoji garbling in floating overlay chat
karthikyeluripati Jun 20, 2026
f72aae9
feat(windows): track1 parity — tasks, conversations, settings, styles
karthikyeluripati Jun 20, 2026
31f8940
chore(windows): clean up debug logs and build artifacts before PR
karthikyeluripati Jun 20, 2026
e3fa0a6
fix(windows): restore citation cards without re-introducing emoji gar…
karthikyeluripati Jun 20, 2026
825cae0
chore(windows): remove tracked build artifacts and tighten gitignore
karthikyeluripati Jun 20, 2026
cfa00db
test(windows): extract chatSse utilities + 35 unit tests for citation…
karthikyeluripati Jun 20, 2026
5b4b400
fix(windows): address cubic code review findings (P1/P2/P3)
karthikyeluripati Jun 20, 2026
4bb371e
fix(windows): address cubic follow-up review (P2)
karthikyeluripati Jun 20, 2026
af26a20
feat(windows): add getForegroundNow type to OmiBridgeApi
karthikyeluripati Jun 23, 2026
f9beaf2
feat(windows): add usage:foregroundNow IPC handler
karthikyeluripati Jun 23, 2026
d71f000
feat(windows): add spellcheck, win:isMaximized IPC, and maximize stat…
karthikyeluripati Jun 23, 2026
ac8342c
feat(windows): expose winIsMaximized, onWinMaximizeChange, getForegro…
karthikyeluripati Jun 23, 2026
bdbcc00
feat(windows): title bar maximize/restore toggle with Win11 Fluent icons
karthikyeluripati Jun 23, 2026
421af30
feat(windows): bundle About page logo locally instead of external URL
karthikyeluripati Jun 23, 2026
9e07330
feat(windows): live foreground app indicator on Focus page via Win32 …
karthikyeluripati Jun 23, 2026
a546d7c
feat(windows): memory card share button copies content to clipboard
karthikyeluripati Jun 23, 2026
c20bfea
feat(windows): Win11 Snap Layouts via titleBarOverlay + obsidian: URI…
karthikyeluripati Jun 23, 2026
10755a6
feat(windows): simplify TitleBar to drag region only (native overlay …
karthikyeluripati Jun 23, 2026
f699886
feat(windows): remove winIsMaximized/onWinMaximizeChange from preload…
karthikyeluripati Jun 23, 2026
62cb283
fix(windows): mount ToastHost globally + use Copy icon on memory cards
karthikyeluripati Jun 23, 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
25 changes: 24 additions & 1 deletion backend/routers/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,9 +274,14 @@ def process_message(response: str, callback_data: dict):

# cited extraction
cited_conversation_idxs = {int(i) for i in re.findall(r'\[(\d+)\]', response)}
logger.info(
f"[chat] citation extraction: {len(memories)} memories_found, "
f"cited_idxs={sorted(cited_conversation_idxs)}"
)
if len(cited_conversation_idxs) > 0:
response = re.sub(r'\[\d+\]', '', response)
memories = [memories[i - 1] for i in cited_conversation_idxs if 0 < i and i <= len(memories)]
logger.info(f"[chat] resolved {len(memories)} citation(s) for done: payload")

memories_id = extract_memory_ids(memories) if memories else []

Expand Down Expand Up @@ -324,7 +329,25 @@ async def generate_stream():
else:
response = callback_data.get('answer')
if response:
ai_message, ask_for_nps = process_message(response, callback_data)
try:
ai_message, ask_for_nps = process_message(response, callback_data)
except Exception as pm_err:
logger.error(
f"[chat] process_message failed; emitting done: without citations. Error: {pm_err}"
)
# Build a minimal message so the done: line is always emitted.
# Strip [N] markers best-effort so the frontend shows clean text.
ai_message = Message(
id=str(uuid.uuid4()),
text=re.sub(r'\[\d+\]', '', response),
created_at=datetime.now(timezone.utc),
sender='ai',
app_id=app_id_from_app,
type='text',
)
if chat_session:
ai_message.chat_session_id = chat_session.id
ask_for_nps = False
Comment on lines +348 to +350

@cubic-dev-ai cubic-dev-ai Bot Jun 20, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: Fallback done-path skips DB persistence for AI replies. Users can see a streamed reply that disappears from stored chat history.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At backend/routers/chat.py, line 348:

<comment>Fallback done-path skips DB persistence for AI replies. Users can see a streamed reply that disappears from stored chat history.</comment>

<file context>
@@ -324,7 +329,25 @@ async def generate_stream():
+                                app_id=app_id_from_app,
+                                type='text',
+                            )
+                            if chat_session:
+                                ai_message.chat_session_id = chat_session.id
+                            ask_for_nps = False
</file context>
Suggested change
if chat_session:
ai_message.chat_session_id = chat_session.id
ask_for_nps = False
if chat_session:
ai_message.chat_session_id = chat_session.id
chat_db.add_message_to_chat_session(uid, chat_session.id, ai_message.id)
chat_db.add_message(uid, ai_message.dict())
ask_for_nps = False
Fix with cubic

ai_message_dict = ai_message.dict()
response_message = ResponseMessage(**ai_message_dict)
response_message.ask_for_nps = ask_for_nps
Expand Down
6 changes: 6 additions & 0 deletions backend/utils/retrieval/agentic.py
Original file line number Diff line number Diff line change
Expand Up @@ -657,5 +657,11 @@ async def execute_agentic_chat_stream(
traceback.print_exc()
if callback_data is not None:
callback_data['error'] = str(e)
# Ensure answer is always set so generate_stream can emit the done: line
# and the frontend receives clean text even when an exception cut the
# normal success path before line 644.
if 'answer' not in callback_data:
callback_data['answer'] = ''.join(full_response)
callback_data['memories_found'] = conversations_collected if conversations_collected else []

yield None # Signal completion
22 changes: 18 additions & 4 deletions backend/utils/retrieval/tools/conversation_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,8 +242,15 @@ def get_conversations_tool(

logger.info(f"🔍 get_conversations_tool - Converted {len(conversations)} conversation objects")

# Store conversations in config for citation tracking (as lightweight dicts)
conversations_collected = config['configurable'].get('conversations_collected', [])
# Store conversations in config for citation tracking (as lightweight dicts).
# Prefer agent_config_context (guaranteed to be the original shared list from
# execute_agentic_chat_stream) over config['configurable'] (LangChain may pass
# a copy of the configurable dict, silently breaking the shared-list reference).
ctx = agent_config_context.get(None)
if ctx:
conversations_collected = ctx['configurable'].get('conversations_collected', [])
else:
conversations_collected = config['configurable'].get('conversations_collected', [])
for conv in conversations:
conv_dict = conv.dict()
# Remove heavy fields to reduce memory usage
Expand Down Expand Up @@ -477,8 +484,15 @@ def search_conversations_tool(

logger.info(f"🔍 search_conversations_tool - Converted {len(conversations)} conversation objects")

# Store conversations in config for citation tracking (as lightweight dicts)
conversations_collected = config['configurable'].get('conversations_collected', [])
# Store conversations in config for citation tracking (as lightweight dicts).
# Prefer agent_config_context (guaranteed to be the original shared list from
# execute_agentic_chat_stream) over config['configurable'] (LangChain may pass
# a copy of the configurable dict, silently breaking the shared-list reference).
ctx = agent_config_context.get(None)
if ctx:
conversations_collected = ctx['configurable'].get('conversations_collected', [])
else:
conversations_collected = config['configurable'].get('conversations_collected', [])
for conv in conversations:
conv_dict = conv.dict()
# Remove heavy fields to reduce memory usage
Expand Down
2 changes: 2 additions & 0 deletions desktop/windows/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,5 @@ resources/win-ocr-helper/*.pdb
src/main/automation/helper/bin/
src/main/automation/helper/obj/
resources/win-automation-helper/*.pdb
*.tsbuildinfo
electron.vite.config.*.mjs
3 changes: 3 additions & 0 deletions desktop/windows/electron-builder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ asarUnpack:
# koffi loads its native .node at runtime, resolved relative to its own package
# dir — it must live outside the asar archive or the foreground monitor fails.
- node_modules/koffi/**
# kgWorker.js is loaded via new Worker(path) which bypasses Electron's asar
# virtual-fs patch — it must be a real file on disk.
- out/main/kgWorker.js
win:
executableName: omi-windows
target:
Expand Down
22 changes: 20 additions & 2 deletions desktop/windows/electron.vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
import { readFileSync } from 'node:fs'
import { resolve } from 'path'
import { defineConfig } from 'electron-vite'
import react from '@vitejs/plugin-react'

const appVersion = (JSON.parse(readFileSync('./package.json', 'utf-8')) as { version: string }).version

export default defineConfig({
main: {},
main: {
build: {
rollupOptions: {
input: {
index: resolve('src/main/index.ts'),
// Second entry so vite emits out/main/kgWorker.js alongside index.js.
// The worker file must be a separate bundle (not inlined) because
// new Worker(path) needs a real file — it can't load from the main bundle.
kgWorker: resolve('src/main/ipc/kgWorker.ts')
}
}
}
},
preload: {},
renderer: {
// Pin the dev server to a fixed port so the renderer's origin
Expand All @@ -21,6 +36,9 @@ export default defineConfig({
'@renderer': resolve('src/renderer/src')
}
},
plugins: [react()]
plugins: [react()],
define: {
__APP_VERSION__: JSON.stringify(appVersion)
}
}
})
8 changes: 4 additions & 4 deletions desktop/windows/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"build:ocr-helper": "powershell -ExecutionPolicy Bypass -File scripts/build-ocr-helper.ps1",
"postinstall": "electron-builder install-app-deps && electron-rebuild -f -w better-sqlite3 && node scripts/ensure-ocr-helper.mjs",
"build:unpack": "npm run build && electron-builder --dir",
"build:win": "npm run build && electron-builder --win --x64",
"build:win": "node scripts/copy-koffi-native.mjs && npm run build && electron-builder --win --x64",
"build:mac": "electron-vite build && electron-builder --mac",
"build:linux": "electron-vite build && electron-builder --linux",
"test": "vitest run",
Expand All @@ -34,8 +34,6 @@
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-tooltip": "^1.2.8",
"@react-three/drei": "^10.7.7",
"@react-three/fiber": "^9.6.1",
"axios": "^1.16.1",
"better-sqlite3": "^12.10.0",
"class-variance-authority": "^0.7.1",
Expand All @@ -47,20 +45,22 @@
"lucide-react": "^1.16.0",
"react-router-dom": "^7.15.1",
"tailwind-merge": "^3.6.0",
"three": "^0.184.0",
"ws": "^8.21.0"
},
"devDependencies": {
"@electron-toolkit/eslint-config-prettier": "^3.0.0",
"@electron-toolkit/eslint-config-ts": "^3.1.0",
"@electron-toolkit/tsconfig": "^2.0.0",
"@react-three/drei": "^10.7.7",
"@react-three/fiber": "^9.6.1",
"@electron/rebuild": "^4.0.4",
"@types/better-sqlite3": "^7.6.13",
"@types/d3-force": "^3.0.10",
"@types/node": "^22.19.1",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@types/three": "^0.184.1",
"three": "^0.184.0",
"@types/ws": "^8.18.1",
"@vitejs/plugin-react": "^5.1.1",
"autoprefixer": "^10.5.0",
Expand Down
Loading