@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
|
@@ -2,7 +2,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { Tabs, useDesignSystem } from "@agent-native/toolkit/design-system";
|
|
3
3
|
import { IconArrowUpRight, IconHistory, IconSearch, IconSettings, IconUserCircle, IconUsers, IconX, } from "@tabler/icons-react";
|
|
4
4
|
import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
5
|
-
import { Link } from "react-router";
|
|
5
|
+
import { Link, useInRouterContext, useLocation } from "react-router";
|
|
6
6
|
import { appBasePath, appPath } from "../../client/api-path.js";
|
|
7
7
|
import { buildSettingsRoute } from "../../navigation/index.js";
|
|
8
8
|
import { cn } from "../utils.js";
|
|
@@ -68,13 +68,14 @@ function resolveTabId(tabs, value) {
|
|
|
68
68
|
}
|
|
69
69
|
return null;
|
|
70
70
|
}
|
|
71
|
-
function activeTabFromLocation(tabs, defaultTab) {
|
|
72
|
-
if (typeof window === "undefined")
|
|
71
|
+
function activeTabFromLocation(tabs, defaultTab, location) {
|
|
72
|
+
if (typeof window === "undefined" && !location)
|
|
73
73
|
return defaultTab;
|
|
74
|
-
const pathname = appLocalPathname();
|
|
74
|
+
const pathname = appLocalPathname(location?.pathname);
|
|
75
|
+
const hash = location?.hash ?? window.location.hash;
|
|
75
76
|
const settingsPrefix = "/settings";
|
|
76
77
|
if (pathname === settingsPrefix) {
|
|
77
|
-
return resolveTabId(tabs,
|
|
78
|
+
return resolveTabId(tabs, hash) ?? defaultTab;
|
|
78
79
|
}
|
|
79
80
|
if (pathname.startsWith(`${settingsPrefix}/`)) {
|
|
80
81
|
const segments = pathname
|
|
@@ -95,18 +96,18 @@ function activeTabFromLocation(tabs, defaultTab) {
|
|
|
95
96
|
return tabId;
|
|
96
97
|
}
|
|
97
98
|
}
|
|
98
|
-
return resolveTabId(tabs,
|
|
99
|
+
return resolveTabId(tabs, hash) ?? defaultTab;
|
|
99
100
|
}
|
|
100
|
-
function appLocalPathname() {
|
|
101
|
-
if (typeof window === "undefined")
|
|
101
|
+
function appLocalPathname(pathname) {
|
|
102
|
+
if (typeof window === "undefined" && !pathname)
|
|
102
103
|
return "/";
|
|
103
|
-
const
|
|
104
|
+
const currentPathname = pathname ?? window.location.pathname;
|
|
104
105
|
const basePath = appBasePath();
|
|
105
106
|
if (basePath &&
|
|
106
|
-
(
|
|
107
|
-
return
|
|
107
|
+
(currentPathname === basePath || currentPathname.startsWith(`${basePath}/`))) {
|
|
108
|
+
return currentPathname.slice(basePath.length) || "/";
|
|
108
109
|
}
|
|
109
|
-
return
|
|
110
|
+
return currentPathname;
|
|
110
111
|
}
|
|
111
112
|
function buildSettingsEntryRoute(tabId, section) {
|
|
112
113
|
const normalizedSection = section?.replace(/^#/, "").trim();
|
|
@@ -126,6 +127,7 @@ function updateRouteForTab(tabId, section) {
|
|
|
126
127
|
return;
|
|
127
128
|
const route = buildSettingsEntryRoute(tabId, section);
|
|
128
129
|
window.history.pushState(null, "", `${appPath(route)}${window.location.search}`);
|
|
130
|
+
window.dispatchEvent(new Event("popstate"));
|
|
129
131
|
}
|
|
130
132
|
function isEditableElement(element) {
|
|
131
133
|
if (!(element instanceof HTMLElement))
|
|
@@ -136,7 +138,7 @@ function isEditableElement(element) {
|
|
|
136
138
|
tagName === "select" ||
|
|
137
139
|
element.isContentEditable);
|
|
138
140
|
}
|
|
139
|
-
|
|
141
|
+
function SettingsTabsPageContent({ general, account, team, whatsNew, extraTabs = [], generalLabel = "General", accountLabel = "Account", teamLabel = "Team", whatsNewLabel = "What's new", ariaLabel = "Settings sections", defaultTab = "general", className, navClassName, navHeader, contentClassName, enableSearch = true, searchPlaceholder = "Search settings", searchEntries, generalSearchEntries, value, onValueChange, routerLocation, }) {
|
|
140
142
|
const rootRef = useRef(null);
|
|
141
143
|
const searchInputRef = useRef(null);
|
|
142
144
|
const autoFocusedSearchRef = useRef(false);
|
|
@@ -224,7 +226,7 @@ export function SettingsTabsPage({ general, account, team, whatsNew, extraTabs =
|
|
|
224
226
|
agent: "Agent",
|
|
225
227
|
};
|
|
226
228
|
const isControlled = value !== undefined;
|
|
227
|
-
const [internalTab, setInternalTab] = useState(() => activeTabFromLocation(tabs, fallbackTab));
|
|
229
|
+
const [internalTab, setInternalTab] = useState(() => activeTabFromLocation(tabs, fallbackTab, routerLocation));
|
|
228
230
|
const activeTab = isControlled ? value : internalTab;
|
|
229
231
|
const [query, setQuery] = useState("");
|
|
230
232
|
const designSystem = useDesignSystem();
|
|
@@ -246,13 +248,19 @@ export function SettingsTabsPage({ general, account, team, whatsNew, extraTabs =
|
|
|
246
248
|
useEffect(() => {
|
|
247
249
|
if (isControlled)
|
|
248
250
|
return;
|
|
249
|
-
const syncLocation = () => {
|
|
250
|
-
|
|
251
|
+
const syncLocation = (event) => {
|
|
252
|
+
// Native history events carry the live browser URL. Reading the
|
|
253
|
+
// render-captured router location here would re-canonicalize the same
|
|
254
|
+
// legacy hash before BrowserRouter has rerendered.
|
|
255
|
+
const location = event ? undefined : routerLocation;
|
|
256
|
+
const pathname = location?.pathname ?? window.location.pathname;
|
|
257
|
+
const hash = location?.hash ?? window.location.hash;
|
|
258
|
+
const fromPath = activeTabFromLocation(tabs, fallbackTab, location);
|
|
251
259
|
if (fromPath)
|
|
252
260
|
setInternalTab(fromPath);
|
|
253
|
-
if (appLocalPathname().startsWith("/settings/"))
|
|
261
|
+
if (appLocalPathname(pathname).startsWith("/settings/"))
|
|
254
262
|
return;
|
|
255
|
-
const hashValue =
|
|
263
|
+
const hashValue = hash.replace(/^#/, "");
|
|
256
264
|
const fromHash = resolveTabId(tabs, hashValue);
|
|
257
265
|
if (!fromHash || !hashValue)
|
|
258
266
|
return;
|
|
@@ -266,18 +274,20 @@ export function SettingsTabsPage({ general, account, team, whatsNew, extraTabs =
|
|
|
266
274
|
window.removeEventListener("hashchange", syncLocation);
|
|
267
275
|
window.removeEventListener("popstate", syncLocation);
|
|
268
276
|
};
|
|
269
|
-
}, [fallbackTab, isControlled, tabs]);
|
|
277
|
+
}, [fallbackTab, isControlled, routerLocation, tabs]);
|
|
270
278
|
useEffect(() => {
|
|
271
279
|
if (!isControlled)
|
|
272
280
|
return;
|
|
273
281
|
const syncControlledLocation = () => {
|
|
274
|
-
const
|
|
275
|
-
|
|
282
|
+
const pathname = routerLocation?.pathname ?? window.location.pathname;
|
|
283
|
+
const hash = routerLocation?.hash ?? window.location.hash;
|
|
284
|
+
const fromPath = appLocalPathname(pathname).startsWith("/settings/")
|
|
285
|
+
? activeTabFromLocation(tabs, defaultTab, routerLocation)
|
|
276
286
|
: null;
|
|
277
|
-
const hashValue =
|
|
287
|
+
const hashValue = hash.replace(/^#/, "");
|
|
278
288
|
const fromHash = hashValue ? resolveTabId(tabs, hashValue) : null;
|
|
279
289
|
const next = fromPath ?? fromHash;
|
|
280
|
-
const key = `${
|
|
290
|
+
const key = `${pathname}${hash}`;
|
|
281
291
|
if (!next || next === value || controlledHashRef.current === key) {
|
|
282
292
|
controlledHashRef.current = key;
|
|
283
293
|
return;
|
|
@@ -292,7 +302,7 @@ export function SettingsTabsPage({ general, account, team, whatsNew, extraTabs =
|
|
|
292
302
|
window.removeEventListener("hashchange", syncControlledLocation);
|
|
293
303
|
window.removeEventListener("popstate", syncControlledLocation);
|
|
294
304
|
};
|
|
295
|
-
}, [defaultTab, isControlled, onValueChange, tabs, value]);
|
|
305
|
+
}, [defaultTab, isControlled, onValueChange, routerLocation, tabs, value]);
|
|
296
306
|
useEffect(() => {
|
|
297
307
|
if (!enableSearch || autoFocusedSearchRef.current)
|
|
298
308
|
return;
|
|
@@ -384,7 +394,6 @@ export function SettingsTabsPage({ general, account, team, whatsNew, extraTabs =
|
|
|
384
394
|
if (section) {
|
|
385
395
|
updateRouteForTab(entry.tabId, section);
|
|
386
396
|
// Let the inner panels open + scroll to their section.
|
|
387
|
-
window.dispatchEvent(new Event("popstate"));
|
|
388
397
|
window.dispatchEvent(new Event("hashchange"));
|
|
389
398
|
window.requestAnimationFrame(() => {
|
|
390
399
|
document
|
|
@@ -447,3 +456,11 @@ export function SettingsTabsPage({ general, account, team, whatsNew, extraTabs =
|
|
|
447
456
|
: "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), children: tabContent }, tab.id));
|
|
448
457
|
})] }) }, group.id))) }))] }), _jsx("div", { id: `settings-tabpanel-${selectedTab?.id ?? "general"}`, role: "tabpanel", "aria-labelledby": `settings-tab-${selectedTab?.id ?? "general"}`, className: cn("min-h-0 min-w-0 flex-1 overflow-y-auto px-4 py-4 sm:px-6 sm:py-6 lg:px-8 lg:py-8", contentClassName), children: _jsx("div", { className: "mx-auto flex w-full max-w-6xl min-w-0 flex-col gap-6", children: selectedTab?.content }) })] }));
|
|
449
458
|
}
|
|
459
|
+
function SettingsTabsPageWithRouter(props) {
|
|
460
|
+
const location = useLocation();
|
|
461
|
+
return _jsx(SettingsTabsPageContent, { ...props, routerLocation: location });
|
|
462
|
+
}
|
|
463
|
+
export function SettingsTabsPage(props) {
|
|
464
|
+
const inRouterContext = useInRouterContext();
|
|
465
|
+
return inRouterContext ? (_jsx(SettingsTabsPageWithRouter, { ...props })) : (_jsx(SettingsTabsPageContent, { ...props }));
|
|
466
|
+
}
|
|
@@ -15,9 +15,10 @@ import { IconAlertCircle, IconCheck, IconChevronDown, IconChevronRight, IconExte
|
|
|
15
15
|
import { useCallback, useEffect, useState } from "react";
|
|
16
16
|
import { buildSettingsRoute } from "../../navigation/index.js";
|
|
17
17
|
import { agentNativePath } from "../api-path.js";
|
|
18
|
+
import { BuilderConnectPopover } from "./BuilderConnectPopover.js";
|
|
18
19
|
import { SettingsRow } from "./SettingsRow.js";
|
|
19
20
|
import { SettingsSkeleton } from "./SettingsSkeleton.js";
|
|
20
|
-
import {
|
|
21
|
+
import { useBuilderConnectFlow, useBuilderStatus } from "./useBuilderStatus.js";
|
|
21
22
|
const PREFS_URL = agentNativePath("/_agent-native/application-state/voice-transcription-prefs");
|
|
22
23
|
const CLEANUP_PREFS_URL = agentNativePath("/_agent-native/application-state/voice-cleanup-prefs");
|
|
23
24
|
const SECRETS_URL = agentNativePath("/_agent-native/secrets");
|
|
@@ -73,7 +74,16 @@ export function VoiceTranscriptionSection({ compact = false, } = {}) {
|
|
|
73
74
|
const [saveError, setSaveError] = useState(null);
|
|
74
75
|
const [showAdvanced, setShowAdvanced] = useState(false);
|
|
75
76
|
const [cleanupEnabled, setCleanupEnabled] = useState(null);
|
|
76
|
-
const { status: builderStatus } = useBuilderStatus();
|
|
77
|
+
const { status: builderStatus, refetch: refetchBuilderStatus } = useBuilderStatus();
|
|
78
|
+
const builderConnect = useBuilderConnectFlow({
|
|
79
|
+
popupUrl: builderStatus?.connectUrl,
|
|
80
|
+
provisionAccount: true,
|
|
81
|
+
trackingSource: "voice_transcription_settings",
|
|
82
|
+
trackingFlow: "voice_transcription",
|
|
83
|
+
onConnected: () => {
|
|
84
|
+
void refetchBuilderStatus();
|
|
85
|
+
},
|
|
86
|
+
});
|
|
77
87
|
const builderRealtimeReady = !!builderStatus?.privateKeyConfigured &&
|
|
78
88
|
!!builderStatus?.publicKeyConfigured;
|
|
79
89
|
const googleRealtimeReady = !!googleRealtimeConfigured && builderRealtimeReady;
|
|
@@ -235,7 +245,7 @@ export function VoiceTranscriptionSection({ compact = false, } = {}) {
|
|
|
235
245
|
focusKey("GOOGLE_APPLICATION_CREDENTIALS");
|
|
236
246
|
}
|
|
237
247
|
else if (!builderRealtimeReady) {
|
|
238
|
-
|
|
248
|
+
builderConnect.start({ provisionAccount: false });
|
|
239
249
|
}
|
|
240
250
|
return;
|
|
241
251
|
}
|
|
@@ -245,13 +255,6 @@ export function VoiceTranscriptionSection({ compact = false, } = {}) {
|
|
|
245
255
|
setProvider(nextProvider);
|
|
246
256
|
void persist(next, nextProvider, instructions, previous);
|
|
247
257
|
};
|
|
248
|
-
const openBuilderConnect = () => {
|
|
249
|
-
openBuilderConnectPopup({
|
|
250
|
-
url: builderStatus?.connectUrl,
|
|
251
|
-
source: "voice_transcription_settings",
|
|
252
|
-
features: "noopener,noreferrer,width=600,height=700",
|
|
253
|
-
});
|
|
254
|
-
};
|
|
255
258
|
const chooseBatchProvider = (next) => {
|
|
256
259
|
const nextProvider = batchProvider(normalizeProvider(next));
|
|
257
260
|
if (transcriptionMode === "batch" && nextProvider === provider)
|
|
@@ -289,10 +292,7 @@ export function VoiceTranscriptionSection({ compact = false, } = {}) {
|
|
|
289
292
|
? "BYOK only for v1. Streams live partials and finals through Google Speech-to-Text."
|
|
290
293
|
: googleRealtimeConfigured
|
|
291
294
|
? "Google credentials are set. Connect Builder completely (free tier available) to mint the managed realtime session."
|
|
292
|
-
: "BYOK only for v1. Configure Google service account before selecting this source.", rightSlot: googleRealtimeReady ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Ready"] })) : googleRealtimeConfigured ? (_jsx("button", { type: "button", onClick: (e) => {
|
|
293
|
-
e.stopPropagation();
|
|
294
|
-
openBuilderConnect();
|
|
295
|
-
}, className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:bg-accent/40 hover:text-foreground", children: "Connect Builder.io" })) : (_jsxs("button", { type: "button", onClick: (e) => {
|
|
295
|
+
: "BYOK only for v1. Configure Google service account before selecting this source.", rightSlot: googleRealtimeReady ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Ready"] })) : googleRealtimeConfigured ? (_jsx(BuilderConnectPopover, { flow: builderConnect, onTriggerClick: (event) => event.stopPropagation(), children: _jsx("button", { type: "button", className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:bg-accent/40 hover:text-foreground", children: "Connect Builder.io" }) })) : (_jsxs("button", { type: "button", onClick: (e) => {
|
|
296
296
|
e.stopPropagation();
|
|
297
297
|
setShowAdvanced(true);
|
|
298
298
|
focusKey("GOOGLE_APPLICATION_CREDENTIALS");
|
|
@@ -303,18 +303,12 @@ export function VoiceTranscriptionSection({ compact = false, } = {}) {
|
|
|
303
303
|
: "Needs key" }))] })] }), _jsxs("div", { className: "rounded-md border border-border bg-background", children: [_jsxs("button", { type: "button", onClick: () => setShowAdvanced((v) => !v), className: "w-full flex items-center justify-between gap-2 px-2.5 py-2 cursor-pointer", children: [_jsxs("span", { className: "text-[11px] font-medium text-foreground inline-flex items-center gap-1", children: [showAdvanced ? (_jsx(IconChevronDown, { size: 12 })) : (_jsx(IconChevronRight, { size: 12, className: "rtl:-scale-x-100" })), "Add API keys"] }), _jsx("span", { className: "text-[10px] text-muted-foreground", children: "Google STT \u00B7 Gemini \u00B7 Groq \u00B7 OpenAI" })] }), showAdvanced && (_jsxs("div", { className: "px-2 pb-2 space-y-2", children: [_jsx(ProviderOption, { id: "google-service-account", selected: transcriptionMode === "google-realtime", onSelect: () => chooseSource("google-realtime"), disabled: !googleRealtimeReady, title: "Google Speech-to-Text service account", subtitle: googleRealtimeConfigured
|
|
304
304
|
? "Service-account JSON is set. Connect Builder (free tier available) to mint the managed realtime WebSocket session."
|
|
305
305
|
: "Service-account JSON for the dedicated realtime WebSocket to Google StreamingRecognize.", rightSlot: googleRealtimeConfigured ===
|
|
306
|
-
null ? null : googleRealtimeReady ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Ready"] })) : googleRealtimeConfigured ? (_jsx("button", { type: "button", onClick: (e) => {
|
|
307
|
-
e.stopPropagation();
|
|
308
|
-
openBuilderConnect();
|
|
309
|
-
}, className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:text-foreground hover:bg-accent/40", children: "Connect Builder.io" })) : (_jsxs("button", { type: "button", onClick: (e) => {
|
|
306
|
+
null ? null : googleRealtimeReady ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Ready"] })) : googleRealtimeConfigured ? (_jsx(BuilderConnectPopover, { flow: builderConnect, onTriggerClick: (event) => event.stopPropagation(), children: _jsx("button", { type: "button", className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:text-foreground hover:bg-accent/40", children: "Connect Builder.io" }) })) : (_jsxs("button", { type: "button", onClick: (e) => {
|
|
310
307
|
e.stopPropagation();
|
|
311
308
|
focusKey("GOOGLE_APPLICATION_CREDENTIALS");
|
|
312
309
|
}, className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:text-foreground hover:bg-accent/40", children: ["Configure", _jsx(IconExternalLink, { size: 10 })] })) }), _jsx(ProviderOption, { id: "auto", selected: transcriptionMode === "batch" && provider === "auto", onSelect: () => chooseBatchProvider("auto"), title: "Automatic batch fallback", subtitle: "Keep the current Clips fallback chain: Builder Gemini, Gemini, Groq, then OpenAI." }), _jsx(ProviderOption, { id: "builder-gemini", selected: transcriptionMode === "batch" && provider === "builder-gemini", onSelect: () => chooseBatchProvider("builder-gemini"), disabled: !builderStatus?.configured, title: "Builder.io Connect", subtitle: builderStatus?.configured
|
|
313
310
|
? "Use Builder-hosted Gemini Flash-Lite for batch transcription and Luna for text cleanup."
|
|
314
|
-
: "One-click connect for Gemini Flash-Lite transcription and Luna text cleanup. No Google key needed.", rightSlot: builderStatus?.configured ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Connected"] })) : (_jsx("button", { type: "button", onClick: (e) => {
|
|
315
|
-
e.stopPropagation();
|
|
316
|
-
openBuilderConnect();
|
|
317
|
-
}, className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:text-foreground hover:bg-accent/40", children: "Connect Builder.io" })) }), _jsx(ProviderOption, { id: "gemini", selected: transcriptionMode === "batch" && provider === "gemini", onSelect: () => chooseBatchProvider("gemini"), title: "Google Gemini", subtitle: "BYOK Gemini for AI cleanup and optional strict batch transcription.", rightSlot: geminiConfigured === null ? null : geminiConfigured ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Key set"] })) : (_jsxs("button", { type: "button", onClick: (e) => {
|
|
311
|
+
: "One-click connect for Gemini Flash-Lite transcription and Luna text cleanup. No Google key needed.", rightSlot: builderStatus?.configured ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Connected"] })) : (_jsx(BuilderConnectPopover, { flow: builderConnect, onTriggerClick: (event) => event.stopPropagation(), children: _jsx("button", { type: "button", className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:text-foreground hover:bg-accent/40", children: "Connect Builder.io" }) })) }), _jsx(ProviderOption, { id: "gemini", selected: transcriptionMode === "batch" && provider === "gemini", onSelect: () => chooseBatchProvider("gemini"), title: "Google Gemini", subtitle: "BYOK Gemini for AI cleanup and optional strict batch transcription.", rightSlot: geminiConfigured === null ? null : geminiConfigured ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Key set"] })) : (_jsxs("button", { type: "button", onClick: (e) => {
|
|
318
312
|
e.stopPropagation();
|
|
319
313
|
focusKey("GEMINI_API_KEY");
|
|
320
314
|
}, className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] text-muted-foreground hover:text-foreground hover:bg-accent/40", children: ["Add key", _jsx(IconExternalLink, { size: 10 })] })) }), _jsx(ProviderOption, { id: "openai", selected: transcriptionMode === "batch" && provider === "openai", onSelect: () => chooseBatchProvider("openai"), title: "OpenAI Transcribe", subtitle: "Batch transcription provider. Requires an OpenAI API key.", rightSlot: openAiConfigured === null ? null : openAiConfigured ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Key set"] })) : (_jsxs("button", { type: "button", onClick: (e) => {
|
|
@@ -3,6 +3,7 @@ export { getAgentSettingsSearchTabs, type AgentSettingsSearchTab, } from "./agen
|
|
|
3
3
|
export { SettingsTabsPage, type SettingsSearchEntry, type SettingsTabItem, type SettingsTabsPageProps, } from "./SettingsTabsPage.js";
|
|
4
4
|
export { AccountSettingsCard, AccountSettingsForm, type AccountSettingsCardProps, type AccountSettingsFormProps, } from "./AccountSettingsCard.js";
|
|
5
5
|
export { openBuilderConnectPopup, useBuilderConnectFlow, useBuilderStatus, withBuilderConnectTrackingParams, type BuilderConnectFlow, type BuilderConnectFlowOptions, type BuilderConnectStartOptions, type BuilderStatus, type OpenBuilderConnectPopupOptions, } from "./useBuilderStatus.js";
|
|
6
|
+
export { BuilderConnectPopover, type BuilderConnectPopoverProps, } from "./BuilderConnectPopover.js";
|
|
6
7
|
export { SecretsSection, type SecretsSectionProps } from "./SecretsSection.js";
|
|
7
8
|
export { SettingsGroup, SettingsRow, type SettingsGroupProps, type SettingsRowProps, } from "./SettingsRow.js";
|
|
8
9
|
export { SettingsSection, SettingsSurfaceProvider, useSettingsSurface, type SettingsSurface, } from "./SettingsSection.js";
|
|
@@ -3,6 +3,7 @@ export { getAgentSettingsSearchTabs, } from "./agent-settings-search.js";
|
|
|
3
3
|
export { SettingsTabsPage, } from "./SettingsTabsPage.js";
|
|
4
4
|
export { AccountSettingsCard, AccountSettingsForm, } from "./AccountSettingsCard.js";
|
|
5
5
|
export { openBuilderConnectPopup, useBuilderConnectFlow, useBuilderStatus, withBuilderConnectTrackingParams, } from "./useBuilderStatus.js";
|
|
6
|
+
export { BuilderConnectPopover, } from "./BuilderConnectPopover.js";
|
|
6
7
|
export { SecretsSection } from "./SecretsSection.js";
|
|
7
8
|
export { SettingsGroup, SettingsRow, } from "./SettingsRow.js";
|
|
8
9
|
export { SettingsSection, SettingsSurfaceProvider, useSettingsSurface, } from "./SettingsSection.js";
|
|
@@ -45,6 +45,7 @@ export interface BuilderStatus {
|
|
|
45
45
|
connectError?: {
|
|
46
46
|
message: string;
|
|
47
47
|
at: number;
|
|
48
|
+
code?: string;
|
|
48
49
|
};
|
|
49
50
|
/**
|
|
50
51
|
* Set when the currently effective Builder credential was rejected by
|
|
@@ -92,6 +93,8 @@ export interface BuilderConnectStartOptions {
|
|
|
92
93
|
trackingSource?: string;
|
|
93
94
|
/** Override the hook-level flow for this click. */
|
|
94
95
|
trackingFlow?: string;
|
|
96
|
+
/** Override whether this click should use the optional account provisioning flow. */
|
|
97
|
+
provisionAccount?: boolean;
|
|
95
98
|
}
|
|
96
99
|
export interface BuilderConnectFlow {
|
|
97
100
|
configured: boolean;
|
|
@@ -120,6 +123,8 @@ export interface BuilderConnectFlow {
|
|
|
120
123
|
orgName: string | null;
|
|
121
124
|
connecting: boolean;
|
|
122
125
|
error: string | null;
|
|
126
|
+
/** True when account provisioning found an existing Builder account. */
|
|
127
|
+
accountExists: boolean;
|
|
123
128
|
/**
|
|
124
129
|
* True once the first Builder connection-status fetch has completed (successfully
|
|
125
130
|
* or not). Consumers that accept an `initialConfigured` prop (e.g. agent
|
|
@@ -131,6 +136,8 @@ export interface BuilderConnectFlow {
|
|
|
131
136
|
hasFetchedStatus: boolean;
|
|
132
137
|
/** Open the popup and begin polling. Must be called from a user-gesture handler. */
|
|
133
138
|
start: (options?: BuilderConnectStartOptions) => void;
|
|
139
|
+
/** Retry the status request before choosing a connection path. */
|
|
140
|
+
retry: () => void;
|
|
134
141
|
}
|
|
135
142
|
export declare function withBuilderConnectTrackingParams(url: string, options?: {
|
|
136
143
|
source?: string;
|
|
@@ -91,6 +91,7 @@ const BUILDER_CONNECT_PARAM = "_an_connect";
|
|
|
91
91
|
const BUILDER_CONNECT_MODE_PARAM = "_an_mode";
|
|
92
92
|
const BUILDER_AGENT_NATIVE_PROVISION_MODE = "agent-native";
|
|
93
93
|
const BUILDER_PROVISIONING_TOKEN_PARAM = "_an_provision";
|
|
94
|
+
const BUILDER_CONNECT_ATTEMPT_PARAM = "_an_connect_attempt";
|
|
94
95
|
const BUILDER_SIGNUP_SOURCE_PARAM = "signupSource";
|
|
95
96
|
const BUILDER_AGENT_NATIVE_FLOW_PARAM = "agentNativeFlow";
|
|
96
97
|
const BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM = "agentNativeConnectSource";
|
|
@@ -221,6 +222,13 @@ function isFreshSignedConnectUrl(url, fetchedAt) {
|
|
|
221
222
|
typeof fetchedAt === "number" &&
|
|
222
223
|
Date.now() - fetchedAt < STATUS_CONNECT_URL_TTL_MS);
|
|
223
224
|
}
|
|
225
|
+
function createBuilderConnectAttemptId() {
|
|
226
|
+
if (typeof crypto !== "undefined" &&
|
|
227
|
+
typeof crypto.randomUUID === "function") {
|
|
228
|
+
return crypto.randomUUID();
|
|
229
|
+
}
|
|
230
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
231
|
+
}
|
|
224
232
|
function isCurrentConnectError(error, startedAt) {
|
|
225
233
|
if (!error?.message)
|
|
226
234
|
return false;
|
|
@@ -378,6 +386,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
378
386
|
const [orgName, setOrgName] = useState(null);
|
|
379
387
|
const [connecting, setConnecting] = useState(false);
|
|
380
388
|
const [error, setError] = useState(null);
|
|
389
|
+
const [accountExists, setAccountExists] = useState(false);
|
|
381
390
|
const [hasFetchedStatus, setHasFetchedStatus] = useState(false);
|
|
382
391
|
const [statusResolved, setStatusResolved] = useState(false);
|
|
383
392
|
const [statusConnectUrl, setStatusConnectUrl] = useState(null);
|
|
@@ -388,7 +397,9 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
388
397
|
// gesture path (browser/editor embeds).
|
|
389
398
|
const statusConnectUrlAtRef = useRef(null);
|
|
390
399
|
const connectStartedAtRef = useRef(null);
|
|
400
|
+
const connectAttemptIdRef = useRef(null);
|
|
391
401
|
const callbackSuccessStartedAtRef = useRef(null);
|
|
402
|
+
const retryStatusRef = useRef(() => { });
|
|
392
403
|
const mountedRef = useRef(true);
|
|
393
404
|
const notifiedConnectedRef = useRef(false);
|
|
394
405
|
// Keep onConnected in a ref so start() doesn't need to re-create when the
|
|
@@ -406,7 +417,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
406
417
|
// separately-constructed AbortController. Callers with no signal of their
|
|
407
418
|
// own (the initial status fetch, the popup-open branches in `start`) keep
|
|
408
419
|
// the internal fallback timeout.
|
|
409
|
-
const fetchStatus = useCallback(async (signal) => {
|
|
420
|
+
const fetchStatus = useCallback(async (signal, connectAttemptId) => {
|
|
410
421
|
if (!enabled)
|
|
411
422
|
return null;
|
|
412
423
|
const origin = getCallbackOrigin() || window.location.origin;
|
|
@@ -417,7 +428,13 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
417
428
|
? setTimeout(() => ownController.abort(), STATUS_FETCH_ABORT_MS)
|
|
418
429
|
: null;
|
|
419
430
|
try {
|
|
420
|
-
const
|
|
431
|
+
const statusUrl = new URL(agentNativePath("/_agent-native/connection-status/builder"), origin);
|
|
432
|
+
if (connectAttemptId) {
|
|
433
|
+
statusUrl.searchParams.set(BUILDER_CONNECT_ATTEMPT_PARAM, connectAttemptId);
|
|
434
|
+
}
|
|
435
|
+
const r = await fetch(statusUrl.href, {
|
|
436
|
+
signal: signal ?? ownController?.signal,
|
|
437
|
+
});
|
|
421
438
|
if (!r.ok)
|
|
422
439
|
return null;
|
|
423
440
|
return (await r.json());
|
|
@@ -448,10 +465,13 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
448
465
|
setOrgName(null);
|
|
449
466
|
setConnecting(false);
|
|
450
467
|
setError(null);
|
|
468
|
+
setAccountExists(false);
|
|
451
469
|
setHasFetchedStatus(false);
|
|
452
470
|
setStatusResolved(false);
|
|
453
471
|
setStatusConnectUrl(null);
|
|
454
472
|
statusConnectUrlAtRef.current = null;
|
|
473
|
+
connectAttemptIdRef.current = null;
|
|
474
|
+
retryStatusRef.current = () => { };
|
|
455
475
|
return;
|
|
456
476
|
}
|
|
457
477
|
mountedRef.current = true;
|
|
@@ -472,6 +492,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
472
492
|
setEnvManaged(!!s.envManaged);
|
|
473
493
|
setAgentNativeProvisioningEnabled(!!s.agentNativeProvisioningEnabled);
|
|
474
494
|
setAgentNativeProvisioningToken(s.agentNativeProvisioningToken ?? null);
|
|
495
|
+
setAccountExists(s.connectError?.code === "account_exists");
|
|
475
496
|
setBuilderEnabled(!!s.builderEnabled);
|
|
476
497
|
const nextConnectUrl = s.connectUrl ?? null;
|
|
477
498
|
setStatusConnectUrl(nextConnectUrl);
|
|
@@ -508,6 +529,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
508
529
|
setError(null);
|
|
509
530
|
}
|
|
510
531
|
};
|
|
532
|
+
retryStatusRef.current = () => void refresh();
|
|
511
533
|
void refresh();
|
|
512
534
|
const onVisible = () => {
|
|
513
535
|
if (document.visibilityState === "visible")
|
|
@@ -519,18 +541,25 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
519
541
|
return () => {
|
|
520
542
|
cancelled = true;
|
|
521
543
|
mountedRef.current = false;
|
|
544
|
+
retryStatusRef.current = () => { };
|
|
522
545
|
window.removeEventListener("focus", refresh);
|
|
523
546
|
document.removeEventListener("visibilitychange", onVisible);
|
|
524
547
|
window.removeEventListener("agent-engine:configured-changed", refresh);
|
|
525
548
|
};
|
|
526
549
|
}, [enabled, fetchStatus]);
|
|
550
|
+
const retry = useCallback(() => {
|
|
551
|
+
retryStatusRef.current();
|
|
552
|
+
}, []);
|
|
527
553
|
const start = useCallback((startOptions) => {
|
|
528
554
|
if (!enabled)
|
|
529
555
|
return;
|
|
530
556
|
const started = Date.now();
|
|
557
|
+
const connectAttemptId = createBuilderConnectAttemptId();
|
|
531
558
|
const clickTrackingSource = startOptions?.trackingSource ?? trackingSource;
|
|
532
559
|
const clickTrackingFlow = startOptions?.trackingFlow ?? trackingFlow;
|
|
560
|
+
const provisionAccountForStart = startOptions?.provisionAccount ?? provisionAccount;
|
|
533
561
|
connectStartedAtRef.current = started;
|
|
562
|
+
connectAttemptIdRef.current = connectAttemptId;
|
|
534
563
|
callbackSuccessStartedAtRef.current = null;
|
|
535
564
|
activeTrackingRef.current = {
|
|
536
565
|
source: clickTrackingSource,
|
|
@@ -538,6 +567,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
538
567
|
};
|
|
539
568
|
setConnecting(true);
|
|
540
569
|
setError(null);
|
|
570
|
+
setAccountExists(false);
|
|
541
571
|
// Open SYNCHRONOUSLY inside the caller's click handler — any await
|
|
542
572
|
// before window.open lets the user-gesture token expire, which causes
|
|
543
573
|
// popup blockers to block entirely or fall back to same-tab navigation.
|
|
@@ -552,13 +582,16 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
552
582
|
const signedPropUrl = hasSignedConnectToken(popupUrl) ? popupUrl : null;
|
|
553
583
|
const fallbackUrl = new URL(agentNativePath("/_agent-native/builder/connect"), origin).href;
|
|
554
584
|
const withProvisionMode = (url, provisioningEnabled = agentNativeProvisioningEnabled, provisioningToken = agentNativeProvisioningToken) => {
|
|
555
|
-
|
|
556
|
-
|
|
585
|
+
const connectUrl = new URL(url, origin);
|
|
586
|
+
connectUrl.searchParams.set(BUILDER_CONNECT_ATTEMPT_PARAM, connectAttemptId);
|
|
587
|
+
if (!provisionAccountForStart ||
|
|
588
|
+
!provisioningEnabled ||
|
|
589
|
+
!provisioningToken) {
|
|
590
|
+
return connectUrl.toString();
|
|
557
591
|
}
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
return provisionUrl.toString();
|
|
592
|
+
connectUrl.searchParams.set(BUILDER_CONNECT_MODE_PARAM, BUILDER_AGENT_NATIVE_PROVISION_MODE);
|
|
593
|
+
connectUrl.searchParams.set(BUILDER_PROVISIONING_TOKEN_PARAM, provisioningToken);
|
|
594
|
+
return connectUrl.toString();
|
|
562
595
|
};
|
|
563
596
|
const directUrl = withProvisionMode(cachedFreshUrl ?? signedPropUrl ?? fallbackUrl);
|
|
564
597
|
if (isAgentNativeDesktop()) {
|
|
@@ -587,7 +620,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
587
620
|
return;
|
|
588
621
|
}
|
|
589
622
|
void (async () => {
|
|
590
|
-
const s = await fetchStatus();
|
|
623
|
+
const s = await fetchStatus(undefined, connectAttemptId);
|
|
591
624
|
if (!mountedRef.current)
|
|
592
625
|
return;
|
|
593
626
|
if (s) {
|
|
@@ -598,6 +631,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
598
631
|
setEnvManaged(!!s.envManaged);
|
|
599
632
|
setAgentNativeProvisioningEnabled(!!s.agentNativeProvisioningEnabled);
|
|
600
633
|
setAgentNativeProvisioningToken(s.agentNativeProvisioningToken ?? null);
|
|
634
|
+
setAccountExists(s.connectError?.code === "account_exists");
|
|
601
635
|
setBuilderEnabled(!!s.builderEnabled);
|
|
602
636
|
const nextConnectUrl = s.connectUrl ?? null;
|
|
603
637
|
setStatusConnectUrl(nextConnectUrl);
|
|
@@ -622,7 +656,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
622
656
|
else {
|
|
623
657
|
showBuilderConnectPopupPlaceholder(opened);
|
|
624
658
|
void (async () => {
|
|
625
|
-
const s = await fetchStatus();
|
|
659
|
+
const s = await fetchStatus(undefined, connectAttemptId);
|
|
626
660
|
if (!mountedRef.current) {
|
|
627
661
|
try {
|
|
628
662
|
opened.close();
|
|
@@ -640,6 +674,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
640
674
|
setEnvManaged(!!s.envManaged);
|
|
641
675
|
setAgentNativeProvisioningEnabled(!!s.agentNativeProvisioningEnabled);
|
|
642
676
|
setAgentNativeProvisioningToken(s.agentNativeProvisioningToken ?? null);
|
|
677
|
+
setAccountExists(s.connectError?.code === "account_exists");
|
|
643
678
|
setBuilderEnabled(!!s.builderEnabled);
|
|
644
679
|
const nextConnectUrl = s.connectUrl ?? null;
|
|
645
680
|
setStatusConnectUrl(nextConnectUrl);
|
|
@@ -696,7 +731,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
696
731
|
const started = connectStartedAtRef.current;
|
|
697
732
|
if (started == null)
|
|
698
733
|
return;
|
|
699
|
-
const s = await fetchStatus(signal);
|
|
734
|
+
const s = await fetchStatus(signal, connectAttemptIdRef.current ?? undefined);
|
|
700
735
|
if (!mountedRef.current)
|
|
701
736
|
return;
|
|
702
737
|
if (s)
|
|
@@ -707,6 +742,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
707
742
|
setEnvManaged(!!s.envManaged);
|
|
708
743
|
setAgentNativeProvisioningEnabled(!!s.agentNativeProvisioningEnabled);
|
|
709
744
|
setAgentNativeProvisioningToken(s.agentNativeProvisioningToken ?? null);
|
|
745
|
+
setAccountExists(false);
|
|
710
746
|
setBuilderEnabled(!!s.builderEnabled);
|
|
711
747
|
const nextConnectUrl = s.connectUrl ?? null;
|
|
712
748
|
setStatusConnectUrl(nextConnectUrl);
|
|
@@ -731,7 +767,10 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
731
767
|
// real error instead of letting the user wait 5 minutes for timeout.
|
|
732
768
|
connectStartedAtRef.current = null;
|
|
733
769
|
setConnecting(false);
|
|
734
|
-
|
|
770
|
+
setAccountExists(s.connectError.code === "account_exists");
|
|
771
|
+
setError(s.connectError.code === "account_exists"
|
|
772
|
+
? null
|
|
773
|
+
: `Couldn't save Builder credentials: ${s.connectError.message}. Try again or contact support.`);
|
|
735
774
|
}
|
|
736
775
|
else if (Date.now() - started > POLL_TIMEOUT_MS) {
|
|
737
776
|
connectStartedAtRef.current = null;
|
|
@@ -761,12 +800,22 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
761
800
|
// by the setConnecting(false) call, which is idempotent.
|
|
762
801
|
useEffect(() => {
|
|
763
802
|
let channel = null;
|
|
764
|
-
const
|
|
803
|
+
const isCurrentConnectAttempt = (attemptId) => typeof attemptId === "string" &&
|
|
804
|
+
attemptId === connectAttemptIdRef.current &&
|
|
805
|
+
connectStartedAtRef.current !== null;
|
|
806
|
+
const handleError = (message, code, attemptId) => {
|
|
807
|
+
if (!isCurrentConnectAttempt(attemptId))
|
|
808
|
+
return;
|
|
765
809
|
connectStartedAtRef.current = null;
|
|
766
810
|
setConnecting(false);
|
|
767
|
-
|
|
811
|
+
setAccountExists(code === "account_exists");
|
|
812
|
+
setError(code === "account_exists"
|
|
813
|
+
? null
|
|
814
|
+
: `Couldn't save Builder credentials: ${message}.`);
|
|
768
815
|
};
|
|
769
|
-
const handleSuccess = async () => {
|
|
816
|
+
const handleSuccess = async (attemptId) => {
|
|
817
|
+
if (!isCurrentConnectAttempt(attemptId))
|
|
818
|
+
return;
|
|
770
819
|
const started = connectStartedAtRef.current;
|
|
771
820
|
if (started == null || callbackSuccessStartedAtRef.current === started) {
|
|
772
821
|
return;
|
|
@@ -774,7 +823,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
774
823
|
callbackSuccessStartedAtRef.current = started;
|
|
775
824
|
let s = null;
|
|
776
825
|
for (let i = 0; i < CALLBACK_SUCCESS_STATUS_RETRIES; i += 1) {
|
|
777
|
-
s = await fetchStatus();
|
|
826
|
+
s = await fetchStatus(undefined, connectAttemptIdRef.current ?? undefined);
|
|
778
827
|
if (!mountedRef.current || connectStartedAtRef.current !== started) {
|
|
779
828
|
return;
|
|
780
829
|
}
|
|
@@ -802,6 +851,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
802
851
|
setEnvManaged(!!s.envManaged);
|
|
803
852
|
setAgentNativeProvisioningEnabled(!!s.agentNativeProvisioningEnabled);
|
|
804
853
|
setAgentNativeProvisioningToken(s.agentNativeProvisioningToken ?? null);
|
|
854
|
+
setAccountExists(s.connectError?.code === "account_exists");
|
|
805
855
|
setBuilderEnabled(!!s.builderEnabled);
|
|
806
856
|
const nextConnectUrl = s.connectUrl ?? null;
|
|
807
857
|
setStatusConnectUrl(nextConnectUrl);
|
|
@@ -811,7 +861,10 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
811
861
|
if (connectError) {
|
|
812
862
|
connectStartedAtRef.current = null;
|
|
813
863
|
setConnecting(false);
|
|
814
|
-
|
|
864
|
+
setAccountExists(connectError.code === "account_exists");
|
|
865
|
+
setError(connectError.code === "account_exists"
|
|
866
|
+
? null
|
|
867
|
+
: `Couldn't save Builder credentials: ${connectError.message}. Try again or contact support.`);
|
|
815
868
|
}
|
|
816
869
|
return;
|
|
817
870
|
}
|
|
@@ -822,6 +875,7 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
822
875
|
setEnvManaged(!!s.envManaged);
|
|
823
876
|
setAgentNativeProvisioningEnabled(!!s.agentNativeProvisioningEnabled);
|
|
824
877
|
setAgentNativeProvisioningToken(s.agentNativeProvisioningToken ?? null);
|
|
878
|
+
setAccountExists(false);
|
|
825
879
|
setBuilderEnabled(!!s.builderEnabled);
|
|
826
880
|
const nextConnectUrl = s.connectUrl ?? null;
|
|
827
881
|
setStatusConnectUrl(nextConnectUrl);
|
|
@@ -844,13 +898,13 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
844
898
|
channel.onmessage = (e) => {
|
|
845
899
|
const data = e.data;
|
|
846
900
|
if (data?.type === "builder-connect-success") {
|
|
847
|
-
void handleSuccess();
|
|
901
|
+
void handleSuccess(data.attemptId);
|
|
848
902
|
return;
|
|
849
903
|
}
|
|
850
904
|
if (data?.type === "builder-connect-error") {
|
|
851
905
|
if (typeof data.message !== "string" || !data.message)
|
|
852
906
|
return;
|
|
853
|
-
handleError(data.message);
|
|
907
|
+
handleError(data.message, data.code, data.attemptId);
|
|
854
908
|
}
|
|
855
909
|
};
|
|
856
910
|
}
|
|
@@ -862,13 +916,13 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
862
916
|
return;
|
|
863
917
|
const data = e.data;
|
|
864
918
|
if (data?.type === "builder-connect-success") {
|
|
865
|
-
void handleSuccess();
|
|
919
|
+
void handleSuccess(data.attemptId);
|
|
866
920
|
return;
|
|
867
921
|
}
|
|
868
922
|
if (data?.type === "builder-connect-error") {
|
|
869
923
|
if (typeof data.message !== "string" || !data.message)
|
|
870
924
|
return;
|
|
871
|
-
handleError(data.message);
|
|
925
|
+
handleError(data.message, data.code, data.attemptId);
|
|
872
926
|
}
|
|
873
927
|
};
|
|
874
928
|
window.addEventListener("message", handler);
|
|
@@ -887,7 +941,9 @@ export function useBuilderConnectFlow(opts = {}) {
|
|
|
887
941
|
orgName,
|
|
888
942
|
connecting,
|
|
889
943
|
error,
|
|
944
|
+
accountExists,
|
|
890
945
|
hasFetchedStatus,
|
|
891
946
|
start,
|
|
947
|
+
retry,
|
|
892
948
|
};
|
|
893
949
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { ActionButton, DesignSystemErrorBoundary, Status, Surface, } from "@agent-native/toolkit/design-system";
|
|
3
3
|
import { IconCheck, IconPlugConnected } from "@tabler/icons-react";
|
|
4
|
+
import { BuilderConnectPopover } from "../settings/BuilderConnectPopover.js";
|
|
4
5
|
import { cn } from "../utils.js";
|
|
5
6
|
import { useBuilderConnectCardController, } from "./useBuilderConnectCardController.js";
|
|
6
7
|
export function DefaultBuilderConnectCardView({ viewModel, className, }) {
|
|
@@ -12,7 +13,7 @@ export function DefaultBuilderConnectCardView({ viewModel, className, }) {
|
|
|
12
13
|
: "neutral";
|
|
13
14
|
return (_jsx(Surface, { as: "section", elevation: "low", padding: "none", className: cn("rounded-lg border border-border bg-background p-4 shadow-sm", className), children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("span", { className: cn("mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-md border", viewModel.configured
|
|
14
15
|
? "border-emerald-500/30 bg-emerald-500/10 text-emerald-600"
|
|
15
|
-
: "border-border bg-muted text-muted-foreground"), children: viewModel.configured ? (_jsx(IconCheck, { className: "size-4" })) : (_jsx(IconPlugConnected, { className: "size-4" })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("h2", { className: "text-sm font-semibold text-foreground", children: viewModel.title }), _jsx(Status, { tone: statusTone, size: "compact", className: "rounded-md border border-border bg-muted px-1.5 py-0.5 text-[11px] font-medium text-muted-foreground", children: viewModel.status.label })] }), _jsx("p", { className: "mt-1 text-sm leading-5 text-muted-foreground", children: viewModel.description }), viewModel.error ? (_jsx("p", { className: "mt-2 text-xs text-destructive", children: viewModel.error })) : null, action ? (_jsx("div", { className: "mt-3", children: _jsx(ActionButton, { type: "button", intent: "primary", size: "compact", pending: action.pending, disabled: action.disabled, className: "inline-flex h-8 items-center gap-2 rounded-md border border-border bg-foreground px-3 text-xs font-medium text-background transition-colors hover:bg-foreground/90 disabled:cursor-not-allowed disabled:opacity-60", leadingIcon: _jsx(IconPlugConnected, { className: "size-3.5" }), onPress: action.onPress, children: action.label }) })) : null] })] }) }));
|
|
16
|
+
: "border-border bg-muted text-muted-foreground"), children: viewModel.configured ? (_jsx(IconCheck, { className: "size-4" })) : (_jsx(IconPlugConnected, { className: "size-4" })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("h2", { className: "text-sm font-semibold text-foreground", children: viewModel.title }), _jsx(Status, { tone: statusTone, size: "compact", className: "rounded-md border border-border bg-muted px-1.5 py-0.5 text-[11px] font-medium text-muted-foreground", children: viewModel.status.label })] }), _jsx("p", { className: "mt-1 text-sm leading-5 text-muted-foreground", children: viewModel.description }), viewModel.error ? (_jsx("p", { className: "mt-2 text-xs text-destructive", children: viewModel.error })) : null, action ? (_jsx("div", { className: "mt-3", children: viewModel.connectFlow ? (_jsx(BuilderConnectPopover, { flow: viewModel.connectFlow, onConnect: action.onPress, children: _jsx(ActionButton, { type: "button", intent: "primary", size: "compact", pending: action.pending, disabled: action.disabled, className: "inline-flex h-8 items-center gap-2 rounded-md border border-border bg-foreground px-3 text-xs font-medium text-background transition-colors hover:bg-foreground/90 disabled:cursor-not-allowed disabled:opacity-60", leadingIcon: _jsx(IconPlugConnected, { className: "size-3.5" }), children: action.label }) })) : (_jsx(ActionButton, { type: "button", intent: "primary", size: "compact", pending: action.pending, disabled: action.disabled, className: "inline-flex h-8 items-center gap-2 rounded-md border border-border bg-foreground px-3 text-xs font-medium text-background transition-colors hover:bg-foreground/90 disabled:cursor-not-allowed disabled:opacity-60", leadingIcon: _jsx(IconPlugConnected, { className: "size-3.5" }), onPress: () => action.onPress(), children: action.label })) })) : null] })] }) }));
|
|
16
17
|
}
|
|
17
18
|
export function BuilderConnectCard({ title, description, trackingSource, className, onConnected, render, }) {
|
|
18
19
|
const viewModel = useBuilderConnectCardController({
|