@agent-native/core 0.90.3 → 0.90.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/bin/agent-native.js +25 -3
  2. package/corpus/README.md +1 -1
  3. package/corpus/core/CHANGELOG.md +9 -0
  4. package/corpus/core/bin/agent-native.js +25 -3
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/agent/engine/index.ts +1 -0
  7. package/corpus/core/src/agent/engine/registry.ts +63 -2
  8. package/corpus/core/src/cli/create.ts +35 -0
  9. package/corpus/core/src/cli/design-connect.ts +248 -0
  10. package/corpus/core/src/cli/index.ts +84 -7
  11. package/corpus/core/src/cli/workspacify.ts +34 -0
  12. package/corpus/core/src/client/history/VersionHistoryPanel.tsx +77 -47
  13. package/corpus/core/src/client/history/index.ts +3 -0
  14. package/corpus/core/src/client/history/use-history.ts +28 -0
  15. package/corpus/core/src/client/index.ts +8 -0
  16. package/corpus/core/src/client/review/index.ts +5 -0
  17. package/corpus/core/src/client/review/use-review.ts +40 -2
  18. package/corpus/core/src/history/actions/create-resource-version.ts +11 -8
  19. package/corpus/core/src/history/index.ts +0 -1
  20. package/corpus/core/src/history/registry.ts +24 -12
  21. package/corpus/core/src/history/store.ts +84 -53
  22. package/corpus/core/src/review/actions/consume-review-feedback.ts +15 -5
  23. package/corpus/core/src/review/actions/delete-review-comment.ts +15 -3
  24. package/corpus/core/src/review/actions/resolve-review-thread.ts +12 -5
  25. package/corpus/core/src/review/index.ts +0 -5
  26. package/corpus/core/src/review/registry.ts +24 -12
  27. package/corpus/core/src/review/store.ts +10 -7
  28. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  29. package/corpus/core/src/server/credential-provider.ts +13 -3
  30. package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +11 -11
  31. package/corpus/templates/assets/actions/generate-image.ts +64 -28
  32. package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +1 -1
  33. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +91 -74
  34. package/corpus/templates/assets/server/lib/generation.ts +29 -4
  35. package/corpus/templates/assets/server/lib/image-processing.ts +131 -0
  36. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +24 -2
  37. package/corpus/templates/calendar/AGENTS.md +3 -0
  38. package/corpus/templates/calendar/actions/create-event.ts +8 -34
  39. package/corpus/templates/calendar/actions/event-action-helpers.ts +52 -0
  40. package/corpus/templates/calendar/actions/manage-event-draft.ts +7 -34
  41. package/corpus/templates/calendar/actions/update-event.ts +10 -23
  42. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +47 -0
  43. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +23 -0
  44. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +59 -2
  45. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +40 -1
  46. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +34 -1
  47. package/corpus/templates/calendar/app/hooks/use-events.ts +6 -0
  48. package/corpus/templates/calendar/app/i18n/zh-TW.ts +4 -0
  49. package/corpus/templates/calendar/app/i18n-data.ts +40 -0
  50. package/corpus/templates/calendar/changelog/2026-07-07-you-can-mark-event-guests-as-optional-while-inviting-them-or.md +6 -0
  51. package/corpus/templates/calendar/server/handlers/events.ts +1 -0
  52. package/corpus/templates/calendar/server/lib/google-calendar.ts +4 -0
  53. package/corpus/templates/calendar/server/plugins/agent-chat.ts +1 -1
  54. package/corpus/templates/calendar/shared/api.ts +2 -0
  55. package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +29 -3
  56. package/corpus/templates/clips/actions/generate-workflow.ts +19 -8
  57. package/corpus/templates/clips/actions/get-clips-ai-prefs.ts +36 -0
  58. package/corpus/templates/clips/actions/lib/clips-ai-prefs.ts +28 -0
  59. package/corpus/templates/clips/actions/regenerate-chapters.ts +21 -7
  60. package/corpus/templates/clips/actions/regenerate-summary.ts +26 -8
  61. package/corpus/templates/clips/actions/regenerate-title.ts +44 -7
  62. package/corpus/templates/clips/actions/update-clips-ai-prefs.ts +50 -0
  63. package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +7 -2
  64. package/corpus/templates/clips/app/hooks/use-auto-title.ts +25 -10
  65. package/corpus/templates/clips/app/i18n/ar-SA.ts +28 -6
  66. package/corpus/templates/clips/app/i18n/de-DE.ts +28 -6
  67. package/corpus/templates/clips/app/i18n/en-US.ts +29 -6
  68. package/corpus/templates/clips/app/i18n/es-ES.ts +29 -6
  69. package/corpus/templates/clips/app/i18n/fr-FR.ts +30 -6
  70. package/corpus/templates/clips/app/i18n/hi-IN.ts +26 -6
  71. package/corpus/templates/clips/app/i18n/ja-JP.ts +27 -6
  72. package/corpus/templates/clips/app/i18n/ko-KR.ts +28 -6
  73. package/corpus/templates/clips/app/i18n/pt-BR.ts +28 -6
  74. package/corpus/templates/clips/app/i18n/zh-CN.ts +26 -6
  75. package/corpus/templates/clips/app/i18n/zh-TW.ts +25 -6
  76. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +73 -0
  77. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +1 -0
  78. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +70 -2
  79. package/corpus/templates/clips/changelog/2026-07-07-ai-tools-can-include-the-full-video-not-just-the-transcript-.md +6 -0
  80. package/corpus/templates/clips/changelog/2026-07-07-clips-desktop-now-surfaces-meetings-and-dictate-directly-in-.md +6 -0
  81. package/corpus/templates/clips/changelog/2026-07-07-meeting-notes-now-explain-exactly-how-to-start-granola-style.md +6 -0
  82. package/corpus/templates/clips/changelog/2026-07-07-meeting-start-alerts-now-include-separate-start-notes-and-jo.md +6 -0
  83. package/corpus/templates/clips/changelog/2026-07-07-recordings-start-more-predictably-and-newly-saved-clips-refr.md +6 -0
  84. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  85. package/corpus/templates/clips/desktop/src/app.tsx +435 -105
  86. package/corpus/templates/clips/desktop/src/lib/recorder.ts +27 -21
  87. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -22
  88. package/corpus/templates/clips/desktop/src/styles.css +167 -2
  89. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1 -1
  90. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +3 -7
  91. package/corpus/templates/clips/desktop/src-tauri/src/tray_meetings.rs +5 -4
  92. package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.put.ts +16 -8
  93. package/corpus/templates/clips/shared/clips-ai-prefs.ts +81 -0
  94. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +16 -1
  95. package/corpus/templates/design/actions/add-localhost-screens.ts +1 -0
  96. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -11
  97. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +89 -14
  98. package/corpus/templates/design/app/components/design/bridge-security.ts +7 -1
  99. package/corpus/templates/design/app/components/design/multi-screen/types.ts +1 -1
  100. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  101. package/corpus/templates/design/app/i18n-data.ts +41 -0
  102. package/corpus/templates/design/changelog/2026-07-07-local-visual-edit-uses-live-app-iframes-for-click-to-edit-pr.md +6 -0
  103. package/dist/agent/engine/index.d.ts +1 -1
  104. package/dist/agent/engine/index.d.ts.map +1 -1
  105. package/dist/agent/engine/index.js +1 -1
  106. package/dist/agent/engine/index.js.map +1 -1
  107. package/dist/agent/engine/registry.d.ts +14 -0
  108. package/dist/agent/engine/registry.d.ts.map +1 -1
  109. package/dist/agent/engine/registry.js +56 -2
  110. package/dist/agent/engine/registry.js.map +1 -1
  111. package/dist/cli/create.d.ts.map +1 -1
  112. package/dist/cli/create.js +31 -0
  113. package/dist/cli/create.js.map +1 -1
  114. package/dist/cli/design-connect.d.ts.map +1 -1
  115. package/dist/cli/design-connect.js +186 -0
  116. package/dist/cli/design-connect.js.map +1 -1
  117. package/dist/cli/index.js +76 -9
  118. package/dist/cli/index.js.map +1 -1
  119. package/dist/cli/workspacify.d.ts.map +1 -1
  120. package/dist/cli/workspacify.js +30 -0
  121. package/dist/cli/workspacify.js.map +1 -1
  122. package/dist/client/history/VersionHistoryPanel.d.ts +1 -1
  123. package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -1
  124. package/dist/client/history/VersionHistoryPanel.js +12 -5
  125. package/dist/client/history/VersionHistoryPanel.js.map +1 -1
  126. package/dist/client/history/index.d.ts +1 -1
  127. package/dist/client/history/index.d.ts.map +1 -1
  128. package/dist/client/history/index.js +1 -1
  129. package/dist/client/history/index.js.map +1 -1
  130. package/dist/client/history/use-history.d.ts +12 -0
  131. package/dist/client/history/use-history.d.ts.map +1 -1
  132. package/dist/client/history/use-history.js +6 -0
  133. package/dist/client/history/use-history.js.map +1 -1
  134. package/dist/client/index.d.ts +2 -2
  135. package/dist/client/index.d.ts.map +1 -1
  136. package/dist/client/index.js +2 -2
  137. package/dist/client/index.js.map +1 -1
  138. package/dist/client/review/index.d.ts +1 -1
  139. package/dist/client/review/index.d.ts.map +1 -1
  140. package/dist/client/review/index.js +1 -1
  141. package/dist/client/review/index.js.map +1 -1
  142. package/dist/client/review/use-review.d.ts +23 -0
  143. package/dist/client/review/use-review.d.ts.map +1 -1
  144. package/dist/client/review/use-review.js +8 -0
  145. package/dist/client/review/use-review.js.map +1 -1
  146. package/dist/collab/awareness.d.ts +2 -2
  147. package/dist/collab/awareness.d.ts.map +1 -1
  148. package/dist/collab/routes.d.ts +1 -1
  149. package/dist/history/actions/create-resource-version.js +7 -4
  150. package/dist/history/actions/create-resource-version.js.map +1 -1
  151. package/dist/history/index.d.ts +1 -1
  152. package/dist/history/index.d.ts.map +1 -1
  153. package/dist/history/index.js +1 -1
  154. package/dist/history/index.js.map +1 -1
  155. package/dist/history/registry.d.ts.map +1 -1
  156. package/dist/history/registry.js +14 -12
  157. package/dist/history/registry.js.map +1 -1
  158. package/dist/history/store.d.ts.map +1 -1
  159. package/dist/history/store.js +74 -49
  160. package/dist/history/store.js.map +1 -1
  161. package/dist/observability/routes.d.ts +3 -3
  162. package/dist/progress/routes.d.ts +1 -1
  163. package/dist/review/actions/consume-review-feedback.d.ts +1 -0
  164. package/dist/review/actions/consume-review-feedback.js +8 -2
  165. package/dist/review/actions/consume-review-feedback.js.map +1 -1
  166. package/dist/review/actions/delete-review-comment.d.ts +2 -1
  167. package/dist/review/actions/delete-review-comment.js +11 -3
  168. package/dist/review/actions/delete-review-comment.js.map +1 -1
  169. package/dist/review/actions/resolve-review-thread.d.ts +2 -1
  170. package/dist/review/actions/resolve-review-thread.js +5 -2
  171. package/dist/review/actions/resolve-review-thread.js.map +1 -1
  172. package/dist/review/index.d.ts +1 -1
  173. package/dist/review/index.d.ts.map +1 -1
  174. package/dist/review/index.js +1 -1
  175. package/dist/review/index.js.map +1 -1
  176. package/dist/review/registry.d.ts.map +1 -1
  177. package/dist/review/registry.js +14 -12
  178. package/dist/review/registry.js.map +1 -1
  179. package/dist/review/store.d.ts +3 -3
  180. package/dist/review/store.d.ts.map +1 -1
  181. package/dist/review/store.js +7 -4
  182. package/dist/review/store.js.map +1 -1
  183. package/dist/secrets/routes.d.ts +9 -9
  184. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  185. package/dist/server/agent-chat-plugin.js +5 -0
  186. package/dist/server/agent-chat-plugin.js.map +1 -1
  187. package/dist/server/credential-provider.d.ts +2 -0
  188. package/dist/server/credential-provider.d.ts.map +1 -1
  189. package/dist/server/credential-provider.js +13 -3
  190. package/dist/server/credential-provider.js.map +1 -1
  191. package/package.json +1 -1
@@ -205,6 +205,11 @@ const messages = {
205
205
  edit: "編集",
206
206
  aiTools: "AIツール",
207
207
  enhanceRecording: "この録音を強化する",
208
+ includeFullVideo: "動画全体を含める",
209
+ includeFullVideoDescription:
210
+ "オンにすると、AIツールは画面の文脈のために録画を視聴します(Geminiのみ)— 音声の文字起こしだけではありません。デフォルトのタイトルと説明の生成にも適用されます。Builder または GEMINI_API_KEY 経由の Gemini モデルが必要です。",
211
+ includeFullVideoOn: "AIツールは動画全体を使います(Gemini)",
212
+ includeFullVideoOff: "AIツールは文字起こしのみを使います",
208
213
  regenerateTitle: "タイトルを再生成する",
209
214
  regenerateDescription: "説明を再生成する",
210
215
  autoChapters: "自動チャプター",
@@ -331,7 +336,7 @@ const messages = {
331
336
  removing: "削除中...",
332
337
  remove: "取り除く",
333
338
  desktopHint:
334
- "Clips デスクトップ アプリからこの会議のライブ メモを記録します。トランスクリプトと AI メモがここに自動的に表示されます。",
339
+ "メモを開始するには、メニューバーから Clips Desktop を開いて Start Meeting Notes を選ぶか、リマインダーが表示されたら Start notes をクリックします。Clips はマイクとシステム音声を取り込み、ここに文字起こしを書き込みます。",
335
340
  getDesktopApp: "デスクトップアプリを入手",
336
341
  generateNotesFailed:
337
342
  "メモを生成できませんでした。もう一度やり直してください。",
@@ -1004,7 +1009,11 @@ Clips のユーザー向けの主な変更はここに記録されます。コ
1004
1009
  inHours: "{{count}}時間後",
1005
1010
  join: "参加",
1006
1011
  openNotes: "ノートを開く",
1007
- open: "開く",
1012
+ open: "ノートを開く",
1013
+ startFromDesktopNow:
1014
+ "デスクトップのリマインダーまたはメニューバーからライブメモを開始します。",
1015
+ startFromDesktopLater:
1016
+ "時間になると Clips Desktop に Start notes が表示されます。",
1008
1017
  },
1009
1018
  transcriptBubbles: {
1010
1019
  listening: "聞き取り中…",
@@ -1441,10 +1450,10 @@ Clips のユーザー向けの主な変更はここに記録されます。コ
1441
1450
  "Google Calendar needs to be reconnected to keep showing your upcoming meetings. (ローカライズ済み)",
1442
1451
  connectGoogleCalendar: "Connect Google Calendar (ローカライズ済み)",
1443
1452
  desktopReminder:
1444
- "Get a desktop reminder when meetings start so recorded notes land in this history automatically. (ローカライズ済み)",
1453
+ "Connect Google Calendar, keep Clips Desktop open, then click Start notes from the reminder or the menu bar when your meeting begins. (ローカライズ済み)",
1445
1454
  getDesktopApp: "Get desktop app (ローカライズ済み)",
1446
1455
  requiredForReminders:
1447
- "Required for meeting reminders and transcription. (ローカライズ済み)",
1456
+ "Desktop captures mic + system audio for meeting transcription. (ローカライズ済み)",
1448
1457
  calendarConnected: "Calendar connected (ローカライズ済み)",
1449
1458
  calendarDisconnected: "Calendar disconnected (ローカライズ済み)",
1450
1459
  calendarSettings: "Calendar settings (ローカライズ済み)",
@@ -1454,14 +1463,26 @@ Clips のユーザー向けの主な変更はここに記録されます。コ
1454
1463
  "Disconnect Google Calendar? (ローカライズ済み)",
1455
1464
  title: "Meetings (ローカライズ済み)",
1456
1465
  intro:
1457
- "Upcoming calendar meetings and your recorded notes. (ローカライズ済み)",
1466
+ "Upcoming calendar meetings and your recorded notes. Start live notes from Clips Desktop at meeting time. (ローカライズ済み)",
1458
1467
  searchPlaceholder: "Search meetings... (ローカライズ済み)",
1459
1468
  clearSearch: "Clear search (ローカライズ済み)",
1460
1469
  noMeetingsYet: "No meetings yet (ローカライズ済み)",
1461
1470
  noMeetingsDescription:
1462
- "Upcoming calendar meetings show up here, and finished recordings land here once you take notes. (ローカライズ済み)",
1471
+ "Connect your calendar and keep Clips Desktop open. When a meeting starts, use Start notes from the reminder or menu bar. (ローカライズ済み)",
1463
1472
  noMeetingsMatch: 'No meetings match "{{query}}" (ローカライズ済み)',
1464
1473
  refreshing: "Refreshing… (ローカライズ済み)",
1474
+ howToTriggerTitle: "How to trigger meeting notes (ローカライズ済み)",
1475
+ howToTriggerDescription:
1476
+ "Meeting notes are the Granola-style flow in Clips: calendar events appear here, the desktop app captures mic and system audio, and the transcript plus AI notes land back in this history. (ローカライズ済み)",
1477
+ guideCalendarTitle: "Connect Google Calendar (ローカライズ済み)",
1478
+ guideCalendarDescription:
1479
+ "Meetings are pulled from your calendar so Clips knows when to remind you. (ローカライズ済み)",
1480
+ guideDesktopTitle: "Keep Clips Desktop open (ローカライズ済み)",
1481
+ guideDesktopDescription:
1482
+ "Desktop capture is required for mic plus system-audio transcription. (ローカライズ済み)",
1483
+ guideStartTitle: "Click Start notes (ローカライズ済み)",
1484
+ guideStartDescription:
1485
+ "Use the desktop reminder or the menu-bar Start Meeting Notes item when the call begins. (ローカライズ済み)",
1465
1486
  },
1466
1487
  };
1467
1488
 
@@ -201,6 +201,11 @@ const messages = {
201
201
  edit: "편집",
202
202
  aiTools: "AI 도구",
203
203
  enhanceRecording: "이 녹음 품질을 향상하세요",
204
+ includeFullVideo: "전체 동영상 포함",
205
+ includeFullVideoDescription:
206
+ "켜면 AI 도구가 녹화(Gemini 전용)를 시청해 화면 맥락을 파악합니다 — 오디오 스크립트만 사용하지 않습니다. 기본 제목 및 설명 생성에도 적용됩니다. Builder 또는 GEMINI_API_KEY를 통한 Gemini 모델이 필요합니다.",
207
+ includeFullVideoOn: "AI 도구가 전체 동영상을 사용합니다 (Gemini)",
208
+ includeFullVideoOff: "AI 도구가 스크립트만 사용합니다",
204
209
  regenerateTitle: "제목 재생성",
205
210
  regenerateDescription: "설명 재생성",
206
211
  autoChapters: "자동 챕터",
@@ -327,7 +332,7 @@ const messages = {
327
332
  removing: "풀이...",
328
333
  remove: "제거하다",
329
334
  desktopHint:
330
- "Clips 데스크톱 앱에서 회의에 대한 실시간 메모를 녹음하세요. 대화 내용과 AI 메모가 여기에 자동으로 표시됩니다.",
335
+ "메모를 시작하려면 메뉴 막대에서 Clips Desktop을 열고 Start Meeting Notes를 선택하거나, 알림이 표시되면 Start notes를 클릭하세요. Clips가 마이크와 시스템 오디오를 캡처하고 여기에 기록을 작성합니다.",
331
336
  getDesktopApp: "데스크톱 앱 받기",
332
337
  generateNotesFailed: "메모를 생성할 수 없습니다. 다시 시도해 보세요.",
333
338
  attendee_one: "{{count}} 참석자",
@@ -993,7 +998,11 @@ Clips의 모든 사용자 대상 변경 사항은 여기에 기록됩니다. 명
993
998
  inHours: "{{count}}시간 후",
994
999
  join: "참가",
995
1000
  openNotes: "노트 열기",
996
- open: "열기",
1001
+ open: "노트 열기",
1002
+ startFromDesktopNow:
1003
+ "데스크톱 알림 또는 메뉴 막대에서 실시간 메모를 시작하세요.",
1004
+ startFromDesktopLater:
1005
+ "시간이 되면 Clips Desktop에 Start notes가 표시됩니다.",
997
1006
  },
998
1007
  transcriptBubbles: {
999
1008
  listening: "듣는 중…",
@@ -1427,10 +1436,10 @@ Clips의 모든 사용자 대상 변경 사항은 여기에 기록됩니다. 명
1427
1436
  "Google Calendar needs to be reconnected to keep showing your upcoming meetings. (현지화됨)",
1428
1437
  connectGoogleCalendar: "Connect Google Calendar (현지화됨)",
1429
1438
  desktopReminder:
1430
- "Get a desktop reminder when meetings start so recorded notes land in this history automatically. (현지화됨)",
1439
+ "Connect Google Calendar, keep Clips Desktop open, then click Start notes from the reminder or the menu bar when your meeting begins. (현지화됨)",
1431
1440
  getDesktopApp: "Get desktop app (현지화됨)",
1432
1441
  requiredForReminders:
1433
- "Required for meeting reminders and transcription. (현지화됨)",
1442
+ "Desktop captures mic + system audio for meeting transcription. (현지화됨)",
1434
1443
  calendarConnected: "Calendar connected (현지화됨)",
1435
1444
  calendarDisconnected: "Calendar disconnected (현지화됨)",
1436
1445
  calendarSettings: "Calendar settings (현지화됨)",
@@ -1438,14 +1447,27 @@ Clips의 모든 사용자 대상 변경 사항은 여기에 기록됩니다. 명
1438
1447
  "Connect Google Calendar for meeting reminders. (현지화됨)",
1439
1448
  disconnectGoogleCalendarTitle: "Disconnect Google Calendar? (현지화됨)",
1440
1449
  title: "Meetings (현지화됨)",
1441
- intro: "Upcoming calendar meetings and your recorded notes. (현지화됨)",
1450
+ intro:
1451
+ "Upcoming calendar meetings and your recorded notes. Start live notes from Clips Desktop at meeting time. (현지화됨)",
1442
1452
  searchPlaceholder: "Search meetings... (현지화됨)",
1443
1453
  clearSearch: "Clear search (현지화됨)",
1444
1454
  noMeetingsYet: "No meetings yet (현지화됨)",
1445
1455
  noMeetingsDescription:
1446
- "Upcoming calendar meetings show up here, and finished recordings land here once you take notes. (현지화됨)",
1456
+ "Connect your calendar and keep Clips Desktop open. When a meeting starts, use Start notes from the reminder or menu bar. (현지화됨)",
1447
1457
  noMeetingsMatch: 'No meetings match "{{query}}" (현지화됨)',
1448
1458
  refreshing: "Refreshing… (현지화됨)",
1459
+ howToTriggerTitle: "How to trigger meeting notes (현지화됨)",
1460
+ howToTriggerDescription:
1461
+ "Meeting notes are the Granola-style flow in Clips: calendar events appear here, the desktop app captures mic and system audio, and the transcript plus AI notes land back in this history. (현지화됨)",
1462
+ guideCalendarTitle: "Connect Google Calendar (현지화됨)",
1463
+ guideCalendarDescription:
1464
+ "Meetings are pulled from your calendar so Clips knows when to remind you. (현지화됨)",
1465
+ guideDesktopTitle: "Keep Clips Desktop open (현지화됨)",
1466
+ guideDesktopDescription:
1467
+ "Desktop capture is required for mic plus system-audio transcription. (현지화됨)",
1468
+ guideStartTitle: "Click Start notes (현지화됨)",
1469
+ guideStartDescription:
1470
+ "Use the desktop reminder or the menu-bar Start Meeting Notes item when the call begins. (현지화됨)",
1449
1471
  },
1450
1472
  };
1451
1473
 
@@ -204,6 +204,11 @@ const messages = {
204
204
  edit: "Editar",
205
205
  aiTools: "Ferramentas de IA",
206
206
  enhanceRecording: "Melhore esta gravação",
207
+ includeFullVideo: "Incluir vídeo completo",
208
+ includeFullVideoDescription:
209
+ "Quando ativado, as ferramentas de IA assistem à gravação (somente Gemini) para contexto na tela — não só a transcrição de áudio. Também se aplica à geração padrão de título e descrição. Requer um modelo Gemini via Builder ou GEMINI_API_KEY.",
210
+ includeFullVideoOn: "As ferramentas de IA usarão o vídeo completo (Gemini)",
211
+ includeFullVideoOff: "As ferramentas de IA usarão só a transcrição",
207
212
  regenerateTitle: "Regenerar título",
208
213
  regenerateDescription: "Regenerar descrição",
209
214
  autoChapters: "Capítulos automáticos",
@@ -332,7 +337,7 @@ const messages = {
332
337
  removing: "Removendo...",
333
338
  remove: "Remover",
334
339
  desktopHint:
335
- "Grave notas ao vivo para esta reunião no aplicativo de desktop Clips a transcrição e as notas de IA aparecerão aqui automaticamente.",
340
+ "Para iniciar notas, abra o Clips Desktop na barra de menus e escolha Start Meeting Notes, ou clique em Start notes quando o lembrete aparecer. O Clips captura o microfone e o áudio do sistema e escreve a transcrição aqui.",
336
341
  getDesktopApp: "Obtenha o aplicativo para desktop",
337
342
  generateNotesFailed: "Não foi possível gerar notas. Tente novamente.",
338
343
  attendee_one: "participante {{count}}",
@@ -1011,7 +1016,11 @@ Todas as mudanças visíveis para usuários do Clips são documentadas aqui. Voc
1011
1016
  inHours: "em {{count}} h",
1012
1017
  join: "Entrar",
1013
1018
  openNotes: "Abrir notas",
1014
- open: "Abrir",
1019
+ open: "Abrir notas",
1020
+ startFromDesktopNow:
1021
+ "Inicie notas ao vivo pelo lembrete do desktop ou pela barra de menus.",
1022
+ startFromDesktopLater:
1023
+ "O Clips Desktop mostrará Start notes quando chegar a hora.",
1015
1024
  },
1016
1025
  transcriptBubbles: {
1017
1026
  listening: "Ouvindo…",
@@ -1446,10 +1455,10 @@ Todas as mudanças visíveis para usuários do Clips são documentadas aqui. Voc
1446
1455
  "Google Calendar needs to be reconnected to keep showing your upcoming meetings. (Localizado)",
1447
1456
  connectGoogleCalendar: "Connect Google Calendar (Localizado)",
1448
1457
  desktopReminder:
1449
- "Get a desktop reminder when meetings start so recorded notes land in this history automatically. (Localizado)",
1458
+ "Connect Google Calendar, keep Clips Desktop open, then click Start notes from the reminder or the menu bar when your meeting begins. (Localizado)",
1450
1459
  getDesktopApp: "Get desktop app (Localizado)",
1451
1460
  requiredForReminders:
1452
- "Required for meeting reminders and transcription. (Localizado)",
1461
+ "Desktop captures mic + system audio for meeting transcription. (Localizado)",
1453
1462
  calendarConnected: "Calendar connected (Localizado)",
1454
1463
  calendarDisconnected: "Calendar disconnected (Localizado)",
1455
1464
  calendarSettings: "Calendar settings (Localizado)",
@@ -1457,14 +1466,27 @@ Todas as mudanças visíveis para usuários do Clips são documentadas aqui. Voc
1457
1466
  "Connect Google Calendar for meeting reminders. (Localizado)",
1458
1467
  disconnectGoogleCalendarTitle: "Disconnect Google Calendar? (Localizado)",
1459
1468
  title: "Meetings (Localizado)",
1460
- intro: "Upcoming calendar meetings and your recorded notes. (Localizado)",
1469
+ intro:
1470
+ "Upcoming calendar meetings and your recorded notes. Start live notes from Clips Desktop at meeting time. (Localizado)",
1461
1471
  searchPlaceholder: "Search meetings... (Localizado)",
1462
1472
  clearSearch: "Clear search (Localizado)",
1463
1473
  noMeetingsYet: "No meetings yet (Localizado)",
1464
1474
  noMeetingsDescription:
1465
- "Upcoming calendar meetings show up here, and finished recordings land here once you take notes. (Localizado)",
1475
+ "Connect your calendar and keep Clips Desktop open. When a meeting starts, use Start notes from the reminder or menu bar. (Localizado)",
1466
1476
  noMeetingsMatch: 'No meetings match "{{query}}" (Localizado)',
1467
1477
  refreshing: "Refreshing… (Localizado)",
1478
+ howToTriggerTitle: "How to trigger meeting notes (Localizado)",
1479
+ howToTriggerDescription:
1480
+ "Meeting notes are the Granola-style flow in Clips: calendar events appear here, the desktop app captures mic and system audio, and the transcript plus AI notes land back in this history. (Localizado)",
1481
+ guideCalendarTitle: "Connect Google Calendar (Localizado)",
1482
+ guideCalendarDescription:
1483
+ "Meetings are pulled from your calendar so Clips knows when to remind you. (Localizado)",
1484
+ guideDesktopTitle: "Keep Clips Desktop open (Localizado)",
1485
+ guideDesktopDescription:
1486
+ "Desktop capture is required for mic plus system-audio transcription. (Localizado)",
1487
+ guideStartTitle: "Click Start notes (Localizado)",
1488
+ guideStartDescription:
1489
+ "Use the desktop reminder or the menu-bar Start Meeting Notes item when the call begins. (Localizado)",
1468
1490
  },
1469
1491
  };
1470
1492
 
@@ -191,6 +191,11 @@ const messages = {
191
191
  edit: "编辑",
192
192
  aiTools: "人工智能工具",
193
193
  enhanceRecording: "增强此录音",
194
+ includeFullVideo: "包含完整视频",
195
+ includeFullVideoDescription:
196
+ "开启后,AI 工具会观看录制内容(仅限 Gemini)以获取屏幕上下文,而不仅仅是音频文字记录。也适用于默认标题和描述生成。需要通过 Builder 或 GEMINI_API_KEY 使用 Gemini 模型。",
197
+ includeFullVideoOn: "AI 工具将使用完整视频(Gemini)",
198
+ includeFullVideoOff: "AI 工具将只使用文字记录",
194
199
  regenerateTitle: "重新生成标题",
195
200
  regenerateDescription: "重新生成描述",
196
201
  autoChapters: "汽车章节",
@@ -314,7 +319,7 @@ const messages = {
314
319
  removing: "正在删除...",
315
320
  remove: "消除",
316
321
  desktopHint:
317
- " Clips 桌面应用程序记录本次会议的实时笔记 文字记录和 AI 笔记将自动出现在此处。",
322
+ "要开始记录,请从菜单栏打开 Clips Desktop 并选择 Start Meeting Notes,或在提醒出现时点击 Start notes。Clips 会捕获麦克风和系统音频,并在这里写入文字记录。",
318
323
  getDesktopApp: "获取桌面应用程序",
319
324
  generateNotesFailed: "无法生成笔记。再试一次。",
320
325
  attendee_one: "{{count}} 与会者",
@@ -956,7 +961,9 @@ Clips 中所有面向用户的重要更改都会记录在这里。你可以随
956
961
  inHours: "{{count}} 小时后",
957
962
  join: "加入",
958
963
  openNotes: "打开笔记",
959
- open: "打开",
964
+ open: "打开笔记",
965
+ startFromDesktopNow: "从桌面提醒或菜单栏开始实时笔记。",
966
+ startFromDesktopLater: "到时间时,Clips Desktop 会显示 Start notes。",
960
967
  },
961
968
  transcriptBubbles: {
962
969
  listening: "正在聆听…",
@@ -1384,10 +1391,10 @@ Clips 中所有面向用户的重要更改都会记录在这里。你可以随
1384
1391
  "Google Calendar needs to be reconnected to keep showing your upcoming meetings. (已本地化)",
1385
1392
  connectGoogleCalendar: "Connect Google Calendar (已本地化)",
1386
1393
  desktopReminder:
1387
- "Get a desktop reminder when meetings start so recorded notes land in this history automatically. (已本地化)",
1394
+ "Connect Google Calendar, keep Clips Desktop open, then click Start notes from the reminder or the menu bar when your meeting begins. (已本地化)",
1388
1395
  getDesktopApp: "Get desktop app (已本地化)",
1389
1396
  requiredForReminders:
1390
- "Required for meeting reminders and transcription. (已本地化)",
1397
+ "Desktop captures mic + system audio for meeting transcription. (已本地化)",
1391
1398
  calendarConnected: "Calendar connected (已本地化)",
1392
1399
  calendarDisconnected: "Calendar disconnected (已本地化)",
1393
1400
  calendarSettings: "Calendar settings (已本地化)",
@@ -1395,14 +1402,27 @@ Clips 中所有面向用户的重要更改都会记录在这里。你可以随
1395
1402
  "Connect Google Calendar for meeting reminders. (已本地化)",
1396
1403
  disconnectGoogleCalendarTitle: "Disconnect Google Calendar? (已本地化)",
1397
1404
  title: "Meetings (已本地化)",
1398
- intro: "Upcoming calendar meetings and your recorded notes. (已本地化)",
1405
+ intro:
1406
+ "Upcoming calendar meetings and your recorded notes. Start live notes from Clips Desktop at meeting time. (已本地化)",
1399
1407
  searchPlaceholder: "Search meetings... (已本地化)",
1400
1408
  clearSearch: "Clear search (已本地化)",
1401
1409
  noMeetingsYet: "No meetings yet (已本地化)",
1402
1410
  noMeetingsDescription:
1403
- "Upcoming calendar meetings show up here, and finished recordings land here once you take notes. (已本地化)",
1411
+ "Connect your calendar and keep Clips Desktop open. When a meeting starts, use Start notes from the reminder or menu bar. (已本地化)",
1404
1412
  noMeetingsMatch: 'No meetings match "{{query}}" (已本地化)',
1405
1413
  refreshing: "Refreshing… (已本地化)",
1414
+ howToTriggerTitle: "How to trigger meeting notes (已本地化)",
1415
+ howToTriggerDescription:
1416
+ "Meeting notes are the Granola-style flow in Clips: calendar events appear here, the desktop app captures mic and system audio, and the transcript plus AI notes land back in this history. (已本地化)",
1417
+ guideCalendarTitle: "Connect Google Calendar (已本地化)",
1418
+ guideCalendarDescription:
1419
+ "Meetings are pulled from your calendar so Clips knows when to remind you. (已本地化)",
1420
+ guideDesktopTitle: "Keep Clips Desktop open (已本地化)",
1421
+ guideDesktopDescription:
1422
+ "Desktop capture is required for mic plus system-audio transcription. (已本地化)",
1423
+ guideStartTitle: "Click Start notes (已本地化)",
1424
+ guideStartDescription:
1425
+ "Use the desktop reminder or the menu-bar Start Meeting Notes item when the call begins. (已本地化)",
1406
1426
  },
1407
1427
  };
1408
1428
 
@@ -191,6 +191,11 @@ const messages = {
191
191
  edit: "編輯",
192
192
  aiTools: "AI 工具",
193
193
  enhanceRecording: "強化此錄製",
194
+ includeFullVideo: "包含完整影片",
195
+ includeFullVideoDescription:
196
+ "開啟時,AI 工具會觀看錄製內容(僅 Gemini)以取得螢幕脈絡,而不只是音訊文字紀錄。也適用於預設標題與說明產生。需透過 Builder 或 GEMINI_API_KEY 使用 Gemini 模型。",
197
+ includeFullVideoOn: "AI 工具將使用完整影片(Gemini)",
198
+ includeFullVideoOff: "AI 工具將只使用文字紀錄",
194
199
  regenerateTitle: "重新產生標題",
195
200
  regenerateDescription: "重新產生描述",
196
201
  autoChapters: "自動章節",
@@ -314,7 +319,7 @@ const messages = {
314
319
  removing: "正在刪除...",
315
320
  remove: "移除",
316
321
  desktopHint:
317
- " Clips 桌面應用程式記錄本次會議的即時筆記;逐字稿和 AI 筆記將自動出現在此處。",
322
+ "若要開始筆記,請從選單列開啟 Clips Desktop 並選擇 Start Meeting Notes,或在提醒出現時按 Start notes。Clips 會擷取麥克風和系統音訊,並在這裡寫入逐字稿。",
318
323
  getDesktopApp: "取得桌面應用程式",
319
324
  generateNotesFailed: "無法產生筆記。請再試一次。",
320
325
  attendee_one: "{{count}} 與會者",
@@ -949,7 +954,9 @@ const messages = {
949
954
  inHours: "{{count}} 小時後",
950
955
  join: "加入",
951
956
  openNotes: "開啟筆記",
952
- open: "開啟",
957
+ open: "開啟筆記",
958
+ startFromDesktopNow: "從桌面提醒或選單列開始即時筆記。",
959
+ startFromDesktopLater: "時間到了,Clips Desktop 會顯示 Start notes。",
953
960
  },
954
961
  transcriptBubbles: {
955
962
  listening: "正在聆聽…",
@@ -1359,23 +1366,35 @@ const messages = {
1359
1366
  calendarNeedsReconnect:
1360
1367
  "需要重新連線 Google Calendar,才能繼續顯示即將到來的會議。",
1361
1368
  connectGoogleCalendar: "連線 Google Calendar",
1362
- desktopReminder: "會議開始時取得桌面提醒,錄製筆記就會自動存入此歷史記錄。",
1369
+ desktopReminder:
1370
+ "連線 Google Calendar,保持 Clips Desktop 開啟,會議開始時從提醒或選單列點選 Start notes。",
1363
1371
  getDesktopApp: "取得桌面應用程式",
1364
- requiredForReminders: "會議提醒與轉錄需要此功能。",
1372
+ requiredForReminders: "桌面應用程式會擷取麥克風和系統音訊以轉錄會議。",
1365
1373
  calendarConnected: "日曆已連線",
1366
1374
  calendarDisconnected: "日曆已中斷連線",
1367
1375
  calendarSettings: "日曆設定",
1368
1376
  connectCalendarReminder: "連線 Google Calendar 以取得會議提醒。",
1369
1377
  disconnectGoogleCalendarTitle: "要中斷連線 Google Calendar 嗎?",
1370
1378
  title: "會議",
1371
- intro: "即將到來的日曆會議與您的錄製筆記。",
1379
+ intro:
1380
+ "即將到來的日曆會議與您的錄製筆記。會議時間到了,請從 Clips Desktop 開始即時筆記。",
1372
1381
  searchPlaceholder: "搜尋會議...",
1373
1382
  clearSearch: "清除搜尋",
1374
1383
  noMeetingsYet: "還沒有會議",
1375
1384
  noMeetingsDescription:
1376
- "即將到來的日曆會議會顯示在這裡,完成的錄製也會在您做筆記後出現在這裡。",
1385
+ "連線您的日曆並保持 Clips Desktop 開啟。會議開始時,請從提醒或選單列使用 Start notes。",
1377
1386
  noMeetingsMatch: "沒有符合「{{query}}」的會議",
1378
1387
  refreshing: "正在重新整理…",
1388
+ howToTriggerTitle: "如何觸發會議筆記",
1389
+ howToTriggerDescription:
1390
+ "會議筆記是 Clips 中類似 Granola 的流程:日曆事件會顯示在這裡,桌面應用程式會擷取麥克風和系統音訊,逐字稿和 AI 筆記會回到這個歷史記錄。",
1391
+ guideCalendarTitle: "連線 Google Calendar",
1392
+ guideCalendarDescription: "Clips 會從您的日曆讀取會議,才知道何時提醒您。",
1393
+ guideDesktopTitle: "保持 Clips Desktop 開啟",
1394
+ guideDesktopDescription: "需要桌面擷取才能同時轉錄麥克風和系統音訊。",
1395
+ guideStartTitle: "點選 Start notes",
1396
+ guideStartDescription:
1397
+ "通話開始時,使用桌面提醒或選單列中的 Start Meeting Notes 項目。",
1379
1398
  },
1380
1399
  };
1381
1400
 
@@ -6,10 +6,12 @@ import {
6
6
  import {
7
7
  IconAlertTriangle,
8
8
  IconAppWindow,
9
+ IconBellRinging,
9
10
  IconCalendar,
10
11
  IconCheck,
11
12
  IconExternalLink,
12
13
  IconLoader2,
14
+ IconMicrophone2,
13
15
  IconNotes,
14
16
  IconPlugConnected,
15
17
  IconPlugOff,
@@ -428,6 +430,70 @@ function CalendarConnectionAction({
428
430
  );
429
431
  }
430
432
 
433
+ function MeetingNotesSteps() {
434
+ const t = useT();
435
+ return (
436
+ <div className="grid gap-2 sm:grid-cols-3">
437
+ <div className="rounded-md border border-border bg-background/70 p-3">
438
+ <IconCalendar className="h-4 w-4 text-muted-foreground" />
439
+ <div className="mt-2 text-xs font-medium text-foreground">
440
+ {t("meetingsRoute.guideCalendarTitle")}
441
+ </div>
442
+ <p className="mt-1 text-[11px] leading-snug text-muted-foreground">
443
+ {t("meetingsRoute.guideCalendarDescription")}
444
+ </p>
445
+ </div>
446
+ <div className="rounded-md border border-border bg-background/70 p-3">
447
+ <IconMicrophone2 className="h-4 w-4 text-muted-foreground" />
448
+ <div className="mt-2 text-xs font-medium text-foreground">
449
+ {t("meetingsRoute.guideDesktopTitle")}
450
+ </div>
451
+ <p className="mt-1 text-[11px] leading-snug text-muted-foreground">
452
+ {t("meetingsRoute.guideDesktopDescription")}
453
+ </p>
454
+ </div>
455
+ <div className="rounded-md border border-border bg-background/70 p-3">
456
+ <IconBellRinging className="h-4 w-4 text-muted-foreground" />
457
+ <div className="mt-2 text-xs font-medium text-foreground">
458
+ {t("meetingsRoute.guideStartTitle")}
459
+ </div>
460
+ <p className="mt-1 text-[11px] leading-snug text-muted-foreground">
461
+ {t("meetingsRoute.guideStartDescription")}
462
+ </p>
463
+ </div>
464
+ </div>
465
+ );
466
+ }
467
+
468
+ function MeetingNotesGuide({ showDesktopCta }: { showDesktopCta: boolean }) {
469
+ const t = useT();
470
+ return (
471
+ <section className="mb-6 rounded-lg border border-border bg-accent/20 p-4">
472
+ <div className="mb-3 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between">
473
+ <div className="min-w-0">
474
+ <h2 className="text-sm font-semibold text-foreground">
475
+ {t("meetingsRoute.howToTriggerTitle")}
476
+ </h2>
477
+ <p className="mt-1 max-w-2xl text-xs leading-relaxed text-muted-foreground">
478
+ {t("meetingsRoute.howToTriggerDescription")}
479
+ </p>
480
+ </div>
481
+ {showDesktopCta && (
482
+ <CaptureInstallButton
483
+ size="sm"
484
+ variant="secondary"
485
+ className="h-8 w-fit shrink-0 gap-1.5 cursor-pointer"
486
+ >
487
+ <IconAppWindow className="h-4 w-4" />
488
+ {t("meetingsRoute.getDesktopApp")}
489
+ </CaptureInstallButton>
490
+ )}
491
+ </div>
492
+ <MeetingNotesSteps />
493
+ </section>
494
+ );
495
+ }
496
+
431
497
  function ConnectCalendarEmptyState({
432
498
  onConnected,
433
499
  }: {
@@ -454,6 +520,9 @@ function ConnectCalendarEmptyState({
454
520
  onConnected={onConnected}
455
521
  />
456
522
  </div>
523
+ <div className="mt-4">
524
+ <MeetingNotesSteps />
525
+ </div>
457
526
  </div>
458
527
  </div>
459
528
  </div>
@@ -974,6 +1043,10 @@ export default function MeetingsIndexRoute() {
974
1043
  <CalendarReauthBanner onReconnect={handleReconnectCalendar} />
975
1044
  )}
976
1045
 
1046
+ {hasCalendar && meetings.length === 0 && (
1047
+ <MeetingNotesGuide showDesktopCta={showDesktopCta} />
1048
+ )}
1049
+
977
1050
  {nothingAtAll ? (
978
1051
  <div className="rounded-lg border border-dashed border-border bg-accent/20 px-6 py-16 text-center">
979
1052
  <IconCalendar className="h-10 w-10 text-muted-foreground/50 mx-auto" />
@@ -165,6 +165,7 @@ interface ClipsUserSettings {
165
165
  emailNotifications?: boolean;
166
166
  displayName?: string;
167
167
  transcriptCleanupEnabled?: boolean;
168
+ includeFullVideoInAi?: boolean;
168
169
  }
169
170
 
170
171
  interface SlackInstallation {
@@ -59,6 +59,7 @@ import { Badge } from "@/components/ui/badge";
59
59
  import { Button } from "@/components/ui/button";
60
60
  import {
61
61
  DropdownMenu,
62
+ DropdownMenuCheckboxItem,
62
63
  DropdownMenuContent,
63
64
  DropdownMenuItem,
64
65
  DropdownMenuLabel,
@@ -82,6 +83,8 @@ import { cn } from "@/lib/utils";
82
83
 
83
84
  const UPLOAD_STUCK_TIMEOUT_MS = 5 * 60 * 1000;
84
85
  const PROCESSING_STUCK_TIMEOUT_MS = 2 * 60 * 1000;
86
+ const READY_MEDIA_SETTLE_POLL_MS = 20 * 1000;
87
+ const READY_MEDIA_SETTLE_POLL_INTERVAL_MS = 1000;
85
88
 
86
89
  export function meta() {
87
90
  return [{ title: enMessages.recordingRoute.pageTitle }];
@@ -244,6 +247,7 @@ export default function RecordingPage() {
244
247
  [recordingId],
245
248
  );
246
249
  const lastPlayerStateWriteRef = useRef(0);
250
+ const readyMediaPollRef = useRef<{ key: string; until: number } | null>(null);
247
251
 
248
252
  useEffect(() => {
249
253
  if (
@@ -280,7 +284,30 @@ export default function RecordingPage() {
280
284
  // Poll while the recording is still being assembled / transcoded so
281
285
  // the page auto-upgrades from "Processing" to the real player the
282
286
  // moment the server flips status to 'ready' and writes videoUrl.
283
- if (rec.status !== "ready" || !rec.videoUrl) return 1000;
287
+ if (rec.status !== "ready" || !rec.videoUrl) {
288
+ readyMediaPollRef.current = null;
289
+ return 1000;
290
+ }
291
+ // Fresh streaming uploads can become `ready` before the background
292
+ // seekable/faststart repair swaps in the final player URL. Keep polling
293
+ // briefly so the first post-recording page catches that URL update
294
+ // without requiring a manual refresh.
295
+ const mediaKey = [
296
+ rec.id,
297
+ rec.videoUrl,
298
+ rec.durationMs ?? "",
299
+ rec.videoSizeBytes ?? "",
300
+ ].join(":");
301
+ const now = Date.now();
302
+ if (readyMediaPollRef.current?.key !== mediaKey) {
303
+ readyMediaPollRef.current = {
304
+ key: mediaKey,
305
+ until: now + READY_MEDIA_SETTLE_POLL_MS,
306
+ };
307
+ }
308
+ if (now < readyMediaPollRef.current.until) {
309
+ return READY_MEDIA_SETTLE_POLL_INTERVAL_MS;
310
+ }
284
311
  // Also keep polling while a transcript is pending so "Transcribing…"
285
312
  // auto-flips to the ready transcript (or to the failure card).
286
313
  if (data?.transcript?.status === "pending") return 3000;
@@ -513,6 +540,37 @@ export default function RecordingPage() {
513
540
  },
514
541
  onError: handleAiError,
515
542
  });
543
+ const aiPrefsQ = useActionQuery<{ includeFullVideoInAi?: boolean }>(
544
+ "get-clips-ai-prefs" as any,
545
+ undefined,
546
+ { retry: false },
547
+ );
548
+ const updateAiPrefs = useActionMutation("update-clips-ai-prefs" as any, {
549
+ onError: handleAiError,
550
+ });
551
+ const [includeFullVideoOverride, setIncludeFullVideoOverride] = useState<
552
+ boolean | null
553
+ >(null);
554
+ const includeFullVideoInAi =
555
+ includeFullVideoOverride ?? aiPrefsQ.data?.includeFullVideoInAi === true;
556
+ function handleIncludeFullVideoChange(checked: boolean) {
557
+ setIncludeFullVideoOverride(checked);
558
+ updateAiPrefs.mutate({ includeFullVideoInAi: checked } as any, {
559
+ onSuccess: () => {
560
+ void aiPrefsQ.refetch().finally(() => {
561
+ setIncludeFullVideoOverride(null);
562
+ });
563
+ toast.success(
564
+ checked
565
+ ? t("recordingPage.includeFullVideoOn")
566
+ : t("recordingPage.includeFullVideoOff"),
567
+ );
568
+ },
569
+ onError: () => {
570
+ setIncludeFullVideoOverride(null);
571
+ },
572
+ });
573
+ }
516
574
  function handleGenerateWorkflow(kind: WorkflowKind) {
517
575
  if (!recording) return;
518
576
  setEditing(false);
@@ -998,11 +1056,21 @@ export default function RecordingPage() {
998
1056
  <IconChevronDown className="h-4 w-4" />
999
1057
  </Button>
1000
1058
  </DropdownMenuTrigger>
1001
- <DropdownMenuContent align="end" className="w-60">
1059
+ <DropdownMenuContent align="end" className="w-64">
1002
1060
  <DropdownMenuLabel>
1003
1061
  {t("recordingPage.enhanceRecording")}
1004
1062
  </DropdownMenuLabel>
1005
1063
  <DropdownMenuSeparator />
1064
+ <DropdownMenuCheckboxItem
1065
+ checked={includeFullVideoInAi}
1066
+ disabled={aiPrefsQ.isLoading || updateAiPrefs.isPending}
1067
+ onCheckedChange={handleIncludeFullVideoChange}
1068
+ onSelect={(event) => event.preventDefault()}
1069
+ title={t("recordingPage.includeFullVideoDescription")}
1070
+ >
1071
+ {t("recordingPage.includeFullVideo")}
1072
+ </DropdownMenuCheckboxItem>
1073
+ <DropdownMenuSeparator />
1006
1074
  <DropdownMenuItem
1007
1075
  disabled={regenerateTitle.isPending}
1008
1076
  onSelect={() =>
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ AI tools can include the full video — not just the transcript — when generating titles, descriptions, and other outputs. Toggle it in the AI tools menu.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ Clips Desktop now surfaces Meetings and Dictate directly in the popover.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ Meeting notes now explain exactly how to start Granola-style live notes from Clips Desktop.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-07
4
+ ---
5
+
6
+ Meeting start alerts now include separate Start notes and Join buttons in the top-right overlay