@agent-native/core 0.176.1 → 0.176.2-nightly-20260831185956
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 +74 -17
- 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 +166 -41
- 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/collab/struct-routes.d.ts +1 -1
- 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/notifications/routes.d.ts +1 -1
- package/dist/oauth-tokens/store.js +6 -3
- package/dist/observability/routes.d.ts +3 -3
- 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/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-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 +29 -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/realtime-token.d.ts +1 -1
- 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/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
|
@@ -23,6 +23,7 @@ import { assertRequestActionSurfaceIsolation, getRequestRunContext, ensureReques
|
|
|
23
23
|
import { fireInternalDispatch } from "../server/self-dispatch.js";
|
|
24
24
|
import { ANALYTICS_CLIENT_PLATFORM_BODY_FIELD } from "../shared/analytics-platform.js";
|
|
25
25
|
import { isReasoningEffort, normalizeReasoningEffortForRequest, stepDownReasoningEffort, } from "../shared/reasoning-effort.js";
|
|
26
|
+
import { SYNTHETIC_TRAFFIC_BETA_E2E, SYNTHETIC_TRAFFIC_HEADER, } from "../shared/test-traffic.js";
|
|
26
27
|
import { actionPreparationContinuationNote } from "./action-continuation-guidance.js";
|
|
27
28
|
import { drainAgentWarnings, formatAgentWarningsForToolResult, } from "./action-warnings.js";
|
|
28
29
|
import { buildSystemManifestSections, readContextXraySystemSections, } from "./context-xray/manifest.js";
|
|
@@ -41,7 +42,7 @@ import { filterHostedHarnessToolNames, normalizeHostedHarnessRuntime, } from "./
|
|
|
41
42
|
import { getDefaultMaxIterations, getDefaultMaxRunInputTokens, MAX_AGENT_MAX_ITERATIONS, MIN_AGENT_MAX_ITERATIONS, normalizeMaxIterations, normalizeMaxRunInputTokens, readAgentLoopSettings, } from "./loop-settings.js";
|
|
42
43
|
import { maybeCompactThread, buildObservationalContext, hasObservationalMemory, serializeObservationalMemoryBlock, } from "./observational-memory/index.js";
|
|
43
44
|
import { ProcessorChain, TripWire, toolCallsFromContent, } from "./processors.js";
|
|
44
|
-
import { startRun, subscribeToRun, getActiveRunForThread, getActiveRunForThreadAsync, getRun, abortRun, abortRunDurably, abortTurnDurably, tryClaimRunSlot, isHostedRuntime, resolveRunSoftTimeoutMs, resolveRunToolTimeoutCeilingMs, endsAfterCompletedToolWithoutAssistantFinal, } from "./run-manager.js";
|
|
45
|
+
import { startRun, subscribeToRun, getActiveRunForThread, getActiveRunForThreadAsync, getRun, abortRun, abortRunDurably, abortTurnDurably, tryClaimRunSlot, isHostedRuntime, resolveRunSoftTimeoutMs, resolveRunToolTimeoutCeilingMs, endsAfterCompletedToolWithoutAssistantFinal, endsDuringActionPreparation, } from "./run-manager.js";
|
|
45
46
|
import { writeLedgerEntry, readLedgerEntry, clearLedgerForThread, insertRun, insertRunEvent, isTurnAborted, markRunAborted, updateRunHeartbeat, updateRunStatusIfRunning, setRunError, setRunTerminalReason, claimBackgroundRun, readBackgroundRunClaim, recordRunDiagnostic, countRunsForTurn, RUN_DIAG_STAGE, UNCLAIMED_BACKGROUND_RUN_GRACE_MS, turnRunLedgerExhausted, } from "./run-store.js";
|
|
46
47
|
import { buildCurrentTimeUserContext } from "./runtime-context.js";
|
|
47
48
|
import { consumeAgentToolApproval, createAgentToolApproval, isAgentToolAlwaysAllowed, resolveAgentToolApprovalTurnId, } from "./tool-approval-store.js";
|
|
@@ -230,6 +231,18 @@ function normalizeBrowserTabId(value) {
|
|
|
230
231
|
const trimmed = value.trim();
|
|
231
232
|
return SAFE_BROWSER_TAB_ID_RE.test(trimmed) ? trimmed : undefined;
|
|
232
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* The usage label is caller-supplied (a template surface, an MCP host, an
|
|
236
|
+
* extension), and it lands in a usage row AND in a trace span name. Bound it
|
|
237
|
+
* and strip control characters here so a client cannot turn either into a
|
|
238
|
+
* payload channel.
|
|
239
|
+
*/
|
|
240
|
+
function normalizeUsageLabel(value) {
|
|
241
|
+
if (typeof value !== "string")
|
|
242
|
+
return undefined;
|
|
243
|
+
const trimmed = value.replace(/[\u0000-\u001f\u007f]/g, " ").trim();
|
|
244
|
+
return trimmed ? trimmed.slice(0, 120) : undefined;
|
|
245
|
+
}
|
|
233
246
|
function normalizeChatScope(value) {
|
|
234
247
|
if (value == null)
|
|
235
248
|
return null;
|
|
@@ -272,14 +285,15 @@ export async function getOwnerApiKey(provider, ownerEmail) {
|
|
|
272
285
|
if (!ownerEmail)
|
|
273
286
|
return undefined;
|
|
274
287
|
const secretKey = PROVIDER_TO_ENV[provider] ?? `${provider.toUpperCase()}_API_KEY`;
|
|
288
|
+
const syntheticTraffic = getRequestContext()?.isSyntheticTraffic === true;
|
|
275
289
|
try {
|
|
276
290
|
const { readAppSecret } = await import("../secrets/storage.js");
|
|
277
291
|
const refs = [{ scope: "user", scopeId: ownerEmail }];
|
|
278
292
|
const orgId = getRequestOrgId();
|
|
279
|
-
if (orgId) {
|
|
293
|
+
if (orgId && !syntheticTraffic) {
|
|
280
294
|
refs.push({ scope: "org", scopeId: orgId }, { scope: "workspace", scopeId: orgId });
|
|
281
295
|
}
|
|
282
|
-
else {
|
|
296
|
+
else if (!syntheticTraffic) {
|
|
283
297
|
refs.push({ scope: "workspace", scopeId: `solo:${ownerEmail}` });
|
|
284
298
|
}
|
|
285
299
|
for (const ref of refs) {
|
|
@@ -298,8 +312,13 @@ export async function getOwnerApiKey(provider, ownerEmail) {
|
|
|
298
312
|
}
|
|
299
313
|
}
|
|
300
314
|
catch {
|
|
301
|
-
// app_secrets table not ready —
|
|
315
|
+
// app_secrets table not ready — only non-synthetic traffic may fall through
|
|
316
|
+
// to legacy lookup. A synthetic run must never bill an alternate key.
|
|
317
|
+
if (syntheticTraffic)
|
|
318
|
+
return undefined;
|
|
302
319
|
}
|
|
320
|
+
if (syntheticTraffic)
|
|
321
|
+
return undefined;
|
|
303
322
|
try {
|
|
304
323
|
const { getSetting } = await import("../settings/store.js");
|
|
305
324
|
const stored = await getSetting(`user-api-key:${provider}:${ownerEmail}`);
|
|
@@ -827,6 +846,10 @@ const FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS = 25_000;
|
|
|
827
846
|
// ceiling and steps effort down a tier) instead of re-issuing the
|
|
828
847
|
// exact same doomed request twice.
|
|
829
848
|
const EMPTY_FINAL_RESPONSE_RETRY_LIMIT = 2;
|
|
849
|
+
// A `max_tokens` stop with tool-call parts present is a tool call cut off
|
|
850
|
+
// mid-arguments. Same escalation shape as the empty-final retry: each attempt
|
|
851
|
+
// raises the ceiling, so re-issuing is not re-issuing the same doomed request.
|
|
852
|
+
const TRUNCATED_TOOL_CALL_RETRY_LIMIT = 2;
|
|
830
853
|
const MAIN_CHAT_INTERNAL_CONTINUATION_LIMIT = 6;
|
|
831
854
|
const RUN_BUDGET_EXHAUSTED_ERROR_CODE = "run_budget_exhausted";
|
|
832
855
|
const RUN_BUDGET_EXHAUSTED_MESSAGE = "I ran out of time before finishing this step. " +
|
|
@@ -1523,6 +1546,13 @@ export async function callConnectedAgentReference(input) {
|
|
|
1523
1546
|
userEmail: callerAuth.userEmail,
|
|
1524
1547
|
orgDomain: callerAuth.orgDomain,
|
|
1525
1548
|
orgSecret: callerAuth.orgSecret,
|
|
1549
|
+
...(getRequestContext()?.isSyntheticTraffic === true
|
|
1550
|
+
? {
|
|
1551
|
+
transportHeaders: {
|
|
1552
|
+
[SYNTHETIC_TRAFFIC_HEADER]: SYNTHETIC_TRAFFIC_BETA_E2E,
|
|
1553
|
+
},
|
|
1554
|
+
}
|
|
1555
|
+
: {}),
|
|
1526
1556
|
onUpdate: relay.observePollUpdate,
|
|
1527
1557
|
});
|
|
1528
1558
|
const responseText = userFacingLlmCredentialError(response, {
|
|
@@ -2954,14 +2984,22 @@ function schemaErrorPropertyNames(error) {
|
|
|
2954
2984
|
* actions have echoed the expected signature since `wrapWithValidation`; this
|
|
2955
2985
|
* gives the raw path the same answer from the same helper.
|
|
2956
2986
|
*/
|
|
2957
|
-
function toolInputSchemaErrorResult(toolName, input, error, parameters
|
|
2987
|
+
function toolInputSchemaErrorResult(toolName, input, error, parameters,
|
|
2988
|
+
/**
|
|
2989
|
+
* The model response carrying this call stopped at the output-token cap, so
|
|
2990
|
+
* the arguments are truncated rather than wrong. Telling the model to match
|
|
2991
|
+
* the schema here is what makes it re-send the same oversized payload.
|
|
2992
|
+
*/
|
|
2993
|
+
outputCapTruncated = false) {
|
|
2958
2994
|
const signature = describeToolParameterSignature(parameters, schemaErrorPropertyNames(error));
|
|
2959
2995
|
return (`Invalid action parameters for ${toolName}: ${sanitizeToolErrorText(error)}. ` +
|
|
2960
2996
|
`Received: ${stringifyToolInput(input)}. ` +
|
|
2961
2997
|
(signature
|
|
2962
2998
|
? `Expected: ${signature} (where * = required, ? = optional). `
|
|
2963
2999
|
: "") +
|
|
2964
|
-
|
|
3000
|
+
(outputCapTruncated
|
|
3001
|
+
? "The tool was not executed: the response hit the model output-token cap before these arguments finished, so they are truncated, not wrong. Retry with a smaller payload — split the work across several calls, or shorten the longest field."
|
|
3002
|
+
: "The tool was not executed; retry with arguments that match the tool schema."));
|
|
2965
3003
|
}
|
|
2966
3004
|
const rawToolInputAjv = new Ajv({
|
|
2967
3005
|
strict: false,
|
|
@@ -3318,7 +3356,14 @@ export async function runAgentLoop(opts) {
|
|
|
3318
3356
|
added.push(name);
|
|
3319
3357
|
}
|
|
3320
3358
|
if (added.length > 0) {
|
|
3321
|
-
|
|
3359
|
+
const expandedTools = (availableTools ?? tools).filter((tool) => activeToolNames.has(tool.name));
|
|
3360
|
+
const prioritizedNames = new Set(names);
|
|
3361
|
+
// Provider adapters cap the schema list; keep search results in the
|
|
3362
|
+
// prefix so the next request can actually call what it discovered.
|
|
3363
|
+
activeTools = [
|
|
3364
|
+
...expandedTools.filter((tool) => prioritizedNames.has(tool.name)),
|
|
3365
|
+
...expandedTools.filter((tool) => !prioritizedNames.has(tool.name)),
|
|
3366
|
+
];
|
|
3322
3367
|
}
|
|
3323
3368
|
if (!reportedExpandedToolSchemaBytes &&
|
|
3324
3369
|
expandedToolSchemaBytes > EXPANDED_TOOL_SCHEMA_WARN_BYTES) {
|
|
@@ -3428,6 +3473,7 @@ export async function runAgentLoop(opts) {
|
|
|
3428
3473
|
}
|
|
3429
3474
|
let finalGuardRetries = 0;
|
|
3430
3475
|
let emptyFinalResponseRetries = 0;
|
|
3476
|
+
let truncatedToolCallRetries = 0;
|
|
3431
3477
|
let iterations = 0;
|
|
3432
3478
|
// `loop_limit` and `done` share one terminal-event slot in run-manager, so a
|
|
3433
3479
|
// trailing `done` would overwrite the boundary the continuation logic reads.
|
|
@@ -4174,6 +4220,37 @@ export async function runAgentLoop(opts) {
|
|
|
4174
4220
|
// permanently disabled for the rest of a long multi-step run.
|
|
4175
4221
|
finalGuardRetries = 0;
|
|
4176
4222
|
emptyFinalResponseRetries = 0;
|
|
4223
|
+
// A `max_tokens` stop is only recognised as truncation in the
|
|
4224
|
+
// `toolCallParts.length === 0` branch above. A tool call cut off
|
|
4225
|
+
// mid-arguments still arrives AS a tool-call part, so without this the
|
|
4226
|
+
// turn reads as a normal one: the partial arguments fail schema
|
|
4227
|
+
// validation, the model is told to "retry with arguments that match the
|
|
4228
|
+
// tool schema", and it re-issues the same oversized payload against the
|
|
4229
|
+
// same ceiling until the identical-error stop fires. The tool never runs
|
|
4230
|
+
// and nothing in the transcript says the response was truncated.
|
|
4231
|
+
//
|
|
4232
|
+
// The tool calls still execute — the assistant turn carrying them is
|
|
4233
|
+
// already in `messages`, and every tool_use needs its tool_result — but
|
|
4234
|
+
// the retry gets a raised ceiling and the error text below names the real
|
|
4235
|
+
// cause.
|
|
4236
|
+
const toolCallTruncatedByOutputCap = terminalStopReason === "max_tokens";
|
|
4237
|
+
if (toolCallTruncatedByOutputCap) {
|
|
4238
|
+
if (truncatedToolCallRetries < TRUNCATED_TOOL_CALL_RETRY_LIMIT) {
|
|
4239
|
+
truncatedToolCallRetries += 1;
|
|
4240
|
+
effectiveMaxOutputTokens =
|
|
4241
|
+
resolveEmptyResponseRetryMaxOutputTokens(model);
|
|
4242
|
+
}
|
|
4243
|
+
else {
|
|
4244
|
+
// Retries spent. The raised ceiling was lent to those attempts, not to
|
|
4245
|
+
// the rest of the run — leaving it in place kept every later request
|
|
4246
|
+
// above the configured cap.
|
|
4247
|
+
effectiveMaxOutputTokens = opts.maxOutputTokens;
|
|
4248
|
+
}
|
|
4249
|
+
}
|
|
4250
|
+
else {
|
|
4251
|
+
truncatedToolCallRetries = 0;
|
|
4252
|
+
effectiveMaxOutputTokens = opts.maxOutputTokens;
|
|
4253
|
+
}
|
|
4177
4254
|
flushUnstreamedAssistantText();
|
|
4178
4255
|
let requestedActionStop = null;
|
|
4179
4256
|
// An `endsTurn` action ran and handed control to the user. Distinct from
|
|
@@ -4711,7 +4788,7 @@ export async function runAgentLoop(opts) {
|
|
|
4711
4788
|
try {
|
|
4712
4789
|
const toolCallSchemaError = toolCallErrors.get(toolCall.id);
|
|
4713
4790
|
if (toolCallSchemaError && !toolInputNormalized) {
|
|
4714
|
-
const result = finalizeToolErrorResult(toolInputSchemaErrorResult(toolCall.name, toolCallSchemaError.input, toolCallSchemaError.error, actionEntry?.tool.parameters));
|
|
4791
|
+
const result = finalizeToolErrorResult(toolInputSchemaErrorResult(toolCall.name, toolCallSchemaError.input, toolCallSchemaError.error, actionEntry?.tool.parameters, toolCallTruncatedByOutputCap));
|
|
4715
4792
|
emitToolDone({
|
|
4716
4793
|
type: "tool_done",
|
|
4717
4794
|
id: toolCall.id,
|
|
@@ -4733,7 +4810,7 @@ export async function runAgentLoop(opts) {
|
|
|
4733
4810
|
}
|
|
4734
4811
|
const rawToolInputError = validateRawToolInput(actionEntry, toolCall.input);
|
|
4735
4812
|
if (rawToolInputError) {
|
|
4736
|
-
const result = finalizeToolErrorResult(toolInputSchemaErrorResult(toolCall.name, toolCall.input, rawToolInputError, actionEntry.tool.parameters));
|
|
4813
|
+
const result = finalizeToolErrorResult(toolInputSchemaErrorResult(toolCall.name, toolCall.input, rawToolInputError, actionEntry.tool.parameters, toolCallTruncatedByOutputCap));
|
|
4737
4814
|
emitToolDone({
|
|
4738
4815
|
type: "tool_done",
|
|
4739
4816
|
id: toolCall.id,
|
|
@@ -5508,7 +5585,8 @@ export function backgroundContinuationReasonForRun(run) {
|
|
|
5508
5585
|
if (last?.type === "error" && isRecoverableContinuationError(last)) {
|
|
5509
5586
|
return continuationReasonForResumableError(new EngineError(last.error, { errorCode: last.errorCode }));
|
|
5510
5587
|
}
|
|
5511
|
-
if (endsAfterCompletedToolWithoutAssistantFinal(run)
|
|
5588
|
+
if (endsAfterCompletedToolWithoutAssistantFinal(run) ||
|
|
5589
|
+
endsDuringActionPreparation(run)) {
|
|
5512
5590
|
return "stream_ended";
|
|
5513
5591
|
}
|
|
5514
5592
|
return "run_timeout";
|
|
@@ -5613,7 +5691,8 @@ export async function runAgentLoopWithMainChatInternalContinuations(opts) {
|
|
|
5613
5691
|
}
|
|
5614
5692
|
function endsAtContinuationBoundary(run) {
|
|
5615
5693
|
return (endsAtInternalContinuationBoundary(run) ||
|
|
5616
|
-
endsAfterCompletedToolWithoutAssistantFinal(run)
|
|
5694
|
+
endsAfterCompletedToolWithoutAssistantFinal(run) ||
|
|
5695
|
+
endsDuringActionPreparation(run));
|
|
5617
5696
|
}
|
|
5618
5697
|
// Defined in `app-config/run-lifecycle-invariants.ts`, the neutral home for
|
|
5619
5698
|
// lifecycle bounds that participate in a cross-module relationship: the durable
|
|
@@ -6513,7 +6592,12 @@ export function createProductionAgentHandler(options) {
|
|
|
6513
6592
|
return { error: "Invalid request body" };
|
|
6514
6593
|
}
|
|
6515
6594
|
}
|
|
6516
|
-
const { message, history = [], structuredHistory, references = [], threadId, attachments, displayMessage, queuedMessageId, internalContinuation, turnId: requestTurnId, model: requestModel, engine: requestEngine, effort: requestEffort, browserTabId, scope, harness: requestHarness, trackInRunsTray, } = body;
|
|
6595
|
+
const { message, history = [], structuredHistory, references = [], threadId, attachments, displayMessage, parentId, queuedMessageId, internalContinuation, turnId: requestTurnId, model: requestModel, engine: requestEngine, effort: requestEffort, browserTabId, scope, harness: requestHarness, trackInRunsTray, } = body;
|
|
6596
|
+
const requestParentId = parentId === null
|
|
6597
|
+
? null
|
|
6598
|
+
: typeof parentId === "string" && parentId.trim()
|
|
6599
|
+
? parentId.trim()
|
|
6600
|
+
: undefined;
|
|
6517
6601
|
setupMark("bodyParsed");
|
|
6518
6602
|
// Durable-background marker. Present ONLY when this handler was re-entered
|
|
6519
6603
|
// as the Netlify background worker via the `_process-run` self-dispatch
|
|
@@ -6859,6 +6943,7 @@ export function createProductionAgentHandler(options) {
|
|
|
6859
6943
|
const model = normalizeModelForEngine(engine, modelCandidate);
|
|
6860
6944
|
let effectiveModel = model;
|
|
6861
6945
|
let modelSelectionSource = modelSelection.source;
|
|
6946
|
+
const turnUsageLabel = normalizeUsageLabel(body.usageLabel);
|
|
6862
6947
|
let experimentAssignments = [];
|
|
6863
6948
|
// Database-backed experiments remain available to app operators.
|
|
6864
6949
|
try {
|
|
@@ -8303,8 +8388,16 @@ export function createProductionAgentHandler(options) {
|
|
|
8303
8388
|
threadId: threadId ?? null,
|
|
8304
8389
|
userId: ownerEmail,
|
|
8305
8390
|
config: obsConfig,
|
|
8391
|
+
// A caller that named its turn (a template surface, an MCP
|
|
8392
|
+
// host, a background send) gets that name in the trace list;
|
|
8393
|
+
// a plain chat turn stays `agent_run` so the common case
|
|
8394
|
+
// still aggregates.
|
|
8395
|
+
spanName: turnUsageLabel && turnUsageLabel !== "chat"
|
|
8396
|
+
? `agent_run:${turnUsageLabel}`
|
|
8397
|
+
: undefined,
|
|
8306
8398
|
metadata: {
|
|
8307
8399
|
modelSelectionSource,
|
|
8400
|
+
...(turnUsageLabel ? { label: turnUsageLabel } : {}),
|
|
8308
8401
|
...(experimentAssignments.length > 0
|
|
8309
8402
|
? { experimentAssignments }
|
|
8310
8403
|
: {}),
|
|
@@ -8369,7 +8462,7 @@ export function createProductionAgentHandler(options) {
|
|
|
8369
8462
|
cacheReadTokens: turnUsage.cacheReadTokens,
|
|
8370
8463
|
cacheWriteTokens: turnUsage.cacheWriteTokens,
|
|
8371
8464
|
model: turnUsage.model,
|
|
8372
|
-
label:
|
|
8465
|
+
label: turnUsageLabel || "chat",
|
|
8373
8466
|
// token_usage has had run_id/thread_id/task_id since it was
|
|
8374
8467
|
// created and every row was NULL on all three, so no spend could
|
|
8375
8468
|
// be tied back to a run, thread, or outcome.
|
|
@@ -8410,6 +8503,7 @@ export function createProductionAgentHandler(options) {
|
|
|
8410
8503
|
// assistant message. Falls back to the runId (turn == run) when the
|
|
8411
8504
|
// client doesn't supply a turnId.
|
|
8412
8505
|
turnId: effectiveTurnId,
|
|
8506
|
+
parentId: requestParentId,
|
|
8413
8507
|
waitUntil: getRequestRunContext()?.waitUntil,
|
|
8414
8508
|
// A durable background worker reaches this same call site, so keying
|
|
8415
8509
|
// only on the foreground self-chain flag stamped every worker run
|
|
@@ -3,6 +3,8 @@ import type { AgentChatEvent, RunEvent, RunStatus } from "./types.js";
|
|
|
3
3
|
export interface ActiveRun {
|
|
4
4
|
runId: string;
|
|
5
5
|
threadId: string;
|
|
6
|
+
/** Parent message for the assistant-ui branch this run is answering. */
|
|
7
|
+
parentId?: string | null;
|
|
6
8
|
/** Logical-turn identity (see StartRunOptions.turnId). Defaults to runId. */
|
|
7
9
|
turnId: string;
|
|
8
10
|
events: RunEvent[];
|
|
@@ -208,6 +210,8 @@ export interface StartRunOptions {
|
|
|
208
210
|
* share one `turnId` so the durable assistant message can be folded across
|
|
209
211
|
* them instead of dropped per-run. Defaults to the runId (turn == run). */
|
|
210
212
|
turnId?: string;
|
|
213
|
+
/** Parent message for the assistant-ui branch this run is answering. */
|
|
214
|
+
parentId?: string | null;
|
|
211
215
|
/**
|
|
212
216
|
* Opt into the durable-background-function soft-timeout regime for THIS run
|
|
213
217
|
* only. When true, `resolveRunSoftTimeoutMs` lifts the hosted ceiling from
|
|
@@ -361,6 +365,11 @@ export declare function resolveBackgroundAutomationSoftTimeoutMs(overrideMs?: nu
|
|
|
361
365
|
* the same boundary evidence.
|
|
362
366
|
*/
|
|
363
367
|
export declare function endsAfterCompletedToolWithoutAssistantFinal(run: ActiveRun): boolean;
|
|
368
|
+
/**
|
|
369
|
+
* A model can emit a lead-in before it starts assembling an action input. If
|
|
370
|
+
* the run ends in that preparation phase, `done` is not a successful turn.
|
|
371
|
+
*/
|
|
372
|
+
export declare function endsDuringActionPreparation(run: ActiveRun): boolean;
|
|
364
373
|
/**
|
|
365
374
|
* Start a new agent run in the background.
|
|
366
375
|
* `runFn` receives a `send` callback and an `AbortSignal`.
|
|
@@ -484,6 +484,33 @@ export function endsAfterCompletedToolWithoutAssistantFinal(run) {
|
|
|
484
484
|
}
|
|
485
485
|
return completedToolAfterLastAssistantText;
|
|
486
486
|
}
|
|
487
|
+
/**
|
|
488
|
+
* A model can emit a lead-in before it starts assembling an action input. If
|
|
489
|
+
* the run ends in that preparation phase, `done` is not a successful turn.
|
|
490
|
+
*/
|
|
491
|
+
export function endsDuringActionPreparation(run) {
|
|
492
|
+
let preparingAction = false;
|
|
493
|
+
for (const { event } of run.events) {
|
|
494
|
+
if (isPreparingActionActivityEvent(event) ||
|
|
495
|
+
event.type === "tool_input_start" ||
|
|
496
|
+
event.type === "tool_input_delta") {
|
|
497
|
+
preparingAction = true;
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
if ((event.type === "text" && event.text.trim().length > 0) ||
|
|
501
|
+
event.type === "tool_start" ||
|
|
502
|
+
event.type === "tool_done" ||
|
|
503
|
+
event.type === "approval_required" ||
|
|
504
|
+
event.type === "clear" ||
|
|
505
|
+
event.type === "error" ||
|
|
506
|
+
event.type === "missing_api_key" ||
|
|
507
|
+
event.type === "auto_continue" ||
|
|
508
|
+
event.type === "loop_limit") {
|
|
509
|
+
preparingAction = false;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
return preparingAction;
|
|
513
|
+
}
|
|
487
514
|
function terminalEventForcesErroredStatus(event) {
|
|
488
515
|
return event?.type === "error" || event?.type === "missing_api_key";
|
|
489
516
|
}
|
|
@@ -734,6 +761,7 @@ export function startRun(runId, threadId, runFn, onComplete, options) {
|
|
|
734
761
|
const run = {
|
|
735
762
|
runId,
|
|
736
763
|
threadId,
|
|
764
|
+
...(options?.parentId !== undefined ? { parentId: options.parentId } : {}),
|
|
737
765
|
turnId: options?.turnId ?? runId,
|
|
738
766
|
events: [],
|
|
739
767
|
status: "running",
|
|
@@ -1565,19 +1593,20 @@ export function startRun(runId, threadId, runFn, onComplete, options) {
|
|
|
1565
1593
|
terminalEventForcesErroredStatus(terminalEvent)
|
|
1566
1594
|
? "errored"
|
|
1567
1595
|
: "completed";
|
|
1568
|
-
const
|
|
1569
|
-
endsAfterCompletedToolWithoutAssistantFinal(run)
|
|
1596
|
+
const shouldAutoContinueAfterUnfinishedTurn = finalStatus === "completed" &&
|
|
1597
|
+
(endsAfterCompletedToolWithoutAssistantFinal(run) ||
|
|
1598
|
+
endsDuringActionPreparation(run)) &&
|
|
1570
1599
|
(!terminalEventForCompletion ||
|
|
1571
1600
|
(terminalEventForCompletion.event.type === "done" &&
|
|
1572
1601
|
terminalEventForCompletion.event.reason !== "user"));
|
|
1573
|
-
const
|
|
1602
|
+
const unfinishedTurnContinuationEvent = shouldAutoContinueAfterUnfinishedTurn
|
|
1574
1603
|
? {
|
|
1575
1604
|
type: "auto_continue",
|
|
1576
1605
|
reason: "stream_ended",
|
|
1577
1606
|
}
|
|
1578
1607
|
: null;
|
|
1579
|
-
if (
|
|
1580
|
-
terminalEvent =
|
|
1608
|
+
if (unfinishedTurnContinuationEvent) {
|
|
1609
|
+
terminalEvent = unfinishedTurnContinuationEvent;
|
|
1581
1610
|
}
|
|
1582
1611
|
const terminalReason = terminalReasonForRun(finalStatus, terminalEvent, run.abortReason, completionError);
|
|
1583
1612
|
// A run that stopped at a continuation boundary did not finish, so it is
|
|
@@ -1607,7 +1636,7 @@ export function startRun(runId, threadId, runFn, onComplete, options) {
|
|
|
1607
1636
|
// client would never see the terminal/continuation signal. We always
|
|
1608
1637
|
// re-stamp the seq at emit time (max-seq+1) just below.
|
|
1609
1638
|
const terminalEventToEmit = finalStatus === "completed"
|
|
1610
|
-
? (
|
|
1639
|
+
? (unfinishedTurnContinuationEvent ??
|
|
1611
1640
|
terminalEventForCompletion?.event ?? { type: "done" })
|
|
1612
1641
|
: terminalEventForCompletion?.event.type === "error" ||
|
|
1613
1642
|
terminalEventForCompletion?.event.type === "missing_api_key"
|
|
@@ -35,6 +35,10 @@ interface BuildAssistantMessageOptions {
|
|
|
35
35
|
*/
|
|
36
36
|
turnId?: string;
|
|
37
37
|
runDurationMs?: number;
|
|
38
|
+
scope?: {
|
|
39
|
+
type: string;
|
|
40
|
+
id: string;
|
|
41
|
+
} | null;
|
|
38
42
|
}
|
|
39
43
|
type AssistantMessage = NonNullable<ReturnType<typeof buildAssistantMessage>>;
|
|
40
44
|
type UserMessage = ReturnType<typeof buildUserMessage>;
|
|
@@ -163,7 +167,7 @@ export declare function upsertUserMessage(repo: any, userMsg: UserMessage): any;
|
|
|
163
167
|
* any assistant content as proof that the frontend already saved the final
|
|
164
168
|
* turn.
|
|
165
169
|
*/
|
|
166
|
-
export declare function upsertAssistantMessage(repo: any, assistantMsg: AssistantMessage): any;
|
|
170
|
+
export declare function upsertAssistantMessage(repo: any, assistantMsg: AssistantMessage, parentId?: string | null): any;
|
|
167
171
|
/**
|
|
168
172
|
* Fold a continuation run's assistant message onto the single durable message
|
|
169
173
|
* for its logical turn (identified by `turnId`), so a turn that spans several
|
|
@@ -183,6 +187,7 @@ export declare function upsertAssistantMessage(repo: any, assistantMsg: Assistan
|
|
|
183
187
|
export declare function foldAssistantTurn(repo: any, assistantMsg: AssistantMessage, options: {
|
|
184
188
|
turnId?: string;
|
|
185
189
|
runId?: string;
|
|
190
|
+
parentId?: string | null;
|
|
186
191
|
}): any;
|
|
187
192
|
export declare function normalizeThreadTitle(value: unknown): string;
|
|
188
193
|
/**
|
|
@@ -251,6 +251,12 @@ export function buildAssistantMessage(events, runId, options = {}) {
|
|
|
251
251
|
const custom = {};
|
|
252
252
|
if (options.turnId)
|
|
253
253
|
custom.turnId = options.turnId;
|
|
254
|
+
if (options.scope?.type && options.scope.id) {
|
|
255
|
+
custom.chatScope = {
|
|
256
|
+
type: options.scope.type,
|
|
257
|
+
id: options.scope.id,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
254
260
|
if (runId)
|
|
255
261
|
custom.foldedRunIds = [runId];
|
|
256
262
|
if (typeof options.runDurationMs === "number" &&
|
|
@@ -443,20 +449,20 @@ function normalizeContentForFingerprint(content) {
|
|
|
443
449
|
? { ...part, toolCallId: undefined }
|
|
444
450
|
: part);
|
|
445
451
|
}
|
|
446
|
-
function
|
|
447
|
-
const
|
|
452
|
+
function messageIdentityKeySet(message) {
|
|
453
|
+
const strong = [];
|
|
448
454
|
if (typeof message?.id === "string" && message.id) {
|
|
449
|
-
|
|
455
|
+
strong.push(`id:${message.id}`);
|
|
450
456
|
}
|
|
451
457
|
const runId = getMessageRunId(message);
|
|
452
458
|
if (runId)
|
|
453
|
-
|
|
459
|
+
strong.push(`run:${runId}`);
|
|
454
460
|
// A logical turn is ONE durable assistant message even though it may span
|
|
455
461
|
// several continuation runs, so two messages sharing a turnId (e.g. the
|
|
456
462
|
// client export and the server fold of the same answer) must dedupe to one.
|
|
457
463
|
const turnId = turnIdOf(message);
|
|
458
464
|
if (turnId)
|
|
459
|
-
|
|
465
|
+
strong.push(`turn:${turnId}`);
|
|
460
466
|
// Normalize attachments through `normalizeAttachmentIdentity` so an
|
|
461
467
|
// explicit empty `[]` (assistant-ui's default for messages with no
|
|
462
468
|
// attachments) and an omitted/undefined `attachments` field hash to the
|
|
@@ -468,8 +474,9 @@ function messageIdentityKeys(message) {
|
|
|
468
474
|
// `[]` vs `undefined`. (Repro on slides prod: every user turn produced
|
|
469
475
|
// a `client_user → assistant → server_user` triple instead of a
|
|
470
476
|
// `user → assistant` pair.)
|
|
477
|
+
const fingerprint = [];
|
|
471
478
|
try {
|
|
472
|
-
|
|
479
|
+
fingerprint.push(`fingerprint:${JSON.stringify({
|
|
473
480
|
role: message?.role,
|
|
474
481
|
content: normalizeContentForFingerprint(message?.content),
|
|
475
482
|
attachments: normalizeAttachmentIdentity(message?.attachments),
|
|
@@ -480,7 +487,7 @@ function messageIdentityKeys(message) {
|
|
|
480
487
|
}
|
|
481
488
|
if (message?.role === "user") {
|
|
482
489
|
try {
|
|
483
|
-
|
|
490
|
+
fingerprint.push(`user-fingerprint:${JSON.stringify({
|
|
484
491
|
role: message.role,
|
|
485
492
|
content: normalizeContentForFingerprint(message.content),
|
|
486
493
|
attachments: normalizeAttachmentIdentity(message.attachments),
|
|
@@ -490,12 +497,52 @@ function messageIdentityKeys(message) {
|
|
|
490
497
|
// Same best-effort behavior as the full fingerprint.
|
|
491
498
|
}
|
|
492
499
|
}
|
|
493
|
-
return
|
|
500
|
+
return { strong, fingerprint };
|
|
501
|
+
}
|
|
502
|
+
function messageIdentityKeys(message) {
|
|
503
|
+
const { strong, fingerprint } = messageIdentityKeySet(message);
|
|
504
|
+
return [...strong, ...fingerprint];
|
|
494
505
|
}
|
|
495
506
|
function messagesMatch(a, b) {
|
|
496
507
|
const bKeys = new Set(messageIdentityKeys(b));
|
|
497
508
|
return messageIdentityKeys(a).some((key) => bKeys.has(key));
|
|
498
509
|
}
|
|
510
|
+
function keySetsOverlap(a, b) {
|
|
511
|
+
return a.some((key) => b.has(key));
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Rank candidate incoming entries for one existing entry: a strong-key match
|
|
515
|
+
* (id/runId/turnId) always wins over a fingerprint-only match, since a
|
|
516
|
+
* fingerprint has no positional or temporal salt and different messages can
|
|
517
|
+
* collide on one. Within a tier, more than one candidate is genuinely
|
|
518
|
+
* ambiguous — nothing in the keys says which is "the same message" — so
|
|
519
|
+
* pick the candidate positioned closest to `existingIndex` instead of
|
|
520
|
+
* silently keeping array-scan order (the original defect: the first unused
|
|
521
|
+
* incoming entry sharing ANY key won, so a fingerprint match on an
|
|
522
|
+
* out-of-order entry could preempt the correct strong-key match and pair the
|
|
523
|
+
* wrong messages, rewriting parent links onto the wrong id).
|
|
524
|
+
*/
|
|
525
|
+
function findRankedIdentityMatch(existingKeys, incomingKeySets, usedIncoming, existingIndex) {
|
|
526
|
+
const strongCandidates = [];
|
|
527
|
+
const fingerprintCandidates = [];
|
|
528
|
+
for (let i = 0; i < incomingKeySets.length; i++) {
|
|
529
|
+
if (usedIncoming.has(i))
|
|
530
|
+
continue;
|
|
531
|
+
const keys = incomingKeySets[i];
|
|
532
|
+
if (keySetsOverlap(existingKeys.strong, new Set(keys.strong))) {
|
|
533
|
+
strongCandidates.push(i);
|
|
534
|
+
}
|
|
535
|
+
else if (keySetsOverlap(existingKeys.fingerprint, new Set(keys.fingerprint))) {
|
|
536
|
+
fingerprintCandidates.push(i);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
const candidates = strongCandidates.length > 0 ? strongCandidates : fingerprintCandidates;
|
|
540
|
+
if (candidates.length === 0)
|
|
541
|
+
return -1;
|
|
542
|
+
return candidates.reduce((closest, index) => Math.abs(index - existingIndex) < Math.abs(closest - existingIndex)
|
|
543
|
+
? index
|
|
544
|
+
: closest);
|
|
545
|
+
}
|
|
499
546
|
function preserveAssistantRunDuration(chosenEntry, otherEntry) {
|
|
500
547
|
const chosen = getStoredMessage(chosenEntry);
|
|
501
548
|
const other = getStoredMessage(otherEntry);
|
|
@@ -1106,18 +1153,19 @@ export function mergeThreadDataForClientSave(existingRepo, incomingRepo, options
|
|
|
1106
1153
|
if (!existingMessages || !incomingMessages) {
|
|
1107
1154
|
return pruneClaimedQueuedMessages(merged);
|
|
1108
1155
|
}
|
|
1109
|
-
const incomingKeySets = incomingMessages.map((entry) =>
|
|
1156
|
+
const incomingKeySets = incomingMessages.map((entry) => messageIdentityKeySet(getStoredMessage(entry)));
|
|
1110
1157
|
const usedIncoming = new Set();
|
|
1111
1158
|
const nextMessages = [];
|
|
1112
1159
|
const idRewrites = new Map();
|
|
1113
|
-
for (
|
|
1160
|
+
for (let existingIndex = 0; existingIndex < existingMessages.length; existingIndex++) {
|
|
1161
|
+
const existingEntry = existingMessages[existingIndex];
|
|
1114
1162
|
const existingMessage = getStoredMessage(existingEntry);
|
|
1115
1163
|
if (existingMessage?.role === "assistant" &&
|
|
1116
1164
|
messageContentIsEmpty(existingMessage.content)) {
|
|
1117
1165
|
continue;
|
|
1118
1166
|
}
|
|
1119
|
-
const existingKeys =
|
|
1120
|
-
const incomingIndex =
|
|
1167
|
+
const existingKeys = messageIdentityKeySet(existingMessage);
|
|
1168
|
+
const incomingIndex = findRankedIdentityMatch(existingKeys, incomingKeySets, usedIncoming, existingIndex);
|
|
1121
1169
|
if (incomingIndex === -1) {
|
|
1122
1170
|
nextMessages.push(existingEntry);
|
|
1123
1171
|
continue;
|
|
@@ -1460,22 +1508,29 @@ function shouldReplaceLastAssistant(lastMessage, assistantMsg) {
|
|
|
1460
1508
|
* any assistant content as proof that the frontend already saved the final
|
|
1461
1509
|
* turn.
|
|
1462
1510
|
*/
|
|
1463
|
-
export function upsertAssistantMessage(repo, assistantMsg) {
|
|
1511
|
+
export function upsertAssistantMessage(repo, assistantMsg, parentId) {
|
|
1464
1512
|
const nextRepo = normalizeThreadRepository(repo);
|
|
1465
1513
|
const lastIndex = nextRepo.messages.length - 1;
|
|
1466
1514
|
const lastEntry = lastIndex >= 0 ? nextRepo.messages[lastIndex] : undefined;
|
|
1467
1515
|
const lastMsg = getStoredMessage(lastEntry);
|
|
1468
1516
|
const lastRole = lastMsg?.role;
|
|
1517
|
+
const lastParentId = lastEntry ? getStoredParentId(lastEntry) : undefined;
|
|
1469
1518
|
if (lastRole === "assistant" &&
|
|
1519
|
+
(parentId === undefined || lastParentId === parentId) &&
|
|
1470
1520
|
shouldReplaceLastAssistant(lastMsg, assistantMsg)) {
|
|
1471
1521
|
nextRepo.messages[lastIndex] = { ...lastEntry, message: assistantMsg };
|
|
1472
1522
|
nextRepo.headId = assistantMsg.id;
|
|
1473
1523
|
return nextRepo;
|
|
1474
1524
|
}
|
|
1475
|
-
const
|
|
1525
|
+
const fallbackParentId = nextRepo.messages.length > 0
|
|
1476
1526
|
? (messageId(getStoredMessage(nextRepo.messages[nextRepo.messages.length - 1])) ?? null)
|
|
1477
1527
|
: null;
|
|
1478
|
-
|
|
1528
|
+
const resolvedParentId = parentId === null ||
|
|
1529
|
+
(typeof parentId === "string" &&
|
|
1530
|
+
nextRepo.messages.some((entry) => messageId(getStoredMessage(entry)) === parentId))
|
|
1531
|
+
? parentId
|
|
1532
|
+
: fallbackParentId;
|
|
1533
|
+
nextRepo.messages.push({ message: assistantMsg, parentId: resolvedParentId });
|
|
1479
1534
|
nextRepo.headId = assistantMsg.id;
|
|
1480
1535
|
return nextRepo;
|
|
1481
1536
|
}
|
|
@@ -1555,12 +1610,14 @@ export function foldAssistantTurn(repo, assistantMsg, options) {
|
|
|
1555
1610
|
const turnId = options.turnId;
|
|
1556
1611
|
const runId = options.runId;
|
|
1557
1612
|
if (!turnId)
|
|
1558
|
-
return upsertAssistantMessage(repo, assistantMsg);
|
|
1613
|
+
return upsertAssistantMessage(repo, assistantMsg, options.parentId);
|
|
1559
1614
|
const nextRepo = normalizeThreadRepository(repo);
|
|
1560
1615
|
const lastIndex = nextRepo.messages.length - 1;
|
|
1561
1616
|
const lastEntry = lastIndex >= 0 ? nextRepo.messages[lastIndex] : undefined;
|
|
1562
1617
|
const lastMsg = getStoredMessage(lastEntry);
|
|
1563
1618
|
const sameTurn = lastMsg?.role === "assistant" &&
|
|
1619
|
+
(options.parentId === undefined ||
|
|
1620
|
+
getStoredParentId(lastEntry) === options.parentId) &&
|
|
1564
1621
|
(turnIdOf(lastMsg) === turnId ||
|
|
1565
1622
|
// A message the client wrote for one of this turn's runs before it
|
|
1566
1623
|
// carried a turnId stamp.
|
|
@@ -1569,7 +1626,7 @@ export function foldAssistantTurn(repo, assistantMsg, options) {
|
|
|
1569
1626
|
// First chunk of this turn (or the previous assistant belongs to an
|
|
1570
1627
|
// earlier turn) — append as a fresh message; buildAssistantMessage already
|
|
1571
1628
|
// stamped turnId + foldedRunIds onto it.
|
|
1572
|
-
return upsertAssistantMessage(repo, assistantMsg);
|
|
1629
|
+
return upsertAssistantMessage(repo, assistantMsg, options.parentId);
|
|
1573
1630
|
}
|
|
1574
1631
|
const existingContent = Array.isArray(lastMsg.content) ? lastMsg.content : [];
|
|
1575
1632
|
const incomingContent = Array.isArray(assistantMsg.content)
|
package/dist/agent/types.d.ts
CHANGED
|
@@ -174,6 +174,8 @@ export interface AgentChatRequest {
|
|
|
174
174
|
structuredHistory?: AgentChatStructuredMessage[];
|
|
175
175
|
references?: AgentChatReference[];
|
|
176
176
|
threadId?: string;
|
|
177
|
+
/** Parent message for assistant-ui sends and regenerations. */
|
|
178
|
+
parentId?: string | null;
|
|
177
179
|
attachments?: AgentChatAttachment[];
|
|
178
180
|
/** Internal retry/continuation requests should not create visible user turns. */
|
|
179
181
|
internalContinuation?: boolean;
|
|
@@ -11,8 +11,12 @@ export declare const agentConfig: z.ZodObject<{
|
|
|
11
11
|
engine: z.ZodOptional<z.ZodString>;
|
|
12
12
|
model: z.ZodOptional<z.ZodString>;
|
|
13
13
|
builtInEngines: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
14
|
+
buildEnginePackages: z.ZodOptional<z.ZodString>;
|
|
14
15
|
mode: z.ZodOptional<z.ZodString>;
|
|
15
16
|
preferBringYourOwnKey: z.ZodDefault<z.ZodBoolean>;
|
|
17
|
+
maxOutputTokens: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
mainChatMaxOutputTokens: z.ZodDefault<z.ZodNumber>;
|
|
19
|
+
emptyResponseRetryMaxOutputTokens: z.ZodDefault<z.ZodNumber>;
|
|
16
20
|
sourceSweepToolCallThreshold: z.ZodDefault<z.ZodNumber>;
|
|
17
21
|
runSoftTimeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
18
22
|
completedRunRetentionMs: z.ZodOptional<z.ZodNumber>;
|