@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
package/dist/server/auth.js
CHANGED
|
@@ -56,6 +56,7 @@ import { extractOAuthStateAppId, extractOAuthStateProvider, } from "../shared/oa
|
|
|
56
56
|
import { PASSWORD_MIN_LENGTH, PASSWORD_MAX_LENGTH, PASSWORD_MAX_LENGTH_MESSAGE, PASSWORD_MIN_LENGTH_MESSAGE, } from "../shared/password-policy.js";
|
|
57
57
|
import { SIGN_IN_CONTINUATION_PARAM, SIGN_IN_ENTRY_PATH, SIGN_IN_LEGACY_ENTRY_PATH, SIGN_IN_LEGACY_RETURN_PARAM, decodeContinuation, normalizeAppPath, signInJourney, } from "../shared/sign-in-journey.js";
|
|
58
58
|
import { AGENT_NATIVE_SOCIAL_IMAGE_ALT, AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT, AGENT_NATIVE_SOCIAL_IMAGE_PATH, AGENT_NATIVE_SOCIAL_IMAGE_TYPE, AGENT_NATIVE_SOCIAL_IMAGE_WIDTH, withAgentNativeSocialImageCacheBuster, } from "../shared/social-meta.js";
|
|
59
|
+
import { getSsrAuthRedirectScript } from "../shared/ssr-auth-redirect.js";
|
|
59
60
|
import { normalizeWorkspaceAppAudience, workspaceAppAudienceFromEnv, workspaceAppRouteAccessFromEnv, } from "../shared/workspace-app-audience.js";
|
|
60
61
|
import { isValidWorkspaceAppIdFormat } from "../shared/workspace-app-id.js";
|
|
61
62
|
import { injectAnalyticsIntoHtml } from "./analytics.js";
|
|
@@ -66,13 +67,14 @@ import { getAuthLoginMode } from "./auth-login-mode.js";
|
|
|
66
67
|
import { injectBetaOptOutPersistence } from "./beta-opt-out-html.js";
|
|
67
68
|
import { createBetterAuthSessionForEmail, ensureGoogleAuthIdentity, getBetterAuthInternalAdapter, getBetterAuthUserIdForEmail, getAuthSecret, getBetterAuth, getBetterAuthSync, isDeployPreview, } from "./better-auth-instance.js";
|
|
68
69
|
import { BUILDER_CONNECT_PARAM, BUILDER_RELAY_PATH, BUILDER_RELAY_STATE_PARAM, verifyBuilderConnectTokenAndGetOwner, verifyBuilderPreviewRelayStateForCallback, } from "./builder-browser.js";
|
|
69
|
-
import { resolveAuthCookieNamespace } from "./cookie-namespace.js";
|
|
70
|
+
import { frameworkSessionHintCookieName, resolveAuthCookieNamespace, } from "./cookie-namespace.js";
|
|
70
71
|
import { getAllowedCorsOrigin, readCorsAllowedOrigins, } from "./cors-origins.js";
|
|
71
72
|
import { readDesktopSso, writeDesktopSso, clearDesktopSso, } from "./desktop-sso.js";
|
|
72
73
|
import { getDeploymentEmailReadiness } from "./email.js";
|
|
73
74
|
import { resolveGoogleSignInCredentials } from "./google-oauth-credentials.js";
|
|
74
75
|
import { isElectron as isElectronRequest, getAppBasePath, getAppUrl, getOrigin, encodeOAuthState, decodeOAuthState, createOAuthSession, oauthCallbackResponse, oauthDesktopExchangePage, oauthErrorPage, resolveOAuthRedirectUri, isAllowedOAuthRedirectUri, } from "./google-oauth.js";
|
|
75
76
|
import { isCanonicalAgentNativeAppRequest, isCanonicalIdentitySsoClientRequest, isDesktopSsoUserAgent, isIdentitySsoExplicitlyEnabled, } from "./identity-sso-store.js";
|
|
77
|
+
import { healUndecryptableJwks } from "./jwks-secret-rotation.js";
|
|
76
78
|
import { resolveCanonicalUserForLegacySession, } from "./legacy-auth-migration.js";
|
|
77
79
|
import { encodeMagicLinkSignupAttribution, MAGIC_LINK_ATTRIBUTION_PARAM, } from "./magic-link-attribution.js";
|
|
78
80
|
import { safeOAuthReturnUrl } from "./oauth-return-url.js";
|
|
@@ -153,6 +155,7 @@ export function getCookieDomain() {
|
|
|
153
155
|
return AUTH_COOKIE_NAMESPACE.frameworkCookieDomain;
|
|
154
156
|
}
|
|
155
157
|
export const COOKIE_NAME = AUTH_COOKIE_NAMESPACE.frameworkCookieName;
|
|
158
|
+
export const SESSION_HINT_COOKIE = frameworkSessionHintCookieName(COOKIE_NAME);
|
|
156
159
|
export const BETTER_AUTH_COOKIE_PREFIX = AUTH_COOKIE_NAMESPACE.betterAuthCookiePrefix;
|
|
157
160
|
const AUTH_DISABLED_OPT_OUT_COOKIE = `${COOKIE_NAME}_auth_disabled_opt_out`;
|
|
158
161
|
/**
|
|
@@ -242,15 +245,21 @@ async function enrichLegacySessionIdentity(session, canonicalUser) {
|
|
|
242
245
|
: {}),
|
|
243
246
|
};
|
|
244
247
|
}
|
|
245
|
-
function deleteCookieFromEveryScope(event, name) {
|
|
248
|
+
function deleteCookieFromEveryScope(event, name, attributes = {}) {
|
|
246
249
|
// Clear host-only cookies first. Then clear any configured domain scope so
|
|
247
250
|
// stale shared cookies stop shadowing isolated app sessions.
|
|
248
|
-
deleteCookie(event, name, { path: "/" });
|
|
251
|
+
deleteCookie(event, name, { ...attributes, path: "/" });
|
|
249
252
|
for (const domain of AUTH_COOKIE_NAMESPACE.frameworkCookieDomainsToClear) {
|
|
250
|
-
deleteCookie(event, name, { path: "/", domain });
|
|
253
|
+
deleteCookie(event, name, { ...attributes, path: "/", domain });
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
export function clearFrameworkSessionHintCookies(event) {
|
|
257
|
+
for (const name of frameworkSessionCookieNamesToClear()) {
|
|
258
|
+
deleteCookieFromEveryScope(event, frameworkSessionHintCookieName(name), crossSiteCookieAttrs(event));
|
|
251
259
|
}
|
|
252
260
|
}
|
|
253
261
|
export function clearFrameworkSessionCookies(event) {
|
|
262
|
+
clearFrameworkSessionHintCookies(event);
|
|
254
263
|
for (const name of frameworkSessionCookieNamesToClear()) {
|
|
255
264
|
deleteCookieFromEveryScope(event, name);
|
|
256
265
|
}
|
|
@@ -1199,10 +1208,16 @@ function getAuthOnboardingHtml(options, event, rawPath, authMode) {
|
|
|
1199
1208
|
return getOnboardingHtml(getOnboardingHtmlOptions(options, event, rawPath, authMode));
|
|
1200
1209
|
}
|
|
1201
1210
|
function getOnboardingLoginHtmlConfig(options, authMode) {
|
|
1202
|
-
if (options.loginHtml)
|
|
1203
|
-
return {
|
|
1211
|
+
if (options.loginHtml) {
|
|
1212
|
+
return {
|
|
1213
|
+
loginHtml: options.loginHtml,
|
|
1214
|
+
authMode,
|
|
1215
|
+
rootAuth: options.rootAuth ?? true,
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1204
1218
|
return {
|
|
1205
1219
|
authMode,
|
|
1220
|
+
rootAuth: options.rootAuth ?? Boolean(options.marketing),
|
|
1206
1221
|
loginHtml: getAuthOnboardingHtml(options, undefined, undefined, authMode),
|
|
1207
1222
|
getLoginHtml: (event, rawPath) => getAuthOnboardingHtml(options, event, rawPath, authMode),
|
|
1208
1223
|
};
|
|
@@ -1696,6 +1711,7 @@ function applyCorsHeaders(event, publicCorsPaths = [], requestPath) {
|
|
|
1696
1711
|
"X-Agent-Native-CSRF",
|
|
1697
1712
|
"X-User-Timezone",
|
|
1698
1713
|
"X-Agent-Native-Desktop-Verifier",
|
|
1714
|
+
"X-Agent-Native-Test-Traffic",
|
|
1699
1715
|
EMBED_TARGET_HEADER,
|
|
1700
1716
|
].join(","));
|
|
1701
1717
|
return { hasOrigin: true, allowed: true };
|
|
@@ -1738,16 +1754,21 @@ function workspaceOAuthCallbackRelayResponse(event) {
|
|
|
1738
1754
|
const { rawPath, search } = getRequestPathAndSearch(event);
|
|
1739
1755
|
const normalizedPath = stripAppBasePath(rawPath);
|
|
1740
1756
|
const basePath = getAppBasePath();
|
|
1741
|
-
if (!
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
rawPath === `${basePath}/_agent-native` ||
|
|
1745
|
-
rawPath.startsWith(`${basePath}/_agent-native/`)) {
|
|
1757
|
+
if (!isFrameworkOAuthCallbackPath(normalizedPath) ||
|
|
1758
|
+
(basePath && rawPath === `${basePath}/_agent-native`) ||
|
|
1759
|
+
(basePath && rawPath.startsWith(`${basePath}/_agent-native/`))) {
|
|
1746
1760
|
return undefined;
|
|
1747
1761
|
}
|
|
1748
1762
|
const state = new URLSearchParams(search.startsWith("?") ? search.slice(1) : search).get("state");
|
|
1749
1763
|
const appId = extractOAuthStateAppId(state);
|
|
1750
1764
|
const provider = extractOAuthStateProvider(state);
|
|
1765
|
+
const isWorkspaceCallbackRelay = isWorkspaceOAuthCallbackRelayEnabled();
|
|
1766
|
+
const isStandaloneGoogleProviderCallback = !isWorkspaceCallbackRelay &&
|
|
1767
|
+
normalizedPath === "/_agent-native/google/callback" &&
|
|
1768
|
+
isWorkspaceGoogleOAuthProvider(provider);
|
|
1769
|
+
if (!isWorkspaceCallbackRelay && !isStandaloneGoogleProviderCallback) {
|
|
1770
|
+
return undefined;
|
|
1771
|
+
}
|
|
1751
1772
|
const cookieAppId = !appId && !provider && normalizedPath === "/_agent-native/google/callback"
|
|
1752
1773
|
? extractMcpOAuthCookieAppId(event, state)
|
|
1753
1774
|
: undefined;
|
|
@@ -1769,7 +1790,7 @@ function workspaceOAuthCallbackRelayResponse(event) {
|
|
|
1769
1790
|
return new Response("", {
|
|
1770
1791
|
status: 302,
|
|
1771
1792
|
headers: {
|
|
1772
|
-
Location: `/${effectiveAppId}${providerCallbackPath}${search}`,
|
|
1793
|
+
Location: `${isWorkspaceCallbackRelay ? `/${effectiveAppId}` : basePath || ""}${providerCallbackPath}${search}`,
|
|
1773
1794
|
},
|
|
1774
1795
|
});
|
|
1775
1796
|
}
|
|
@@ -2070,12 +2091,15 @@ function desktopMagicLinkLandingPage(actionUrl, fields) {
|
|
|
2070
2091
|
});
|
|
2071
2092
|
}
|
|
2072
2093
|
function injectLoginSocialImageMeta(loginHtml, event) {
|
|
2073
|
-
const
|
|
2074
|
-
if (
|
|
2094
|
+
const headCloseMatch = /<\/head\s*>/i.exec(loginHtml);
|
|
2095
|
+
if (!headCloseMatch || headCloseMatch.index === undefined)
|
|
2075
2096
|
return loginHtml;
|
|
2097
|
+
const headCloseIdx = headCloseMatch.index;
|
|
2076
2098
|
const hasAnySocialImage = LOGIN_OG_IMAGE_META_RE.test(loginHtml) ||
|
|
2077
2099
|
LOGIN_TWITTER_IMAGE_META_RE.test(loginHtml);
|
|
2078
|
-
const imageUrl = escapeHtmlAttr(withAgentNativeSocialImageCacheBuster(
|
|
2100
|
+
const imageUrl = escapeHtmlAttr(withAgentNativeSocialImageCacheBuster(event
|
|
2101
|
+
? getAppUrl(event, AGENT_NATIVE_SOCIAL_IMAGE_PATH)
|
|
2102
|
+
: `${getAppBasePath()}${AGENT_NATIVE_SOCIAL_IMAGE_PATH}`));
|
|
2079
2103
|
const tags = [];
|
|
2080
2104
|
if (!hasAnySocialImage) {
|
|
2081
2105
|
tags.push(`<meta property="og:image" content="${imageUrl}">`);
|
|
@@ -2098,8 +2122,37 @@ function injectLoginSocialImageMeta(loginHtml, event) {
|
|
|
2098
2122
|
tags.join("") +
|
|
2099
2123
|
loginHtml.slice(headCloseIdx));
|
|
2100
2124
|
}
|
|
2101
|
-
function
|
|
2102
|
-
|
|
2125
|
+
function injectHeadScript(html, script) {
|
|
2126
|
+
const headCloseMatch = /<\/head\s*>/i.exec(html);
|
|
2127
|
+
if (headCloseMatch?.index !== undefined) {
|
|
2128
|
+
return (html.slice(0, headCloseMatch.index) +
|
|
2129
|
+
script +
|
|
2130
|
+
html.slice(headCloseMatch.index));
|
|
2131
|
+
}
|
|
2132
|
+
const headOpenMatch = /<head\b[^>]*>/i.exec(html);
|
|
2133
|
+
if (headOpenMatch?.index !== undefined) {
|
|
2134
|
+
const headEnd = headOpenMatch.index + headOpenMatch[0].length;
|
|
2135
|
+
return html.slice(0, headEnd) + script + html.slice(headEnd);
|
|
2136
|
+
}
|
|
2137
|
+
const bodyOpenMatch = /<body\b[^>]*>/i.exec(html);
|
|
2138
|
+
if (bodyOpenMatch?.index !== undefined) {
|
|
2139
|
+
return (html.slice(0, bodyOpenMatch.index) +
|
|
2140
|
+
`<head>${script}</head>` +
|
|
2141
|
+
html.slice(bodyOpenMatch.index));
|
|
2142
|
+
}
|
|
2143
|
+
const htmlOpenMatch = /<html\b[^>]*>/i.exec(html);
|
|
2144
|
+
if (htmlOpenMatch?.index !== undefined) {
|
|
2145
|
+
const htmlEnd = htmlOpenMatch.index + htmlOpenMatch[0].length;
|
|
2146
|
+
return (html.slice(0, htmlEnd) + `<head>${script}</head>` + html.slice(htmlEnd));
|
|
2147
|
+
}
|
|
2148
|
+
return `<!doctype html><html><head>${script}</head><body>${html}</body></html>`;
|
|
2149
|
+
}
|
|
2150
|
+
function loginHtmlResponse(loginHtml, event, options = {}) {
|
|
2151
|
+
let html = injectLoginSocialImageMeta(injectBetaOptOutPersistence(loginHtml), options.requestIndependent ? undefined : event);
|
|
2152
|
+
if (options.includeRootAuthRedirect) {
|
|
2153
|
+
html = injectHeadScript(html, getSsrAuthRedirectScript(SESSION_HINT_COOKIE));
|
|
2154
|
+
}
|
|
2155
|
+
return new Response(injectAnalyticsIntoHtml(html), {
|
|
2103
2156
|
status: 200,
|
|
2104
2157
|
headers: {
|
|
2105
2158
|
"Content-Type": "text/html; charset=utf-8",
|
|
@@ -2137,7 +2190,6 @@ function createAuthGuardFn(app) {
|
|
|
2137
2190
|
const url = event.node?.req?.url ?? event.path ?? "/";
|
|
2138
2191
|
const queryStart = url.indexOf("?");
|
|
2139
2192
|
const rawPath = queryStart >= 0 ? url.slice(0, queryStart) : url;
|
|
2140
|
-
const loginHtml = config.getLoginHtml?.(event, rawPath) ?? config.loginHtml;
|
|
2141
2193
|
const p = stripAppBasePath(rawPath);
|
|
2142
2194
|
const normalizedUrl = queryStart >= 0 ? `${p}${url.slice(queryStart)}` : p;
|
|
2143
2195
|
const callbackRelay = workspaceOAuthCallbackRelayResponse(event);
|
|
@@ -2349,6 +2401,17 @@ function createAuthGuardFn(app) {
|
|
|
2349
2401
|
if (p === "/_agent-native/recap-image") {
|
|
2350
2402
|
return;
|
|
2351
2403
|
}
|
|
2404
|
+
// The public home uses the same server-rendered auth surface as the
|
|
2405
|
+
// framework sign-in entry. This is unconditional and does not inspect the
|
|
2406
|
+
// request session, so the cached root document stays identical for every
|
|
2407
|
+
// visitor; the head handoff handles existing sessions in the browser.
|
|
2408
|
+
if (config.rootAuth && p === "/" && isHtmlDocumentRequest(event, p)) {
|
|
2409
|
+
return loginHtmlResponse(config.loginHtml, event, {
|
|
2410
|
+
includeRootAuthRedirect: true,
|
|
2411
|
+
requestIndependent: true,
|
|
2412
|
+
});
|
|
2413
|
+
}
|
|
2414
|
+
const loginHtml = config.getLoginHtml?.(event, rawPath) ?? config.loginHtml;
|
|
2352
2415
|
// Force-sign-in entrypoint. Templates send viewers from public pages
|
|
2353
2416
|
// (share links, embeds) here with a `?return=<path>` query. The clean
|
|
2354
2417
|
// `/sign-in` path is canonical; keep the old framework path as a
|
|
@@ -2691,6 +2754,7 @@ function createLocalDevAuthHandler(config) {
|
|
|
2691
2754
|
return { error: "Local development sign-in is unavailable" };
|
|
2692
2755
|
}
|
|
2693
2756
|
setFrameworkSessionCookie(event, session.token);
|
|
2757
|
+
setFirstRunOnboardingCookie(event);
|
|
2694
2758
|
await addSession(session.token, session.email);
|
|
2695
2759
|
return authLoginResponse(event, session.token, session.email);
|
|
2696
2760
|
}
|
|
@@ -2782,6 +2846,7 @@ async function maybeAutoCreateDevSession(event, redirectTo) {
|
|
|
2782
2846
|
if (!result?.token)
|
|
2783
2847
|
return null;
|
|
2784
2848
|
setFrameworkSessionCookie(event, result.token);
|
|
2849
|
+
setFirstRunOnboardingCookie(event);
|
|
2785
2850
|
await addSession(result.token, AUTO_DEV_ACCOUNT_EMAIL);
|
|
2786
2851
|
// Emit the session cookie ON the 302 itself. Returning a bare
|
|
2787
2852
|
// `new Response(...)` here drops the cookie staged on event.node.res
|
|
@@ -2991,7 +3056,7 @@ function isReadMethod(event) {
|
|
|
2991
3056
|
* dev keeps the default `SameSite=Lax`; `None` requires Secure, and
|
|
2992
3057
|
* `Partitioned` only takes effect alongside `Secure`.
|
|
2993
3058
|
*/
|
|
2994
|
-
function crossSiteCookieAttrs(event) {
|
|
3059
|
+
export function crossSiteCookieAttrs(event) {
|
|
2995
3060
|
return isHttpsRequest(event)
|
|
2996
3061
|
? { sameSite: "none", secure: true, partitioned: true }
|
|
2997
3062
|
: { sameSite: "lax", secure: false };
|
|
@@ -3011,6 +3076,7 @@ function desktopOAuthBrowserBindingCookieAttrs(event) {
|
|
|
3011
3076
|
function setFirstRunOnboardingCookie(event) {
|
|
3012
3077
|
setCookie(event, FIRST_RUN_ONBOARDING_COOKIE, "1", {
|
|
3013
3078
|
...crossSiteCookieAttrs(event),
|
|
3079
|
+
...cookieDomainAttrs(),
|
|
3014
3080
|
httpOnly: false,
|
|
3015
3081
|
path: "/",
|
|
3016
3082
|
maxAge: FIRST_RUN_ONBOARDING_MAX_AGE,
|
|
@@ -3019,7 +3085,17 @@ function setFirstRunOnboardingCookie(event) {
|
|
|
3019
3085
|
function clearFirstRunOnboardingCookie(event) {
|
|
3020
3086
|
deleteCookie(event, FIRST_RUN_ONBOARDING_COOKIE, {
|
|
3021
3087
|
...crossSiteCookieAttrs(event),
|
|
3088
|
+
...cookieDomainAttrs(),
|
|
3089
|
+
path: "/",
|
|
3090
|
+
});
|
|
3091
|
+
}
|
|
3092
|
+
function setFrameworkSessionHintCookie(event) {
|
|
3093
|
+
setCookie(event, SESSION_HINT_COOKIE, "1", {
|
|
3094
|
+
...crossSiteCookieAttrs(event),
|
|
3095
|
+
...cookieDomainAttrs(),
|
|
3096
|
+
httpOnly: false,
|
|
3022
3097
|
path: "/",
|
|
3098
|
+
maxAge: sessionMaxAge,
|
|
3023
3099
|
});
|
|
3024
3100
|
}
|
|
3025
3101
|
export function setFrameworkSessionCookie(event, token) {
|
|
@@ -3031,6 +3107,7 @@ export function setFrameworkSessionCookie(event, token) {
|
|
|
3031
3107
|
path: "/",
|
|
3032
3108
|
maxAge: sessionMaxAge,
|
|
3033
3109
|
});
|
|
3110
|
+
setFrameworkSessionHintCookie(event);
|
|
3034
3111
|
}
|
|
3035
3112
|
/**
|
|
3036
3113
|
* Build a redirect `Response` that carries the security-sensitive headers just
|
|
@@ -4062,6 +4139,36 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
4062
4139
|
const isResponse = response != null &&
|
|
4063
4140
|
typeof response.status === "number" &&
|
|
4064
4141
|
typeof response.headers?.get === "function";
|
|
4142
|
+
if (isSignOut &&
|
|
4143
|
+
isResponse &&
|
|
4144
|
+
response.status >= 200 &&
|
|
4145
|
+
response.status < 400) {
|
|
4146
|
+
const stagedHeaders = event.res?.headers;
|
|
4147
|
+
const stagedCookieCount = stagedHeaders
|
|
4148
|
+
? getSetCookieHeaders(stagedHeaders).length
|
|
4149
|
+
: 0;
|
|
4150
|
+
clearFrameworkSessionHintCookies(event);
|
|
4151
|
+
if (stagedHeaders) {
|
|
4152
|
+
for (const cookie of getSetCookieHeaders(stagedHeaders).slice(stagedCookieCount)) {
|
|
4153
|
+
response.headers.append("set-cookie", cookie);
|
|
4154
|
+
}
|
|
4155
|
+
}
|
|
4156
|
+
}
|
|
4157
|
+
if (isResponse &&
|
|
4158
|
+
response.status >= 200 &&
|
|
4159
|
+
response.status < 400 &&
|
|
4160
|
+
extractSessionTokenFromSetCookies(response)) {
|
|
4161
|
+
const stagedHeaders = event.res?.headers;
|
|
4162
|
+
const stagedCookieCount = stagedHeaders
|
|
4163
|
+
? getSetCookieHeaders(stagedHeaders).length
|
|
4164
|
+
: 0;
|
|
4165
|
+
setFrameworkSessionHintCookie(event);
|
|
4166
|
+
if (stagedHeaders) {
|
|
4167
|
+
for (const cookie of getSetCookieHeaders(stagedHeaders).slice(stagedCookieCount)) {
|
|
4168
|
+
response.headers.append("set-cookie", cookie);
|
|
4169
|
+
}
|
|
4170
|
+
}
|
|
4171
|
+
}
|
|
4065
4172
|
if (isMagicLinkVerification && isResponse) {
|
|
4066
4173
|
logMagicLinkVerificationResponse(event, "better-auth-catch-all", response, magicLinkPreConsume);
|
|
4067
4174
|
if (response.status >= 200 &&
|
|
@@ -4073,6 +4180,24 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
4073
4180
|
await ensureEmailVerifiedForRedirect(authRequest, response);
|
|
4074
4181
|
}
|
|
4075
4182
|
}
|
|
4183
|
+
// A rotated BETTER_AUTH_SECRET leaves the persisted JWKS key
|
|
4184
|
+
// undecryptable, and Better Auth turns that into a 500 on any endpoint
|
|
4185
|
+
// that signs a JWT (e.g. /token). The get-session hook heals itself via
|
|
4186
|
+
// withJwksRotationRecovery; this backstop covers the endpoints that
|
|
4187
|
+
// sign directly. healUndecryptableJwks verifies the key against the
|
|
4188
|
+
// live secret before expiring anything, so a coincidental 500 is a
|
|
4189
|
+
// no-op here. Magic-link verify is excluded: its one-time token is
|
|
4190
|
+
// already consumed, so a replay can only produce a worse redirect.
|
|
4191
|
+
if (isResponse &&
|
|
4192
|
+
response.status >= 500 &&
|
|
4193
|
+
!isMagicLinkVerification &&
|
|
4194
|
+
getMethod(event) === "GET" &&
|
|
4195
|
+
(await healUndecryptableJwks())) {
|
|
4196
|
+
response = await auth.handler(new Request(requestForAuth.url, {
|
|
4197
|
+
method: "GET",
|
|
4198
|
+
headers: requestForAuth.headers,
|
|
4199
|
+
}));
|
|
4200
|
+
}
|
|
4076
4201
|
if (isResponse && response.status >= 400) {
|
|
4077
4202
|
// The direct Better Auth surface is also reachable from the browser,
|
|
4078
4203
|
// so wrapper-route sanitization alone is not enough to keep adapter
|
|
@@ -4183,7 +4308,8 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
4183
4308
|
// Best-effort — don't block the response
|
|
4184
4309
|
}
|
|
4185
4310
|
}
|
|
4186
|
-
if (reqPath.includes("/sign-up/email")
|
|
4311
|
+
if ((reqPath.includes("/sign-up/email") ||
|
|
4312
|
+
reqPath.includes("/sign-in/email")) &&
|
|
4187
4313
|
isResponse &&
|
|
4188
4314
|
response.status >= 200 &&
|
|
4189
4315
|
response.status < 300) {
|
|
@@ -4220,6 +4346,7 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
4220
4346
|
});
|
|
4221
4347
|
if (result?.token) {
|
|
4222
4348
|
setFrameworkSessionCookie(event, result.token);
|
|
4349
|
+
setFirstRunOnboardingCookie(event);
|
|
4223
4350
|
await addSession(result.token, email);
|
|
4224
4351
|
if (isElectronRequest(event)) {
|
|
4225
4352
|
await writeDesktopSso({
|
|
@@ -4511,6 +4638,10 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
4511
4638
|
return { error: "Method not allowed" };
|
|
4512
4639
|
}
|
|
4513
4640
|
const session = await getSession(event);
|
|
4641
|
+
if (session)
|
|
4642
|
+
setFrameworkSessionHintCookie(event);
|
|
4643
|
+
else
|
|
4644
|
+
clearFrameworkSessionHintCookies(event);
|
|
4514
4645
|
return session ?? { error: "Not authenticated" };
|
|
4515
4646
|
}));
|
|
4516
4647
|
// GET /_agent-native/auth/reset — HTML page shown when a user clicks the
|
|
@@ -4521,7 +4652,11 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
4521
4652
|
setResponseStatus(event, 405);
|
|
4522
4653
|
return { error: "Method not allowed" };
|
|
4523
4654
|
}
|
|
4524
|
-
|
|
4655
|
+
const requestPath = event.context?._mountedPathname ??
|
|
4656
|
+
event.node?.req?.url ??
|
|
4657
|
+
event.path ??
|
|
4658
|
+
"/";
|
|
4659
|
+
return new Response(getResetPasswordHtml(requestPath), {
|
|
4525
4660
|
headers: { "Content-Type": "text/html; charset=utf-8" },
|
|
4526
4661
|
});
|
|
4527
4662
|
}));
|
|
@@ -4576,6 +4711,7 @@ function mountAuthFallbackRoutes(app) {
|
|
|
4576
4711
|
});
|
|
4577
4712
|
if (result?.token) {
|
|
4578
4713
|
setFrameworkSessionCookie(event, result.token);
|
|
4714
|
+
setFirstRunOnboardingCookie(event);
|
|
4579
4715
|
await addSession(result.token, email);
|
|
4580
4716
|
if (isElectronRequest(event)) {
|
|
4581
4717
|
await writeDesktopSso({
|
|
@@ -4676,6 +4812,10 @@ function mountAuthFallbackRoutes(app) {
|
|
|
4676
4812
|
return { error: "Method not allowed" };
|
|
4677
4813
|
}
|
|
4678
4814
|
const session = await getSession(event);
|
|
4815
|
+
if (session)
|
|
4816
|
+
setFrameworkSessionHintCookie(event);
|
|
4817
|
+
else
|
|
4818
|
+
clearFrameworkSessionHintCookies(event);
|
|
4679
4819
|
return session ?? { error: "Not authenticated" };
|
|
4680
4820
|
}));
|
|
4681
4821
|
}
|
|
@@ -4725,6 +4865,12 @@ export async function autoMountAuth(app, options = {}) {
|
|
|
4725
4865
|
_authGuardConfig.loginHtml = loginHtmlConfig.loginHtml;
|
|
4726
4866
|
_authGuardConfig.getLoginHtml = loginHtmlConfig.getLoginHtml;
|
|
4727
4867
|
}
|
|
4868
|
+
if (options.rootAuth !== undefined) {
|
|
4869
|
+
_authGuardConfig.rootAuth = options.rootAuth;
|
|
4870
|
+
}
|
|
4871
|
+
else if (options.loginHtml || options.marketing) {
|
|
4872
|
+
_authGuardConfig.rootAuth = true;
|
|
4873
|
+
}
|
|
4728
4874
|
if (options.publicPaths) {
|
|
4729
4875
|
_authGuardConfig.publicPaths = [
|
|
4730
4876
|
...(_authGuardConfig.publicPaths ?? []),
|
|
@@ -4813,6 +4959,7 @@ export async function autoMountAuth(app, options = {}) {
|
|
|
4813
4959
|
: {
|
|
4814
4960
|
getLoginHtml: () => getCustomAuthRequiredHtml(),
|
|
4815
4961
|
}),
|
|
4962
|
+
rootAuth: options.rootAuth ?? Boolean(options.loginHtml),
|
|
4816
4963
|
publicPaths,
|
|
4817
4964
|
publicCorsPaths: options.publicCorsPaths ?? [],
|
|
4818
4965
|
workspaceAppAudience,
|
|
@@ -43,7 +43,9 @@ import { getWorkspaceA2ADerivedSecret } from "./derived-secret.js";
|
|
|
43
43
|
import { renderMagicLinkEmail, renderResetPasswordEmail, renderVerifySignupEmail, } from "./email-templates.js";
|
|
44
44
|
import { getDeploymentEmailReadiness, sendEmail, } from "./email.js";
|
|
45
45
|
import { recordActiveGoogleSignInCredentials, resolveGoogleSignInCredentials, } from "./google-oauth-credentials.js";
|
|
46
|
+
import { withJwksRotationRecovery } from "./jwks-secret-rotation.js";
|
|
46
47
|
import { readMagicLinkSignupAttribution } from "./magic-link-attribution.js";
|
|
48
|
+
import { getConfiguredOriginAllowlist } from "./origin-allowlist.js";
|
|
47
49
|
import { getRequestContext, hasContinuationLocalRequestContext, } from "./request-context.js";
|
|
48
50
|
export { getAuthLoginMode, resolveAuthLoginMode, resolveAuthLoginModeFromReadiness, } from "./auth-login-mode.js";
|
|
49
51
|
async function flushSignupTracking() {
|
|
@@ -1225,13 +1227,21 @@ async function createBetterAuthInstance(config) {
|
|
|
1225
1227
|
email,
|
|
1226
1228
|
magicLinkUrl: deliveredMagicLinkUrl,
|
|
1227
1229
|
});
|
|
1228
|
-
await sendEmail({
|
|
1230
|
+
await sendEmail({
|
|
1231
|
+
to: email,
|
|
1232
|
+
subject,
|
|
1233
|
+
html,
|
|
1234
|
+
text,
|
|
1235
|
+
appSender,
|
|
1236
|
+
disableClickTracking: true,
|
|
1237
|
+
});
|
|
1229
1238
|
},
|
|
1230
1239
|
});
|
|
1231
1240
|
const auth = betterAuth({
|
|
1232
1241
|
basePath,
|
|
1233
1242
|
baseURL: appUrl,
|
|
1234
1243
|
database,
|
|
1244
|
+
trustedOrigins: [...getConfiguredOriginAllowlist()],
|
|
1235
1245
|
// Auth schema relations are intentionally not registered here. Keep the
|
|
1236
1246
|
// experimental relational-query path off so a bundled Drizzle adapter
|
|
1237
1247
|
// cannot recurse while resolving a session or account join.
|
|
@@ -1262,6 +1272,7 @@ async function createBetterAuthInstance(config) {
|
|
|
1262
1272
|
html,
|
|
1263
1273
|
text,
|
|
1264
1274
|
appSender,
|
|
1275
|
+
disableClickTracking: true,
|
|
1265
1276
|
templateId: CORE_RESET_PASSWORD_EMAIL_ID,
|
|
1266
1277
|
});
|
|
1267
1278
|
},
|
|
@@ -1293,6 +1304,7 @@ async function createBetterAuthInstance(config) {
|
|
|
1293
1304
|
html,
|
|
1294
1305
|
text,
|
|
1295
1306
|
appSender,
|
|
1307
|
+
disableClickTracking: true,
|
|
1296
1308
|
templateId: CORE_VERIFY_SIGNUP_EMAIL_ID,
|
|
1297
1309
|
});
|
|
1298
1310
|
},
|
|
@@ -1443,13 +1455,15 @@ async function createBetterAuthInstance(config) {
|
|
|
1443
1455
|
},
|
|
1444
1456
|
plugins: [
|
|
1445
1457
|
magicLinkPlugin,
|
|
1446
|
-
// JWT: issue tokens for A2A calls, JWKS endpoint for verification
|
|
1447
|
-
|
|
1458
|
+
// JWT: issue tokens for A2A calls, JWKS endpoint for verification.
|
|
1459
|
+
// Wrapped so a rotated BETTER_AUTH_SECRET (which orphans the encrypted
|
|
1460
|
+
// jwks row) heals in place instead of 500ing every get-session.
|
|
1461
|
+
withJwksRotationRecovery(jwt({
|
|
1448
1462
|
jwt: {
|
|
1449
1463
|
issuer: appUrl,
|
|
1450
1464
|
expirationTime: "15m",
|
|
1451
1465
|
},
|
|
1452
|
-
}),
|
|
1466
|
+
})),
|
|
1453
1467
|
// Bearer: accept Bearer tokens on API requests
|
|
1454
1468
|
bearer(),
|
|
1455
1469
|
...(config?.plugins ?? []),
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
import { type MigrationEntry } from "../db/migrations.js";
|
|
2
|
+
/**
|
|
3
|
+
* Better Auth encrypts persisted JWT private keys with the current auth
|
|
4
|
+
* secret. If that secret is rotated, the old row remains the newest key and
|
|
5
|
+
* every token-producing request fails before it can mint a replacement. Mark
|
|
6
|
+
* active rows expired during the release so Better Auth rotates the signing
|
|
7
|
+
* key without touching users or sessions. The JWKS endpoint keeps expired
|
|
8
|
+
* keys during its grace period, so already-issued short-lived tokens remain
|
|
9
|
+
* verifiable while the new key propagates.
|
|
10
|
+
*
|
|
11
|
+
* Also invoked at runtime by `jwks-secret-rotation.ts` when a live request
|
|
12
|
+
* hits the decrypt failure — release migrations do not reach every deployed
|
|
13
|
+
* database, so the release-time pass alone cannot be relied on.
|
|
14
|
+
*/
|
|
15
|
+
export declare function expireJwksKeysAfterAuthSecretRotation(): Promise<void>;
|
|
2
16
|
/**
|
|
3
17
|
* Better Auth's framework-owned schema. This is deliberately a release
|
|
4
18
|
* migration, not a fallback inside `getBetterAuth()`: request functions must
|
|
@@ -35,8 +35,12 @@ async function assertBetterAuthUserIdentityColumns() {
|
|
|
35
35
|
* key without touching users or sessions. The JWKS endpoint keeps expired
|
|
36
36
|
* keys during its grace period, so already-issued short-lived tokens remain
|
|
37
37
|
* verifiable while the new key propagates.
|
|
38
|
+
*
|
|
39
|
+
* Also invoked at runtime by `jwks-secret-rotation.ts` when a live request
|
|
40
|
+
* hits the decrypt failure — release migrations do not reach every deployed
|
|
41
|
+
* database, so the release-time pass alone cannot be relied on.
|
|
38
42
|
*/
|
|
39
|
-
async function expireJwksKeysAfterAuthSecretRotation() {
|
|
43
|
+
export async function expireJwksKeysAfterAuthSecretRotation() {
|
|
40
44
|
const { getDbExec, isPostgres } = await import("../db/client.js");
|
|
41
45
|
const now = isPostgres() ? new Date().toISOString() : Date.now();
|
|
42
46
|
const table = isPostgres() ? '"jwks"' : "jwks";
|
|
@@ -41,9 +41,21 @@ export async function resolveBuilderApiAuthorization(requiredScope) {
|
|
|
41
41
|
// the grant is org-scoped, and a recording that finalizes after the user
|
|
42
42
|
// switched org must still authorize against the org it belongs to. The
|
|
43
43
|
// legacy private-key path already resolves this way.
|
|
44
|
-
const orgId = getRequestOrgId();
|
|
44
|
+
const orgId = getRequestOrgId() ?? null;
|
|
45
45
|
if (ownerEmail && (await readOAuthCustody(ownerEmail, orgId))) {
|
|
46
|
-
|
|
46
|
+
let session;
|
|
47
|
+
try {
|
|
48
|
+
session = await readCredentialStore(() => getBuilderOAuthSession(ownerEmail, orgId, requiredScope));
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (requiredScope &&
|
|
52
|
+
err instanceof Error &&
|
|
53
|
+
err.message ===
|
|
54
|
+
`Builder OAuth connection does not grant ${requiredScope}`) {
|
|
55
|
+
throw new Error(`Builder.io access needs re-authorizing to grant ${requiredScope}. Open Settings and authorize Builder.io again.`);
|
|
56
|
+
}
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
47
59
|
if (!session) {
|
|
48
60
|
throw new Error("Builder.io access expired. Re-authorize Builder.io in Settings to continue.");
|
|
49
61
|
}
|
|
@@ -69,7 +81,8 @@ export async function resolveBuilderApiAuthorization(requiredScope) {
|
|
|
69
81
|
*/
|
|
70
82
|
export async function hasBuilderApiCredentialCustody() {
|
|
71
83
|
const ownerEmail = getRequestUserEmail();
|
|
72
|
-
|
|
84
|
+
const orgId = getRequestOrgId() ?? null;
|
|
85
|
+
if (ownerEmail && (await readOAuthCustody(ownerEmail, orgId))) {
|
|
73
86
|
return true;
|
|
74
87
|
}
|
|
75
88
|
return !!(await resolveBuilderPrivateKey());
|
|
@@ -80,10 +93,21 @@ export async function hasBuilderApiCredentialCustody() {
|
|
|
80
93
|
*/
|
|
81
94
|
export async function canAuthorizeBuilderApiRequest(requiredScope) {
|
|
82
95
|
const ownerEmail = getRequestUserEmail();
|
|
83
|
-
const orgId = getRequestOrgId();
|
|
96
|
+
const orgId = getRequestOrgId() ?? null;
|
|
84
97
|
if (ownerEmail && (await hasBuilderOAuthSession(ownerEmail, orgId))) {
|
|
85
|
-
|
|
86
|
-
|
|
98
|
+
try {
|
|
99
|
+
const session = await getBuilderOAuthSession(ownerEmail, orgId, requiredScope);
|
|
100
|
+
return (!!session && (!requiredScope || session.scopes.includes(requiredScope)));
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
if (requiredScope &&
|
|
104
|
+
err instanceof Error &&
|
|
105
|
+
err.message ===
|
|
106
|
+
`Builder OAuth connection does not grant ${requiredScope}`) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
87
111
|
}
|
|
88
112
|
return !!(await resolveBuilderPrivateKey());
|
|
89
113
|
}
|
|
@@ -36,6 +36,11 @@ export interface BuilderRelayRequestBody {
|
|
|
36
36
|
relayState: string;
|
|
37
37
|
credentials: BuilderRelayCredentials;
|
|
38
38
|
}
|
|
39
|
+
export declare class BuilderAccountProvisioningError extends Error {
|
|
40
|
+
readonly code: string | null;
|
|
41
|
+
constructor(message: string, code?: string);
|
|
42
|
+
}
|
|
43
|
+
export declare function isBuilderAccountAlreadyExistsError(error: unknown): boolean;
|
|
39
44
|
export declare function createBuilderConnectState(): string;
|
|
40
45
|
export declare function isSignedBuilderConnectState(value: string | null | undefined): boolean;
|
|
41
46
|
/**
|
|
@@ -123,6 +128,7 @@ export declare const BUILDER_AGENT_NATIVE_TEMPLATE_PARAM = "agentNativeTemplate"
|
|
|
123
128
|
export declare const BUILDER_CONNECT_MODE_PARAM = "_an_mode";
|
|
124
129
|
export declare const BUILDER_AGENT_NATIVE_PROVISION_MODE = "agent-native";
|
|
125
130
|
export declare const BUILDER_PROVISIONING_TOKEN_PARAM = "_an_provision";
|
|
131
|
+
export declare const BUILDER_CONNECT_ATTEMPT_PARAM = "_an_connect_attempt";
|
|
126
132
|
export declare function appendBuilderConnectStateCookie(value: string | null | undefined, state: string): string;
|
|
127
133
|
export declare function removeBuilderConnectStateCookie(value: string | null | undefined, state: string): string;
|
|
128
134
|
export declare function resolveBuilderConnectCallbackState(queryState: string | null, cookieState: string | null | undefined): string | null;
|
|
@@ -162,6 +168,7 @@ export interface BuilderBrowserStatus {
|
|
|
162
168
|
connectError?: {
|
|
163
169
|
message: string;
|
|
164
170
|
at: number;
|
|
171
|
+
code?: string;
|
|
165
172
|
};
|
|
166
173
|
appHost: string;
|
|
167
174
|
apiHost: string;
|
|
@@ -322,6 +329,7 @@ export declare function resolveBuilderCallbackReturnUrl(options: {
|
|
|
322
329
|
}): string;
|
|
323
330
|
export declare function createBuilderBrowserCallbackPage(previewUrl: string, opts?: {
|
|
324
331
|
parentOrigin?: string;
|
|
332
|
+
attemptId?: string;
|
|
325
333
|
}): string;
|
|
326
334
|
/**
|
|
327
335
|
* HTML page rendered inside the OAuth popup when the callback handler caught
|
|
@@ -342,6 +350,8 @@ export declare function createBuilderBrowserCallbackErrorPage(message: string, o
|
|
|
342
350
|
body?: string;
|
|
343
351
|
closeHint?: string;
|
|
344
352
|
parentOrigin?: string;
|
|
353
|
+
code?: string;
|
|
354
|
+
attemptId?: string;
|
|
345
355
|
}): string;
|
|
346
356
|
export interface RunBuilderAgentArgs {
|
|
347
357
|
prompt: string;
|