@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
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
import { invoke } from "@tauri-apps/api/core";
|
|
9
9
|
import { useState, useCallback, useEffect } from "react";
|
|
10
10
|
|
|
11
|
-
import { isMacPlatform } from "../lib/platform";
|
|
11
|
+
import { isMacPlatform, isWindowsPlatform } from "../lib/platform";
|
|
12
12
|
|
|
13
13
|
type CaptureMode = "screen" | "screen-camera" | "camera";
|
|
14
14
|
type MacosPrivacyPane =
|
|
@@ -56,7 +56,6 @@ function readinessItems({
|
|
|
56
56
|
detail: "Needed for screen or window capture.",
|
|
57
57
|
pane: "screen",
|
|
58
58
|
active: mode !== "camera",
|
|
59
|
-
macosOnly: true,
|
|
60
59
|
},
|
|
61
60
|
{
|
|
62
61
|
label: "Microphone",
|
|
@@ -132,6 +131,7 @@ export function ReadinessPanel({
|
|
|
132
131
|
onOpenPermission: (pane: MacosPrivacyPane) => void;
|
|
133
132
|
}) {
|
|
134
133
|
const mac = isMacPlatform();
|
|
134
|
+
const canOpenPrivacySettings = mac || isWindowsPlatform();
|
|
135
135
|
const items = readinessItems({
|
|
136
136
|
mode,
|
|
137
137
|
cameraOn,
|
|
@@ -215,13 +215,19 @@ export function ReadinessPanel({
|
|
|
215
215
|
)}
|
|
216
216
|
</span>
|
|
217
217
|
) : null}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
218
|
+
{canOpenPrivacySettings ? (
|
|
219
|
+
<button
|
|
220
|
+
type="button"
|
|
221
|
+
className="readiness-open-button"
|
|
222
|
+
onClick={() => onOpenPermission(item.pane)}
|
|
223
|
+
>
|
|
224
|
+
Open
|
|
225
|
+
</button>
|
|
226
|
+
) : (
|
|
227
|
+
<span className="readiness-item-detail">
|
|
228
|
+
System prompt
|
|
229
|
+
</span>
|
|
230
|
+
)}
|
|
225
231
|
</div>
|
|
226
232
|
</div>
|
|
227
233
|
);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface FinalizationGuardOptions<T> {
|
|
2
|
+
ensureBackupDurable: () => Promise<void>;
|
|
3
|
+
attemptFinalize: () => Promise<T>;
|
|
4
|
+
releaseGuard: () => Promise<void> | void;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Keep the desktop's post-stop guard visible until recovery metadata is
|
|
9
|
+
* durable and the finalize request has settled at least once.
|
|
10
|
+
*/
|
|
11
|
+
export async function finalizeAfterDurableBackup<T>({
|
|
12
|
+
ensureBackupDurable,
|
|
13
|
+
attemptFinalize,
|
|
14
|
+
releaseGuard,
|
|
15
|
+
}: FinalizationGuardOptions<T>): Promise<T> {
|
|
16
|
+
try {
|
|
17
|
+
await ensureBackupDurable();
|
|
18
|
+
return await attemptFinalize();
|
|
19
|
+
} finally {
|
|
20
|
+
await releaseGuard();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Capture/permission messaging shared between the device pickers and the
|
|
2
2
|
// recording flow. Centralized so the "is this a hard system block?" heuristic
|
|
3
3
|
// and the user-facing copy stay in sync wherever a getUserMedia call can fail.
|
|
4
4
|
|
|
@@ -6,6 +6,8 @@ export const MACOS_CAPTURE_PERMISSION_MESSAGE =
|
|
|
6
6
|
"Grant the required macOS permissions below, then try again. If you just changed access, restart Clips before retrying.";
|
|
7
7
|
export const MACOS_SCREEN_PERMISSION_MESSAGE =
|
|
8
8
|
"Grant Screen Recording permission in macOS Settings, then restart Clips and try again.";
|
|
9
|
+
export const DESKTOP_CAPTURE_PERMISSION_MESSAGE =
|
|
10
|
+
"Allow the requested screen, camera, or microphone access in your desktop permission prompt, then try again.";
|
|
9
11
|
export const MACOS_SPEECH_PERMISSION_MESSAGE =
|
|
10
12
|
"Grant Speech Recognition and Microphone access, then try again. If you just changed access, restart Clips before retrying.";
|
|
11
13
|
export const MACOS_UPDATE_RESTART_MESSAGE =
|
|
@@ -55,6 +55,7 @@ import { waitForReadyRecordingAfterFinalizeError } from "../../../shared/finaliz
|
|
|
55
55
|
import type { LocalRecordingMode } from "../shared/config";
|
|
56
56
|
import { createAudioCue, type AudioCue } from "./audio-cue";
|
|
57
57
|
import { createCameraCompositeStream } from "./camera-composite";
|
|
58
|
+
import { finalizeAfterDurableBackup } from "./finalization-guard";
|
|
58
59
|
import {
|
|
59
60
|
createLocalRecordingFolderName,
|
|
60
61
|
exportBlobChunksToLocalRecordingFile,
|
|
@@ -1661,6 +1662,15 @@ function showFinalizingFeedback() {
|
|
|
1661
1662
|
);
|
|
1662
1663
|
}
|
|
1663
1664
|
|
|
1665
|
+
async function releaseFinalizingFeedback() {
|
|
1666
|
+
await invoke("set_recording_state", { active: false }).catch((err) =>
|
|
1667
|
+
console.error("[clips-recorder] clear recording state failed:", err),
|
|
1668
|
+
);
|
|
1669
|
+
await invoke("hide_finalizing").catch((err) =>
|
|
1670
|
+
console.error("[clips-recorder] hide_finalizing failed:", err),
|
|
1671
|
+
);
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1664
1674
|
async function claimNativeUploadOpen(recordingId: string): Promise<boolean> {
|
|
1665
1675
|
return invoke<boolean>("native_fullscreen_claim_upload_open", {
|
|
1666
1676
|
recordingId,
|
|
@@ -2203,15 +2213,19 @@ async function startNativeFullscreenRecording(
|
|
|
2203
2213
|
},
|
|
2204
2214
|
);
|
|
2205
2215
|
uploadPromise.catch(() => {});
|
|
2216
|
+
// The recording row already exists, so open its page as soon as the
|
|
2217
|
+
// native stop command has started. Upload/finalize continues in this
|
|
2218
|
+
// webview while the page polls from `uploading` to `ready`.
|
|
2219
|
+
await openNativeUploadUrl(
|
|
2220
|
+
id,
|
|
2221
|
+
`${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`,
|
|
2222
|
+
);
|
|
2206
2223
|
try {
|
|
2207
2224
|
await Promise.race([
|
|
2208
2225
|
recorderFinalized,
|
|
2209
2226
|
new Promise<void>((resolve) => window.setTimeout(resolve, 15000)),
|
|
2210
2227
|
]);
|
|
2211
2228
|
unlistenFinalized();
|
|
2212
|
-
await invoke("set_recording_state", { active: false }).catch(
|
|
2213
|
-
() => {},
|
|
2214
|
-
);
|
|
2215
2229
|
|
|
2216
2230
|
const capturedTranscript = await transcriptionCapture
|
|
2217
2231
|
?.stop()
|
|
@@ -2263,10 +2277,6 @@ async function startNativeFullscreenRecording(
|
|
|
2263
2277
|
authToken: params.authToken,
|
|
2264
2278
|
})
|
|
2265
2279
|
) {
|
|
2266
|
-
await openNativeUploadUrl(
|
|
2267
|
-
id,
|
|
2268
|
-
`${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`,
|
|
2269
|
-
);
|
|
2270
2280
|
return { recordingId: id, viewUrl };
|
|
2271
2281
|
}
|
|
2272
2282
|
await abortRecordingUpload(
|
|
@@ -2274,36 +2284,16 @@ async function startNativeFullscreenRecording(
|
|
|
2274
2284
|
id,
|
|
2275
2285
|
err instanceof Error ? err.message : String(err),
|
|
2276
2286
|
);
|
|
2277
|
-
// Still take the user to the clip status page. If the server
|
|
2278
|
-
// marked the upload failed, that page shows the failure state; if
|
|
2279
|
-
// the abort request could not land, it keeps polling instead of
|
|
2280
|
-
// leaving the user on an empty desktop.
|
|
2281
|
-
try {
|
|
2282
|
-
await openExternal(
|
|
2283
|
-
`${params.serverUrl.replace(
|
|
2284
|
-
/\/+$/,
|
|
2285
|
-
"",
|
|
2286
|
-
)}${viewUrl}?saveFailed=1`,
|
|
2287
|
-
);
|
|
2288
|
-
} catch (openErr) {
|
|
2289
|
-
console.error("[clips-recorder] openExternal failed:", openErr);
|
|
2290
|
-
}
|
|
2291
2287
|
throw err;
|
|
2292
2288
|
}
|
|
2293
2289
|
|
|
2294
|
-
await openNativeUploadUrl(
|
|
2295
|
-
uploadResult.recordingId,
|
|
2296
|
-
`${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`,
|
|
2297
|
-
);
|
|
2298
2290
|
return {
|
|
2299
2291
|
recordingId: uploadResult.recordingId,
|
|
2300
2292
|
viewUrl,
|
|
2301
2293
|
};
|
|
2302
2294
|
} finally {
|
|
2303
2295
|
streamCleanups.forEach((cleanup) => cleanup());
|
|
2304
|
-
|
|
2305
|
-
console.error("[clips-recorder] hide_finalizing failed:", err),
|
|
2306
|
-
);
|
|
2296
|
+
await releaseFinalizingFeedback();
|
|
2307
2297
|
}
|
|
2308
2298
|
})();
|
|
2309
2299
|
return stopPromise;
|
|
@@ -3223,15 +3213,6 @@ async function startRecordingInner(
|
|
|
3223
3213
|
}).catch(() => {});
|
|
3224
3214
|
}
|
|
3225
3215
|
|
|
3226
|
-
async function openFailedRecordingPage() {
|
|
3227
|
-
const viewUrl = `/r/${id}?saveFailed=1`;
|
|
3228
|
-
try {
|
|
3229
|
-
await openExternal(`${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`);
|
|
3230
|
-
} catch (err) {
|
|
3231
|
-
console.error("[clips-recorder] openExternal failed:", err);
|
|
3232
|
-
}
|
|
3233
|
-
}
|
|
3234
|
-
|
|
3235
3216
|
// 5. Wire toolbar events.
|
|
3236
3217
|
const toolbarUnlistens = await Promise.all([
|
|
3237
3218
|
listen("clips:recorder-pause", () => {
|
|
@@ -3346,6 +3327,7 @@ async function startRecordingInner(
|
|
|
3346
3327
|
// chunk — but NOT the transcript-finalize + thumbnail + upload awaits that
|
|
3347
3328
|
// follow, which add ~seconds and would overstate the saved duration.
|
|
3348
3329
|
let stoppedAt = 0;
|
|
3330
|
+
const viewUrl = `/r/${id}`;
|
|
3349
3331
|
console.log("[clips-recorder] stop requested");
|
|
3350
3332
|
showFinalizingFeedback();
|
|
3351
3333
|
if (tickHandle) clearInterval(tickHandle);
|
|
@@ -3354,12 +3336,20 @@ async function startRecordingInner(
|
|
|
3354
3336
|
|
|
3355
3337
|
// Flush the in-flight recorder buffer, then wait for it to fully stop
|
|
3356
3338
|
// so we get the trailing dataavailable event.
|
|
3357
|
-
|
|
3339
|
+
const recorderStopped = new Promise<void>((resolve) => {
|
|
3358
3340
|
if (recorder.state === "inactive") {
|
|
3341
|
+
stoppedAt = Date.now();
|
|
3359
3342
|
resolve();
|
|
3360
3343
|
return;
|
|
3361
3344
|
}
|
|
3362
|
-
recorder.addEventListener(
|
|
3345
|
+
recorder.addEventListener(
|
|
3346
|
+
"stop",
|
|
3347
|
+
() => {
|
|
3348
|
+
stoppedAt = Date.now();
|
|
3349
|
+
resolve();
|
|
3350
|
+
},
|
|
3351
|
+
{ once: true },
|
|
3352
|
+
);
|
|
3363
3353
|
try {
|
|
3364
3354
|
if (recorder.state === "paused") {
|
|
3365
3355
|
recorder.resume();
|
|
@@ -3380,10 +3370,18 @@ async function startRecordingInner(
|
|
|
3380
3370
|
// ignore
|
|
3381
3371
|
}
|
|
3382
3372
|
});
|
|
3373
|
+
// `recorder.stop()` has already been requested, so recorded duration is
|
|
3374
|
+
// fixed even if launching the browser takes a moment. Open the existing
|
|
3375
|
+
// recording row now and let its page poll while upload/finalize continues.
|
|
3376
|
+
try {
|
|
3377
|
+
await openExternal(`${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`);
|
|
3378
|
+
} catch (err) {
|
|
3379
|
+
console.error("[clips-recorder] openExternal failed:", err);
|
|
3380
|
+
}
|
|
3381
|
+
await recorderStopped;
|
|
3383
3382
|
// Recorder has fully stopped and flushed its trailing chunk — this is the
|
|
3384
3383
|
// true end of recorded content. Everything after (transcript, thumbnail,
|
|
3385
3384
|
// upload) is post-processing and must not count toward duration.
|
|
3386
|
-
stoppedAt = Date.now();
|
|
3387
3385
|
|
|
3388
3386
|
const thumbnailUploadPromise = captureAndUploadRecordingThumbnail({
|
|
3389
3387
|
serverUrl: params.serverUrl,
|
|
@@ -3497,7 +3495,6 @@ async function startRecordingInner(
|
|
|
3497
3495
|
await invoke("hide_recording_chrome").catch((err) =>
|
|
3498
3496
|
console.error(`[clips-recorder] hide_recording_chrome failed:`, err),
|
|
3499
3497
|
);
|
|
3500
|
-
await invoke("set_recording_state", { active: false }).catch(() => {});
|
|
3501
3498
|
|
|
3502
3499
|
// Wait for any in-flight chunk uploads to settle before sending the
|
|
3503
3500
|
// final chunk. Otherwise the server could finalize before the last
|
|
@@ -3511,19 +3508,19 @@ async function startRecordingInner(
|
|
|
3511
3508
|
await Promise.allSettled(pending);
|
|
3512
3509
|
}
|
|
3513
3510
|
inflight.clear();
|
|
3514
|
-
// Ensure the local backup is fully written before we either delete it
|
|
3515
|
-
// (on success) or leave it in place for recovery (on failure).
|
|
3516
|
-
await Promise.allSettled([...backupWrites]);
|
|
3517
3511
|
if (failed) {
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
3521
|
-
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3512
|
+
try {
|
|
3513
|
+
// Keep the guard until the final metadata and every trailing chunk
|
|
3514
|
+
// backup are durable, even though this upload cannot be finalized.
|
|
3515
|
+
await Promise.allSettled([...backupWrites]);
|
|
3516
|
+
console.error("[clips-recorder] chunk upload failed:", failed);
|
|
3517
|
+
await markBrowserRecordingBackupError(id, failed.message).catch(
|
|
3518
|
+
() => {},
|
|
3519
|
+
);
|
|
3520
|
+
await abortRecordingUpload(params.serverUrl, id, failed.message);
|
|
3521
|
+
} finally {
|
|
3522
|
+
await releaseFinalizingFeedback();
|
|
3523
|
+
}
|
|
3527
3524
|
throw failed;
|
|
3528
3525
|
}
|
|
3529
3526
|
|
|
@@ -3553,78 +3550,58 @@ async function startRecordingInner(
|
|
|
3553
3550
|
uploadMode,
|
|
3554
3551
|
anyFailed: !!failed,
|
|
3555
3552
|
});
|
|
3556
|
-
|
|
3557
|
-
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
3561
|
-
|
|
3562
|
-
|
|
3563
|
-
});
|
|
3564
|
-
const bodyText = await finalRes.text().catch(() => "");
|
|
3565
|
-
console.log(
|
|
3566
|
-
"[clips-recorder] finalize response:",
|
|
3567
|
-
finalRes.status,
|
|
3568
|
-
bodyText.slice(0, 500),
|
|
3569
|
-
);
|
|
3570
|
-
if (!finalRes.ok) {
|
|
3571
|
-
throw new Error(
|
|
3572
|
-
`Finalize failed (${finalRes.status}): ${bodyText.slice(0, 200)}`,
|
|
3573
|
-
);
|
|
3574
|
-
}
|
|
3575
|
-
} catch (err) {
|
|
3576
|
-
console.error("[clips-recorder] finalize fetch failed:", err);
|
|
3577
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
3578
|
-
if (
|
|
3579
|
-
await recoverReadyRecordingAfterFinalizeError({
|
|
3580
|
-
serverUrl: params.serverUrl,
|
|
3581
|
-
recordingId: id,
|
|
3582
|
-
authToken: params.authToken,
|
|
3583
|
-
})
|
|
3584
|
-
) {
|
|
3585
|
-
const viewUrl = `/r/${id}`;
|
|
3553
|
+
return finalizeAfterDurableBackup({
|
|
3554
|
+
// Opening the browser must not make the desktop look idle until every
|
|
3555
|
+
// trailing backup write and the final metadata are durable.
|
|
3556
|
+
ensureBackupDurable: async () => {
|
|
3557
|
+
await Promise.allSettled([...backupWrites]);
|
|
3558
|
+
},
|
|
3559
|
+
attemptFinalize: async () => {
|
|
3586
3560
|
try {
|
|
3587
|
-
await
|
|
3588
|
-
|
|
3561
|
+
const finalRes = await fetch(finalizeUrl, {
|
|
3562
|
+
method: "POST",
|
|
3563
|
+
headers: { "Content-Type": "application/octet-stream" },
|
|
3564
|
+
credentials: "include",
|
|
3565
|
+
body: finalBody,
|
|
3566
|
+
signal: AbortSignal.timeout(FINALIZE_UPLOAD_TIMEOUT_MS),
|
|
3567
|
+
});
|
|
3568
|
+
const bodyText = await finalRes.text().catch(() => "");
|
|
3569
|
+
console.log(
|
|
3570
|
+
"[clips-recorder] finalize response:",
|
|
3571
|
+
finalRes.status,
|
|
3572
|
+
bodyText.slice(0, 500),
|
|
3573
|
+
);
|
|
3574
|
+
if (!finalRes.ok) {
|
|
3575
|
+
throw new Error(
|
|
3576
|
+
`Finalize failed (${finalRes.status}): ${bodyText.slice(0, 200)}`,
|
|
3577
|
+
);
|
|
3578
|
+
}
|
|
3579
|
+
} catch (err) {
|
|
3580
|
+
console.error("[clips-recorder] finalize fetch failed:", err);
|
|
3581
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
3582
|
+
if (
|
|
3583
|
+
await recoverReadyRecordingAfterFinalizeError({
|
|
3584
|
+
serverUrl: params.serverUrl,
|
|
3585
|
+
recordingId: id,
|
|
3586
|
+
authToken: params.authToken,
|
|
3587
|
+
})
|
|
3588
|
+
) {
|
|
3589
|
+
return { recordingId: id, viewUrl };
|
|
3590
|
+
}
|
|
3591
|
+
await markBrowserRecordingBackupError(id, error.message).catch(
|
|
3592
|
+
() => {},
|
|
3589
3593
|
);
|
|
3590
|
-
|
|
3591
|
-
|
|
3594
|
+
await abortRecordingUpload(params.serverUrl, id, error.message);
|
|
3595
|
+
throw error;
|
|
3592
3596
|
}
|
|
3593
|
-
|
|
3594
|
-
console.
|
|
3595
|
-
);
|
|
3597
|
+
await deleteBrowserRecordingBackup(id).catch((err) => {
|
|
3598
|
+
console.warn("[clips-recorder] local backup cleanup failed:", err);
|
|
3599
|
+
});
|
|
3600
|
+
|
|
3596
3601
|
return { recordingId: id, viewUrl };
|
|
3597
|
-
}
|
|
3598
|
-
|
|
3599
|
-
() => {},
|
|
3600
|
-
);
|
|
3601
|
-
await abortRecordingUpload(params.serverUrl, id, error.message);
|
|
3602
|
-
invoke("hide_finalizing").catch((hideErr) =>
|
|
3603
|
-
console.error("[clips-recorder] hide_finalizing failed:", hideErr),
|
|
3604
|
-
);
|
|
3605
|
-
await openFailedRecordingPage();
|
|
3606
|
-
throw error;
|
|
3607
|
-
}
|
|
3608
|
-
await deleteBrowserRecordingBackup(id).catch((err) => {
|
|
3609
|
-
console.warn("[clips-recorder] local backup cleanup failed:", err);
|
|
3602
|
+
},
|
|
3603
|
+
releaseGuard: releaseFinalizingFeedback,
|
|
3610
3604
|
});
|
|
3611
|
-
|
|
3612
|
-
// Finalize done (or tried and failed — the player page shows a clear
|
|
3613
|
-
// error state in either case). Open the browser to the playback URL
|
|
3614
|
-
// and THEN close the finalizing spinner. Closing before the browser
|
|
3615
|
-
// opens would leave the user staring at an empty desktop for the
|
|
3616
|
-
// brief moment while the OS launches / focuses the default browser.
|
|
3617
|
-
const viewUrl = `/r/${id}`;
|
|
3618
|
-
try {
|
|
3619
|
-
await openExternal(`${params.serverUrl.replace(/\/+$/, "")}${viewUrl}`);
|
|
3620
|
-
} catch (err) {
|
|
3621
|
-
console.error("[clips-recorder] openExternal failed:", err);
|
|
3622
|
-
}
|
|
3623
|
-
invoke("hide_finalizing").catch((err) =>
|
|
3624
|
-
console.error("[clips-recorder] hide_finalizing failed:", err),
|
|
3625
|
-
);
|
|
3626
|
-
|
|
3627
|
-
return { recordingId: id, viewUrl };
|
|
3628
3605
|
},
|
|
3629
3606
|
|
|
3630
3607
|
async cancel() {
|
|
@@ -27,6 +27,10 @@ let pendingUpdate: Update | null = null;
|
|
|
27
27
|
const listeners = new Set<StatusListener>();
|
|
28
28
|
let started = false;
|
|
29
29
|
let checkInFlight: Promise<void> | null = null;
|
|
30
|
+
let lastCheckStartedAt = 0;
|
|
31
|
+
|
|
32
|
+
const UPDATE_CHECK_INTERVAL_MS = 60 * 60 * 1000;
|
|
33
|
+
const UPDATE_FOCUS_CHECK_MIN_INTERVAL_MS = 15 * 60 * 1000;
|
|
30
34
|
|
|
31
35
|
function canRunUpdateChecks() {
|
|
32
36
|
// Dev and local release builds are for testing the current checkout. Do not
|
|
@@ -40,8 +44,10 @@ function setStatus(next: UpdateStatus) {
|
|
|
40
44
|
}
|
|
41
45
|
|
|
42
46
|
async function runCheck() {
|
|
47
|
+
if (cachedStatus.state === "downloaded") return;
|
|
43
48
|
if (checkInFlight) return checkInFlight;
|
|
44
49
|
|
|
50
|
+
lastCheckStartedAt = Date.now();
|
|
45
51
|
checkInFlight = (async () => {
|
|
46
52
|
try {
|
|
47
53
|
setStatus({ state: "checking" });
|
|
@@ -90,14 +96,30 @@ async function runCheck() {
|
|
|
90
96
|
return checkInFlight;
|
|
91
97
|
}
|
|
92
98
|
|
|
99
|
+
function maybeCheckForUpdate() {
|
|
100
|
+
if (!canRunUpdateChecks()) return;
|
|
101
|
+
if (cachedStatus.state === "downloaded") return;
|
|
102
|
+
if (
|
|
103
|
+
checkInFlight ||
|
|
104
|
+
Date.now() - lastCheckStartedAt < UPDATE_FOCUS_CHECK_MIN_INTERVAL_MS
|
|
105
|
+
) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
void runCheck();
|
|
109
|
+
}
|
|
110
|
+
|
|
93
111
|
function startUpdateLoop() {
|
|
94
112
|
if (started) return;
|
|
95
113
|
started = true;
|
|
96
114
|
if (!canRunUpdateChecks()) return;
|
|
97
|
-
// Check 3s after launch (let the popover finish first paint),
|
|
98
|
-
//
|
|
99
|
-
setTimeout(runCheck, 3000);
|
|
100
|
-
setInterval(
|
|
115
|
+
// Check 3s after launch (let the popover finish first paint), hourly while
|
|
116
|
+
// Clips stays open, and when the user returns after at least 15 minutes.
|
|
117
|
+
setTimeout(() => void runCheck(), 3000);
|
|
118
|
+
setInterval(() => void runCheck(), UPDATE_CHECK_INTERVAL_MS);
|
|
119
|
+
window.addEventListener("focus", maybeCheckForUpdate);
|
|
120
|
+
document.addEventListener("visibilitychange", () => {
|
|
121
|
+
if (document.visibilityState === "visible") maybeCheckForUpdate();
|
|
122
|
+
});
|
|
101
123
|
}
|
|
102
124
|
|
|
103
125
|
export function useUpdateStatus(): UpdateStatus {
|
|
@@ -25,17 +25,13 @@ type NativeUploadFinished = {
|
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* Full-screen transparent feedback overlay. Rendered the moment the user
|
|
28
|
-
* clicks Stop on the recording toolbar and kept visible
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* the browser — a gap that can stretch for several seconds while
|
|
32
|
-
* MediaRecorder flushes trailing chunks and the server finalize POST
|
|
33
|
-
* completes.
|
|
28
|
+
* clicks Stop on the recording toolbar and kept visible while the desktop
|
|
29
|
+
* finishes its durable backup and first upload/finalize attempt. The browser
|
|
30
|
+
* can open `/r/:id` earlier so the page shows live progress.
|
|
34
31
|
*
|
|
35
32
|
* The window ignores cursor events on the Rust side, so the compact
|
|
36
33
|
* bottom-left card does not block the user's screen while compression or
|
|
37
|
-
* upload
|
|
38
|
-
* right after `openExternal` to close this window.
|
|
34
|
+
* upload runs.
|
|
39
35
|
*/
|
|
40
36
|
export function Finalizing() {
|
|
41
37
|
const [progress, setProgress] = useState<ProcessingProgress>({
|
|
@@ -498,8 +498,8 @@ pub async fn show_finalizing(app: AppHandle) -> Result<(), String> {
|
|
|
498
498
|
Ok(())
|
|
499
499
|
}
|
|
500
500
|
|
|
501
|
-
/// Close the finalizing spinner overlay
|
|
502
|
-
///
|
|
501
|
+
/// Close the finalizing spinner overlay after the recorder's durable
|
|
502
|
+
/// backup/upload boundary settles.
|
|
503
503
|
#[tauri::command]
|
|
504
504
|
pub async fn hide_finalizing(app: AppHandle) -> Result<(), String> {
|
|
505
505
|
if let Some(w) = app.get_webview_window(FINALIZING_LABEL) {
|
|
@@ -19,14 +19,18 @@ pub fn check_permission_statuses() -> PermissionStatuses {
|
|
|
19
19
|
}
|
|
20
20
|
#[cfg(not(target_os = "macos"))]
|
|
21
21
|
{
|
|
22
|
-
//
|
|
22
|
+
// Windows and Linux permissions are granted through the WebView and,
|
|
23
|
+
// on Linux, the XDG desktop portal. There is no reliable synchronous
|
|
24
|
+
// preflight equivalent to macOS TCC here, so report unavailable rather
|
|
25
|
+
// than claiming permissions were granted. The non-macOS UI relies on
|
|
26
|
+
// the actual media prompt and does not render these values.
|
|
23
27
|
PermissionStatuses {
|
|
24
|
-
screen:
|
|
25
|
-
camera:
|
|
26
|
-
microphone:
|
|
27
|
-
speech:
|
|
28
|
-
accessibility:
|
|
29
|
-
input_monitoring:
|
|
28
|
+
screen: false,
|
|
29
|
+
camera: false,
|
|
30
|
+
microphone: false,
|
|
31
|
+
speech: false,
|
|
32
|
+
accessibility: false,
|
|
33
|
+
input_monitoring: false,
|
|
30
34
|
}
|
|
31
35
|
}
|
|
32
36
|
}
|
|
@@ -9,6 +9,9 @@ GA_MEASUREMENT_ID = "G-ESF7FYXGN9"
|
|
|
9
9
|
NITRO_PRESET = "netlify"
|
|
10
10
|
NPM_CONFIG_PRODUCTION = "false"
|
|
11
11
|
AUTO_CREATE_DEFAULT_ORG = "1"
|
|
12
|
+
# Emit the shared 15-minute Netlify background function used by agent chat and
|
|
13
|
+
# Clips post-recording transcription/seekability workers.
|
|
14
|
+
AGENT_CHAT_DURABLE_BACKGROUND = "true"
|
|
12
15
|
# Netlify Functions run on linux/x64 (AWS Lambda). This tells the deploy build
|
|
13
16
|
# to bundle the matching ffmpeg-static binary into the server bundle so the
|
|
14
17
|
# server-side audio-only transcription fallback (analyzeAudioSignal / audio
|