@agent-native/core 0.102.1 → 0.103.0
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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +15 -0
- package/corpus/core/docs/content/local-file-mode.mdx +99 -489
- package/corpus/core/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
- package/corpus/core/docs/content/locales/ar-SA/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
- package/corpus/core/docs/content/locales/de-DE/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
- package/corpus/core/docs/content/locales/es-ES/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
- package/corpus/core/docs/content/locales/fr-FR/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
- package/corpus/core/docs/content/locales/hi-IN/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
- package/corpus/core/docs/content/locales/ja-JP/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
- package/corpus/core/docs/content/locales/ko-KR/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
- package/corpus/core/docs/content/locales/pt-BR/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
- package/corpus/core/docs/content/locales/zh-CN/template-content.mdx +9 -24
- package/corpus/core/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
- package/corpus/core/docs/content/locales/zh-TW/template-content.mdx +9 -24
- package/corpus/core/docs/content/template-content.mdx +26 -42
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/content-local.ts +86 -18
- package/corpus/core/src/cli/index.ts +2 -2
- package/corpus/core/src/cli/skills-content/content-skill.ts +36 -25
- package/corpus/core/src/cli/skills.ts +47 -13
- package/corpus/core/src/client/AgentPanel.tsx +7 -0
- package/corpus/core/src/client/AssistantChat.tsx +7 -0
- package/corpus/core/src/client/agent-chat-adapter.ts +7 -1
- package/corpus/core/src/client/chat/message-components.tsx +17 -3
- package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +96 -6
- package/corpus/core/src/client/composer/asset-picker-url.ts +80 -0
- package/corpus/core/src/client/error-format.ts +24 -0
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +8 -1
- package/corpus/core/src/local-artifacts/index.ts +65 -0
- package/corpus/templates/assets/app/components/library/GenerationPresetsPanel.tsx +325 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +12 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +21 -0
- package/corpus/templates/assets/app/i18n-data.ts +215 -0
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +19 -479
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id_.settings.tsx +446 -0
- package/corpus/templates/assets/app/routes/library.tsx +69 -0
- package/corpus/templates/assets/changelog/2026-07-15-fixed-top-level-image-picker-selections-returning-to-the-com.md +6 -0
- package/corpus/templates/clips/actions/disconnect-calendar.ts +57 -9
- package/corpus/templates/clips/actions/generate-workflow.ts +102 -59
- package/corpus/templates/clips/actions/get-recording-player-data.ts +64 -1
- package/corpus/templates/clips/actions/regenerate-summary.ts +7 -0
- package/corpus/templates/clips/actions/regenerate-title.ts +29 -11
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +34 -13
- package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +87 -9
- package/corpus/templates/clips/app/components/editor/trim-handles.tsx +15 -0
- package/corpus/templates/clips/app/components/editor/waveform.tsx +21 -8
- package/corpus/templates/clips/app/components/library/folder-tree.tsx +52 -0
- package/corpus/templates/clips/app/components/player/settings-panel.tsx +116 -58
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +43 -37
- package/corpus/templates/clips/app/components/player/video-player.tsx +50 -2
- package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +22 -3
- package/corpus/templates/clips/app/i18n/ar-SA.ts +5 -2
- package/corpus/templates/clips/app/i18n/de-DE.ts +6 -2
- package/corpus/templates/clips/app/i18n/en-US.ts +5 -2
- package/corpus/templates/clips/app/i18n/es-ES.ts +6 -2
- package/corpus/templates/clips/app/i18n/fr-FR.ts +5 -2
- package/corpus/templates/clips/app/i18n/hi-IN.ts +5 -2
- package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +5 -2
- package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -2
- package/corpus/templates/clips/app/i18n/zh-CN.ts +5 -2
- package/corpus/templates/clips/app/i18n/zh-TW.ts +5 -2
- package/corpus/templates/clips/app/lib/timestamp-mapping.ts +14 -0
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -2
- package/corpus/templates/clips/app/routes/_index.tsx +1 -2
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +98 -32
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +4 -1
- package/corpus/templates/clips/changelog/2026-07-15-ai-workflow-generation-now-stays-visible-avoids-duplicate-re.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-clip-playback-and-cta-controls-remain-interactive-through-ed.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-clip-titles-no-longer-describe-the-product-as-a-loom-alterna.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-description-regeneration-now-opens-the-agent-chat-so-progres.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-direct-recording-urls-now-respect-share-link-and-password-ac.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-disconnecting-a-calendar-now-clears-unrecorded-synced-meetin.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-folders-now-expose-rename-and-delete-actions-directly-in-the.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-recording-pages-now-explain-sign-in-access-and-avoid-showing.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-the-clips-extension-quick-actions-toolbar-can-be-moved-out-o.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-the-editor-now-skips-cut-sections-during-preview-and-keeps-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-thumbnail-capture-now-updates-previews-while-scrubbing-and-l.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-windows-permission-links-open-the-matching-settings-page.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/content-script.ts +117 -2
- package/corpus/templates/clips/chrome-extension/src/overlay.ts +27 -0
- package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +139 -101
- package/corpus/templates/clips/server/lib/recording-page-access.ts +35 -0
- package/corpus/templates/clips/server/lib/share-password.ts +6 -3
- package/corpus/templates/content/.agents/skills/content/SKILL.md +26 -39
- package/corpus/templates/content/AGENTS.md +25 -30
- package/corpus/templates/content/actions/_builder-docs-client.ts +23 -0
- package/corpus/templates/content/actions/_content-database-source-adapters.ts +21 -3
- package/corpus/templates/content/actions/_content-files.ts +338 -0
- package/corpus/templates/content/actions/_content-space-access.ts +135 -0
- package/corpus/templates/content/actions/_content-spaces.ts +640 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +90 -7
- package/corpus/templates/content/actions/_database-utils.ts +7 -1
- package/corpus/templates/content/actions/_local-file-documents.ts +0 -9
- package/corpus/templates/content/actions/_local-folder-source.ts +53 -0
- package/corpus/templates/content/actions/_property-utils.ts +9 -4
- package/corpus/templates/content/actions/add-database-item.ts +108 -65
- package/corpus/templates/content/actions/backfill-content-files.ts +22 -0
- package/corpus/templates/content/actions/connect-local-folder-source.ts +221 -0
- package/corpus/templates/content/actions/create-content-database.ts +129 -3
- package/corpus/templates/content/actions/create-document.ts +65 -55
- package/corpus/templates/content/actions/create-inline-content-database.ts +6 -1
- package/corpus/templates/content/actions/delete-content-database.ts +3 -0
- package/corpus/templates/content/actions/delete-document.ts +7 -11
- package/corpus/templates/content/actions/disconnect-local-folder-source.ts +175 -0
- package/corpus/templates/content/actions/duplicate-database-item.ts +10 -0
- package/corpus/templates/content/actions/duplicate-database-items.ts +13 -0
- package/corpus/templates/content/actions/edit-document.ts +2 -28
- package/corpus/templates/content/actions/ensure-content-spaces.ts +26 -0
- package/corpus/templates/content/actions/export-content-source.ts +47 -9
- package/corpus/templates/content/actions/get-document.ts +0 -14
- package/corpus/templates/content/actions/import-content-source.ts +43 -3
- package/corpus/templates/content/actions/list-content-spaces.ts +103 -0
- package/corpus/templates/content/actions/list-documents.ts +12 -9
- package/corpus/templates/content/actions/move-document.ts +3 -14
- package/corpus/templates/content/actions/pull-document.ts +0 -23
- package/corpus/templates/content/actions/remove-local-file-source.ts +50 -29
- package/corpus/templates/content/actions/resolve-local-folder-conflict.ts +442 -0
- package/corpus/templates/content/actions/reveal-local-source-file.ts +6 -17
- package/corpus/templates/content/actions/search-documents.ts +0 -34
- package/corpus/templates/content/actions/share-local-file-document.ts +25 -1
- package/corpus/templates/content/actions/submit-content-database-form.ts +12 -0
- package/corpus/templates/content/actions/sync-local-folder-source.ts +731 -0
- package/corpus/templates/content/actions/sync-manifest-local-folder-source.ts +123 -0
- package/corpus/templates/content/actions/update-content-database-view.ts +10 -1
- package/corpus/templates/content/actions/update-document.ts +0 -15
- package/corpus/templates/content/actions/view-screen.ts +2 -50
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +76 -62
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +70 -22
- package/corpus/templates/content/app/components/editor/database/grouping.ts +2 -1
- package/corpus/templates/content/app/components/editor/database/settings.tsx +23 -20
- package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
- package/corpus/templates/content/app/components/editor/database/sidebar.tsx +330 -0
- package/corpus/templates/content/app/components/editor/database/types.ts +1 -0
- package/corpus/templates/content/app/components/editor/database/view-config.ts +3 -1
- package/corpus/templates/content/app/components/layout/Layout.tsx +25 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +209 -113
- package/corpus/templates/content/app/components/sidebar/select-content-space.ts +31 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +16 -0
- package/corpus/templates/content/app/hooks/use-content-spaces.ts +39 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +11 -0
- package/corpus/templates/content/app/i18n-data.ts +75 -0
- package/corpus/templates/content/app/routes/_app.local-files.tsx +174 -65
- package/corpus/templates/content/changelog/2026-07-16-content-callouts-can-now-be-reviewed-and-published-to-builder.md +6 -0
- package/corpus/templates/content/changelog/2026-07-16-heading-5-and-heading-6-are-available-from-the-editor-slash-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-16-organize-every-workspace-through-a-customizable-files-databa.md +6 -0
- package/corpus/templates/content/parity/matrix.md +2 -1
- package/corpus/templates/content/parity/matrix.ts +37 -1
- package/corpus/templates/content/scripts/dev-database.mjs +7 -5
- package/corpus/templates/content/server/db/schema.ts +113 -40
- package/corpus/templates/content/server/lib/document-context.ts +15 -1
- package/corpus/templates/content/server/lib/notion-sync.ts +6 -0
- package/corpus/templates/content/server/plugins/db.ts +153 -0
- package/corpus/templates/content/shared/api.ts +17 -3
- package/corpus/templates/content/shared/builder-mdx.ts +163 -16
- package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +59 -0
- package/corpus/templates/design/AGENTS.md +6 -1
- package/corpus/templates/design/actions/create-design-from-template.ts +19 -7
- package/corpus/templates/design/actions/list-design-templates.ts +69 -21
- package/corpus/templates/design/actions/navigate.ts +2 -2
- package/corpus/templates/design/actions/view-screen.ts +15 -2
- package/corpus/templates/design/agent-native.app-skill.json +5 -0
- package/corpus/templates/design/app/components/design/design-canvas/external-preview.ts +7 -3
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +281 -56
- package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +14 -2
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +3 -2
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -3
- package/corpus/templates/design/app/i18n-data.ts +21 -2
- package/corpus/templates/design/app/i18n-template-feature.ts +218 -10
- package/corpus/templates/design/app/pages/Index.tsx +195 -24
- package/corpus/templates/design/app/pages/Templates.tsx +144 -55
- package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +12 -1
- package/corpus/templates/design/changelog/2026-07-14-templates-now-appear-in-the-new-design-picker-with-previews-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-15-prototype-print-and-download-buttons-now-work-in-preview.md +6 -0
- package/corpus/templates/design/changelog/2026-07-15-templates-now-open-immediately-after-copying-even-while-the-.md +6 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/mail/AGENTS.md +23 -18
- package/corpus/templates/mail/actions/bulk-archive.ts +32 -28
- package/corpus/templates/mail/actions/mark-read.ts +131 -20
- package/corpus/templates/mail/actions/mark-thread-read.ts +1 -1
- package/corpus/templates/mail/actions/move-email.ts +30 -24
- package/corpus/templates/mail/actions/send-email.ts +73 -68
- package/corpus/templates/mail/changelog/2026-07-15-unread-inbox-cleanup-now-completes-reliably.md +6 -0
- package/corpus/templates/mail/server/handlers/emails.ts +218 -209
- package/corpus/templates/mail/server/lib/bulk-mark-read.ts +30 -0
- package/corpus/templates/mail/server/lib/email-state.ts +198 -113
- package/corpus/templates/mail/server/lib/google-auth.ts +218 -25
- package/corpus/templates/mail/server/lib/jobs.ts +69 -74
- package/corpus/templates/mail/server/lib/local-email-store.ts +265 -0
- package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +1 -1
- package/corpus/templates/slides/actions/import-file.ts +4 -1
- package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +9 -12
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +29 -21
- package/corpus/templates/slides/app/i18n/ar-SA.ts +1 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +1 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +1 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +1 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +1 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +1 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +1 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +1 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +1 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/slides/changelog/2026-07-15-image-search-and-generation-controls-now-use-the-registered-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-15-pdf-deck-references-can-be-imported-for-slide-inspiration-ag.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-15-stable-style-inspector-dock.md +6 -0
- package/dist/cli/content-local.d.ts +1 -0
- package/dist/cli/content-local.d.ts.map +1 -1
- package/dist/cli/content-local.js +75 -17
- package/dist/cli/content-local.js.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/skills-content/content-skill.d.ts +1 -1
- package/dist/cli/skills-content/content-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/content-skill.js +36 -25
- package/dist/cli/skills-content/content-skill.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +47 -14
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +5 -0
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +7 -0
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +8 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +4 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +10 -3
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +58 -6
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/asset-picker-url.d.ts +16 -0
- package/dist/client/composer/asset-picker-url.d.ts.map +1 -0
- package/dist/client/composer/asset-picker-url.js +64 -0
- package/dist/client/composer/asset-picker-url.js.map +1 -0
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +17 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +6 -1
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/local-artifacts/index.d.ts +10 -0
- package/dist/local-artifacts/index.d.ts.map +1 -1
- package/dist/local-artifacts/index.js +39 -0
- package/dist/local-artifacts/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/docs/content/local-file-mode.mdx +99 -489
- package/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
- package/docs/content/locales/ar-SA/template-content.mdx +10 -24
- package/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
- package/docs/content/locales/de-DE/template-content.mdx +10 -24
- package/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
- package/docs/content/locales/es-ES/template-content.mdx +10 -24
- package/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
- package/docs/content/locales/fr-FR/template-content.mdx +10 -24
- package/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
- package/docs/content/locales/hi-IN/template-content.mdx +10 -24
- package/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
- package/docs/content/locales/ja-JP/template-content.mdx +10 -24
- package/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
- package/docs/content/locales/ko-KR/template-content.mdx +10 -24
- package/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
- package/docs/content/locales/pt-BR/template-content.mdx +10 -24
- package/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
- package/docs/content/locales/zh-CN/template-content.mdx +9 -24
- package/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
- package/docs/content/locales/zh-TW/template-content.mdx +9 -24
- package/docs/content/template-content.mdx +26 -42
- package/package.json +1 -1
- package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +0 -126
|
@@ -451,6 +451,8 @@ const messages = {
|
|
|
451
451
|
retryAgentLink: "Retry",
|
|
452
452
|
gifPreview: "GIF preview",
|
|
453
453
|
openPlayer: "Open player",
|
|
454
|
+
chooseFile: "Choose file",
|
|
455
|
+
remove: "Remove",
|
|
454
456
|
downloadMp4: "Download MP4",
|
|
455
457
|
embedsNeedPublic: "Embeds need a public clip",
|
|
456
458
|
embedPublicDescription:
|
|
@@ -1219,9 +1221,10 @@ All notable user-facing changes to Clips are documented here. Open it any time f
|
|
|
1219
1221
|
visibilityOrg: "Organization",
|
|
1220
1222
|
visibilityPublic: "Public",
|
|
1221
1223
|
passwordProtection: "Password protection",
|
|
1222
|
-
passwordSetPlaceholder:
|
|
1223
|
-
"Password is set — type to replace, leave empty + Save to clear",
|
|
1224
|
+
passwordSetPlaceholder: "Password is set — type to replace",
|
|
1224
1225
|
noPasswordPlaceholder: "No password",
|
|
1226
|
+
passwordWhitespaceOnly: "Spaces alone aren't a valid password.",
|
|
1227
|
+
removePassword: "Remove",
|
|
1225
1228
|
expiry: "Expiry",
|
|
1226
1229
|
viewerOptions: "Viewer options",
|
|
1227
1230
|
comments: "Comments",
|
|
@@ -465,6 +465,8 @@ const messages = {
|
|
|
465
465
|
retryAgentLink: "Reintentar",
|
|
466
466
|
gifPreview: "vista previa de GIF",
|
|
467
467
|
openPlayer: "jugador abierto",
|
|
468
|
+
chooseFile: "Elige el archivo",
|
|
469
|
+
remove: "Eliminar",
|
|
468
470
|
downloadMp4: "Descargar MP4",
|
|
469
471
|
embedsNeedPublic: "Los elementos insertados necesitan un clip público",
|
|
470
472
|
embedPublicDescription:
|
|
@@ -1244,9 +1246,11 @@ Todos los cambios visibles para los usuarios de Clips se documentan aquí. Puede
|
|
|
1244
1246
|
visibilityOrg: "Organization (Localizado)",
|
|
1245
1247
|
visibilityPublic: "Public (Localizado)",
|
|
1246
1248
|
passwordProtection: "Password protection (Localizado)",
|
|
1247
|
-
passwordSetPlaceholder:
|
|
1248
|
-
"Password is set — type to replace, leave empty + Save to clear (Localizado)",
|
|
1249
|
+
passwordSetPlaceholder: "Password is set — type to replace (Localizado)",
|
|
1249
1250
|
noPasswordPlaceholder: "No password (Localizado)",
|
|
1251
|
+
passwordWhitespaceOnly:
|
|
1252
|
+
"Spaces alone aren't a valid password. (Localizado)",
|
|
1253
|
+
removePassword: "Remove (Localizado)",
|
|
1250
1254
|
expiry: "Expiry (Localizado)",
|
|
1251
1255
|
viewerOptions: "Viewer options (Localizado)",
|
|
1252
1256
|
comments: "Comments (Localizado)",
|
|
@@ -465,6 +465,8 @@ const messages = {
|
|
|
465
465
|
retryAgentLink: "Réessayer",
|
|
466
466
|
gifPreview: "aperçu de GIF",
|
|
467
467
|
openPlayer: "Joueur ouvert",
|
|
468
|
+
chooseFile: "Choisir un fichier",
|
|
469
|
+
remove: "Retirer",
|
|
468
470
|
downloadMp4: "Télécharger MP4",
|
|
469
471
|
embedsNeedPublic: "Les intégrations nécessitent un clip public",
|
|
470
472
|
embedPublicDescription:
|
|
@@ -1246,9 +1248,10 @@ Tous les changements visibles par les utilisateurs de Clips sont documentés ici
|
|
|
1246
1248
|
visibilityOrg: "Organization (Localisé)",
|
|
1247
1249
|
visibilityPublic: "Public (Localisé)",
|
|
1248
1250
|
passwordProtection: "Password protection (Localisé)",
|
|
1249
|
-
passwordSetPlaceholder:
|
|
1250
|
-
"Password is set — type to replace, leave empty + Save to clear (Localisé)",
|
|
1251
|
+
passwordSetPlaceholder: "Password is set — type to replace (Localisé)",
|
|
1251
1252
|
noPasswordPlaceholder: "No password (Localisé)",
|
|
1253
|
+
passwordWhitespaceOnly: "Spaces alone aren't a valid password. (Localisé)",
|
|
1254
|
+
removePassword: "Remove (Localisé)",
|
|
1252
1255
|
expiry: "Expiry (Localisé)",
|
|
1253
1256
|
viewerOptions: "Viewer options (Localisé)",
|
|
1254
1257
|
comments: "Comments (Localisé)",
|
|
@@ -448,6 +448,8 @@ const messages = {
|
|
|
448
448
|
retryAgentLink: "फिर से प्रयास करें",
|
|
449
449
|
gifPreview: "GIF पूर्वावलोकन",
|
|
450
450
|
openPlayer: "खुला खिलाड़ी",
|
|
451
|
+
chooseFile: "फ़ाइल चुनें",
|
|
452
|
+
remove: "हटाएं",
|
|
451
453
|
downloadMp4: "MP4 डाउनलोड करें",
|
|
452
454
|
embedsNeedPublic: "एंबेड को एक सार्वजनिक क्लिप की आवश्यकता है",
|
|
453
455
|
embedPublicDescription:
|
|
@@ -1212,9 +1214,10 @@ Clips में उपयोगकर्ताओं को दिखने व
|
|
|
1212
1214
|
visibilityOrg: "Organization (स्थानीयकृत)",
|
|
1213
1215
|
visibilityPublic: "Public (स्थानीयकृत)",
|
|
1214
1216
|
passwordProtection: "Password protection (स्थानीयकृत)",
|
|
1215
|
-
passwordSetPlaceholder:
|
|
1216
|
-
"Password is set — type to replace, leave empty + Save to clear (स्थानीयकृत)",
|
|
1217
|
+
passwordSetPlaceholder: "Password is set — type to replace (स्थानीयकृत)",
|
|
1217
1218
|
noPasswordPlaceholder: "No password (स्थानीयकृत)",
|
|
1219
|
+
passwordWhitespaceOnly: "Spaces alone aren't a valid password. (स्थानीयकृत)",
|
|
1220
|
+
removePassword: "Remove (स्थानीयकृत)",
|
|
1218
1221
|
expiry: "Expiry (स्थानीयकृत)",
|
|
1219
1222
|
viewerOptions: "Viewer options (स्थानीयकृत)",
|
|
1220
1223
|
comments: "Comments (स्थानीयकृत)",
|
|
@@ -460,6 +460,8 @@ const messages = {
|
|
|
460
460
|
retryAgentLink: "再試行",
|
|
461
461
|
gifPreview: "GIF プレビュー",
|
|
462
462
|
openPlayer: "プレーヤーを開く",
|
|
463
|
+
chooseFile: "ファイルを選択してください",
|
|
464
|
+
remove: "取り除く",
|
|
463
465
|
downloadMp4: "ダウンロード",
|
|
464
466
|
embedsNeedPublic: "埋め込みにはパブリッククリップが必要です",
|
|
465
467
|
embedPublicDescription:
|
|
@@ -1235,8 +1237,11 @@ Clips のユーザー向けの主な変更はここに記録されます。コ
|
|
|
1235
1237
|
visibilityPublic: "Public (ローカライズ済み)",
|
|
1236
1238
|
passwordProtection: "Password protection (ローカライズ済み)",
|
|
1237
1239
|
passwordSetPlaceholder:
|
|
1238
|
-
"Password is set — type to replace
|
|
1240
|
+
"Password is set — type to replace (ローカライズ済み)",
|
|
1239
1241
|
noPasswordPlaceholder: "No password (ローカライズ済み)",
|
|
1242
|
+
passwordWhitespaceOnly:
|
|
1243
|
+
"Spaces alone aren't a valid password. (ローカライズ済み)",
|
|
1244
|
+
removePassword: "Remove (ローカライズ済み)",
|
|
1240
1245
|
expiry: "Expiry (ローカライズ済み)",
|
|
1241
1246
|
viewerOptions: "Viewer options (ローカライズ済み)",
|
|
1242
1247
|
comments: "Comments (ローカライズ済み)",
|
|
@@ -453,6 +453,8 @@ const messages = {
|
|
|
453
453
|
retryAgentLink: "다시 시도",
|
|
454
454
|
gifPreview: "GIF 미리보기",
|
|
455
455
|
openPlayer: "플레이어 열기",
|
|
456
|
+
chooseFile: "파일 선택",
|
|
457
|
+
remove: "제거",
|
|
456
458
|
downloadMp4: "MP4 다운로드",
|
|
457
459
|
embedsNeedPublic: "퍼가기에는 공개 클립이 필요합니다",
|
|
458
460
|
embedPublicDescription:
|
|
@@ -1222,9 +1224,10 @@ Clips의 모든 사용자 대상 변경 사항은 여기에 기록됩니다. 명
|
|
|
1222
1224
|
visibilityOrg: "Organization (현지화됨)",
|
|
1223
1225
|
visibilityPublic: "Public (현지화됨)",
|
|
1224
1226
|
passwordProtection: "Password protection (현지화됨)",
|
|
1225
|
-
passwordSetPlaceholder:
|
|
1226
|
-
"Password is set — type to replace, leave empty + Save to clear (현지화됨)",
|
|
1227
|
+
passwordSetPlaceholder: "Password is set — type to replace (현지화됨)",
|
|
1227
1228
|
noPasswordPlaceholder: "No password (현지화됨)",
|
|
1229
|
+
passwordWhitespaceOnly: "Spaces alone aren't a valid password. (현지화됨)",
|
|
1230
|
+
removePassword: "Remove (현지화됨)",
|
|
1228
1231
|
expiry: "Expiry (현지화됨)",
|
|
1229
1232
|
viewerOptions: "Viewer options (현지화됨)",
|
|
1230
1233
|
comments: "Comments (현지화됨)",
|
|
@@ -462,6 +462,8 @@ const messages = {
|
|
|
462
462
|
retryAgentLink: "Tentar novamente",
|
|
463
463
|
gifPreview: "visualização de GIF",
|
|
464
464
|
openPlayer: "Jogador aberto",
|
|
465
|
+
chooseFile: "Escolher arquivo",
|
|
466
|
+
remove: "Remover",
|
|
465
467
|
downloadMp4: "Baixar MP4",
|
|
466
468
|
embedsNeedPublic: "As incorporações precisam de um clipe público",
|
|
467
469
|
embedPublicDescription:
|
|
@@ -1240,9 +1242,11 @@ Todas as mudanças visíveis para usuários do Clips são documentadas aqui. Voc
|
|
|
1240
1242
|
visibilityOrg: "Organization (Localizado)",
|
|
1241
1243
|
visibilityPublic: "Public (Localizado)",
|
|
1242
1244
|
passwordProtection: "Password protection (Localizado)",
|
|
1243
|
-
passwordSetPlaceholder:
|
|
1244
|
-
"Password is set — type to replace, leave empty + Save to clear (Localizado)",
|
|
1245
|
+
passwordSetPlaceholder: "Password is set — type to replace (Localizado)",
|
|
1245
1246
|
noPasswordPlaceholder: "No password (Localizado)",
|
|
1247
|
+
passwordWhitespaceOnly:
|
|
1248
|
+
"Spaces alone aren't a valid password. (Localizado)",
|
|
1249
|
+
removePassword: "Remove (Localizado)",
|
|
1246
1250
|
expiry: "Expiry (Localizado)",
|
|
1247
1251
|
viewerOptions: "Viewer options (Localizado)",
|
|
1248
1252
|
comments: "Comments (Localizado)",
|
|
@@ -435,6 +435,8 @@ const messages = {
|
|
|
435
435
|
retryAgentLink: "重试",
|
|
436
436
|
gifPreview: "GIF 预览",
|
|
437
437
|
openPlayer: "开放玩家",
|
|
438
|
+
chooseFile: "选择文件",
|
|
439
|
+
remove: "消除",
|
|
438
440
|
downloadMp4: "下载MP4",
|
|
439
441
|
embedsNeedPublic: "嵌入需要公共剪辑",
|
|
440
442
|
embedPublicDescription:
|
|
@@ -1184,9 +1186,10 @@ Clips 中所有面向用户的重要更改都会记录在这里。你可以随
|
|
|
1184
1186
|
visibilityOrg: "Organization (已本地化)",
|
|
1185
1187
|
visibilityPublic: "Public (已本地化)",
|
|
1186
1188
|
passwordProtection: "Password protection (已本地化)",
|
|
1187
|
-
passwordSetPlaceholder:
|
|
1188
|
-
"Password is set — type to replace, leave empty + Save to clear (已本地化)",
|
|
1189
|
+
passwordSetPlaceholder: "Password is set — type to replace (已本地化)",
|
|
1189
1190
|
noPasswordPlaceholder: "No password (已本地化)",
|
|
1191
|
+
passwordWhitespaceOnly: "Spaces alone aren't a valid password. (已本地化)",
|
|
1192
|
+
removePassword: "Remove (已本地化)",
|
|
1190
1193
|
expiry: "Expiry (已本地化)",
|
|
1191
1194
|
viewerOptions: "Viewer options (已本地化)",
|
|
1192
1195
|
comments: "Comments (已本地化)",
|
|
@@ -435,6 +435,8 @@ const messages = {
|
|
|
435
435
|
retryAgentLink: "重試",
|
|
436
436
|
gifPreview: "GIF 預覽",
|
|
437
437
|
openPlayer: "開啟播放器",
|
|
438
|
+
chooseFile: "選取檔案",
|
|
439
|
+
remove: "消除",
|
|
438
440
|
downloadMp4: "下載 MP4",
|
|
439
441
|
embedsNeedPublic: "嵌入需要公開剪輯",
|
|
440
442
|
embedPublicDescription:
|
|
@@ -1169,9 +1171,10 @@ const messages = {
|
|
|
1169
1171
|
visibilityOrg: "組織",
|
|
1170
1172
|
visibilityPublic: "公開",
|
|
1171
1173
|
passwordProtection: "密碼保護",
|
|
1172
|
-
passwordSetPlaceholder:
|
|
1173
|
-
"已設定密碼。輸入新密碼即可取代;留空並儲存即可清除。",
|
|
1174
|
+
passwordSetPlaceholder: "已設定密碼。輸入新密碼即可取代。",
|
|
1174
1175
|
noPasswordPlaceholder: "無密碼",
|
|
1176
|
+
passwordWhitespaceOnly: "只有空格不是有效的密碼。",
|
|
1177
|
+
removePassword: "移除",
|
|
1175
1178
|
expiry: "到期時間",
|
|
1176
1179
|
viewerOptions: "觀看者選項",
|
|
1177
1180
|
comments: "留言",
|
|
@@ -198,6 +198,20 @@ export function getKeptRanges(
|
|
|
198
198
|
return out;
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
+
/** Move a source timestamp to the first visible timestamp after a cut. */
|
|
202
|
+
export function skipExcludedRange(
|
|
203
|
+
ms: number,
|
|
204
|
+
excludedRanges: Pick<TrimRange, "startMs" | "endMs">[],
|
|
205
|
+
durationMs: number,
|
|
206
|
+
): number {
|
|
207
|
+
const range = excludedRanges.find(
|
|
208
|
+
(candidate) => ms >= candidate.startMs && ms < candidate.endMs,
|
|
209
|
+
);
|
|
210
|
+
if (!range) return ms;
|
|
211
|
+
const next = Math.max(ms, range.endMs);
|
|
212
|
+
return durationMs > 0 ? Math.min(next, durationMs) : next;
|
|
213
|
+
}
|
|
214
|
+
|
|
201
215
|
/**
|
|
202
216
|
* Merge a new excluded range into the edits, collapsing adjacent/overlapping
|
|
203
217
|
* entries. Preserves existing non-excluded (split) markers as-is.
|
|
@@ -6,8 +6,7 @@ import { NavLink } from "react-router";
|
|
|
6
6
|
import { LibraryGrid } from "@/components/library/library-grid";
|
|
7
7
|
import { usePageHeaderLayout } from "@/components/library/page-header";
|
|
8
8
|
|
|
9
|
-
const SEO_TITLE =
|
|
10
|
-
"Agent-Native Clips - Open Source, agent-friendly Loom alternative";
|
|
9
|
+
const SEO_TITLE = "Agent-Native Clips - Open Source screen recorder";
|
|
11
10
|
const SEO_DESCRIPTION =
|
|
12
11
|
"Open Source screen recorder and meeting-notes app with AI transcripts, summaries, search, dictation, and agent-readable share links.";
|
|
13
12
|
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { DefaultSpinner } from "@agent-native/core/client";
|
|
2
2
|
import { redirect, type LoaderFunctionArgs } from "react-router";
|
|
3
3
|
|
|
4
|
-
const SEO_TITLE =
|
|
5
|
-
"Agent-Native Clips - Open Source, agent-friendly Loom alternative";
|
|
4
|
+
const SEO_TITLE = "Agent-Native Clips - Open Source screen recorder";
|
|
6
5
|
const SEO_DESCRIPTION =
|
|
7
6
|
"Open Source screen recorder and meeting-notes app with AI transcripts, summaries, search, dictation, and agent-readable share links.";
|
|
8
7
|
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
isLoomEmbedBackedRecording,
|
|
21
21
|
isLoomRecordingSource,
|
|
22
22
|
} from "@shared/loom";
|
|
23
|
+
import { CLIP_SHARE_REF, REF_PARAM } from "@shared/share-attribution";
|
|
23
24
|
import {
|
|
24
25
|
IconShare3,
|
|
25
26
|
IconArrowLeft,
|
|
@@ -205,6 +206,10 @@ function parseTimeParam(raw: string | null): number {
|
|
|
205
206
|
return (hours * 3600 + minutes * 60 + seconds) * 1000;
|
|
206
207
|
}
|
|
207
208
|
|
|
209
|
+
function buildSignInHref(returnTo: string): string {
|
|
210
|
+
return `${agentNativePath("/_agent-native/sign-in")}?return=${encodeURIComponent(returnTo)}`;
|
|
211
|
+
}
|
|
212
|
+
|
|
208
213
|
export default function RecordingPage() {
|
|
209
214
|
const t = useT();
|
|
210
215
|
useAutoTitleBridge();
|
|
@@ -256,6 +261,7 @@ export default function RecordingPage() {
|
|
|
256
261
|
);
|
|
257
262
|
const lastPlayerStateWriteRef = useRef(0);
|
|
258
263
|
const readyMediaPollRef = useRef<{ key: string; until: number } | null>(null);
|
|
264
|
+
const [metadataRefreshUntil, setMetadataRefreshUntil] = useState(0);
|
|
259
265
|
|
|
260
266
|
useEffect(() => {
|
|
261
267
|
if (
|
|
@@ -325,11 +331,37 @@ export default function RecordingPage() {
|
|
|
325
331
|
// `update-recording` and we want the skeleton to swap in promptly.
|
|
326
332
|
if (shouldShowGeneratedTitleSkeleton(rec, data?.transcript?.status))
|
|
327
333
|
return 3000;
|
|
334
|
+
if (Date.now() < metadataRefreshUntil) return 2000;
|
|
328
335
|
return false;
|
|
329
336
|
},
|
|
330
337
|
},
|
|
331
338
|
);
|
|
332
339
|
|
|
340
|
+
const playerDataAccessStatus = playerDataQ.isError
|
|
341
|
+
? (playerDataQ.error as { status?: number } | undefined)?.status
|
|
342
|
+
: undefined;
|
|
343
|
+
// Signed-out requests never even reach `resolveAccess` — the action route's
|
|
344
|
+
// default auth gate rejects them with 401 first. Authenticated viewers with
|
|
345
|
+
// no share grant (or a deleted/mismatched id) get 403 from `resolveAccess`
|
|
346
|
+
// inside `get-recording-player-data`. Both mean "can't open the direct
|
|
347
|
+
// owner/editor route here".
|
|
348
|
+
const playerDataForbidden =
|
|
349
|
+
playerDataAccessStatus === 401 || playerDataAccessStatus === 403;
|
|
350
|
+
|
|
351
|
+
// A direct `/r/:id` visit without edit/view access (signed out, no share
|
|
352
|
+
// grant, wrong org) can't do anything useful here — send the visitor to the
|
|
353
|
+
// public share flow instead, which knows how to prompt for sign-in or a
|
|
354
|
+
// password.
|
|
355
|
+
useEffect(() => {
|
|
356
|
+
if (!recordingId || !playerDataForbidden) return;
|
|
357
|
+
navigate(
|
|
358
|
+
`/share/${encodeURIComponent(recordingId)}?${REF_PARAM}=${CLIP_SHARE_REF}`,
|
|
359
|
+
{
|
|
360
|
+
replace: true,
|
|
361
|
+
},
|
|
362
|
+
);
|
|
363
|
+
}, [recordingId, playerDataForbidden, navigate]);
|
|
364
|
+
|
|
333
365
|
const recording = playerDataQ.data?.recording;
|
|
334
366
|
const role = playerDataQ.data?.role as
|
|
335
367
|
| "owner"
|
|
@@ -542,6 +574,8 @@ export default function RecordingPage() {
|
|
|
542
574
|
});
|
|
543
575
|
const regenerateTitle = useActionMutation("regenerate-title" as any, {
|
|
544
576
|
onSuccess: (result: any) => {
|
|
577
|
+
setMetadataRefreshUntil(Date.now() + 60_000);
|
|
578
|
+
void playerDataQ.refetch();
|
|
545
579
|
if (result?.updated) {
|
|
546
580
|
toast.success(t("recordingPage.titleUpdated"));
|
|
547
581
|
} else if (result?.reason === "builder_credits_paused") {
|
|
@@ -559,7 +593,11 @@ export default function RecordingPage() {
|
|
|
559
593
|
onError: handleAiError,
|
|
560
594
|
});
|
|
561
595
|
const regenerateSummary = useActionMutation("regenerate-summary" as any, {
|
|
562
|
-
onSuccess: () =>
|
|
596
|
+
onSuccess: () => {
|
|
597
|
+
setMetadataRefreshUntil(Date.now() + 60_000);
|
|
598
|
+
void playerDataQ.refetch();
|
|
599
|
+
toast.success(t("recordingPage.descriptionQueued"));
|
|
600
|
+
},
|
|
563
601
|
onError: handleAiError,
|
|
564
602
|
});
|
|
565
603
|
const regenerateChapters = useActionMutation("regenerate-chapters" as any, {
|
|
@@ -614,17 +652,22 @@ export default function RecordingPage() {
|
|
|
614
652
|
}
|
|
615
653
|
function handleGenerateWorkflow(kind: WorkflowKind) {
|
|
616
654
|
if (!recording) return;
|
|
655
|
+
if (generatedWorkflow?.status === "generating") return;
|
|
617
656
|
setEditing(false);
|
|
618
657
|
setPanel("agent");
|
|
619
658
|
window.dispatchEvent(
|
|
620
659
|
new CustomEvent("agent-panel:set-mode", { detail: { mode: "chat" } }),
|
|
621
660
|
);
|
|
661
|
+
window.dispatchEvent(new Event("agent-panel:open"));
|
|
622
662
|
generateWorkflow.mutate({
|
|
623
663
|
recordingId: recording.id,
|
|
624
664
|
kind,
|
|
625
665
|
} as any);
|
|
626
666
|
}
|
|
627
667
|
|
|
668
|
+
const workflowBusy =
|
|
669
|
+
generateWorkflow.isPending || generatedWorkflow?.status === "generating";
|
|
670
|
+
|
|
628
671
|
useEffect(() => {
|
|
629
672
|
if (recording && panel === "settings" && !canEdit) setPanel("agent");
|
|
630
673
|
}, [canEdit, panel, recording]);
|
|
@@ -700,7 +743,7 @@ export default function RecordingPage() {
|
|
|
700
743
|
|
|
701
744
|
if (!recordingId) return null;
|
|
702
745
|
|
|
703
|
-
if (playerDataQ.isLoading) {
|
|
746
|
+
if (playerDataQ.isLoading || playerDataForbidden) {
|
|
704
747
|
return (
|
|
705
748
|
<div className="flex items-center justify-center h-screen w-full bg-background">
|
|
706
749
|
<Spinner className="h-8 w-8" />
|
|
@@ -709,18 +752,36 @@ export default function RecordingPage() {
|
|
|
709
752
|
}
|
|
710
753
|
|
|
711
754
|
if (playerDataQ.isError || !recording) {
|
|
755
|
+
const needsSignIn = !session;
|
|
756
|
+
const returnTo =
|
|
757
|
+
typeof window === "undefined"
|
|
758
|
+
? `/r/${recordingId}`
|
|
759
|
+
: window.location.pathname + window.location.search;
|
|
712
760
|
return (
|
|
713
761
|
<div className="flex flex-col items-center justify-center h-screen w-full bg-background px-6">
|
|
714
762
|
<h1 className="text-xl font-semibold mb-2">
|
|
715
|
-
{
|
|
763
|
+
{needsSignIn
|
|
764
|
+
? t("sharePage.clipUnavailable")
|
|
765
|
+
: t("recordingPage.recordingNotFound")}
|
|
716
766
|
</h1>
|
|
717
767
|
<p className="text-sm text-muted-foreground mb-4">
|
|
718
|
-
{
|
|
719
|
-
t("
|
|
768
|
+
{needsSignIn
|
|
769
|
+
? t("sharePage.clipUnavailableMessage")
|
|
770
|
+
: ((playerDataQ.error as Error | undefined)?.message ??
|
|
771
|
+
t("recordingPage.noAccess"))}
|
|
720
772
|
</p>
|
|
721
|
-
<
|
|
722
|
-
|
|
723
|
-
|
|
773
|
+
<div className="flex flex-wrap items-center justify-center gap-2">
|
|
774
|
+
{needsSignIn ? (
|
|
775
|
+
<Button asChild>
|
|
776
|
+
<a href={buildSignInHref(returnTo)}>{t("sharePage.signIn")}</a>
|
|
777
|
+
</Button>
|
|
778
|
+
) : null}
|
|
779
|
+
<Button asChild variant="outline">
|
|
780
|
+
<Link to="/library" replace>
|
|
781
|
+
{t("recordingPage.backToLibrary")}
|
|
782
|
+
</Link>
|
|
783
|
+
</Button>
|
|
784
|
+
</div>
|
|
724
785
|
</div>
|
|
725
786
|
);
|
|
726
787
|
}
|
|
@@ -784,7 +845,7 @@ export default function RecordingPage() {
|
|
|
784
845
|
className="shrink-0"
|
|
785
846
|
aria-label={t("recordingPage.back")}
|
|
786
847
|
>
|
|
787
|
-
<Link to="/">
|
|
848
|
+
<Link to="/library" replace>
|
|
788
849
|
<IconArrowLeft className="h-4 w-4 rtl:-scale-x-100" />
|
|
789
850
|
</Link>
|
|
790
851
|
</Button>
|
|
@@ -956,7 +1017,9 @@ export default function RecordingPage() {
|
|
|
956
1017
|
: t("recordingPage.checkAgain")}
|
|
957
1018
|
</Button>
|
|
958
1019
|
<Button asChild variant="ghost" size="sm">
|
|
959
|
-
<Link to="/">
|
|
1020
|
+
<Link to="/library" replace>
|
|
1021
|
+
{t("recordingPage.backToLibrary")}
|
|
1022
|
+
</Link>
|
|
960
1023
|
</Button>
|
|
961
1024
|
</div>
|
|
962
1025
|
</div>
|
|
@@ -1136,7 +1199,7 @@ export default function RecordingPage() {
|
|
|
1136
1199
|
className="shrink-0"
|
|
1137
1200
|
aria-label={t("recordingPage.back")}
|
|
1138
1201
|
>
|
|
1139
|
-
<Link to="/">
|
|
1202
|
+
<Link to="/library" replace>
|
|
1140
1203
|
<IconArrowLeft className="h-4 w-4 rtl:-scale-x-100" />
|
|
1141
1204
|
</Link>
|
|
1142
1205
|
</Button>
|
|
@@ -1174,7 +1237,7 @@ export default function RecordingPage() {
|
|
|
1174
1237
|
</Button>
|
|
1175
1238
|
) : null}
|
|
1176
1239
|
|
|
1177
|
-
{canEdit ? (
|
|
1240
|
+
{canEdit && !editing ? (
|
|
1178
1241
|
<DropdownMenu>
|
|
1179
1242
|
<DropdownMenuTrigger asChild>
|
|
1180
1243
|
<Button
|
|
@@ -1221,6 +1284,7 @@ export default function RecordingPage() {
|
|
|
1221
1284
|
onSelect={() =>
|
|
1222
1285
|
regenerateSummary.mutate({
|
|
1223
1286
|
recordingId: recording.id,
|
|
1287
|
+
openInChat: true,
|
|
1224
1288
|
} as any)
|
|
1225
1289
|
}
|
|
1226
1290
|
>
|
|
@@ -1264,7 +1328,7 @@ export default function RecordingPage() {
|
|
|
1264
1328
|
const menuItem = (
|
|
1265
1329
|
<DropdownMenuItem
|
|
1266
1330
|
key={item.kind}
|
|
1267
|
-
disabled={
|
|
1331
|
+
disabled={workflowBusy}
|
|
1268
1332
|
onSelect={() => handleGenerateWorkflow(item.kind)}
|
|
1269
1333
|
className={
|
|
1270
1334
|
item.tooltipKey ? "justify-between gap-3" : undefined
|
|
@@ -1319,24 +1383,26 @@ export default function RecordingPage() {
|
|
|
1319
1383
|
</DropdownMenu>
|
|
1320
1384
|
) : null}
|
|
1321
1385
|
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
<Button
|
|
1333
|
-
className="shrink-0 gap-1.5 bg-primary text-primary-foreground hover:bg-primary/90"
|
|
1334
|
-
size="sm"
|
|
1386
|
+
{!editing ? (
|
|
1387
|
+
<ShareRecordingPopover
|
|
1388
|
+
recordingId={recording.id}
|
|
1389
|
+
recordingTitle={recording.title}
|
|
1390
|
+
initialVisibility={recording.visibility}
|
|
1391
|
+
initialRole={role}
|
|
1392
|
+
videoUrl={recording.videoUrl}
|
|
1393
|
+
animatedThumbnailUrl={recording.animatedThumbnailUrl}
|
|
1394
|
+
isLoomRecording={isLoomEmbedBacked}
|
|
1395
|
+
hasPassword={Boolean(recording.hasPassword)}
|
|
1335
1396
|
>
|
|
1336
|
-
<
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1397
|
+
<Button
|
|
1398
|
+
className="shrink-0 gap-1.5 bg-primary text-primary-foreground hover:bg-primary/90"
|
|
1399
|
+
size="sm"
|
|
1400
|
+
>
|
|
1401
|
+
<IconShare3 className="h-4 w-4" />
|
|
1402
|
+
{t("recordingPage.share")}
|
|
1403
|
+
</Button>
|
|
1404
|
+
</ShareRecordingPopover>
|
|
1405
|
+
) : null}
|
|
1340
1406
|
|
|
1341
1407
|
{canDelete || canDownloadRecording ? (
|
|
1342
1408
|
<RecordingOptionsMenu
|
|
@@ -1486,7 +1552,7 @@ export default function RecordingPage() {
|
|
|
1486
1552
|
) : null}
|
|
1487
1553
|
</div>
|
|
1488
1554
|
{recording.description ? (
|
|
1489
|
-
<p className="mt-3
|
|
1555
|
+
<p className="mt-3 whitespace-pre-wrap break-words text-sm text-muted-foreground">
|
|
1490
1556
|
{recording.description}
|
|
1491
1557
|
</p>
|
|
1492
1558
|
) : null}
|
|
@@ -1528,7 +1594,7 @@ function GeneratedWorkflowNotice({
|
|
|
1528
1594
|
const status = workflow.status ?? (workflow.content ? "ready" : "generating");
|
|
1529
1595
|
const content =
|
|
1530
1596
|
typeof workflow.content === "string" ? workflow.content.trim() : "";
|
|
1531
|
-
const isReady = status
|
|
1597
|
+
const isReady = status !== "failed" && content.length > 0;
|
|
1532
1598
|
const isFailed = status === "failed";
|
|
1533
1599
|
const title = workflowTitle(workflow.kind);
|
|
1534
1600
|
|
|
@@ -855,6 +855,8 @@ export default function ShareRoute() {
|
|
|
855
855
|
<Button variant="ghost" size="sm" asChild>
|
|
856
856
|
<a
|
|
857
857
|
href={appPath("/")}
|
|
858
|
+
target="_blank"
|
|
859
|
+
rel="noopener noreferrer"
|
|
858
860
|
className="gap-1.5"
|
|
859
861
|
onClick={() => fireShareCtaClick("try_clips")}
|
|
860
862
|
>
|
|
@@ -965,7 +967,7 @@ export default function ShareRoute() {
|
|
|
965
967
|
</h2>
|
|
966
968
|
)}
|
|
967
969
|
{recording.description ? (
|
|
968
|
-
<p className="text-sm text-muted-foreground
|
|
970
|
+
<p className="whitespace-pre-wrap break-words text-sm text-muted-foreground">
|
|
969
971
|
{recording.description}
|
|
970
972
|
</p>
|
|
971
973
|
) : null}
|
|
@@ -1063,6 +1065,7 @@ export default function ShareRoute() {
|
|
|
1063
1065
|
t("recordingPage.draftQuestions"),
|
|
1064
1066
|
]}
|
|
1065
1067
|
browserTabId={getBrowserTabId()}
|
|
1068
|
+
showHeader={false}
|
|
1066
1069
|
/>
|
|
1067
1070
|
) : (
|
|
1068
1071
|
<PublicAgentEmptyState
|