@agent-native/core 0.106.3 → 0.107.1
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 +2 -2
- package/corpus/core/CHANGELOG.md +23 -0
- package/corpus/core/docs/content/integrations.mdx +597 -0
- package/corpus/core/docs/content/locales/ar-SA/mcp-clients.mdx +19 -1
- package/corpus/core/docs/content/locales/de-DE/mcp-clients.mdx +22 -1
- package/corpus/core/docs/content/locales/es-ES/mcp-clients.mdx +23 -1
- package/corpus/core/docs/content/locales/fr-FR/mcp-clients.mdx +23 -1
- package/corpus/core/docs/content/locales/hi-IN/mcp-clients.mdx +22 -1
- package/corpus/core/docs/content/locales/ja-JP/mcp-clients.mdx +21 -1
- package/corpus/core/docs/content/locales/ko-KR/mcp-clients.mdx +20 -1
- package/corpus/core/docs/content/locales/pt-BR/mcp-clients.mdx +22 -1
- package/corpus/core/docs/content/locales/zh-CN/mcp-clients.mdx +17 -1
- package/corpus/core/docs/content/locales/zh-TW/mcp-clients.mdx +17 -1
- package/corpus/core/docs/content/mcp-clients.mdx +51 -1
- package/corpus/core/docs/content/organizations-teams-permissions.mdx +413 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/production-agent.ts +19 -0
- package/corpus/core/src/agent/run-store.ts +98 -2
- package/corpus/core/src/client/AssistantChat.tsx +26 -1
- package/corpus/core/src/client/CommandMenu.tsx +5 -0
- package/corpus/core/src/client/active-run-state.ts +34 -0
- package/corpus/core/src/client/agent-chat-adapter.ts +4 -0
- package/corpus/core/src/client/chat/message-components.tsx +41 -0
- package/corpus/core/src/client/composer/TiptapComposer.tsx +45 -8
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +30 -11
- package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +270 -0
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +177 -40
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +478 -4
- package/corpus/core/src/client/resources/mcp-integration-logos.ts +108 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +30 -9
- package/corpus/core/src/client/use-agent-chat-home-handoff.ts +2 -2
- package/corpus/core/src/deploy/build.ts +32 -0
- package/corpus/core/src/extensions/html-shell.ts +33 -1
- package/corpus/core/src/ingestion/office.ts +1 -2
- package/corpus/core/src/ingestion/pptx.ts +2 -4
- package/corpus/core/src/localization/default-messages.ts +129 -1
- package/corpus/core/src/mcp/actions/call-mcp-tool.ts +1 -0
- package/corpus/core/src/secrets/register-framework-secrets.ts +28 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +29 -1
- package/corpus/core/src/server/index.ts +4 -0
- package/corpus/core/src/server/org-admin.ts +28 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
- package/corpus/core/src/vite/client.ts +24 -0
- package/corpus/templates/analytics/.agents/skills/creative-context/SKILL.md +64 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -21
- package/corpus/templates/analytics/AGENTS.md +13 -0
- package/corpus/templates/analytics/actions/clone-creative-context-dashboard.ts +86 -0
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
- package/corpus/templates/analytics/actions/update-dashboard.ts +6 -2
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +35 -7
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +3 -3
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/analytics/app/i18n-data.ts +1 -0
- package/corpus/templates/analytics/app/pages/Ask.tsx +8 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +11 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/extension-slot.ts +11 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +86 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +6 -0
- package/corpus/templates/analytics/app/routes/agent.tsx +7 -1
- package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extension-boxes.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-library-now-flags-published-dashboards-with-newer-versions-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/analytics/package.json +1 -0
- package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +8 -0
- package/corpus/templates/analytics/server/lib/native-creative-context.ts +158 -0
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/analytics/server/plugins/creative-context.ts +10 -0
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +12 -3
- package/corpus/templates/assets/AGENTS.md +5 -0
- package/corpus/templates/assets/actions/clone-creative-context-asset.ts +74 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +308 -178
- package/corpus/templates/assets/app/routes/library.tsx +5 -11
- package/corpus/templates/assets/changelog/2026-07-17-library-now-flags-published-assets-with-newer-versions-and-l.md +6 -0
- package/corpus/templates/assets/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/assets/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/assets/server/lib/native-creative-context.ts +198 -0
- package/corpus/templates/assets/server/plugins/creative-context.ts +4 -0
- package/corpus/templates/brain/actions/provider-api-request.ts +1 -0
- package/corpus/templates/brain/app/hooks/use-navigation-state.ts +6 -1
- package/corpus/templates/brain/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/calendar/actions/provider-api-request.ts +1 -0
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +1 -1
- package/corpus/templates/calendar/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +4 -1
- package/corpus/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/clips/actions/get-recording-insights.ts +7 -4
- package/corpus/templates/clips/actions/list-recordings.ts +48 -0
- package/corpus/templates/clips/actions/list-viewers.ts +2 -1
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +3 -1
- package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -3
- package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +11 -6
- package/corpus/templates/clips/app/hooks/use-view-tracking.ts +6 -1
- package/corpus/templates/clips/app/lib/ffmpeg-export.ts +4 -2
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +21 -3
- package/corpus/templates/clips/changelog/2026-07-17-dictation-keeps-sentence-spacing-and-no-longer-crashes-when-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-shared-clips-now-preserve-editor-access-and-show-editor-insi.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-stitching-clips-no-longer-fails-when-editor-media-metadata-i.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -8
- package/corpus/templates/clips/shared/view-analytics.ts +4 -0
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +12 -3
- package/corpus/templates/content/AGENTS.md +5 -0
- package/corpus/templates/content/actions/_content-space-access.ts +45 -2
- package/corpus/templates/content/actions/clone-creative-context-document.ts +61 -0
- package/corpus/templates/content/actions/create-content-database.ts +41 -7
- package/corpus/templates/content/actions/provider-api-request.ts +1 -0
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +21 -0
- package/corpus/templates/content/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +29 -0
- package/corpus/templates/content/app/root.tsx +1 -10
- package/corpus/templates/content/changelog/2026-07-17-creating-a-database-now-completes-reliably-in-hosted-workspa.md +6 -0
- package/corpus/templates/content/changelog/2026-07-17-library-now-flags-published-documents-with-newer-versions-an.md +6 -0
- package/corpus/templates/content/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
- package/corpus/templates/content/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/content/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +1 -0
- package/corpus/templates/content/server/lib/native-creative-context.ts +191 -0
- package/corpus/templates/content/server/plugins/creative-context.ts +8 -1
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +11 -3
- package/corpus/templates/design/AGENTS.md +5 -0
- package/corpus/templates/design/actions/clone-creative-context-design-native.ts +111 -0
- package/corpus/templates/design/actions/provider-api-request.ts +1 -0
- package/corpus/templates/design/app/pages/Index.tsx +44 -0
- package/corpus/templates/design/app/pages/design-editor/types.ts +1 -0
- package/corpus/templates/design/changelog/2026-07-17-library-now-flags-published-designs-with-newer-versions-and-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
- package/corpus/templates/design/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/design/server/lib/native-creative-context.ts +265 -0
- package/corpus/templates/design/server/plugins/creative-context.ts +8 -1
- package/corpus/templates/dispatch/actions/provider-api-request.ts +1 -0
- package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +4 -1
- package/corpus/templates/dispatch/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/forms/app/components/layout/Layout.tsx +2 -4
- package/corpus/templates/forms/app/components/ui/popover.tsx +25 -1
- package/corpus/templates/forms/app/hooks/use-navigation-state.ts +6 -1
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +13 -10
- package/corpus/templates/forms/app/root.tsx +6 -1
- package/corpus/templates/forms/changelog/2026-07-17-form-builder-popovers-stay-within-the-viewport.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-17-form-editor-loading-matches-current-sidebar-free-layout.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/mail/actions/provider-api-request.ts +1 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +1 -1
- package/corpus/templates/mail/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +14 -3
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +8 -1
- package/corpus/templates/plan/app/root.tsx +0 -2
- package/corpus/templates/plan/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +11 -3
- package/corpus/templates/slides/AGENTS.md +5 -0
- package/corpus/templates/slides/actions/clone-creative-context-deck.ts +96 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +3 -2
- package/corpus/templates/slides/actions/import-file.ts +3 -2
- package/corpus/templates/slides/actions/provider-api-request.ts +1 -0
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +27 -0
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -0
- package/corpus/templates/slides/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/slides/app/context/DeckContext.tsx +23 -23
- package/corpus/templates/slides/changelog/2026-07-17-duplicated-slides-now-stay-in-the-deck.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-17-library-now-flags-published-decks-with-newer-versions-and-le.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-17-pdf-and-powerpoint-imports-now-work-reliably-in-hosted-decks.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
- package/corpus/templates/slides/server/lib/native-creative-context.ts +288 -0
- package/corpus/templates/slides/server/plugins/creative-context.ts +4 -0
- package/corpus/templates/tasks/app/components/layout/Layout.tsx +2 -13
- package/corpus/templates/tasks/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it.md +6 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +13 -1
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-store.d.ts +17 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +84 -2
- package/dist/agent/run-store.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +18 -3
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +4 -0
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/active-run-state.d.ts +7 -0
- package/dist/client/active-run-state.d.ts.map +1 -1
- package/dist/client/active-run-state.js +28 -0
- package/dist/client/active-run-state.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +4 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +35 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +7 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +37 -8
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +3 -2
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.d.ts +9 -0
- package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -0
- package/dist/client/resources/McpConnectionSuggestion.js +134 -0
- package/dist/client/resources/McpConnectionSuggestion.js.map +1 -0
- package/dist/client/resources/McpIntegrationDialog.d.ts +2 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +51 -21
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.d.ts +15 -0
- package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.js +420 -4
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/client/resources/mcp-integration-logos.d.ts +2 -0
- package/dist/client/resources/mcp-integration-logos.d.ts.map +1 -0
- package/dist/client/resources/mcp-integration-logos.js +109 -0
- package/dist/client/resources/mcp-integration-logos.js.map +1 -0
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +15 -12
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/use-agent-chat-home-handoff.d.ts +1 -1
- package/dist/client/use-agent-chat-home-handoff.d.ts.map +1 -1
- package/dist/client/use-agent-chat-home-handoff.js +1 -1
- package/dist/client/use-agent-chat-home-handoff.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +23 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/extensions/html-shell.d.ts.map +1 -1
- package/dist/extensions/html-shell.js +33 -1
- package/dist/extensions/html-shell.js.map +1 -1
- package/dist/ingestion/office.d.ts.map +1 -1
- package/dist/ingestion/office.js +1 -2
- package/dist/ingestion/office.js.map +1 -1
- package/dist/ingestion/pptx.js +2 -4
- package/dist/ingestion/pptx.js.map +1 -1
- package/dist/localization/default-messages.d.ts +100 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +101 -1
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp/actions/call-mcp-tool.js +1 -0
- package/dist/mcp/actions/call-mcp-tool.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +25 -0
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +23 -1
- 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/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/org-admin.d.ts +3 -0
- package/dist/server/org-admin.d.ts.map +1 -0
- package/dist/server/org-admin.js +24 -0
- package/dist/server/org-admin.js.map +1 -0
- package/dist/templates/chat/app/hooks/use-navigation-state.ts +4 -1
- package/dist/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
- package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +20 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/integrations.mdx +597 -0
- package/docs/content/locales/ar-SA/mcp-clients.mdx +19 -1
- package/docs/content/locales/de-DE/mcp-clients.mdx +22 -1
- package/docs/content/locales/es-ES/mcp-clients.mdx +23 -1
- package/docs/content/locales/fr-FR/mcp-clients.mdx +23 -1
- package/docs/content/locales/hi-IN/mcp-clients.mdx +22 -1
- package/docs/content/locales/ja-JP/mcp-clients.mdx +21 -1
- package/docs/content/locales/ko-KR/mcp-clients.mdx +20 -1
- package/docs/content/locales/pt-BR/mcp-clients.mdx +22 -1
- package/docs/content/locales/zh-CN/mcp-clients.mdx +17 -1
- package/docs/content/locales/zh-TW/mcp-clients.mdx +17 -1
- package/docs/content/mcp-clients.mdx +51 -1
- package/docs/content/organizations-teams-permissions.mdx +413 -0
- package/package.json +1 -1
- package/src/templates/chat/app/hooks/use-navigation-state.ts +4 -1
- package/src/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
- package/src/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
- package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
import { defineAction } from "@agent-native/core";
|
|
4
|
+
import {
|
|
5
|
+
readPrivateBlob,
|
|
6
|
+
type PrivateBlobHandle,
|
|
7
|
+
} from "@agent-native/core/private-blob";
|
|
8
|
+
import {
|
|
9
|
+
getRequestOrgId,
|
|
10
|
+
getRequestUserEmail,
|
|
11
|
+
} from "@agent-native/core/server";
|
|
12
|
+
import { resolveNativeContextCloneReference } from "@agent-native/creative-context/server";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
getDashboard,
|
|
17
|
+
upsertDashboard,
|
|
18
|
+
} from "../server/lib/dashboards-store.js";
|
|
19
|
+
|
|
20
|
+
const payloadSchema = z.object({
|
|
21
|
+
id: z.string(),
|
|
22
|
+
kind: z.enum(["explorer", "sql"]),
|
|
23
|
+
title: z.string(),
|
|
24
|
+
config: z.record(z.string(), z.unknown()),
|
|
25
|
+
updatedAt: z.string(),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export default defineAction({
|
|
29
|
+
description:
|
|
30
|
+
"Clone an exact governed SQL-backed Analytics dashboard without executing any of its queries.",
|
|
31
|
+
schema: z.object({
|
|
32
|
+
contextId: z.string(),
|
|
33
|
+
artifactKey: z.string(),
|
|
34
|
+
resourceId: z.string(),
|
|
35
|
+
expectedUpdatedAt: z.string().optional(),
|
|
36
|
+
title: z.string().optional(),
|
|
37
|
+
}),
|
|
38
|
+
publicAgent: { expose: true, readOnly: false, requiresAuth: true },
|
|
39
|
+
run: async (args) => {
|
|
40
|
+
const email = getRequestUserEmail();
|
|
41
|
+
if (!email) throw new Error("no authenticated user");
|
|
42
|
+
const orgId = getRequestOrgId() ?? null;
|
|
43
|
+
const reference = await resolveNativeContextCloneReference({
|
|
44
|
+
appId: "analytics",
|
|
45
|
+
resourceType: "dashboard",
|
|
46
|
+
resourceId: args.resourceId,
|
|
47
|
+
expectedUpdatedAt: args.expectedUpdatedAt,
|
|
48
|
+
contextId: args.contextId,
|
|
49
|
+
artifactKey: args.artifactKey,
|
|
50
|
+
});
|
|
51
|
+
const raw = await readPrivateBlob(
|
|
52
|
+
reference.cloneHandle as PrivateBlobHandle,
|
|
53
|
+
);
|
|
54
|
+
const body = Buffer.from(raw.data).toString("utf8");
|
|
55
|
+
const hash = createHash("sha256").update(body).digest("hex");
|
|
56
|
+
if (
|
|
57
|
+
raw.metadata?.appId !== "analytics" ||
|
|
58
|
+
raw.metadata?.resourceType !== "dashboard" ||
|
|
59
|
+
raw.metadata?.resourceId !== args.resourceId ||
|
|
60
|
+
raw.metadata?.contentHash !== hash
|
|
61
|
+
)
|
|
62
|
+
throw new Error(
|
|
63
|
+
"Governed dashboard clone payload failed integrity verification.",
|
|
64
|
+
);
|
|
65
|
+
const payload = payloadSchema.parse(JSON.parse(body));
|
|
66
|
+
const id = `sql-dashboard-${randomUUID()}`;
|
|
67
|
+
const dashboard = await upsertDashboard(
|
|
68
|
+
id,
|
|
69
|
+
payload.kind,
|
|
70
|
+
{
|
|
71
|
+
title: args.title?.trim() || `Copy of ${payload.title}`,
|
|
72
|
+
...payload.config,
|
|
73
|
+
},
|
|
74
|
+
{ email, orgId },
|
|
75
|
+
);
|
|
76
|
+
const persisted = await getDashboard(id, { email, orgId });
|
|
77
|
+
if (!persisted || persisted.updatedAt !== dashboard.updatedAt)
|
|
78
|
+
throw new Error("Dashboard clone did not persist.");
|
|
79
|
+
return {
|
|
80
|
+
id: persisted.id,
|
|
81
|
+
title: persisted.title,
|
|
82
|
+
kind: persisted.kind,
|
|
83
|
+
clonedExactVersion: reference.publishedItemVersionId,
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
});
|
|
@@ -132,7 +132,7 @@ export const DASHBOARD_MUTATION_EXAMPLES = [
|
|
|
132
132
|
`dashboard.insertPanel({"id":"new-kpi","title":"New KPI","source":"first-party","chartType":"metric","width":1,"config":{"timeScope":"dashboard"},"sql":"SELECT COUNT(*) AS value FROM analytics_events WHERE event_date >= '{{dateStart}}' AND event_date < '{{dateEnd}}'"}).atTop();`,
|
|
133
133
|
`dashboard.insertPanel({"id":"new-chart","title":"New Chart","source":"first-party","chartType":"line","width":1,"config":{"timeScope":"dashboard"},"sql":"SELECT event_date AS date, COUNT(*) AS value FROM analytics_events WHERE event_date >= '{{dateStart}}' AND event_date < '{{dateEnd}}' GROUP BY event_date ORDER BY event_date"}).nextTo("retention-over-time");`,
|
|
134
134
|
`dashboard.insertPanel({"id":"row-chart","title":"Row Chart","source":"first-party","chartType":"bar","width":1,"config":{"timeScope":"dashboard"},"sql":"SELECT event_name AS name, COUNT(*) AS value FROM analytics_events WHERE event_date >= '{{dateStart}}' AND event_date < '{{dateEnd}}' GROUP BY event_name"}).atRow(2);`,
|
|
135
|
-
'dashboard.insertPanel({"id":"pipeline-widget","title":"Pipeline Widget","chartType":"extension","width":3,"config":{"
|
|
135
|
+
'dashboard.insertPanel({"id":"pipeline-widget","title":"Pipeline Widget","chartType":"extension","width":3,"config":{"extensionSlotId":"analytics.dashboard.<dashboard-id>.panel.pipeline-widget"}}).atBottom();',
|
|
136
136
|
] as const;
|
|
137
137
|
|
|
138
138
|
export type DashboardMutationOperation =
|
|
@@ -369,8 +369,12 @@ export function validateDashboardConfig(
|
|
|
369
369
|
cfg && typeof cfg.extensionId === "string"
|
|
370
370
|
? cfg.extensionId.trim()
|
|
371
371
|
: "";
|
|
372
|
-
|
|
373
|
-
|
|
372
|
+
const extensionSlotId =
|
|
373
|
+
cfg && typeof cfg.extensionSlotId === "string"
|
|
374
|
+
? cfg.extensionSlotId.trim()
|
|
375
|
+
: "";
|
|
376
|
+
if (!extensionId && !extensionSlotId) {
|
|
377
|
+
return `panel[${i}].config.extensionId or config.extensionSlotId is required for extension panels`;
|
|
374
378
|
}
|
|
375
379
|
}
|
|
376
380
|
if (
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { useDemoModeStatus, useT } from "@agent-native/core/client";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
EmbeddedExtension,
|
|
4
|
+
ExtensionSlot,
|
|
5
|
+
} from "@agent-native/core/client/extensions";
|
|
3
6
|
import {
|
|
4
7
|
IconArrowsSort,
|
|
5
8
|
IconSortAscending,
|
|
@@ -1185,6 +1188,8 @@ interface SqlChartProps {
|
|
|
1185
1188
|
className?: string;
|
|
1186
1189
|
loadData?: boolean;
|
|
1187
1190
|
onExportCsvChange?: (handler: (() => void) | null) => void;
|
|
1191
|
+
/** Dashboard/panel state sent to slot-backed extension boxes. */
|
|
1192
|
+
extensionContext?: Record<string, unknown> | null;
|
|
1188
1193
|
}
|
|
1189
1194
|
|
|
1190
1195
|
export function SqlChart({
|
|
@@ -1192,6 +1197,7 @@ export function SqlChart({
|
|
|
1192
1197
|
resolvedSql,
|
|
1193
1198
|
loadData = true,
|
|
1194
1199
|
onExportCsvChange,
|
|
1200
|
+
extensionContext,
|
|
1195
1201
|
}: SqlChartProps) {
|
|
1196
1202
|
const t = useT();
|
|
1197
1203
|
const { enabled: demoModeEnabled } = useDemoModeStatus();
|
|
@@ -1266,11 +1272,12 @@ export function SqlChart({
|
|
|
1266
1272
|
);
|
|
1267
1273
|
}
|
|
1268
1274
|
|
|
1269
|
-
// Extension panels render a
|
|
1270
|
-
//
|
|
1275
|
+
// Extension panels render either a named extension-point slot or a legacy
|
|
1276
|
+
// direct extension iframe instead of querying a data source.
|
|
1271
1277
|
if (isExtension) {
|
|
1272
1278
|
const extensionId = panel.config?.extensionId;
|
|
1273
|
-
|
|
1279
|
+
const slotId = panel.config?.extensionSlotId;
|
|
1280
|
+
if (!extensionId && !slotId) {
|
|
1274
1281
|
return (
|
|
1275
1282
|
<div className="flex flex-1 items-center justify-center px-4 py-8 min-h-[120px]">
|
|
1276
1283
|
<p className="text-sm text-muted-foreground text-center">
|
|
@@ -1280,7 +1287,12 @@ export function SqlChart({
|
|
|
1280
1287
|
);
|
|
1281
1288
|
}
|
|
1282
1289
|
return (
|
|
1283
|
-
<DashboardExtensionPanel
|
|
1290
|
+
<DashboardExtensionPanel
|
|
1291
|
+
extensionId={extensionId}
|
|
1292
|
+
panelId={panel.id}
|
|
1293
|
+
slotId={slotId}
|
|
1294
|
+
context={extensionContext}
|
|
1295
|
+
/>
|
|
1284
1296
|
);
|
|
1285
1297
|
}
|
|
1286
1298
|
const colors = panel.config?.colors || DEFAULT_COLORS;
|
|
@@ -1409,9 +1421,13 @@ export function SqlChart({
|
|
|
1409
1421
|
function DashboardExtensionPanel({
|
|
1410
1422
|
extensionId,
|
|
1411
1423
|
panelId,
|
|
1424
|
+
slotId,
|
|
1425
|
+
context,
|
|
1412
1426
|
}: {
|
|
1413
|
-
extensionId
|
|
1427
|
+
extensionId?: string;
|
|
1414
1428
|
panelId: string;
|
|
1429
|
+
slotId?: string;
|
|
1430
|
+
context?: Record<string, unknown> | null;
|
|
1415
1431
|
}) {
|
|
1416
1432
|
const t = useT();
|
|
1417
1433
|
// Hold the report-readiness marker until the extension iframe paints so
|
|
@@ -1419,6 +1435,18 @@ function DashboardExtensionPanel({
|
|
|
1419
1435
|
const [ready, setReady] = useState(false);
|
|
1420
1436
|
const [unavailable, setUnavailable] = useState(false);
|
|
1421
1437
|
|
|
1438
|
+
if (slotId) {
|
|
1439
|
+
return (
|
|
1440
|
+
<ExtensionSlot
|
|
1441
|
+
id={slotId}
|
|
1442
|
+
context={context}
|
|
1443
|
+
showEmptyAffordance
|
|
1444
|
+
className="min-h-[120px] w-full"
|
|
1445
|
+
toolClassName="w-full"
|
|
1446
|
+
/>
|
|
1447
|
+
);
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1422
1450
|
// Embedding never grants access to the extension itself (same model as
|
|
1423
1451
|
// ExtensionSlots). A viewer with dashboard-only access who can't see the
|
|
1424
1452
|
// referenced extension gets a clear message instead of a blank panel.
|
|
@@ -1438,7 +1466,7 @@ function DashboardExtensionPanel({
|
|
|
1438
1466
|
data-dashboard-report-loading={ready ? undefined : "true"}
|
|
1439
1467
|
>
|
|
1440
1468
|
<EmbeddedExtension
|
|
1441
|
-
extensionId={extensionId}
|
|
1469
|
+
extensionId={extensionId!}
|
|
1442
1470
|
slotId={`dashboard-panel-${panelId}`}
|
|
1443
1471
|
className="w-full"
|
|
1444
1472
|
// Intentional for v1: extension panels are standalone widgets and do not
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
useT,
|
|
11
11
|
} from "@agent-native/core/client";
|
|
12
12
|
import { InvitationBanner } from "@agent-native/core/client/org";
|
|
13
|
+
import { CreativeContextComposerChip } from "@agent-native/creative-context/client";
|
|
13
14
|
import { useEffect, useMemo } from "react";
|
|
14
15
|
import { useLocation, useNavigate } from "react-router";
|
|
15
16
|
|
|
@@ -162,8 +163,6 @@ export function Layout({ children }: LayoutProps) {
|
|
|
162
163
|
activePath: location.pathname,
|
|
163
164
|
enabled: !isAskRoute && !reportScreenshot,
|
|
164
165
|
});
|
|
165
|
-
const sidebarScope = chatHomeHandoffActive ? null : analyticsScope;
|
|
166
|
-
|
|
167
166
|
useEffect(() => {
|
|
168
167
|
function handleChatRunning(event: Event) {
|
|
169
168
|
const detail = (event as CustomEvent).detail;
|
|
@@ -293,7 +292,8 @@ export function Layout({ children }: LayoutProps) {
|
|
|
293
292
|
t("chat.suggestionAnomalies"),
|
|
294
293
|
t("chat.suggestionMrr"),
|
|
295
294
|
]}
|
|
296
|
-
scope={
|
|
295
|
+
scope={analyticsScope}
|
|
296
|
+
composerSlot={<CreativeContextComposerChip />}
|
|
297
297
|
>
|
|
298
298
|
{contentFrame}
|
|
299
299
|
</AgentSidebar>
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
useAgentChatContext,
|
|
4
4
|
useT,
|
|
5
5
|
} from "@agent-native/core/client";
|
|
6
|
+
import { CreativeContextComposerChip } from "@agent-native/creative-context/client";
|
|
6
7
|
import { useEffect, useMemo, useState } from "react";
|
|
7
8
|
|
|
8
9
|
import {
|
|
@@ -54,10 +55,13 @@ export default function AskPage() {
|
|
|
54
55
|
composerLayoutVariant="hero"
|
|
55
56
|
composerPlaceholder={t("common.askPlaceholder")}
|
|
56
57
|
composerSlot={
|
|
57
|
-
|
|
58
|
-
<
|
|
59
|
-
<
|
|
60
|
-
|
|
58
|
+
<>
|
|
59
|
+
<CreativeContextComposerChip />
|
|
60
|
+
<div className="analytics-chat-intro">
|
|
61
|
+
<h1>{t("common.askIntroTitle")}</h1>
|
|
62
|
+
<p>{t("common.askIntroBody")}</p>
|
|
63
|
+
</div>
|
|
64
|
+
</>
|
|
61
65
|
}
|
|
62
66
|
/>
|
|
63
67
|
</div>
|
|
@@ -67,6 +67,7 @@ interface SqlChartCardProps {
|
|
|
67
67
|
isDragSource?: boolean;
|
|
68
68
|
selectedForChat?: boolean;
|
|
69
69
|
onSelectForChat?: (options?: SelectDashboardPanelOptions) => void;
|
|
70
|
+
extensionContext?: Record<string, unknown> | null;
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
const PanelDragHandle = memo(function PanelDragHandle({
|
|
@@ -122,6 +123,7 @@ export function SqlChartCard({
|
|
|
122
123
|
isDragSource = false,
|
|
123
124
|
selectedForChat = false,
|
|
124
125
|
onSelectForChat,
|
|
126
|
+
extensionContext,
|
|
125
127
|
}: SqlChartCardProps) {
|
|
126
128
|
const t = useT();
|
|
127
129
|
const queryClient = useQueryClient();
|
|
@@ -346,6 +348,7 @@ export function SqlChartCard({
|
|
|
346
348
|
panel={panel}
|
|
347
349
|
resolvedSql={resolvedSql}
|
|
348
350
|
loadData
|
|
351
|
+
extensionContext={extensionContext}
|
|
349
352
|
/>
|
|
350
353
|
)}
|
|
351
354
|
<div className="absolute right-1 top-1 flex items-center gap-1 opacity-0 group-hover:opacity-100">
|
|
@@ -435,6 +438,7 @@ export function SqlChartCard({
|
|
|
435
438
|
panel={panel}
|
|
436
439
|
resolvedSql={resolvedSql}
|
|
437
440
|
loadData
|
|
441
|
+
extensionContext={extensionContext}
|
|
438
442
|
/>
|
|
439
443
|
</ChartFillHeight>
|
|
440
444
|
</div>
|
|
@@ -616,6 +620,7 @@ export function SqlChartCard({
|
|
|
616
620
|
resolvedSql={resolvedSql}
|
|
617
621
|
loadData={shouldLoadData}
|
|
618
622
|
onExportCsvChange={handleExportCsvChange}
|
|
623
|
+
extensionContext={extensionContext}
|
|
619
624
|
/>
|
|
620
625
|
</CardContent>
|
|
621
626
|
</Card>
|
|
@@ -627,7 +632,12 @@ export function SqlChartCard({
|
|
|
627
632
|
</DialogHeader>
|
|
628
633
|
<div className="flex min-h-0 flex-1 flex-col overflow-auto">
|
|
629
634
|
<ChartFillHeight>
|
|
630
|
-
<SqlChart
|
|
635
|
+
<SqlChart
|
|
636
|
+
panel={panel}
|
|
637
|
+
resolvedSql={resolvedSql}
|
|
638
|
+
loadData
|
|
639
|
+
extensionContext={extensionContext}
|
|
640
|
+
/>
|
|
631
641
|
</ChartFillHeight>
|
|
632
642
|
</div>
|
|
633
643
|
</DialogContent>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable extension-point name for a dashboard box. The dashboard and panel ids
|
|
3
|
+
* are encoded independently so arbitrary saved ids cannot collapse into one
|
|
4
|
+
* slot or add path separators to the slots API.
|
|
5
|
+
*/
|
|
6
|
+
export function dashboardExtensionSlotId(
|
|
7
|
+
dashboardId: string,
|
|
8
|
+
panelId: string,
|
|
9
|
+
): string {
|
|
10
|
+
return `analytics.dashboard.${encodeURIComponent(dashboardId)}.panel.${encodeURIComponent(panelId)}`;
|
|
11
|
+
}
|
|
@@ -13,6 +13,10 @@ import {
|
|
|
13
13
|
useT,
|
|
14
14
|
type CollabUser,
|
|
15
15
|
} from "@agent-native/core/client";
|
|
16
|
+
import {
|
|
17
|
+
CreativeContextShareSheet,
|
|
18
|
+
CreativeContextShareTab,
|
|
19
|
+
} from "@agent-native/creative-context/client";
|
|
16
20
|
import {
|
|
17
21
|
useDroppable,
|
|
18
22
|
DndContext,
|
|
@@ -138,6 +142,7 @@ import {
|
|
|
138
142
|
resolveFilterVars,
|
|
139
143
|
} from "./DashboardFilterBar";
|
|
140
144
|
import { EmailReportDialog } from "./EmailReportDialog";
|
|
145
|
+
import { dashboardExtensionSlotId } from "./extension-slot";
|
|
141
146
|
import { interpolate } from "./interpolate";
|
|
142
147
|
import { serializePanelSql } from "./panel-sql";
|
|
143
148
|
import { AddPanelPopover, PanelEditorDialog } from "./PanelEditorDialog";
|
|
@@ -267,6 +272,7 @@ const PanelCell = memo(function PanelCell({
|
|
|
267
272
|
onRemovePanel,
|
|
268
273
|
onEditPanel,
|
|
269
274
|
onSavePanel,
|
|
275
|
+
dashboardExtensionContext,
|
|
270
276
|
}: {
|
|
271
277
|
panel: SqlPanel;
|
|
272
278
|
vars: Record<string, string>;
|
|
@@ -282,6 +288,7 @@ const PanelCell = memo(function PanelCell({
|
|
|
282
288
|
onRemovePanel: (panelId: string) => void;
|
|
283
289
|
onEditPanel: (panel: SqlPanel) => void;
|
|
284
290
|
onSavePanel: (panel: SqlPanel) => Promise<void>;
|
|
291
|
+
dashboardExtensionContext: Record<string, unknown>;
|
|
285
292
|
}) {
|
|
286
293
|
const resolved = useMemo(
|
|
287
294
|
() =>
|
|
@@ -362,6 +369,23 @@ const PanelCell = memo(function PanelCell({
|
|
|
362
369
|
isDragSource={isDragSource}
|
|
363
370
|
selectedForChat={selectedForChat}
|
|
364
371
|
onSelectForChat={handleSelectForChat}
|
|
372
|
+
extensionContext={
|
|
373
|
+
panel.chartType === "extension"
|
|
374
|
+
? {
|
|
375
|
+
...dashboardExtensionContext,
|
|
376
|
+
panel: {
|
|
377
|
+
id: panel.id,
|
|
378
|
+
title: panel.title,
|
|
379
|
+
slotId:
|
|
380
|
+
panel.config?.extensionSlotId ??
|
|
381
|
+
dashboardExtensionSlotId(
|
|
382
|
+
String(dashboardExtensionContext.dashboardId),
|
|
383
|
+
panel.id,
|
|
384
|
+
),
|
|
385
|
+
},
|
|
386
|
+
}
|
|
387
|
+
: undefined
|
|
388
|
+
}
|
|
365
389
|
/>
|
|
366
390
|
</div>
|
|
367
391
|
);
|
|
@@ -504,6 +528,7 @@ export default function SqlDashboardPage() {
|
|
|
504
528
|
const [emailReportOpen, setEmailReportOpen] = useState(false);
|
|
505
529
|
const [historyOpen, setHistoryOpen] = useState(false);
|
|
506
530
|
const [dashboardActionsOpen, setDashboardActionsOpen] = useState(false);
|
|
531
|
+
const [contextSheetOpen, setContextSheetOpen] = useState(false);
|
|
507
532
|
const [activeDropSlot, setActiveDropSlot] =
|
|
508
533
|
useState<DashboardDropSlot | null>(null);
|
|
509
534
|
const [activeDragPanelId, setActiveDragPanelId] = useState<string | null>(
|
|
@@ -1424,6 +1449,29 @@ export default function SqlDashboardPage() {
|
|
|
1424
1449
|
resourceId={dashboardId}
|
|
1425
1450
|
resourceTitle={dashboard.name}
|
|
1426
1451
|
variant="compact"
|
|
1452
|
+
shareTabs={{
|
|
1453
|
+
tabs: [
|
|
1454
|
+
{
|
|
1455
|
+
value: "context",
|
|
1456
|
+
label: "Context",
|
|
1457
|
+
content: (
|
|
1458
|
+
<CreativeContextShareTab
|
|
1459
|
+
resource={{
|
|
1460
|
+
appId: "analytics",
|
|
1461
|
+
resourceType: "dashboard",
|
|
1462
|
+
resourceId: dashboardId,
|
|
1463
|
+
title: dashboard.name,
|
|
1464
|
+
updatedAt: dashboardUpdatedAt ?? undefined,
|
|
1465
|
+
preview: {
|
|
1466
|
+
kind: "document",
|
|
1467
|
+
label: t("dashboard.sqlDashboard"),
|
|
1468
|
+
},
|
|
1469
|
+
}}
|
|
1470
|
+
/>
|
|
1471
|
+
),
|
|
1472
|
+
},
|
|
1473
|
+
],
|
|
1474
|
+
}}
|
|
1427
1475
|
/>
|
|
1428
1476
|
) : null}
|
|
1429
1477
|
{canEdit ? (
|
|
@@ -1509,6 +1557,18 @@ export default function SqlDashboardPage() {
|
|
|
1509
1557
|
{(canEdit && !archivedAt) || canManage ? (
|
|
1510
1558
|
<DropdownMenuSeparator />
|
|
1511
1559
|
) : null}
|
|
1560
|
+
{dashboardId && canEdit && !archivedAt ? (
|
|
1561
|
+
<DropdownMenuItem
|
|
1562
|
+
onSelect={(event) => {
|
|
1563
|
+
event.preventDefault();
|
|
1564
|
+
setDashboardActionsOpen(false);
|
|
1565
|
+
setContextSheetOpen(true);
|
|
1566
|
+
}}
|
|
1567
|
+
>
|
|
1568
|
+
<IconPlus className="mr-2 h-3.5 w-3.5" />
|
|
1569
|
+
{t("creativeContext.addToContext" /* i18n-key-ignore */)}
|
|
1570
|
+
</DropdownMenuItem>
|
|
1571
|
+
) : null}
|
|
1512
1572
|
{dashboardId ? (
|
|
1513
1573
|
<>
|
|
1514
1574
|
<DropdownMenuSeparator />
|
|
@@ -1581,6 +1641,25 @@ export default function SqlDashboardPage() {
|
|
|
1581
1641
|
canRestore={canEdit && !archivedAt}
|
|
1582
1642
|
/>
|
|
1583
1643
|
) : null}
|
|
1644
|
+
{dashboardId ? (
|
|
1645
|
+
<CreativeContextShareSheet
|
|
1646
|
+
open={contextSheetOpen}
|
|
1647
|
+
onOpenChange={setContextSheetOpen}
|
|
1648
|
+
resource={{
|
|
1649
|
+
appId: "analytics",
|
|
1650
|
+
resourceType: "dashboard",
|
|
1651
|
+
resourceId: dashboardId,
|
|
1652
|
+
title: dashboard.name,
|
|
1653
|
+
updatedAt: dashboardUpdatedAt ?? undefined,
|
|
1654
|
+
visibility: dashboardVisibility ?? undefined,
|
|
1655
|
+
preview: {
|
|
1656
|
+
kind: "document",
|
|
1657
|
+
label: t("dashboard.sqlDashboard"),
|
|
1658
|
+
},
|
|
1659
|
+
}}
|
|
1660
|
+
canManage={canManage}
|
|
1661
|
+
/>
|
|
1662
|
+
) : null}
|
|
1584
1663
|
{canManage ? (
|
|
1585
1664
|
<AlertDialog
|
|
1586
1665
|
open={confirmDeleteOpen}
|
|
@@ -1907,6 +1986,13 @@ export default function SqlDashboardPage() {
|
|
|
1907
1986
|
onRemovePanel={removePanel}
|
|
1908
1987
|
onEditPanel={openEditPanel}
|
|
1909
1988
|
onSavePanel={handleSavePanel}
|
|
1989
|
+
dashboardExtensionContext={{
|
|
1990
|
+
dashboardId,
|
|
1991
|
+
dashboardName: dashboard.name,
|
|
1992
|
+
dashboardDescription:
|
|
1993
|
+
dashboard.description ?? null,
|
|
1994
|
+
filters: vars,
|
|
1995
|
+
}}
|
|
1910
1996
|
/>
|
|
1911
1997
|
<DashboardDropLine
|
|
1912
1998
|
slot={{
|
|
@@ -99,8 +99,14 @@ export interface SqlPanelConfig {
|
|
|
99
99
|
/**
|
|
100
100
|
* Extension panels only (`chartType: "extension"`): id of the extension to
|
|
101
101
|
* render inline as a sandboxed iframe instead of running the SQL pipeline.
|
|
102
|
+
* Kept for dashboards saved before slot-backed dashboard boxes.
|
|
102
103
|
*/
|
|
103
104
|
extensionId?: string;
|
|
105
|
+
/**
|
|
106
|
+
* Extension panels only: a named extension-point slot. The dashboard renders
|
|
107
|
+
* its installed extensions as this panel's box and supplies dashboard context.
|
|
108
|
+
*/
|
|
109
|
+
extensionSlotId?: string;
|
|
104
110
|
}
|
|
105
111
|
|
|
106
112
|
export interface SqlPanel {
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { AgentTabsPage } from "@agent-native/core/client";
|
|
2
|
+
import { createCreativeContextAgentTab } from "@agent-native/creative-context/client";
|
|
2
3
|
|
|
3
4
|
export default function AgentRoute() {
|
|
4
|
-
return
|
|
5
|
+
return (
|
|
6
|
+
<AgentTabsPage
|
|
7
|
+
appName="Analytics"
|
|
8
|
+
extraTabFactories={[createCreativeContextAgentTab]}
|
|
9
|
+
/>
|
|
10
|
+
);
|
|
5
11
|
}
|
|
@@ -64,6 +64,14 @@ function panelSummaries(config: Record<string, unknown>) {
|
|
|
64
64
|
typeof panelConfig.description === "string"
|
|
65
65
|
? panelConfig.description
|
|
66
66
|
: undefined,
|
|
67
|
+
extensionId:
|
|
68
|
+
typeof panelConfig.extensionId === "string"
|
|
69
|
+
? panelConfig.extensionId
|
|
70
|
+
: undefined,
|
|
71
|
+
extensionSlotId:
|
|
72
|
+
typeof panelConfig.extensionSlotId === "string"
|
|
73
|
+
? panelConfig.extensionSlotId
|
|
74
|
+
: undefined,
|
|
67
75
|
};
|
|
68
76
|
});
|
|
69
77
|
}
|