Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
6fbb12f
chore(backend): high-confidence hygiene cleanup
cursoragent Aug 10, 2026
419c4b2
chore(app): remove dead UI code and dedupe local helpers
cursoragent Aug 10, 2026
b50f52e
chore(scripts): harden ops helpers and fix stale Desktop paths
cursoragent Aug 10, 2026
097bc54
chore(app): drop trailing blank line for diff-hygiene
cursoragent Aug 10, 2026
4392324
chore(backend): keep shared edit_distance in ids.py
cursoragent Aug 10, 2026
f5e5d6c
chore(backend): move shared edit_distance into ids.py
cursoragent Aug 10, 2026
698a684
style(app): apply dart format to touched files
undivisible Aug 10, 2026
fed8bee
chore(scripts): drop cm-builds.sh alias and restore curl line continu…
undivisible Aug 10, 2026
647dd30
chore(scripts): drop duplicated || true in figma sync pkill
undivisible Aug 10, 2026
ee2b4b4
test(app): cover extracted phone call duration formatter
undivisible Aug 10, 2026
844bfa2
revert(app): restore generated files and pubspec.lock swept in by mis…
undivisible Aug 10, 2026
5d6313e
style(app): reformat with resolved package config to match CI dart fo…
undivisible Aug 10, 2026
ef69c72
fix(review): address Git & cubic review comments on PR 11303
undivisible Aug 12, 2026
bf27b10
style(app): apply dart format to changed files
undivisible Aug 12, 2026
14d2e20
style(app): apply dart format with resolved package language version
undivisible Aug 14, 2026
dd44d2c
fix(hygiene): restore pinned generated outputs
undivisible Aug 18, 2026
9f116a9
fix(web): replace nested ternary in getPlatformLink
undivisible Aug 22, 2026
8301615
fix(backend): restore webhook URL parsing in first-time setup
cursoragent Aug 25, 2026
ad37543
test(desktop): isolate Rewind owner snapshot authority
aryanorastar Aug 25, 2026
9b3cbab
chore(hygiene): high-confidence dead code, imports, and helper cleanu…
undivisible Aug 27, 2026
5428c6e
fix: remove unused get_byok_keys import in subscription.py
undivisible Aug 27, 2026
a112b2f
fix: remove unused get_byok_keys import in subscription.py
undivisible Aug 27, 2026
0b6132f
fix(ci): point the dev deploy smoke at development's real API host (#…
Git-on-my-level Aug 27, 2026
2bbb2ba
test(desktop): enroll BYOK fingerprints so paywall/agent tests match …
Git-on-my-level Aug 27, 2026
140e6c7
chore: consolidate changelog for v0.12.223
github-actions[bot] Aug 27, 2026
6b4158f
Update desktop changelog for v0.12.223 [skip ci] (#12280)
omi-ci-bot[bot] Aug 27, 2026
5c254e7
fix(desktop): make every chat_agent_error explain itself (#12267)
Git-on-my-level Aug 27, 2026
e5b562e
chore: consolidate changelog for v0.12.224
github-actions[bot] Aug 27, 2026
ed5a6fc
Update desktop changelog for v0.12.224 [skip ci] (#12282)
omi-ci-bot[bot] Aug 27, 2026
351ec09
test(desktop): isolate Rewind owner snapshot authority (#12192)
undivisible Aug 27, 2026
2be1992
fix(web): add the pinned prettier deps to web/app's lockfile (#12288)
aryanorastar Aug 27, 2026
2371629
test(desktop): isolate FloatingBar notification owner authority (#12259)
aryanorastar Aug 27, 2026
b2ed944
chore: consolidate changelog for v0.12.225
github-actions[bot] Aug 27, 2026
ac9cc46
Update desktop changelog for v0.12.225 [skip ci] (#12291)
omi-ci-bot[bot] Aug 27, 2026
2faa66f
docs(desktop-windows): document Node 22.19+ pin in AGENTS.md
Aug 27, 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
5 changes: 4 additions & 1 deletion .github/actions/deploy-backend-stack/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -972,7 +972,10 @@ runs:
ADMIN_KEY="$(gcloud secrets versions access latest --secret=ADMIN_KEY --project="$PROJECT_ID")"
export ADMIN_KEY
trap 'unset ADMIN_KEY' EXIT
python3 "$DEPLOY_CONTROL_SCRIPTS/smoke_what_matters_now.py" --base-url https://api.omi.dev
# api.omi.dev has never resolved (NXDOMAIN), so this smoke could not reach
# anything; api.omiapi.com is development's real public API host, matching
# the rest of the dev domain family (parakeet/nllb/pusher.omiapi.com).
python3 "$DEPLOY_CONTROL_SCRIPTS/smoke_what_matters_now.py" --base-url https://api.omiapi.com

- name: Restore Cloud Run traffic snapshot after failed promotion
if: >-
Expand Down
154 changes: 0 additions & 154 deletions app/lib/pages/conversation_detail/page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -385,21 +385,6 @@ class _ConversationDetailPageState extends State<ConversationDetailPage> with Ti
case 'download_audio':
await _downloadAudio(context, provider);
break;
// case 'export_transcript':
// showShareBottomSheet(context, provider.conversation, (fn) {});
// break;
// case 'export_summary':
// showShareBottomSheet(context, provider.conversation, (fn) {});
// break;
// case 'copy_raw_transcript':
// _copyContent(context, provider.conversation.getTranscript());
// break;
// case 'copy_conversation_raw':
// _copyContent(context, provider.conversation.toJson().toString());
// break;
// case 'trigger_integration':
// _triggerWebhookIntegration(context, provider.conversation);
// break;
case 'test_prompt':
routeToPage(context, TestPromptsPage(conversation: provider.conversation));
break;
Expand Down Expand Up @@ -657,41 +642,6 @@ class _ConversationDetailPageState extends State<ConversationDetailPage> with Ti
}
}

// void _triggerWebhookIntegration(BuildContext context, ServerConversation conversation) {
// if (SharedPreferencesUtil().webhookOnConversationCreated.isEmpty) {
// showDialog(
// context: context,
// builder: (c) => getDialog(
// context,
// () => Navigator.pop(context),
// () {
// Navigator.pop(context);
// routeToPage(context, const DeveloperSettingsPage());
// },
// 'Webhook URL not set',
// 'Please set the webhook URL in developer settings to use this feature.',
// okButtonText: 'Settings',
// ),
// );
// return;
// }
//
// webhookOnConversationCreatedCall(conversation, returnRawBody: true).then((response) {
// showDialog(
// context: context,
// builder: (c) => getDialog(
// context,
// () => Navigator.pop(context),
// () => Navigator.pop(context),
// 'Result:',
// response,
// okButtonText: 'Ok',
// singleButton: true,
// ),
// );
// });
// }

@override
Widget build(BuildContext context) {
// Empty shell on first build (before initState's setCachedConversation
Expand Down Expand Up @@ -1215,110 +1165,6 @@ class _ConversationDetailPageState extends State<ConversationDetailPage> with Ti
),
),

// thinh's comment: temporary disabled
//// Unassigned segments notification - positioned above the bottom bar
//Positioned(
// bottom: 88, // Position above the bottom bar
// left: 16,
// right: 16,
// child: Selector<ConversationDetailProvider, ({bool shouldShow, int count})>(
// selector: (context, provider) {
// final conversation = provider.conversation;
// if (conversation == null) {
// return (
// count: 0,
// shouldShow: false,
// );
// }
// return (
// count: conversation.unassignedSegmentsLength(),
// shouldShow: provider.showUnassignedFloatingButton && (selectedTab == ConversationTab.transcript),
// );
// },
// builder: (context, value, child) {
// if (value.count == 0 || !value.shouldShow) return const SizedBox.shrink();
// return Container(
// padding: const EdgeInsets.symmetric(
// vertical: 8,
// horizontal: 16,
// ),
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(16),
// color: const Color(0xFF1F1F25),
// boxShadow: [
// BoxShadow(
// color: Colors.black.withValues(alpha: 0.3),
// spreadRadius: 1,
// blurRadius: 2,
// offset: const Offset(0, 1),
// ),
// ],
// ),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Row(
// children: [
// InkWell(
// onTap: () {
// var provider = Provider.of<ConversationDetailProvider>(context, listen: false);
// provider.setShowUnassignedFloatingButton(false);
// },
// child: const Icon(
// Icons.close,
// color: Colors.white,
// ),
// ),
// const SizedBox(width: 8),
// Text(
// "${value.count} unassigned segment${value.count == 1 ? '' : 's'}",
// style: const TextStyle(
// color: Colors.white,
// fontSize: 16,
// ),
// ),
// ],
// ),
// ElevatedButton(
// style: ElevatedButton.styleFrom(
// backgroundColor: Colors.deepPurple.withValues(alpha: 0.5),
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(16),
// ),
// ),
// onPressed: () {
// var provider = Provider.of<ConversationDetailProvider>(context, listen: false);
// var speakerId = provider.conversation.speakerWithMostUnassignedSegments();
// var segmentIdx = provider.conversation.firstSegmentIndexForSpeaker(speakerId);
// showModalBottomSheet(
// context: context,
// isScrollControlled: true,
// backgroundColor: Colors.black,
// shape: const RoundedRectangleBorder(
// borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
// ),
// builder: (context) {
// return NameSpeakerBottomSheet(
// segmentIdx: segmentIdx,
// speakerId: speakerId,
// );
// },
// );
// },
// child: const Text(
// "Tag",
// style: TextStyle(
// color: Colors.white,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// ],
// ),
// );
// },
// ),
//),
// Search overlay
if (_isSearching)
Positioned(
Expand Down
21 changes: 4 additions & 17 deletions app/lib/pages/conversations/auto_sync_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import 'package:omi/utils/other/temp.dart';
import 'package:omi/utils/sync_confirmation.dart';
import 'synced_conversations_page.dart';
import 'wal_item_detail/wal_item_detail_page.dart';
import 'package:omi/pages/conversations/widgets/status_action_pill.dart';

class AutoSyncPage extends StatefulWidget {
const AutoSyncPage({super.key});
Expand Down Expand Up @@ -175,7 +176,7 @@ class _AutoSyncPageState extends State<AutoSyncPage> {
default:
title = s.isFetchingConversations ? l.syncCardProcessing : l.syncCardUploadingTitle;
}
action = _statusActionPill(l.cancel, Colors.redAccent, () => _confirmCancel(context, p));
action = statusActionPill(l.cancel, Colors.redAccent, () => _confirmCancel(context, p));
} else if (p.isRateLimited) {
title = syncCooldownTitle(p.rateLimitReason, l);
titleColor = Colors.orangeAccent;
Expand All @@ -188,12 +189,12 @@ class _AutoSyncPageState extends State<AutoSyncPage> {
} else if (attention > 0) {
title = l.syncCardNeedsAttention(attention);
titleColor = Colors.orangeAccent;
action = _statusActionPill(l.sync, Colors.deepPurpleAccent, () async {
action = statusActionPill(l.sync, Colors.deepPurpleAccent, () async {
if (await confirmSyncForCustomStt(context) && context.mounted) p.syncWals();
});
} else if (readyToBackUp > 0) {
title = l.syncCardReadyCount(readyToBackUp);
action = _statusActionPill(l.sync, Colors.deepPurpleAccent, () async {
action = statusActionPill(l.sync, Colors.deepPurpleAccent, () async {
if (await confirmSyncForCustomStt(context) && context.mounted) p.syncWals();
});
} else if (hasAnyRecording) {
Expand Down Expand Up @@ -249,20 +250,6 @@ class _AutoSyncPageState extends State<AutoSyncPage> {
);
}

Widget _statusActionPill(String label, Color color, VoidCallback onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 7),
decoration: BoxDecoration(color: color.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(100)),
child: Text(
label,
style: TextStyle(color: color, fontSize: 13, fontWeight: FontWeight.w500),
),
),
);
}

// ─────────────────────────────────────────
// Conversations created
// ─────────────────────────────────────────
Expand Down
25 changes: 6 additions & 19 deletions app/lib/pages/conversations/sync_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import 'local_storage_page.dart';
import 'private_cloud_sync_page.dart';
import 'synced_conversations_page.dart';
import 'wal_item_detail/wal_item_detail_page.dart';
import 'package:omi/pages/conversations/widgets/status_action_pill.dart';

Widget _buildFaIcon(FaIconData icon, {double size = 18, Color color = const Color(0xFF8E8E93)}) {
return Padding(
Expand Down Expand Up @@ -516,12 +517,12 @@ class _SyncPageState extends State<SyncPage> {
case SyncPhase.downloadingFromDevice:
title = l.syncCardDownloadingTitle;
subtitle = _progressLine(s, speedStr);
action = _statusActionPill(l.cancel, Colors.redAccent, () => _showCancelSyncDialog(context, syncProvider));
action = statusActionPill(l.cancel, Colors.redAccent, () => _showCancelSyncDialog(context, syncProvider));
break;
case SyncPhase.uploadingToCloud:
title = l.syncCardUploadingTitle;
subtitle = _progressLine(s, null);
action = _statusActionPill(l.cancel, Colors.redAccent, () => _showCancelSyncDialog(context, syncProvider));
action = statusActionPill(l.cancel, Colors.redAccent, () => _showCancelSyncDialog(context, syncProvider));
break;
case SyncPhase.processingOnServer:
title = l.syncCardProcessing;
Expand All @@ -535,7 +536,7 @@ class _SyncPageState extends State<SyncPage> {
title = l.syncCardUploadingTitle;
subtitle = _progressLine(s, speedStr);
if (syncProvider.isSdCardSyncing) {
action = _statusActionPill(l.cancel, Colors.redAccent, () => _showCancelSyncDialog(context, syncProvider));
action = statusActionPill(l.cancel, Colors.redAccent, () => _showCancelSyncDialog(context, syncProvider));
}
break;
}
Expand All @@ -548,7 +549,7 @@ class _SyncPageState extends State<SyncPage> {
subtitle = l.syncProcessingBackgroundHint;
} else if (readyToSync > 0) {
title = l.syncCardReadyCount(readyToSync);
action = _statusActionPill(l.sync, Colors.deepPurpleAccent, () {
action = statusActionPill(l.sync, Colors.deepPurpleAccent, () {
if (context.read<ConnectivityProvider>().isConnected) {
_handleSyncWals(context, syncProvider);
} else {
Expand Down Expand Up @@ -616,20 +617,6 @@ class _SyncPageState extends State<SyncPage> {
return parts.isEmpty ? null : parts.join(' · ');
}

Widget _statusActionPill(String label, Color color, VoidCallback onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 7),
decoration: BoxDecoration(color: color.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(100)),
child: Text(
label,
style: TextStyle(color: color, fontSize: 13, fontWeight: FontWeight.w500),
),
),
);
}

Widget _buildSyncErrorCard(SyncProvider syncProvider) {
final errorMessage = syncProvider.syncError!;
return Container(
Expand All @@ -652,7 +639,7 @@ class _SyncPageState extends State<SyncPage> {
),
),
const SizedBox(width: 8),
_statusActionPill(context.l10n.retry, Colors.redAccent, () => syncProvider.retrySync()),
statusActionPill(context.l10n.retry, Colors.redAccent, () => syncProvider.retrySync()),
],
),
);
Expand Down
15 changes: 15 additions & 0 deletions app/lib/pages/conversations/widgets/status_action_pill.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:flutter/material.dart';

Widget statusActionPill(String label, Color color, VoidCallback onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 7),
decoration: BoxDecoration(color: color.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(100)),
child: Text(
label,
style: TextStyle(color: color, fontSize: 13, fontWeight: FontWeight.w500),
),
),
);
}
56 changes: 1 addition & 55 deletions app/lib/pages/home/page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -787,62 +787,8 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver, Ticker
connectivityProvider.isInitialized &&
connectivityProvider.previousConnection != isConnected) {
previousConnection = isConnected;
if (!isConnected) {
// TODO: Re-enable when internet connection banners are redesigned
// Future.delayed(const Duration(seconds: 2), () {
// if (mounted && !connectivityProvider.isConnected) {
// ScaffoldMessenger.of(ctx).showMaterialBanner(
// MaterialBanner(
// content: const Text(
// 'No internet connection. Please check your connection.',
// style: TextStyle(color: Colors.white70),
// ),
// backgroundColor: const Color(0xFF424242), // Dark gray instead of red
// leading: const Icon(Icons.wifi_off, color: Colors.white70),
// actions: [
// TextButton(
// onPressed: () {
// ScaffoldMessenger.of(ctx).hideCurrentMaterialBanner();
// },
// child: const Text('Dismiss', style: TextStyle(color: Colors.white70)),
// ),
// ],
// ),
// );
// }
// });
} else {
if (isConnected) {
Future.delayed(Duration.zero, () {
// TODO: Re-enable when internet connection banners are redesigned
// if (mounted) {
// ScaffoldMessenger.of(ctx).hideCurrentMaterialBanner();
// ScaffoldMessenger.of(ctx).showMaterialBanner(
// MaterialBanner(
// content: const Text(
// 'Internet connection is restored.',
// style: TextStyle(color: Colors.white),
// ),
// backgroundColor: const Color(0xFF2E7D32), // Dark green instead of bright green
// leading: const Icon(Icons.wifi, color: Colors.white),
// actions: [
// TextButton(
// onPressed: () {
// if (mounted) {
// ScaffoldMessenger.of(ctx).hideCurrentMaterialBanner();
// }
// },
// child: const Text('Dismiss', style: TextStyle(color: Colors.white)),
// ),
// ],
// onVisible: () => Future.delayed(const Duration(seconds: 3), () {
// if (mounted) {
// ScaffoldMessenger.of(ctx).hideCurrentMaterialBanner();
// }
// }),
// ),
// );
// }

WidgetsBinding.instance.addPostFrameCallback((_) async {
if (!mounted) return;

Expand Down
Loading