@agent-native/core 0.92.11 → 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 +45 -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 +48 -5
- package/corpus/core/src/agent/run-manager.ts +171 -20
- package/corpus/core/src/agent/run-store.ts +297 -42
- 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 +110 -17
- 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/components/player/transcript-panel.tsx +27 -5
- 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/hooks/use-player-shortcuts.ts +1 -0
- 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-fixed-copying-agent-responses-and-transcript-text-from-recor.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 +92 -23
- package/corpus/templates/content/actions/_database-source-utils.ts +207 -41
- package/corpus/templates/content/actions/_property-utils.ts +30 -2
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +316 -121
- package/corpus/templates/content/actions/attach-content-database-source.ts +41 -17
- package/corpus/templates/content/actions/change-content-database-source-role.ts +46 -8
- package/corpus/templates/content/actions/submit-content-database-form.ts +497 -0
- package/corpus/templates/content/actions/suggest-source-join-key.ts +8 -1
- 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-09-builder-source-refreshes-now-keep-mapped-fields-such-as-topi.md +6 -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 +28 -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 +5 -3
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +34 -8
- 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 +124 -18
- 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 +274 -37
- 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 +97 -16
- 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/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +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/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.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
|
@@ -18,6 +18,7 @@ export const EDITOR_CHROME_OVERLAY_SELECTOR = [
|
|
|
18
18
|
"[data-agent-native-spacing-region]",
|
|
19
19
|
"[data-agent-native-insertion-guide]",
|
|
20
20
|
"[data-agent-native-measurement-overlay]",
|
|
21
|
+
"[data-agent-native-editor-chrome-style]",
|
|
21
22
|
].join(",");
|
|
22
23
|
|
|
23
24
|
export interface ExportCropRect {
|
|
@@ -27,6 +28,301 @@ export interface ExportCropRect {
|
|
|
27
28
|
height: number;
|
|
28
29
|
}
|
|
29
30
|
|
|
31
|
+
export function buildStaticForeignObjectSvg(args: {
|
|
32
|
+
documentWidth: number;
|
|
33
|
+
documentHeight: number;
|
|
34
|
+
cropRect?: ExportCropRect | null;
|
|
35
|
+
scale: number;
|
|
36
|
+
safeTitle: string;
|
|
37
|
+
serializedHtml: string;
|
|
38
|
+
}): string {
|
|
39
|
+
const viewX = args.cropRect?.x ?? 0;
|
|
40
|
+
const viewY = args.cropRect?.y ?? 0;
|
|
41
|
+
const viewWidth = args.cropRect?.width ?? args.documentWidth;
|
|
42
|
+
const viewHeight = args.cropRect?.height ?? args.documentHeight;
|
|
43
|
+
// Keep the foreignObject in full-document coordinates. A non-zero viewBox
|
|
44
|
+
// then clips the selected region without rebasing the DOM and breaking its
|
|
45
|
+
// absolute/sticky/ancestor layout. The foreignObject must cover that viewBox.
|
|
46
|
+
const foreignWidth = Math.max(args.documentWidth, viewX + viewWidth);
|
|
47
|
+
const foreignHeight = Math.max(args.documentHeight, viewY + viewHeight);
|
|
48
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
49
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="${viewWidth * args.scale}" height="${viewHeight * args.scale}" viewBox="${viewX} ${viewY} ${viewWidth} ${viewHeight}" role="img" aria-label="${args.safeTitle}">
|
|
50
|
+
<title>${args.safeTitle}</title>
|
|
51
|
+
<foreignObject x="0" y="0" width="${foreignWidth}" height="${foreignHeight}">
|
|
52
|
+
${args.serializedHtml}
|
|
53
|
+
</foreignObject>
|
|
54
|
+
</svg>`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const MAX_EXPORT_SCALE = 4;
|
|
58
|
+
const MAX_EXPORT_CANVAS_SIDE = 16_384;
|
|
59
|
+
const MAX_EXPORT_CANVAS_PIXELS = 64 * 1024 * 1024;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* A PDF page is rasterized once, then stretched to fill an exact physical
|
|
63
|
+
* page size (see `createSinglePageRasterPdf`). Unlike a PNG/JPG/WEBP export
|
|
64
|
+
* — where "1x" means "one raster pixel per CSS pixel" and is a reasonable
|
|
65
|
+
* default for on-screen use — a 1x capture embedded at a fixed physical page
|
|
66
|
+
* size (US Letter, A4, ad unit dimensions treated as inches) is only ~96
|
|
67
|
+
* DPI, which reads as visibly blurry once printed or zoomed in a PDF viewer.
|
|
68
|
+
* Enforce a print-quality floor for the PDF export path specifically,
|
|
69
|
+
* regardless of the export panel's general-purpose default scale (1x).
|
|
70
|
+
* Still respects an explicit higher user-selected scale (3x/4x).
|
|
71
|
+
*/
|
|
72
|
+
export const PDF_MIN_PRINT_RASTER_SCALE = 2;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Resolve a crisp raster scale without asking the browser to allocate a canvas
|
|
76
|
+
* it cannot reliably encode. The quick Share -> PNG path has no visible scale
|
|
77
|
+
* picker, so use 2x there even on a 1x desktop display; explicit inspector
|
|
78
|
+
* export settings still win. Large artboards are reduced only as much as
|
|
79
|
+
* required by conservative cross-browser canvas limits.
|
|
80
|
+
*/
|
|
81
|
+
export function resolveRasterExportScale(args: {
|
|
82
|
+
width: number;
|
|
83
|
+
height: number;
|
|
84
|
+
requestedScale?: number | null;
|
|
85
|
+
devicePixelRatio?: number | null;
|
|
86
|
+
}): number {
|
|
87
|
+
const width = Math.max(1, Number.isFinite(args.width) ? args.width : 1);
|
|
88
|
+
const height = Math.max(1, Number.isFinite(args.height) ? args.height : 1);
|
|
89
|
+
const requested =
|
|
90
|
+
args.requestedScale ?? Math.max(2, args.devicePixelRatio ?? 1);
|
|
91
|
+
const normalized = Math.max(
|
|
92
|
+
0.1,
|
|
93
|
+
Math.min(MAX_EXPORT_SCALE, Number.isFinite(requested) ? requested : 2),
|
|
94
|
+
);
|
|
95
|
+
const sideLimit = Math.min(
|
|
96
|
+
MAX_EXPORT_CANVAS_SIDE / width,
|
|
97
|
+
MAX_EXPORT_CANVAS_SIDE / height,
|
|
98
|
+
);
|
|
99
|
+
const areaLimit = Math.sqrt(
|
|
100
|
+
MAX_EXPORT_CANVAS_PIXELS / Math.max(1, width * height),
|
|
101
|
+
);
|
|
102
|
+
// Do not clamp back up to 0.1 after applying the safety limits: a gigantic
|
|
103
|
+
// imported canvas can require a smaller scale to stay within the same hard
|
|
104
|
+
// side/pixel budget. The one-pixel floor only prevents a zero-size canvas.
|
|
105
|
+
const bounded = Math.min(normalized, sideLimit, areaLimit);
|
|
106
|
+
return Math.max(1 / Math.max(width, height), bounded);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Runtime HTML frameworks allow attribute syntaxes (`@click`, `:class`,
|
|
111
|
+
* `x-bind:class`) which are legal in HTML but not legal XML QNames. A static
|
|
112
|
+
* foreignObject snapshot has already resolved those directives and removes
|
|
113
|
+
* scripts, so retaining the executable attributes adds no visual information
|
|
114
|
+
* and can make the entire SVG unparsable. Remove framework directives plus any
|
|
115
|
+
* other unbound/invalid XML attribute name from the CLONE only.
|
|
116
|
+
*/
|
|
117
|
+
export function stripNonStaticXmlAttributes(root: Element): void {
|
|
118
|
+
root
|
|
119
|
+
.querySelectorAll(
|
|
120
|
+
"script,iframe,object,embed,base,meta[http-equiv],foreignObject,animate,set",
|
|
121
|
+
)
|
|
122
|
+
.forEach((element) => element.remove());
|
|
123
|
+
const elements = [root, ...Array.from(root.querySelectorAll("*"))];
|
|
124
|
+
for (const element of elements) {
|
|
125
|
+
for (const attribute of Array.from(element.attributes)) {
|
|
126
|
+
const name = attribute.name;
|
|
127
|
+
const frameworkDirective =
|
|
128
|
+
name.startsWith("@") ||
|
|
129
|
+
name.startsWith(":") ||
|
|
130
|
+
/^x-(?:data|init|show|cloak|if|for|transition|on|bind|model|text|html|ref|teleport|id|effect|ignore)(?:$|[.:])/i.test(
|
|
131
|
+
name,
|
|
132
|
+
);
|
|
133
|
+
const standardNamespaceAttribute =
|
|
134
|
+
/^(?:xmlns:xlink|xlink:href|xml:lang|xml:space)$/i.test(name);
|
|
135
|
+
const xmlSafeName =
|
|
136
|
+
standardNamespaceAttribute || /^[A-Za-z_][A-Za-z0-9._-]*$/.test(name);
|
|
137
|
+
const inlineHandler = /^on/i.test(name);
|
|
138
|
+
const urlAttribute =
|
|
139
|
+
/^(?:href|src|action|formaction|poster|xlink:href)$/i.test(name);
|
|
140
|
+
const value = attribute.value.trim();
|
|
141
|
+
const activeUrl =
|
|
142
|
+
urlAttribute &&
|
|
143
|
+
(/^(?:javascript|vbscript):/i.test(value) ||
|
|
144
|
+
(/^data:/i.test(value) &&
|
|
145
|
+
!/^data:image\/(?:png|jpeg|webp|gif|avif);base64,/i.test(value)));
|
|
146
|
+
const activeStyle =
|
|
147
|
+
name.toLowerCase() === "style" &&
|
|
148
|
+
/(?:javascript|vbscript|data\s*:\s*text\/html)/i.test(value);
|
|
149
|
+
if (
|
|
150
|
+
frameworkDirective ||
|
|
151
|
+
!xmlSafeName ||
|
|
152
|
+
inlineHandler ||
|
|
153
|
+
activeUrl ||
|
|
154
|
+
activeStyle
|
|
155
|
+
) {
|
|
156
|
+
element.removeAttribute(name);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Wait for a preview document to actually look like the design before it is
|
|
164
|
+
* rasterized/serialized for export (PNG, SVG, PDF, Copy as PNG all funnel
|
|
165
|
+
* through this). Generated screens load Tailwind/Alpine from a CDN and
|
|
166
|
+
* Google Fonts via `<link>` — right after the iframe's `srcdoc` is set (a
|
|
167
|
+
* fresh generation, a screen switch, or just a fast click), there is a real
|
|
168
|
+
* window where the document has rendered with ZERO applied CSS: no
|
|
169
|
+
* utility classes, no @font-face, plain browser defaults. A capture taken in
|
|
170
|
+
* that window produces exactly the field-reported "low quality / broken
|
|
171
|
+
* layout" PNG — not a rendering-fidelity issue, a readiness race. See
|
|
172
|
+
* `export-capture.readiness.spec.ts`.
|
|
173
|
+
*
|
|
174
|
+
* Two bounded waits, in order:
|
|
175
|
+
* 1. `document.fonts.ready` — resolves once every requested font has
|
|
176
|
+
* finished loading (or failed), so text uses its real family/metrics
|
|
177
|
+
* instead of a fallback that reflows the layout after capture.
|
|
178
|
+
* 2. Stylesheet-rule-count stabilization — `fonts.ready` only tracks fonts
|
|
179
|
+
* that have already been *requested* by active CSS; a CDN stylesheet
|
|
180
|
+
* that hasn't been injected yet hasn't requested anything. Poll the
|
|
181
|
+
* total CSSOM rule count across `document.styleSheets` until it holds
|
|
182
|
+
* steady for several consecutive animation frames AND a minimum settle
|
|
183
|
+
* time has passed. Tailwind's CDN JIT runtime compiles utility rules
|
|
184
|
+
* incrementally in more than one pass, so the rule count can plateau
|
|
185
|
+
* briefly between waves; a too-short stability check fires during one of
|
|
186
|
+
* those false plateaus and lets a capture through with layout-critical
|
|
187
|
+
* rules (flex/grid/absolute positioning) still missing even though
|
|
188
|
+
* color/text rules already landed — a subtler, worse bug than doing
|
|
189
|
+
* nothing, since some styling shows up so nothing looks obviously broken
|
|
190
|
+
* at a glance. The settle floor is skipped entirely for a document with
|
|
191
|
+
* no async style source (no `<link rel=stylesheet>`, no `<script src>`,
|
|
192
|
+
* no CDN Tailwind `<style type="text/tailwindcss">`), since a plain
|
|
193
|
+
* inline-only document cannot gain more CSS later.
|
|
194
|
+
*
|
|
195
|
+
* Both waits are bounded by `timeoutMs` so a design with an intentionally
|
|
196
|
+
* empty stylesheet, a blocked font host, or a slow network never hangs an
|
|
197
|
+
* export indefinitely — worst case, export proceeds with whatever rendered.
|
|
198
|
+
*/
|
|
199
|
+
export async function waitForExportReady(
|
|
200
|
+
doc: Document,
|
|
201
|
+
options?: { timeoutMs?: number },
|
|
202
|
+
): Promise<void> {
|
|
203
|
+
const view = doc.defaultView;
|
|
204
|
+
if (!view) return;
|
|
205
|
+
const timeoutMs = options?.timeoutMs ?? 4000;
|
|
206
|
+
const MIN_STABLE_FRAMES = 6;
|
|
207
|
+
// A plain document with no async style source cannot gain CSS later. Avoid
|
|
208
|
+
// imposing the CDN-oriented settle floor on every simple export while
|
|
209
|
+
// retaining it for Tailwind/script/stylesheet-backed previews.
|
|
210
|
+
const minSettleMs = doc.querySelector(
|
|
211
|
+
'link[rel~="stylesheet"],script[src],style[type="text/tailwindcss"]',
|
|
212
|
+
)
|
|
213
|
+
? 600
|
|
214
|
+
: 0;
|
|
215
|
+
const start =
|
|
216
|
+
typeof performance !== "undefined" ? performance.now() : Date.now();
|
|
217
|
+
const now = () =>
|
|
218
|
+
typeof performance !== "undefined" ? performance.now() : Date.now();
|
|
219
|
+
const remaining = () => Math.max(0, timeoutMs - (now() - start));
|
|
220
|
+
|
|
221
|
+
try {
|
|
222
|
+
const fontsReady = doc.fonts?.ready;
|
|
223
|
+
if (fontsReady) {
|
|
224
|
+
await Promise.race([
|
|
225
|
+
fontsReady,
|
|
226
|
+
new Promise<void>((resolve) => view.setTimeout(resolve, remaining())),
|
|
227
|
+
]);
|
|
228
|
+
}
|
|
229
|
+
} catch {
|
|
230
|
+
// Font loading can reject (network failure); proceed with fallback fonts
|
|
231
|
+
// rather than block the export.
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const ruleCount = (): number => {
|
|
235
|
+
let total = 0;
|
|
236
|
+
for (const sheet of Array.from(doc.styleSheets)) {
|
|
237
|
+
try {
|
|
238
|
+
total += sheet.cssRules?.length ?? 0;
|
|
239
|
+
} catch {
|
|
240
|
+
// Cross-origin stylesheets throw on cssRules access; their mere
|
|
241
|
+
// presence in styleSheets still counts as "loaded".
|
|
242
|
+
total += 1;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return total;
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
let lastCount = -1;
|
|
249
|
+
let stableFrames = 0;
|
|
250
|
+
while (
|
|
251
|
+
remaining() > 0 &&
|
|
252
|
+
(stableFrames < MIN_STABLE_FRAMES || now() - start < minSettleMs)
|
|
253
|
+
) {
|
|
254
|
+
const current = ruleCount();
|
|
255
|
+
stableFrames = current === lastCount ? stableFrames + 1 : 0;
|
|
256
|
+
lastCount = current;
|
|
257
|
+
await new Promise<void>((resolve) => {
|
|
258
|
+
const raf = view.requestAnimationFrame;
|
|
259
|
+
if (typeof raf === "function") raf.call(view, () => resolve());
|
|
260
|
+
else view.setTimeout(resolve, 16);
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/** Build a real, fixed-artboard PDF rather than returning export instructions. */
|
|
266
|
+
export async function createSinglePageRasterPdf(args: {
|
|
267
|
+
dataUrl: string;
|
|
268
|
+
width: number;
|
|
269
|
+
height: number;
|
|
270
|
+
}): Promise<Blob> {
|
|
271
|
+
const width = Math.max(1, args.width);
|
|
272
|
+
const height = Math.max(1, args.height);
|
|
273
|
+
const { jsPDF } = await import("jspdf");
|
|
274
|
+
const pdf = new jsPDF({
|
|
275
|
+
orientation: width > height ? "landscape" : "portrait",
|
|
276
|
+
unit: "px",
|
|
277
|
+
format: [width, height],
|
|
278
|
+
compress: true,
|
|
279
|
+
hotfixes: ["px_scaling"],
|
|
280
|
+
});
|
|
281
|
+
pdf.addImage(args.dataUrl, "PNG", 0, 0, width, height, undefined, "FAST");
|
|
282
|
+
return pdf.output("blob");
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
export interface RasterPdfPage {
|
|
286
|
+
dataUrl: string;
|
|
287
|
+
width: number;
|
|
288
|
+
height: number;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Build a multi-page PDF, one page per rasterized screen, each sized to its
|
|
293
|
+
* own artboard dimensions (a US Letter one-pager and a 1080x1080 social
|
|
294
|
+
* screen can coexist as separate pages, each at its own physical size).
|
|
295
|
+
* Reuses the same `px_scaling` hotfix as `createSinglePageRasterPdf` so every
|
|
296
|
+
* page's physical size matches its authored pixel dimensions exactly.
|
|
297
|
+
*/
|
|
298
|
+
export async function createMultiPageRasterPdf(
|
|
299
|
+
pages: readonly RasterPdfPage[],
|
|
300
|
+
): Promise<Blob> {
|
|
301
|
+
if (pages.length === 0) {
|
|
302
|
+
throw new Error("createMultiPageRasterPdf requires at least one page");
|
|
303
|
+
}
|
|
304
|
+
const { jsPDF } = await import("jspdf");
|
|
305
|
+
const dims = pages.map((page) => ({
|
|
306
|
+
width: Math.max(1, page.width),
|
|
307
|
+
height: Math.max(1, page.height),
|
|
308
|
+
}));
|
|
309
|
+
const pdf = new jsPDF({
|
|
310
|
+
orientation: dims[0].width > dims[0].height ? "landscape" : "portrait",
|
|
311
|
+
unit: "px",
|
|
312
|
+
format: [dims[0].width, dims[0].height],
|
|
313
|
+
compress: true,
|
|
314
|
+
hotfixes: ["px_scaling"],
|
|
315
|
+
});
|
|
316
|
+
pages.forEach((page, index) => {
|
|
317
|
+
const { width, height } = dims[index];
|
|
318
|
+
if (index > 0) {
|
|
319
|
+
pdf.addPage([width, height], width > height ? "landscape" : "portrait");
|
|
320
|
+
}
|
|
321
|
+
pdf.addImage(page.dataUrl, "PNG", 0, 0, width, height, undefined, "FAST");
|
|
322
|
+
});
|
|
323
|
+
return pdf.output("blob");
|
|
324
|
+
}
|
|
325
|
+
|
|
30
326
|
/** Return the smallest document-space rectangle containing every valid item. */
|
|
31
327
|
export function unionExportCropRects(
|
|
32
328
|
rects: readonly ExportCropRect[],
|
|
@@ -25,6 +25,41 @@ export interface FileCreationHistoryEntry {
|
|
|
25
25
|
geometry?: CanvasFrameGeometry;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
export interface FileDeletionHistorySnapshot {
|
|
29
|
+
id: string;
|
|
30
|
+
filename: string;
|
|
31
|
+
content: string;
|
|
32
|
+
fileType: string;
|
|
33
|
+
createdAt: string;
|
|
34
|
+
updatedAt: string;
|
|
35
|
+
geometry?: CanvasFrameGeometry;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface FileDeletionHistoryEntry {
|
|
39
|
+
files: FileDeletionHistorySnapshot[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function filterFileDeletionHistoryEntry(
|
|
43
|
+
entry: FileDeletionHistoryEntry,
|
|
44
|
+
fileIds: ReadonlySet<string>,
|
|
45
|
+
): FileDeletionHistoryEntry {
|
|
46
|
+
return {
|
|
47
|
+
files: entry.files.filter((file) => fileIds.has(file.id)),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function remapFileDeletionHistoryEntryIds(
|
|
52
|
+
entry: FileDeletionHistoryEntry,
|
|
53
|
+
fileIds: readonly string[],
|
|
54
|
+
): FileDeletionHistoryEntry {
|
|
55
|
+
return {
|
|
56
|
+
files: entry.files.flatMap((file, index) => {
|
|
57
|
+
const id = fileIds[index];
|
|
58
|
+
return id ? [{ ...file, id }] : [];
|
|
59
|
+
}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
28
63
|
export function pruneFileCreationHistoryStack(
|
|
29
64
|
stack: FileCreationHistoryEntry[],
|
|
30
65
|
deletedFilenames: Set<string>,
|
|
@@ -67,13 +102,34 @@ export function pruneGeometryHistoryEntryForDeletedFiles(
|
|
|
67
102
|
}
|
|
68
103
|
}
|
|
69
104
|
if (!hasRemainingChange) return null;
|
|
105
|
+
const pruneSelection = (
|
|
106
|
+
selection: GeometryHistorySelection | undefined,
|
|
107
|
+
): GeometryHistorySelection | undefined => {
|
|
108
|
+
if (!selection) return undefined;
|
|
109
|
+
const activeFileDeleted =
|
|
110
|
+
!!selection.activeFileId && deletedFileIds.has(selection.activeFileId);
|
|
111
|
+
return {
|
|
112
|
+
overviewSelectedScreenIds: selection.overviewSelectedScreenIds.filter(
|
|
113
|
+
(fileId) => !deletedFileIds.has(fileId),
|
|
114
|
+
),
|
|
115
|
+
// Layer ids are scoped to the active file. Once that file is deleted,
|
|
116
|
+
// retaining them makes a later undo/redo try to restore selection to a
|
|
117
|
+
// non-existent iframe and can visibly snap the inspector/canvas before
|
|
118
|
+
// reconciliation clears it. If the active file survives, its layer ids
|
|
119
|
+
// remain valid and should be preserved.
|
|
120
|
+
selectedLayerIds: activeFileDeleted ? [] : selection.selectedLayerIds,
|
|
121
|
+
activeFileId: activeFileDeleted ? null : selection.activeFileId,
|
|
122
|
+
};
|
|
123
|
+
};
|
|
70
124
|
return {
|
|
71
125
|
before,
|
|
72
126
|
after,
|
|
73
127
|
...(entry.selectionBefore
|
|
74
|
-
? { selectionBefore: entry.selectionBefore }
|
|
128
|
+
? { selectionBefore: pruneSelection(entry.selectionBefore)! }
|
|
129
|
+
: {}),
|
|
130
|
+
...(entry.selectionAfter
|
|
131
|
+
? { selectionAfter: pruneSelection(entry.selectionAfter)! }
|
|
75
132
|
: {}),
|
|
76
|
-
...(entry.selectionAfter ? { selectionAfter: entry.selectionAfter } : {}),
|
|
77
133
|
};
|
|
78
134
|
}
|
|
79
135
|
|
|
@@ -125,6 +181,43 @@ export interface ContentHistoryGroup {
|
|
|
125
181
|
|
|
126
182
|
export type ContentHistoryEntry = ContentHistoryChange | ContentHistoryGroup;
|
|
127
183
|
|
|
184
|
+
export interface PendingTextCreationHistory {
|
|
185
|
+
fileId: string;
|
|
186
|
+
nodeId: string;
|
|
187
|
+
before: string;
|
|
188
|
+
created: string;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Finalizes the newest text-creation entry as one atomic undo step. A typed
|
|
192
|
+
* commit replaces the creation entry's `after`; abandoning an empty edit
|
|
193
|
+
* removes the now-no-op entry. It refuses to cross any intervening history. */
|
|
194
|
+
export function finalizeTextCreationHistory(
|
|
195
|
+
stack: readonly ContentHistoryEntry[],
|
|
196
|
+
pending: PendingTextCreationHistory,
|
|
197
|
+
finalContent: string,
|
|
198
|
+
): {
|
|
199
|
+
stack: ContentHistoryEntry[];
|
|
200
|
+
status: "coalesced" | "rolled-back" | "stale";
|
|
201
|
+
} {
|
|
202
|
+
const latest = stack[stack.length - 1];
|
|
203
|
+
if (
|
|
204
|
+
!latest ||
|
|
205
|
+
"changes" in latest ||
|
|
206
|
+
latest.fileId !== pending.fileId ||
|
|
207
|
+
latest.before !== pending.before ||
|
|
208
|
+
latest.after !== pending.created
|
|
209
|
+
) {
|
|
210
|
+
return { stack: [...stack], status: "stale" };
|
|
211
|
+
}
|
|
212
|
+
if (finalContent === pending.before) {
|
|
213
|
+
return { stack: stack.slice(0, -1), status: "rolled-back" };
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
stack: [...stack.slice(0, -1), { ...latest, after: finalContent }],
|
|
217
|
+
status: "coalesced",
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
128
221
|
export function getContentHistoryChanges(
|
|
129
222
|
entry: ContentHistoryEntry,
|
|
130
223
|
): ContentHistoryChange[] {
|
|
@@ -156,6 +249,12 @@ export function findLastContentHistoryChangeIndex(
|
|
|
156
249
|
return -1;
|
|
157
250
|
}
|
|
158
251
|
|
|
252
|
+
export function contentHistoryScopeForViewMode(
|
|
253
|
+
viewMode: "single" | "overview",
|
|
254
|
+
): "local" | "global" {
|
|
255
|
+
return viewMode === "overview" ? "global" : "local";
|
|
256
|
+
}
|
|
257
|
+
|
|
159
258
|
export function mergeLocalContentHistoryFallback(
|
|
160
259
|
stack: ContentHistoryChange[],
|
|
161
260
|
change: ContentHistoryChange,
|
|
@@ -15,6 +15,26 @@ export interface AlignableRect {
|
|
|
15
15
|
height: number;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
export function mergeAuthoredAndLiveRect(args: {
|
|
19
|
+
id: string;
|
|
20
|
+
authored: Partial<Omit<AlignableRect, "id">>;
|
|
21
|
+
live: Omit<AlignableRect, "id"> | null;
|
|
22
|
+
}): AlignableRect {
|
|
23
|
+
const resolve = (authored: number | undefined, live: number | undefined) =>
|
|
24
|
+
Number.isFinite(authored)
|
|
25
|
+
? (authored as number)
|
|
26
|
+
: Number.isFinite(live)
|
|
27
|
+
? (live as number)
|
|
28
|
+
: 0;
|
|
29
|
+
return {
|
|
30
|
+
id: args.id,
|
|
31
|
+
x: resolve(args.authored.x, args.live?.x),
|
|
32
|
+
y: resolve(args.authored.y, args.live?.y),
|
|
33
|
+
width: resolve(args.authored.width, args.live?.width),
|
|
34
|
+
height: resolve(args.authored.height, args.live?.height),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
18
38
|
export function computeAlignedPositions(
|
|
19
39
|
rects: readonly AlignableRect[],
|
|
20
40
|
bounds: { x: number; y: number; width: number; height: number },
|
|
@@ -142,7 +162,14 @@ export function inferAutoLayoutFromChildren(
|
|
|
142
162
|
padding: number;
|
|
143
163
|
} {
|
|
144
164
|
if (children.length === 0) {
|
|
145
|
-
return { direction: "
|
|
165
|
+
return { direction: "column", gap: 10, padding: 0 };
|
|
166
|
+
}
|
|
167
|
+
// Live Figma defaults a one-item Shift+A wrapper to vertical flow even
|
|
168
|
+
// when the item itself is much wider than it is tall. With no relationship
|
|
169
|
+
// between multiple children to infer, use that stable default rather than
|
|
170
|
+
// allowing the selected child's aspect ratio to choose the axis.
|
|
171
|
+
if (children.length === 1) {
|
|
172
|
+
return { direction: "column", gap: 10, padding: 0 };
|
|
146
173
|
}
|
|
147
174
|
const minX = Math.min(...children.map((child) => child.x));
|
|
148
175
|
const maxX = Math.max(...children.map((child) => child.x + child.width));
|
|
@@ -285,6 +285,40 @@ export function shouldResetExplicitOverviewZoomOnBasisChange(args: {
|
|
|
285
285
|
);
|
|
286
286
|
}
|
|
287
287
|
|
|
288
|
+
/**
|
|
289
|
+
* Zoom-compounding fix: a persisted/URL/agent-command `zoom` for the overview
|
|
290
|
+
* view is always a DISPLAYED percentage, and restoring it requires converting
|
|
291
|
+
* back to the internal canvas zoom by dividing by `overviewZoomScale` (see
|
|
292
|
+
* `getOverviewCanvasZoom`). That scale is only meaningful once a real screen
|
|
293
|
+
* has loaded and can serve as the zoom basis — before then it sits on its
|
|
294
|
+
* double fallback (`OVERVIEW_FRAME_WIDTH` / 1280 = 0.25), which is very
|
|
295
|
+
* unlikely to match the real screen's frame/source width ratio.
|
|
296
|
+
*
|
|
297
|
+
* The one-shot "apply the initial command" mount effect used to commit the
|
|
298
|
+
* conversion immediately, against whatever scale happened to be live at that
|
|
299
|
+
* first tick (the fallback, since files/screens hadn't loaded yet). The
|
|
300
|
+
* resulting canvas zoom then got displayed through the REAL scale once it
|
|
301
|
+
* resolved, producing a plausible-but-wrong percentage that was re-persisted
|
|
302
|
+
* as the new "current" zoom — so the next load repeated the same
|
|
303
|
+
* wrong-fallback conversion against an already-inflated value, compounding
|
|
304
|
+
* every reload with zero user interaction.
|
|
305
|
+
*
|
|
306
|
+
* This defers applying a zoom-bearing overview command until real screens
|
|
307
|
+
* have loaded (`filesLoaded`) and a real scale is resolvable, matching the
|
|
308
|
+
* same "not yet applicable — retry once data loads" contract the target-file
|
|
309
|
+
* lookup above already uses. Single-screen zoom commands are unaffected:
|
|
310
|
+
* `screenZoom` is used directly with no scale conversion.
|
|
311
|
+
*/
|
|
312
|
+
export function shouldDeferOverviewZoomCommand(args: {
|
|
313
|
+
hasZoomCommand: boolean;
|
|
314
|
+
targetView: "single" | "overview" | undefined;
|
|
315
|
+
filesLoaded: boolean;
|
|
316
|
+
}): boolean {
|
|
317
|
+
return (
|
|
318
|
+
args.hasZoomCommand && args.targetView === "overview" && !args.filesLoaded
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
|
|
288
322
|
/**
|
|
289
323
|
* Final sanity clamp on the DISPLAYED overview zoom (the number the zoom
|
|
290
324
|
* field shows and zoom-relative flows consume). Non-finite/non-positive
|