@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
|
@@ -63,6 +63,9 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
|
|
|
63
63
|
sharing/status boundary.
|
|
64
64
|
- Use framework sharing actions for recordings. Password and expiry are extra
|
|
65
65
|
controls on top of visibility/share grants.
|
|
66
|
+
- Use `list-recordings --view=shared` for the current user's "Shared with me"
|
|
67
|
+
collection. It returns recordings admitted by sharing access that are owned
|
|
68
|
+
by someone else; public-link-only clips remain out of this list.
|
|
66
69
|
- Public recordings expose AI-readable URLs for external agents:
|
|
67
70
|
`/api/agent-context.json?id=<recordingId>` for metadata, transcript, and frame
|
|
68
71
|
API discovery; `/api/agent-transcript.json?id=<recordingId>` for transcript
|
|
@@ -132,9 +135,11 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
|
|
|
132
135
|
|
|
133
136
|
## Application State
|
|
134
137
|
|
|
135
|
-
- `navigation` exposes library, recording, share, meeting,
|
|
136
|
-
and transcript context. `selection` exposes selected
|
|
137
|
-
when the user is in selection mode.
|
|
138
|
+
- `navigation` exposes library, shared-with-me, recording, share, meeting,
|
|
139
|
+
dictation, settings, and transcript context. `selection` exposes selected
|
|
140
|
+
library recording ids when the user is in selection mode.
|
|
141
|
+
- `navigate --view=shared` opens the shared-with-me collection, and
|
|
142
|
+
`view-screen` returns its currently visible recordings.
|
|
138
143
|
- `recording-setup.import` exposes Loom import UI state while the `/record`
|
|
139
144
|
surface is open, without storing the pasted URL in ambient screen context.
|
|
140
145
|
- `navigate` moves the UI to recording/library/meeting/share surfaces.
|
|
@@ -15,11 +15,9 @@ import {
|
|
|
15
15
|
deleteAppState,
|
|
16
16
|
} from "@agent-native/core/application-state";
|
|
17
17
|
import { emit } from "@agent-native/core/event-bus";
|
|
18
|
-
import {
|
|
19
|
-
getActiveFileUploadProvider,
|
|
20
|
-
uploadFile,
|
|
21
|
-
} from "@agent-native/core/file-upload";
|
|
18
|
+
import { uploadFile } from "@agent-native/core/file-upload";
|
|
22
19
|
import { captureRouteError } from "@agent-native/core/server";
|
|
20
|
+
import { isStoredButUnservableFinalizeError } from "@shared/finalize-recovery.js";
|
|
23
21
|
import { MAX_UPLOAD_BYTES as MAX_RECORDING_UPLOAD_BYTES } from "@shared/upload-limits.js";
|
|
24
22
|
import { and, eq, isNull, ne } from "drizzle-orm";
|
|
25
23
|
import { z } from "zod";
|
|
@@ -31,6 +29,7 @@ import {
|
|
|
31
29
|
applyFaststart,
|
|
32
30
|
hasPlayableMp4Metadata,
|
|
33
31
|
} from "../server/lib/faststart.js";
|
|
32
|
+
import { dispatchPostFinalizeJob } from "../server/lib/post-finalize-dispatch.js";
|
|
34
33
|
import {
|
|
35
34
|
listRecordingChunkKeys,
|
|
36
35
|
validateRecordingChunkKeys,
|
|
@@ -43,6 +42,7 @@ import {
|
|
|
43
42
|
deleteResumableSession,
|
|
44
43
|
getResumableSession,
|
|
45
44
|
} from "../server/lib/resumable-session.js";
|
|
45
|
+
import { resolveResumableUploadProvider } from "../server/lib/resumable-upload-provider.js";
|
|
46
46
|
import { isStreamingUploadDisabled } from "../server/lib/streaming-upload-mode.js";
|
|
47
47
|
import {
|
|
48
48
|
probeHasAudioStream,
|
|
@@ -52,11 +52,7 @@ import {
|
|
|
52
52
|
requiresConfiguredVideoStorage,
|
|
53
53
|
STORAGE_SETUP_REQUIRED_REASON,
|
|
54
54
|
} from "../server/lib/video-storage.js";
|
|
55
|
-
import {
|
|
56
|
-
ensureRecordingSeekable,
|
|
57
|
-
markRecordingSeekable,
|
|
58
|
-
} from "./lib/ensure-seekable-video.js";
|
|
59
|
-
import requestTranscript from "./request-transcript.js";
|
|
55
|
+
import { markRecordingSeekable } from "./lib/ensure-seekable-video.js";
|
|
60
56
|
|
|
61
57
|
// Recordings up to this size get their seekable rewrite applied inline during
|
|
62
58
|
// finalize (we already hold the assembled bytes). Larger recordings are handed
|
|
@@ -392,25 +388,28 @@ async function markRecordingReady(params: {
|
|
|
392
388
|
} else {
|
|
393
389
|
// Streaming/resumable (or oversized) uploads shipped raw MediaRecorder
|
|
394
390
|
// bytes with no seekable rewrite: an MP4 with a trailing moov or a WebM
|
|
395
|
-
// without a Cues index buffers on load and re-buffers on every seek.
|
|
396
|
-
//
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
391
|
+
// without a Cues index buffers on load and re-buffers on every seek. A
|
|
392
|
+
// fresh self-dispatched request owns the repair so serverless runtimes do
|
|
393
|
+
// not freeze it when this finalize request returns.
|
|
394
|
+
await dispatchPostFinalizeJob({
|
|
395
|
+
recordingId: id,
|
|
396
|
+
kind: "seekable",
|
|
397
|
+
}).catch((err: unknown) => {
|
|
398
|
+
console.warn("[finalize] seekable remux dispatch failed", {
|
|
401
399
|
id,
|
|
402
400
|
error: err instanceof Error ? err.message : String(err),
|
|
403
401
|
});
|
|
404
402
|
});
|
|
405
403
|
}
|
|
406
404
|
|
|
407
|
-
//
|
|
408
|
-
//
|
|
409
|
-
//
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
405
|
+
// Transcription can outlive the upload request. Dispatch it into a fresh
|
|
406
|
+
// invocation instead of leaving an unawaited promise in this serverless
|
|
407
|
+
// function, where it can be frozen immediately after the response is sent.
|
|
408
|
+
await dispatchPostFinalizeJob({
|
|
409
|
+
recordingId: id,
|
|
410
|
+
kind: "transcript",
|
|
411
|
+
}).catch((err: unknown) => {
|
|
412
|
+
console.error("[finalize] transcript dispatch failed", {
|
|
414
413
|
id,
|
|
415
414
|
error: err instanceof Error ? err.message : String(err),
|
|
416
415
|
});
|
|
@@ -511,6 +510,12 @@ export default defineAction({
|
|
|
511
510
|
// chunks are gone by then).
|
|
512
511
|
if (existing.status === "ready" && existing.videoUrl) {
|
|
513
512
|
debugLog("[finalize] already finalized, returning existing", { id });
|
|
513
|
+
// A prior attempt may have persisted the ready row and then failed
|
|
514
|
+
// before deleting its resumable-session handle. The provider upload is
|
|
515
|
+
// complete at this point, so retire only the local retry state.
|
|
516
|
+
await deleteResumableSession(id).catch((err) =>
|
|
517
|
+
console.warn("[finalize] failed to delete resumable session:", err),
|
|
518
|
+
);
|
|
514
519
|
return {
|
|
515
520
|
id,
|
|
516
521
|
status: "ready" as const,
|
|
@@ -581,8 +586,43 @@ export default defineAction({
|
|
|
581
586
|
id,
|
|
582
587
|
providerId: resumableSession.providerId,
|
|
583
588
|
});
|
|
589
|
+
if (
|
|
590
|
+
existing.status === "failed" &&
|
|
591
|
+
typeof existing.failureReason === "string" &&
|
|
592
|
+
isStoredButUnservableFinalizeError(existing.failureReason)
|
|
593
|
+
) {
|
|
594
|
+
// Verification failed after the provider may already have completed
|
|
595
|
+
// the multipart upload. Move only that known-recoverable failure
|
|
596
|
+
// back to processing. A later user abort writes a different failed
|
|
597
|
+
// state, and markRecordingReady's status guard will still win.
|
|
598
|
+
const recoveryStartedAt = new Date().toISOString();
|
|
599
|
+
await db
|
|
600
|
+
.update(schema.recordings)
|
|
601
|
+
.set({
|
|
602
|
+
status: "processing",
|
|
603
|
+
failureReason: null,
|
|
604
|
+
updatedAt: recoveryStartedAt,
|
|
605
|
+
})
|
|
606
|
+
.where(
|
|
607
|
+
and(
|
|
608
|
+
eq(schema.recordings.id, id),
|
|
609
|
+
ownerEmailMatches(schema.recordings.ownerEmail, ownerEmail),
|
|
610
|
+
eq(schema.recordings.status, "failed"),
|
|
611
|
+
eq(schema.recordings.failureReason, existing.failureReason),
|
|
612
|
+
),
|
|
613
|
+
);
|
|
614
|
+
await writeAppState(`recording-upload-${id}`, {
|
|
615
|
+
...(uploadState ?? {}),
|
|
616
|
+
recordingId: id,
|
|
617
|
+
status: "processing",
|
|
618
|
+
failureReason: null,
|
|
619
|
+
updatedAt: recoveryStartedAt,
|
|
620
|
+
});
|
|
621
|
+
}
|
|
584
622
|
try {
|
|
585
|
-
const uploadProvider =
|
|
623
|
+
const uploadProvider = await resolveResumableUploadProvider(
|
|
624
|
+
resumableSession.providerId,
|
|
625
|
+
);
|
|
586
626
|
if (!uploadProvider?.resumable) {
|
|
587
627
|
throw new Error("No resumable upload provider configured");
|
|
588
628
|
}
|
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
normalizeTranscriptSegments,
|
|
37
37
|
parseTranscriptSegments,
|
|
38
38
|
} from "../shared/transcript-segments.js";
|
|
39
|
+
import { resolveTranscriptPresentation } from "../shared/transcript-status.js";
|
|
39
40
|
|
|
40
41
|
function safeJsonObject(raw: string | null | undefined) {
|
|
41
42
|
if (!raw) return {};
|
|
@@ -215,6 +216,7 @@ export default defineAction({
|
|
|
215
216
|
transcript?.status === "ready" &&
|
|
216
217
|
!transcript.fullText?.trim() &&
|
|
217
218
|
transcriptSegments.length === 0;
|
|
219
|
+
const transcriptPresentation = resolveTranscriptPresentation(transcript);
|
|
218
220
|
|
|
219
221
|
// Normalize the dev-fallback videoUrl:
|
|
220
222
|
// 1. Rewrite legacy `/api/uploads/:id/blob` to `/api/video/:id` so old
|
|
@@ -283,12 +285,14 @@ export default defineAction({
|
|
|
283
285
|
},
|
|
284
286
|
transcript: transcript
|
|
285
287
|
? {
|
|
286
|
-
status: transcriptReadyButEmpty
|
|
288
|
+
status: transcriptReadyButEmpty
|
|
289
|
+
? "failed"
|
|
290
|
+
: transcriptPresentation.status,
|
|
287
291
|
language: transcript.language,
|
|
288
292
|
fullText: transcript.fullText,
|
|
289
293
|
failureReason: transcriptReadyButEmpty
|
|
290
294
|
? "No speech was detected by transcription. Check microphone and speech permissions, then retry transcription."
|
|
291
|
-
:
|
|
295
|
+
: transcriptPresentation.failureReason,
|
|
292
296
|
segments: transcriptSegments,
|
|
293
297
|
cleanup: cleanupState
|
|
294
298
|
? {
|
|
@@ -29,9 +29,11 @@ import { and, eq } from "drizzle-orm";
|
|
|
29
29
|
|
|
30
30
|
import { getDb, schema } from "../../server/db/index.js";
|
|
31
31
|
import { queueBuilderMediaCompression } from "../../server/lib/builder-media-compression.js";
|
|
32
|
+
import { deleteRecordingMediaObjects } from "../../server/lib/recording-media-cleanup.js";
|
|
32
33
|
import { ownerEmailMatches } from "../../server/lib/recordings.js";
|
|
33
34
|
import {
|
|
34
35
|
makeSeekable,
|
|
36
|
+
normalizeTimelineToMp4,
|
|
35
37
|
type VideoFormat,
|
|
36
38
|
} from "../../server/lib/video-remux.js";
|
|
37
39
|
import { isLoomRecordingSource } from "../../shared/loom.js";
|
|
@@ -46,6 +48,7 @@ export type EnsureSeekableStatus =
|
|
|
46
48
|
| "skipped-local-media"
|
|
47
49
|
| "skipped-too-large"
|
|
48
50
|
| "skipped-fetch-failed"
|
|
51
|
+
| "skipped-normalize-failed"
|
|
49
52
|
| "skipped-upload-failed"
|
|
50
53
|
| "not-found";
|
|
51
54
|
|
|
@@ -137,8 +140,14 @@ export async function ensureRecordingSeekable(params: {
|
|
|
137
140
|
recordingId: string;
|
|
138
141
|
ownerEmail: string;
|
|
139
142
|
force?: boolean;
|
|
143
|
+
normalizeTimeline?: boolean;
|
|
140
144
|
}): Promise<EnsureSeekableResult> {
|
|
141
|
-
const {
|
|
145
|
+
const {
|
|
146
|
+
recordingId,
|
|
147
|
+
ownerEmail,
|
|
148
|
+
force = false,
|
|
149
|
+
normalizeTimeline = false,
|
|
150
|
+
} = params;
|
|
142
151
|
const db = getDb();
|
|
143
152
|
|
|
144
153
|
const [rec] = await db
|
|
@@ -181,7 +190,11 @@ export async function ensureRecordingSeekable(params: {
|
|
|
181
190
|
};
|
|
182
191
|
}
|
|
183
192
|
|
|
184
|
-
if (
|
|
193
|
+
if (
|
|
194
|
+
!normalizeTimeline &&
|
|
195
|
+
!force &&
|
|
196
|
+
(await isAlreadyMarked(recordingId, rec.videoUrl))
|
|
197
|
+
) {
|
|
185
198
|
return {
|
|
186
199
|
recordingId,
|
|
187
200
|
status: "already-optimized",
|
|
@@ -196,12 +209,27 @@ export async function ensureRecordingSeekable(params: {
|
|
|
196
209
|
}
|
|
197
210
|
|
|
198
211
|
const videoFormat: VideoFormat = rec.videoFormat === "mp4" ? "mp4" : "webm";
|
|
199
|
-
const seekable =
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
212
|
+
const seekable = normalizeTimeline
|
|
213
|
+
? await normalizeTimelineToMp4({
|
|
214
|
+
mediaBytes: fetched.bytes,
|
|
215
|
+
videoFormat,
|
|
216
|
+
})
|
|
217
|
+
: await makeSeekable({
|
|
218
|
+
mediaBytes: fetched.bytes,
|
|
219
|
+
videoFormat,
|
|
220
|
+
});
|
|
203
221
|
|
|
204
222
|
if (!seekable.changed) {
|
|
223
|
+
if (normalizeTimeline) {
|
|
224
|
+
return {
|
|
225
|
+
recordingId,
|
|
226
|
+
status: "skipped-normalize-failed",
|
|
227
|
+
changed: false,
|
|
228
|
+
videoUrl: rec.videoUrl,
|
|
229
|
+
detail:
|
|
230
|
+
"Timeline normalization could not produce a verified MP4; the original recording was left unchanged.",
|
|
231
|
+
};
|
|
232
|
+
}
|
|
205
233
|
// Already seekable (or unimprovable) — remember so we don't refetch it.
|
|
206
234
|
await markRecordingSeekable(recordingId, rec.videoUrl);
|
|
207
235
|
return {
|
|
@@ -212,14 +240,23 @@ export async function ensureRecordingSeekable(params: {
|
|
|
212
240
|
};
|
|
213
241
|
}
|
|
214
242
|
|
|
215
|
-
const
|
|
243
|
+
const outputFormat: VideoFormat = normalizeTimeline ? "mp4" : videoFormat;
|
|
244
|
+
const mimeType = outputFormat === "mp4" ? "video/mp4" : "video/webm";
|
|
216
245
|
const upload = await uploadFile({
|
|
217
246
|
data: seekable.bytes,
|
|
218
|
-
filename:
|
|
247
|
+
filename: normalizeTimeline
|
|
248
|
+
? `${recordingId}-timeline-normalized-${Date.now()}.mp4`
|
|
249
|
+
: `${recordingId}.${outputFormat}`,
|
|
219
250
|
mimeType,
|
|
220
251
|
ownerEmail,
|
|
221
252
|
stableUrl: true,
|
|
222
253
|
recordAsset: false,
|
|
254
|
+
}).catch((err) => {
|
|
255
|
+
console.warn("[ensure-seekable-video] repaired media upload failed", {
|
|
256
|
+
recordingId,
|
|
257
|
+
error: err instanceof Error ? err.message : String(err),
|
|
258
|
+
});
|
|
259
|
+
return null;
|
|
223
260
|
});
|
|
224
261
|
|
|
225
262
|
if (!upload?.url) {
|
|
@@ -232,10 +269,11 @@ export async function ensureRecordingSeekable(params: {
|
|
|
232
269
|
};
|
|
233
270
|
}
|
|
234
271
|
|
|
235
|
-
await db
|
|
272
|
+
const updated = await db
|
|
236
273
|
.update(schema.recordings)
|
|
237
274
|
.set({
|
|
238
275
|
videoUrl: upload.url,
|
|
276
|
+
videoFormat: outputFormat,
|
|
239
277
|
videoSizeBytes: seekable.bytes.byteLength,
|
|
240
278
|
updatedAt: new Date().toISOString(),
|
|
241
279
|
})
|
|
@@ -243,8 +281,32 @@ export async function ensureRecordingSeekable(params: {
|
|
|
243
281
|
and(
|
|
244
282
|
eq(schema.recordings.id, recordingId),
|
|
245
283
|
ownerEmailMatches(schema.recordings.ownerEmail, ownerEmail),
|
|
284
|
+
eq(schema.recordings.videoUrl, rec.videoUrl),
|
|
246
285
|
),
|
|
286
|
+
)
|
|
287
|
+
.returning({
|
|
288
|
+
id: schema.recordings.id,
|
|
289
|
+
videoUrl: schema.recordings.videoUrl,
|
|
290
|
+
videoFormat: schema.recordings.videoFormat,
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
if (
|
|
294
|
+
updated.length !== 1 ||
|
|
295
|
+
updated[0]?.videoUrl !== upload.url ||
|
|
296
|
+
updated[0]?.videoFormat !== outputFormat
|
|
297
|
+
) {
|
|
298
|
+
await deleteRecordingMediaObjects(
|
|
299
|
+
{ id: recordingId, videoUrl: upload.url },
|
|
300
|
+
{ protectedUrls: [rec.videoUrl] },
|
|
247
301
|
);
|
|
302
|
+
return {
|
|
303
|
+
recordingId,
|
|
304
|
+
status: "skipped-upload-failed",
|
|
305
|
+
changed: false,
|
|
306
|
+
videoUrl: rec.videoUrl,
|
|
307
|
+
detail: "Recording changed while repaired media was uploading.",
|
|
308
|
+
};
|
|
309
|
+
}
|
|
248
310
|
|
|
249
311
|
await markRecordingSeekable(recordingId, upload.url);
|
|
250
312
|
await writeAppState("refresh-signal", { ts: Date.now() });
|
|
@@ -257,6 +319,7 @@ export async function ensureRecordingSeekable(params: {
|
|
|
257
319
|
providerId: upload.provider,
|
|
258
320
|
assetDbId: upload.id,
|
|
259
321
|
sourceSizeBytes: seekable.bytes.byteLength,
|
|
322
|
+
locallyTranscoded: normalizeTimeline,
|
|
260
323
|
}).catch((err) => {
|
|
261
324
|
console.warn("[ensure-seekable-video] media compression queue failed", {
|
|
262
325
|
recordingId,
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
inArray,
|
|
10
10
|
isNull,
|
|
11
11
|
isNotNull,
|
|
12
|
+
not,
|
|
12
13
|
notInArray,
|
|
13
14
|
sql,
|
|
14
15
|
} from "drizzle-orm";
|
|
@@ -27,10 +28,10 @@ function escapeLike(s: string): string {
|
|
|
27
28
|
|
|
28
29
|
export default defineAction({
|
|
29
30
|
description:
|
|
30
|
-
"List recordings visible to the current user. Supports filtering by view (library/space/archive/trash/all), folder, space, tag, free-text, and sort.",
|
|
31
|
+
"List recordings visible to the current user. Supports filtering by view (library/shared/space/archive/trash/all), folder, space, tag, free-text, and sort. The shared view returns accessible recordings owned by someone else.",
|
|
31
32
|
schema: z.object({
|
|
32
33
|
view: z
|
|
33
|
-
.enum(["library", "space", "archive", "trash", "all"])
|
|
34
|
+
.enum(["library", "shared", "space", "archive", "trash", "all"])
|
|
34
35
|
.default("library")
|
|
35
36
|
.describe("Which list to show"),
|
|
36
37
|
folderId: z
|
|
@@ -90,8 +91,23 @@ export default defineAction({
|
|
|
90
91
|
if (orgId) {
|
|
91
92
|
whereClauses.push(eq(schema.recordings.organizationId, orgId));
|
|
92
93
|
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Shared = recordings admitted by the normal sharing access filter but
|
|
97
|
+
// owned by someone else. This includes direct user/org grants and org-wide
|
|
98
|
+
// visibility, while public-only links remain excluded by accessFilter.
|
|
99
|
+
if (args.view === "shared") {
|
|
100
|
+
const email = getRequestUserEmail();
|
|
101
|
+
whereClauses.push(
|
|
102
|
+
email
|
|
103
|
+
? not(ownerEmailMatches(schema.recordings.ownerEmail, email))
|
|
104
|
+
: sql`1 = 0`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (args.view === "library" || args.view === "shared") {
|
|
93
109
|
// Meeting recordings are transcript-only (no playable media) and live on
|
|
94
|
-
// the /meetings surface, so keep them out of
|
|
110
|
+
// the /meetings surface, so keep them out of clip library views. The link
|
|
95
111
|
// is meetings.recordingId (no meetingId column on recordings), so exclude
|
|
96
112
|
// any recording referenced by a meeting. The subquery filters out NULLs
|
|
97
113
|
// so NOT IN doesn't collapse to an empty result under SQL NULL semantics.
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Usage:
|
|
9
9
|
* pnpm action navigate --view=library
|
|
10
|
+
* pnpm action navigate --view=shared
|
|
10
11
|
* pnpm action navigate --view=recording --recordingId=<id>
|
|
11
12
|
* pnpm action navigate --view=meeting --meetingId=<id>
|
|
12
13
|
* pnpm action navigate --view=dictate
|
|
@@ -20,6 +21,7 @@ import { z } from "zod";
|
|
|
20
21
|
|
|
21
22
|
const Views = [
|
|
22
23
|
"library",
|
|
24
|
+
"shared",
|
|
23
25
|
"spaces",
|
|
24
26
|
"space",
|
|
25
27
|
"archive",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* pnpm action reprocess-recording --ids='["id1","id2"]'
|
|
17
17
|
* pnpm action reprocess-recording --all --limit=20
|
|
18
18
|
* pnpm action reprocess-recording --id=<recordingId> --force
|
|
19
|
+
* pnpm action reprocess-recording --id=<recordingId> --normalizeTimeline
|
|
19
20
|
*/
|
|
20
21
|
|
|
21
22
|
import { defineAction } from "@agent-native/core";
|
|
@@ -34,6 +35,11 @@ import {
|
|
|
34
35
|
|
|
35
36
|
const MAX_TARGETS_PER_CALL = 100;
|
|
36
37
|
const DEFAULT_ALL_LIMIT = 20;
|
|
38
|
+
const cliBoolean = z.preprocess((value) => {
|
|
39
|
+
if (value === "true" || value === "1") return true;
|
|
40
|
+
if (value === "false" || value === "0") return false;
|
|
41
|
+
return value;
|
|
42
|
+
}, z.boolean());
|
|
37
43
|
|
|
38
44
|
function parseIds(value: unknown): string[] {
|
|
39
45
|
if (Array.isArray(value)) {
|
|
@@ -58,7 +64,7 @@ function parseIds(value: unknown): string[] {
|
|
|
58
64
|
|
|
59
65
|
export default defineAction({
|
|
60
66
|
description:
|
|
61
|
-
"Repair
|
|
67
|
+
"Repair playback of existing recordings and re-upload the fixed media without replacing the original unless the repair succeeds. By default this makes MP4/WebM start-playable and seekable. Set `normalizeTimeline: true` when a clip freezes or stops visually despite a longer duration because its video timestamps have large gaps; this transcodes to constant-frame-rate faststart MP4, preserves audio, and holds the last captured frame through missing-video gaps. Pass `id` for one clip, `ids` for several, or `all: true` for a bounded owner-scoped sweep. Already-seekable clips are skipped unless `force` is true; timeline normalization always runs when explicitly requested.",
|
|
62
68
|
schema: z.object({
|
|
63
69
|
id: z.string().optional().describe("A single recording id to repair."),
|
|
64
70
|
ids: z
|
|
@@ -67,8 +73,7 @@ export default defineAction({
|
|
|
67
73
|
.describe(
|
|
68
74
|
"Multiple recording ids (array, or JSON/comma string for CLI).",
|
|
69
75
|
),
|
|
70
|
-
all:
|
|
71
|
-
.boolean()
|
|
76
|
+
all: cliBoolean
|
|
72
77
|
.optional()
|
|
73
78
|
.describe(
|
|
74
79
|
"Repair the caller's own ready clips, most recent first, up to `limit`.",
|
|
@@ -82,10 +87,14 @@ export default defineAction({
|
|
|
82
87
|
.describe(
|
|
83
88
|
`Max clips to process when using \`all\` (default ${DEFAULT_ALL_LIMIT}).`,
|
|
84
89
|
),
|
|
85
|
-
force:
|
|
86
|
-
.boolean()
|
|
90
|
+
force: cliBoolean
|
|
87
91
|
.optional()
|
|
88
92
|
.describe("Re-run even on clips already marked seekable."),
|
|
93
|
+
normalizeTimeline: cliBoolean
|
|
94
|
+
.optional()
|
|
95
|
+
.describe(
|
|
96
|
+
"Transcode sparse/discontinuous video timestamps to constant-frame-rate faststart MP4 while preserving audio. Use when playback freezes or appears to stop before the declared duration.",
|
|
97
|
+
),
|
|
89
98
|
}),
|
|
90
99
|
run: async (args) => {
|
|
91
100
|
const db = getDb();
|
|
@@ -132,7 +141,12 @@ export default defineAction({
|
|
|
132
141
|
for (const recordingId of targetIds) {
|
|
133
142
|
try {
|
|
134
143
|
results.push(
|
|
135
|
-
await ensureRecordingSeekable({
|
|
144
|
+
await ensureRecordingSeekable({
|
|
145
|
+
recordingId,
|
|
146
|
+
ownerEmail,
|
|
147
|
+
force,
|
|
148
|
+
normalizeTimeline: args.normalizeTimeline === true,
|
|
149
|
+
}),
|
|
136
150
|
);
|
|
137
151
|
} catch (err) {
|
|
138
152
|
console.warn("[reprocess-recording] failed for", recordingId, err);
|
|
@@ -51,6 +51,7 @@ import { and, eq } from "drizzle-orm";
|
|
|
51
51
|
import { z } from "zod";
|
|
52
52
|
|
|
53
53
|
import { getDb, schema } from "../server/db/index.js";
|
|
54
|
+
import { dispatchPostFinalizeJob } from "../server/lib/post-finalize-dispatch.js";
|
|
54
55
|
import {
|
|
55
56
|
getCurrentOwnerEmail,
|
|
56
57
|
ownerEmailMatches,
|
|
@@ -195,20 +196,9 @@ export function recordingMediaFetchTimeoutMs(
|
|
|
195
196
|
|
|
196
197
|
// Bounded automatic retry for transient failures (ffmpeg timeout, transient
|
|
197
198
|
// provider network/5xx errors) — NOT for permanent failures like "no audio
|
|
198
|
-
// track" or a missing/rejected API key.
|
|
199
|
-
//
|
|
200
|
-
//
|
|
201
|
-
// retry instead of running immediately.
|
|
202
|
-
//
|
|
203
|
-
// Serverless caveat: Clips deploys to Netlify Functions (NITRO_PRESET=netlify),
|
|
204
|
-
// where a `setTimeout` scheduled after the handler returns can be frozen along
|
|
205
|
-
// with the rest of the sandbox before it fires. This best-effort retry still
|
|
206
|
-
// helps on any host that keeps the process warm (local/self-hosted, or a
|
|
207
|
-
// Lambda instance reused for a later request), and it is never worse than
|
|
208
|
-
// today's behavior — a clip that doesn't get an automatic retry just settles
|
|
209
|
-
// into "failed", exactly as it does now, and stays retryable via
|
|
210
|
-
// `request-transcript` (UI retry button or agent). Keeping the backoff short
|
|
211
|
-
// maximizes the chance it fires before the sandbox freezes.
|
|
199
|
+
// track" or a missing/rejected API key. Each retry is self-dispatched into a
|
|
200
|
+
// fresh request so serverless runtimes cannot freeze a timer left behind by
|
|
201
|
+
// the completed transcription request.
|
|
212
202
|
const MAX_AUTO_TRANSCRIPT_RETRIES = 2;
|
|
213
203
|
const AUTO_TRANSCRIPT_RETRY_BACKOFF_MS = [5_000, 20_000];
|
|
214
204
|
|
|
@@ -237,9 +227,7 @@ function isTransientTranscriptionError(err: unknown): boolean {
|
|
|
237
227
|
|
|
238
228
|
/**
|
|
239
229
|
* Schedule a bounded, backed-off automatic retry of `request-transcript` for
|
|
240
|
-
* a transient failure
|
|
241
|
-
* `finalize-recording.ts` uses to kick off transcription/remux passes in the
|
|
242
|
-
* background, just delayed instead of immediate.
|
|
230
|
+
* a transient failure in a fresh server request.
|
|
243
231
|
*
|
|
244
232
|
* `nextRetryCount` must already be persisted to `recording_transcripts` by the
|
|
245
233
|
* caller BEFORE this is invoked (not inside the timer) so the retry budget
|
|
@@ -262,20 +250,17 @@ function scheduleAutoTranscriptRetry({
|
|
|
262
250
|
AUTO_TRANSCRIPT_RETRY_BACKOFF_MS[
|
|
263
251
|
AUTO_TRANSCRIPT_RETRY_BACKOFF_MS.length - 1
|
|
264
252
|
];
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
);
|
|
277
|
-
});
|
|
278
|
-
}, backoffMs);
|
|
253
|
+
void dispatchPostFinalizeJob({
|
|
254
|
+
recordingId,
|
|
255
|
+
kind: "transcript",
|
|
256
|
+
delayMs: backoffMs,
|
|
257
|
+
retryAttempt: nextRetryCount,
|
|
258
|
+
}).catch((err: unknown) => {
|
|
259
|
+
console.warn(
|
|
260
|
+
`[clips] auto-retry transcription dispatch failed for ${recordingId} (attempt ${nextRetryCount}):`,
|
|
261
|
+
(err as Error)?.message ?? String(err),
|
|
262
|
+
);
|
|
263
|
+
});
|
|
279
264
|
}
|
|
280
265
|
|
|
281
266
|
function queueBrainExport(recordingId: string): void {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Reads `navigation` application state and fetches the relevant context
|
|
5
5
|
* (recording + transcript + comments if viewing a recording, folder contents
|
|
6
|
-
* if on library, space list if on spaces, etc.). Returns a single JSON
|
|
6
|
+
* if on library/shared-with-me, space list if on spaces, etc.). Returns a single JSON
|
|
7
7
|
* snapshot the agent can reason over.
|
|
8
8
|
*
|
|
9
9
|
* Usage:
|
|
@@ -17,7 +17,18 @@ import {
|
|
|
17
17
|
} from "@agent-native/core/application-state";
|
|
18
18
|
import { getRequestUserEmail } from "@agent-native/core/server/request-context";
|
|
19
19
|
import { accessFilter, resolveAccess } from "@agent-native/core/sharing";
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
and,
|
|
22
|
+
asc,
|
|
23
|
+
desc,
|
|
24
|
+
eq,
|
|
25
|
+
gte,
|
|
26
|
+
isNotNull,
|
|
27
|
+
isNull,
|
|
28
|
+
lte,
|
|
29
|
+
not,
|
|
30
|
+
notInArray,
|
|
31
|
+
} from "drizzle-orm";
|
|
21
32
|
import { z } from "zod";
|
|
22
33
|
|
|
23
34
|
import { getDb, schema } from "../server/db/index.js";
|
|
@@ -158,13 +169,40 @@ async function fetchBugReportSummary(recordingId: string) {
|
|
|
158
169
|
};
|
|
159
170
|
}
|
|
160
171
|
|
|
161
|
-
async function fetchLibrary(
|
|
172
|
+
async function fetchLibrary({
|
|
173
|
+
folderId,
|
|
174
|
+
shared = false,
|
|
175
|
+
organizationId,
|
|
176
|
+
}: {
|
|
177
|
+
folderId?: string;
|
|
178
|
+
shared?: boolean;
|
|
179
|
+
organizationId?: string | null;
|
|
180
|
+
}) {
|
|
162
181
|
const db = getDb();
|
|
182
|
+
const ownerEmail = getRequestUserEmail();
|
|
183
|
+
if (!ownerEmail) return [];
|
|
163
184
|
const conditions = [
|
|
164
185
|
accessFilter(schema.recordings, schema.recordingShares),
|
|
165
186
|
isNull(schema.recordings.archivedAt),
|
|
166
187
|
isNull(schema.recordings.trashedAt),
|
|
167
188
|
];
|
|
189
|
+
if (shared) {
|
|
190
|
+
conditions.push(
|
|
191
|
+
not(ownerEmailMatches(schema.recordings.ownerEmail, ownerEmail)),
|
|
192
|
+
);
|
|
193
|
+
} else {
|
|
194
|
+
conditions.push(
|
|
195
|
+
ownerEmailMatches(schema.recordings.ownerEmail, ownerEmail),
|
|
196
|
+
);
|
|
197
|
+
if (organizationId) {
|
|
198
|
+
conditions.push(eq(schema.recordings.organizationId, organizationId));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const meetingRecordingIds = db
|
|
202
|
+
.select({ id: schema.meetings.recordingId })
|
|
203
|
+
.from(schema.meetings)
|
|
204
|
+
.where(isNotNull(schema.meetings.recordingId));
|
|
205
|
+
conditions.push(notInArray(schema.recordings.id, meetingRecordingIds));
|
|
168
206
|
if (folderId) {
|
|
169
207
|
conditions.push(eq(schema.recordings.folderId, folderId));
|
|
170
208
|
}
|
|
@@ -451,7 +489,7 @@ async function fetchShare(shareId: string) {
|
|
|
451
489
|
|
|
452
490
|
export default defineAction({
|
|
453
491
|
description:
|
|
454
|
-
"See what the user is currently looking at on screen. Returns the current navigation state plus relevant context (recording + transcript + comments on a recording page,
|
|
492
|
+
"See what the user is currently looking at on screen. Returns the current navigation state plus relevant context (recording + transcript + comments on a recording page, visible clips on library/shared-with-me, space list on spaces, etc.). Prefer reading the auto-included <current-screen> block — call this only when you need a refreshed snapshot.",
|
|
455
493
|
schema: z.object({}),
|
|
456
494
|
http: false,
|
|
457
495
|
run: async () => {
|
|
@@ -531,7 +569,10 @@ export default defineAction({
|
|
|
531
569
|
}
|
|
532
570
|
case "library": {
|
|
533
571
|
const [recordings, folders] = await Promise.all([
|
|
534
|
-
fetchLibrary(
|
|
572
|
+
fetchLibrary({
|
|
573
|
+
folderId: nav.folderId,
|
|
574
|
+
organizationId,
|
|
575
|
+
}),
|
|
535
576
|
fetchFoldersForSpace(null),
|
|
536
577
|
]);
|
|
537
578
|
screen.library = {
|
|
@@ -543,6 +584,17 @@ export default defineAction({
|
|
|
543
584
|
};
|
|
544
585
|
break;
|
|
545
586
|
}
|
|
587
|
+
case "shared": {
|
|
588
|
+
const recordings = await fetchLibrary({
|
|
589
|
+
shared: true,
|
|
590
|
+
organizationId,
|
|
591
|
+
});
|
|
592
|
+
screen.shared = {
|
|
593
|
+
count: recordings.length,
|
|
594
|
+
recordings,
|
|
595
|
+
};
|
|
596
|
+
break;
|
|
597
|
+
}
|
|
546
598
|
case "spaces": {
|
|
547
599
|
screen.spaces = await fetchSpaces(organizationId);
|
|
548
600
|
break;
|