@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
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import { resolveSecret } from "@agent-native/core/server";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
|
|
5
|
+
const FIGMA_ACCESS_TOKEN_KEY = "FIGMA_ACCESS_TOKEN";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Return only whether the current authenticated request can use Figma.
|
|
9
|
+
*
|
|
10
|
+
* The registered-secrets endpoint intentionally reports user-vault metadata
|
|
11
|
+
* only. Local and single-tenant Design runtimes may instead provide a managed
|
|
12
|
+
* credential, so the import UI needs a request-scoped availability check that
|
|
13
|
+
* follows the exact same resolver as the importer without returning the
|
|
14
|
+
* credential, its suffix, or its source.
|
|
15
|
+
*/
|
|
16
|
+
export default defineAction({
|
|
17
|
+
description:
|
|
18
|
+
"Check whether this authenticated Design session can use the Figma API without returning credential values or metadata.",
|
|
19
|
+
schema: z.object({}),
|
|
20
|
+
http: { method: "GET" },
|
|
21
|
+
readOnly: true,
|
|
22
|
+
agentTool: false,
|
|
23
|
+
run: async () => ({
|
|
24
|
+
available: Boolean(await resolveSecret(FIGMA_ACCESS_TOKEN_KEY)),
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
fetchFigmaRenderUrl,
|
|
6
|
+
summarizeFigmaNode,
|
|
7
|
+
} from "../server/lib/figma-design-context.js";
|
|
8
|
+
import {
|
|
9
|
+
fetchFigmaNode,
|
|
10
|
+
fetchFileStructure,
|
|
11
|
+
type FigmaFileDepthNode,
|
|
12
|
+
} from "../server/lib/figma-node-import.js";
|
|
13
|
+
import { parseFigmaFileKey, parseFigmaNodeId } from "../shared/figma-url.js";
|
|
14
|
+
|
|
15
|
+
const schemaInput = z
|
|
16
|
+
.object({
|
|
17
|
+
figmaUrl: z
|
|
18
|
+
.string()
|
|
19
|
+
.trim()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe(
|
|
22
|
+
"Figma file/frame URL, e.g. https://www.figma.com/design/<fileKey>/<name>?node-id=<id>.",
|
|
23
|
+
),
|
|
24
|
+
fileKey: z
|
|
25
|
+
.string()
|
|
26
|
+
.trim()
|
|
27
|
+
.optional()
|
|
28
|
+
.describe("Figma file key. Used when figmaUrl is omitted or has no key."),
|
|
29
|
+
nodeId: z
|
|
30
|
+
.string()
|
|
31
|
+
.trim()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe(
|
|
34
|
+
"Figma node id (colon or dash form). Used when figmaUrl has no node-id. " +
|
|
35
|
+
"Omit both to get an overview of the file's pages and top-level frames first.",
|
|
36
|
+
),
|
|
37
|
+
depth: z.coerce
|
|
38
|
+
.number()
|
|
39
|
+
.int()
|
|
40
|
+
.min(1)
|
|
41
|
+
.max(10)
|
|
42
|
+
.default(4)
|
|
43
|
+
.describe(
|
|
44
|
+
"How many levels of children to expand below the requested node before truncating (only applies when nodeId is resolved).",
|
|
45
|
+
),
|
|
46
|
+
maxNodes: z.coerce
|
|
47
|
+
.number()
|
|
48
|
+
.int()
|
|
49
|
+
.min(10)
|
|
50
|
+
.max(1000)
|
|
51
|
+
.default(300)
|
|
52
|
+
.describe(
|
|
53
|
+
"Safety cap on total nodes summarized, to bound response size.",
|
|
54
|
+
),
|
|
55
|
+
includeScreenshot: z
|
|
56
|
+
.boolean()
|
|
57
|
+
.default(true)
|
|
58
|
+
.describe(
|
|
59
|
+
"Also fetch a rendered screenshot URL for the requested node via the Figma images REST endpoint.",
|
|
60
|
+
),
|
|
61
|
+
screenshotFormat: z.enum(["png", "svg"]).default("png"),
|
|
62
|
+
})
|
|
63
|
+
.refine((value) => value.figmaUrl || value.fileKey, {
|
|
64
|
+
message: "Pass figmaUrl or fileKey.",
|
|
65
|
+
path: ["figmaUrl"],
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
function summarizeStructure(document: FigmaFileDepthNode) {
|
|
69
|
+
return (document.children ?? []).map((page) => ({
|
|
70
|
+
id: page.id,
|
|
71
|
+
name: page.name,
|
|
72
|
+
type: page.type,
|
|
73
|
+
frames: (page.children ?? []).map((frame) => ({
|
|
74
|
+
id: frame.id,
|
|
75
|
+
name: frame.name,
|
|
76
|
+
type: frame.type,
|
|
77
|
+
childCount: frame.children?.length ?? 0,
|
|
78
|
+
})),
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export default defineAction({
|
|
83
|
+
description:
|
|
84
|
+
"Answer 'what's in this Figma file/frame?' with a compact, LLM-friendly structural summary — the chat equivalent of the official Figma MCP's get_metadata + get_design_context (read-only, no screen is created; use import-figma-frame to actually bring a frame into Design as an editable screen). Pass only figmaUrl/fileKey to get an overview of the file's pages and top-level frames (like get_metadata with no node id); pass a nodeId (or a node-id link) to get a depth-limited node tree with box geometry, fills/strokes/effects/corner-radii, auto-layout, text/style, and (by default) a rendered screenshot URL for that node. Requires the saved FIGMA_ACCESS_TOKEN secret.",
|
|
85
|
+
schema: schemaInput,
|
|
86
|
+
http: { method: "GET" },
|
|
87
|
+
readOnly: true,
|
|
88
|
+
publicAgent: { expose: true, readOnly: true, requiresAuth: true },
|
|
89
|
+
run: async (args) => {
|
|
90
|
+
const fileKey =
|
|
91
|
+
parseFigmaFileKey(args.fileKey) ?? parseFigmaFileKey(args.figmaUrl);
|
|
92
|
+
if (!fileKey) {
|
|
93
|
+
throw new Error("Could not find a Figma file key in the provided URL.");
|
|
94
|
+
}
|
|
95
|
+
const nodeId =
|
|
96
|
+
parseFigmaNodeId(args.nodeId) ?? parseFigmaNodeId(args.figmaUrl);
|
|
97
|
+
|
|
98
|
+
if (!nodeId) {
|
|
99
|
+
const document = await fetchFileStructure(fileKey, 3);
|
|
100
|
+
const pages = summarizeStructure(document);
|
|
101
|
+
return {
|
|
102
|
+
source: "figma",
|
|
103
|
+
fileKey,
|
|
104
|
+
mode: "overview" as const,
|
|
105
|
+
pages,
|
|
106
|
+
guidance:
|
|
107
|
+
"No nodeId was given, so this lists the file's pages and top-level frames only (mirrors the official Figma MCP's get_metadata with no node id). Call get-figma-design-context again with one of these frame ids (or a node-id link) for a full structural summary and screenshot of that frame.",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const node = await fetchFigmaNode(fileKey, nodeId);
|
|
112
|
+
const {
|
|
113
|
+
node: summary,
|
|
114
|
+
nodeCount,
|
|
115
|
+
truncated,
|
|
116
|
+
} = summarizeFigmaNode(node, {
|
|
117
|
+
maxDepth: args.depth,
|
|
118
|
+
maxNodes: args.maxNodes,
|
|
119
|
+
});
|
|
120
|
+
const screenshotUrl = args.includeScreenshot
|
|
121
|
+
? await fetchFigmaRenderUrl(fileKey, nodeId, args.screenshotFormat)
|
|
122
|
+
: null;
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
source: "figma",
|
|
126
|
+
fileKey,
|
|
127
|
+
nodeId,
|
|
128
|
+
mode: "node" as const,
|
|
129
|
+
nodeCount,
|
|
130
|
+
truncated,
|
|
131
|
+
summary,
|
|
132
|
+
screenshotUrl,
|
|
133
|
+
guidance: truncated
|
|
134
|
+
? "This tree was truncated by depth or node-count limits (see truncatedDepth/truncatedChildren on individual nodes). Re-run with a larger depth/maxNodes, or target a nested nodeId directly, to see more. To bring this frame into Design as a real editable screen, use import-figma-frame instead of hand-reconstructing it from this summary."
|
|
135
|
+
: "To bring this frame into Design as a real editable screen (not just this summary), use import-figma-frame.",
|
|
136
|
+
};
|
|
137
|
+
},
|
|
138
|
+
});
|
|
@@ -61,7 +61,7 @@ function providerJson(envelope: unknown, label: string): unknown {
|
|
|
61
61
|
|
|
62
62
|
export default defineAction({
|
|
63
63
|
description:
|
|
64
|
-
"Summarize a Figma file's published styles (fill/text/effect/grid) by name, description, and node id. This is the file's Styles panel, NOT the Enterprise Variables API —
|
|
64
|
+
"Summarize a Figma file's published styles (fill/text/effect/grid) by name, description, and node id. This is the file's Styles panel, NOT the Enterprise Variables API — reusable design-system extraction routes through index-design-system-with-builder or the Design System Setup .fig upload. Requires the saved FIGMA_ACCESS_TOKEN secret.",
|
|
65
65
|
schema: schemaInput,
|
|
66
66
|
http: { method: "GET" },
|
|
67
67
|
readOnly: true,
|
|
@@ -109,7 +109,7 @@ export default defineAction({
|
|
|
109
109
|
byType,
|
|
110
110
|
styles,
|
|
111
111
|
guidance:
|
|
112
|
-
"These are the file's published FILL/TEXT/EFFECT/GRID styles (name, description, node id), not the Enterprise Variables API. For
|
|
112
|
+
"These are the file's published FILL/TEXT/EFFECT/GRID styles (name, description, node id), not the Enterprise Variables API. For reusable design-system extraction use index-design-system-with-builder or the Design System Setup .fig upload instead of hand-mapping these style records.",
|
|
113
113
|
};
|
|
114
114
|
},
|
|
115
115
|
});
|
|
@@ -20,16 +20,20 @@ import { parseFigmaFileKey } from "../shared/figma-url.js";
|
|
|
20
20
|
const NODE_STRUCTURE_DEPTH = 3;
|
|
21
21
|
|
|
22
22
|
const CREDENTIAL_MISSING_RE = /credential not configured/i;
|
|
23
|
+
const DURABLE_STORAGE_REQUIRED_RE =
|
|
24
|
+
/authenticated user so assets can be stored durably|could not store a Figma image durably|needs durable file storage/i;
|
|
23
25
|
|
|
24
26
|
const AMBIGUOUS_GUIDANCE =
|
|
25
27
|
'Couldn\'t confidently match this paste to specific Figma nodes, so nothing was imported from the API. Paste a frame LINK instead (copy the frame in Figma, then "Copy link to selection") for an exact node import — or continue with the clipboard preview below.';
|
|
26
28
|
|
|
27
29
|
const KEY_MISSING_GUIDANCE =
|
|
28
|
-
"Connect your Figma access token (Settings >
|
|
30
|
+
"Connect your Figma access token (Settings > Connections > Figma access token) to import this paste as exact, editable Figma nodes.";
|
|
31
|
+
const SELECTION_TRUNCATED_GUIDANCE =
|
|
32
|
+
"Figma copied more than 100 selected nodes. Imported the first 100; split larger selections into smaller pastes so every layer is included.";
|
|
29
33
|
|
|
30
34
|
export default defineAction({
|
|
31
35
|
description:
|
|
32
|
-
"Import a
|
|
36
|
+
"Import a clipboard paste copied from Figma (Cmd+C in Figma, Cmd+V here). Current Figma clients include exact selected node ids in the figmeta marker, so those nodes are fetched directly through the Figma REST API. Older or changed clipboard formats fall back to a conservative name/text match, then to any visible HTML preview. A saved FIGMA_ACCESS_TOKEN is required for REST import; a copied frame link remains the stable public-contract path.",
|
|
33
37
|
schema: z.object({
|
|
34
38
|
designId: z
|
|
35
39
|
.string()
|
|
@@ -42,34 +46,94 @@ export default defineAction({
|
|
|
42
46
|
.describe(
|
|
43
47
|
"The fileKey decoded from the clipboard's figmeta marker (see app/lib/figma-clipboard.ts's extractFigmeta).",
|
|
44
48
|
),
|
|
49
|
+
selectedNodeIds: z
|
|
50
|
+
.array(
|
|
51
|
+
z
|
|
52
|
+
.string()
|
|
53
|
+
.max(64)
|
|
54
|
+
.regex(/^\d+:\d+$/),
|
|
55
|
+
)
|
|
56
|
+
.max(100)
|
|
57
|
+
.optional()
|
|
58
|
+
.describe(
|
|
59
|
+
"Exact selected node ids decoded from Figma's current selectedNodeData clipboard field. Omit for older clipboard formats.",
|
|
60
|
+
),
|
|
61
|
+
selectedNodeIdsTruncated: z
|
|
62
|
+
.boolean()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe(
|
|
65
|
+
"True when the client capped a Figma clipboard selection to the first 100 exact node ids.",
|
|
66
|
+
),
|
|
45
67
|
clipboardHtml: z
|
|
46
68
|
.string()
|
|
47
69
|
.describe(
|
|
48
|
-
"
|
|
70
|
+
"Figma clipboard HTML used for fallback matching. When exact node ids are present, the client removes the large private data-buffer while retaining figmeta and visible HTML.",
|
|
49
71
|
),
|
|
50
72
|
originalName: z.string().optional(),
|
|
51
73
|
}),
|
|
52
|
-
run: async ({
|
|
74
|
+
run: async ({
|
|
75
|
+
designId,
|
|
76
|
+
figmetaFileKey,
|
|
77
|
+
selectedNodeIds,
|
|
78
|
+
selectedNodeIdsTruncated,
|
|
79
|
+
clipboardHtml,
|
|
80
|
+
originalName,
|
|
81
|
+
}) => {
|
|
53
82
|
const fileKey = parseFigmaFileKey(figmetaFileKey);
|
|
54
83
|
if (!fileKey) {
|
|
55
84
|
throw new Error("The clipboard's Figma file key could not be parsed.");
|
|
56
85
|
}
|
|
57
86
|
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
//
|
|
87
|
+
// Current Figma clipboard HTML commonly contains only figmeta + the
|
|
88
|
+
// private binary figma buffer, with no visible HTML at all. Exact REST ids
|
|
89
|
+
// must therefore run before requiring the legacy preview/matching signal.
|
|
61
90
|
const parsedClipboard = parseVisibleClipboardHtml(clipboardHtml);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
const clipboardTexts = extractVisibleTexts(parsedClipboard.fallbackHtml);
|
|
91
|
+
const clipboardTexts = parsedClipboard.fallbackHtml
|
|
92
|
+
? extractVisibleTexts(parsedClipboard.fallbackHtml)
|
|
93
|
+
: [];
|
|
68
94
|
|
|
69
95
|
let figmaApiKeyMissing = false;
|
|
70
96
|
let matchStatus: "matched" | "ambiguous" | "none" | "error" = "error";
|
|
71
97
|
|
|
72
98
|
try {
|
|
99
|
+
if (selectedNodeIds?.length) {
|
|
100
|
+
const nodesById = await fetchFigmaNodes(fileKey, selectedNodeIds);
|
|
101
|
+
const { files, fidelityEntries } = await buildScreenFilesFromFigmaNodes(
|
|
102
|
+
fileKey,
|
|
103
|
+
nodesById,
|
|
104
|
+
);
|
|
105
|
+
const saved = await saveImportedDesignFiles({
|
|
106
|
+
designId,
|
|
107
|
+
sourceType: "figma-clipboard-rest",
|
|
108
|
+
files,
|
|
109
|
+
});
|
|
110
|
+
const selectionWarnings = selectedNodeIdsTruncated
|
|
111
|
+
? [SELECTION_TRUNCATED_GUIDANCE]
|
|
112
|
+
: [];
|
|
113
|
+
return {
|
|
114
|
+
...saved,
|
|
115
|
+
warnings: [...saved.warnings, ...selectionWarnings],
|
|
116
|
+
strategy: "restNodes" as const,
|
|
117
|
+
figma: {
|
|
118
|
+
fileKey,
|
|
119
|
+
nodeIds: selectedNodeIds,
|
|
120
|
+
matchSource: "clipboardNodeIds" as const,
|
|
121
|
+
selectionTruncated: selectedNodeIdsTruncated === true,
|
|
122
|
+
},
|
|
123
|
+
fidelityReport: summarizeFidelity(fidelityEntries),
|
|
124
|
+
guidance: selectedNodeIdsTruncated
|
|
125
|
+
? `${SELECTION_TRUNCATED_GUIDANCE} Review fidelityReport for conversion details.`
|
|
126
|
+
: "Imported the exact nodes selected in Figma. Review fidelityReport.imageFallbacks for subtrees rendered as PNG and fidelityReport.approximated for properties CSS cannot express exactly.",
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (clipboardTexts.length === 0) {
|
|
131
|
+
matchStatus = "none";
|
|
132
|
+
throw new Error(
|
|
133
|
+
"The Figma clipboard did not include exact node ids or visible text for matching.",
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
73
137
|
const document = await fetchFileStructure(fileKey, NODE_STRUCTURE_DEPTH);
|
|
74
138
|
const candidates = buildFigmaNodeCandidates(document);
|
|
75
139
|
const matchResult = matchFigmaClipboardNodes(candidates, clipboardTexts);
|
|
@@ -101,9 +165,26 @@ export default defineAction({
|
|
|
101
165
|
};
|
|
102
166
|
}
|
|
103
167
|
} catch (error) {
|
|
104
|
-
|
|
105
|
-
error instanceof Error ? error.message : String(error)
|
|
106
|
-
|
|
168
|
+
const errorMessage =
|
|
169
|
+
error instanceof Error ? error.message : String(error);
|
|
170
|
+
// The importer intentionally refuses to persist Figma's expiring render
|
|
171
|
+
// URLs. Keep its actionable storage setup error instead of disguising it
|
|
172
|
+
// as an ordinary clipboard-format fallback.
|
|
173
|
+
if (DURABLE_STORAGE_REQUIRED_RE.test(errorMessage)) {
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
figmaApiKeyMissing = CREDENTIAL_MISSING_RE.test(errorMessage);
|
|
177
|
+
if (
|
|
178
|
+
selectedNodeIds?.length &&
|
|
179
|
+
!parsedClipboard.fallbackHtml &&
|
|
180
|
+
!figmaApiKeyMissing
|
|
181
|
+
) {
|
|
182
|
+
// Exact ids prove this was a current Figma clipboard. With no visible
|
|
183
|
+
// fallback, a real REST/import failure must remain truthful and
|
|
184
|
+
// actionable rather than being mislabeled as a clipboard format that
|
|
185
|
+
// omitted ids.
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
107
188
|
if (!figmaApiKeyMissing) {
|
|
108
189
|
// A real (non-credential) REST failure — network error, revoked
|
|
109
190
|
// token, file access issue, etc. Still fall back to the honest
|
|
@@ -113,6 +194,21 @@ export default defineAction({
|
|
|
113
194
|
}
|
|
114
195
|
}
|
|
115
196
|
|
|
197
|
+
if (!parsedClipboard.fallbackHtml) {
|
|
198
|
+
return {
|
|
199
|
+
designId,
|
|
200
|
+
files: [],
|
|
201
|
+
warnings: [],
|
|
202
|
+
strategy: "htmlFallback" as const,
|
|
203
|
+
figmaApiKeyMissing,
|
|
204
|
+
matchStatus,
|
|
205
|
+
figma: { fileKey },
|
|
206
|
+
guidance: figmaApiKeyMissing
|
|
207
|
+
? `${KEY_MISSING_GUIDANCE} Current Figma clipboard data has no browser-readable HTML fallback, so paste a frame link after connecting the token.`
|
|
208
|
+
: "This Figma clipboard format did not expose exact node ids or browser-readable HTML. Paste a frame link for an exact import.",
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
116
212
|
const saved = await saveFigmaPasteHtmlFallback({
|
|
117
213
|
designId,
|
|
118
214
|
clipboardHtml,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import { assertAccess } from "@agent-native/core/sharing";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
|
|
4
5
|
import {
|
|
@@ -7,7 +8,10 @@ import {
|
|
|
7
8
|
resolveTargetNodeId,
|
|
8
9
|
summarizeFidelity,
|
|
9
10
|
} from "../server/lib/figma-node-import.js";
|
|
10
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
resolveImportDesignId,
|
|
13
|
+
saveImportedDesignFiles,
|
|
14
|
+
} from "../server/lib/import-design-files.js";
|
|
11
15
|
import { parseFigmaFileKey, parseFigmaNodeId } from "../shared/figma-url.js";
|
|
12
16
|
|
|
13
17
|
const schemaInput = z
|
|
@@ -49,7 +53,7 @@ const schemaInput = z
|
|
|
49
53
|
|
|
50
54
|
export default defineAction({
|
|
51
55
|
description:
|
|
52
|
-
"Import a Figma frame/component by URL or file key + node id, mapping
|
|
56
|
+
"Import a Figma frame/component by URL or file key + node id, mapping supported structure to fidelity-aware HTML (position, auto-layout as flexbox, text, fills/gradients, strokes, corner radii, effects) and saving it as a new Design screen. Geometry and paint models HTML/CSS cannot represent faithfully (including masks, vector/boolean geometry, lines/arcs, advanced strokes/text, and transformed image crops) use rendered fallbacks instead of silently importing the wrong visual. Returns a fidelity report of which nodes were exact, approximated, or image-fallback. Requires the saved FIGMA_ACCESS_TOKEN secret.",
|
|
53
57
|
schema: schemaInput,
|
|
54
58
|
publicAgent: { expose: true, readOnly: false, requiresAuth: true },
|
|
55
59
|
run: async (args) => {
|
|
@@ -67,6 +71,13 @@ export default defineAction({
|
|
|
67
71
|
const requestedNodeId =
|
|
68
72
|
parseFigmaNodeId(args.nodeId) ?? parseFigmaNodeId(args.figmaUrl);
|
|
69
73
|
|
|
74
|
+
// Validate the target before any provider fetch, rendered-fallback
|
|
75
|
+
// download, or durable upload. saveImportedDesignFiles checks again at
|
|
76
|
+
// mutation time, but waiting until then leaves external work and orphaned
|
|
77
|
+
// assets behind when a caller names a design they cannot edit.
|
|
78
|
+
const designId = await resolveImportDesignId(args.designId);
|
|
79
|
+
await assertAccess("design", designId, "editor");
|
|
80
|
+
|
|
70
81
|
const nodeId = await resolveTargetNodeId(fileKey, requestedNodeId);
|
|
71
82
|
const rootNode = await fetchFigmaNode(fileKey, nodeId);
|
|
72
83
|
|
|
@@ -79,7 +90,7 @@ export default defineAction({
|
|
|
79
90
|
);
|
|
80
91
|
|
|
81
92
|
const saved = await saveImportedDesignFiles({
|
|
82
|
-
designId
|
|
93
|
+
designId,
|
|
83
94
|
sourceType: "figma-import",
|
|
84
95
|
files,
|
|
85
96
|
});
|
|
@@ -89,7 +100,7 @@ export default defineAction({
|
|
|
89
100
|
figma: { fileKey, nodeId, nodeName: rootNode.name ?? null },
|
|
90
101
|
fidelityReport: summarizeFidelity(fidelityEntries),
|
|
91
102
|
guidance:
|
|
92
|
-
"Review fidelityReport.imageFallbacks for subtrees rendered as PNG (vector
|
|
103
|
+
"Review fidelityReport.imageFallbacks for subtrees rendered as PNG (masks, vector/boolean geometry, lines/arcs, advanced strokes/text, transformed image crops, and unsupported node types) and fidelityReport.approximated for properties CSS cannot express exactly (rotation, per-side stroke alignment, radial/angular/diamond gradients, blur radius scale, and live component/variable/prototype semantics).",
|
|
93
104
|
};
|
|
94
105
|
},
|
|
95
106
|
});
|
|
@@ -76,6 +76,10 @@ export default defineAction({
|
|
|
76
76
|
const files = buildBuilderDesignSystemIndexFiles({
|
|
77
77
|
codeFiles,
|
|
78
78
|
designMd,
|
|
79
|
+
// Agent action payloads intentionally stay at the core 2 MB inline
|
|
80
|
+
// budget. Fail loudly instead of silently dropping a larger `.fig`;
|
|
81
|
+
// the setup screen's guarded multipart route supports up to 200 MB.
|
|
82
|
+
overflowBehavior: "throw",
|
|
79
83
|
});
|
|
80
84
|
const result = await startBuilderDesignSystemIndex({
|
|
81
85
|
projectName,
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import {
|
|
3
|
+
getRequestOrgId,
|
|
4
|
+
getRequestUserEmail,
|
|
5
|
+
} from "@agent-native/core/server/request-context";
|
|
6
|
+
import { accessFilter } from "@agent-native/core/sharing";
|
|
7
|
+
import { and, desc, eq, inArray, sql } from "drizzle-orm";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
|
|
10
|
+
import { getDb, schema } from "../server/db/index.js";
|
|
11
|
+
import { DESIGN_TEMPLATE_PRESETS } from "../shared/design-template-presets.js";
|
|
12
|
+
import { designTemplateCategorySchema } from "./save-design-as-template.js";
|
|
13
|
+
|
|
14
|
+
const PREVIEW_MAX_BYTES = 50_000;
|
|
15
|
+
|
|
16
|
+
export default defineAction({
|
|
17
|
+
description:
|
|
18
|
+
"List reusable Design templates, including built-in starters plus templates the user can access or publicly discover.",
|
|
19
|
+
schema: z.object({
|
|
20
|
+
category: designTemplateCategorySchema.optional(),
|
|
21
|
+
includePreview: z.enum(["true", "false"]).optional().default("false"),
|
|
22
|
+
}),
|
|
23
|
+
readOnly: true,
|
|
24
|
+
http: { method: "GET" },
|
|
25
|
+
run: async ({ category, includePreview }) => {
|
|
26
|
+
const db = getDb();
|
|
27
|
+
const userEmail = getRequestUserEmail();
|
|
28
|
+
const access = accessFilter(
|
|
29
|
+
schema.designTemplates,
|
|
30
|
+
schema.designTemplateShares,
|
|
31
|
+
{ userEmail, orgId: getRequestOrgId() },
|
|
32
|
+
"viewer",
|
|
33
|
+
{ includePublic: true },
|
|
34
|
+
);
|
|
35
|
+
const rows = await db
|
|
36
|
+
.select({
|
|
37
|
+
id: schema.designTemplates.id,
|
|
38
|
+
title: schema.designTemplates.title,
|
|
39
|
+
description: schema.designTemplates.description,
|
|
40
|
+
category: schema.designTemplates.category,
|
|
41
|
+
width: schema.designTemplates.width,
|
|
42
|
+
height: schema.designTemplates.height,
|
|
43
|
+
lockedLayerCount: schema.designTemplates.lockedLayerCount,
|
|
44
|
+
visibility: schema.designTemplates.visibility,
|
|
45
|
+
ownerEmail: schema.designTemplates.ownerEmail,
|
|
46
|
+
createdAt: schema.designTemplates.createdAt,
|
|
47
|
+
updatedAt: schema.designTemplates.updatedAt,
|
|
48
|
+
})
|
|
49
|
+
.from(schema.designTemplates)
|
|
50
|
+
.where(
|
|
51
|
+
category
|
|
52
|
+
? and(access, eq(schema.designTemplates.category, category))
|
|
53
|
+
: access,
|
|
54
|
+
)
|
|
55
|
+
.orderBy(desc(schema.designTemplates.updatedAt));
|
|
56
|
+
|
|
57
|
+
const previews = new Map<string, string>();
|
|
58
|
+
if (includePreview === "true" && rows.length > 0) {
|
|
59
|
+
const files = await db
|
|
60
|
+
.select({
|
|
61
|
+
templateId: schema.designTemplateFiles.templateId,
|
|
62
|
+
filename: schema.designTemplateFiles.filename,
|
|
63
|
+
fileType: schema.designTemplateFiles.fileType,
|
|
64
|
+
content: sql<string>`substr(${schema.designTemplateFiles.content}, 1, ${PREVIEW_MAX_BYTES})`,
|
|
65
|
+
})
|
|
66
|
+
.from(schema.designTemplateFiles)
|
|
67
|
+
.where(
|
|
68
|
+
inArray(
|
|
69
|
+
schema.designTemplateFiles.templateId,
|
|
70
|
+
rows.map((row) => row.id),
|
|
71
|
+
),
|
|
72
|
+
);
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
if (!previews.has(file.templateId) && file.fileType === "html") {
|
|
75
|
+
previews.set(file.templateId, file.content);
|
|
76
|
+
}
|
|
77
|
+
if (file.filename === "index.html" && file.fileType === "html") {
|
|
78
|
+
previews.set(file.templateId, file.content);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const presets = DESIGN_TEMPLATE_PRESETS.filter(
|
|
84
|
+
(preset) => !category || preset.category === category,
|
|
85
|
+
).map((preset) => ({
|
|
86
|
+
id: preset.id,
|
|
87
|
+
title: preset.title,
|
|
88
|
+
description: preset.description,
|
|
89
|
+
category: preset.category,
|
|
90
|
+
width: preset.width,
|
|
91
|
+
height: preset.height,
|
|
92
|
+
lockedLayerCount: 2,
|
|
93
|
+
visibility: "public" as const,
|
|
94
|
+
isOwner: false,
|
|
95
|
+
source: "starter" as const,
|
|
96
|
+
createdAt: null,
|
|
97
|
+
updatedAt: null,
|
|
98
|
+
...(includePreview === "true" ? { previewHtml: preset.content } : {}),
|
|
99
|
+
}));
|
|
100
|
+
|
|
101
|
+
const saved = rows.map(({ ownerEmail, ...row }) => ({
|
|
102
|
+
...row,
|
|
103
|
+
isOwner:
|
|
104
|
+
!!userEmail && ownerEmail.toLowerCase() === userEmail.toLowerCase(),
|
|
105
|
+
source: "saved" as const,
|
|
106
|
+
...(includePreview === "true"
|
|
107
|
+
? { previewHtml: previews.get(row.id) ?? null }
|
|
108
|
+
: {}),
|
|
109
|
+
}));
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
count: presets.length + saved.length,
|
|
113
|
+
starterCount: presets.length,
|
|
114
|
+
savedCount: saved.length,
|
|
115
|
+
templates: [...presets, ...saved],
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
});
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* pnpm action navigate --view=editor --designId=abc123 --editorView=overview
|
|
10
10
|
* pnpm action navigate --view=editor --designId=abc123 --filename=checkout.html
|
|
11
11
|
* pnpm action navigate --view=design-systems
|
|
12
|
+
* pnpm action navigate --view=templates
|
|
12
13
|
* pnpm action navigate --view=design-systems --designSystemId=abc123
|
|
13
14
|
* pnpm action navigate --view=settings
|
|
14
15
|
* pnpm action navigate --path=/some/route
|
|
@@ -23,6 +24,7 @@
|
|
|
23
24
|
* --filename Screen filename to focus in the design editor
|
|
24
25
|
* --tool Design editor tool to activate
|
|
25
26
|
* --designSystemId Design system ID (for design-systems view)
|
|
27
|
+
* --templateId Saved or starter template ID (for templates view)
|
|
26
28
|
* --path URL path to navigate to
|
|
27
29
|
*/
|
|
28
30
|
|
|
@@ -59,11 +61,18 @@ const designLeftPanelSchema = z.enum([
|
|
|
59
61
|
|
|
60
62
|
export default defineAction({
|
|
61
63
|
description:
|
|
62
|
-
"Navigate the UI to a specific view or path. Views: list, editor, design-systems, present, settings. Use --designId with editor/present views and --designSystemId with design-systems. For designs, use editorView=overview to show the infinite screens canvas, or editorView=single with fileId/filename/screen to focus a screen. Use leftPanel=file|agent|assets|import|tools|tokens|code to focus the left rail, including Import and the wide Code workspace. Legacy inspectorTab=extensions opens Tools. Use tool to activate a design editor tool.",
|
|
64
|
+
"Navigate the UI to a specific view or path. Views: list, templates, editor, design-systems, present, settings. Use --templateId with templates, --designId with editor/present views, and --designSystemId with design-systems. For designs, use editorView=overview to show the infinite screens canvas, or editorView=single with fileId/filename/screen to focus a screen. Use leftPanel=file|agent|assets|import|tools|tokens|code to focus the left rail, including Import and the wide Code workspace. Legacy inspectorTab=extensions opens Tools. Use tool to activate a design editor tool.",
|
|
63
65
|
schema: z
|
|
64
66
|
.object({
|
|
65
67
|
view: z
|
|
66
|
-
.enum([
|
|
68
|
+
.enum([
|
|
69
|
+
"list",
|
|
70
|
+
"templates",
|
|
71
|
+
"editor",
|
|
72
|
+
"design-systems",
|
|
73
|
+
"present",
|
|
74
|
+
"settings",
|
|
75
|
+
])
|
|
67
76
|
.optional()
|
|
68
77
|
.describe("View name to navigate to"),
|
|
69
78
|
designId: z.string().optional().describe("Design ID for editor/present"),
|
|
@@ -110,6 +119,10 @@ export default defineAction({
|
|
|
110
119
|
.string()
|
|
111
120
|
.optional()
|
|
112
121
|
.describe("Design system ID for design-systems view"),
|
|
122
|
+
templateId: z
|
|
123
|
+
.string()
|
|
124
|
+
.optional()
|
|
125
|
+
.describe("Saved or starter template ID for templates view"),
|
|
113
126
|
path: z.string().optional().describe("URL path to navigate to"),
|
|
114
127
|
})
|
|
115
128
|
.superRefine((args, ctx) => {
|
|
@@ -161,6 +174,7 @@ export default defineAction({
|
|
|
161
174
|
if (args.zoom !== undefined) nav.zoom = args.zoom;
|
|
162
175
|
if (args.tool) nav.tool = args.tool;
|
|
163
176
|
if (args.designSystemId) nav.designSystemId = args.designSystemId;
|
|
177
|
+
if (args.templateId) nav.templateId = args.templateId;
|
|
164
178
|
if (args.path) nav.path = args.path;
|
|
165
179
|
await writeAppState("navigate", nav);
|
|
166
180
|
return `Navigating to ${args.view || args.path}${
|
|
@@ -13,6 +13,15 @@ import {
|
|
|
13
13
|
const ProviderSchema = z.enum(DESIGN_PROVIDER_API_IDS);
|
|
14
14
|
const MethodSchema = z.enum(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"]);
|
|
15
15
|
|
|
16
|
+
export function requiresProviderApiApproval(args: {
|
|
17
|
+
provider: string;
|
|
18
|
+
method: string;
|
|
19
|
+
}): boolean {
|
|
20
|
+
return (
|
|
21
|
+
args.provider === "figma" && args.method !== "GET" && args.method !== "HEAD"
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
16
25
|
const PaginationSchema = z
|
|
17
26
|
.object({
|
|
18
27
|
nextCursorPath: z
|
|
@@ -75,7 +84,7 @@ export default defineAction({
|
|
|
75
84
|
"The request is constrained to the provider host, uses saved scoped credentials such as GITHUB_TOKEN or FIGMA_ACCESS_TOKEN automatically, blocks private/internal URLs, and redacts secrets from responses. " +
|
|
76
85
|
"\n\nSTAGING MODE (preferred for large responses): Pass stageAs to write response items into a scratch dataset instead of returning the raw body. " +
|
|
77
86
|
"Returns { dataset, rowCount, columns, sampleRows } so only a compact summary enters context. Use query-staged-dataset to aggregate, filter, and project the data without re-fetching. " +
|
|
78
|
-
"\n\nPAGINATION: When stageAs is set, pass pagination config to fetch all pages server-side into the same dataset. For GitHub page pagination, use pageParam='page', pageSize from per_page, and itemsPath when the response object contains an items array.",
|
|
87
|
+
"\n\nPAGINATION: When stageAs is set, pass pagination config to fetch all pages server-side into the same dataset. For GitHub page pagination, use pageParam='page', pageSize from per_page, and itemsPath when the response object contains an items array. Figma REST can read files/nodes/styles/components and perform a few scoped writes such as comments or Enterprise variables, but it cannot create arbitrary canvas layers; use the official Figma MCP when connected or the Figma SVG export workflow for canvas handoff.",
|
|
79
88
|
schema: z.object({
|
|
80
89
|
provider: ProviderSchema.describe("Configured provider API to call."),
|
|
81
90
|
method: MethodSchema.default("GET").describe("HTTP method to use."),
|
|
@@ -195,6 +204,7 @@ export default defineAction({
|
|
|
195
204
|
),
|
|
196
205
|
}),
|
|
197
206
|
http: false,
|
|
207
|
+
needsApproval: requiresProviderApiApproval,
|
|
198
208
|
run: async (args) => {
|
|
199
209
|
if (args.stageAs) {
|
|
200
210
|
const ctx = getCredentialContext();
|