@agent-native/core 0.176.1 → 0.176.2-nightly-20260831184159
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 +1 -1
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/analytics/AGENTS.md +13 -2
- package/corpus/templates/analytics/CHANGELOG.md +8 -0
- package/corpus/templates/analytics/actions/certify-dashboard.ts +39 -0
- package/corpus/templates/analytics/actions/get-sql-dashboard.ts +1 -1
- package/corpus/templates/analytics/actions/list-analysis-revisions.ts +4 -2
- package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +4 -2
- package/corpus/templates/analytics/actions/search-analytics-query-catalog.ts +1 -0
- package/corpus/templates/analytics/actions/search-dashboard-references.ts +2 -1
- package/corpus/templates/analytics/actions/set-workspace-feature-flag.ts +2 -2
- package/corpus/templates/analytics/app/components/agents/FeatureFlagsFleetPanel.tsx +16 -1
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +58 -0
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +7 -19
- package/corpus/templates/analytics/app/global.css +0 -7
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/analytics/app/i18n-data.ts +42 -0
- package/corpus/templates/analytics/app/lib/track-metric.ts +15 -0
- package/corpus/templates/analytics/app/pages/NotFound.tsx +1 -1
- package/corpus/templates/analytics/app/pages/Placeholder.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +115 -2
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +8 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +23 -25
- package/corpus/templates/analytics/app/root.tsx +5 -5
- package/corpus/templates/analytics/app/routes/_index.tsx +18 -20
- package/corpus/templates/analytics/app/routes/dashboard.tsx +1 -1
- package/corpus/templates/analytics/app/routes/home.tsx +39 -0
- package/corpus/templates/analytics/changelog/2026-08-27-show-analytics-s-own-registered-flags-in-fleet-feature-flag-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-analytics-loading-placeholders-now-use-a-smooth-whole-surfac.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-analytics-loading-states-use-a-softer-whole-surfac.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-analytics-sidebar-horizontal-spacing-is-tighter.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-sidebar-branding-matches-the-app-text-color-with-a-tighter-m.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-28-sidebar-branding-uses-a-monochrome-agent-native-mark.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-29-analytics-loading-shine-is-more-subtle.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-29-chat-edits-can-be-reverted-to-saved-checkpoints.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-29-dashboard-certification-lives-in-the-overflow-menu.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-29-public-marketing-home.md +6 -0
- package/corpus/templates/analytics/package.json +2 -0
- package/corpus/templates/analytics/public/manifest.json +1 -1
- package/corpus/templates/analytics/server/db/schema.ts +4 -0
- package/corpus/templates/analytics/server/handlers/events.ts +10 -1
- package/corpus/templates/analytics/server/handlers/first-party-analytics.ts +9 -1
- package/corpus/templates/analytics/server/handlers/session-replay.ts +10 -1
- package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +22 -2
- package/corpus/templates/analytics/server/lib/analytics-query-catalog.ts +82 -7
- package/corpus/templates/analytics/server/lib/dashboard-certification.ts +58 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +1 -0
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +429 -46
- package/corpus/templates/analytics/server/lib/workspace-feature-flags.ts +204 -32
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +139 -0
- package/corpus/templates/analytics/server/plugins/auth.ts +1 -0
- package/corpus/templates/analytics/server/plugins/core-routes.ts +3 -2
- package/corpus/templates/analytics/server/plugins/db.ts +11 -0
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/assets/app/components/layout/Header.tsx +2 -2
- package/corpus/templates/assets/app/components/layout/Layout.tsx +4 -3
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +14 -27
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -2
- package/corpus/templates/assets/app/root.tsx +29 -9
- package/corpus/templates/assets/app/routes/_index.tsx +15 -116
- package/corpus/templates/assets/app/routes/chat.$threadId.tsx +1 -1
- package/corpus/templates/assets/app/routes/home.tsx +137 -0
- package/corpus/templates/assets/app/routes/library.tsx +5 -1
- package/corpus/templates/assets/app/routes/settings.tsx +28 -25
- package/corpus/templates/assets/changelog/2026-08-26-templates-across-brand-kits.md +1 -0
- package/corpus/templates/assets/public/manifest.json +1 -1
- package/corpus/templates/assets/server/plugins/auth.ts +1 -0
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +3 -3
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +10 -23
- package/corpus/templates/brain/app/lib/brain.ts +2 -2
- package/corpus/templates/brain/app/root.tsx +13 -3
- package/corpus/templates/brain/app/routes/_index.tsx +15 -55
- package/corpus/templates/brain/app/routes/home.tsx +76 -0
- package/corpus/templates/brain/app/routes.ts +1 -0
- package/corpus/templates/brain/public/manifest.json +1 -1
- package/corpus/templates/brain/server/lib/brain-health.ts +2 -2
- package/corpus/templates/brain/server/plugins/auth.ts +1 -1
- package/corpus/templates/brain/server/plugins/core-routes.ts +2 -1
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/calendar/CHANGELOG.md +12 -0
- package/corpus/templates/calendar/actions/event-action-helpers.ts +2 -1
- package/corpus/templates/calendar/actions/manage-event-draft.ts +1 -1
- package/corpus/templates/calendar/actions/update-event.ts +8 -1
- package/corpus/templates/calendar/amplify.yml +15 -0
- package/corpus/templates/calendar/app/components/calendar/ApolloPanel.tsx +2 -2
- package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +102 -109
- package/corpus/templates/calendar/app/components/calendar/DayView.tsx +23 -10
- package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +2 -11
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +150 -141
- package/corpus/templates/calendar/app/components/calendar/EventCard.tsx +3 -1
- package/corpus/templates/calendar/app/components/calendar/EventDescription.tsx +2 -2
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +359 -222
- package/corpus/templates/calendar/app/components/calendar/InlineEventPickers.tsx +13 -5
- package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +21 -9
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +21 -32
- package/corpus/templates/calendar/app/global.css +11 -0
- package/corpus/templates/calendar/app/hooks/use-meeting-start-notifications.ts +10 -0
- package/corpus/templates/calendar/app/hooks/use-navigation-state.ts +3 -3
- package/corpus/templates/calendar/app/i18n-data.ts +110 -0
- package/corpus/templates/calendar/app/lib/calendar-timezone.ts +12 -3
- package/corpus/templates/calendar/app/lib/event-popover-style.ts +43 -0
- package/corpus/templates/calendar/app/lib/mcp-embed.ts +8 -2
- package/corpus/templates/calendar/app/lib/utils.ts +3 -1
- package/corpus/templates/calendar/app/pages/BookingPage.tsx +2 -8
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +9 -11
- package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +2 -6
- package/corpus/templates/calendar/app/pages/NotFound.tsx +1 -1
- package/corpus/templates/calendar/app/pages/Settings.tsx +54 -0
- package/corpus/templates/calendar/app/root.tsx +9 -1
- package/corpus/templates/calendar/app/routes/{_app._index.tsx → _app.home.tsx} +1 -1
- package/corpus/templates/calendar/app/routes/_index.tsx +34 -0
- package/corpus/templates/calendar/app/routes/event.tsx +2 -6
- package/corpus/templates/calendar/changelog/2026-08-28-all-day-events-stay-in-the-compact-top-bar-in-day-and-week-v.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-calendar-organizer-note-emails-now-link-back-to-agent-native.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-calendar-shows-google-profile-photos-in-the-desktop-app.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-event-creators-can-choose-whether-a-meeting-shows-as-free-or.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-event-popovers-match-notion-calendar-s-density-a-284px-blurr.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-fixed-calendar-navigation-scheduling-permissions-and-action-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-google-calendar-connections-use-the-registered-callback-on-m.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-sidebar-branding-matches-the-app-text-color-with-a-tighter-m.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-sidebar-branding-uses-a-monochrome-agent-native-mark.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-the-calendar-sidebar-keeps-the-settings-link-compact.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-28-the-calendar-sidebar-keeps-the-workspace-picker-compact.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-29-public-marketing-home.md +6 -0
- package/corpus/templates/calendar/public/manifest.json +1 -1
- package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
- package/corpus/templates/calendar/server/lib/emails.ts +2 -1
- package/corpus/templates/calendar/server/lib/event-guest-notifications.ts +31 -5
- package/corpus/templates/calendar/server/lib/google-calendar.ts +4 -2
- package/corpus/templates/calendar/server/plugins/auth.ts +1 -0
- package/corpus/templates/calendar/server/plugins/core-routes.ts +5 -3
- package/corpus/templates/calendar/shared/event-permissions.ts +12 -0
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/chat/AGENTS.md +5 -4
- package/corpus/templates/chat/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/chat/app/components/layout/Layout.tsx +5 -4
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +16 -25
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +5 -5
- package/corpus/templates/chat/app/root.tsx +16 -3
- package/corpus/templates/chat/app/routes/_index.tsx +17 -74
- package/corpus/templates/chat/app/routes/chat.$threadId.tsx +1 -1
- package/corpus/templates/chat/app/routes/home.tsx +94 -0
- package/corpus/templates/chat/netlify.toml +2 -1
- package/corpus/templates/chat/public/manifest.json +1 -1
- package/corpus/templates/chat/server/plugins/auth.ts +1 -0
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/clips/actions/add-comment.ts +18 -1
- package/corpus/templates/clips/actions/get-recording-player-data.ts +2 -0
- package/corpus/templates/clips/actions/list-comments.ts +2 -0
- package/corpus/templates/clips/actions/list-notifications.ts +60 -28
- package/corpus/templates/clips/actions/list-recording-mention-members.ts +64 -0
- package/corpus/templates/clips/actions/list-recordings.ts +1 -1
- package/corpus/templates/clips/actions/reply-to-comment.ts +17 -1
- package/corpus/templates/clips/actions/update-comment.ts +36 -2
- package/corpus/templates/clips/app/components/library/empty-state.tsx +1 -3
- package/corpus/templates/clips/app/components/library/library-grid.tsx +18 -6
- package/corpus/templates/clips/app/components/library/library-layout.tsx +6 -58
- package/corpus/templates/clips/app/components/library/recording-card.tsx +101 -3
- package/corpus/templates/clips/app/components/library/sort-menu.tsx +2 -2
- package/corpus/templates/clips/app/components/player/comment-composer.tsx +284 -0
- package/corpus/templates/clips/app/components/player/comments-panel.tsx +162 -46
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +38 -133
- package/corpus/templates/clips/app/components/player/video-player.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +99 -20
- package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +110 -116
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +83 -60
- package/corpus/templates/clips/app/components/settings/ai-setup-section.tsx +17 -11
- package/corpus/templates/clips/app/components/settings/types.ts +5 -1
- package/corpus/templates/clips/app/components/settings/video-storage-section.tsx +21 -12
- package/corpus/templates/clips/app/global.css +0 -27
- package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +3 -17
- package/corpus/templates/clips/app/hooks/use-mention-members.ts +24 -0
- package/corpus/templates/clips/app/hooks/use-navigation-state.ts +2 -2
- package/corpus/templates/clips/app/i18n/en-US.ts +15 -0
- package/corpus/templates/clips/app/lib/recording-backup.ts +245 -0
- package/corpus/templates/clips/app/lib/recording-retry.ts +189 -0
- package/corpus/templates/clips/app/lib/recording-status.ts +32 -0
- package/corpus/templates/clips/app/root.tsx +11 -2
- package/corpus/templates/clips/app/routes/_app.home.tsx +62 -0
- package/corpus/templates/clips/app/routes/_app.notifications.tsx +45 -12
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +2 -0
- package/corpus/templates/clips/app/routes/_index.tsx +11 -40
- package/corpus/templates/clips/app/routes/download.tsx +148 -15
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +4 -3
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +6 -11
- package/corpus/templates/clips/app/routes/record.tsx +72 -13
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +40 -24
- package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +2 -7
- package/corpus/templates/clips/changelog/2026-08-28-chrome-extension-download-help.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-28-clips-loading-skeletons-use-a-softer-whole-surface.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-28-comment-composer-no-longer-has-an-outer-border.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-29-clips-loading-shine-is-more-subtle.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +377 -476
- package/corpus/templates/clips/desktop/src/components/ui/skeleton.tsx +1 -1
- package/corpus/templates/clips/desktop/src/components/ui/spinner.tsx +1 -17
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -0
- package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +0 -8
- package/corpus/templates/clips/desktop/src/overlays/record-pill.tsx +221 -460
- package/corpus/templates/clips/desktop/src/styles.css +0 -40
- package/corpus/templates/clips/desktop/src/tailwind.css +28 -14
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +15 -11
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +9 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +192 -57
- package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +9 -3
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
- package/corpus/templates/clips/desktop/src-tauri/src/util.rs +97 -3
- package/corpus/templates/clips/public/manifest.json +1 -1
- package/corpus/templates/clips/server/db/schema.ts +1 -0
- package/corpus/templates/clips/server/lib/activity-notifications.ts +30 -5
- package/corpus/templates/clips/server/lib/comment-mentions.ts +23 -0
- package/corpus/templates/clips/server/lib/emails.ts +2 -2
- package/corpus/templates/clips/server/lib/recording-page-access.ts +16 -0
- package/corpus/templates/clips/server/lib/transactional-email-templates.ts +14 -7
- package/corpus/templates/clips/server/plugins/auth.ts +1 -0
- package/corpus/templates/clips/server/plugins/core-routes.ts +5 -0
- package/corpus/templates/clips/server/plugins/db.ts +5 -0
- package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +4 -2
- package/corpus/templates/clips/server/routes/api/clips-latest.json.get.ts +77 -22
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +11 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/interrupt.post.ts +4 -4
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/resume.get.ts +1 -1
- package/corpus/templates/clips/shared/comment-mentions.ts +71 -0
- package/corpus/templates/clips/shared/prerendered-public-paths.ts +1 -1
- package/corpus/templates/clips/shared/recording-core.ts +5 -0
- package/corpus/templates/clips/shared/recording-playhead.css +207 -0
- package/corpus/templates/clips/shared/recording-playhead.tsx +616 -0
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/content/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/content/CHANGELOG.md +6 -0
- package/corpus/templates/content/actions/_property-utils.ts +45 -9
- package/corpus/templates/content/actions/edit-document.ts +17 -0
- package/corpus/templates/content/actions/get-document.ts +31 -11
- package/corpus/templates/content/actions/list-document-properties.ts +30 -2
- package/corpus/templates/content/actions/list-document-versions.ts +49 -17
- package/corpus/templates/content/actions/list-documents.ts +13 -2
- package/corpus/templates/content/actions/restore-document-version.ts +8 -1
- package/corpus/templates/content/actions/update-document.ts +8 -0
- package/corpus/templates/content/app/components/QueryErrorState.tsx +1 -0
- package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +28 -8
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +94 -61
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +24 -10
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +16 -13
- package/corpus/templates/content/app/components/editor/database/settings.tsx +16 -13
- package/corpus/templates/content/app/components/layout/Layout.tsx +35 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -18
- package/corpus/templates/content/app/hooks/use-document-properties.ts +5 -3
- package/corpus/templates/content/app/hooks/use-documents.ts +3 -1
- package/corpus/templates/content/app/hooks/use-navigation-state.ts +3 -3
- package/corpus/templates/content/app/root.tsx +9 -4
- package/corpus/templates/content/app/routes/{_app._index.tsx → _app.home.tsx} +12 -4
- package/corpus/templates/content/app/routes/_index.tsx +33 -0
- package/corpus/templates/content/changelog/2026-08-26-shared-page-load-failures-now-stay-visible-and-safe.md +6 -0
- package/corpus/templates/content/docs/product/capabilities/content.workspace.session-restore.md +2 -2
- package/corpus/templates/content/e2e/playwright.config.ts +1 -1
- package/corpus/templates/content/package.json +2 -0
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +1 -1
- package/corpus/templates/content/public/manifest.json +1 -1
- package/corpus/templates/content/server/db/schema.ts +1 -0
- package/corpus/templates/content/server/lib/document-version-context.ts +67 -0
- package/corpus/templates/content/server/plugins/agent-chat.ts +155 -0
- package/corpus/templates/content/server/plugins/auth.ts +1 -0
- package/corpus/templates/content/server/plugins/core-routes.ts +3 -2
- package/corpus/templates/content/server/plugins/db.ts +5 -0
- package/corpus/templates/content/shared/api.ts +6 -4
- package/corpus/templates/crm/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +1 -1
- package/corpus/templates/crm/agent-native.app-skill.json +1 -1
- package/corpus/templates/crm/app/components/layout/CrmCommandMenu.tsx +1 -1
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +36 -1
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +3 -3
- package/corpus/templates/crm/app/root.tsx +28 -7
- package/corpus/templates/crm/app/routes/_index.tsx +28 -18
- package/corpus/templates/crm/app/routes/home.tsx +27 -0
- package/corpus/templates/crm/app/routes/setup.tsx +2 -2
- package/corpus/templates/crm/app/routes.ts +1 -0
- package/corpus/templates/crm/public/manifest.json +1 -1
- package/corpus/templates/crm/server/plugins/agent-chat.ts +81 -0
- package/corpus/templates/crm/server/plugins/auth.ts +1 -0
- package/corpus/templates/crm/server/plugins/core-routes.ts +2 -1
- package/corpus/templates/crm/server/plugins/db.ts +7 -1
- package/corpus/templates/crm/shared/crm-navigation.ts +3 -2
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +13 -0
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/design/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +22 -10
- package/corpus/templates/design/AGENTS.md +1 -1
- package/corpus/templates/design/actions/add-breakpoint.ts +3 -1
- package/corpus/templates/design/actions/add-fusion-screens.ts +2 -0
- package/corpus/templates/design/actions/add-localhost-screens.ts +16 -11
- package/corpus/templates/design/actions/apply-a11y-fix.ts +6 -8
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +3 -1
- package/corpus/templates/design/actions/apply-design-token-edit.ts +3 -1
- package/corpus/templates/design/actions/apply-motion-edit.ts +18 -13
- package/corpus/templates/design/actions/apply-shader-fill.ts +3 -1
- package/corpus/templates/design/actions/apply-source-edit.ts +6 -1
- package/corpus/templates/design/actions/apply-tweaks.ts +3 -1
- package/corpus/templates/design/actions/apply-visual-edit.ts +14 -9
- package/corpus/templates/design/actions/clone-creative-context-design.ts +6 -1
- package/corpus/templates/design/actions/create-component.ts +3 -1
- package/corpus/templates/design/actions/create-file.ts +3 -1
- package/corpus/templates/design/actions/delete-file.ts +3 -1
- package/corpus/templates/design/actions/detach-component-instance.ts +3 -1
- package/corpus/templates/design/actions/edit-design.ts +16 -11
- package/corpus/templates/design/actions/generate-design.ts +19 -14
- package/corpus/templates/design/actions/get-design-branch-diff.ts +26 -31
- package/corpus/templates/design/actions/get-design-review.ts +25 -31
- package/corpus/templates/design/actions/get-design-system-index-status.ts +55 -0
- package/corpus/templates/design/actions/get-design-system.ts +1 -1
- package/corpus/templates/design/actions/hydrate-figma-paste-images.ts +3 -1
- package/corpus/templates/design/actions/import-design-source.ts +16 -9
- package/corpus/templates/design/actions/import-design-tokens.ts +3 -1
- package/corpus/templates/design/actions/import-figma-clipboard.ts +28 -16
- package/corpus/templates/design/actions/import-figma-frame.ts +3 -1
- package/corpus/templates/design/actions/insert-asset.ts +3 -1
- package/corpus/templates/design/actions/insert-design-native-asset.ts +3 -1
- package/corpus/templates/design/actions/insert-figma-library-asset.ts +3 -1
- package/corpus/templates/design/actions/list-design-versions.ts +23 -0
- package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +3 -1
- package/corpus/templates/design/actions/open-visual-edit.ts +23 -20
- package/corpus/templates/design/actions/present-design-variants.ts +7 -2
- package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +66 -10
- package/corpus/templates/design/actions/remove-breakpoint.ts +3 -1
- package/corpus/templates/design/actions/remove-motion-timeline.ts +3 -1
- package/corpus/templates/design/actions/restore-design-version.ts +16 -0
- package/corpus/templates/design/actions/set-layout-grid.ts +94 -0
- package/corpus/templates/design/actions/swap-component-instance.ts +6 -1
- package/corpus/templates/design/actions/update-design.ts +16 -11
- package/corpus/templates/design/actions/update-file.ts +2 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +25 -0
- package/corpus/templates/design/app/components/design/EditPanel.tsx +36 -8
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +185 -29
- package/corpus/templates/design/app/components/design/ReviewCommentsPanel.tsx +4 -4
- package/corpus/templates/design/app/components/design/ReviewPanel.tsx +1 -1
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +35 -10
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +16 -9
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +51 -21
- package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +18 -17
- package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +6 -1
- package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +3 -3
- package/corpus/templates/design/app/components/design/edit-panel/layout-grid-properties.tsx +88 -0
- package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +5 -2
- package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +8 -4
- package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +8 -103
- package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +68 -83
- package/corpus/templates/design/app/components/design/editor/MakeRealDialog.tsx +35 -10
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +29 -24
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +6 -0
- package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +72 -71
- package/corpus/templates/design/app/components/design/inspector/InspectorControlPopover.tsx +1 -1
- package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +9 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +8 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +32 -0
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +8 -21
- package/corpus/templates/design/app/global.css +72 -1
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +32 -1
- package/corpus/templates/design/app/i18n-data.ts +116 -12
- package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +3 -1
- package/corpus/templates/design/app/lib/design-system-data.ts +36 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +170 -34
- package/corpus/templates/design/app/pages/DesignSystems.tsx +126 -11
- package/corpus/templates/design/app/pages/Index.tsx +15 -7
- package/corpus/templates/design/app/pages/NotFound.tsx +1 -1
- package/corpus/templates/design/app/pages/Templates.tsx +18 -3
- package/corpus/templates/design/app/pages/VisualEdit.tsx +1 -1
- package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +3 -3
- package/corpus/templates/design/app/pages/design-editor/commands/README.md +1 -0
- package/corpus/templates/design/app/pages/design-editor/commands/geometry-commit.ts +2 -1
- package/corpus/templates/design/app/pages/design-editor/commands/set-layout-grid.ts +66 -0
- package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +5 -0
- package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +9 -1
- package/corpus/templates/design/app/pages/design-editor/effects/resume-pending-generation.ts +39 -9
- package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +31 -2
- package/corpus/templates/design/app/pages/design-editor/geometry-persistence.ts +26 -0
- package/corpus/templates/design/app/pages/design-editor/intake-question-topics.ts +335 -0
- package/corpus/templates/design/app/pages/design-editor/nudge-intent.ts +8 -1
- package/corpus/templates/design/app/root.tsx +12 -2
- package/corpus/templates/design/app/routes/_index.tsx +14 -1
- package/corpus/templates/design/app/routes/home.tsx +21 -0
- package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +1 -1
- package/corpus/templates/design/changelog/2026-08-28-frames-can-carry-an-8px-layout-grid-that-positions-snap-to.md +6 -0
- package/corpus/templates/design/changelog/2026-08-28-x-and-y-are-always-whole-numbers.md +6 -0
- package/corpus/templates/design/public/manifest.json +1 -1
- package/corpus/templates/design/server/db/schema.ts +2 -0
- package/corpus/templates/design/server/handlers/design-system-builder-link.ts +84 -0
- package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +9 -1
- package/corpus/templates/design/server/lib/design-versions.ts +1017 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +144 -0
- package/corpus/templates/design/server/plugins/auth.ts +1 -1
- package/corpus/templates/design/server/plugins/core-routes.ts +3 -2
- package/corpus/templates/design/server/plugins/db.ts +7 -0
- package/corpus/templates/design/server/routes/api/design-system-builder-link.get.ts +1 -0
- package/corpus/templates/design/shared/canvas-math.ts +106 -14
- package/corpus/templates/design/shared/layout-grid.ts +80 -0
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/dispatch/AGENTS.md +11 -13
- package/corpus/templates/dispatch/actions/list-workspace-connections.ts +10 -5
- package/corpus/templates/dispatch/app/i18n-data.ts +120 -0
- package/corpus/templates/dispatch/app/root.tsx +11 -1
- package/corpus/templates/dispatch/app/routes/_index.tsx +34 -7
- package/corpus/templates/dispatch/app/routes/home.tsx +7 -0
- package/corpus/templates/dispatch/package.json +1 -0
- package/corpus/templates/dispatch/public/manifest.json +1 -1
- package/corpus/templates/factory/.agents/skills/factory-graphs/SKILL.md +11 -2
- package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/factory/.env.example +2 -14
- package/corpus/templates/factory/AGENTS.md +12 -11
- package/corpus/templates/factory/README.md +15 -17
- package/corpus/templates/factory/actions/{babysit-agent-native-pull-request.ts → babysit-factory-pull-request.ts} +125 -88
- package/corpus/templates/factory/actions/create-factory-automation.ts +161 -0
- package/corpus/templates/factory/actions/create-factory.ts +4 -124
- package/corpus/templates/factory/actions/delete-factory.ts +11 -23
- package/corpus/templates/factory/actions/{start-builder-for-item.ts → dispatch-factory-item.ts} +169 -57
- package/corpus/templates/factory/actions/get-slack-feedback-context.ts +30 -10
- package/corpus/templates/factory/actions/get-triage-config.ts +22 -0
- package/corpus/templates/factory/actions/get-triage-item.ts +49 -2
- package/corpus/templates/factory/actions/{govern-agent-native-pull-request.ts → govern-factory-pull-request.ts} +95 -112
- package/corpus/templates/factory/actions/ingest-github-observation.ts +9 -2
- package/corpus/templates/factory/actions/list-factory-audit.ts +85 -12
- package/corpus/templates/factory/actions/list-factory-automation-templates.ts +56 -0
- package/corpus/templates/factory/actions/list-factory-automations.ts +36 -3
- package/corpus/templates/factory/actions/list-factory-graph-versions.ts +37 -10
- package/corpus/templates/factory/actions/list-triage-items.ts +120 -15
- package/corpus/templates/factory/actions/poll-github-sources.ts +102 -58
- package/corpus/templates/factory/actions/poll-sentry-errors.ts +73 -36
- package/corpus/templates/factory/actions/poll-slack-channel.ts +112 -28
- package/corpus/templates/factory/actions/{babysit-pull-request.ts → propose-pr-babysit-status.ts} +9 -47
- package/corpus/templates/factory/actions/reconcile-triage-run.ts +1 -1
- package/corpus/templates/factory/actions/save-factory-automation.ts +131 -33
- package/corpus/templates/factory/actions/save-factory-graph.ts +31 -8
- package/corpus/templates/factory/actions/save-triage-config.ts +7 -27
- package/corpus/templates/factory/actions/save-triage-rule.ts +1 -1
- package/corpus/templates/factory/app/components/factory/CreateFactoryAutomationView.tsx +258 -0
- package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +349 -106
- package/corpus/templates/factory/app/components/factory/FactoryAutomationFields.tsx +614 -0
- package/corpus/templates/factory/app/components/factory/FactoryInboxView.tsx +1136 -0
- package/corpus/templates/factory/app/components/factory/FactoryInspector.tsx +7 -14
- package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +4 -223
- package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +10 -205
- package/corpus/templates/factory/app/components/factory/SlackMrkdwn.tsx +100 -0
- package/corpus/templates/factory/app/components/factory/audit-filters.ts +30 -0
- package/corpus/templates/factory/app/components/factory/factory-automation-form.ts +120 -0
- package/corpus/templates/factory/app/components/factory/inbox-filters.ts +84 -0
- package/corpus/templates/factory/app/components/factory/inbox-source-url.ts +23 -0
- package/corpus/templates/factory/app/components/factory/slack-emoji.ts +165 -0
- package/corpus/templates/factory/app/components/factory/slack-mrkdwn.ts +128 -0
- package/corpus/templates/factory/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/factory/app/components/layout/Layout.tsx +63 -6
- package/corpus/templates/factory/app/components/layout/Sidebar.tsx +13 -26
- package/corpus/templates/factory/app/components/triage/triage-status-pill.tsx +63 -14
- package/corpus/templates/factory/app/global.css +106 -0
- package/corpus/templates/factory/app/hooks/use-navigation-state.ts +16 -10
- package/corpus/templates/factory/app/i18n/en-US.ts +154 -7
- package/corpus/templates/factory/app/lib/factory-tab-params.ts +59 -0
- package/corpus/templates/factory/app/lib/safe-http-url.ts +8 -0
- package/corpus/templates/factory/app/root.tsx +16 -3
- package/corpus/templates/factory/app/routes/_index.tsx +27 -5
- package/corpus/templates/factory/app/routes/factory.tsx +325 -733
- package/corpus/templates/factory/app/routes/home.tsx +13 -0
- package/corpus/templates/factory/app/routes/new-factory.tsx +3 -5
- package/corpus/templates/factory/changelog/2026-08-26-inbox-full-screen-thread.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-26-inbox-thread-and-audit-labels.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-audit-run-list-stacks.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-audit-run-names-wrap.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-factory-opens-on-inbox.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-github-repository-url.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-inbox-filters.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-polling-does-not-enable-automations.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-27-pr-babysit-can-poll-github.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-factory-automations-use-workspace-connections.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-inbox-approve-and-start-removed.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-audit-shows-decisions.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-reviews-next-github-prs.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-sticky-out-of-scope.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-28-pr-babysit-uses-github-evidence.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-29-audit-filters-pagination-scroll.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-29-create-factory-automations.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-29-dispatch-reaction-argument.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-29-factory-action-names-match-behavior.md +6 -0
- package/corpus/templates/factory/public/manifest.json +1 -1
- package/corpus/templates/factory/server/connectors/slack.ts +8 -6
- package/corpus/templates/factory/server/db/schema.ts +23 -0
- package/corpus/templates/factory/server/lib/audit-cursor.ts +44 -0
- package/corpus/templates/factory/server/lib/factory-action-names.ts +15 -0
- package/corpus/templates/factory/server/lib/factory-audit-report.ts +29 -9
- package/corpus/templates/factory/server/lib/factory-automation-caller.ts +38 -0
- package/corpus/templates/factory/server/lib/factory-automation-config.ts +543 -0
- package/corpus/templates/factory/server/lib/factory-automation-plan.ts +0 -48
- package/corpus/templates/factory/server/lib/factory-automation-repair.ts +2 -18
- package/corpus/templates/factory/server/lib/factory-poll-cursors.ts +98 -0
- package/corpus/templates/factory/server/lib/factory-scope.ts +8 -0
- package/corpus/templates/factory/server/lib/github-repository.ts +104 -0
- package/corpus/templates/factory/server/lib/inbox-cursor.ts +34 -0
- package/corpus/templates/factory/server/lib/pr-babysit-prompt.ts +33 -0
- package/corpus/templates/factory/server/lib/require-factory-automation.ts +58 -17
- package/corpus/templates/factory/server/lib/safe-http-url.ts +8 -0
- package/corpus/templates/factory/server/lib/slack-feedback-prompt.ts +19 -10
- package/corpus/templates/factory/server/lib/source-reaction.ts +37 -0
- package/corpus/templates/factory/server/plugins/agent-chat.ts +18 -22
- package/corpus/templates/factory/server/plugins/auth.ts +1 -0
- package/corpus/templates/factory/server/plugins/factory-migrations.ts +26 -0
- package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +277 -164
- package/corpus/templates/factory/server/plugins/integrations.ts +5 -7
- package/corpus/templates/factory/server/triage/github-client.ts +274 -3
- package/corpus/templates/factory/server/triage/github-ingestion.ts +3 -1
- package/corpus/templates/factory/server/triage/metadata.ts +12 -0
- package/corpus/templates/factory/server/triage/pr-babysit.ts +22 -21
- package/corpus/templates/factory/server/triage/review-skill-alignment.ts +11 -11
- package/corpus/templates/factory/server/triage/review-state.ts +39 -0
- package/corpus/templates/factory/server/triage/slack-client.ts +14 -6
- package/corpus/templates/factory/server/triage/slack-poller.ts +34 -65
- package/corpus/templates/factory/server/triage/slack-user-labels.ts +126 -0
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/forms/AGENTS.md +4 -3
- package/corpus/templates/forms/actions/response-insights.ts +4 -4
- package/corpus/templates/forms/actions/retry-response-deliveries.ts +26 -0
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +8 -33
- package/corpus/templates/forms/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/forms/app/lib/route-prewarm.ts +1 -1
- package/corpus/templates/forms/app/root.tsx +3 -2
- package/corpus/templates/forms/app/routes/_app.home.tsx +47 -0
- package/corpus/templates/forms/app/routes/_app.tsx +2 -1
- package/corpus/templates/forms/app/routes/_index.tsx +10 -23
- package/corpus/templates/forms/public/manifest.json +1 -1
- package/corpus/templates/forms/server/db/schema.ts +64 -17
- package/corpus/templates/forms/server/handlers/submissions.ts +1022 -94
- package/corpus/templates/forms/server/lib/integrations.ts +100 -33
- package/corpus/templates/forms/server/middleware/00-public-cors.ts +1 -1
- package/corpus/templates/forms/server/plugins/auth.ts +1 -0
- package/corpus/templates/forms/server/plugins/core-routes.ts +1 -0
- package/corpus/templates/forms/server/plugins/db.ts +40 -0
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/macros/actions/view-screen.ts +1 -1
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +9 -21
- package/corpus/templates/macros/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/macros/app/root.tsx +22 -8
- package/corpus/templates/macros/app/routes/_index.tsx +16 -291
- package/corpus/templates/macros/app/routes/home.tsx +312 -0
- package/corpus/templates/macros/server/plugins/auth.ts +9 -7
- package/corpus/templates/macros/server/plugins/core-routes.ts +1 -0
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/mail/.agents/skills/inbox-automations/SKILL.md +13 -2
- package/corpus/templates/mail/.agents/skills/inbox-reads-and-triage/SKILL.md +1 -1
- package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/mail/AGENTS.md +5 -2
- package/corpus/templates/mail/actions/apply-ai-filter.ts +294 -0
- package/corpus/templates/mail/actions/create-automation.ts +1 -0
- package/corpus/templates/mail/actions/get-ai-filter.ts +19 -0
- package/corpus/templates/mail/actions/manage-automations.ts +162 -157
- package/corpus/templates/mail/actions/manage-email-rules.ts +3 -0
- package/corpus/templates/mail/actions/navigate.ts +1 -1
- package/corpus/templates/mail/actions/update-automation.ts +1 -0
- package/corpus/templates/mail/actions/update-mail-preferences.ts +1 -0
- package/corpus/templates/mail/app/components/email/AiFilterDialog.tsx +127 -0
- package/corpus/templates/mail/app/components/email/EmailList.tsx +63 -0
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +95 -0
- package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +35 -3
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +17 -22
- package/corpus/templates/mail/app/components/settings/AiFilterSection.tsx +401 -0
- package/corpus/templates/mail/app/hooks/use-ai-filter.ts +48 -0
- package/corpus/templates/mail/app/hooks/use-automations.ts +1 -0
- package/corpus/templates/mail/app/hooks/use-emails.ts +11 -3
- package/corpus/templates/mail/app/i18n/en-US.ts +55 -0
- package/corpus/templates/mail/app/lib/automation-visibility.ts +17 -0
- package/corpus/templates/mail/app/pages/InboxPage.tsx +5 -2
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +16 -8
- package/corpus/templates/mail/app/pages/inbox-zero.ts +1 -2
- package/corpus/templates/mail/app/root.tsx +20 -8
- package/corpus/templates/mail/app/routes/_index.tsx +16 -55
- package/corpus/templates/mail/app/routes/home.tsx +71 -0
- package/corpus/templates/mail/changelog/2026-08-28-mail-settings-show-chat-created-automations.md +6 -0
- package/corpus/templates/mail/public/manifest.json +1 -1
- package/corpus/templates/mail/server/db/schema.ts +3 -0
- package/corpus/templates/mail/server/handlers/emails.ts +34 -11
- package/corpus/templates/mail/server/handlers/google-auth.ts +1 -1
- package/corpus/templates/mail/server/lib/ai-filter.ts +103 -0
- package/corpus/templates/mail/server/lib/automation-actions.ts +14 -9
- package/corpus/templates/mail/server/lib/automation-engine.ts +142 -18
- package/corpus/templates/mail/server/lib/automations.ts +9 -0
- package/corpus/templates/mail/server/lib/email-state.ts +7 -2
- package/corpus/templates/mail/server/lib/gmail-query.ts +10 -0
- package/corpus/templates/mail/server/lib/google-auth.ts +5 -8
- package/corpus/templates/mail/server/lib/jobs.ts +1 -5
- package/corpus/templates/mail/server/onboarding.ts +2 -2
- package/corpus/templates/mail/server/plugins/agent-chat.ts +5 -2
- package/corpus/templates/mail/server/plugins/auth.ts +1 -0
- package/corpus/templates/mail/server/plugins/core-routes.ts +4 -1
- package/corpus/templates/mail/server/plugins/db.ts +6 -0
- package/corpus/templates/mail/server/routes/api/attachments.get.ts +1 -5
- package/corpus/templates/mail/shared/ai-filter.ts +74 -0
- package/corpus/templates/mail/shared/types.ts +2 -0
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/plan/actions/list-plan-versions.ts +20 -5
- package/corpus/templates/plan/agent-native.json +1 -4
- package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +5 -2
- package/corpus/templates/plan/app/components/layout/Layout.tsx +41 -1
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +4 -16
- package/corpus/templates/plan/app/components/plan/PlanMarkdownEditor.tsx +7 -4
- package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
- package/corpus/templates/plan/app/components/plan/wireframe/html-artboard.css +15 -0
- package/corpus/templates/plan/app/components/plan/wireframe/kit/plan-wireframe-tokens.css +0 -15
- package/corpus/templates/plan/app/components/plan/wireframe/kit/primitives.tsx +2 -2
- package/corpus/templates/plan/app/hooks/use-plan-presence.ts +20 -10
- package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
- package/corpus/templates/plan/app/root.tsx +13 -7
- package/corpus/templates/plan/app/routes/_index.tsx +31 -6
- package/corpus/templates/plan/app/routes/chat.tsx +3 -6
- package/corpus/templates/plan/app/routes/home.tsx +11 -0
- package/corpus/templates/plan/app/routes/local-plans.$slug.tsx +2 -6
- package/corpus/templates/plan/app/routes/plans.$id.tsx +3 -6
- package/corpus/templates/plan/app/routes/plans.tsx +3 -6
- package/corpus/templates/plan/app/routes/recaps.$id.tsx +3 -6
- package/corpus/templates/plan/app/routes/recaps.tsx +3 -6
- package/corpus/templates/plan/changelog/2026-08-28-plan-loading-skeletons-use-a-softer-whole-surface.md +6 -0
- package/corpus/templates/plan/changelog/2026-08-29-plan-loading-shine-is-more-subtle.md +6 -0
- package/corpus/templates/plan/public/manifest.json +1 -1
- package/corpus/templates/plan/server/db/schema.ts +1 -0
- package/corpus/templates/plan/server/lib/plan-versions.ts +57 -0
- package/corpus/templates/plan/server/plugins/agent-chat.ts +83 -0
- package/corpus/templates/plan/server/plugins/core-routes.ts +1 -0
- package/corpus/templates/plan/server/plugins/db.ts +10 -0
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/slides/CHANGELOG.md +9 -0
- package/corpus/templates/slides/actions/_deck-write.ts +65 -0
- package/corpus/templates/slides/actions/add-slide.ts +44 -24
- package/corpus/templates/slides/actions/clone-context-slide.ts +22 -12
- package/corpus/templates/slides/actions/create-deck.ts +36 -21
- package/corpus/templates/slides/actions/delete-design-system.ts +10 -3
- package/corpus/templates/slides/actions/import-file.ts +9 -3
- package/corpus/templates/slides/actions/import-pptx.ts +11 -4
- package/corpus/templates/slides/actions/list-deck-versions.ts +20 -8
- package/corpus/templates/slides/actions/patch-deck.ts +29 -3
- package/corpus/templates/slides/actions/restore-deck-version.ts +37 -22
- package/corpus/templates/slides/actions/save-deck.ts +35 -22
- package/corpus/templates/slides/actions/update-deck-aspect-ratio.ts +31 -16
- package/corpus/templates/slides/actions/update-slide.ts +250 -37
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +10 -4
- package/corpus/templates/slides/app/components/editor/EditorActionCluster.tsx +2 -2
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +7 -8
- package/corpus/templates/slides/app/components/editor/ImageOverlay.tsx +78 -12
- package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +42 -4
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +381 -53
- package/corpus/templates/slides/app/components/editor/SlidesLayersPanel.tsx +20 -34
- package/corpus/templates/slides/app/components/editor/slide-style.ts +5 -0
- package/corpus/templates/slides/app/components/editor/style-clipboard.ts +2 -0
- package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +18 -2
- package/corpus/templates/slides/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/slides/app/components/layout/Layout.tsx +39 -10
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +7 -20
- package/corpus/templates/slides/app/components/presentation/PresenterView.tsx +35 -15
- package/corpus/templates/slides/app/components/presentation/present-channel.ts +12 -0
- package/corpus/templates/slides/app/global.css +45 -13
- package/corpus/templates/slides/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/slides/app/i18n/en-US.ts +11 -0
- package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +133 -5
- package/corpus/templates/slides/app/lib/slide-image-replacement.ts +741 -17
- package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +1 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +288 -95
- package/corpus/templates/slides/app/pages/DesignSystems.tsx +5 -5
- package/corpus/templates/slides/app/pages/Index.tsx +7 -7
- package/corpus/templates/slides/app/pages/NotFound.tsx +1 -1
- package/corpus/templates/slides/app/pages/SharedPresentation.tsx +1 -1
- package/corpus/templates/slides/app/root.tsx +4 -23
- package/corpus/templates/slides/app/routes/_index.tsx +18 -7
- package/corpus/templates/slides/app/routes/home.tsx +26 -0
- package/corpus/templates/slides/changelog/2026-08-27-image-fit-controls-apply-cover-crops-and-position.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-28-image-edits-persist-while-dropped-images-finish-uploading.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-28-shared-slides-with-a-style-block-render-again.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-28-slides-loading-skeletons-use-a-softer-whole-surface.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-28-standard-empty-home-layout.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-29-chat-imports-attached-decks-on-request.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-29-slides-loading-shine-is-more-subtle.md +6 -0
- package/corpus/templates/slides/package.json +3 -0
- package/corpus/templates/slides/public/manifest.json +1 -1
- package/corpus/templates/slides/server/db/schema.ts +1 -0
- package/corpus/templates/slides/server/handlers/google-docs-auth.ts +1 -1
- package/corpus/templates/slides/server/lib/chat-attachments.ts +102 -7
- package/corpus/templates/slides/server/lib/deck-versions.ts +77 -2
- package/corpus/templates/slides/server/plugins/agent-chat.ts +95 -1
- package/corpus/templates/slides/server/plugins/auth.ts +1 -0
- package/corpus/templates/slides/server/plugins/core-routes.ts +8 -1
- package/corpus/templates/slides/server/plugins/db.ts +5 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +4 -0
- package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +47 -0
- package/corpus/templates/tasks/AGENTS.md +2 -1
- package/corpus/templates/tasks/README.md +3 -1
- package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +5 -18
- package/corpus/templates/tasks/app/root.tsx +19 -3
- package/corpus/templates/tasks/app/routes/_index.tsx +28 -14
- package/corpus/templates/tasks/app/routes/home.tsx +24 -0
- package/corpus/templates/tasks/public/manifest.json +1 -1
- package/corpus/templates/tasks/server/plugins/auth.ts +1 -0
- package/dist/a2a/client.d.ts +4 -0
- package/dist/a2a/client.js +15 -2
- package/dist/action.d.ts +3 -1
- package/dist/agent/engine/ai-sdk-engine.js +13 -9
- package/dist/agent/engine/anthropic-engine.js +2 -1
- package/dist/agent/engine/builder-engine.js +23 -5
- package/dist/agent/engine/limit-provider-tools.d.ts +3 -0
- package/dist/agent/engine/limit-provider-tools.js +23 -0
- package/dist/agent/engine/openai-compatible-endpoint.d.ts +2 -0
- package/dist/agent/engine/openai-compatible-endpoint.js +4 -0
- package/dist/agent/engine/output-tokens.d.ts +12 -6
- package/dist/agent/engine/output-tokens.js +42 -16
- package/dist/agent/engine/registry.d.ts +1 -1
- package/dist/agent/engine/registry.js +69 -16
- package/dist/agent/production-agent.js +107 -13
- package/dist/agent/run-manager.d.ts +9 -0
- package/dist/agent/run-manager.js +35 -6
- package/dist/agent/thread-data-builder.d.ts +6 -1
- package/dist/agent/thread-data-builder.js +20 -5
- package/dist/agent/types.d.ts +2 -0
- package/dist/app-config/agent.d.ts +4 -0
- package/dist/app-config/agent.js +44 -0
- package/dist/app-config/integrations.d.ts +1 -0
- package/dist/app-config/integrations.js +8 -0
- package/dist/app-config/migration.d.ts +1 -0
- package/dist/app-config/migration.js +4 -0
- package/dist/app-config/observability.d.ts +4 -1
- package/dist/app-config/observability.js +25 -1
- package/dist/app-config/schema.d.ts +9 -0
- package/dist/app-config/store.js +1 -0
- package/dist/client/AgentAskPopover.d.ts +2 -1
- package/dist/client/AgentAskPopover.js +2 -2
- package/dist/client/AgentPanel.d.ts +35 -10
- package/dist/client/AgentPanel.js +136 -119
- package/dist/client/AssistantChat.d.ts +9 -2
- package/dist/client/AssistantChat.js +161 -36
- package/dist/client/ConnectBuilderCard.js +3 -1
- package/dist/client/DefaultSpinner.d.ts +13 -1
- package/dist/client/DefaultSpinner.js +52 -46
- package/dist/client/FeedbackButton.d.ts +12 -0
- package/dist/client/FeedbackButton.js +62 -28
- package/dist/client/MultiTabAssistantChat.js +30 -11
- package/dist/client/NewWorkspaceAppFlow.js +5 -3
- package/dist/client/agent-chat/index.d.ts +1 -0
- package/dist/client/agent-chat/index.js +1 -0
- package/dist/client/agent-chat-adapter.js +16 -1
- package/dist/client/agent-chat.d.ts +9 -0
- package/dist/client/agent-chat.js +6 -3
- package/dist/client/agent-page/AgentJobsTab.d.ts +2 -1
- package/dist/client/agent-page/AgentJobsTab.js +8 -5
- package/dist/client/agent-page/AgentTabsPage.js +2 -2
- package/dist/client/analytics.d.ts +2 -0
- package/dist/client/analytics.js +86 -15
- package/dist/client/app-providers.js +13 -1
- package/dist/client/auth/AuthPage.d.ts +87 -0
- package/dist/client/auth/AuthPage.js +1847 -0
- package/dist/client/auth/ResetPasswordPage.d.ts +9 -0
- package/dist/client/auth/ResetPasswordPage.js +119 -0
- package/dist/client/auth/entry.d.ts +1 -0
- package/dist/client/auth/entry.js +15 -0
- package/dist/client/chat/message-components.d.ts +53 -0
- package/dist/client/chat/message-components.js +181 -11
- package/dist/client/chat/run-recovery.d.ts +4 -1
- package/dist/client/chat/run-recovery.js +30 -12
- package/dist/client/chat/tool-call-display.d.ts +4 -2
- package/dist/client/chat/tool-call-display.js +16 -11
- package/dist/client/chat-first.js +8 -2
- package/dist/client/chat-model-groups.js +11 -1
- package/dist/client/collab/index.d.ts +1 -1
- package/dist/client/components/CodeRequiredDialog.js +22 -35
- package/dist/client/components/icons/AgentNativeIcon.d.ts +3 -3
- package/dist/client/components/icons/AgentNativeIcon.js +4 -4
- package/dist/client/components/ui/message-scroller.js +1 -1
- package/dist/client/composer/runtime-adapters.js +2 -0
- package/dist/client/feedback-context.d.ts +1 -0
- package/dist/client/feedback-context.js +3 -2
- package/dist/client/host-bridge.d.ts +1 -0
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts +2 -1
- package/dist/client/integrations/IntegrationsPanel.js +3 -3
- package/dist/client/observability/ThumbsFeedback.js +73 -10
- package/dist/client/onboarding/FirstRunOnboarding.js +24 -15
- package/dist/client/onboarding/OnboardingPanel.js +5 -3
- package/dist/client/onboarding/first-run-startup-gate.js +7 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts +2 -1
- package/dist/client/resources/McpIntegrationDialog.js +10 -2
- package/dist/client/session-replay.js +10 -0
- package/dist/client/settings/BuilderConnectPopover.d.ts +25 -0
- package/dist/client/settings/BuilderConnectPopover.js +55 -0
- package/dist/client/settings/SettingsPanel.js +21 -7
- package/dist/client/settings/SettingsTabsPage.d.ts +1 -1
- package/dist/client/settings/SettingsTabsPage.js +42 -25
- package/dist/client/settings/VoiceTranscriptionSection.js +16 -22
- package/dist/client/settings/index.d.ts +1 -0
- package/dist/client/settings/index.js +1 -0
- package/dist/client/settings/useBuilderStatus.d.ts +7 -0
- package/dist/client/settings/useBuilderStatus.js +77 -21
- package/dist/client/setup-connections/BuilderConnectCard.js +2 -1
- package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +3 -1
- package/dist/client/setup-connections/useBuilderConnectCardController.js +4 -2
- package/dist/client/sse-event-processor.js +8 -0
- package/dist/client/terminal/AgentTerminal.js +6 -7
- package/dist/client/transcription/BuilderTranscriptionCta.js +17 -69
- package/dist/client/ui/index.d.ts +1 -0
- package/dist/client/ui/index.js +1 -0
- package/dist/client/use-chat-models.js +5 -4
- package/dist/client/webmcp.d.ts +4 -0
- package/dist/client/webmcp.js +51 -4
- package/dist/collab/client.d.ts +13 -0
- package/dist/collab/client.js +96 -21
- package/dist/dashboard-storage/index.d.ts +1 -1
- package/dist/dashboard-storage/schema.d.ts +19 -0
- package/dist/dashboard-storage/schema.js +1 -0
- package/dist/dashboard-storage/store.d.ts +9 -0
- package/dist/dashboard-storage/store.js +93 -3
- package/dist/deploy/build.d.ts +19 -3
- package/dist/deploy/build.js +262 -10
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/ingestion/media.js +7 -2
- package/dist/integrations/config-store.js +2 -4
- package/dist/integrations/google-docs-poller.d.ts +1 -1
- package/dist/integrations/google-docs-poller.js +100 -24
- package/dist/integrations/plugin.js +45 -15
- package/dist/integrations/webhook-handler.js +2 -1
- package/dist/jobs/background-automation-runner.js +17 -1
- package/dist/localization/core-messages/ar-SA.js +19 -0
- package/dist/localization/core-messages/de-DE.js +19 -0
- package/dist/localization/core-messages/en-US.d.ts +19 -0
- package/dist/localization/core-messages/en-US.js +19 -0
- package/dist/localization/core-messages/es-ES.js +19 -0
- package/dist/localization/core-messages/fr-FR.js +19 -0
- package/dist/localization/core-messages/hi-IN.js +19 -0
- package/dist/localization/core-messages/ja-JP.js +19 -0
- package/dist/localization/core-messages/ko-KR.js +19 -0
- package/dist/localization/core-messages/pt-BR.js +19 -0
- package/dist/localization/core-messages/zh-CN.js +19 -0
- package/dist/localization/core-messages/zh-TW.js +19 -0
- package/dist/localization/core-messages.d.ts +19 -0
- package/dist/localization/default-messages.d.ts +11 -0
- package/dist/localization/default-messages.js +11 -0
- package/dist/mcp/analytics.d.ts +103 -0
- package/dist/mcp/analytics.js +204 -0
- package/dist/mcp/build-server.d.ts +7 -0
- package/dist/mcp/build-server.js +132 -35
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp/server.js +37 -8
- package/dist/mcp/stdio.js +1 -0
- package/dist/mcp-client/errors.js +30 -10
- package/dist/mcp-client/oauth-routes.d.ts +7 -2
- package/dist/mcp-client/oauth-routes.js +12 -3
- package/dist/mcp-client/routes.js +2 -1
- package/dist/oauth-tokens/store.js +6 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/observability/routes.js +8 -2
- package/dist/observability/store.d.ts +1 -1
- package/dist/observability/store.js +18 -3
- package/dist/observability/types.d.ts +1 -0
- package/dist/onboarding/plugin.js +16 -4
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +16 -16
- package/dist/provider-api/actions/provider-api.d.ts +12 -12
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/action-routes.d.ts +1 -6
- package/dist/server/action-routes.js +61 -18
- package/dist/server/agent-chat/plugin-options.d.ts +8 -1
- package/dist/server/agent-chat-plugin.d.ts +3 -0
- package/dist/server/agent-chat-plugin.js +49 -4
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-run-context.d.ts +1 -0
- package/dist/server/agent-run-context.js +6 -0
- package/dist/server/analytics.d.ts +3 -2
- package/dist/server/analytics.js +18 -7
- package/dist/server/app-url.d.ts +5 -2
- package/dist/server/app-url.js +4 -3
- package/dist/server/auth.d.ts +25 -0
- package/dist/server/auth.js +168 -21
- package/dist/server/better-auth-instance.js +18 -4
- package/dist/server/better-auth-migrations.d.ts +14 -0
- package/dist/server/better-auth-migrations.js +5 -1
- package/dist/server/builder-api-auth.js +30 -6
- package/dist/server/builder-browser.d.ts +10 -0
- package/dist/server/builder-browser.js +22 -5
- package/dist/server/builder-design-systems.d.ts +11 -0
- package/dist/server/builder-design-systems.js +52 -3
- package/dist/server/builder-oauth.d.ts +13 -6
- package/dist/server/builder-oauth.js +121 -63
- package/dist/server/capture-error.js +3 -0
- package/dist/server/cookie-namespace.d.ts +1 -0
- package/dist/server/cookie-namespace.js +3 -0
- package/dist/server/core-routes-plugin.d.ts +25 -9
- package/dist/server/core-routes-plugin.js +180 -76
- package/dist/server/credential-provider.js +22 -12
- package/dist/server/email.d.ts +4 -0
- package/dist/server/email.js +13 -5
- package/dist/server/framework-request-handler.js +6 -3
- package/dist/server/google-credential-check.d.ts +7 -3
- package/dist/server/google-credential-check.js +71 -0
- package/dist/server/google-oauth-credentials.d.ts +4 -3
- package/dist/server/google-oauth-credentials.js +7 -8
- package/dist/server/google-oauth.d.ts +9 -4
- package/dist/server/google-oauth.js +14 -93
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/jwks-secret-rotation.d.ts +29 -0
- package/dist/server/jwks-secret-rotation.js +150 -0
- package/dist/server/onboarding-html.d.ts +2 -14
- package/dist/server/onboarding-html.js +254 -2519
- package/dist/server/origin-allowlist.d.ts +15 -0
- package/dist/server/origin-allowlist.js +93 -0
- package/dist/server/release-migrations.js +48 -0
- package/dist/server/request-context.d.ts +2 -0
- package/dist/server/request-context.js +7 -2
- package/dist/server/self-dispatch.js +5 -0
- package/dist/server/sentry.js +5 -0
- package/dist/server/ssr-handler.js +5 -0
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +9 -0
- package/dist/server/workspace-provider-oauth.js +96 -31
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/loading-labels.d.ts +1 -0
- package/dist/shared/loading-labels.js +55 -0
- package/dist/shared/qa-test-email.d.ts +1 -0
- package/dist/shared/qa-test-email.js +42 -0
- package/dist/shared/route-warmup-config.js +2 -2
- package/dist/shared/sign-in-journey.js +1 -1
- package/dist/shared/ssr-auth-redirect.d.ts +8 -0
- package/dist/shared/ssr-auth-redirect.js +56 -0
- package/dist/shared/test-traffic.d.ts +8 -0
- package/dist/shared/test-traffic.js +11 -0
- package/dist/styles/agent-native.css +50 -14
- package/dist/styles/blocks.css +0 -6
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -0
- package/dist/templates/chat/.agents/skills/secrets/SKILL.md +47 -0
- package/dist/templates/chat/AGENTS.md +5 -4
- package/dist/templates/chat/app/components/layout/Header.tsx +1 -1
- package/dist/templates/chat/app/components/layout/Layout.tsx +5 -4
- package/dist/templates/chat/app/components/layout/Sidebar.tsx +16 -25
- package/dist/templates/chat/app/hooks/use-navigation-state.ts +5 -5
- package/dist/templates/chat/app/root.tsx +16 -3
- package/dist/templates/chat/app/routes/_index.tsx +17 -74
- package/dist/templates/chat/app/routes/chat.$threadId.tsx +1 -1
- package/dist/templates/chat/app/routes/home.tsx +94 -0
- package/dist/templates/chat/netlify.toml +2 -1
- package/dist/templates/chat/public/manifest.json +1 -1
- package/dist/templates/chat/server/plugins/auth.ts +1 -0
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +4 -0
- package/dist/templates/default/.agents/skills/secrets/SKILL.md +47 -0
- package/dist/templates/default/AGENTS.md +10 -6
- package/dist/templates/default/DEVELOPING.md +8 -1
- package/dist/templates/default/app/hooks/use-navigation-state.ts +1 -1
- package/dist/templates/default/app/root.tsx +10 -3
- package/dist/templates/default/app/routes/_index.tsx +10 -86
- package/dist/templates/default/app/routes/home.tsx +94 -0
- package/dist/templates/default/app/routes/settings.tsx +1 -1
- package/dist/templates/default/public/manifest.json +1 -1
- package/dist/templates/default/server/plugins/auth.ts +5 -0
- package/dist/templates/headless/.agents/skills/secrets/SKILL.md +47 -0
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +47 -0
- package/dist/templates/workspace-root/.env.example +3 -2
- package/dist/terminal/pty-server.d.ts +2 -0
- package/dist/terminal/pty-server.js +22 -5
- package/dist/tracking/registry.d.ts +1 -0
- package/dist/tracking/registry.js +12 -0
- package/dist/usage/store.d.ts +1 -0
- package/dist/usage/store.js +16 -7
- package/dist/vite/client.d.ts +1 -1
- package/dist/vite/client.js +59 -0
- package/dist/workspace-connections/index.d.ts +1 -1
- package/dist/workspace-connections/index.js +1 -1
- package/dist/workspace-connections/store.d.ts +1 -0
- package/dist/workspace-connections/store.js +4 -0
- package/docs/content/aws-amplify.mdx +179 -0
- package/docs/content/client-agent-chat.mdx +1 -1
- package/docs/content/deploy-an-app.mdx +2 -1
- package/docs/content/deployment.mdx +14 -3
- package/docs/content/environment-variables.mdx +1 -0
- package/docs/content/template-forms-agent.mdx +65 -0
- package/docs/content/template-forms-developers.mdx +220 -65
- package/docs/content/template-forms-features.mdx +154 -0
- package/docs/content/template-forms-integrations.mdx +40 -0
- package/docs/content/template-forms.mdx +49 -36
- package/docs/content/template-mail-developers.mdx +3 -3
- package/docs/content/toolkit-settings.mdx +3 -3
- package/docs/content/webmcp.mdx +31 -12
- package/package.json +3 -3
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -0
- package/src/templates/chat/.agents/skills/secrets/SKILL.md +47 -0
- package/src/templates/chat/AGENTS.md +5 -4
- package/src/templates/chat/app/components/layout/Header.tsx +1 -1
- package/src/templates/chat/app/components/layout/Layout.tsx +5 -4
- package/src/templates/chat/app/components/layout/Sidebar.tsx +16 -25
- package/src/templates/chat/app/hooks/use-navigation-state.ts +5 -5
- package/src/templates/chat/app/root.tsx +16 -3
- package/src/templates/chat/app/routes/_index.tsx +17 -74
- package/src/templates/chat/app/routes/chat.$threadId.tsx +1 -1
- package/src/templates/chat/app/routes/home.tsx +94 -0
- package/src/templates/chat/netlify.toml +2 -1
- package/src/templates/chat/public/manifest.json +1 -1
- package/src/templates/chat/server/plugins/auth.ts +1 -0
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +4 -0
- package/src/templates/default/.agents/skills/secrets/SKILL.md +47 -0
- package/src/templates/default/AGENTS.md +10 -6
- package/src/templates/default/DEVELOPING.md +8 -1
- package/src/templates/default/app/hooks/use-navigation-state.ts +1 -1
- package/src/templates/default/app/root.tsx +10 -3
- package/src/templates/default/app/routes/_index.tsx +10 -86
- package/src/templates/default/app/routes/home.tsx +94 -0
- package/src/templates/default/app/routes/settings.tsx +1 -1
- package/src/templates/default/public/manifest.json +1 -1
- package/src/templates/default/server/plugins/auth.ts +5 -0
- package/src/templates/headless/.agents/skills/secrets/SKILL.md +47 -0
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -0
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +47 -0
- package/src/templates/workspace-root/.env.example +3 -2
- package/corpus/templates/factory/actions/approve-factory-item.ts +0 -244
- package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +0 -33
- package/corpus/templates/factory/server/routes/_agent-native/factory/builder-callback.post.ts +0 -116
- package/corpus/templates/factory/server/triage/ai-services-git.ts +0 -205
- package/corpus/templates/factory/server/triage/builder-executor.ts +0 -123
- package/docs/content/template-forms-building-publishing.mdx +0 -135
- package/docs/content/template-forms-responses.mdx +0 -120
- /package/corpus/templates/clips/{server/lib → shared}/upload-interruption.ts +0 -0
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
createAgentChatPlugin,
|
|
4
4
|
loadActionsFromStaticRegistry,
|
|
5
5
|
} from "@agent-native/core/server";
|
|
6
|
+
import { eq } from "drizzle-orm";
|
|
6
7
|
|
|
7
8
|
import actionsRegistry from "../../.generated/actions-registry.js";
|
|
8
9
|
import { designFinalResponseGuard } from "../lib/design-response-guard.js";
|
|
@@ -50,8 +51,151 @@ const INITIAL_TOOL_NAMES = [
|
|
|
50
51
|
"provider-api-request",
|
|
51
52
|
];
|
|
52
53
|
|
|
54
|
+
const DESIGN_EDIT_TOOLS = new Set([
|
|
55
|
+
"add-breakpoint",
|
|
56
|
+
"add-localhost-screens",
|
|
57
|
+
"apply-a11y-fix",
|
|
58
|
+
"apply-component-prop-edit",
|
|
59
|
+
"apply-design-token-edit",
|
|
60
|
+
"apply-motion-edit",
|
|
61
|
+
"apply-shader-fill",
|
|
62
|
+
"apply-tweaks",
|
|
63
|
+
"apply-visual-edit",
|
|
64
|
+
"create-file",
|
|
65
|
+
"detach-component-instance",
|
|
66
|
+
"delete-file",
|
|
67
|
+
"edit-design",
|
|
68
|
+
"generate-design",
|
|
69
|
+
"hydrate-figma-paste-images",
|
|
70
|
+
"insert-asset",
|
|
71
|
+
"insert-design-native-asset",
|
|
72
|
+
"remove-breakpoint",
|
|
73
|
+
"remove-motion-timeline",
|
|
74
|
+
"swap-component-instance",
|
|
75
|
+
"update-design",
|
|
76
|
+
"update-file",
|
|
77
|
+
]);
|
|
78
|
+
|
|
79
|
+
const DESIGN_FILE_TARGET_TOOLS = new Set([
|
|
80
|
+
"apply-a11y-fix",
|
|
81
|
+
"apply-component-prop-edit",
|
|
82
|
+
"apply-motion-edit",
|
|
83
|
+
"apply-shader-fill",
|
|
84
|
+
"apply-visual-edit",
|
|
85
|
+
"delete-file",
|
|
86
|
+
"detach-component-instance",
|
|
87
|
+
"edit-design",
|
|
88
|
+
"hydrate-figma-paste-images",
|
|
89
|
+
"insert-asset",
|
|
90
|
+
"insert-design-native-asset",
|
|
91
|
+
"remove-motion-timeline",
|
|
92
|
+
"swap-component-instance",
|
|
93
|
+
"update-file",
|
|
94
|
+
]);
|
|
95
|
+
|
|
96
|
+
function eventRecord(entry: unknown): Record<string, unknown> | undefined {
|
|
97
|
+
if (!entry || typeof entry !== "object") return undefined;
|
|
98
|
+
const event = (entry as { event?: unknown }).event;
|
|
99
|
+
return event && typeof event === "object"
|
|
100
|
+
? (event as Record<string, unknown>)
|
|
101
|
+
: undefined;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function inputForCompletedTool(
|
|
105
|
+
events: readonly unknown[],
|
|
106
|
+
index: number,
|
|
107
|
+
completed: Record<string, unknown>,
|
|
108
|
+
): Record<string, unknown> | undefined {
|
|
109
|
+
if (completed.input && typeof completed.input === "object") {
|
|
110
|
+
return completed.input as Record<string, unknown>;
|
|
111
|
+
}
|
|
112
|
+
const id = typeof completed.id === "string" ? completed.id : undefined;
|
|
113
|
+
for (let cursor = index - 1; cursor >= 0; cursor -= 1) {
|
|
114
|
+
const candidate = eventRecord(events[cursor]);
|
|
115
|
+
if (
|
|
116
|
+
candidate?.type !== "tool_start" ||
|
|
117
|
+
candidate.tool !== completed.tool ||
|
|
118
|
+
(id && candidate.id !== id)
|
|
119
|
+
) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
return candidate.input && typeof candidate.input === "object"
|
|
123
|
+
? (candidate.input as Record<string, unknown>)
|
|
124
|
+
: undefined;
|
|
125
|
+
}
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function fileDesignId(fileId: string): Promise<string | undefined> {
|
|
130
|
+
const { getDb, schema } = await import("../db/index.js");
|
|
131
|
+
const [file] = await getDb()
|
|
132
|
+
.select({ designId: schema.designFiles.designId })
|
|
133
|
+
.from(schema.designFiles)
|
|
134
|
+
.where(eq(schema.designFiles.id, fileId))
|
|
135
|
+
.limit(1);
|
|
136
|
+
return file?.designId;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function designIdForTool(
|
|
140
|
+
tool: string,
|
|
141
|
+
input: Record<string, unknown> | undefined,
|
|
142
|
+
): Promise<string | undefined> {
|
|
143
|
+
if (typeof input?.designId === "string") return input.designId;
|
|
144
|
+
if (!DESIGN_FILE_TARGET_TOOLS.has(tool)) return undefined;
|
|
145
|
+
const fileId =
|
|
146
|
+
tool === "delete-file" || tool === "update-file"
|
|
147
|
+
? input?.id
|
|
148
|
+
: input?.fileId;
|
|
149
|
+
return typeof fileId === "string" ? fileDesignId(fileId) : undefined;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async function hasDesignEdit(
|
|
153
|
+
run: { events: readonly unknown[] },
|
|
154
|
+
designId: string,
|
|
155
|
+
): Promise<boolean> {
|
|
156
|
+
for (const [index, entry] of run.events.entries()) {
|
|
157
|
+
const record = eventRecord(entry);
|
|
158
|
+
if (
|
|
159
|
+
record?.type !== "tool_done" ||
|
|
160
|
+
record.completedSideEffect !== true ||
|
|
161
|
+
record.isError === true ||
|
|
162
|
+
typeof record.tool !== "string" ||
|
|
163
|
+
!DESIGN_EDIT_TOOLS.has(record.tool)
|
|
164
|
+
) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const input = inputForCompletedTool(run.events, index, record);
|
|
168
|
+
if ((await designIdForTool(record.tool, input)) === designId) return true;
|
|
169
|
+
}
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function autosaveDesignAfterAgentTurn(
|
|
174
|
+
scope: { type: string; id: string },
|
|
175
|
+
run: {
|
|
176
|
+
events: readonly unknown[];
|
|
177
|
+
threadId?: string;
|
|
178
|
+
runId?: string;
|
|
179
|
+
turnId?: string;
|
|
180
|
+
},
|
|
181
|
+
): Promise<void> {
|
|
182
|
+
if (scope.type !== "design" || !(await hasDesignEdit(run, scope.id))) return;
|
|
183
|
+
|
|
184
|
+
const { createDesignVersionSnapshot } =
|
|
185
|
+
await import("../lib/design-versions.js");
|
|
186
|
+
await createDesignVersionSnapshot(scope.id, {
|
|
187
|
+
label: "Chat autosave",
|
|
188
|
+
chatContext: {
|
|
189
|
+
...(run.threadId ? { threadId: run.threadId } : {}),
|
|
190
|
+
...(run.runId ? { runId: run.runId } : {}),
|
|
191
|
+
...(run.turnId ? { turnId: run.turnId } : {}),
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
53
196
|
export default createAgentChatPlugin({
|
|
54
197
|
appId: "design",
|
|
198
|
+
onAgentTurnComplete: autosaveDesignAfterAgentTurn,
|
|
55
199
|
actions: guardRepromptActionRegistry(
|
|
56
200
|
loadActionsFromStaticRegistry(actionsRegistry),
|
|
57
201
|
),
|
|
@@ -5,7 +5,7 @@ export default createAuthPlugin({
|
|
|
5
5
|
// Visual-edit, public design editor links, and presentation links can load
|
|
6
6
|
// without a session. Creating, mutating, generating, and sharing designs
|
|
7
7
|
// still go through authenticated actions.
|
|
8
|
-
workspaceAppPublicPaths: ["/visual-edit", "/design", "/present"],
|
|
8
|
+
workspaceAppPublicPaths: ["/", "/visual-edit", "/design", "/present"],
|
|
9
9
|
marketing: {
|
|
10
10
|
appName: "Design",
|
|
11
11
|
tagline:
|
|
@@ -8,12 +8,13 @@ import { createCoreRoutesPlugin } from "@agent-native/core/server";
|
|
|
8
8
|
// editor route is `design.$id.tsx` → `/design/:id`) and 404s — so an
|
|
9
9
|
// "Open in Design" link for a connected external agent never opened the design.
|
|
10
10
|
export default createCoreRoutesPlugin({
|
|
11
|
+
googleOAuthManagedConnection: "not_applicable",
|
|
11
12
|
resolveOpenPath: ({ view, params }) => {
|
|
12
13
|
if (params.designId) return `/design/${params.designId}`;
|
|
13
14
|
// `editor`/unknown with no id: there is no bare `/editor` route — send to
|
|
14
|
-
// the app
|
|
15
|
+
// the private app entry rather than 404 (the polled `navigate` command still
|
|
15
16
|
// applies any record focus once the SPA is loaded).
|
|
16
|
-
if (view === "editor") return "/";
|
|
17
|
+
if (view === "editor") return "/home";
|
|
17
18
|
return null;
|
|
18
19
|
},
|
|
19
20
|
allowUnauthenticatedOpen: ({ target }) => {
|
|
@@ -390,6 +390,13 @@ CREATE INDEX IF NOT EXISTS design_template_files_template_idx ON design_template
|
|
|
390
390
|
sql: `CREATE INDEX IF NOT EXISTS design_files_design_type_idx ON design_files (design_id, file_type);
|
|
391
391
|
CREATE INDEX IF NOT EXISTS designs_normalized_owner_org_updated_idx ON designs (lower(trim(owner_email)), org_id, updated_at)`,
|
|
392
392
|
},
|
|
393
|
+
{
|
|
394
|
+
version: 25,
|
|
395
|
+
name: "design-version-chat-metadata",
|
|
396
|
+
sql: `ALTER TABLE design_versions ADD COLUMN IF NOT EXISTS chat_context TEXT;
|
|
397
|
+
ALTER TABLE design_versions ADD COLUMN IF NOT EXISTS file_count INTEGER;
|
|
398
|
+
CREATE INDEX IF NOT EXISTS design_versions_design_created_idx ON design_versions (design_id, created_at)`,
|
|
399
|
+
},
|
|
393
400
|
],
|
|
394
401
|
{ table: "design_migrations" },
|
|
395
402
|
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { designSystemBuilderLink as default } from "../../handlers/design-system-builder-link";
|
|
@@ -75,8 +75,10 @@ export interface CanvasSnapOptions {
|
|
|
75
75
|
export type SpacingSnapOptions = CanvasSnapOptions;
|
|
76
76
|
|
|
77
77
|
export interface DragSnapOptions extends CanvasSnapOptions {
|
|
78
|
-
/**
|
|
79
|
-
|
|
78
|
+
/** Grid step to land on: `WHOLE_PIXEL_SNAP_STEP` for Figma's "snap to pixel
|
|
79
|
+
* grid", the frame's layout grid size when it has one. Omitted means the
|
|
80
|
+
* caller wants the raw snapped position and will quantize itself. */
|
|
81
|
+
snapStep?: number;
|
|
80
82
|
/** How far a neighbour can be, in screen px, and still get a distance
|
|
81
83
|
* readout. Beyond this the measurement is noise stretched across empty
|
|
82
84
|
* canvas rather than something the user is positioning against. */
|
|
@@ -113,6 +115,8 @@ export interface ResizeSnapOptions extends CanvasSnapOptions {
|
|
|
113
115
|
* a snap near a sibling edge doesn't force-inflate a small shape. */
|
|
114
116
|
minWidth?: number;
|
|
115
117
|
minHeight?: number;
|
|
118
|
+
/** The resize counterpart of `DragSnapOptions.snapStep`. */
|
|
119
|
+
snapStep?: number;
|
|
116
120
|
}
|
|
117
121
|
|
|
118
122
|
export interface ResizeFrameOptions {
|
|
@@ -221,6 +225,18 @@ export interface RulerTickOptions {
|
|
|
221
225
|
maxTicks?: number;
|
|
222
226
|
}
|
|
223
227
|
|
|
228
|
+
/** The one step the editor is built around: a new frame's layout grid, the snap
|
|
229
|
+
* that grid enforces, and the big nudge are all this number, so a big nudge can
|
|
230
|
+
* never walk an object off the grid it just snapped to. */
|
|
231
|
+
export const DEFAULT_GRID_STEP_PX = 8;
|
|
232
|
+
|
|
233
|
+
/** Snapping's floor. A frame with no layout grid still lands on whole pixels,
|
|
234
|
+
* so "no grid" is a size-1 grid and the snap stack needs no on/off branch. */
|
|
235
|
+
export const WHOLE_PIXEL_SNAP_STEP = 1;
|
|
236
|
+
|
|
237
|
+
export const DEFAULT_SMALL_NUDGE_PX = 1;
|
|
238
|
+
export const DEFAULT_BIG_NUDGE_PX = DEFAULT_GRID_STEP_PX;
|
|
239
|
+
|
|
224
240
|
export type ArrowNudgeKey =
|
|
225
241
|
| "ArrowUp"
|
|
226
242
|
| "ArrowRight"
|
|
@@ -236,7 +252,7 @@ export interface NudgeModifiers {
|
|
|
236
252
|
|
|
237
253
|
export interface NudgeOptions {
|
|
238
254
|
baseStep?: number;
|
|
239
|
-
|
|
255
|
+
bigStep?: number;
|
|
240
256
|
}
|
|
241
257
|
|
|
242
258
|
export interface NudgeDelta {
|
|
@@ -574,9 +590,12 @@ export function shouldShowPixelGrid(
|
|
|
574
590
|
export function getNudgeDelta(
|
|
575
591
|
key: ArrowNudgeKey,
|
|
576
592
|
modifiers: NudgeModifiers = {},
|
|
577
|
-
{
|
|
593
|
+
{
|
|
594
|
+
baseStep = DEFAULT_SMALL_NUDGE_PX,
|
|
595
|
+
bigStep = DEFAULT_BIG_NUDGE_PX,
|
|
596
|
+
}: NudgeOptions = {},
|
|
578
597
|
): NudgeDelta {
|
|
579
|
-
const step =
|
|
598
|
+
const step = modifiers.shiftKey ? bigStep : baseStep;
|
|
580
599
|
const vector = getNudgeVector(key);
|
|
581
600
|
const bypass = !!(modifiers.altKey || modifiers.metaKey || modifiers.ctrlKey);
|
|
582
601
|
|
|
@@ -591,6 +610,43 @@ export function getNudgeDelta(
|
|
|
591
610
|
};
|
|
592
611
|
}
|
|
593
612
|
|
|
613
|
+
/** Nearest multiple of `step`, defaulting to the whole-pixel floor. Non-finite
|
|
614
|
+
* input passes through unrounded so an upstream NaN stays visible rather than
|
|
615
|
+
* reading as a real coordinate. */
|
|
616
|
+
export function quantizeToStep(
|
|
617
|
+
value: number,
|
|
618
|
+
step: number = WHOLE_PIXEL_SNAP_STEP,
|
|
619
|
+
): number {
|
|
620
|
+
if (!Number.isFinite(value)) return value;
|
|
621
|
+
if (!Number.isFinite(step) || step <= WHOLE_PIXEL_SNAP_STEP) {
|
|
622
|
+
return Math.round(value);
|
|
623
|
+
}
|
|
624
|
+
return Math.round(value / step) * step;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
export function quantizeCanvasPoint(
|
|
628
|
+
point: CanvasPoint,
|
|
629
|
+
step: number = WHOLE_PIXEL_SNAP_STEP,
|
|
630
|
+
): CanvasPoint {
|
|
631
|
+
return {
|
|
632
|
+
x: quantizeToStep(point.x, step),
|
|
633
|
+
y: quantizeToStep(point.y, step),
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/** Whole-pixel x/y/width/height. Size rounds alongside position because a
|
|
638
|
+
* fractional width puts the opposite edge back on a fraction, and the next
|
|
639
|
+
* object aligned or resized against that edge inherits it. */
|
|
640
|
+
function quantizeCanvasGeometry<T extends FrameGeometry>(geometry: T): T {
|
|
641
|
+
return {
|
|
642
|
+
...geometry,
|
|
643
|
+
x: quantizeToStep(geometry.x),
|
|
644
|
+
y: quantizeToStep(geometry.y),
|
|
645
|
+
width: quantizeToStep(geometry.width),
|
|
646
|
+
height: quantizeToStep(geometry.height),
|
|
647
|
+
};
|
|
648
|
+
}
|
|
649
|
+
|
|
594
650
|
export function getDraftGeometryFromPoints(
|
|
595
651
|
start: CanvasPoint,
|
|
596
652
|
end: CanvasPoint,
|
|
@@ -637,23 +693,23 @@ export function getDraftGeometryFromPoints(
|
|
|
637
693
|
if (fromCenter) {
|
|
638
694
|
// `start` is the shape's center — grow outward symmetrically in both
|
|
639
695
|
// directions instead of anchoring one corner at `start`.
|
|
640
|
-
return {
|
|
696
|
+
return quantizeCanvasGeometry({
|
|
641
697
|
x: start.x - width / 2,
|
|
642
698
|
y: start.y - height / 2,
|
|
643
699
|
width,
|
|
644
700
|
height,
|
|
645
|
-
};
|
|
701
|
+
});
|
|
646
702
|
}
|
|
647
703
|
|
|
648
704
|
const drawingLeft = end.x < start.x;
|
|
649
705
|
const drawingUp = end.y < start.y;
|
|
650
706
|
|
|
651
|
-
return {
|
|
707
|
+
return quantizeCanvasGeometry({
|
|
652
708
|
x: drawingLeft ? start.x - width : start.x,
|
|
653
709
|
y: drawingUp ? start.y - height : start.y,
|
|
654
710
|
width,
|
|
655
711
|
height,
|
|
656
|
-
};
|
|
712
|
+
});
|
|
657
713
|
}
|
|
658
714
|
|
|
659
715
|
export function appendPolylinePoint(
|
|
@@ -884,7 +940,8 @@ export function computeDragSnap(
|
|
|
884
940
|
let dy = alignment.dy + spacing.dy;
|
|
885
941
|
|
|
886
942
|
const anchor = moving[0];
|
|
887
|
-
|
|
943
|
+
const snapStep = options.snapStep ?? 0;
|
|
944
|
+
if (snapStep > 0 && anchor && !options.bypass) {
|
|
888
945
|
// Keyed on what actually moved the frame, not on what got drawn: a
|
|
889
946
|
// spacing snap that produced no chrome is still a position the user
|
|
890
947
|
// chose, and rounding it away undoes the snap they just felt.
|
|
@@ -897,10 +954,10 @@ export function computeDragSnap(
|
|
|
897
954
|
// Only the anchor rounds; the rest of a multi-select rides the same
|
|
898
955
|
// delta, so a group keeps its internal fractional offsets.
|
|
899
956
|
if (!claimed("vertical") && !options.lockedAxes?.x) {
|
|
900
|
-
dx =
|
|
957
|
+
dx = quantizeToStep(anchor.geometry.x + dx, snapStep) - anchor.geometry.x;
|
|
901
958
|
}
|
|
902
959
|
if (!claimed("horizontal") && !options.lockedAxes?.y) {
|
|
903
|
-
dy =
|
|
960
|
+
dy = quantizeToStep(anchor.geometry.y + dy, snapStep) - anchor.geometry.y;
|
|
904
961
|
}
|
|
905
962
|
}
|
|
906
963
|
|
|
@@ -1782,13 +1839,17 @@ export function computeResizeSnap(
|
|
|
1782
1839
|
};
|
|
1783
1840
|
|
|
1784
1841
|
if (options.preserveAspectRatio) {
|
|
1785
|
-
|
|
1842
|
+
const aspect = computeAspectPreservingResizeSnap(
|
|
1786
1843
|
frame,
|
|
1787
1844
|
stationary,
|
|
1788
1845
|
handle,
|
|
1789
1846
|
threshold,
|
|
1790
1847
|
minSize,
|
|
1791
1848
|
);
|
|
1849
|
+
return {
|
|
1850
|
+
frame: applyResizeSnapStep(aspect.frame, aspect.guides, options, true),
|
|
1851
|
+
guides: aspect.guides,
|
|
1852
|
+
};
|
|
1792
1853
|
}
|
|
1793
1854
|
|
|
1794
1855
|
let nextFrame = frame;
|
|
@@ -1834,7 +1895,38 @@ export function computeResizeSnap(
|
|
|
1834
1895
|
}
|
|
1835
1896
|
}
|
|
1836
1897
|
|
|
1837
|
-
return {
|
|
1898
|
+
return {
|
|
1899
|
+
frame: applyResizeSnapStep(nextFrame, guides, options, false),
|
|
1900
|
+
guides,
|
|
1901
|
+
};
|
|
1902
|
+
}
|
|
1903
|
+
|
|
1904
|
+
/** Skips any axis an alignment guide claimed, which would pull the edge off the
|
|
1905
|
+
* line the user is looking at. An aspect-locked resize quantizes only its
|
|
1906
|
+
* origin: rounding both sizes is what breaks the ratio it must hold. */
|
|
1907
|
+
function applyResizeSnapStep(
|
|
1908
|
+
frame: FrameGeometry,
|
|
1909
|
+
guides: readonly AlignmentGuide[],
|
|
1910
|
+
options: ResizeSnapOptions,
|
|
1911
|
+
aspectLocked: boolean,
|
|
1912
|
+
): FrameGeometry {
|
|
1913
|
+
const step = options.snapStep ?? 0;
|
|
1914
|
+
if (step <= 0) return frame;
|
|
1915
|
+
const claimedX = guides.some((guide) => guide.orientation === "vertical");
|
|
1916
|
+
const claimedY = guides.some((guide) => guide.orientation === "horizontal");
|
|
1917
|
+
return {
|
|
1918
|
+
...frame,
|
|
1919
|
+
x: claimedX ? frame.x : quantizeToStep(frame.x, step),
|
|
1920
|
+
y: claimedY ? frame.y : quantizeToStep(frame.y, step),
|
|
1921
|
+
width:
|
|
1922
|
+
claimedX || aspectLocked
|
|
1923
|
+
? frame.width
|
|
1924
|
+
: quantizeToStep(frame.width, step),
|
|
1925
|
+
height:
|
|
1926
|
+
claimedY || aspectLocked
|
|
1927
|
+
? frame.height
|
|
1928
|
+
: quantizeToStep(frame.height, step),
|
|
1929
|
+
};
|
|
1838
1930
|
}
|
|
1839
1931
|
|
|
1840
1932
|
// ---------------------------------------------------------------------------
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_GRID_STEP_PX,
|
|
3
|
+
WHOLE_PIXEL_SNAP_STEP,
|
|
4
|
+
quantizeToStep,
|
|
5
|
+
} from "./canvas-math";
|
|
6
|
+
|
|
7
|
+
/** A frame's own grid, not a global setting: one screen can lay out on 8px
|
|
8
|
+
* while its neighbour does not. `kind` has one value so Figma's `columns` and
|
|
9
|
+
* `rows` arrive as variants rather than a rewrite of every reader. */
|
|
10
|
+
export interface LayoutGrid {
|
|
11
|
+
kind: "uniform";
|
|
12
|
+
/** Cell edge in canvas px. Positions inside the frame snap to multiples. */
|
|
13
|
+
size: number;
|
|
14
|
+
/** Whether the lines are drawn. Snapping does not depend on this — in Figma
|
|
15
|
+
* the grid's existence is the opt-in, and hiding it only hides the lines. */
|
|
16
|
+
visible: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type LayoutGridById = Record<string, LayoutGrid>;
|
|
20
|
+
|
|
21
|
+
export const MIN_LAYOUT_GRID_SIZE = 1;
|
|
22
|
+
export const MAX_LAYOUT_GRID_SIZE = 1000;
|
|
23
|
+
|
|
24
|
+
export const DEFAULT_LAYOUT_GRID: LayoutGrid = {
|
|
25
|
+
kind: "uniform",
|
|
26
|
+
size: DEFAULT_GRID_STEP_PX,
|
|
27
|
+
visible: true,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export function normalizeLayoutGridSize(
|
|
31
|
+
value: unknown,
|
|
32
|
+
fallback = DEFAULT_LAYOUT_GRID.size,
|
|
33
|
+
): number {
|
|
34
|
+
const parsed = typeof value === "string" ? Number(value) : value;
|
|
35
|
+
if (typeof parsed !== "number" || !Number.isFinite(parsed)) return fallback;
|
|
36
|
+
return Math.min(
|
|
37
|
+
MAX_LAYOUT_GRID_SIZE,
|
|
38
|
+
Math.max(MIN_LAYOUT_GRID_SIZE, quantizeToStep(parsed)),
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Absent and malformed are both "this frame has no grid" — the caller then
|
|
43
|
+
* falls back to whole pixels, which is the same thing a size-1 grid does. */
|
|
44
|
+
export function parseLayoutGrid(value: unknown): LayoutGrid | null {
|
|
45
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
46
|
+
const raw = value as Record<string, unknown>;
|
|
47
|
+
if (raw.kind !== undefined && raw.kind !== "uniform") return null;
|
|
48
|
+
const size = raw.size;
|
|
49
|
+
if (typeof size !== "number" || !Number.isFinite(size)) return null;
|
|
50
|
+
return {
|
|
51
|
+
kind: "uniform",
|
|
52
|
+
size: normalizeLayoutGridSize(size),
|
|
53
|
+
visible: raw.visible !== false,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function parseLayoutGridById(value: unknown): LayoutGridById {
|
|
58
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
59
|
+
const grids: LayoutGridById = {};
|
|
60
|
+
for (const [frameId, raw] of Object.entries(
|
|
61
|
+
value as Record<string, unknown>,
|
|
62
|
+
)) {
|
|
63
|
+
const grid = parseLayoutGrid(raw);
|
|
64
|
+
if (grid) grids[frameId] = grid;
|
|
65
|
+
}
|
|
66
|
+
return grids;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The step a gesture inside `frameId` quantizes to. No grid still returns 1,
|
|
70
|
+
* so the snap stack has one path instead of an on/off branch. `frameId` is the
|
|
71
|
+
* *container* whose grid applies: a screen dragged on the board has none. */
|
|
72
|
+
export function resolveLayoutGridSnapStep(
|
|
73
|
+
grids: LayoutGridById,
|
|
74
|
+
frameId: string | null | undefined,
|
|
75
|
+
): number {
|
|
76
|
+
if (!frameId) return WHOLE_PIXEL_SNAP_STEP;
|
|
77
|
+
const grid = grids[frameId];
|
|
78
|
+
if (!grid) return WHOLE_PIXEL_SNAP_STEP;
|
|
79
|
+
return Math.max(WHOLE_PIXEL_SNAP_STEP, grid.size);
|
|
80
|
+
}
|
|
@@ -68,6 +68,10 @@ is the target: a surface full of information and nearly empty of narration. So
|
|
|
68
68
|
"make it minimal" is never satisfied by removing data or by burying it behind
|
|
69
69
|
extra clicks, and never blocked by deleting a sentence.
|
|
70
70
|
|
|
71
|
+
Keep on-screen text and badging minimal: show the shortest label needed for the
|
|
72
|
+
next action, remove decorative or duplicate status chips, and put context in a
|
|
73
|
+
tooltip or progressive disclosure when it is not needed to decide.
|
|
74
|
+
|
|
71
75
|
Do not add, unless asked:
|
|
72
76
|
|
|
73
77
|
- A page title that repeats the nav item or route the user just clicked, or a
|
|
@@ -31,6 +31,53 @@ standard workspace connections and org/workspace vault scopes; never put them
|
|
|
31
31
|
in `.env` or deployment environment variables, and never add a provider-specific
|
|
32
32
|
action or startup bootstrap just to write a credential for one organization.
|
|
33
33
|
|
|
34
|
+
## Google OAuth triage
|
|
35
|
+
|
|
36
|
+
| Observation | Meaning | Next action |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| `invalid_grant` from a deliberately fake code | Google accepted the client pair and rejected only the code | Do not rotate credentials; check flow state and callback registration |
|
|
39
|
+
| `invalid_client` | Google rejected the client id/secret pair | Verify the exact pair and deployment source before rotating |
|
|
40
|
+
| `redirect_uri_mismatch` | The client, host, callback path, and Google registration disagree | Compare that exact tuple in Google Cloud Console; publish a new deploy if site-scoped or build-time configuration changes |
|
|
41
|
+
|
|
42
|
+
Do not reason about this from memory. The probe checks both contracts: the
|
|
43
|
+
unqualified `/health/google` endpoint reports the sign-in contract, while
|
|
44
|
+
`/health/google?client=managed` reports deployment-level managed OAuth. It asks
|
|
45
|
+
Google directly whether each live `(client_id, redirect_uri)` pair is
|
|
46
|
+
registered:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pnpm check:google-redirect-uris -- --env all
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The sign-in health path calls `checkGoogleSignInCredential()`, which prefers
|
|
53
|
+
the active Better Auth pair and otherwise uses `resolveGoogleSignInCredentials()`
|
|
54
|
+
from `packages/core/src/server/google-oauth-credentials.ts`. Managed health
|
|
55
|
+
calls `checkGoogleManagedCredential()`, which resolves
|
|
56
|
+
`["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET"]` through `resolveSecretPair()` in
|
|
57
|
+
`packages/core/src/server/credential-provider.ts`. App provider handlers use
|
|
58
|
+
`resolveGoogleProviderCredentialCandidatesWithReader()` with `resolveSecret`
|
|
59
|
+
under request context. These are separate flows and can intentionally land on
|
|
60
|
+
different Google clients, so a clean result for one says nothing about the
|
|
61
|
+
other. Read both contracts before changing anything:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
curl -s https://HOST/_agent-native/health/google | jq '{clientId,mismatchedPairs,credentialSource}'
|
|
65
|
+
curl -s "https://HOST/_agent-native/health/google?client=managed" | jq '{clientId,mismatchedPairs,credentialSource}'
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Different `clientId` values across those two, or `mismatchedPairs: true`, is a
|
|
69
|
+
divergence to understand, not damage to undo. Never repair it by rotating a
|
|
70
|
+
secret: writing a fresh value into whichever namespace the failing flow does
|
|
71
|
+
not read verifies clean and changes nothing. Do not collapse the namespaces
|
|
72
|
+
without first confirming which flow uses which client; separate sign-in and
|
|
73
|
+
managed clients on one host can be deliberate. For prebuilt Netlify deploys,
|
|
74
|
+
uploaded Functions read site-scoped secrets at runtime, and the health route
|
|
75
|
+
resolves them per request. The build may receive masked placeholder values.
|
|
76
|
+
After changing a site-scoped env var, publish a new deploy before verifying
|
|
77
|
+
live behavior. Call it a rebuild when the changed value is baked into build
|
|
78
|
+
output or static assets; a runtime-only secret does not need to be baked into
|
|
79
|
+
the bundle.
|
|
80
|
+
|
|
34
81
|
## Credential Modeling Preflight
|
|
35
82
|
|
|
36
83
|
Before registering a provider's fields, inspect the workspace/provider connection
|
|
@@ -31,22 +31,16 @@ Read the relevant skill before deeper work:
|
|
|
31
31
|
widen app access.
|
|
32
32
|
- Use `view-screen` when the current integration, resource, approval, route, or
|
|
33
33
|
setup item is unclear.
|
|
34
|
-
- Use `import-agent`
|
|
35
|
-
|
|
36
|
-
- Use `import-agent-pack` for a Claude Project/Cowork-style folder. It keeps the
|
|
37
|
-
runnable profile at `agents/<slug>.md` and stores text references, context,
|
|
38
|
-
and agent-owned skills below `agents/<slug>/`. Use `list-agent-pack` to
|
|
39
|
-
inspect the files and the shared agent pack UI to edit them.
|
|
34
|
+
- Use `import-agent` or `import-agent-pack` for safe agent profile and pack
|
|
35
|
+
imports; use `list-agent-pack` to inspect imported files.
|
|
40
36
|
- Use `connect-external-agent` for public HTTP/A2A metadata; authenticate through
|
|
41
37
|
the normal connection flow.
|
|
42
38
|
- Dispatch's primary nav is Overview, Chat, Apps, Agents, and the app rail.
|
|
43
39
|
`/agents` creates/imports reusable profiles, opens per-agent chat, and can
|
|
44
40
|
hand a profile off to app creation; `/admin/agents` manages technical MCP/A2A
|
|
45
41
|
connections; other workspace/operator tools live under `/admin`.
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
mounted app metadata through the shared Dispatch database; it does not create
|
|
49
|
-
a second agent registry.
|
|
42
|
+
- Factory shares Dispatch's agent and mounted-app registry; do not create a
|
|
43
|
+
second registry or wrapper app.
|
|
50
44
|
- Keep approval and routing behavior explicit. Never silently widen access to
|
|
51
45
|
secrets, apps, integrations, or workspace resources.
|
|
52
46
|
- Curated workspace templates are private app sources. Use
|
|
@@ -78,7 +72,10 @@ Read the relevant skill before deeper work:
|
|
|
78
72
|
- For usage investigations, use `list-dispatch-usage-metrics` with the smallest
|
|
79
73
|
useful scope and lookback. Treat `not-captured` and `unavailable` attribution
|
|
80
74
|
as gaps, not zero usage; use `view-screen` on `/admin/metrics` to align with
|
|
81
|
-
the visible scope and selected user.
|
|
75
|
+
the visible scope and selected user. For app adoption, use `scope=app` with
|
|
76
|
+
`appId`; the app owner can inspect their own app, and organization owners or
|
|
77
|
+
admins can inspect any accessible app. App results are aggregate-only: active
|
|
78
|
+
means a tracked action, while opens and views are not captured.
|
|
82
79
|
|
|
83
80
|
## Application State
|
|
84
81
|
|
|
@@ -88,8 +85,9 @@ Read the relevant skill before deeper work:
|
|
|
88
85
|
`inspectSourceId`, `ownerEmail`, `failureStatus`, `range`, `query`, `runId`,
|
|
89
86
|
and `threadId` expose the visible failure or thread filters and selection.
|
|
90
87
|
- On Metrics, `navigation.usageScope` exposes whether the visible usage view is
|
|
91
|
-
personal
|
|
92
|
-
selected workspace member filter.
|
|
88
|
+
personal, workspace-wide, or an app, `navigation.usageUserEmail` exposes the
|
|
89
|
+
selected workspace member filter, and `navigation.usageAppId` exposes the
|
|
90
|
+
selected app for app adoption metrics.
|
|
93
91
|
- `navigate` moves the UI to setup, vault, integrations, resources, routing,
|
|
94
92
|
approval, and operator surfaces.
|
|
95
93
|
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
import {
|
|
17
17
|
getWorkspaceConnectionAppAccess,
|
|
18
18
|
listWorkspaceConnectionGrants,
|
|
19
|
-
|
|
19
|
+
listWorkspaceConnectionsForUser,
|
|
20
20
|
summarizeWorkspaceConnectionProviderReadiness,
|
|
21
21
|
} from "@agent-native/core/workspace-connections";
|
|
22
22
|
import { dispatchActions } from "@agent-native/dispatch/actions";
|
|
@@ -144,9 +144,10 @@ export default defineAction({
|
|
|
144
144
|
const googleOAuthConfigured = googleOAuthAvailability === "configured";
|
|
145
145
|
const providers = catalogProviders.filter(
|
|
146
146
|
(provider) =>
|
|
147
|
-
|
|
147
|
+
(!args.provider || provider.id === args.provider) &&
|
|
148
|
+
(googleOAuthConfigured || !isGoogleWorkspaceOAuthProvider(provider.id)),
|
|
148
149
|
);
|
|
149
|
-
const allConnections = await
|
|
150
|
+
const allConnections = await listWorkspaceConnectionsForUser({
|
|
150
151
|
provider: args.provider,
|
|
151
152
|
appId: args.appId,
|
|
152
153
|
includeDisabled: args.includeDisabled,
|
|
@@ -160,10 +161,14 @@ export default defineAction({
|
|
|
160
161
|
provider: args.provider,
|
|
161
162
|
appId: args.appId,
|
|
162
163
|
});
|
|
164
|
+
const visibleConnectionIds = new Set(
|
|
165
|
+
connections.map((connection) => connection.id),
|
|
166
|
+
);
|
|
163
167
|
const explicitGrants = allExplicitGrants.filter(
|
|
164
168
|
(grant) =>
|
|
165
|
-
|
|
166
|
-
|
|
169
|
+
visibleConnectionIds.has(grant.connectionId) &&
|
|
170
|
+
(googleOAuthConfigured ||
|
|
171
|
+
!isGoogleWorkspaceOAuthProvider(grant.provider)),
|
|
167
172
|
);
|
|
168
173
|
const grantApps = await listGrantApps();
|
|
169
174
|
const legacyGrants = connections.flatMap<GrantSummary>((connection) => {
|