@agent-native/core 0.90.3 → 0.90.5
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.
- package/bin/agent-native.js +25 -3
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +17 -0
- package/corpus/core/bin/agent-native.js +25 -3
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/durable-background.ts +18 -18
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +8 -2
- package/corpus/core/src/agent/engine/anthropic-engine.ts +11 -1
- package/corpus/core/src/agent/engine/index.ts +1 -0
- package/corpus/core/src/agent/engine/registry.ts +63 -2
- package/corpus/core/src/agent/production-agent.ts +22 -11
- package/corpus/core/src/agent/run-manager.ts +17 -6
- package/corpus/core/src/agent/run-store.ts +16 -11
- package/corpus/core/src/cli/create.ts +35 -0
- package/corpus/core/src/cli/design-connect.ts +263 -1
- package/corpus/core/src/cli/index.ts +84 -7
- package/corpus/core/src/cli/workspacify.ts +34 -0
- package/corpus/core/src/client/KeepTabOpenNotice.tsx +20 -15
- package/corpus/core/src/client/RunStuckBanner.tsx +14 -13
- package/corpus/core/src/client/agent-chat-adapter.ts +28 -17
- package/corpus/core/src/client/history/VersionHistoryPanel.tsx +77 -47
- package/corpus/core/src/client/history/index.ts +3 -0
- package/corpus/core/src/client/history/use-history.ts +28 -0
- package/corpus/core/src/client/index.ts +8 -0
- package/corpus/core/src/client/review/index.ts +5 -0
- package/corpus/core/src/client/review/use-review.ts +40 -2
- package/corpus/core/src/client/use-run-stuck-detection.ts +8 -5
- package/corpus/core/src/history/actions/create-resource-version.ts +11 -8
- package/corpus/core/src/history/index.ts +0 -1
- package/corpus/core/src/history/registry.ts +24 -12
- package/corpus/core/src/history/store.ts +84 -53
- package/corpus/core/src/review/actions/consume-review-feedback.ts +15 -5
- package/corpus/core/src/review/actions/delete-review-comment.ts +15 -3
- package/corpus/core/src/review/actions/resolve-review-thread.ts +12 -5
- package/corpus/core/src/review/index.ts +0 -5
- package/corpus/core/src/review/registry.ts +24 -12
- package/corpus/core/src/review/store.ts +10 -7
- package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
- package/corpus/core/src/server/credential-provider.ts +13 -3
- package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +11 -11
- package/corpus/templates/assets/actions/generate-image.ts +64 -28
- package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +1 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +91 -74
- package/corpus/templates/assets/server/lib/generation.ts +29 -4
- package/corpus/templates/assets/server/lib/image-processing.ts +131 -0
- package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +24 -2
- package/corpus/templates/calendar/AGENTS.md +3 -0
- package/corpus/templates/calendar/actions/create-event.ts +8 -34
- package/corpus/templates/calendar/actions/event-action-helpers.ts +52 -0
- package/corpus/templates/calendar/actions/manage-event-draft.ts +7 -34
- package/corpus/templates/calendar/actions/update-event.ts +10 -23
- package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +47 -0
- package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +23 -0
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +59 -2
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +40 -1
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +34 -1
- package/corpus/templates/calendar/app/hooks/use-events.ts +6 -0
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +4 -0
- package/corpus/templates/calendar/app/i18n-data.ts +40 -0
- package/corpus/templates/calendar/changelog/2026-07-07-you-can-mark-event-guests-as-optional-while-inviting-them-or.md +6 -0
- package/corpus/templates/calendar/server/handlers/events.ts +1 -0
- package/corpus/templates/calendar/server/lib/google-calendar.ts +4 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/calendar/shared/api.ts +2 -0
- package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +29 -3
- package/corpus/templates/clips/actions/generate-workflow.ts +19 -8
- package/corpus/templates/clips/actions/get-clips-ai-prefs.ts +36 -0
- package/corpus/templates/clips/actions/lib/clips-ai-prefs.ts +28 -0
- package/corpus/templates/clips/actions/regenerate-chapters.ts +21 -7
- package/corpus/templates/clips/actions/regenerate-summary.ts +26 -8
- package/corpus/templates/clips/actions/regenerate-title.ts +44 -7
- package/corpus/templates/clips/actions/update-clips-ai-prefs.ts +50 -0
- package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +7 -2
- package/corpus/templates/clips/app/hooks/use-auto-title.ts +25 -10
- package/corpus/templates/clips/app/i18n/ar-SA.ts +28 -6
- package/corpus/templates/clips/app/i18n/de-DE.ts +28 -6
- package/corpus/templates/clips/app/i18n/en-US.ts +29 -6
- package/corpus/templates/clips/app/i18n/es-ES.ts +29 -6
- package/corpus/templates/clips/app/i18n/fr-FR.ts +30 -6
- package/corpus/templates/clips/app/i18n/hi-IN.ts +26 -6
- package/corpus/templates/clips/app/i18n/ja-JP.ts +27 -6
- package/corpus/templates/clips/app/i18n/ko-KR.ts +28 -6
- package/corpus/templates/clips/app/i18n/pt-BR.ts +28 -6
- package/corpus/templates/clips/app/i18n/zh-CN.ts +26 -6
- package/corpus/templates/clips/app/i18n/zh-TW.ts +25 -6
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +73 -0
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +1 -0
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +70 -2
- package/corpus/templates/clips/changelog/2026-07-07-ai-tools-can-include-the-full-video-not-just-the-transcript-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-clips-desktop-now-surfaces-meetings-and-dictate-directly-in-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-meeting-notes-now-explain-exactly-how-to-start-granola-style.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-meeting-start-alerts-now-include-separate-start-notes-and-jo.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-recordings-start-more-predictably-and-newly-saved-clips-refr.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
- package/corpus/templates/clips/desktop/src/app.tsx +435 -105
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +27 -21
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -22
- package/corpus/templates/clips/desktop/src/styles.css +167 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1 -1
- package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +3 -7
- package/corpus/templates/clips/desktop/src-tauri/src/tray_meetings.rs +5 -4
- package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.put.ts +16 -8
- package/corpus/templates/clips/shared/clips-ai-prefs.ts +81 -0
- package/corpus/templates/content/AGENTS.md +1 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +73 -8
- package/corpus/templates/content/actions/_database-utils.ts +2 -1
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +20 -1
- package/corpus/templates/content/actions/stage-builder-source-bulk-update.ts +663 -0
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +33 -7
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +53 -4
- package/corpus/templates/content/app/components/editor/database/settings.tsx +24 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +70 -1
- package/corpus/templates/content/app/hooks/use-document-properties.ts +63 -5
- package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/content/app/i18n-data.ts +31 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-rows-can-be-staged-in-bulk-with-a-reviewable.md +6 -0
- package/corpus/templates/content/changelog/2026-07-07-builder-backed-database-fields-now-edit-like-normal-content-fields.md +6 -0
- package/corpus/templates/content/parity/matrix.md +24 -24
- package/corpus/templates/content/parity/matrix.ts +2 -0
- package/corpus/templates/content/shared/api.ts +59 -4
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +16 -1
- package/corpus/templates/design/actions/add-localhost-screens.ts +1 -0
- package/corpus/templates/design/actions/connect-localhost.ts +26 -3
- package/corpus/templates/design/actions/open-visual-edit.ts +4 -37
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +362 -12
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +89 -14
- package/corpus/templates/design/app/components/design/bridge-security.ts +7 -1
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +1 -1
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +41 -0
- package/corpus/templates/design/changelog/2026-07-07-local-visual-edit-keeps-bridge-access-when-opening-previousl.md +6 -0
- package/corpus/templates/design/changelog/2026-07-07-local-visual-edit-now-keeps-the-live-app-connection-authenti.md +6 -0
- package/corpus/templates/design/changelog/2026-07-07-local-visual-edit-uses-live-app-iframes-for-click-to-edit-pr.md +6 -0
- package/dist/agent/durable-background.d.ts +12 -12
- package/dist/agent/durable-background.js +18 -18
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +8 -2
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +11 -1
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +14 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +56 -2
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts +2 -2
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +18 -11
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +7 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +6 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +1 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +15 -10
- package/dist/agent/run-store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +31 -0
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +197 -1
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/index.js +76 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +30 -0
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/KeepTabOpenNotice.d.ts +9 -10
- package/dist/client/KeepTabOpenNotice.d.ts.map +1 -1
- package/dist/client/KeepTabOpenNotice.js +8 -4
- package/dist/client/KeepTabOpenNotice.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +14 -13
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +25 -17
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/history/VersionHistoryPanel.d.ts +1 -1
- package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -1
- package/dist/client/history/VersionHistoryPanel.js +12 -5
- package/dist/client/history/VersionHistoryPanel.js.map +1 -1
- package/dist/client/history/index.d.ts +1 -1
- package/dist/client/history/index.d.ts.map +1 -1
- package/dist/client/history/index.js +1 -1
- package/dist/client/history/index.js.map +1 -1
- package/dist/client/history/use-history.d.ts +12 -0
- package/dist/client/history/use-history.d.ts.map +1 -1
- package/dist/client/history/use-history.js +6 -0
- package/dist/client/history/use-history.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/review/index.d.ts +1 -1
- package/dist/client/review/index.d.ts.map +1 -1
- package/dist/client/review/index.js +1 -1
- package/dist/client/review/index.js.map +1 -1
- package/dist/client/review/use-review.d.ts +23 -0
- package/dist/client/review/use-review.d.ts.map +1 -1
- package/dist/client/review/use-review.js +8 -0
- package/dist/client/review/use-review.js.map +1 -1
- package/dist/client/use-run-stuck-detection.d.ts +1 -1
- package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
- package/dist/client/use-run-stuck-detection.js +6 -4
- package/dist/client/use-run-stuck-detection.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/history/actions/create-resource-version.js +7 -4
- package/dist/history/actions/create-resource-version.js.map +1 -1
- package/dist/history/index.d.ts +1 -1
- package/dist/history/index.d.ts.map +1 -1
- package/dist/history/index.js +1 -1
- package/dist/history/index.js.map +1 -1
- package/dist/history/registry.d.ts.map +1 -1
- package/dist/history/registry.js +14 -12
- package/dist/history/registry.js.map +1 -1
- package/dist/history/store.d.ts.map +1 -1
- package/dist/history/store.js +74 -49
- package/dist/history/store.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/review/actions/consume-review-feedback.d.ts +1 -0
- package/dist/review/actions/consume-review-feedback.js +8 -2
- package/dist/review/actions/consume-review-feedback.js.map +1 -1
- package/dist/review/actions/delete-review-comment.d.ts +2 -1
- package/dist/review/actions/delete-review-comment.js +11 -3
- package/dist/review/actions/delete-review-comment.js.map +1 -1
- package/dist/review/actions/resolve-review-thread.d.ts +2 -1
- package/dist/review/actions/resolve-review-thread.js +5 -2
- package/dist/review/actions/resolve-review-thread.js.map +1 -1
- package/dist/review/index.d.ts +1 -1
- package/dist/review/index.d.ts.map +1 -1
- package/dist/review/index.js +1 -1
- package/dist/review/index.js.map +1 -1
- package/dist/review/registry.d.ts.map +1 -1
- package/dist/review/registry.js +14 -12
- package/dist/review/registry.js.map +1 -1
- package/dist/review/store.d.ts +3 -3
- package/dist/review/store.d.ts.map +1 -1
- package/dist/review/store.js +7 -4
- package/dist/review/store.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +5 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/credential-provider.d.ts +2 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +13 -3
- package/dist/server/credential-provider.js.map +1 -1
- 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
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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:
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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:
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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:
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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" />
|
|
@@ -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)
|
|
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-
|
|
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={() =>
|