@agent-native/core 0.169.1 → 0.170.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/agent-native.eject.json +4 -1
- package/bin/agent-native.js +23 -5
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/app/i18n-data.ts +28 -0
- package/corpus/templates/analytics/app/pages/Agents.tsx +25 -1
- package/corpus/templates/analytics/app/routes/$.tsx +10 -0
- package/corpus/templates/analytics/app/routes.ts +3 -1
- package/corpus/templates/analytics/changelog/2026-08-22-fixed-the-agent-native-templates-first-party-dashboard-panel.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-22-org-admin-panels-no-longer-report-a-database-error-as-a-per.md +9 -0
- package/corpus/templates/analytics/changelog/2026-08-22-slack-requests-report-invalid-inputs.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-22-unknown-analytics-links-now-return-a-real-not-found-status.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +2 -1
- package/corpus/templates/analytics/docs/schemas/tracked-events.md +2 -0
- package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +29 -7
- package/corpus/templates/analytics/server/handlers/slack.ts +59 -5
- package/corpus/templates/analytics/server/lib/db-admin-connections.ts +11 -6
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +132 -2
- package/corpus/templates/analytics/server/lib/slack.ts +4 -2
- package/corpus/templates/analytics/vitest.config.ts +6 -1
- package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/assets/app/routes/library.tsx +5 -3
- package/corpus/templates/assets/app/routes.ts +3 -1
- package/corpus/templates/assets/changelog/2026-08-22-library-page-loads-again-instead-of-crashing-on-open.md +6 -0
- package/corpus/templates/assets/vitest.config.ts +6 -1
- package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/brain/app/components/ui/pointer-lock.ts +1 -0
- package/corpus/templates/brain/app/routes/sources.tsx +8 -3
- package/corpus/templates/brain/changelog/2026-08-22-tuning-or-adding-a-source-no-longer-leaves-the-sources-page.md +6 -0
- package/corpus/templates/brain/vitest.config.ts +1 -0
- package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/calendar/actions/list-booking-links.ts +83 -4
- package/corpus/templates/calendar/actions/update-booking-link.ts +4 -3
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +11 -3
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +1 -1
- package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +103 -44
- package/corpus/templates/calendar/app/components/calendar/OutOfOfficeEvent.tsx +28 -24
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +9 -2
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +47 -58
- package/corpus/templates/calendar/app/hooks/use-booking-links.ts +5 -1
- package/corpus/templates/calendar/app/lib/event-layout.ts +52 -26
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +126 -98
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +1 -0
- package/corpus/templates/calendar/app/pages/Settings.tsx +88 -81
- package/corpus/templates/calendar/app/routes.ts +3 -1
- package/corpus/templates/calendar/changelog/2026-08-22-booking-link-visibility-respects-shared-access.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-clicking-an-out-of-office-event-s-marker-no-longer-creates-a.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-event-detail-views-now-show-your-calendar-timezone.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-google-calendar-can-now-connect-with-the-shared-google-oauth.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-overlapping-events-now-show-each-others-boundaries.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-public-booking-pages-now-offer-time-slots-from-the-host-s-we.md +6 -0
- package/corpus/templates/calendar/server/handlers/bookings.ts +5 -7
- package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
- package/corpus/templates/calendar/server/lib/google-calendar.ts +139 -14
- package/corpus/templates/calendar/server/onboarding.ts +85 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +2 -0
- package/corpus/templates/calendar/shared/api.ts +9 -1
- package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/chat/app/routes.ts +3 -1
- package/corpus/templates/chat/vitest.config.ts +8 -0
- package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/clips/actions/get-meeting.ts +9 -4
- package/corpus/templates/clips/actions/list-recordings.ts +16 -3
- package/corpus/templates/clips/actions/search-meetings.ts +1 -0
- package/corpus/templates/clips/actions/view-screen.ts +8 -1
- package/corpus/templates/clips/app/components/meetings/meeting-history-row.tsx +32 -1
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +29 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +5 -0
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +33 -4
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +1 -0
- package/corpus/templates/clips/app/routes/access-request.approve.tsx +16 -9
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +17 -7
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +17 -7
- package/corpus/templates/clips/changelog/2026-08-21-camera-bubble-black-circle.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-22-screen-recordings-respect-the-microphone-toggle.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-22-the-recordings-library-no-longer-fails-right-after-server-start.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-23-the-agent-can-see-your-library-right-after-server-start.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +1 -2
- package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +39 -7
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +21 -25
- package/corpus/templates/clips/desktop/src/app.tsx +53 -24
- package/corpus/templates/clips/desktop/src/lib/bubble-playback.ts +68 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +3 -0
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +72 -14
- package/corpus/templates/clips/desktop/src/lib/updater.ts +8 -3
- package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +162 -20
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +43 -6
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +150 -13
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +28 -3
- package/corpus/templates/clips/server/lib/emails.ts +17 -33
- package/corpus/templates/content/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +140 -15
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +12 -14
- package/corpus/templates/content/app/components/ui/pointer-lock.ts +1 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +18 -2
- package/corpus/templates/content/app/hooks/use-local-storage.ts +38 -22
- package/corpus/templates/content/app/i18n-data.ts +25 -0
- package/corpus/templates/content/app/routes.ts +3 -1
- package/corpus/templates/content/changelog/2026-08-22-code-blocks-inserted-from-the-slash-menu-no-longer-get-stuck.md +6 -0
- package/corpus/templates/content/changelog/2026-08-22-the-sidebar-page-tree-no-longer-flashes-empty-after-creating-a-page.md +6 -0
- package/corpus/templates/content/docs/solutions/2026-08-21-content-mermaid-rendering-shape.md +233 -0
- package/corpus/templates/content/server/plugins/agent-chat.ts +9 -2
- package/corpus/templates/content/vitest.config.ts +7 -1
- package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/design/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +1383 -88
- package/corpus/templates/design/actions/generate-design.ts +98 -47
- package/corpus/templates/design/actions/get-design-system.ts +6 -1
- package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +146 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +70 -26
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +284 -136
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2057 -141
- package/corpus/templates/design/app/components/design/editor/DesignBottomToolbar.tsx +6 -2
- package/corpus/templates/design/app/components/design/editor/DesignWorkspaceRail.tsx +4 -4
- package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +10 -1
- package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +19 -2
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -2
- package/corpus/templates/design/app/components/layout/Header.tsx +15 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +7 -2
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +11 -4
- package/corpus/templates/design/app/i18n-data.ts +1 -0
- package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +12 -0
- package/corpus/templates/design/app/lib/design-system-data.ts +68 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +77 -35
- package/corpus/templates/design/app/pages/DesignSystems.tsx +136 -42
- package/corpus/templates/design/app/pages/Index.tsx +2 -0
- package/corpus/templates/design/app/pages/Templates.tsx +0 -10
- package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +10 -0
- package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +50 -0
- package/corpus/templates/design/app/pages/design-editor/commands/apply-design-editor-command.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +10 -8
- package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -6
- package/corpus/templates/design/app/pages/design-editor/commands/apply-pending-visual-styles-with-agent.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +18 -7
- package/corpus/templates/design/app/pages/design-editor/commands/escape-hotkey.ts +4 -90
- package/corpus/templates/design/app/pages/design-editor/commands/layer-marquee-selection-change.ts +2 -1
- package/corpus/templates/design/app/pages/design-editor/commands/layer-selection-change.ts +4 -3
- package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +12 -2
- package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-style-change.ts +9 -2
- package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-move-semantic-handoff.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-semantic-handoff.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-state-semantic-handoff.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/start-sidebar-resize.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/editor-state.ts +11 -1
- package/corpus/templates/design/app/pages/design-editor/effects/adopt-db-file-content.ts +11 -19
- package/corpus/templates/design/app/pages/design-editor/effects/observe-collab-text.ts +6 -6
- package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/effects/seed-collab-content.ts +12 -15
- package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -59
- package/corpus/templates/design/app/pages/design-editor/tool-state.ts +8 -0
- package/corpus/templates/design/app/pages/design-editor/types.ts +3 -3
- package/corpus/templates/design/app/routes.ts +3 -1
- package/corpus/templates/design/changelog/2026-08-20-canvas-edits-patch-the-frame-instead-of-rebuilding-it.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-draw-mode-needs-shift-y.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-eyedropper-shortcut.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-figma-style-alignment-guides-and-snapping.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-group-transforms-keep-the-selection.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-inspector-fields-keep-focus-on-enter.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-pen-alt-keeps-the-incoming-handle.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-pen-on-the-board-creates-one-vector.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-scale-a-multi-selection-from-the-group-handles.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-scale-resizes-text-with-the-object.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-selecting-another-object-keeps-the-scale-tool-armed.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-the-shape-tool-remembers-the-shape-you-picked.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-vectors-drawn-in-a-frame-land-where-you-drew-them.md +6 -0
- package/corpus/templates/design/changelog/2026-08-22-multi-screen-generation-no-longer-loses-a-saved-screens-layo.md +6 -0
- package/corpus/templates/design/changelog/2026-08-22-rename-and-search-fields-are-labeled-for-screen-readers.md +6 -0
- package/corpus/templates/design/package.json +2 -0
- package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +311 -0
- package/corpus/templates/design/shared/canvas-math.ts +612 -206
- package/corpus/templates/design/shared/pen-path.ts +37 -0
- package/corpus/templates/design/vitest.config.ts +7 -1
- package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/dispatch/actions/list-workspace-connections.ts +34 -3
- package/corpus/templates/dispatch/app/routes/integrations.tsx +55 -21
- package/corpus/templates/dispatch/app/routes.ts +3 -1
- package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/factory/.env.example +2 -7
- package/corpus/templates/factory/AGENTS.md +3 -0
- package/corpus/templates/factory/README.md +5 -3
- package/corpus/templates/factory/actions/create-factory.ts +16 -3
- package/corpus/templates/factory/actions/get-slack-feedback-context.ts +2 -0
- package/corpus/templates/factory/actions/get-triage-item.ts +2 -0
- package/corpus/templates/factory/actions/list-factory-audit.ts +116 -36
- package/corpus/templates/factory/actions/list-factory-automations.ts +2 -1
- package/corpus/templates/factory/actions/list-triage-items.ts +22 -19
- package/corpus/templates/factory/actions/run-factory-automation.ts +7 -3
- package/corpus/templates/factory/actions/save-factory-automation.ts +5 -2
- package/corpus/templates/factory/actions/save-triage-config.ts +2 -8
- package/corpus/templates/factory/actions/start-builder-for-item.ts +21 -0
- package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +229 -297
- package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +397 -247
- package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +33 -0
- package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +202 -162
- package/corpus/templates/factory/app/i18n/en-US.ts +32 -4
- package/corpus/templates/factory/app/routes/factory.tsx +84 -11
- package/corpus/templates/factory/app/routes.ts +3 -1
- package/corpus/templates/factory/changelog/2026-08-21-activity-runs-use-automation-display-names.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-create-and-settings-source-cards.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-keep-automations-visible-while-running.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-nested-factory-automations-can-poll.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-settings-sticky-unsaved-bar.md +6 -0
- package/corpus/templates/factory/server/connectors/credentials.ts +10 -5
- package/corpus/templates/factory/server/lib/factory-audit-report.ts +412 -0
- package/corpus/templates/factory/server/lib/factory-config-reconcile.ts +321 -0
- package/corpus/templates/factory/server/lib/factory-scope.ts +25 -2
- package/corpus/templates/factory/server/lib/require-factory-automation.ts +13 -4
- package/corpus/templates/factory/server/plugins/factory-migrations.ts +148 -4
- package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +4 -6
- package/corpus/templates/factory/vitest.config.ts +17 -2
- package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/forms/app/routes/_app.settings.tsx +4 -1
- package/corpus/templates/forms/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
- package/corpus/templates/forms/server/lib/public-form-ssr.ts +11 -1
- package/corpus/templates/forms/vitest.config.ts +1 -0
- package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/macros/app/routes.ts +3 -1
- package/corpus/templates/macros/vitest.config.ts +6 -1
- package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/mail/actions/manage-gmail-filters.ts +10 -2
- package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +100 -37
- package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +14 -2
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +66 -36
- package/corpus/templates/mail/app/hooks/use-google-auth.ts +2 -0
- package/corpus/templates/mail/app/lib/google-oauth-setup.ts +17 -0
- package/corpus/templates/mail/app/pages/InboxPage.tsx +69 -9
- package/corpus/templates/mail/app/routes/$.tsx +9 -0
- package/corpus/templates/mail/app/routes/$view.$threadId.tsx +23 -1
- package/corpus/templates/mail/app/routes/$view.tsx +47 -1
- package/corpus/templates/mail/app/routes.ts +3 -1
- package/corpus/templates/mail/changelog/2026-08-22-gmail-can-now-connect-with-the-shared-google-oauth.md +6 -0
- package/corpus/templates/mail/changelog/2026-08-22-gmail-filters-now-shows-the-real-error.md +6 -0
- package/corpus/templates/mail/changelog/2026-08-22-unknown-mail-urls-now-show-the-404-page.md +6 -0
- package/corpus/templates/mail/server/handlers/google-auth.ts +11 -2
- package/corpus/templates/mail/server/lib/google-auth.ts +92 -12
- package/corpus/templates/mail/server/onboarding.ts +66 -18
- package/corpus/templates/mail/vitest.config.ts +6 -1
- package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/plan/app/routes/settings.tsx +4 -1
- package/corpus/templates/plan/app/routes.ts +3 -1
- package/corpus/templates/plan/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
- package/corpus/templates/plan/netlify.toml +1 -1
- package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/slides/actions/patch-deck.ts +79 -10
- package/corpus/templates/slides/actions/update-slide.ts +11 -1
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +14 -4
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -52
- package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +8 -53
- package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +9 -75
- package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +8 -60
- package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +10 -2
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -7
- package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +49 -36
- package/corpus/templates/slides/app/routes/access-request.approve.tsx +16 -9
- package/corpus/templates/slides/app/routes.ts +3 -1
- package/corpus/templates/slides/changelog/2026-08-22-already-uploaded-chat-images-are-no-longer-dropped.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-22-google-drive-and-slides-can-now-connect-with-the-shared-google-oauth.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-22-multi-slide-repairs-now-report-slides-that-still-overflow.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-22-update-slide-now-reports-which-batched-edit-was-skipped.md +6 -0
- package/corpus/templates/slides/server/handlers/google-docs-auth.ts +52 -1
- package/corpus/templates/slides/server/lib/chat-attachments.ts +29 -3
- package/corpus/templates/slides/server/lib/google-docs-oauth.ts +66 -16
- package/corpus/templates/slides/server/lib/slide-content-patch.ts +13 -2
- package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -2
- package/corpus/templates/slides/tsconfig.json +5 -0
- package/corpus/templates/slides/vitest.config.ts +6 -1
- package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/tasks/app/routes/settings.tsx +4 -1
- package/corpus/templates/tasks/app/routes.ts +3 -1
- package/corpus/templates/tasks/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
- package/corpus/templates/tasks/vitest.config.ts +7 -1
- package/dist/action.d.ts +91 -0
- package/dist/action.js +50 -0
- package/dist/agent/abort-reasons.d.ts +38 -0
- package/dist/agent/abort-reasons.js +49 -0
- package/dist/agent/engine/ai-sdk-engine.js +8 -5
- package/dist/agent/engine/anthropic-engine.js +7 -5
- package/dist/agent/engine/first-event-timeout.d.ts +42 -17
- package/dist/agent/engine/first-event-timeout.js +67 -25
- package/dist/agent/production-agent.d.ts +23 -0
- package/dist/agent/production-agent.js +107 -102
- package/dist/agent/run-loop-with-resume.d.ts +2 -28
- package/dist/agent/run-loop-with-resume.js +25 -40
- package/dist/agent/run-manager.js +5 -4
- package/dist/agent/run-store.d.ts +55 -0
- package/dist/agent/run-store.js +124 -1
- package/dist/agent/tool-search.js +2 -1
- package/dist/agent/types.d.ts +9 -4
- package/dist/app-config/configuration-error.d.ts +11 -0
- package/dist/app-config/configuration-error.js +14 -0
- package/dist/app-config/index.d.ts +1 -0
- package/dist/app-config/index.js +1 -0
- package/dist/app-config/integrations.d.ts +1 -0
- package/dist/app-config/integrations.js +10 -0
- package/dist/app-config/plugins.d.ts +34 -0
- package/dist/app-config/plugins.js +39 -0
- package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
- package/dist/app-config/run-lifecycle-invariants.js +18 -25
- package/dist/app-config/schema.d.ts +16 -0
- package/dist/app-config/schema.js +2 -0
- package/dist/chat-threads/schema-migrations.js +20 -0
- package/dist/chat-threads/store.js +21 -4
- package/dist/cli/native-dependencies.d.ts +4 -0
- package/dist/cli/native-dependencies.js +15 -0
- package/dist/client/EnvironmentBadge.d.ts +1 -1
- package/dist/client/EnvironmentBadge.js +40 -5
- package/dist/client/MultiTabAssistantChat.d.ts +1 -1
- package/dist/client/MultiTabAssistantChat.js +35 -14
- package/dist/client/agent-chat/index.d.ts +1 -1
- package/dist/client/agent-chat/index.js +1 -1
- package/dist/client/agent-page/use-jobs.d.ts +2 -1
- package/dist/client/agent-page/use-jobs.js +3 -5
- package/dist/client/agent-sidebar-state.js +3 -1
- package/dist/client/blocks/library/code-tabs.js +5 -0
- package/dist/client/blocks/library/code.js +1 -0
- package/dist/client/chat-first/apps-rail.js +2 -2
- package/dist/client/chat-model-groups.d.ts +12 -0
- package/dist/client/chat-model-groups.js +3 -2
- package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
- package/dist/client/integrations/GoogleProductLogo.js +45 -0
- package/dist/client/integrations/index.d.ts +2 -0
- package/dist/client/integrations/index.js +2 -0
- package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
- package/dist/client/integrations/workspace-provider-oauth.js +13 -0
- package/dist/client/resources/mcp-integration-catalog.js +0 -29
- package/dist/client/settings/SettingsTabsPage.js +10 -6
- package/dist/client/sharing/ShareButton.js +11 -2
- package/dist/client/use-chat-models.d.ts +6 -0
- package/dist/client/use-chat-models.js +10 -0
- package/dist/client/use-db-sync.js +27 -9
- package/dist/connections/catalog.d.ts +111 -9
- package/dist/connections/catalog.js +86 -30
- package/dist/db/create-get-db.js +18 -0
- package/dist/db/ddl-guard.d.ts +0 -4
- package/dist/db/ddl-guard.js +46 -0
- package/dist/deploy/build.d.ts +19 -0
- package/dist/deploy/build.js +190 -16
- package/dist/deploy/function-bundle.d.ts +45 -0
- package/dist/deploy/function-bundle.js +337 -0
- package/dist/deploy/workspace-deploy.js +19 -1
- package/dist/eject/workspace-connections.js +4 -0
- package/dist/email-catalog/registry.d.ts +4 -0
- package/dist/email-catalog/registry.js +79 -14
- package/dist/extensions/content-patch.js +14 -2
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/integrations/plugin.d.ts +10 -0
- package/dist/integrations/plugin.js +40 -6
- package/dist/jobs/actions/run-automation-now.d.ts +2 -1
- package/dist/jobs/actions/run-automation-now.js +11 -5
- package/dist/jobs/frontmatter.js +53 -2
- package/dist/jobs/run-now.d.ts +11 -1
- package/dist/jobs/run-now.js +42 -7
- package/dist/jobs/scheduler.d.ts +1 -0
- package/dist/jobs/scheduler.js +2 -1
- package/dist/localization/core-messages/ar-SA.js +3 -0
- package/dist/localization/core-messages/de-DE.js +3 -0
- package/dist/localization/core-messages/en-US.d.ts +3 -0
- package/dist/localization/core-messages/en-US.js +3 -0
- package/dist/localization/core-messages/es-ES.js +3 -0
- package/dist/localization/core-messages/fr-FR.js +3 -0
- package/dist/localization/core-messages/hi-IN.js +3 -0
- package/dist/localization/core-messages/ja-JP.js +3 -0
- package/dist/localization/core-messages/ko-KR.js +3 -0
- package/dist/localization/core-messages/pt-BR.js +3 -0
- package/dist/localization/core-messages/zh-CN.js +3 -0
- package/dist/localization/core-messages/zh-TW.js +3 -0
- package/dist/localization/core-messages.d.ts +3 -0
- package/dist/localization/default-messages.d.ts +2 -5
- package/dist/localization/default-messages.js +2 -5
- package/dist/mcp/build-server.d.ts +9 -0
- package/dist/mcp/build-server.js +37 -8
- package/dist/mcp-client/oauth-client.d.ts +7 -0
- package/dist/mcp-client/oauth-client.js +12 -1
- package/dist/oauth-tokens/index.d.ts +1 -1
- package/dist/oauth-tokens/index.js +1 -1
- package/dist/oauth-tokens/lifecycle.d.ts +11 -0
- package/dist/oauth-tokens/lifecycle.js +17 -0
- package/dist/oauth-tokens/store.js +7 -0
- package/dist/observability/posthog-ai.d.ts +15 -1
- package/dist/observability/posthog-ai.js +24 -12
- package/dist/observability/routes.d.ts +3 -3
- package/dist/observability/traces.js +158 -28
- package/dist/onboarding/app-profile.js +2 -2
- package/dist/onboarding/plugin.js +10 -2
- package/dist/onboarding/types.d.ts +2 -0
- package/dist/provider-api/actions/custom-provider-registration.d.ts +1 -1
- package/dist/provider-api/actions/provider-api.d.ts +2 -2
- package/dist/provider-api/index.js +2 -0
- package/dist/resources/store.js +13 -4
- package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
- package/dist/secrets/register-framework-secrets.js +1 -1
- package/dist/server/action-discovery.js +5 -0
- package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
- package/dist/server/agent-chat/action-filters-a2a.js +48 -9
- package/dist/server/agent-chat-plugin.js +36 -9
- package/dist/server/agent-discovery.js +43 -20
- package/dist/server/auth.js +18 -16
- package/dist/server/beta-opt-out-html.js +45 -4
- package/dist/server/better-auth-instance.d.ts +2 -1
- package/dist/server/better-auth-instance.js +23 -7
- package/dist/server/builder-design-systems.d.ts +4 -1
- package/dist/server/builder-design-systems.js +87 -6
- package/dist/server/builder-oauth.d.ts +1 -7
- package/dist/server/builder-oauth.js +80 -163
- package/dist/server/core-routes-plugin.d.ts +29 -0
- package/dist/server/core-routes-plugin.js +100 -20
- package/dist/server/default-plugins.d.ts +18 -0
- package/dist/server/default-plugins.js +22 -0
- package/dist/server/edge.d.ts +1 -0
- package/dist/server/edge.js +1 -0
- package/dist/server/framework-request-handler.js +31 -3
- package/dist/server/google-oauth.d.ts +3 -0
- package/dist/server/google-oauth.js +3 -0
- package/dist/server/index.d.ts +4 -4
- package/dist/server/index.js +3 -3
- package/dist/server/onboarding-html.js +37 -3
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +6 -1
- package/dist/server/workspace-provider-oauth.js +72 -20
- package/dist/shared/agent-sidebar-url.d.ts +1 -0
- package/dist/shared/agent-sidebar-url.js +1 -0
- package/dist/shared/environment-lanes.d.ts +2 -0
- package/dist/shared/environment-lanes.js +3 -1
- package/dist/shared/index.d.ts +3 -1
- package/dist/shared/index.js +3 -1
- package/dist/shared/surface-visibility.d.ts +31 -0
- package/dist/shared/surface-visibility.js +57 -0
- package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/templates/chat/app/routes.ts +3 -1
- package/dist/templates/chat/vitest.config.ts +8 -0
- package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/templates/default/app/routes.ts +3 -1
- package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/tracking/registry.d.ts +11 -0
- package/dist/tracking/registry.js +5 -2
- package/dist/triggers/actions.js +10 -3
- package/dist/usage/store.js +23 -3
- package/dist/user-profile/actions/get-auth-methods.js +18 -5
- package/dist/vite/client.js +24 -5
- package/docs/content/actions-access-control.mdx +43 -4
- package/docs/content/actions-defining.mdx +16 -0
- package/docs/content/template-clips-capture-everywhere.mdx +29 -30
- package/docs/content/template-clips-developers.mdx +4 -4
- package/docs/content/template-clips.mdx +3 -1
- package/package.json +2 -2
- package/src/eject/workspace-connections.ts +4 -0
- package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
- package/src/templates/chat/app/routes.ts +3 -1
- package/src/templates/chat/vitest.config.ts +8 -0
- package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
- package/src/templates/default/app/routes.ts +3 -1
- package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
|
@@ -42,6 +42,7 @@ export function DesignBottomToolbar({
|
|
|
42
42
|
pinMode,
|
|
43
43
|
drawMode,
|
|
44
44
|
activeTool,
|
|
45
|
+
shapeTool,
|
|
45
46
|
isOverview,
|
|
46
47
|
hasActiveFile,
|
|
47
48
|
onMove,
|
|
@@ -62,6 +63,9 @@ export function DesignBottomToolbar({
|
|
|
62
63
|
pinMode: boolean;
|
|
63
64
|
drawMode: boolean;
|
|
64
65
|
activeTool: DesignTool;
|
|
66
|
+
/** The shape the group button draws when pressed directly: the last one
|
|
67
|
+
* picked, since activeTool has already fallen back to move after a draw. */
|
|
68
|
+
shapeTool: ShapeTool;
|
|
65
69
|
isOverview: boolean;
|
|
66
70
|
hasActiveFile: boolean;
|
|
67
71
|
onMove: () => void;
|
|
@@ -89,7 +93,7 @@ export function DesignBottomToolbar({
|
|
|
89
93
|
]);
|
|
90
94
|
const activeShape = shapeTools.has(activeTool)
|
|
91
95
|
? (activeTool as ShapeTool)
|
|
92
|
-
:
|
|
96
|
+
: shapeTool;
|
|
93
97
|
const shapeIcon = (tool: ShapeTool, className: string) => {
|
|
94
98
|
switch (tool) {
|
|
95
99
|
case "line":
|
|
@@ -298,7 +302,7 @@ export function DesignBottomToolbar({
|
|
|
298
302
|
key: "draw",
|
|
299
303
|
label: t("designEditor.modes.draw"),
|
|
300
304
|
icon: <IconBrush className="size-4" />,
|
|
301
|
-
shortcut: "Y",
|
|
305
|
+
shortcut: "⇧Y",
|
|
302
306
|
active: activeTool === "draw" && mode === "annotate" && drawMode,
|
|
303
307
|
disabled: !hasActiveFile,
|
|
304
308
|
onSelect: onDraw,
|
|
@@ -39,14 +39,14 @@ export function DesignWorkspaceRail({
|
|
|
39
39
|
onMotionToggle,
|
|
40
40
|
onPanelChange,
|
|
41
41
|
}: {
|
|
42
|
-
activePanel: DesignLeftPanel;
|
|
42
|
+
activePanel: DesignLeftPanel | null;
|
|
43
43
|
disabledPanels?: ReadonlySet<DesignLeftPanel>;
|
|
44
44
|
hiddenPanels?: ReadonlySet<DesignLeftPanel>;
|
|
45
45
|
motionOpen?: boolean;
|
|
46
46
|
motionDisabled?: boolean;
|
|
47
47
|
projectMenu: ReactNode;
|
|
48
48
|
onMotionToggle?: () => void;
|
|
49
|
-
onPanelChange: (panel: DesignLeftPanel) => void;
|
|
49
|
+
onPanelChange: (panel: DesignLeftPanel | null) => void;
|
|
50
50
|
}) {
|
|
51
51
|
const t = useT();
|
|
52
52
|
const items: Array<{
|
|
@@ -137,7 +137,7 @@ export function DesignWorkspaceRail({
|
|
|
137
137
|
event.preventDefault();
|
|
138
138
|
return;
|
|
139
139
|
}
|
|
140
|
-
onPanelChange(item.panel);
|
|
140
|
+
onPanelChange(active ? null : item.panel);
|
|
141
141
|
}}
|
|
142
142
|
onPointerEnter={() => {
|
|
143
143
|
if (item.panel === "code") preloadCodeWorkbench();
|
|
@@ -175,7 +175,7 @@ export function DesignWorkspaceRail({
|
|
|
175
175
|
);
|
|
176
176
|
})}
|
|
177
177
|
</div>
|
|
178
|
-
{onMotionToggle ? (
|
|
178
|
+
{onMotionToggle && SHOW_DESIGN_SECONDARY_LEFT_PANELS ? (
|
|
179
179
|
<div className="mt-4 flex w-full flex-col items-center border-t border-border/70 pt-3">
|
|
180
180
|
<Tooltip>
|
|
181
181
|
<TooltipTrigger asChild>
|
|
@@ -125,7 +125,7 @@ export const DESIGN_SHORTCUTS: readonly DesignShortcutDefinition[] = [
|
|
|
125
125
|
shortcut({
|
|
126
126
|
id: "draw-tool",
|
|
127
127
|
category: "tools",
|
|
128
|
-
bindings: ["y"],
|
|
128
|
+
bindings: ["shift+y"],
|
|
129
129
|
labelKey: "designEditor.keyboardShortcuts.commands.drawTool",
|
|
130
130
|
handler: "onDrawTool",
|
|
131
131
|
}),
|
|
@@ -415,6 +415,15 @@ export const DESIGN_SHORTCUTS: readonly DesignShortcutDefinition[] = [
|
|
|
415
415
|
labelKey: "designEditor.keyboardShortcuts.commands.swapFillStroke",
|
|
416
416
|
handler: "onSwapFillStroke",
|
|
417
417
|
}),
|
|
418
|
+
shortcut({
|
|
419
|
+
id: "eyedropper",
|
|
420
|
+
category: "edit",
|
|
421
|
+
// Apple platforms also accept literal ctrl+c; only the cross-platform
|
|
422
|
+
// binding is advertised so the row reads the same everywhere.
|
|
423
|
+
bindings: ["i"],
|
|
424
|
+
labelKey: "designEditor.keyboardShortcuts.commands.eyedropper",
|
|
425
|
+
handler: "onEyedropper",
|
|
426
|
+
}),
|
|
418
427
|
|
|
419
428
|
shortcut({
|
|
420
429
|
id: "bring-forward",
|
|
@@ -2,6 +2,7 @@ import type {
|
|
|
2
2
|
DistanceGuideBand,
|
|
3
3
|
EqualGapGuide,
|
|
4
4
|
FrameBounds,
|
|
5
|
+
ProximityMeasurement,
|
|
5
6
|
} from "@shared/canvas-math";
|
|
6
7
|
|
|
7
8
|
import type {
|
|
@@ -54,8 +55,10 @@ export function equalGapGuidesEqual(a: EqualGapGuide[], b: EqualGapGuide[]) {
|
|
|
54
55
|
if (
|
|
55
56
|
x.orientation !== y.orientation ||
|
|
56
57
|
x.gap !== y.gap ||
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
x.bands.length !== y.bands.length ||
|
|
59
|
+
x.bands.some(
|
|
60
|
+
(band, index) => !distanceGuideBandEqual(band, y.bands[index]),
|
|
61
|
+
)
|
|
59
62
|
) {
|
|
60
63
|
return false;
|
|
61
64
|
}
|
|
@@ -63,6 +66,20 @@ export function equalGapGuidesEqual(a: EqualGapGuide[], b: EqualGapGuide[]) {
|
|
|
63
66
|
return true;
|
|
64
67
|
}
|
|
65
68
|
|
|
69
|
+
export function proximityMeasurementsEqual(
|
|
70
|
+
a: ProximityMeasurement[],
|
|
71
|
+
b: ProximityMeasurement[],
|
|
72
|
+
) {
|
|
73
|
+
if (a === b) return true;
|
|
74
|
+
if (a.length !== b.length) return false;
|
|
75
|
+
return a.every(
|
|
76
|
+
(measurement, index) =>
|
|
77
|
+
measurement.orientation === b[index].orientation &&
|
|
78
|
+
measurement.gap === b[index].gap &&
|
|
79
|
+
distanceGuideBandEqual(measurement.band, b[index].band),
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
66
83
|
export function altHoverMeasurementLineEqual(
|
|
67
84
|
a: AltHoverMeasurementLine | null,
|
|
68
85
|
b: AltHoverMeasurementLine | null,
|
|
@@ -3,7 +3,7 @@ import type {
|
|
|
3
3
|
EqualGapGuide,
|
|
4
4
|
FrameBounds,
|
|
5
5
|
} from "@shared/canvas-math";
|
|
6
|
-
import type { PenPath } from "@shared/pen-path";
|
|
6
|
+
import type { PenCuspLatch, PenPath } from "@shared/pen-path";
|
|
7
7
|
import type { ReactNode } from "react";
|
|
8
8
|
|
|
9
9
|
import type {
|
|
@@ -344,7 +344,10 @@ export interface MultiScreenCanvasProps {
|
|
|
344
344
|
*
|
|
345
345
|
* Replaces the legacy onCreateBoardObject.
|
|
346
346
|
*/
|
|
347
|
-
onBoardDrawPrimitive?: (
|
|
347
|
+
onBoardDrawPrimitive?: (
|
|
348
|
+
primitive: CanvasPrimitiveInsert,
|
|
349
|
+
options?: { nextTool?: "move" | "pen" },
|
|
350
|
+
) => boolean | string;
|
|
348
351
|
// ── Board edit callbacks (active-target model) ───────────────────────────
|
|
349
352
|
/**
|
|
350
353
|
* When true the board <DesignCanvas> is in edit mode.
|
|
@@ -799,6 +802,7 @@ export interface PenNodeDragState {
|
|
|
799
802
|
* being an instant, undraggable straight-line close.
|
|
800
803
|
*/
|
|
801
804
|
closing?: boolean;
|
|
805
|
+
cuspLatch: PenCuspLatch;
|
|
802
806
|
}
|
|
803
807
|
|
|
804
808
|
/** Dragging an anchor square of a `vectorEdit` overlay path (P-VE1). Anchor
|
|
@@ -825,6 +829,9 @@ export interface VectorEditHandleDragState {
|
|
|
825
829
|
which: "in" | "out";
|
|
826
830
|
pathBefore: PenPath;
|
|
827
831
|
hasMoved: boolean;
|
|
832
|
+
/** Alt is a one-way latch for the drag: releasing it must not re-mirror the
|
|
833
|
+
* pair the user just broke. */
|
|
834
|
+
symmetryBroken: boolean;
|
|
828
835
|
}
|
|
829
836
|
|
|
830
837
|
export interface DraftCreationPreview {
|
|
@@ -94,3 +94,18 @@ export function Header() {
|
|
|
94
94
|
</header>
|
|
95
95
|
);
|
|
96
96
|
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Mobile counterpart of the header actions slot: <Header> is `md:flex`, so
|
|
100
|
+
* without this every control a page publishes through `useSetHeaderActions`
|
|
101
|
+
* is unmounted below the `md` breakpoint.
|
|
102
|
+
*/
|
|
103
|
+
export function MobileHeaderActions() {
|
|
104
|
+
const actions = useHeaderActions();
|
|
105
|
+
if (!actions) return null;
|
|
106
|
+
return (
|
|
107
|
+
<div className="flex h-12 shrink-0 items-center gap-2 overflow-x-auto border-b border-border bg-background px-4 md:hidden">
|
|
108
|
+
{actions}
|
|
109
|
+
</div>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
FigmaLinkComposerBubble,
|
|
32
32
|
useDetectedFigmaComposerLink,
|
|
33
33
|
} from "../editor/FigmaLinkComposerBubble";
|
|
34
|
-
import { Header } from "./Header";
|
|
34
|
+
import { Header, MobileHeaderActions } from "./Header";
|
|
35
35
|
import { Sidebar } from "./Sidebar";
|
|
36
36
|
|
|
37
37
|
interface LayoutProps {
|
|
@@ -236,7 +236,12 @@ export function Layout({ children }: LayoutProps) {
|
|
|
236
236
|
</span>
|
|
237
237
|
</div>
|
|
238
238
|
)}
|
|
239
|
-
{!hideHeader &&
|
|
239
|
+
{!hideHeader && (
|
|
240
|
+
<>
|
|
241
|
+
<MobileHeaderActions />
|
|
242
|
+
<Header />
|
|
243
|
+
</>
|
|
244
|
+
)}
|
|
240
245
|
<main
|
|
241
246
|
className={cn(
|
|
242
247
|
"agent-native-app-main flex-1",
|
|
@@ -179,9 +179,9 @@ export interface UseDesignHotkeysProps {
|
|
|
179
179
|
* internal canvas clipboard's contents. */
|
|
180
180
|
onPasteToReplace?: DesignHotkeyHandler;
|
|
181
181
|
/**
|
|
182
|
-
* Figma's Control+C on Apple platforms — eyedropper: sample
|
|
183
|
-
* anywhere on screen and apply it to the current selection. A
|
|
184
|
-
* action, not a persistent tool.
|
|
182
|
+
* Figma's I (and literal Control+C on Apple platforms) — eyedropper: sample
|
|
183
|
+
* a color from anywhere on screen and apply it to the current selection. A
|
|
184
|
+
* one-shot action, not a persistent tool.
|
|
185
185
|
*/
|
|
186
186
|
onEyedropper?: DesignHotkeyHandler;
|
|
187
187
|
/**
|
|
@@ -228,7 +228,6 @@ const TOOL_SHORTCUTS: Record<
|
|
|
228
228
|
h: { tool: "hand", handler: "onHandTool" },
|
|
229
229
|
k: { tool: "scale", handler: "onScaleTool" },
|
|
230
230
|
c: { tool: "comment", handler: "onCommentTool" },
|
|
231
|
-
y: { tool: "draw", handler: "onDrawTool" },
|
|
232
231
|
};
|
|
233
232
|
|
|
234
233
|
// H1: shift+key variants of a base tool shortcut (Figma muscle-memory), e.g.
|
|
@@ -240,6 +239,9 @@ const SHIFT_TOOL_SHORTCUTS: Record<
|
|
|
240
239
|
{ tool: DesignHotkeyTool; handler: keyof UseDesignHotkeysProps }
|
|
241
240
|
> = {
|
|
242
241
|
l: { tool: "arrow", handler: "onArrowTool" },
|
|
242
|
+
// Draw switches the whole editor into annotate mode, so it takes a
|
|
243
|
+
// modifier: a bare letter flips modes by accident.
|
|
244
|
+
y: { tool: "draw", handler: "onDrawTool" },
|
|
243
245
|
};
|
|
244
246
|
|
|
245
247
|
export function isDesignHotkeyEditableTarget(target: EventTarget | null) {
|
|
@@ -554,6 +556,11 @@ export function handleDesignHotkey(
|
|
|
554
556
|
if (key === "v") return runDistribute("vertical");
|
|
555
557
|
}
|
|
556
558
|
|
|
559
|
+
// Figma's I — the Control+C binding below is macOS-only.
|
|
560
|
+
if (!primary && !event.altKey && !event.shiftKey && key === "i") {
|
|
561
|
+
return run(props.onEyedropper);
|
|
562
|
+
}
|
|
563
|
+
|
|
557
564
|
// On macOS Figma reserves literal Control+C for Pick color while Cmd+C
|
|
558
565
|
// remains Copy. Keep Ctrl+C as Copy on non-Apple platforms, where Ctrl is
|
|
559
566
|
// the platform's primary modifier and Figma presents platform-specific
|
|
@@ -809,6 +809,7 @@ const enUS = {
|
|
|
809
809
|
penTool: "Pen tool",
|
|
810
810
|
handTool: "Hand tool",
|
|
811
811
|
scaleTool: "Scale tool",
|
|
812
|
+
eyedropper: "Eyedropper", // i18n-copy-ignore every keyboardShortcuts.commands.* translation lives in i18n-keyboard-shortcuts.ts
|
|
812
813
|
commentTool: "Comment tool",
|
|
813
814
|
drawTool: "Draw tool",
|
|
814
815
|
showLayers: "Show layers",
|
|
@@ -3,6 +3,7 @@ import { type LocaleCode } from "@agent-native/core/client/i18n";
|
|
|
3
3
|
interface KeyboardShortcutLabels {
|
|
4
4
|
title: string;
|
|
5
5
|
essential: string;
|
|
6
|
+
eyedropper: string;
|
|
6
7
|
shape: string;
|
|
7
8
|
selection: string;
|
|
8
9
|
cursor: string;
|
|
@@ -44,6 +45,7 @@ interface KeyboardKeyLabels {
|
|
|
44
45
|
export const keyboardShortcutLabels = {
|
|
45
46
|
"zh-TW": {
|
|
46
47
|
title: "鍵盤快速鍵",
|
|
48
|
+
eyedropper: "取色器",
|
|
47
49
|
essential: "基本",
|
|
48
50
|
shape: "形狀",
|
|
49
51
|
selection: "選取",
|
|
@@ -62,6 +64,7 @@ export const keyboardShortcutLabels = {
|
|
|
62
64
|
},
|
|
63
65
|
"zh-CN": {
|
|
64
66
|
title: "键盘快捷键",
|
|
67
|
+
eyedropper: "取色器",
|
|
65
68
|
essential: "基本",
|
|
66
69
|
shape: "形状",
|
|
67
70
|
selection: "选择",
|
|
@@ -80,6 +83,7 @@ export const keyboardShortcutLabels = {
|
|
|
80
83
|
},
|
|
81
84
|
"es-ES": {
|
|
82
85
|
title: "Atajos de teclado",
|
|
86
|
+
eyedropper: "Cuentagotas",
|
|
83
87
|
essential: "Esenciales",
|
|
84
88
|
shape: "Formas",
|
|
85
89
|
selection: "Selección",
|
|
@@ -99,6 +103,7 @@ export const keyboardShortcutLabels = {
|
|
|
99
103
|
},
|
|
100
104
|
"fr-FR": {
|
|
101
105
|
title: "Raccourcis clavier",
|
|
106
|
+
eyedropper: "Pipette",
|
|
102
107
|
essential: "Essentiels",
|
|
103
108
|
shape: "Formes",
|
|
104
109
|
selection: "Sélection",
|
|
@@ -119,6 +124,7 @@ export const keyboardShortcutLabels = {
|
|
|
119
124
|
},
|
|
120
125
|
"de-DE": {
|
|
121
126
|
title: "Tastenkürzel",
|
|
127
|
+
eyedropper: "Pipette",
|
|
122
128
|
essential: "Grundlagen",
|
|
123
129
|
shape: "Formen",
|
|
124
130
|
selection: "Auswahl",
|
|
@@ -139,6 +145,7 @@ export const keyboardShortcutLabels = {
|
|
|
139
145
|
},
|
|
140
146
|
"ja-JP": {
|
|
141
147
|
title: "キーボードショートカット",
|
|
148
|
+
eyedropper: "スポイトツール",
|
|
142
149
|
essential: "基本",
|
|
143
150
|
shape: "シェイプ",
|
|
144
151
|
selection: "選択",
|
|
@@ -157,6 +164,7 @@ export const keyboardShortcutLabels = {
|
|
|
157
164
|
},
|
|
158
165
|
"ko-KR": {
|
|
159
166
|
title: "키보드 단축키",
|
|
167
|
+
eyedropper: "스포이드",
|
|
160
168
|
essential: "필수",
|
|
161
169
|
shape: "도형",
|
|
162
170
|
selection: "선택",
|
|
@@ -175,6 +183,7 @@ export const keyboardShortcutLabels = {
|
|
|
175
183
|
},
|
|
176
184
|
"pt-BR": {
|
|
177
185
|
title: "Atalhos de teclado",
|
|
186
|
+
eyedropper: "Conta-gotas",
|
|
178
187
|
essential: "Essenciais",
|
|
179
188
|
shape: "Formas",
|
|
180
189
|
selection: "Seleção",
|
|
@@ -195,6 +204,7 @@ export const keyboardShortcutLabels = {
|
|
|
195
204
|
},
|
|
196
205
|
"hi-IN": {
|
|
197
206
|
title: "कीबोर्ड शॉर्टकट",
|
|
207
|
+
eyedropper: "आई-ड्रॉपर",
|
|
198
208
|
essential: "आवश्यक",
|
|
199
209
|
shape: "आकृति",
|
|
200
210
|
selection: "चयन",
|
|
@@ -213,6 +223,7 @@ export const keyboardShortcutLabels = {
|
|
|
213
223
|
},
|
|
214
224
|
"ar-SA": {
|
|
215
225
|
title: "اختصارات لوحة المفاتيح",
|
|
226
|
+
eyedropper: "أداة القطارة",
|
|
216
227
|
essential: "أساسي",
|
|
217
228
|
shape: "الأشكال",
|
|
218
229
|
selection: "التحديد",
|
|
@@ -575,6 +586,7 @@ export function attachLocalizedKeyboardShortcuts<
|
|
|
575
586
|
penTool: d.tools.pen,
|
|
576
587
|
handTool: d.tools.hand,
|
|
577
588
|
scaleTool: d.tools.scale,
|
|
589
|
+
eyedropper: labels.eyedropper,
|
|
578
590
|
commentTool: d.pinComment,
|
|
579
591
|
drawTool: d.modes.draw,
|
|
580
592
|
showLayers: layers.title,
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export interface DesignSystemData {
|
|
2
|
+
source?: string;
|
|
3
|
+
builderJobId?: string;
|
|
4
|
+
builderStatus?: string;
|
|
5
|
+
builderSyncedAt?: string;
|
|
6
|
+
colors?: {
|
|
7
|
+
primary?: unknown;
|
|
8
|
+
secondary?: unknown;
|
|
9
|
+
accent?: unknown;
|
|
10
|
+
background?: unknown;
|
|
11
|
+
surface?: unknown;
|
|
12
|
+
text?: unknown;
|
|
13
|
+
textMuted?: unknown;
|
|
14
|
+
};
|
|
15
|
+
typography?: {
|
|
16
|
+
headingFont?: unknown;
|
|
17
|
+
bodyFont?: unknown;
|
|
18
|
+
headingWeight?: unknown;
|
|
19
|
+
bodyWeight?: unknown;
|
|
20
|
+
};
|
|
21
|
+
spacing?: Record<string, unknown>;
|
|
22
|
+
borders?: Record<string, unknown>;
|
|
23
|
+
logos?: Array<{ url?: string; name?: string; variant?: string }>;
|
|
24
|
+
defaults?: Record<string, unknown>;
|
|
25
|
+
notes?: unknown;
|
|
26
|
+
/** The source system's own named vocabulary; absent on kits predating it. */
|
|
27
|
+
tokens?: unknown;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function parseDesignSystemData(
|
|
31
|
+
dataStr: string,
|
|
32
|
+
): DesignSystemData | null {
|
|
33
|
+
try {
|
|
34
|
+
const parsed = JSON.parse(dataStr);
|
|
35
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return parsed as DesignSystemData;
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (error instanceof SyntaxError) return null;
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function shouldRefreshBuilderDesignSystem(
|
|
46
|
+
system: Pick<{ accessRole?: string; data: string }, "accessRole" | "data">,
|
|
47
|
+
): boolean {
|
|
48
|
+
const parsed = parseDesignSystemData(system.data);
|
|
49
|
+
return (
|
|
50
|
+
(system.accessRole === "owner" ||
|
|
51
|
+
system.accessRole === "admin" ||
|
|
52
|
+
system.accessRole === "editor") &&
|
|
53
|
+
parsed?.source === "builder" &&
|
|
54
|
+
(parsed.builderStatus === "in-progress" ||
|
|
55
|
+
((parsed.builderStatus === "ready" ||
|
|
56
|
+
parsed.builderStatus === "complete" ||
|
|
57
|
+
parsed.builderStatus === "completed") &&
|
|
58
|
+
typeof parsed.builderSyncedAt !== "string"))
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function builderRefreshKey(system: {
|
|
63
|
+
id: string;
|
|
64
|
+
data: string;
|
|
65
|
+
}): string {
|
|
66
|
+
const parsed = parseDesignSystemData(system.data);
|
|
67
|
+
return `${system.id}:${parsed?.builderJobId ?? "unknown"}`;
|
|
68
|
+
}
|