@agent-native/core 0.82.0 → 0.84.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +34 -0
- package/corpus/core/README.md +2 -2
- package/corpus/core/docs/content/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/ar-SA/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/de-DE/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/es-ES/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/fr-FR/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/hi-IN/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/ja-JP/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/ko-KR/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/pt-BR/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-CN/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-TW/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +1 -1
- package/corpus/core/docs/content/template-chat.mdx +1 -1
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/engine/builtin.ts +1 -1
- package/corpus/core/src/agent/engine/output-tokens.ts +1 -1
- package/corpus/core/src/agent/harness/acp-adapter.ts +28 -4
- package/corpus/core/src/agent/harness/ai-sdk-adapter.ts +3 -0
- package/corpus/core/src/agent/harness/translate.ts +3 -0
- package/corpus/core/src/agent/harness/types.ts +1 -0
- package/corpus/core/src/agent/model-config.ts +34 -13
- package/corpus/core/src/agent/production-agent.ts +87 -10
- package/corpus/core/src/agent/thread-data-builder.ts +29 -4
- package/corpus/core/src/agent/tool-call-journal.ts +109 -48
- package/corpus/core/src/agent/types.ts +6 -1
- package/corpus/core/src/cli/design-connect.ts +106 -0
- package/corpus/core/src/cli/gateway-helpers.ts +17 -0
- package/corpus/core/src/cli/recap.ts +0 -2
- package/corpus/core/src/cli/skills.ts +54 -16
- package/corpus/core/src/cli/workspace-dev.ts +29 -5
- package/corpus/core/src/client/AssistantChat.tsx +89 -42
- package/corpus/core/src/client/CommandMenu.tsx +34 -12
- package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
- package/corpus/core/src/client/chat/message-components.tsx +49 -1
- package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
- package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
- package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
- package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
- package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
- package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
- package/corpus/core/src/client/guided-questions.tsx +21 -27
- package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
- package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
- package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
- package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
- package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
- package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
- package/corpus/core/src/client/useProductionAgent.ts +6 -2
- package/corpus/core/src/deploy/build.ts +1 -1
- package/corpus/core/src/observability/traces.ts +3 -3
- package/corpus/core/src/onboarding/default-steps.ts +1 -1
- package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
- package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
- package/corpus/core/src/server/core-routes-plugin.ts +7 -1
- package/corpus/core/src/server/open-route.ts +59 -40
- package/corpus/core/src/shared/reasoning-effort.ts +2 -0
- package/corpus/core/src/sharing/access.ts +22 -2
- package/corpus/core/src/sharing/registry.ts +18 -0
- package/corpus/core/src/styles/agent-native.css +104 -20
- package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
- package/corpus/templates/analytics/actions/hubspot-deals.ts +64 -4
- package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
- package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
- package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
- package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
- package/corpus/templates/analytics/app/global.css +4 -0
- package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
- package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
- package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
- package/corpus/templates/calendar/AGENTS.md +4 -0
- package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
- package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
- package/corpus/templates/content/.env.local.example +6 -0
- package/corpus/templates/content/AGENTS.md +10 -1
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +14 -1
- package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +43 -0
- package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +79 -7
- package/corpus/templates/content/actions/_database-source-utils.ts +987 -22
- package/corpus/templates/content/actions/_database-utils.ts +41 -0
- package/corpus/templates/content/actions/_local-file-documents.ts +74 -1
- package/corpus/templates/content/actions/attach-content-database-source.ts +33 -8
- package/corpus/templates/content/actions/change-content-database-source-role.ts +14 -0
- package/corpus/templates/content/actions/disconnect-content-database-source.ts +3 -0
- package/corpus/templates/content/actions/execute-builder-source-execution.ts +71 -3
- package/corpus/templates/content/actions/list-content-databases.ts +41 -33
- package/corpus/templates/content/actions/process-builder-body-hydration.ts +47 -0
- package/corpus/templates/content/actions/update-document.ts +93 -0
- package/corpus/templates/content/app/blocks/SourceComponentBlock.tsx +277 -0
- package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +2 -0
- package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +45 -4
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +5 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +92 -0
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +5 -3
- package/corpus/templates/content/app/components/editor/extensions/registryBlocks.ts +41 -0
- package/corpus/templates/content/app/components/editor/registrySlashItems.ts +4 -0
- package/corpus/templates/content/app/global.css +16 -8
- package/corpus/templates/content/app/hooks/use-content-database.ts +24 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +24 -0
- package/corpus/templates/content/app/i18n-data.ts +212 -0
- package/corpus/templates/content/app/lib/content-command-search.ts +64 -0
- package/corpus/templates/content/app/root.tsx +236 -8
- package/corpus/templates/content/changelog/2026-06-29-builder-cms-sources-now-sync-article-bodies-through-content.md +6 -0
- package/corpus/templates/content/changelog/2026-06-30-builder-article-media-now-render-as-images-and-embeds-when-r.md +6 -0
- package/corpus/templates/content/changelog/2026-06-30-builder-source-components-now-render-as-preserved-preview-bl.md +6 -0
- package/corpus/templates/content/changelog/2026-06-30-cmd-k-search-now-opens-from-the-editor-and-finds-real-content.md +6 -0
- package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
- package/corpus/templates/content/package.json +3 -1
- package/corpus/templates/content/scripts/check-native-deps.mjs +57 -0
- package/corpus/templates/content/scripts/dev-database.mjs +83 -0
- package/corpus/templates/content/scripts/seed-demo-user.mjs +107 -0
- package/corpus/templates/content/server/db/schema.ts +27 -0
- package/corpus/templates/content/server/plugins/db.ts +33 -0
- package/corpus/templates/content/shared/api.ts +45 -0
- package/corpus/templates/content/shared/builder-mdx.ts +905 -5
- package/corpus/templates/content/shared/nfm-registry.ts +2 -0
- package/corpus/templates/content/shared/source-component-block.ts +141 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
- package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
- package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
- package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
- package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
- package/corpus/templates/design/actions/navigate.ts +3 -12
- package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
- package/corpus/templates/design/actions/view-screen.ts +1 -1
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +350 -15
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
- package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
- package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
- package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
- package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1193 -207
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
- package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
- package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1225 -154
- package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
- package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
- package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
- package/corpus/templates/design/app/components/design/types.ts +19 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
- package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
- package/corpus/templates/design/app/global.css +56 -0
- package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
- package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
- package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +6 -3
- package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
- package/corpus/templates/design/app/i18n-data.ts +63 -188
- package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +1755 -401
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
- package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
- package/corpus/templates/design/app/pages/Index.tsx +49 -26
- package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
- package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
- package/corpus/templates/design/app/routes/examples.tsx +1 -7
- package/corpus/templates/design/app/routes/templates.tsx +7 -4
- package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-canvas-editing-now-keeps-undo-redo-and-cross-screen-layer-mo.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
- package/corpus/templates/design/e2e/helpers.ts +15 -4
- package/corpus/templates/design/server/db/index.ts +52 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
- package/corpus/templates/design/server/plugins/auth.ts +1 -0
- package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
- package/corpus/templates/design/shared/board-file.ts +380 -5
- package/corpus/templates/design/shared/board-objects.ts +2 -2
- package/corpus/templates/design/shared/code-layer.ts +50 -6
- package/corpus/templates/design/shared/motion-compiler.ts +27 -0
- package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
- package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
- package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
- package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
- package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
- package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
- package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
- package/corpus/templates/macros/app/routes/_index.tsx +5 -5
- package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
- package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
- package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
- package/corpus/templates/mail/app/global.css +3 -2
- package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
- package/corpus/templates/slides/app/global.css +10 -0
- package/corpus/templates/slides/app/pages/Index.tsx +55 -51
- package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
- package/dist/agent/engine/anthropic-engine.d.ts +2 -2
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +2 -2
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builtin.js +1 -1
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/engine/output-tokens.js +1 -1
- package/dist/agent/engine/output-tokens.js.map +1 -1
- package/dist/agent/harness/acp-adapter.d.ts +4 -1
- package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
- package/dist/agent/harness/acp-adapter.js +19 -2
- package/dist/agent/harness/acp-adapter.js.map +1 -1
- package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
- package/dist/agent/harness/ai-sdk-adapter.js +3 -0
- package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
- package/dist/agent/harness/translate.d.ts.map +1 -1
- package/dist/agent/harness/translate.js +3 -0
- package/dist/agent/harness/translate.js.map +1 -1
- package/dist/agent/harness/types.d.ts +1 -0
- package/dist/agent/harness/types.d.ts.map +1 -1
- package/dist/agent/harness/types.js.map +1 -1
- package/dist/agent/model-config.d.ts +21 -20
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +31 -13
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +85 -10
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +27 -6
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/tool-call-journal.d.ts +11 -9
- package/dist/agent/tool-call-journal.d.ts.map +1 -1
- package/dist/agent/tool-call-journal.js +92 -40
- package/dist/agent/tool-call-journal.js.map +1 -1
- package/dist/agent/types.d.ts +5 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +84 -0
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/gateway-helpers.d.ts +4 -0
- package/dist/cli/gateway-helpers.d.ts.map +1 -1
- package/dist/cli/gateway-helpers.js +9 -0
- package/dist/cli/gateway-helpers.js.map +1 -1
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +0 -2
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +54 -16
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/workspace-dev.d.ts.map +1 -1
- package/dist/cli/workspace-dev.js +33 -6
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +72 -26
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/CommandMenu.d.ts +6 -2
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +25 -14
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/DefaultSpinner.d.ts.map +1 -1
- package/dist/client/DefaultSpinner.js +8 -1
- package/dist/client/DefaultSpinner.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +7 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +37 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/repo-helpers.d.ts +1 -0
- package/dist/client/chat/repo-helpers.d.ts.map +1 -1
- package/dist/client/chat/repo-helpers.js +59 -0
- package/dist/client/chat/repo-helpers.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +4 -4
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/components/ApiKeySettings.js +8 -8
- package/dist/client/components/ApiKeySettings.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +24 -15
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
- package/dist/client/components/MissingKeyCard.js +11 -6
- package/dist/client/components/MissingKeyCard.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +4 -3
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +6 -6
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/client/integrations/IntegrationCard.js +1 -1
- package/dist/client/integrations/IntegrationCard.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +1 -1
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/onboarding/OnboardingBanner.js +2 -2
- package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +23 -19
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
- package/dist/client/resources/ResourceEditor.js +13 -10
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +2 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +8 -3
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +6 -38
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts +2 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +3 -3
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/onboarding/default-steps.js +1 -1
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +3 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +134 -72
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/core-routes-plugin.d.ts +3 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +4 -1
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/open-route.d.ts +9 -0
- package/dist/server/open-route.d.ts.map +1 -1
- package/dist/server/open-route.js +48 -38
- package/dist/server/open-route.js.map +1 -1
- package/dist/shared/reasoning-effort.js +3 -0
- package/dist/shared/reasoning-effort.js.map +1 -1
- package/dist/sharing/access.d.ts.map +1 -1
- package/dist/sharing/access.js +18 -2
- package/dist/sharing/access.js.map +1 -1
- package/dist/sharing/registry.d.ts +10 -0
- package/dist/sharing/registry.d.ts.map +1 -1
- package/dist/sharing/registry.js.map +1 -1
- package/dist/styles/agent-native.css +104 -20
- package/dist/styles/rich-markdown-editor.css +11 -10
- package/docs/content/cloneable-saas.mdx +2 -2
- package/docs/content/faq.mdx +1 -1
- package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
- package/docs/content/locales/ar-SA/faq.mdx +1 -1
- package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
- package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
- package/docs/content/locales/de-DE/faq.mdx +1 -1
- package/docs/content/locales/de-DE/template-chat.mdx +1 -1
- package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
- package/docs/content/locales/es-ES/faq.mdx +1 -1
- package/docs/content/locales/es-ES/template-chat.mdx +1 -1
- package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
- package/docs/content/locales/fr-FR/faq.mdx +1 -1
- package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
- package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
- package/docs/content/locales/hi-IN/faq.mdx +1 -1
- package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
- package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
- package/docs/content/locales/ja-JP/faq.mdx +1 -1
- package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
- package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
- package/docs/content/locales/ko-KR/faq.mdx +1 -1
- package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
- package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
- package/docs/content/locales/pt-BR/faq.mdx +1 -1
- package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
- package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
- package/docs/content/locales/zh-CN/faq.mdx +1 -1
- package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
- package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
- package/docs/content/locales/zh-TW/faq.mdx +1 -1
- package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
- package/docs/content/template-chat.mdx +1 -1
- package/package.json +1 -1
- package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
- package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
- package/corpus/templates/design/app/pages/Templates.tsx +0 -279
|
@@ -233,6 +233,23 @@ export interface ResolvedAccess {
|
|
|
233
233
|
resource: any;
|
|
234
234
|
}
|
|
235
235
|
|
|
236
|
+
async function publicAccessRoleForResource(
|
|
237
|
+
reg: ShareableResourceRegistration,
|
|
238
|
+
resource: any,
|
|
239
|
+
ctx: AccessContext,
|
|
240
|
+
): Promise<ShareRole> {
|
|
241
|
+
const roleResolver = reg.publicAccessRole;
|
|
242
|
+
if (!roleResolver) return "viewer";
|
|
243
|
+
return typeof roleResolver === "function"
|
|
244
|
+
? await roleResolver(resource, ctx)
|
|
245
|
+
: roleResolver;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function higherShareRole(a: ShareRole, b: ShareRole | null): ShareRole {
|
|
249
|
+
if (!b) return a;
|
|
250
|
+
return ROLE_RANK[b] > ROLE_RANK[a] ? b : a;
|
|
251
|
+
}
|
|
252
|
+
|
|
236
253
|
/**
|
|
237
254
|
* Return the effective role the current user has on a specific resource, or
|
|
238
255
|
* null if they have no access. Loads the resource and relevant share rows.
|
|
@@ -263,9 +280,12 @@ export async function resolveAccess(
|
|
|
263
280
|
return { role: "owner", resource };
|
|
264
281
|
}
|
|
265
282
|
if (resource.visibility === "public" && reg.allowPublic !== false) {
|
|
266
|
-
// No share row needed; default viewer unless
|
|
283
|
+
// No share row needed; default viewer unless the resource registration
|
|
284
|
+
// deliberately grants a stronger public-by-link role or explicit shares
|
|
285
|
+
// upgrade the current principal.
|
|
286
|
+
const publicRole = await publicAccessRoleForResource(reg, resource, ctx);
|
|
267
287
|
const role = await highestShareRole(reg, resourceId, ctx, resource);
|
|
268
|
-
return { role: role
|
|
288
|
+
return { role: higherShareRole(publicRole, role), resource };
|
|
269
289
|
}
|
|
270
290
|
// `visibility === "public"` on an `allowPublic: false` resource is treated
|
|
271
291
|
// as private: only owner + explicit shares grant access. Falls through to
|
|
@@ -56,6 +56,24 @@ export interface ShareableResourceRegistration {
|
|
|
56
56
|
* Default: `true` (matches the historical behavior — most resources can be public).
|
|
57
57
|
*/
|
|
58
58
|
allowPublic?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Optional role granted by a public-by-link read. Most resources should omit
|
|
61
|
+
* this so public visibility remains viewer-only. Use narrowly for local or
|
|
62
|
+
* otherwise constrained resources where the resource owner intentionally wants
|
|
63
|
+
* unauthenticated link holders to do more than view.
|
|
64
|
+
*/
|
|
65
|
+
publicAccessRole?:
|
|
66
|
+
| "viewer"
|
|
67
|
+
| "editor"
|
|
68
|
+
| "admin"
|
|
69
|
+
| ((
|
|
70
|
+
resource: any,
|
|
71
|
+
ctx: { userEmail?: string; orgId?: string },
|
|
72
|
+
) =>
|
|
73
|
+
| "viewer"
|
|
74
|
+
| "editor"
|
|
75
|
+
| "admin"
|
|
76
|
+
| Promise<"viewer" | "editor" | "admin">);
|
|
59
77
|
/**
|
|
60
78
|
* When `true`, individual user shares (`principalType: "user"`) must target
|
|
61
79
|
* an email that is already a member of the same org as the resource, OR has
|
|
@@ -167,17 +167,6 @@
|
|
|
167
167
|
container: agent-native-main / inline-size;
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
.agent-layout-main-surface::before,
|
|
171
|
-
.agent-sidebar-main-surface::before {
|
|
172
|
-
content: "";
|
|
173
|
-
position: absolute;
|
|
174
|
-
inset: 0;
|
|
175
|
-
z-index: 20;
|
|
176
|
-
pointer-events: none;
|
|
177
|
-
border-radius: inherit;
|
|
178
|
-
box-shadow: var(--agent-native-raised-outline);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
170
|
.agent-layout-shell
|
|
182
171
|
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
183
172
|
> :first-child
|
|
@@ -537,6 +526,57 @@
|
|
|
537
526
|
}
|
|
538
527
|
}
|
|
539
528
|
|
|
529
|
+
/* Guided questions size themselves from the rendered container, not viewport
|
|
530
|
+
breakpoints, so they stay readable in narrow chat sidebars. */
|
|
531
|
+
.guided-question-flow {
|
|
532
|
+
container-type: inline-size;
|
|
533
|
+
container-name: guided-question-flow;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
.guided-question-flow-options {
|
|
537
|
+
grid-template-columns: minmax(0, 1fr);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
@container guided-question-flow (min-width: 42rem) {
|
|
541
|
+
.guided-question-flow-inner {
|
|
542
|
+
padding: 2rem;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
.guided-question-flow-header {
|
|
546
|
+
margin-bottom: 1.5rem;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
.guided-question-flow-title {
|
|
550
|
+
font-size: 1.5rem;
|
|
551
|
+
line-height: 2rem;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
.guided-question-flow-options {
|
|
555
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
.guided-question-flow-footer {
|
|
559
|
+
margin-top: 1.25rem;
|
|
560
|
+
padding-top: 1rem;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
@container guided-question-flow (max-width: 24rem) {
|
|
565
|
+
.guided-question-flow-description {
|
|
566
|
+
font-size: 0.8125rem;
|
|
567
|
+
line-height: 1.25rem;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
.guided-question-flow-footer {
|
|
571
|
+
align-items: stretch;
|
|
572
|
+
flex-direction: column;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
.guided-question-flow-footer > :last-child {
|
|
576
|
+
justify-content: flex-end;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
540
580
|
/* Connect AI card: use the card width, not the viewport, so narrow embedded
|
|
541
581
|
sidebars stack the copy and actions before the secondary button clips. */
|
|
542
582
|
.agent-builder-setup-card {
|
|
@@ -548,6 +588,32 @@
|
|
|
548
588
|
container-name: agent-builder-setup;
|
|
549
589
|
}
|
|
550
590
|
|
|
591
|
+
.agent-builder-setup-card--sidebar .agent-builder-setup-card__actions {
|
|
592
|
+
gap: 0.25rem;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
.agent-builder-setup-card--sidebar .agent-builder-setup-card__builder-button {
|
|
596
|
+
justify-content: center;
|
|
597
|
+
min-height: 2rem;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
.agent-builder-setup-card--sidebar .agent-builder-setup-card__key-button {
|
|
601
|
+
align-self: center;
|
|
602
|
+
justify-content: center;
|
|
603
|
+
width: auto;
|
|
604
|
+
min-height: 1.5rem;
|
|
605
|
+
height: 1.5rem;
|
|
606
|
+
border: 0;
|
|
607
|
+
background: transparent;
|
|
608
|
+
color: hsl(var(--muted-foreground));
|
|
609
|
+
padding-inline: 0.25rem;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
.agent-builder-setup-card--sidebar .agent-builder-setup-card__key-button:hover {
|
|
613
|
+
background: transparent;
|
|
614
|
+
color: hsl(var(--foreground));
|
|
615
|
+
}
|
|
616
|
+
|
|
551
617
|
@container agent-builder-setup (max-width: 560px) {
|
|
552
618
|
.agent-builder-setup-card__content {
|
|
553
619
|
align-items: stretch;
|
|
@@ -564,23 +630,19 @@
|
|
|
564
630
|
|
|
565
631
|
.agent-builder-setup-card__builder-cta {
|
|
566
632
|
align-items: stretch;
|
|
567
|
-
flex:
|
|
633
|
+
flex: 0 1 auto;
|
|
568
634
|
}
|
|
569
635
|
|
|
570
|
-
.agent-builder-setup-card__builder-button
|
|
571
|
-
.agent-builder-setup-card__key-button {
|
|
636
|
+
.agent-builder-setup-card__builder-button {
|
|
572
637
|
justify-content: center;
|
|
573
638
|
min-width: 0;
|
|
574
639
|
width: 100%;
|
|
575
640
|
}
|
|
576
641
|
|
|
577
642
|
.agent-builder-setup-card__key-button {
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
flex: 1 1 8rem;
|
|
582
|
-
height: 2rem;
|
|
583
|
-
padding-inline: 0.75rem;
|
|
643
|
+
flex: 0 0 auto;
|
|
644
|
+
min-width: 0;
|
|
645
|
+
width: auto;
|
|
584
646
|
}
|
|
585
647
|
}
|
|
586
648
|
|
|
@@ -629,6 +691,28 @@
|
|
|
629
691
|
overflow: visible;
|
|
630
692
|
}
|
|
631
693
|
|
|
694
|
+
[data-agent-empty-state="compact-setup"] > .agent-chat-scroll {
|
|
695
|
+
flex: 0 0 auto;
|
|
696
|
+
overflow: visible;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
[data-agent-empty-state="compact-setup"] .agent-empty-state {
|
|
700
|
+
height: auto;
|
|
701
|
+
min-height: 5rem;
|
|
702
|
+
gap: 0.5rem;
|
|
703
|
+
padding-block: 0.875rem;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
[data-agent-empty-state="compact-setup"] .agent-empty-state > div:first-child {
|
|
707
|
+
width: 2rem;
|
|
708
|
+
height: 2rem;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
[data-agent-empty-state="compact-setup"] .agent-empty-state svg {
|
|
712
|
+
width: 1rem;
|
|
713
|
+
height: 1rem;
|
|
714
|
+
}
|
|
715
|
+
|
|
632
716
|
.agent-thinking-indicator {
|
|
633
717
|
display: inline-flex;
|
|
634
718
|
align-items: center;
|
|
@@ -333,11 +333,12 @@
|
|
|
333
333
|
display: flex;
|
|
334
334
|
align-items: center;
|
|
335
335
|
border-radius: 6px;
|
|
336
|
-
background: hsl(
|
|
336
|
+
background: hsl(var(--popover));
|
|
337
|
+
color: hsl(var(--popover-foreground));
|
|
337
338
|
padding: 3px;
|
|
338
339
|
box-shadow:
|
|
339
340
|
0 4px 16px rgb(0 0 0 / 0.25),
|
|
340
|
-
0 0 0 1px
|
|
341
|
+
0 0 0 1px hsl(var(--border));
|
|
341
342
|
}
|
|
342
343
|
|
|
343
344
|
.an-rich-md-bubble-items,
|
|
@@ -351,7 +352,7 @@
|
|
|
351
352
|
padding: 3px 6px;
|
|
352
353
|
border-radius: 4px;
|
|
353
354
|
font-size: 12px;
|
|
354
|
-
color:
|
|
355
|
+
color: hsl(var(--popover-foreground) / 0.76);
|
|
355
356
|
background: none;
|
|
356
357
|
border: none;
|
|
357
358
|
cursor: pointer;
|
|
@@ -359,20 +360,20 @@
|
|
|
359
360
|
}
|
|
360
361
|
|
|
361
362
|
.an-rich-md-bubble-button:hover {
|
|
362
|
-
background:
|
|
363
|
-
color:
|
|
363
|
+
background: hsl(var(--accent));
|
|
364
|
+
color: hsl(var(--accent-foreground));
|
|
364
365
|
}
|
|
365
366
|
|
|
366
367
|
.an-rich-md-bubble-button--active {
|
|
367
|
-
background:
|
|
368
|
-
color:
|
|
368
|
+
background: hsl(var(--accent));
|
|
369
|
+
color: hsl(var(--accent-foreground));
|
|
369
370
|
}
|
|
370
371
|
|
|
371
372
|
.an-rich-md-bubble-divider {
|
|
372
373
|
width: 1px;
|
|
373
374
|
height: 16px;
|
|
374
375
|
margin: 0 2px;
|
|
375
|
-
background:
|
|
376
|
+
background: hsl(var(--border));
|
|
376
377
|
}
|
|
377
378
|
|
|
378
379
|
.an-rich-md-link-editor {
|
|
@@ -384,7 +385,7 @@
|
|
|
384
385
|
border: none;
|
|
385
386
|
outline: none;
|
|
386
387
|
background: transparent;
|
|
387
|
-
color:
|
|
388
|
+
color: hsl(var(--popover-foreground));
|
|
388
389
|
font-size: 12px;
|
|
389
390
|
padding: 2px 4px;
|
|
390
391
|
}
|
|
@@ -392,7 +393,7 @@
|
|
|
392
393
|
.an-rich-md-link-editor button {
|
|
393
394
|
border: none;
|
|
394
395
|
background: none;
|
|
395
|
-
color:
|
|
396
|
+
color: hsl(var(--primary));
|
|
396
397
|
cursor: pointer;
|
|
397
398
|
font-size: 11px;
|
|
398
399
|
font-weight: 500;
|
|
@@ -264,6 +264,12 @@ function hasStructuredFilters(filters: ReturnType<typeof buildFilterSummary>) {
|
|
|
264
264
|
function buildGuidance(options: {
|
|
265
265
|
query: string | undefined;
|
|
266
266
|
structuredFilters: boolean;
|
|
267
|
+
truncated: boolean;
|
|
268
|
+
hasMore: boolean;
|
|
269
|
+
total: number;
|
|
270
|
+
returned: number;
|
|
271
|
+
offset: number;
|
|
272
|
+
limit: number;
|
|
267
273
|
}) {
|
|
268
274
|
const guidance: string[] = [];
|
|
269
275
|
|
|
@@ -285,6 +291,15 @@ function buildGuidance(options: {
|
|
|
285
291
|
);
|
|
286
292
|
}
|
|
287
293
|
|
|
294
|
+
if (options.truncated) {
|
|
295
|
+
const more = options.hasMore
|
|
296
|
+
? `Fetch the next page with offset ${options.offset + options.returned}.`
|
|
297
|
+
: "This is the last page of the cohort.";
|
|
298
|
+
guidance.push(
|
|
299
|
+
`Returned ${options.returned} of ${options.total} matching deals (limit ${options.limit}, offset ${options.offset}). This is a partial slice — do NOT treat it as the full cohort. Use total for counts/aggregates. ${more} Narrow the filters or, for exhaustive cohort analysis, use provider-api-request with provider = hubspot and stageAs.`,
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
288
303
|
return guidance.join(" ");
|
|
289
304
|
}
|
|
290
305
|
|
|
@@ -293,7 +308,7 @@ export default defineAction({
|
|
|
293
308
|
// reusable across continuation retries (no re-fetch on resume).
|
|
294
309
|
readOnly: true,
|
|
295
310
|
description:
|
|
296
|
-
"Get HubSpot deals with normalized stage, pipeline, owner, forecast, and NBM fields. This is a bounded deal analytics shortcut, not the full HubSpot capability surface. Use query for a specific customer/deal/account deep dive. For cohorts like products field = Publish, closed-won, pipeline = New Business, or close date in a range, use the structured product, pipeline, closedStatus, closedDateFrom, and closedDateTo filters instead of query when the answer is the deal list itself. If the cohort feeds a cross-source join, transcript/message/ticket search, exhaustive absence check, or downstream code/corpus workflow, prefer provider-api-catalog/provider-api-request with provider = hubspot and stageAs so the cohort is available as a staged dataset. For non-deal CRM records use hubspot-records; for arbitrary HubSpot endpoints, filters, associations, batch APIs, or payloads use provider-api-catalog/provider-api-docs/provider-api-request with provider = hubspot.",
|
|
311
|
+
"Get HubSpot deals with normalized stage, pipeline, owner, forecast, and NBM fields. This is a bounded deal analytics shortcut, not the full HubSpot capability surface. Use query for a specific customer/deal/account deep dive. For cohorts like products field = Publish, closed-won, pipeline = New Business, or close date in a range, use the structured product, pipeline, closedStatus, closedDateFrom, and closedDateTo filters instead of query when the answer is the deal list itself. If the cohort feeds a cross-source join, transcript/message/ticket search, exhaustive absence check, or downstream code/corpus workflow, prefer provider-api-catalog/provider-api-request with provider = hubspot and stageAs so the cohort is available as a staged dataset. Both paths are bounded: at most limit deals are returned (default 25, max 100). The structured-filter path returns total as the true matched count and a truncated flag; page with offset (or narrow filters) instead of expecting the whole cohort in one call, since a full enriched cohort can be several MB and overruns extension and context budgets. For non-deal CRM records use hubspot-records; for arbitrary HubSpot endpoints, filters, associations, batch APIs, or payloads use provider-api-catalog/provider-api-docs/provider-api-request with provider = hubspot.",
|
|
297
312
|
schema: z.object({
|
|
298
313
|
properties: StringListSchema.describe(
|
|
299
314
|
"Optional comma-separated extra HubSpot deal property names to include.",
|
|
@@ -344,7 +359,17 @@ export default defineAction({
|
|
|
344
359
|
.min(1)
|
|
345
360
|
.max(100)
|
|
346
361
|
.default(25)
|
|
347
|
-
.describe(
|
|
362
|
+
.describe(
|
|
363
|
+
"Maximum deals to return. Applies to BOTH full-text query results and structured-filter cohorts. The structured-filter path returns at most this many enriched deals (use total for the true matched count and offset to page).",
|
|
364
|
+
),
|
|
365
|
+
offset: z.coerce
|
|
366
|
+
.number()
|
|
367
|
+
.int()
|
|
368
|
+
.min(0)
|
|
369
|
+
.default(0)
|
|
370
|
+
.describe(
|
|
371
|
+
"Number of structured-filter results to skip before returning limit deals. Use for paging through a large cohort; ignored when query is provided.",
|
|
372
|
+
),
|
|
348
373
|
after: z
|
|
349
374
|
.string()
|
|
350
375
|
.optional()
|
|
@@ -362,6 +387,7 @@ export default defineAction({
|
|
|
362
387
|
closedDateTo,
|
|
363
388
|
query,
|
|
364
389
|
limit = 25,
|
|
390
|
+
offset = 0,
|
|
365
391
|
after,
|
|
366
392
|
}) => {
|
|
367
393
|
const trimmedQuery = query?.trim();
|
|
@@ -414,7 +440,7 @@ export default defineAction({
|
|
|
414
440
|
closedDateTo: closedDateTo?.trim(),
|
|
415
441
|
});
|
|
416
442
|
const structuredFilters = hasStructuredFilters(filters);
|
|
417
|
-
const
|
|
443
|
+
const matchedDeals = rawDeals
|
|
418
444
|
.filter((d) => visibleIds.has(String(d.properties.pipeline)))
|
|
419
445
|
.map((deal) => enrichDeal(deal, lookups, owners))
|
|
420
446
|
.filter((deal) => {
|
|
@@ -435,18 +461,52 @@ export default defineAction({
|
|
|
435
461
|
return matchesDateRange(deal, fromMs, toMs);
|
|
436
462
|
});
|
|
437
463
|
|
|
464
|
+
// The full-text query path is already bounded by HubSpot's own `limit`.
|
|
465
|
+
// EVERY non-query call (with or without structured filters) scans the whole
|
|
466
|
+
// visible deal set, so bound the returned cohort here. This is deliberately
|
|
467
|
+
// NOT gated on `structuredFilters`: the unfiltered `hubspot-deals({})` call
|
|
468
|
+
// is the LARGEST payload of all (every visible deal), so it must be bounded
|
|
469
|
+
// too — a full enriched cohort can be multiple MB, which overruns the
|
|
470
|
+
// extension iframe bridge and the agent context. We
|
|
471
|
+
// keep `total` as the true matched count and signal partial slices via
|
|
472
|
+
// `truncated` so callers never mistake a page for the full cohort.
|
|
473
|
+
// `truncated` means "this response is only part of the cohort" (returned <
|
|
474
|
+
// total) and stays true on the LAST page of a paginated read too; pagination
|
|
475
|
+
// (is there a next page) is reported separately via `hasMore` / `nextOffset`.
|
|
476
|
+
const matchedTotal = matchedDeals.length;
|
|
477
|
+
const deals = trimmedQuery
|
|
478
|
+
? matchedDeals
|
|
479
|
+
: matchedDeals.slice(offset, offset + limit);
|
|
480
|
+
const truncated = !trimmedQuery && deals.length < matchedTotal;
|
|
481
|
+
const hasMore = !trimmedQuery && offset + deals.length < matchedTotal;
|
|
482
|
+
|
|
438
483
|
return {
|
|
439
484
|
deals,
|
|
440
485
|
stageLabels: lookups.stageLabels,
|
|
441
486
|
pipelineLabels: lookups.pipelineLabels,
|
|
442
|
-
total:
|
|
487
|
+
total: matchedTotal,
|
|
443
488
|
count: deals.length,
|
|
444
489
|
query: trimmedQuery || null,
|
|
445
490
|
filters,
|
|
446
491
|
nextAfter: Array.isArray(dealResult) ? null : dealResult.nextAfter,
|
|
492
|
+
...(trimmedQuery
|
|
493
|
+
? {}
|
|
494
|
+
: {
|
|
495
|
+
limit,
|
|
496
|
+
offset,
|
|
497
|
+
truncated,
|
|
498
|
+
hasMore,
|
|
499
|
+
nextOffset: hasMore ? offset + deals.length : null,
|
|
500
|
+
}),
|
|
447
501
|
guidance: buildGuidance({
|
|
448
502
|
query: trimmedQuery,
|
|
449
503
|
structuredFilters,
|
|
504
|
+
truncated,
|
|
505
|
+
hasMore,
|
|
506
|
+
total: matchedTotal,
|
|
507
|
+
returned: deals.length,
|
|
508
|
+
offset,
|
|
509
|
+
limit,
|
|
450
510
|
}),
|
|
451
511
|
...(Array.isArray(dealResult)
|
|
452
512
|
? {}
|
|
@@ -12,6 +12,11 @@ import {
|
|
|
12
12
|
|
|
13
13
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
14
14
|
import { Skeleton } from "@/components/ui/skeleton";
|
|
15
|
+
import {
|
|
16
|
+
chartAxisStroke,
|
|
17
|
+
chartGridStroke,
|
|
18
|
+
chartTooltipContentStyle,
|
|
19
|
+
} from "@/lib/chart-theme";
|
|
15
20
|
|
|
16
21
|
interface CumulativeNetChartProps {
|
|
17
22
|
title: string;
|
|
@@ -78,14 +83,14 @@ export function CumulativeNetChart({
|
|
|
78
83
|
</defs>
|
|
79
84
|
<XAxis
|
|
80
85
|
dataKey="day"
|
|
81
|
-
stroke=
|
|
86
|
+
stroke={chartAxisStroke}
|
|
82
87
|
fontSize={12}
|
|
83
88
|
tickLine={false}
|
|
84
89
|
axisLine={false}
|
|
85
90
|
tickFormatter={formatDate}
|
|
86
91
|
/>
|
|
87
92
|
<YAxis
|
|
88
|
-
stroke=
|
|
93
|
+
stroke={chartAxisStroke}
|
|
89
94
|
fontSize={12}
|
|
90
95
|
tickLine={false}
|
|
91
96
|
axisLine={false}
|
|
@@ -93,17 +98,12 @@ export function CumulativeNetChart({
|
|
|
93
98
|
/>
|
|
94
99
|
<CartesianGrid
|
|
95
100
|
strokeDasharray="3 3"
|
|
96
|
-
stroke=
|
|
101
|
+
stroke={chartGridStroke}
|
|
97
102
|
vertical={false}
|
|
98
103
|
/>
|
|
99
|
-
<ReferenceLine y={0} stroke=
|
|
104
|
+
<ReferenceLine y={0} stroke={chartAxisStroke} strokeWidth={1} />
|
|
100
105
|
<Tooltip
|
|
101
|
-
contentStyle={
|
|
102
|
-
backgroundColor: "#09090b",
|
|
103
|
-
border: "1px solid #27272a",
|
|
104
|
-
borderRadius: "8px",
|
|
105
|
-
color: "#fafafa",
|
|
106
|
-
}}
|
|
106
|
+
contentStyle={chartTooltipContentStyle}
|
|
107
107
|
labelFormatter={formatDate}
|
|
108
108
|
formatter={(value: any) => [
|
|
109
109
|
`$${Number(value).toLocaleString(undefined, { maximumFractionDigits: 0 })}`,
|
|
@@ -10,6 +10,11 @@ import {
|
|
|
10
10
|
} from "recharts";
|
|
11
11
|
|
|
12
12
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
13
|
+
import {
|
|
14
|
+
chartAxisStroke,
|
|
15
|
+
chartGridStroke,
|
|
16
|
+
chartTooltipContentStyle,
|
|
17
|
+
} from "@/lib/chart-theme";
|
|
13
18
|
|
|
14
19
|
const data = [
|
|
15
20
|
{ name: "Jan", total: 1200 },
|
|
@@ -49,13 +54,13 @@ export function RevenueChart() {
|
|
|
49
54
|
</defs>
|
|
50
55
|
<XAxis
|
|
51
56
|
dataKey="name"
|
|
52
|
-
stroke=
|
|
57
|
+
stroke={chartAxisStroke}
|
|
53
58
|
fontSize={12}
|
|
54
59
|
tickLine={false}
|
|
55
60
|
axisLine={false}
|
|
56
61
|
/>
|
|
57
62
|
<YAxis
|
|
58
|
-
stroke=
|
|
63
|
+
stroke={chartAxisStroke}
|
|
59
64
|
fontSize={12}
|
|
60
65
|
tickLine={false}
|
|
61
66
|
axisLine={false}
|
|
@@ -63,17 +68,12 @@ export function RevenueChart() {
|
|
|
63
68
|
/>
|
|
64
69
|
<CartesianGrid
|
|
65
70
|
strokeDasharray="3 3"
|
|
66
|
-
stroke=
|
|
71
|
+
stroke={chartGridStroke}
|
|
67
72
|
vertical={false}
|
|
68
73
|
/>
|
|
69
74
|
<Tooltip
|
|
70
|
-
contentStyle={
|
|
71
|
-
|
|
72
|
-
border: "1px solid #27272a",
|
|
73
|
-
borderRadius: "8px",
|
|
74
|
-
color: "#fafafa",
|
|
75
|
-
}}
|
|
76
|
-
itemStyle={{ color: "#38bdf8" }}
|
|
75
|
+
contentStyle={chartTooltipContentStyle}
|
|
76
|
+
itemStyle={{ color: "var(--brand-blue)" }}
|
|
77
77
|
/>
|
|
78
78
|
<Area
|
|
79
79
|
type="monotone"
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
|
|
15
15
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
16
16
|
import { Skeleton } from "@/components/ui/skeleton";
|
|
17
|
+
import { chartAxisStroke, chartGridStroke } from "@/lib/chart-theme";
|
|
17
18
|
|
|
18
19
|
interface RevenueComparisonChartProps {
|
|
19
20
|
title: string;
|
|
@@ -42,7 +43,7 @@ const formatDate = (value: string) => {
|
|
|
42
43
|
function CustomTooltip({ active, payload, label }: any) {
|
|
43
44
|
if (!active || !payload?.length) return null;
|
|
44
45
|
return (
|
|
45
|
-
<div className="rounded-lg border border-border bg-
|
|
46
|
+
<div className="rounded-lg border border-border bg-popover px-3 py-2 text-xs text-popover-foreground shadow-lg">
|
|
46
47
|
<p className="mb-1 font-medium">{formatDate(label)}</p>
|
|
47
48
|
{payload.map((entry: any) => (
|
|
48
49
|
<p
|
|
@@ -94,19 +95,19 @@ export function RevenueComparisonChart({
|
|
|
94
95
|
<ComposedChart data={chartData}>
|
|
95
96
|
<CartesianGrid
|
|
96
97
|
strokeDasharray="3 3"
|
|
97
|
-
stroke=
|
|
98
|
+
stroke={chartGridStroke}
|
|
98
99
|
vertical={false}
|
|
99
100
|
/>
|
|
100
101
|
<XAxis
|
|
101
102
|
dataKey="day"
|
|
102
|
-
stroke=
|
|
103
|
+
stroke={chartAxisStroke}
|
|
103
104
|
fontSize={12}
|
|
104
105
|
tickLine={false}
|
|
105
106
|
axisLine={false}
|
|
106
107
|
tickFormatter={formatDate}
|
|
107
108
|
/>
|
|
108
109
|
<YAxis
|
|
109
|
-
stroke=
|
|
110
|
+
stroke={chartAxisStroke}
|
|
110
111
|
fontSize={12}
|
|
111
112
|
tickLine={false}
|
|
112
113
|
axisLine={false}
|
|
@@ -116,7 +117,7 @@ export function RevenueComparisonChart({
|
|
|
116
117
|
return `$${v}`;
|
|
117
118
|
}}
|
|
118
119
|
/>
|
|
119
|
-
<ReferenceLine y={0} stroke=
|
|
120
|
+
<ReferenceLine y={0} stroke={chartAxisStroke} strokeWidth={1} />
|
|
120
121
|
<Tooltip content={<CustomTooltip />} />
|
|
121
122
|
<Legend
|
|
122
123
|
wrapperStyle={{ fontSize: "12px", paddingTop: "8px" }}
|
|
@@ -11,6 +11,11 @@ import {
|
|
|
11
11
|
|
|
12
12
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
13
13
|
import { Skeleton } from "@/components/ui/skeleton";
|
|
14
|
+
import {
|
|
15
|
+
chartAxisStroke,
|
|
16
|
+
chartGridStroke,
|
|
17
|
+
chartTooltipContentStyle,
|
|
18
|
+
} from "@/lib/chart-theme";
|
|
14
19
|
|
|
15
20
|
interface TimeSeriesChartProps {
|
|
16
21
|
title: string;
|
|
@@ -75,14 +80,14 @@ export function TimeSeriesChart({
|
|
|
75
80
|
</defs>
|
|
76
81
|
<XAxis
|
|
77
82
|
dataKey={xKey}
|
|
78
|
-
stroke=
|
|
83
|
+
stroke={chartAxisStroke}
|
|
79
84
|
fontSize={12}
|
|
80
85
|
tickLine={false}
|
|
81
86
|
axisLine={false}
|
|
82
87
|
tickFormatter={formatXLabel}
|
|
83
88
|
/>
|
|
84
89
|
<YAxis
|
|
85
|
-
stroke=
|
|
90
|
+
stroke={chartAxisStroke}
|
|
86
91
|
fontSize={12}
|
|
87
92
|
tickLine={false}
|
|
88
93
|
axisLine={false}
|
|
@@ -90,16 +95,11 @@ export function TimeSeriesChart({
|
|
|
90
95
|
/>
|
|
91
96
|
<CartesianGrid
|
|
92
97
|
strokeDasharray="3 3"
|
|
93
|
-
stroke=
|
|
98
|
+
stroke={chartGridStroke}
|
|
94
99
|
vertical={false}
|
|
95
100
|
/>
|
|
96
101
|
<Tooltip
|
|
97
|
-
contentStyle={
|
|
98
|
-
backgroundColor: "#09090b",
|
|
99
|
-
border: "1px solid #27272a",
|
|
100
|
-
borderRadius: "8px",
|
|
101
|
-
color: "#fafafa",
|
|
102
|
-
}}
|
|
102
|
+
contentStyle={chartTooltipContentStyle}
|
|
103
103
|
labelFormatter={formatXLabel}
|
|
104
104
|
/>
|
|
105
105
|
<Area
|
|
@@ -191,6 +191,10 @@
|
|
|
191
191
|
overflow: visible;
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
+
.analytics-chat-panel .agent-composer-area--hero {
|
|
195
|
+
padding-inline: 1rem;
|
|
196
|
+
}
|
|
197
|
+
|
|
194
198
|
.analytics-chat-panel [data-agent-empty-state="centered"] .agent-composer-area {
|
|
195
199
|
width: 100%;
|
|
196
200
|
max-width: min(760px, 90%);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CSSProperties } from "react";
|
|
2
|
+
|
|
3
|
+
export const chartAxisStroke = "hsl(var(--muted-foreground))";
|
|
4
|
+
export const chartGridStroke = "hsl(var(--border))";
|
|
5
|
+
export const chartTooltipCursorStroke = "hsl(var(--muted-foreground) / 0.25)";
|
|
6
|
+
export const chartTooltipCursorFill = "hsl(var(--muted) / 0.5)";
|
|
7
|
+
|
|
8
|
+
export const chartTooltipContentStyle = {
|
|
9
|
+
backgroundColor: "hsl(var(--popover))",
|
|
10
|
+
border: "1px solid hsl(var(--border))",
|
|
11
|
+
borderRadius: "8px",
|
|
12
|
+
color: "hsl(var(--popover-foreground))",
|
|
13
|
+
} satisfies CSSProperties;
|