@agent-native/core 0.92.12 → 0.93.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 +39 -0
- package/corpus/core/docs/content/automation-connectors.mdx +80 -0
- package/corpus/core/docs/content/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/ar-SA/messaging.mdx +84 -15
- package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/de-DE/extensions.mdx +10 -0
- package/corpus/core/docs/content/locales/de-DE/messaging.mdx +92 -15
- package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/es-ES/extensions.mdx +10 -0
- package/corpus/core/docs/content/locales/es-ES/messaging.mdx +91 -15
- package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +10 -0
- package/corpus/core/docs/content/locales/fr-FR/messaging.mdx +91 -15
- package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/hi-IN/messaging.mdx +81 -15
- package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +9 -0
- package/corpus/core/docs/content/locales/ja-JP/messaging.mdx +81 -15
- package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/ko-KR/messaging.mdx +80 -15
- package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +9 -0
- package/corpus/core/docs/content/locales/pt-BR/messaging.mdx +88 -15
- package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +6 -0
- package/corpus/core/docs/content/locales/zh-CN/messaging.mdx +78 -15
- package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +6 -0
- package/corpus/core/docs/content/locales/zh-TW/messaging.mdx +78 -15
- package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +1 -0
- package/corpus/core/docs/content/messaging.mdx +227 -45
- package/corpus/core/docs/content/template-clips.mdx +3 -0
- package/corpus/core/docs/content/template-design.mdx +4 -0
- package/corpus/core/package.json +5 -1
- package/corpus/core/src/a2a/artifact-response.ts +131 -2
- package/corpus/core/src/a2a/client.ts +10 -0
- package/corpus/core/src/a2a/handlers.ts +40 -76
- package/corpus/core/src/a2a/types.ts +2 -0
- package/corpus/core/src/agent/durable-background.ts +24 -0
- package/corpus/core/src/agent/production-agent.ts +15 -3
- package/corpus/core/src/agent/run-manager.ts +130 -10
- package/corpus/core/src/agent/run-store.ts +225 -15
- package/corpus/core/src/agent/types.ts +23 -0
- package/corpus/core/src/audit/record.ts +31 -0
- package/corpus/core/src/audit/store.ts +69 -3
- package/corpus/core/src/audit/types.ts +13 -0
- package/corpus/core/src/automation/index.ts +802 -0
- package/corpus/core/src/cli/create.ts +12 -5
- package/corpus/core/src/cli/design-connect.ts +596 -36
- package/corpus/core/src/client/AgentPanel.tsx +51 -6
- package/corpus/core/src/client/AssistantChat.tsx +274 -147
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +3 -0
- package/corpus/core/src/client/RunStuckBanner.tsx +69 -20
- package/corpus/core/src/client/agent-chat-adapter.ts +54 -5
- package/corpus/core/src/client/automation.ts +22 -0
- package/corpus/core/src/client/chat/run-recovery.tsx +67 -50
- package/corpus/core/src/client/composer/TiptapComposer.tsx +8 -0
- package/corpus/core/src/client/index.ts +30 -0
- package/corpus/core/src/client/integrations/api.ts +295 -0
- package/corpus/core/src/client/integrations/index.ts +26 -0
- package/corpus/core/src/client/transcription/use-live-transcription.ts +68 -5
- package/corpus/core/src/client/use-run-stuck-detection.ts +41 -3
- package/corpus/core/src/deploy/build.ts +59 -3
- package/corpus/core/src/deploy/workspace-deploy.ts +37 -2
- package/corpus/core/src/file-upload/types.ts +2 -0
- package/corpus/core/src/index.ts +37 -0
- package/corpus/core/src/integrations/a2a-continuations-store.ts +6 -4
- package/corpus/core/src/integrations/adapters/discord.ts +362 -0
- package/corpus/core/src/integrations/adapters/index.ts +29 -0
- package/corpus/core/src/integrations/adapters/microsoft-teams.ts +411 -0
- package/corpus/core/src/integrations/adapters/slack.ts +861 -27
- package/corpus/core/src/integrations/adapters/telegram.ts +54 -15
- package/corpus/core/src/integrations/adapters/whatsapp.ts +41 -17
- package/corpus/core/src/integrations/catalog.ts +571 -0
- package/corpus/core/src/integrations/controls-store.ts +187 -0
- package/corpus/core/src/integrations/index.ts +100 -0
- package/corpus/core/src/integrations/installations-store.ts +677 -0
- package/corpus/core/src/integrations/integration-memory.ts +187 -0
- package/corpus/core/src/integrations/pending-tasks-retry-job.ts +6 -6
- package/corpus/core/src/integrations/pending-tasks-store.ts +83 -5
- package/corpus/core/src/integrations/plugin.ts +685 -47
- package/corpus/core/src/integrations/scope-store.ts +498 -0
- package/corpus/core/src/integrations/slack-manifest.ts +78 -0
- package/corpus/core/src/integrations/slack-oauth.ts +343 -0
- package/corpus/core/src/integrations/types.ts +179 -0
- package/corpus/core/src/integrations/usage-budget-store.ts +906 -0
- package/corpus/core/src/integrations/webhook-handler.ts +562 -51
- package/corpus/core/src/jobs/scheduler.ts +100 -2
- package/corpus/core/src/jobs/tools.ts +45 -9
- package/corpus/core/src/provider-api/index.ts +72 -1
- package/corpus/core/src/resources/handlers.ts +88 -14
- package/corpus/core/src/resources/script-helpers.ts +36 -7
- package/corpus/core/src/resources/store.ts +59 -52
- package/corpus/core/src/scripts/call-agent.ts +107 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +294 -119
- package/corpus/core/src/server/auth.ts +10 -14
- package/corpus/core/src/server/builder-design-systems.ts +16 -1
- package/corpus/core/src/server/edge.ts +18 -0
- package/corpus/core/src/server/index.ts +26 -0
- package/corpus/core/src/server/request-context.ts +18 -0
- package/corpus/core/src/server/social-og-image.ts +3 -2
- package/corpus/core/src/styles/agent-native.css +62 -44
- package/corpus/core/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/core/src/templates/default/AGENTS.md +7 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/core/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
- package/corpus/core/src/templates/workspace-core/AGENTS.md +3 -2
- package/corpus/core/src/usage/store.ts +37 -2
- package/corpus/templates/analytics/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +23 -0
- package/corpus/templates/analytics/.builder/skills/provider-api/SKILL.md +15 -0
- package/corpus/templates/analytics/actions/save-monitor.ts +25 -2
- package/corpus/templates/analytics/app/lib/data-sources.ts +28 -0
- package/corpus/templates/analytics/changelog/2026-07-10-agent-created-uptime-monitors-now-return-a-direct-link-to-th.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-10-dashboard-email-reports-still-arrive-when-screenshot-capture-temporarily-fails.md +6 -0
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +3 -7
- package/corpus/templates/analytics/server/lib/credential-keys.ts +12 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +5 -1
- package/corpus/templates/analytics/server/lib/provider-credentials.ts +2 -0
- package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +16 -0
- package/corpus/templates/assets/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/brain/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/calendar/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +98 -108
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +97 -90
- package/corpus/templates/calendar/changelog/2026-07-10-event-guest-details-and-option-menus-now-use-valid-accessibl.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-10-natural-language-event-phrases-stay-available-as-quick-creat.md +6 -0
- package/corpus/templates/chat/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
- package/corpus/templates/clips/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/clips/.agents/skills/recording/SKILL.md +17 -1
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +8 -0
- package/corpus/templates/clips/AGENTS.md +8 -3
- package/corpus/templates/clips/actions/finalize-recording.ts +63 -23
- package/corpus/templates/clips/actions/get-recording-player-data.ts +6 -2
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +72 -9
- package/corpus/templates/clips/actions/list-recordings.ts +19 -3
- package/corpus/templates/clips/actions/navigate.ts +2 -0
- package/corpus/templates/clips/actions/reprocess-recording.ts +20 -6
- package/corpus/templates/clips/actions/request-transcript.ts +16 -31
- package/corpus/templates/clips/actions/view-screen.ts +57 -5
- package/corpus/templates/clips/app/components/layout/Header.tsx +1 -0
- package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -0
- package/corpus/templates/clips/app/components/library/library-grid.tsx +69 -42
- package/corpus/templates/clips/app/components/library/library-layout.tsx +15 -1
- package/corpus/templates/clips/app/components/library/recording-card.tsx +81 -68
- package/corpus/templates/clips/app/components/library/search-bar.tsx +4 -3
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +9 -3
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -1
- package/corpus/templates/clips/app/hooks/use-library.ts +1 -1
- package/corpus/templates/clips/app/hooks/use-navigation-state.ts +10 -2
- package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +7 -1
- package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +8 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +8 -1
- package/corpus/templates/clips/app/lib/recording-visibility.ts +70 -0
- package/corpus/templates/clips/app/routes/_app.shared.tsx +20 -0
- package/corpus/templates/clips/app/routes/download.tsx +24 -8
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +115 -2
- package/corpus/templates/clips/app/routes/record.tsx +62 -0
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +25 -16
- package/corpus/templates/clips/changelog/2026-07-10-clips-desktop-is-now-available-for-linux-with-appimage-debia.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-clips-downloads-updates-sooner-in-the-background-and-offers-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-clips-shared-with-you-now-appear-in-a-searchable-shared-with.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-clips-with-missing-mobile-video-frames-can-be-repaired-witho.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-mobile-camera-recordings-pause-while-backgrounded.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-mp4-downloads-now-show-progress-immediately-after-the-option.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-recording-pages-now-open-as-soon-as-you-stop-with-a-share-li.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-recordings-now-seek-smoothly-downloads-use-the-correct-file-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-s3-compatible-storage-now-saves-hosted-recordings-without-re.md +6 -0
- package/corpus/templates/clips/desktop/README.md +22 -6
- package/corpus/templates/clips/desktop/package.json +1 -1
- package/corpus/templates/clips/desktop/src/app.tsx +32 -19
- package/corpus/templates/clips/desktop/src/components/ReadinessPanel.tsx +15 -9
- package/corpus/templates/clips/desktop/src/lib/finalization-guard.ts +22 -0
- package/corpus/templates/clips/desktop/src/lib/permissions.ts +3 -1
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +97 -120
- package/corpus/templates/clips/desktop/src/lib/updater.ts +26 -4
- package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +4 -8
- package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +1 -1
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +2 -2
- package/corpus/templates/clips/desktop/src-tauri/src/permission_status.rs +11 -7
- package/corpus/templates/clips/desktop/src-tauri/tauri.linux.conf.json +11 -0
- package/corpus/templates/clips/netlify.toml +3 -0
- package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +106 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +9 -1
- package/corpus/templates/clips/server/lib/resumable-upload-provider.ts +52 -0
- package/corpus/templates/clips/server/lib/s3-upload-provider.ts +433 -85
- package/corpus/templates/clips/server/lib/video-remux.ts +114 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +109 -0
- package/corpus/templates/clips/server/routes/api/clips-updater.json.get.ts +22 -11
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +4 -2
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +47 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +10 -2
- package/corpus/templates/clips/shared/share-loader-response.ts +12 -0
- package/corpus/templates/clips/shared/transcript-status.ts +40 -0
- package/corpus/templates/content/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/content/.agents/skills/content/SKILL.md +57 -5
- package/corpus/templates/content/AGENTS.md +65 -55
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +10 -16
- package/corpus/templates/content/actions/_database-source-utils.ts +58 -11
- package/corpus/templates/content/actions/_property-utils.ts +30 -2
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +312 -114
- package/corpus/templates/content/actions/submit-content-database-form.ts +497 -0
- package/corpus/templates/content/actions/update-content-database-view.ts +8 -1
- package/corpus/templates/content/actions/view-screen.ts +4 -1
- package/corpus/templates/content/agent-native.app-skill.json +1 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +250 -64
- package/corpus/templates/content/app/components/editor/database/FormView.tsx +460 -0
- package/corpus/templates/content/app/components/editor/database/navigation-state.ts +3 -0
- package/corpus/templates/content/app/components/editor/database/settings.tsx +30 -37
- package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
- package/corpus/templates/content/app/components/editor/database/view-config.ts +29 -1
- package/corpus/templates/content/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +22 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +21 -0
- package/corpus/templates/content/app/i18n-data.ts +225 -0
- package/corpus/templates/content/changelog/2026-07-10-builder-backed-properties-now-load-current-source-values-as-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-builder-database-refreshes-now-stay-explicit-and-accurate.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-database-form-views-now-collect-ordered-required-answers-and.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-database-tables-now-use-a-quieter-more-compact-layout-with-c.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-slack-intake-routes-to-content-database-forms.md +6 -0
- package/corpus/templates/content/parity/matrix.md +1 -0
- package/corpus/templates/content/parity/matrix.ts +18 -0
- package/corpus/templates/content/shared/api.ts +27 -1
- package/corpus/templates/content/shared/database-form.ts +53 -0
- package/corpus/templates/design/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +26 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +85 -12
- package/corpus/templates/design/AGENTS.md +72 -18
- package/corpus/templates/design/DESIGN.md +1 -1
- package/corpus/templates/design/DEVELOPING.md +1 -1
- package/corpus/templates/design/FIGMA_INTEROPERABILITY.md +116 -0
- package/corpus/templates/design/actions/create-design-from-template.ts +220 -0
- package/corpus/templates/design/actions/create-design-system.ts +92 -16
- package/corpus/templates/design/actions/delete-design-template.ts +28 -0
- package/corpus/templates/design/actions/delete-file.ts +7 -0
- package/corpus/templates/design/actions/edit-design.ts +3 -0
- package/corpus/templates/design/actions/export-design-as-figma-svg.ts +137 -5
- package/corpus/templates/design/actions/export-pdf.ts +1 -1
- package/corpus/templates/design/actions/generate-design.ts +3 -0
- package/corpus/templates/design/actions/get-design-snapshot.ts +9 -0
- package/corpus/templates/design/actions/get-figma-connection-status.ts +26 -0
- package/corpus/templates/design/actions/get-figma-design-context.ts +138 -0
- package/corpus/templates/design/actions/get-figma-styles.ts +2 -2
- package/corpus/templates/design/actions/import-figma-clipboard.ts +112 -16
- package/corpus/templates/design/actions/import-figma-frame.ts +15 -4
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +4 -0
- package/corpus/templates/design/actions/list-design-templates.ts +118 -0
- package/corpus/templates/design/actions/navigate.ts +16 -2
- package/corpus/templates/design/actions/provider-api-request.ts +11 -1
- package/corpus/templates/design/actions/save-design-as-template.ts +156 -0
- package/corpus/templates/design/actions/set-active-breakpoint.ts +13 -4
- package/corpus/templates/design/actions/take-design-screenshot.ts +73 -3
- package/corpus/templates/design/actions/update-file.ts +39 -22
- package/corpus/templates/design/actions/view-screen.ts +36 -1
- package/corpus/templates/design/actions/write-local-file.ts +50 -38
- package/corpus/templates/design/app/components/design/AutoLayoutSuggestionDialog.tsx +151 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +20 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +251 -22
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +3 -3
- package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +384 -9
- package/corpus/templates/design/app/components/design/EditPanel.tsx +105 -32
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +58 -28
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -0
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +539 -53
- package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +40 -0
- package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +1 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +1 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +5 -1
- package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +2 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +3 -1
- package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +2 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +19 -0
- package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +1 -0
- package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +27 -0
- package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +137 -81
- package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +25 -5
- package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +1 -1
- package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +220 -3
- package/corpus/templates/design/app/components/design/multi-screen/overview-layout.ts +13 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +22 -1
- package/corpus/templates/design/app/components/design/types.ts +4 -0
- package/corpus/templates/design/app/components/design-system/ProductionDesignSystemShowcase.tsx +208 -0
- package/corpus/templates/design/app/components/editor/FigmaLinkComposerBubble.tsx +321 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +24 -4
- package/corpus/templates/design/app/components/layout/Layout.tsx +16 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -0
- package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +72 -0
- package/corpus/templates/design/app/global.css +2 -35
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +10 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +127 -5
- package/corpus/templates/design/app/i18n-breakpoints.ts +209 -0
- package/corpus/templates/design/app/i18n-data.ts +1317 -59
- package/corpus/templates/design/app/i18n-template-feature.ts +458 -0
- package/corpus/templates/design/app/lib/design-clipboard.ts +202 -0
- package/corpus/templates/design/app/lib/design-file-upload.ts +87 -0
- package/corpus/templates/design/app/lib/design-import.ts +168 -11
- package/corpus/templates/design/app/lib/desktop-design-preview.ts +423 -0
- package/corpus/templates/design/app/lib/figma-clipboard.ts +74 -8
- package/corpus/templates/design/app/lib/figma-connection.ts +161 -0
- package/corpus/templates/design/app/lib/figma-svg-copy.ts +814 -22
- package/corpus/templates/design/app/lib/figma-url.ts +77 -0
- package/corpus/templates/design/app/lib/pending-generation.ts +35 -0
- package/corpus/templates/design/app/pages/DesignSystems.tsx +236 -177
- package/corpus/templates/design/app/pages/Index.tsx +38 -0
- package/corpus/templates/design/app/pages/Templates.tsx +498 -0
- package/corpus/templates/design/app/pages/design-editor/auto-layout-suggestion.ts +328 -0
- package/corpus/templates/design/app/pages/design-editor/clone-idrefs.ts +113 -0
- package/corpus/templates/design/app/pages/design-editor/created-screen-navigation.ts +55 -0
- package/corpus/templates/design/app/pages/design-editor/editor-session.ts +32 -0
- package/corpus/templates/design/app/pages/design-editor/editor-state.ts +49 -2
- package/corpus/templates/design/app/pages/design-editor/export-capture.ts +296 -0
- package/corpus/templates/design/app/pages/design-editor/history.ts +101 -2
- package/corpus/templates/design/app/pages/design-editor/layout-operations.ts +28 -1
- package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +34 -0
- package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +202 -6
- package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +92 -0
- package/corpus/templates/design/app/pages/design-editor/save-failure.ts +58 -0
- package/corpus/templates/design/app/routes/templates.tsx +4 -6
- package/corpus/templates/design/changelog/2026-07-10-app-workspaces-now-use-clean-borderless-main-surfaces-throug.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-ask-chat-what-s-in-a-figma-file-or-frame-structure-screensho.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-canvas-edits-now-reject-malformed-html-before-it-can-corrupt.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-complex-designs-now-export-as-valid-secure-svgs-and-crisp-ra.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-complex-figma-masks-arcs-rich-text-transformed-images-and-ad.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-copied-layers-paste-across-designs-and-browser-tabs.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-copy-and-download-editable-figma-svg.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-copying-design-text-now-pastes-readable-text-into-other-apps.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-deleted-screens-can-be-restored-with-undo-and-removed-again-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-design-changes-now-save-before-switching-apps-and-retry-when.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-design-stays-usable-on-phones-by-keeping-editor-panels-and-f.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-download-all-screens-as-one-multi-page-pdf-from-the-overview.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-duplicated-layers-now-keep-labels-aria-relationships-fragmen.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fig-import-results-stay-compact.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-figma-imports-now-load-real-fonts-fix-rotated-gradient-dashe.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-figma-links-in-chat-and-the-import-tab-now-offer-secure-one-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-cmd-z-not-restoring-content-after-an-agent-driven-desi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-download-pdf-being-unreachable-from-the-export-panel-e.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-dragging-a-layer-out-of-an-auto-layout-row-column-no-l.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-figma-svg-export-text-wrapping-sizing-and-inner-layer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-hiding-or-locking-one-layer-no-longer-hides-or-blocks-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-png-screenshots-of-tall-screens-being-cropped-to-one-v.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-png-svg-exports-capturing-broken-layout-when-webfonts-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-frame-tool-now-offers-standard-ad-unit-size-presets-medium-r.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-full-view-controls-stay-within-their-frame-instead-of-coveri.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-hover-focus-focus-visible-pressed-and-disabled-states-now-pr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-layer-drops-now-land-in-the-intended-grid-row-stay-visually-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-local-code-workspaces-now-keep-unsaved-edits-across-panel-sw.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-local-visual-editing-now-keeps-authenticated-sessions-shared.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-long-running-agent-work-no-longer-shows-a-premature-stuck-wa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-managed-figma-connections-are-recognized-automatically.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-designs-can-open-directly-in-the-editor-without-a-pr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-screens-are-selected-and-revealed-immediately.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-text-layers-undo-as-one-safe-creation.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-preview-and-apply-inferred-auto-layout-without-changing-yo.md +5 -0
- package/corpus/templates/design/changelog/2026-07-10-print-pdf-exports-and-paper-size-presets-letter-a4-now-match.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-responsive-frame-editing.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-reusable-design-templates.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-screen-overview-frames-now-use-a-clearer-interact-action-wit.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-start-designs-from-source-linked-material-3-carbon-or-primer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-tweaks-guidance.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-uploaded-fig-files-can-now-become-editable-design-screens-wi.md +6 -0
- package/corpus/templates/design/e2e/helpers.ts +3 -3
- package/corpus/templates/design/package.json +2 -0
- package/corpus/templates/design/scripts/qa-figma-stress-import.ts +96 -0
- package/corpus/templates/design/server/db/index.ts +10 -0
- package/corpus/templates/design/server/db/schema.ts +44 -0
- package/corpus/templates/design/server/handlers/import-design-file.ts +114 -80
- package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +19 -6
- package/corpus/templates/design/server/lib/design-export.ts +240 -3
- package/corpus/templates/design/server/lib/design-template-data.ts +89 -0
- package/corpus/templates/design/server/lib/design-to-figma-svg.ts +250 -26
- package/corpus/templates/design/server/lib/fig-file-decoder.ts +839 -0
- package/corpus/templates/design/server/lib/fig-file-import.ts +287 -0
- package/corpus/templates/design/server/lib/fig-file-limits.ts +3 -0
- package/corpus/templates/design/server/lib/fig-file-to-html.ts +2568 -0
- package/corpus/templates/design/server/lib/figma-design-context.ts +359 -0
- package/corpus/templates/design/server/lib/figma-node-import.ts +478 -22
- package/corpus/templates/design/server/lib/figma-node-to-html.ts +554 -29
- package/corpus/templates/design/server/lib/local-figma-qa-upload.ts +112 -0
- package/corpus/templates/design/server/lib/verify-write-grant.ts +16 -2
- package/corpus/templates/design/server/lib/visible-clipboard-html.ts +13 -3
- package/corpus/templates/design/server/plugins/agent-chat.ts +7 -0
- package/corpus/templates/design/server/plugins/db.ts +42 -0
- package/corpus/templates/design/server/plugins/local-figma-qa-upload.ts +7 -0
- package/corpus/templates/design/server/register-secrets.ts +8 -8
- package/corpus/templates/design/server/routes/api/qa-figma-import-assets/[assetId].get.ts +46 -0
- package/corpus/templates/design/server/source-workspace.ts +104 -12
- package/corpus/templates/design/shared/code-layer.ts +105 -28
- package/corpus/templates/design/shared/design-system-templates.ts +301 -0
- package/corpus/templates/design/shared/design-template-presets.ts +195 -0
- package/corpus/templates/design/shared/figma-url.ts +8 -0
- package/corpus/templates/design/shared/html-integrity.ts +306 -0
- package/corpus/templates/design/shared/interaction-states.ts +318 -23
- package/corpus/templates/design/shared/locked-layers.ts +151 -0
- package/corpus/templates/dispatch/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +48 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +536 -1
- package/corpus/templates/dispatch/changelog/2026-07-10-connect-slack-workspaces-with-oauth-and-manage-channel-ident.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-10-microsoft-teams-bots-and-discord-slash-commands-can-now-conn.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-10-slack-and-telegram-now-route-uptime-monitor-requests-to-anal.md +6 -0
- package/corpus/templates/forms/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +7 -0
- package/corpus/templates/forms/AGENTS.md +4 -0
- package/corpus/templates/forms/actions/create-form.ts +44 -7
- package/corpus/templates/forms/actions/lib/assert-publishable-form.ts +38 -0
- package/corpus/templates/forms/actions/patch-form-fields.ts +4 -0
- package/corpus/templates/forms/actions/update-form.ts +2 -36
- package/corpus/templates/forms/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/forms/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/forms/app/i18n/en-US.ts +3 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/forms/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/forms/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/forms/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/forms/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/forms/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +17 -0
- package/corpus/templates/forms/changelog/2026-07-10-agent-created-published-forms-now-return-the-anonymous-publi.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-10-published-forms-can-no-longer-be-edited-into-an-unusable-emp.md +6 -0
- package/corpus/templates/forms/server/handlers/submissions.ts +4 -3
- package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/forms/shared/types.ts +5 -0
- package/corpus/templates/mail/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/mail/changelog/2026-07-10-mail-navigation-now-uses-a-clean-borderless-drawer.md +6 -0
- package/corpus/templates/plan/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +4 -1
- package/corpus/templates/plan/changelog/2026-07-10-local-plans-now-keep-valid-content-visible-when-one-generate.md +6 -0
- package/corpus/templates/plan/server/lib/local-plan-files.ts +4 -1
- package/corpus/templates/slides/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/dist/a2a/artifact-response.d.ts.map +1 -1
- package/dist/a2a/artifact-response.js +88 -2
- package/dist/a2a/artifact-response.js.map +1 -1
- package/dist/a2a/client.d.ts +9 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +1 -0
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +24 -69
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/types.d.ts +2 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/agent/durable-background.d.ts +11 -0
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +17 -0
- package/dist/agent/durable-background.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 +15 -5
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +44 -2
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +90 -9
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +109 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +206 -15
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/types.d.ts +22 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/audit/record.d.ts.map +1 -1
- package/dist/audit/record.js +29 -0
- package/dist/audit/record.js.map +1 -1
- package/dist/audit/store.d.ts.map +1 -1
- package/dist/audit/store.js +62 -3
- package/dist/audit/store.js.map +1 -1
- package/dist/audit/types.d.ts +13 -0
- package/dist/audit/types.d.ts.map +1 -1
- package/dist/audit/types.js.map +1 -1
- package/dist/automation/index.d.ts +193 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js +464 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +10 -3
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +492 -35
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +7 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +32 -8
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +15 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +115 -47
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +14 -1
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +35 -7
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +4 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +49 -4
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/automation.d.ts +14 -0
- package/dist/client/automation.d.ts.map +1 -0
- package/dist/client/automation.js +9 -0
- package/dist/client/automation.js.map +1 -0
- package/dist/client/chat/run-recovery.d.ts +4 -0
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +12 -10
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +8 -0
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/integrations/api.d.ts +115 -0
- package/dist/client/integrations/api.d.ts.map +1 -0
- package/dist/client/integrations/api.js +123 -0
- package/dist/client/integrations/api.js.map +1 -0
- package/dist/client/integrations/index.d.ts +1 -0
- package/dist/client/integrations/index.d.ts.map +1 -1
- package/dist/client/integrations/index.js +1 -0
- package/dist/client/integrations/index.js.map +1 -1
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
- package/dist/client/transcription/use-live-transcription.js +59 -5
- package/dist/client/transcription/use-live-transcription.js.map +1 -1
- package/dist/client/use-run-stuck-detection.d.ts +16 -1
- package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
- package/dist/client/use-run-stuck-detection.js +23 -4
- package/dist/client/use-run-stuck-detection.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +49 -4
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/workspace-deploy.d.ts.map +1 -1
- package/dist/deploy/workspace-deploy.js +31 -2
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/file-upload/types.d.ts +2 -0
- package/dist/file-upload/types.d.ts.map +1 -1
- package/dist/file-upload/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
- package/dist/integrations/a2a-continuations-store.js +6 -4
- package/dist/integrations/a2a-continuations-store.js.map +1 -1
- package/dist/integrations/adapters/discord.d.ts +3 -0
- package/dist/integrations/adapters/discord.d.ts.map +1 -0
- package/dist/integrations/adapters/discord.js +261 -0
- package/dist/integrations/adapters/discord.js.map +1 -0
- package/dist/integrations/adapters/index.d.ts +4 -0
- package/dist/integrations/adapters/index.d.ts.map +1 -0
- package/dist/integrations/adapters/index.js +26 -0
- package/dist/integrations/adapters/index.js.map +1 -0
- package/dist/integrations/adapters/microsoft-teams.d.ts +5 -0
- package/dist/integrations/adapters/microsoft-teams.d.ts.map +1 -0
- package/dist/integrations/adapters/microsoft-teams.js +295 -0
- package/dist/integrations/adapters/microsoft-teams.js.map +1 -0
- package/dist/integrations/adapters/slack.d.ts +8 -2
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +736 -27
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/adapters/telegram.d.ts +0 -2
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +49 -15
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/adapters/whatsapp.d.ts +0 -2
- package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
- package/dist/integrations/adapters/whatsapp.js +40 -17
- package/dist/integrations/adapters/whatsapp.js.map +1 -1
- package/dist/integrations/catalog.d.ts +75 -0
- package/dist/integrations/catalog.d.ts.map +1 -0
- package/dist/integrations/catalog.js +451 -0
- package/dist/integrations/catalog.js.map +1 -0
- package/dist/integrations/controls-store.d.ts +44 -0
- package/dist/integrations/controls-store.d.ts.map +1 -0
- package/dist/integrations/controls-store.js +129 -0
- package/dist/integrations/controls-store.js.map +1 -0
- package/dist/integrations/index.d.ts +13 -1
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +9 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/installations-store.d.ts +112 -0
- package/dist/integrations/installations-store.d.ts.map +1 -0
- package/dist/integrations/installations-store.js +493 -0
- package/dist/integrations/installations-store.js.map +1 -0
- package/dist/integrations/integration-memory.d.ts +24 -0
- package/dist/integrations/integration-memory.d.ts.map +1 -0
- package/dist/integrations/integration-memory.js +136 -0
- package/dist/integrations/integration-memory.js.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.js +6 -5
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
- package/dist/integrations/pending-tasks-store.d.ts +17 -0
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-store.js +71 -5
- package/dist/integrations/pending-tasks-store.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +520 -35
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/scope-store.d.ts +65 -0
- package/dist/integrations/scope-store.d.ts.map +1 -0
- package/dist/integrations/scope-store.js +361 -0
- package/dist/integrations/scope-store.js.map +1 -0
- package/dist/integrations/slack-manifest.d.ts +66 -0
- package/dist/integrations/slack-manifest.d.ts.map +1 -0
- package/dist/integrations/slack-manifest.js +70 -0
- package/dist/integrations/slack-manifest.js.map +1 -0
- package/dist/integrations/slack-oauth.d.ts +99 -0
- package/dist/integrations/slack-oauth.d.ts.map +1 -0
- package/dist/integrations/slack-oauth.js +226 -0
- package/dist/integrations/slack-oauth.js.map +1 -0
- package/dist/integrations/types.d.ts +144 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/types.js +16 -1
- package/dist/integrations/types.js.map +1 -1
- package/dist/integrations/usage-budget-store.d.ts +84 -0
- package/dist/integrations/usage-budget-store.d.ts.map +1 -0
- package/dist/integrations/usage-budget-store.js +650 -0
- package/dist/integrations/usage-budget-store.js.map +1 -0
- package/dist/integrations/webhook-handler.d.ts +4 -0
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +415 -47
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +6 -0
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +83 -4
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +43 -11
- package/dist/jobs/tools.js.map +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/index.d.ts +4 -4
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +72 -1
- package/dist/provider-api/index.js.map +1 -1
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +57 -15
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +34 -8
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/resources/store.d.ts +10 -0
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +54 -47
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +106 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +15 -4
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +248 -113
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +10 -14
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts +3 -1
- package/dist/server/builder-design-systems.d.ts.map +1 -1
- package/dist/server/builder-design-systems.js +9 -2
- package/dist/server/builder-design-systems.js.map +1 -1
- package/dist/server/edge.d.ts +1 -1
- package/dist/server/edge.d.ts.map +1 -1
- package/dist/server/edge.js +1 -1
- package/dist/server/edge.js.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/request-context.d.ts +18 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/social-og-image.d.ts.map +1 -1
- package/dist/server/social-og-image.js +3 -2
- package/dist/server/social-og-image.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-native.css +62 -44
- package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/dist/templates/default/AGENTS.md +7 -3
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
- package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
- package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
- package/dist/templates/workspace-core/AGENTS.md +3 -2
- package/dist/usage/store.d.ts +7 -0
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +24 -3
- package/dist/usage/store.js.map +1 -1
- package/docs/content/automation-connectors.mdx +80 -0
- package/docs/content/extensions.mdx +8 -0
- package/docs/content/locales/ar-SA/extensions.mdx +8 -0
- package/docs/content/locales/ar-SA/messaging.mdx +84 -15
- package/docs/content/locales/ar-SA/template-clips.mdx +1 -0
- package/docs/content/locales/ar-SA/template-design.mdx +1 -0
- package/docs/content/locales/de-DE/extensions.mdx +10 -0
- package/docs/content/locales/de-DE/messaging.mdx +92 -15
- package/docs/content/locales/de-DE/template-clips.mdx +1 -0
- package/docs/content/locales/de-DE/template-design.mdx +1 -0
- package/docs/content/locales/es-ES/extensions.mdx +10 -0
- package/docs/content/locales/es-ES/messaging.mdx +91 -15
- package/docs/content/locales/es-ES/template-clips.mdx +1 -0
- package/docs/content/locales/es-ES/template-design.mdx +1 -0
- package/docs/content/locales/fr-FR/extensions.mdx +10 -0
- package/docs/content/locales/fr-FR/messaging.mdx +91 -15
- package/docs/content/locales/fr-FR/template-clips.mdx +1 -0
- package/docs/content/locales/fr-FR/template-design.mdx +1 -0
- package/docs/content/locales/hi-IN/extensions.mdx +8 -0
- package/docs/content/locales/hi-IN/messaging.mdx +81 -15
- package/docs/content/locales/hi-IN/template-clips.mdx +1 -0
- package/docs/content/locales/hi-IN/template-design.mdx +1 -0
- package/docs/content/locales/ja-JP/extensions.mdx +9 -0
- package/docs/content/locales/ja-JP/messaging.mdx +81 -15
- package/docs/content/locales/ja-JP/template-clips.mdx +1 -0
- package/docs/content/locales/ja-JP/template-design.mdx +1 -0
- package/docs/content/locales/ko-KR/extensions.mdx +8 -0
- package/docs/content/locales/ko-KR/messaging.mdx +80 -15
- package/docs/content/locales/ko-KR/template-clips.mdx +1 -0
- package/docs/content/locales/ko-KR/template-design.mdx +1 -0
- package/docs/content/locales/pt-BR/extensions.mdx +9 -0
- package/docs/content/locales/pt-BR/messaging.mdx +88 -15
- package/docs/content/locales/pt-BR/template-clips.mdx +1 -0
- package/docs/content/locales/pt-BR/template-design.mdx +1 -0
- package/docs/content/locales/zh-CN/extensions.mdx +6 -0
- package/docs/content/locales/zh-CN/messaging.mdx +78 -15
- package/docs/content/locales/zh-CN/template-clips.mdx +1 -0
- package/docs/content/locales/zh-CN/template-design.mdx +1 -0
- package/docs/content/locales/zh-TW/extensions.mdx +6 -0
- package/docs/content/locales/zh-TW/messaging.mdx +78 -15
- package/docs/content/locales/zh-TW/template-clips.mdx +1 -0
- package/docs/content/locales/zh-TW/template-design.mdx +1 -0
- package/docs/content/messaging.mdx +227 -45
- package/docs/content/template-clips.mdx +3 -0
- package/docs/content/template-design.mdx +4 -0
- package/package.json +5 -1
- package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/src/templates/default/AGENTS.md +7 -3
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
- package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
- package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
- package/src/templates/workspace-core/AGENTS.md +3 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
appPath,
|
|
2
3
|
useActionMutation,
|
|
3
4
|
useActionQuery,
|
|
4
5
|
useSession,
|
|
@@ -240,6 +241,7 @@ export default function RecordingPage() {
|
|
|
240
241
|
const [processingTimeout, setProcessingTimeout] = useState(false);
|
|
241
242
|
const [retryingFinalize, setRetryingFinalize] = useState(false);
|
|
242
243
|
const [downloading, setDownloading] = useState(false);
|
|
244
|
+
const [pendingLinkCopied, setPendingLinkCopied] = useState(false);
|
|
243
245
|
const browserTabId = useMemo(() => getBrowserTabId(), []);
|
|
244
246
|
const recordingScope = useMemo(
|
|
245
247
|
() =>
|
|
@@ -355,6 +357,24 @@ export default function RecordingPage() {
|
|
|
355
357
|
const visibleTitle = recording
|
|
356
358
|
? displayRecordingTitle(recording.title)
|
|
357
359
|
: "Untitled Clip";
|
|
360
|
+
const pendingShareUrl = useMemo(() => {
|
|
361
|
+
if (!recordingId || typeof window === "undefined") return "";
|
|
362
|
+
return new URL(
|
|
363
|
+
appPath(`/share/${encodeURIComponent(recordingId)}`),
|
|
364
|
+
window.location.origin,
|
|
365
|
+
).toString();
|
|
366
|
+
}, [recordingId]);
|
|
367
|
+
const copyPendingShareLink = useCallback(async () => {
|
|
368
|
+
if (!pendingShareUrl) return;
|
|
369
|
+
try {
|
|
370
|
+
await navigator.clipboard.writeText(pendingShareUrl);
|
|
371
|
+
setPendingLinkCopied(true);
|
|
372
|
+
window.setTimeout(() => setPendingLinkCopied(false), 1400);
|
|
373
|
+
} catch {
|
|
374
|
+
// The full Share popover remains available when clipboard permission is
|
|
375
|
+
// unavailable, so a denied clipboard write does not block the page.
|
|
376
|
+
}
|
|
377
|
+
}, [pendingShareUrl]);
|
|
358
378
|
useEffect(() => {
|
|
359
379
|
if (!recording?.id) return;
|
|
360
380
|
const now = Date.now();
|
|
@@ -408,6 +428,7 @@ export default function RecordingPage() {
|
|
|
408
428
|
const downloadRecording = useCallback(async () => {
|
|
409
429
|
if (!recording?.videoUrl) return;
|
|
410
430
|
setDownloading(true);
|
|
431
|
+
const downloadToastId = toast.loading(t("sharePage.downloading"));
|
|
411
432
|
try {
|
|
412
433
|
const res = await fetch(recording.videoUrl);
|
|
413
434
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
@@ -415,7 +436,11 @@ export default function RecordingPage() {
|
|
|
415
436
|
const url = URL.createObjectURL(blob);
|
|
416
437
|
const a = document.createElement("a");
|
|
417
438
|
a.href = url;
|
|
418
|
-
|
|
439
|
+
const extension =
|
|
440
|
+
blob.type.includes("webm") || recording.videoFormat === "webm"
|
|
441
|
+
? "webm"
|
|
442
|
+
: "mp4";
|
|
443
|
+
a.download = `${sanitizeFilename(recording.title || "clip")}.${extension}`;
|
|
419
444
|
document.body.appendChild(a);
|
|
420
445
|
a.click();
|
|
421
446
|
a.remove();
|
|
@@ -424,8 +449,9 @@ export default function RecordingPage() {
|
|
|
424
449
|
window.open(recording.videoUrl, "_blank", "noopener,noreferrer");
|
|
425
450
|
} finally {
|
|
426
451
|
setDownloading(false);
|
|
452
|
+
toast.dismiss(downloadToastId);
|
|
427
453
|
}
|
|
428
|
-
}, [recording?.title, recording?.videoUrl]);
|
|
454
|
+
}, [recording?.title, recording?.videoFormat, recording?.videoUrl, t]);
|
|
429
455
|
const retryFinalizeAfterStorage = useCallback(async () => {
|
|
430
456
|
if (!recordingId) return;
|
|
431
457
|
setRetryingFinalize(true);
|
|
@@ -741,6 +767,93 @@ export default function RecordingPage() {
|
|
|
741
767
|
: t("recordingPage.clipDataPreserved")
|
|
742
768
|
: displayReason;
|
|
743
769
|
const detail = failureDetail(rawFailureReason);
|
|
770
|
+
if (!isFailure) {
|
|
771
|
+
return (
|
|
772
|
+
<div className="flex min-h-screen w-full flex-col bg-background">
|
|
773
|
+
<header className="flex min-w-0 shrink-0 items-center gap-3 border-b border-border px-3 py-2 sm:px-4 sm:py-3">
|
|
774
|
+
<Button
|
|
775
|
+
variant="ghost"
|
|
776
|
+
size="icon"
|
|
777
|
+
className="shrink-0"
|
|
778
|
+
onClick={() => navigate("/")}
|
|
779
|
+
aria-label={t("recordingPage.back")}
|
|
780
|
+
>
|
|
781
|
+
<IconArrowLeft className="h-4 w-4 rtl:-scale-x-100" />
|
|
782
|
+
</Button>
|
|
783
|
+
<div className="min-w-0 flex-1">
|
|
784
|
+
<p className="truncate text-sm font-medium">{visibleTitle}</p>
|
|
785
|
+
<p className="truncate text-xs text-muted-foreground">
|
|
786
|
+
{recording.ownerEmail}
|
|
787
|
+
{recording.visibility !== "private" ? (
|
|
788
|
+
<> · {capitalize(recording.visibility)}</>
|
|
789
|
+
) : null}
|
|
790
|
+
</p>
|
|
791
|
+
</div>
|
|
792
|
+
<ShareRecordingPopover
|
|
793
|
+
recordingId={recording.id}
|
|
794
|
+
recordingTitle={recording.title}
|
|
795
|
+
initialVisibility={recording.visibility}
|
|
796
|
+
initialRole={role}
|
|
797
|
+
hasPassword={Boolean(recording.hasPassword)}
|
|
798
|
+
>
|
|
799
|
+
<Button className="shrink-0 gap-1.5" size="sm">
|
|
800
|
+
<IconShare3 className="h-4 w-4" />
|
|
801
|
+
{t("recordingPage.share")}
|
|
802
|
+
</Button>
|
|
803
|
+
</ShareRecordingPopover>
|
|
804
|
+
</header>
|
|
805
|
+
|
|
806
|
+
<main className="mx-auto flex w-full max-w-6xl flex-1 flex-col gap-5 p-4 sm:p-6">
|
|
807
|
+
<div className="relative flex aspect-video w-full items-center justify-center overflow-hidden rounded-xl bg-black">
|
|
808
|
+
<div className="flex flex-col items-center gap-3 text-center text-white">
|
|
809
|
+
<Spinner className="size-8" />
|
|
810
|
+
<p className="text-sm font-medium">
|
|
811
|
+
{t("recordingPage.finishingClip")}
|
|
812
|
+
</p>
|
|
813
|
+
</div>
|
|
814
|
+
</div>
|
|
815
|
+
|
|
816
|
+
<div className="mx-auto flex w-full max-w-2xl flex-col gap-3">
|
|
817
|
+
<p className="text-center text-sm text-muted-foreground">
|
|
818
|
+
{t("recordingPage.uploadingAssembling")}
|
|
819
|
+
</p>
|
|
820
|
+
{progress > 0 ? (
|
|
821
|
+
<div className="h-1.5 w-full overflow-hidden rounded-full bg-muted">
|
|
822
|
+
<div
|
|
823
|
+
className="h-full bg-foreground transition-[width]"
|
|
824
|
+
style={{
|
|
825
|
+
width: `${Math.min(100, Math.max(0, progress))}%`,
|
|
826
|
+
}}
|
|
827
|
+
/>
|
|
828
|
+
</div>
|
|
829
|
+
) : null}
|
|
830
|
+
<div className="flex min-w-0 items-center gap-2 rounded-lg border border-border bg-muted/30 p-2 ps-3">
|
|
831
|
+
<div className="min-w-0 flex-1">
|
|
832
|
+
<p className="text-[11px] font-medium text-muted-foreground">
|
|
833
|
+
{t("shareDialog.shareLink")}
|
|
834
|
+
</p>
|
|
835
|
+
<p className="truncate text-sm text-foreground">
|
|
836
|
+
{pendingShareUrl}
|
|
837
|
+
</p>
|
|
838
|
+
</div>
|
|
839
|
+
<Button
|
|
840
|
+
type="button"
|
|
841
|
+
variant="outline"
|
|
842
|
+
size="sm"
|
|
843
|
+
className="shrink-0 gap-1.5"
|
|
844
|
+
onClick={() => void copyPendingShareLink()}
|
|
845
|
+
>
|
|
846
|
+
<IconClipboardCopy className="size-4" />
|
|
847
|
+
{pendingLinkCopied
|
|
848
|
+
? t("bugReportRoute.copied")
|
|
849
|
+
: t("shareUi.copy")}
|
|
850
|
+
</Button>
|
|
851
|
+
</div>
|
|
852
|
+
</div>
|
|
853
|
+
</main>
|
|
854
|
+
</div>
|
|
855
|
+
);
|
|
856
|
+
}
|
|
744
857
|
return (
|
|
745
858
|
<div className="flex flex-col items-center justify-center h-screen w-full bg-background px-6">
|
|
746
859
|
{!isFailure ? (
|
|
@@ -66,6 +66,10 @@ import {
|
|
|
66
66
|
defaultRecordingTitle,
|
|
67
67
|
inferWindowTitleFromDisplayStream,
|
|
68
68
|
} from "@/lib/recording-title";
|
|
69
|
+
import {
|
|
70
|
+
decideRecordingVisibilityAction,
|
|
71
|
+
isMobileRecorderRuntime,
|
|
72
|
+
} from "@/lib/recording-visibility";
|
|
69
73
|
import {
|
|
70
74
|
captureVideoThumbnailBlob,
|
|
71
75
|
uploadRecordingThumbnail,
|
|
@@ -838,6 +842,7 @@ export default function RecordRoute() {
|
|
|
838
842
|
const [uiState, setUiState] = useState<UiState>("idle");
|
|
839
843
|
const [error, setError] = useState<string | null>(null);
|
|
840
844
|
const [isPaused, setIsPaused] = useState(false);
|
|
845
|
+
const visibilityAutoPausedRef = useRef(false);
|
|
841
846
|
const [elapsedMs, setElapsedMs] = useState(0);
|
|
842
847
|
const [cameraStream, setCameraStream] = useState<MediaStream | null>(null);
|
|
843
848
|
const [cameraSize, setCameraSize] = useState<CameraBubbleSize>(
|
|
@@ -2291,6 +2296,10 @@ export default function RecordRoute() {
|
|
|
2291
2296
|
const togglePause = useCallback(() => {
|
|
2292
2297
|
const engine = engineRef.current;
|
|
2293
2298
|
if (!engine) return;
|
|
2299
|
+
// A direct user gesture owns the paused state from this point forward.
|
|
2300
|
+
// In particular, returning to the foreground must not auto-resume a clip
|
|
2301
|
+
// that the user deliberately left paused.
|
|
2302
|
+
visibilityAutoPausedRef.current = false;
|
|
2294
2303
|
if (engine.getState() === "paused") {
|
|
2295
2304
|
engine.resume();
|
|
2296
2305
|
liveTranscription.resume();
|
|
@@ -2302,6 +2311,59 @@ export default function RecordRoute() {
|
|
|
2302
2311
|
}
|
|
2303
2312
|
}, [liveTranscription]);
|
|
2304
2313
|
|
|
2314
|
+
useEffect(() => {
|
|
2315
|
+
if (typeof navigator === "undefined") return;
|
|
2316
|
+
if (!isMobileRecorderRuntime(navigator)) return;
|
|
2317
|
+
if (recordingMode !== "camera" || !cameraStream) {
|
|
2318
|
+
visibilityAutoPausedRef.current = false;
|
|
2319
|
+
return;
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2322
|
+
const videoTracks = cameraStream.getVideoTracks();
|
|
2323
|
+
const syncCaptureSuspension = () => {
|
|
2324
|
+
const engine = engineRef.current;
|
|
2325
|
+
if (!engine) {
|
|
2326
|
+
visibilityAutoPausedRef.current = false;
|
|
2327
|
+
return;
|
|
2328
|
+
}
|
|
2329
|
+
|
|
2330
|
+
const decision = decideRecordingVisibilityAction({
|
|
2331
|
+
mode: recordingMode,
|
|
2332
|
+
mobileRuntime: true,
|
|
2333
|
+
documentHidden: document.hidden,
|
|
2334
|
+
cameraTrackMuted: videoTracks.some((track) => track.muted),
|
|
2335
|
+
recorderState: engine.getState(),
|
|
2336
|
+
autoPaused: visibilityAutoPausedRef.current,
|
|
2337
|
+
});
|
|
2338
|
+
visibilityAutoPausedRef.current = decision.autoPaused;
|
|
2339
|
+
|
|
2340
|
+
if (decision.action === "pause") {
|
|
2341
|
+
engine.pause();
|
|
2342
|
+
liveTranscription.pause();
|
|
2343
|
+
setIsPaused(true);
|
|
2344
|
+
} else if (decision.action === "resume") {
|
|
2345
|
+
engine.resume();
|
|
2346
|
+
liveTranscription.resume();
|
|
2347
|
+
setIsPaused(false);
|
|
2348
|
+
}
|
|
2349
|
+
};
|
|
2350
|
+
|
|
2351
|
+
document.addEventListener("visibilitychange", syncCaptureSuspension);
|
|
2352
|
+
for (const track of videoTracks) {
|
|
2353
|
+
track.addEventListener("mute", syncCaptureSuspension);
|
|
2354
|
+
track.addEventListener("unmute", syncCaptureSuspension);
|
|
2355
|
+
}
|
|
2356
|
+
syncCaptureSuspension();
|
|
2357
|
+
|
|
2358
|
+
return () => {
|
|
2359
|
+
document.removeEventListener("visibilitychange", syncCaptureSuspension);
|
|
2360
|
+
for (const track of videoTracks) {
|
|
2361
|
+
track.removeEventListener("mute", syncCaptureSuspension);
|
|
2362
|
+
track.removeEventListener("unmute", syncCaptureSuspension);
|
|
2363
|
+
}
|
|
2364
|
+
};
|
|
2365
|
+
}, [cameraStream, liveTranscription, recordingMode]);
|
|
2366
|
+
|
|
2305
2367
|
const restart = useCallback(async () => {
|
|
2306
2368
|
await doCancel();
|
|
2307
2369
|
const opts = pendingStartOptsRef.current;
|
|
@@ -28,12 +28,12 @@ import {
|
|
|
28
28
|
type ReactNode,
|
|
29
29
|
} from "react";
|
|
30
30
|
import {
|
|
31
|
-
data,
|
|
32
31
|
type HeadersArgs,
|
|
33
32
|
type LoaderFunctionArgs,
|
|
34
33
|
type MetaFunction,
|
|
35
34
|
} from "react-router";
|
|
36
35
|
import { useLoaderData, useNavigate, useParams } from "react-router";
|
|
36
|
+
import { toast } from "sonner";
|
|
37
37
|
|
|
38
38
|
import { CaptureInstallButton } from "@/components/capture-install-options";
|
|
39
39
|
import { AccessPasswordPrompt } from "@/components/player/access-password-prompt";
|
|
@@ -79,6 +79,7 @@ import {
|
|
|
79
79
|
buildSignupAttributionQuery,
|
|
80
80
|
readShareAttribution,
|
|
81
81
|
} from "../../shared/share-attribution";
|
|
82
|
+
import { privateShareLoaderData } from "../../shared/share-loader-response";
|
|
82
83
|
import {
|
|
83
84
|
buildClipsShareMeta,
|
|
84
85
|
clipsSharePageTitle,
|
|
@@ -104,10 +105,6 @@ type SharePageLoaderData = {
|
|
|
104
105
|
shareUrl: string | null;
|
|
105
106
|
};
|
|
106
107
|
|
|
107
|
-
const PRIVATE_AGENT_SHARE_HEADERS = {
|
|
108
|
-
"Cache-Control": "private, max-age=0, no-store",
|
|
109
|
-
"Referrer-Policy": "no-referrer",
|
|
110
|
-
};
|
|
111
108
|
const CLIPS_AGENT_ACCESS_TTL_SECONDS = 2 * 60 * 60;
|
|
112
109
|
|
|
113
110
|
function emptyLoaderData(url: URL): SharePageLoaderData {
|
|
@@ -124,9 +121,7 @@ function shareLoaderData(
|
|
|
124
121
|
privateAgentAccess = false,
|
|
125
122
|
) {
|
|
126
123
|
if (!privateAgentAccess) return payload;
|
|
127
|
-
return
|
|
128
|
-
headers: PRIVATE_AGENT_SHARE_HEADERS,
|
|
129
|
-
});
|
|
124
|
+
return privateShareLoaderData(payload);
|
|
130
125
|
}
|
|
131
126
|
|
|
132
127
|
export function headers({ loaderHeaders }: HeadersArgs) {
|
|
@@ -222,7 +217,7 @@ export async function loader({ params, url }: LoaderFunctionArgs) {
|
|
|
222
217
|
if (rec.visibility !== "public" && !tokenGrantsAgentAccess) {
|
|
223
218
|
const userEmail = getRequestUserEmail();
|
|
224
219
|
const access = userEmail ? await resolveAccess("recording", id) : null;
|
|
225
|
-
if (!access) return emptyLoaderData(url);
|
|
220
|
+
if (!access) return privateShareLoaderData(emptyLoaderData(url));
|
|
226
221
|
}
|
|
227
222
|
|
|
228
223
|
const recording: SharePageMetaRecording = {
|
|
@@ -291,13 +286,14 @@ const CLIPS_AGENT_DOCS_URL =
|
|
|
291
286
|
const UPLOAD_STUCK_TIMEOUT_MS = 5 * 60 * 1000;
|
|
292
287
|
const PROCESSING_STUCK_TIMEOUT_MS = 2 * 60 * 1000;
|
|
293
288
|
|
|
294
|
-
type ViewerPlatform = "mac" | "windows";
|
|
289
|
+
type ViewerPlatform = "mac" | "windows" | "linux";
|
|
295
290
|
|
|
296
291
|
function detectViewerPlatform(): ViewerPlatform | null {
|
|
297
292
|
if (typeof navigator === "undefined") return null;
|
|
298
293
|
const ua = navigator.userAgent;
|
|
299
294
|
if (/Windows/i.test(ua)) return "windows";
|
|
300
295
|
if (/Mac/i.test(ua)) return "mac";
|
|
296
|
+
if (/Linux|X11/i.test(ua) && !/Android/i.test(ua)) return "linux";
|
|
301
297
|
return null;
|
|
302
298
|
}
|
|
303
299
|
|
|
@@ -421,6 +417,7 @@ export default function ShareRoute() {
|
|
|
421
417
|
[],
|
|
422
418
|
);
|
|
423
419
|
const [downloading, setDownloading] = useState(false);
|
|
420
|
+
const [downloadMenuOpen, setDownloadMenuOpen] = useState(false);
|
|
424
421
|
const agentAccessToken = useMemo(() => {
|
|
425
422
|
if (typeof window === "undefined") return "";
|
|
426
423
|
return (
|
|
@@ -594,6 +591,7 @@ export default function ShareRoute() {
|
|
|
594
591
|
async function downloadRecording() {
|
|
595
592
|
if (!recording?.videoUrl) return;
|
|
596
593
|
setDownloading(true);
|
|
594
|
+
const downloadToastId = toast.loading(t("sharePage.downloading"));
|
|
597
595
|
try {
|
|
598
596
|
const res = await fetch(recording.videoUrl);
|
|
599
597
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
@@ -601,7 +599,11 @@ export default function ShareRoute() {
|
|
|
601
599
|
const url = URL.createObjectURL(blob);
|
|
602
600
|
const a = document.createElement("a");
|
|
603
601
|
a.href = url;
|
|
604
|
-
|
|
602
|
+
const extension =
|
|
603
|
+
blob.type.includes("webm") || recording.videoFormat === "webm"
|
|
604
|
+
? "webm"
|
|
605
|
+
: "mp4";
|
|
606
|
+
a.download = `${sanitizeFilename(recording.title || "clip")}.${extension}`;
|
|
605
607
|
document.body.appendChild(a);
|
|
606
608
|
a.click();
|
|
607
609
|
a.remove();
|
|
@@ -610,6 +612,7 @@ export default function ShareRoute() {
|
|
|
610
612
|
window.open(recording.videoUrl, "_blank", "noopener,noreferrer");
|
|
611
613
|
} finally {
|
|
612
614
|
setDownloading(false);
|
|
615
|
+
toast.dismiss(downloadToastId);
|
|
613
616
|
}
|
|
614
617
|
}
|
|
615
618
|
|
|
@@ -859,7 +862,10 @@ export default function ShareRoute() {
|
|
|
859
862
|
</Button>
|
|
860
863
|
)}
|
|
861
864
|
{!viewerCanEdit && canDownloadRecording ? (
|
|
862
|
-
<DropdownMenu
|
|
865
|
+
<DropdownMenu
|
|
866
|
+
open={downloadMenuOpen}
|
|
867
|
+
onOpenChange={setDownloadMenuOpen}
|
|
868
|
+
>
|
|
863
869
|
<DropdownMenuTrigger asChild>
|
|
864
870
|
<Button
|
|
865
871
|
variant="ghost"
|
|
@@ -873,6 +879,7 @@ export default function ShareRoute() {
|
|
|
873
879
|
<DropdownMenuContent align="end" className="w-44">
|
|
874
880
|
<DropdownMenuItem
|
|
875
881
|
onSelect={() => {
|
|
882
|
+
setDownloadMenuOpen(false);
|
|
876
883
|
void downloadRecording();
|
|
877
884
|
}}
|
|
878
885
|
disabled={downloading}
|
|
@@ -880,7 +887,7 @@ export default function ShareRoute() {
|
|
|
880
887
|
<IconDownload className="h-4 w-4" />
|
|
881
888
|
{downloading
|
|
882
889
|
? t("sharePage.downloading")
|
|
883
|
-
: t("
|
|
890
|
+
: t("recordRoute.downloadRecording")}
|
|
884
891
|
</DropdownMenuItem>
|
|
885
892
|
</DropdownMenuContent>
|
|
886
893
|
</DropdownMenu>
|
|
@@ -891,7 +898,7 @@ export default function ShareRoute() {
|
|
|
891
898
|
canDelete
|
|
892
899
|
canDownload={canDownloadRecording}
|
|
893
900
|
downloadPending={downloading}
|
|
894
|
-
downloadLabel={t("
|
|
901
|
+
downloadLabel={t("recordRoute.downloadRecording")}
|
|
895
902
|
downloadingLabel={t("sharePage.downloading")}
|
|
896
903
|
onDownload={() => {
|
|
897
904
|
void downloadRecording();
|
|
@@ -1010,7 +1017,7 @@ export default function ShareRoute() {
|
|
|
1010
1017
|
<IconDownload className="h-4 w-4" />
|
|
1011
1018
|
{downloading
|
|
1012
1019
|
? t("sharePage.downloading")
|
|
1013
|
-
: t("
|
|
1020
|
+
: t("recordRoute.downloadRecording")}
|
|
1014
1021
|
</Button>
|
|
1015
1022
|
) : null}
|
|
1016
1023
|
</div>
|
|
@@ -1152,7 +1159,9 @@ function PublicAgentEmptyState({
|
|
|
1152
1159
|
? t("sharePage.downloadForMac")
|
|
1153
1160
|
: platform === "windows"
|
|
1154
1161
|
? t("sharePage.downloadForWindows")
|
|
1155
|
-
:
|
|
1162
|
+
: platform === "linux"
|
|
1163
|
+
? t("sharePage.downloadForLinux")
|
|
1164
|
+
: t("sharePage.downloadDesktopApp");
|
|
1156
1165
|
|
|
1157
1166
|
return (
|
|
1158
1167
|
<div className="flex h-full flex-col items-center justify-center px-8 py-12 text-center">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Clips Tray — Desktop menu-bar app
|
|
2
2
|
|
|
3
|
-
A small Tauri 2.x
|
|
3
|
+
A small Tauri 2.x tray app for macOS, Windows, and Linux. Click the icon — or press the global shortcut `Cmd/Ctrl+Shift+L` — to open a popover with:
|
|
4
4
|
|
|
5
5
|
- **New recording** button (opens `/record` on your configured Clips server)
|
|
6
6
|
- **Recent** — your three most recent recordings
|
|
@@ -22,10 +22,18 @@ From the template root you can also run:
|
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
24
|
pnpm tauri:dev # start the tray app against the local dev server
|
|
25
|
-
pnpm tauri:build # produce
|
|
25
|
+
pnpm tauri:build # produce platform installers (.dmg / .msi / AppImage + .deb + .rpm)
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
On Linux, install Tauri's WebKitGTK/AppIndicator prerequisites before running
|
|
29
|
+
the app. Screen and window capture use the desktop portal and PipeWire, so a
|
|
30
|
+
modern XDG desktop session with `xdg-desktop-portal` and PipeWire must be
|
|
31
|
+
running. The AppImage bundles the GStreamer media framework; `.deb` and `.rpm`
|
|
32
|
+
installs use the distribution's WebKitGTK/GStreamer packages. Use the AppImage
|
|
33
|
+
for in-app auto-updates; package-manager installs are updated by installing the
|
|
34
|
+
new `.deb` or `.rpm`.
|
|
35
|
+
|
|
36
|
+
Dev builds use the real platform screen/camera/microphone permission flow by
|
|
29
37
|
default so failures show up in the popover instead of saving a fake recording.
|
|
30
38
|
For automation-only sessions that need a generated screen stream, run this in
|
|
31
39
|
the tray devtools console:
|
|
@@ -36,6 +44,14 @@ localStorage.setItem("clips:dev-synthetic-capture", "1");
|
|
|
36
44
|
|
|
37
45
|
Remove that key to return to real capture.
|
|
38
46
|
|
|
47
|
+
### Linux capabilities
|
|
48
|
+
|
|
49
|
+
Linux uses the WebKitGTK recorder for screen, window, camera, and microphone
|
|
50
|
+
capture. Transcripts use Web Speech when available and the normal hosted
|
|
51
|
+
fallback after upload. macOS-native features — ScreenCaptureKit system audio,
|
|
52
|
+
local SFSpeech/Whisper capture, the Fn dictation shortcut, automatic text paste,
|
|
53
|
+
and Screen Memory — are not available on Linux yet.
|
|
54
|
+
|
|
39
55
|
Full-screen recording uses the native macOS recorder by default so it can start
|
|
40
56
|
without WebKit's screen/window picker. To debug the old `getDisplayMedia` path,
|
|
41
57
|
run this in the tray devtools console:
|
|
@@ -65,12 +81,12 @@ Clips Desktop ships on its own release channel — tag prefix `clips-v*`, separa
|
|
|
65
81
|
### Shipping a release
|
|
66
82
|
|
|
67
83
|
1. Bump `templates/clips/desktop/package.json` version (or pass it via workflow input).
|
|
68
|
-
2. Trigger **Clips Desktop Release** in GitHub Actions (`.github/workflows/clips-desktop-release.yml`). It builds
|
|
69
|
-
3. After all three platforms finish, the `publish-release` job flips the versioned release out of draft and refreshes the `clips-latest` pointer release with the new manifest.
|
|
84
|
+
2. Trigger **Clips Desktop Release** in GitHub Actions (`.github/workflows/clips-desktop-release.yml`). It builds macOS (universal), Windows, and Linux x86_64 installers, signs updater artifacts, and uploads them to `clips-v{version}`.
|
|
85
|
+
3. After all three platforms finish, the `publish-release` job flips the versioned release out of draft and refreshes the `clips-latest` pointer release with the new manifest. Installed macOS, Windows, and Linux AppImage copies auto-download it in the background on their next hourly or app-focus update check.
|
|
70
86
|
|
|
71
87
|
### Auto-update flow (inside the app)
|
|
72
88
|
|
|
73
|
-
- `src/lib/updater.ts` checks for updates 3s after launch and
|
|
89
|
+
- `src/lib/updater.ts` checks for updates 3s after launch, hourly while Clips stays open, and when the user returns after at least 15 minutes.
|
|
74
90
|
- On `available` it auto-downloads; on `downloaded` the popover shows an "Update ready — Restart" banner.
|
|
75
91
|
- Clicking Restart calls `@tauri-apps/plugin-process` `relaunch()`, which applies the already-staged bundle.
|
|
76
92
|
- No banner is shown in idle / checking / not-available states — the popover stays focused on recording.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "clips-desktop",
|
|
3
3
|
"version": "0.1.1",
|
|
4
4
|
"private": true,
|
|
5
|
-
"description": "Clips
|
|
5
|
+
"description": "Clips cross-platform tray app (Tauri 2). Quick-record + recent recordings from the OS tray.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"check:prereqs": "node ./scripts/check-tauri-prereqs.mjs",
|
|
@@ -55,6 +55,7 @@ import {
|
|
|
55
55
|
isMediaConstraintFailure,
|
|
56
56
|
} from "./lib/media-capture-constraints";
|
|
57
57
|
import {
|
|
58
|
+
DESKTOP_CAPTURE_PERMISSION_MESSAGE,
|
|
58
59
|
isHardCapturePermissionError,
|
|
59
60
|
MACOS_CAPTURE_PERMISSION_MESSAGE,
|
|
60
61
|
MACOS_SCREEN_PERMISSION_MESSAGE,
|
|
@@ -1667,7 +1668,11 @@ export function App() {
|
|
|
1667
1668
|
msg.includes("sandbox") ||
|
|
1668
1669
|
err?.name === "NotAllowedError"
|
|
1669
1670
|
) {
|
|
1670
|
-
setCameraError(
|
|
1671
|
+
setCameraError(
|
|
1672
|
+
isMacPlatform()
|
|
1673
|
+
? MACOS_CAPTURE_PERMISSION_MESSAGE
|
|
1674
|
+
: DESKTOP_CAPTURE_PERMISSION_MESSAGE,
|
|
1675
|
+
);
|
|
1671
1676
|
} else if (isMediaConstraintFailure(err)) {
|
|
1672
1677
|
// Even the default-camera retry inside getCameraStreamWithFallback
|
|
1673
1678
|
// failed, so no camera is usable right now. Say that plainly
|
|
@@ -2237,7 +2242,9 @@ export function App() {
|
|
|
2237
2242
|
setRecError(
|
|
2238
2243
|
isUpdatePendingRestart()
|
|
2239
2244
|
? MACOS_UPDATE_RESTART_MESSAGE
|
|
2240
|
-
:
|
|
2245
|
+
: isMacPlatform()
|
|
2246
|
+
? MACOS_CAPTURE_PERMISSION_MESSAGE
|
|
2247
|
+
: DESKTOP_CAPTURE_PERMISSION_MESSAGE,
|
|
2241
2248
|
);
|
|
2242
2249
|
return;
|
|
2243
2250
|
}
|
|
@@ -2354,10 +2361,11 @@ export function App() {
|
|
|
2354
2361
|
};
|
|
2355
2362
|
track(
|
|
2356
2363
|
listen("clips:recorder-stop", async () => {
|
|
2357
|
-
// Detach the React Start/bubble gate immediately.
|
|
2358
|
-
//
|
|
2359
|
-
// finalize; keeping
|
|
2360
|
-
// reopen show a blank preview and made
|
|
2364
|
+
// Detach the React Start/bubble gate immediately. The recorder keeps
|
|
2365
|
+
// Rust `is_recording_active` and the finalizing overlay guarded until
|
|
2366
|
+
// its durable backup/finalize boundary; keeping this React handle set
|
|
2367
|
+
// through the whole upload made reopen show a blank preview and made
|
|
2368
|
+
// Start a silent no-op.
|
|
2361
2369
|
const handle = recorder;
|
|
2362
2370
|
recordingStopFinalizingRef.current = true;
|
|
2363
2371
|
bubbleStreamTransferredToRecorder.current = false;
|
|
@@ -2723,7 +2731,8 @@ export function App() {
|
|
|
2723
2731
|
recError === MACOS_UPDATE_RESTART_MESSAGE ? (
|
|
2724
2732
|
<UpdateRestartBanner message={recError} />
|
|
2725
2733
|
) : recError === MACOS_CAPTURE_PERMISSION_MESSAGE ||
|
|
2726
|
-
recError === MACOS_SCREEN_PERMISSION_MESSAGE
|
|
2734
|
+
recError === MACOS_SCREEN_PERMISSION_MESSAGE ||
|
|
2735
|
+
recError === DESKTOP_CAPTURE_PERMISSION_MESSAGE ? (
|
|
2727
2736
|
<PermissionRecoveryBanner
|
|
2728
2737
|
kind="recording"
|
|
2729
2738
|
message={recError}
|
|
@@ -2748,7 +2757,8 @@ export function App() {
|
|
|
2748
2757
|
)
|
|
2749
2758
|
) : null}
|
|
2750
2759
|
{cameraError && !recError ? (
|
|
2751
|
-
cameraError === MACOS_CAPTURE_PERMISSION_MESSAGE
|
|
2760
|
+
cameraError === MACOS_CAPTURE_PERMISSION_MESSAGE ||
|
|
2761
|
+
cameraError === DESKTOP_CAPTURE_PERMISSION_MESSAGE ? (
|
|
2752
2762
|
<PermissionRecoveryBanner
|
|
2753
2763
|
kind="camera"
|
|
2754
2764
|
message={cameraError}
|
|
@@ -2839,6 +2849,7 @@ function PermissionRecoveryBanner({
|
|
|
2839
2849
|
? "Camera setup blocked"
|
|
2840
2850
|
: "Recording setup blocked";
|
|
2841
2851
|
const uniquePanes = Array.from(new Set(panes));
|
|
2852
|
+
const canOpenPrivacySettings = isMacPlatform() || isWindowsPlatform();
|
|
2842
2853
|
|
|
2843
2854
|
return (
|
|
2844
2855
|
<div className="error-banner permission-banner">
|
|
@@ -2846,16 +2857,18 @@ function PermissionRecoveryBanner({
|
|
|
2846
2857
|
<div className="permission-title">{title}</div>
|
|
2847
2858
|
<div>{message}</div>
|
|
2848
2859
|
</div>
|
|
2849
|
-
<div className="permission-actions" aria-label="
|
|
2850
|
-
{
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2860
|
+
<div className="permission-actions" aria-label="Permission recovery">
|
|
2861
|
+
{canOpenPrivacySettings
|
|
2862
|
+
? uniquePanes.map((pane) => (
|
|
2863
|
+
<button
|
|
2864
|
+
type="button"
|
|
2865
|
+
key={pane}
|
|
2866
|
+
onClick={() => openPrivacySettings(pane)}
|
|
2867
|
+
>
|
|
2868
|
+
{permissionPaneLabel(pane)}
|
|
2869
|
+
</button>
|
|
2870
|
+
))
|
|
2871
|
+
: null}
|
|
2859
2872
|
<button type="button" className="permission-retry" onClick={onRetry}>
|
|
2860
2873
|
Try again
|
|
2861
2874
|
</button>
|
|
@@ -3718,7 +3731,7 @@ function formatStorageBytes(bytes: number): string {
|
|
|
3718
3731
|
function desktopUpdateStatusText(status: UpdateStatus): string {
|
|
3719
3732
|
switch (status.state) {
|
|
3720
3733
|
case "idle":
|
|
3721
|
-
return "Clips checks automatically after launch and
|
|
3734
|
+
return "Clips checks automatically after launch, every hour, and when you return.";
|
|
3722
3735
|
case "checking":
|
|
3723
3736
|
return "Checking for updates...";
|
|
3724
3737
|
case "not-available":
|