@agent-native/core 0.115.4 → 0.117.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/agent-native.eject.json +1 -0
- package/corpus/README.md +3 -3
- package/corpus/core/CHANGELOG.md +43 -0
- package/corpus/core/agent-native.eject.json +1 -0
- package/corpus/core/docs/AGENTS.md +1 -1
- package/corpus/core/docs/content/agent-mentions.mdx +2 -2
- package/corpus/core/docs/content/{workspace.mdx → agent-resources.mdx} +1 -7
- package/corpus/core/docs/content/agent-teams.mdx +4 -4
- package/corpus/core/docs/content/dispatch.mdx +10 -10
- package/corpus/core/docs/content/drop-in-agent.mdx +4 -4
- package/corpus/core/docs/content/external-agents.mdx +1 -1
- package/corpus/core/docs/content/frames.mdx +1 -1
- package/corpus/core/docs/content/integrations.mdx +13 -2
- package/corpus/core/docs/content/key-concepts.mdx +2 -2
- package/corpus/core/docs/content/mcp-clients.mdx +7 -1
- package/corpus/core/docs/content/multi-app-workspace.mdx +3 -3
- package/corpus/core/docs/content/real-time-collaboration.mdx +33 -15
- package/corpus/core/docs/content/recurring-jobs.mdx +7 -7
- package/corpus/core/docs/content/skills-guide.mdx +4 -4
- package/corpus/core/docs/content/template-brain.mdx +1 -1
- package/corpus/core/docs/content/toolkit-collaboration.mdx +1 -1
- package/corpus/core/docs/content/using-your-agent.mdx +1 -1
- package/corpus/core/docs/content/what-is-agent-native.mdx +4 -4
- package/corpus/core/docs/content/workspace-management.mdx +4 -4
- package/corpus/core/package.json +4 -1
- package/corpus/core/src/agent/production-agent.ts +13 -3
- package/corpus/core/src/cli/doctor.ts +6 -1
- package/corpus/core/src/client/AgentPanel.tsx +79 -41
- package/corpus/core/src/client/AssistantChat.tsx +71 -25
- package/corpus/core/src/client/FeedbackButton.tsx +33 -7
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +6 -8
- package/corpus/core/src/client/agent-chat-adapter.ts +11 -2
- package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +22 -3
- package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +34 -19
- package/corpus/core/src/client/analytics.ts +7 -0
- package/corpus/core/src/client/chat/message-components.tsx +43 -16
- package/corpus/core/src/client/chat/tool-call-display.tsx +30 -18
- package/corpus/core/src/client/chat/tool-render-registry.tsx +2 -0
- package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +19 -2
- package/corpus/core/src/client/resources/ResourceTree.tsx +7 -10
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +33 -70
- package/corpus/core/src/client/resources/mcp-connection-resume.ts +107 -0
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +65 -12
- package/corpus/core/src/client/resources/mcp-integration-logos.ts +4 -0
- package/corpus/core/src/client/sse-event-processor.ts +50 -14
- package/corpus/core/src/client/use-db-sync.ts +370 -21
- package/corpus/core/src/collab/client.ts +26 -2
- package/corpus/core/src/connections/catalog.ts +7 -1
- package/corpus/core/src/db/ddl-guard.ts +49 -10
- package/corpus/core/src/deploy/build.ts +25 -2
- package/corpus/core/src/eject/remote-mcp-presets.ts +37 -5
- package/corpus/core/src/guards/explicit-collab-access.ts +229 -0
- package/corpus/core/src/guards/index.ts +1 -0
- package/corpus/core/src/localization/default-messages.ts +54 -5
- package/corpus/core/src/mcp/connect-route.ts +34 -51
- package/corpus/core/src/provider-api/index.ts +1 -1
- package/corpus/core/src/realtime-protocol.ts +92 -0
- package/corpus/core/src/server/collab-plugin.ts +137 -18
- package/corpus/core/src/server/core-routes-plugin.ts +7 -0
- package/corpus/core/src/server/index.ts +2 -0
- package/corpus/core/src/server/poll-events.ts +29 -8
- package/corpus/core/src/server/poll.ts +1123 -865
- package/corpus/core/src/server/realtime-token.ts +106 -0
- package/corpus/core/src/server/sentry-config.ts +40 -0
- package/corpus/core/src/server/short-lived-token.ts +156 -0
- package/corpus/core/src/server/sse.ts +15 -0
- package/corpus/core/src/server/ssr-handler.ts +9 -3
- package/corpus/core/src/styles/agent-native.css +40 -0
- package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/core/src/templates/default/.agents/skills/real-time-collab/SKILL.md +35 -13
- package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +35 -13
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +12 -8
- package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/analytics/AGENTS.md +7 -2
- package/corpus/templates/analytics/actions/export-dashboard-panel-to-google-sheet.ts +144 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -88
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +34 -37
- package/corpus/templates/analytics/app/global.css +0 -4
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +2 -7
- package/corpus/templates/analytics/app/i18n-data.ts +107 -0
- package/corpus/templates/analytics/app/lib/data-source-status.ts +9 -0
- package/corpus/templates/analytics/app/lib/sql-query.ts +1 -2
- package/corpus/templates/analytics/app/pages/Ask.tsx +2 -7
- package/corpus/templates/analytics/app/pages/DataSources.tsx +48 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +59 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +3 -1
- package/corpus/templates/analytics/changelog/2026-07-22-clear-background-chat-progress.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-22-daily-dashboard-email-query-batches.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-22-export-table-panels-directly-to-google-sheets.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-22-recent-chats-can-expand-in-the-sidebar.md +6 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +8 -8
- package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +31 -0
- package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +3 -5
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +12 -0
- package/corpus/templates/analytics/server/lib/first-party-dashboard-repair.ts +3 -5
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +150 -21
- package/corpus/templates/analytics/server/lib/google-sheets-export.ts +188 -0
- package/corpus/templates/analytics/server/lib/provider-api.ts +7 -2
- package/corpus/templates/analytics/server/plugins/collab.ts +6 -3
- package/corpus/templates/analytics/shared/sql-query-limits.ts +1 -0
- package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +35 -13
- package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/assets/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +54 -62
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -6
- package/corpus/templates/assets/app/routes/_index.tsx +8 -5
- package/corpus/templates/assets/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/corpus/templates/assets/changelog/2026-07-22-recent-chats-expand-from-a-compact-list.md +6 -0
- package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/brain/actions/rotate-source-ingest-token.ts +77 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +5 -1
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +38 -51
- package/corpus/templates/brain/app/hooks/use-navigation-state.ts +2 -9
- package/corpus/templates/brain/app/i18n-data.ts +120 -0
- package/corpus/templates/brain/app/routes/sources.tsx +156 -5
- package/corpus/templates/brain/changelog/2026-07-22-chat-runs-always-end-with-an-answer.md +6 -0
- package/corpus/templates/brain/changelog/2026-07-22-clear-background-chat-progress.md +6 -0
- package/corpus/templates/brain/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
- package/corpus/templates/brain/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/corpus/templates/brain/changelog/2026-07-22-long-chat-titles-stay-inside-the-sidebar.md +6 -0
- package/corpus/templates/brain/changelog/2026-07-22-new-clips-and-webhook-sources-now-show-their-secure-connecti.md +6 -0
- package/corpus/templates/brain/jobs/emit-netlify-brain-queue-cron.ts +125 -0
- package/corpus/templates/brain/netlify.toml +5 -1
- package/corpus/templates/brain/scripts/configure-prod-clips-source.ts +50 -0
- package/corpus/templates/brain/server/lib/capture-sanitization.ts +64 -6
- package/corpus/templates/brain/server/plugins/agent-chat.ts +4 -0
- package/corpus/templates/brain/server/plugins/brain-jobs.ts +1 -0
- package/corpus/templates/brain/server/routes/api/brain/queue/run.post.ts +55 -0
- package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -0
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +43 -67
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +2 -7
- package/corpus/templates/chat/app/routes/_index.tsx +8 -5
- package/corpus/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
- package/corpus/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/corpus/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
- package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/clips/AGENTS.md +9 -1
- package/corpus/templates/clips/actions/export-to-brain.ts +82 -6
- package/corpus/templates/clips/actions/request-transcript.ts +25 -14
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +12 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +1 -0
- package/corpus/templates/clips/changelog/2026-07-22-clips-transcripts-now-retry-brain-export.md +5 -0
- package/corpus/templates/clips/changelog/2026-07-22-german-umlauts-and-other-non-ascii-characters-now-paste-corr.md +6 -0
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +26 -3
- package/corpus/templates/clips/jobs/emit-netlify-brain-export-cron.ts +118 -0
- package/corpus/templates/clips/netlify.toml +4 -1
- package/corpus/templates/clips/scripts/configure-prod-brain-export.ts +92 -0
- package/corpus/templates/clips/server/jobs/brain-export.ts +182 -0
- package/corpus/templates/clips/server/lib/brain-export-state.ts +42 -0
- package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +5 -1
- package/corpus/templates/clips/server/plugins/calendar-jobs.ts +2 -0
- package/corpus/templates/clips/server/register-secrets.ts +42 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +10 -1
- package/corpus/templates/clips/server/routes/api/clips/brain-export/run.post.ts +45 -0
- package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +566 -299
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +14 -0
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -1
- package/corpus/templates/content/app/i18n-data.ts +90 -0
- package/corpus/templates/content/server/plugins/collab.ts +1 -1
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/crm/actions/_crm-data-program-actions.ts +15 -0
- package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +2 -0
- package/corpus/templates/crm/actions/run.ts +2 -6
- package/corpus/templates/crm/actions/update-crm-record.ts +4 -2
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +6 -0
- package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/corpus/templates/crm/server/crm/hubspot-adapter.ts +4 -1
- package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/design/server/plugins/collab.ts +11 -8
- package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -0
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/forms/app/hooks/use-navigation-state.ts +2 -9
- package/corpus/templates/forms/app/root.tsx +1 -6
- package/corpus/templates/forms/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -1
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +57 -72
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +2 -9
- package/corpus/templates/plan/app/lib/create-plan-routing.ts +2 -2
- package/corpus/templates/plan/app/pages/PlanChatPage.tsx +0 -1
- package/corpus/templates/plan/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-22-recent-chats-and-sidebar-controls-are-more-compact.md +6 -0
- package/corpus/templates/plan/server/plugins/collab.ts +5 -2
- package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/slides/server/plugins/collab.ts +11 -8
- package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/corpus/templates/tasks/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +5 -22
- package/corpus/templates/tasks/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
- package/corpus/toolkit/CHANGELOG.md +7 -0
- package/corpus/toolkit/README.md +12 -3
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +89 -0
- package/corpus/toolkit/src/chat-history/index.ts +5 -0
- package/corpus/toolkit/src/chat-history.css +59 -0
- package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +106 -36
- package/corpus/toolkit/src/composer/VoiceButton.tsx +49 -0
- package/corpus/toolkit/src/composer/realtime-voice-audio-level.ts +2 -1
- package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +5 -3
- package/corpus/toolkit/src/styles.css +35 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +13 -3
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +5 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +1 -0
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +38 -18
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +55 -20
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts +4 -2
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +18 -2
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +2 -3
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +11 -3
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-page/AgentTabFrame.d.ts +3 -1
- package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -1
- package/dist/client/agent-page/AgentTabFrame.js +3 -2
- package/dist/client/agent-page/AgentTabFrame.js.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.d.ts +2 -0
- package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.js +26 -15
- package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
- package/dist/client/analytics.d.ts +10 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +6 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +17 -11
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +11 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +16 -17
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/tool-render-registry.d.ts +2 -0
- package/dist/client/chat/tool-render-registry.d.ts.map +1 -1
- package/dist/client/chat/tool-render-registry.js.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.js +15 -1
- package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +3 -3
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts +1 -0
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +34 -20
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/mcp-connection-resume.d.ts +11 -0
- package/dist/client/resources/mcp-connection-resume.d.ts.map +1 -0
- package/dist/client/resources/mcp-connection-resume.js +95 -0
- package/dist/client/resources/mcp-connection-resume.js.map +1 -0
- package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
- package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.js +63 -8
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/client/resources/mcp-integration-logos.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-logos.js +4 -0
- package/dist/client/resources/mcp-integration-logos.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +5 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +39 -13
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +4 -3
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +332 -21
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +26 -2
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +1 -1
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +7 -1
- package/dist/connections/catalog.js.map +1 -1
- package/dist/db/ddl-guard.d.ts +7 -2
- package/dist/db/ddl-guard.d.ts.map +1 -1
- package/dist/db/ddl-guard.js +21 -9
- package/dist/db/ddl-guard.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +25 -2
- package/dist/deploy/build.js.map +1 -1
- package/dist/eject/remote-mcp-presets.d.ts.map +1 -1
- package/dist/eject/remote-mcp-presets.js +33 -3
- package/dist/eject/remote-mcp-presets.js.map +1 -1
- package/dist/guards/explicit-collab-access.d.ts +8 -0
- package/dist/guards/explicit-collab-access.d.ts.map +1 -0
- package/dist/guards/explicit-collab-access.js +214 -0
- package/dist/guards/explicit-collab-access.js.map +1 -0
- package/dist/guards/index.d.ts +1 -0
- package/dist/guards/index.d.ts.map +1 -1
- package/dist/guards/index.js +1 -0
- package/dist/guards/index.js.map +1 -1
- package/dist/localization/default-messages.d.ts +43 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +48 -5
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp/connect-route.d.ts.map +1 -1
- package/dist/mcp/connect-route.js +34 -48
- package/dist/mcp/connect-route.js.map +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
- package/dist/provider-api/actions/provider-api.d.ts +7 -7
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/provider-api/index.js +1 -1
- package/dist/provider-api/index.js.map +1 -1
- package/dist/realtime-protocol.d.ts +40 -0
- package/dist/realtime-protocol.d.ts.map +1 -0
- package/dist/realtime-protocol.js +69 -0
- package/dist/realtime-protocol.js.map +1 -0
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/routes.d.ts +3 -3
- package/dist/server/collab-plugin.d.ts +34 -3
- package/dist/server/collab-plugin.d.ts.map +1 -1
- package/dist/server/collab-plugin.js +65 -12
- package/dist/server/collab-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +3 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/poll-events.d.ts +7 -1
- package/dist/server/poll-events.d.ts.map +1 -1
- package/dist/server/poll-events.js +24 -7
- package/dist/server/poll-events.js.map +1 -1
- package/dist/server/poll.d.ts +223 -42
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +849 -737
- package/dist/server/poll.js.map +1 -1
- package/dist/server/realtime-token.d.ts +34 -0
- package/dist/server/realtime-token.d.ts.map +1 -0
- package/dist/server/realtime-token.js +85 -0
- package/dist/server/realtime-token.js.map +1 -0
- package/dist/server/sentry-config.d.ts +12 -0
- package/dist/server/sentry-config.d.ts.map +1 -1
- package/dist/server/sentry-config.js +34 -0
- package/dist/server/sentry-config.js.map +1 -1
- package/dist/server/short-lived-token.d.ts +46 -0
- package/dist/server/short-lived-token.d.ts.map +1 -1
- package/dist/server/short-lived-token.js +104 -0
- package/dist/server/short-lived-token.js.map +1 -1
- package/dist/server/sse.d.ts +1 -1
- package/dist/server/sse.d.ts.map +1 -1
- package/dist/server/sse.js +4 -0
- package/dist/server/sse.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +5 -3
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-native.css +40 -0
- package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/dist/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/dist/templates/chat/app/components/layout/Layout.tsx +1 -0
- package/dist/templates/chat/app/components/layout/Sidebar.tsx +43 -67
- package/dist/templates/chat/app/hooks/use-navigation-state.ts +2 -7
- package/dist/templates/chat/app/routes/_index.tsx +8 -5
- package/dist/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
- package/dist/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/dist/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
- package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +35 -13
- package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +35 -13
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +12 -8
- package/docs/AGENTS.md +1 -1
- package/docs/content/agent-mentions.mdx +2 -2
- package/docs/content/{workspace.mdx → agent-resources.mdx} +1 -7
- package/docs/content/agent-teams.mdx +4 -4
- package/docs/content/dispatch.mdx +10 -10
- package/docs/content/drop-in-agent.mdx +4 -4
- package/docs/content/external-agents.mdx +1 -1
- package/docs/content/frames.mdx +1 -1
- package/docs/content/integrations.mdx +13 -2
- package/docs/content/key-concepts.mdx +2 -2
- package/docs/content/mcp-clients.mdx +7 -1
- package/docs/content/multi-app-workspace.mdx +3 -3
- package/docs/content/real-time-collaboration.mdx +33 -15
- package/docs/content/recurring-jobs.mdx +7 -7
- package/docs/content/skills-guide.mdx +4 -4
- package/docs/content/template-brain.mdx +1 -1
- package/docs/content/toolkit-collaboration.mdx +1 -1
- package/docs/content/using-your-agent.mdx +1 -1
- package/docs/content/what-is-agent-native.mdx +4 -4
- package/docs/content/workspace-management.mdx +4 -4
- package/package.json +6 -3
- package/src/agent/production-agent.ts +13 -3
- package/src/cli/doctor.ts +6 -1
- package/src/client/AgentPanel.tsx +79 -41
- package/src/client/AssistantChat.tsx +71 -25
- package/src/client/FeedbackButton.tsx +33 -7
- package/src/client/MultiTabAssistantChat.tsx +6 -8
- package/src/client/agent-chat-adapter.ts +11 -2
- package/src/client/agent-page/AgentTabFrame.tsx +22 -3
- package/src/client/agent-page/AgentTabsPage.tsx +34 -19
- package/src/client/analytics.ts +7 -0
- package/src/client/chat/message-components.tsx +43 -16
- package/src/client/chat/tool-call-display.tsx +30 -18
- package/src/client/chat/tool-render-registry.tsx +2 -0
- package/src/client/resources/McpConnectionSuggestion.tsx +19 -2
- package/src/client/resources/ResourceTree.tsx +7 -10
- package/src/client/resources/ResourcesPanel.tsx +33 -70
- package/src/client/resources/mcp-connection-resume.ts +107 -0
- package/src/client/resources/mcp-integration-catalog.ts +65 -12
- package/src/client/resources/mcp-integration-logos.ts +4 -0
- package/src/client/sse-event-processor.ts +50 -14
- package/src/client/use-db-sync.ts +370 -21
- package/src/collab/client.ts +26 -2
- package/src/connections/catalog.ts +7 -1
- package/src/db/ddl-guard.ts +49 -10
- package/src/deploy/build.ts +25 -2
- package/src/eject/remote-mcp-presets.ts +37 -5
- package/src/guards/explicit-collab-access.ts +229 -0
- package/src/guards/index.ts +1 -0
- package/src/localization/default-messages.ts +54 -5
- package/src/mcp/connect-route.ts +34 -51
- package/src/provider-api/index.ts +1 -1
- package/src/realtime-protocol.ts +92 -0
- package/src/server/collab-plugin.ts +137 -18
- package/src/server/core-routes-plugin.ts +7 -0
- package/src/server/index.ts +2 -0
- package/src/server/poll-events.ts +29 -8
- package/src/server/poll.ts +1123 -865
- package/src/server/realtime-token.ts +106 -0
- package/src/server/sentry-config.ts +40 -0
- package/src/server/short-lived-token.ts +156 -0
- package/src/server/sse.ts +15 -0
- package/src/server/ssr-handler.ts +9 -3
- package/src/styles/agent-native.css +40 -0
- package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/src/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/src/templates/chat/app/components/layout/Layout.tsx +1 -0
- package/src/templates/chat/app/components/layout/Sidebar.tsx +43 -67
- package/src/templates/chat/app/hooks/use-navigation-state.ts +2 -7
- package/src/templates/chat/app/routes/_index.tsx +8 -5
- package/src/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
- package/src/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/src/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
- package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +35 -13
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +4 -1
- package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +35 -13
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +12 -8
|
@@ -72,7 +72,7 @@ The agent modifies data in SQL, but the UI runs in the browser. SSE bridges same
|
|
|
72
72
|
});
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
`useDbSync` and every `subscribeSyncEvents` subscriber share one `EventSource` and one fallback poll loop per tab — this is how collaborative documents receive doc updates and cursor/awareness events.
|
|
75
|
+
`useDbSync` and every `subscribeSyncEvents` subscriber share one `EventSource` and one fallback poll loop per tab — this is how collaborative documents receive doc updates and cursor/awareness events. Hidden tabs keep that shared transport alive by default: SSE stays connected and active fallback polling relaxes to a 10-second floor (idle polling remains once per minute). Pass `pauseWhenHidden: true` only for a consumer that explicitly must stop all hidden-tab sync.
|
|
76
76
|
|
|
77
77
|
## Which sources to depend on
|
|
78
78
|
|
package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md
CHANGED
|
@@ -24,9 +24,10 @@ shared agent sidebar.
|
|
|
24
24
|
- **Always show the mic alongside the send button.** Cursor replaces send
|
|
25
25
|
with mic when the composer is empty; their users complain. We keep both
|
|
26
26
|
visible — Lovable does the same.
|
|
27
|
-
- **Ask before switching modes.** The mic opens a shadcn popover
|
|
28
|
-
**
|
|
29
|
-
established dictation behavior.
|
|
27
|
+
- **Ask before switching modes.** The mic opens a compact shadcn popover with
|
|
28
|
+
**Real-time voice** as the primary action and **Dictate** as the secondary;
|
|
29
|
+
never silently replace the established dictation behavior. Users can choose
|
|
30
|
+
**Remember my preference** to skip the chooser on later clicks.
|
|
30
31
|
- **Dictation is click-to-toggle, not push-to-talk.** More forgiving in a sidebar, avoids
|
|
31
32
|
host-app hotkey clashes. Keyboard shortcut is `Cmd/Ctrl+Shift+M` and
|
|
32
33
|
`Escape` cancels mid-recording.
|
|
@@ -100,6 +101,9 @@ action before requesting microphone permission.
|
|
|
100
101
|
`application_state["realtime-voice-prefs"]`. Keep this separate from
|
|
101
102
|
`voice-transcription-prefs`, which configures editable dictation rather than
|
|
102
103
|
the speech-to-speech session.
|
|
104
|
+
- Store the optional remembered chooser selection at
|
|
105
|
+
`application_state["voice-input-preference"]`. Keep it separate from both
|
|
106
|
+
mode-specific preference objects.
|
|
103
107
|
- Missing-key failures should open Settings focused on the user-scoped
|
|
104
108
|
`OPENAI_API_KEY` field. Never send, log, or echo the key to the browser.
|
|
105
109
|
|
|
@@ -147,11 +151,11 @@ Default behavior:
|
|
|
147
151
|
|
|
148
152
|
| File | Purpose |
|
|
149
153
|
| --------------------------------------------------------------------- | --------------------------------------------------- |
|
|
150
|
-
| `packages/
|
|
151
|
-
| `packages/
|
|
152
|
-
| `packages/
|
|
153
|
-
| `packages/
|
|
154
|
-
| `packages/
|
|
154
|
+
| `packages/toolkit/src/composer/useVoiceDictation.ts` | Provider-routing hook (MediaRecorder / Web Speech) |
|
|
155
|
+
| `packages/toolkit/src/composer/VoiceButton.tsx` | Mic button + live amplitude + cancel overlay |
|
|
156
|
+
| `packages/toolkit/src/composer/RealtimeVoiceMode.tsx` | Opt-in popover + persistent speech orb |
|
|
157
|
+
| `packages/toolkit/src/composer/useRealtimeVoiceMode.tsx` | WebRTC lifecycle, provider events, and tool bridge |
|
|
158
|
+
| `packages/toolkit/src/composer/TiptapComposer.tsx` | Wires the hook, insertion, and keyboard shortcut |
|
|
155
159
|
| `packages/core/src/client/settings/VoiceTranscriptionSection.tsx` | Live source + cleanup controls in sidebar settings |
|
|
156
160
|
| `packages/core/src/client/transcription/BuilderTranscriptionCta.tsx` | CTA shown when Builder account isn't connected |
|
|
157
161
|
| `packages/core/src/client/transcription/use-live-transcription.ts` | Web Speech live-transcription hook for recordings |
|
|
@@ -85,7 +85,10 @@ in the moment of agent use.
|
|
|
85
85
|
approval, generative UI, progress, and screen-state exposure.
|
|
86
86
|
- **Chat history kit**: presentational chat lists and recent-chat rails belong
|
|
87
87
|
in Toolkit; Core keeps thread persistence, agent execution, transport, and
|
|
88
|
-
page-to-sidebar handoff.
|
|
88
|
+
page-to-sidebar handoff. Use Toolkit's `ChatHistoryRail` for the standard
|
|
89
|
+
five-item sidebar preview and a footer row with New chat followed by an
|
|
90
|
+
ellipsis disclosure up to fifteen. Apps inject routing, labels, and domain
|
|
91
|
+
actions.
|
|
89
92
|
- **Agent page kit**: the full-page `/agent` surface (`AgentTabsPage` from
|
|
90
93
|
`@agent-native/core/client`) with Context, Files, Connections, Jobs, and
|
|
91
94
|
Access tabs plus a Personal/Organization scope toggle. The canonical home
|
|
@@ -72,7 +72,7 @@ The agent modifies data in SQL, but the UI runs in the browser. SSE bridges same
|
|
|
72
72
|
});
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
`useDbSync` and every `subscribeSyncEvents` subscriber share one `EventSource` and one fallback poll loop per tab — this is how collaborative documents receive doc updates and cursor/awareness events.
|
|
75
|
+
`useDbSync` and every `subscribeSyncEvents` subscriber share one `EventSource` and one fallback poll loop per tab — this is how collaborative documents receive doc updates and cursor/awareness events. Hidden tabs keep that shared transport alive by default: SSE stays connected and active fallback polling relaxes to a 10-second floor (idle polling remains once per minute). Pass `pauseWhenHidden: true` only for a consumer that explicitly must stop all hidden-tab sync.
|
|
76
76
|
|
|
77
77
|
## Which sources to depend on
|
|
78
78
|
|
|
@@ -228,11 +228,16 @@ membership id when its native update status reports `update-available`.
|
|
|
228
228
|
`dashboard-report-subscriptions` actions. They send daily snapshots scoped to
|
|
229
229
|
the exact user/org context that created the subscription with saved URL
|
|
230
230
|
filters; do not hand-wire custom email routes around that action surface.
|
|
231
|
+
- Table panels can be exported with `export-dashboard-panel-to-google-sheet`.
|
|
232
|
+
The action re-runs the accessible panel query with the dashboard's current
|
|
233
|
+
filter variables, creates a new Sheet through the connected Google Drive
|
|
234
|
+
workspace connection, and returns its URL plus bounded export metadata.
|
|
231
235
|
Report PNGs are Playwright captures of the real dashboard route in
|
|
232
236
|
`reportScreenshot=1` mode, authenticated by a short-lived embed-session token
|
|
233
237
|
and embedded inline in email as ordered CID images. Complete dashboards are
|
|
234
|
-
captured sequentially in
|
|
235
|
-
|
|
238
|
+
captured sequentially in four-panel windows matching the browser's four-query
|
|
239
|
+
concurrency limit; every window must match the panel ids snapshotted at the
|
|
240
|
+
start, and a failed or mismatched window
|
|
236
241
|
invalidates the entire image set so the scheduler can retry instead of
|
|
237
242
|
sending a partial report. Capture is capped at 10 windows and 14 MiB of raw
|
|
238
243
|
PNG data, and subscriptions are capped at five distinct recipients; use a
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core/action";
|
|
2
|
+
import { getCredentialContext } from "@agent-native/core/server/request-context";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
|
|
5
|
+
import { interpolate } from "../app/pages/adhoc/sql-dashboard/interpolate";
|
|
6
|
+
import {
|
|
7
|
+
isDashboardPanelSource,
|
|
8
|
+
normalizeDashboardPanelQuery,
|
|
9
|
+
} from "../server/lib/dashboard-panel-query";
|
|
10
|
+
import { resolveAnalyticsPanelSource } from "../server/lib/dashboard-panel-source-resolver";
|
|
11
|
+
import { getDashboard } from "../server/lib/dashboards-store";
|
|
12
|
+
import { exportDashboardPanelToGoogleSheet } from "../server/lib/google-sheets-export";
|
|
13
|
+
|
|
14
|
+
type DashboardPanel = {
|
|
15
|
+
id?: unknown;
|
|
16
|
+
title?: unknown;
|
|
17
|
+
sql?: unknown;
|
|
18
|
+
source?: unknown;
|
|
19
|
+
chartType?: unknown;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const MAX_EXPORT_ROWS = 10_000;
|
|
23
|
+
const MAX_EXPORT_CELLS = 500_000;
|
|
24
|
+
|
|
25
|
+
function asPanels(config: Record<string, unknown>): DashboardPanel[] {
|
|
26
|
+
return Array.isArray(config.panels)
|
|
27
|
+
? config.panels.filter(
|
|
28
|
+
(panel): panel is DashboardPanel =>
|
|
29
|
+
Boolean(panel) && typeof panel === "object" && !Array.isArray(panel),
|
|
30
|
+
)
|
|
31
|
+
: [];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function missingKeyMessage(result: unknown): string | null {
|
|
35
|
+
if (!result || typeof result !== "object" || Array.isArray(result)) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const value = result as { error?: unknown; message?: unknown };
|
|
39
|
+
return value.error === "missing_api_key" && typeof value.message === "string"
|
|
40
|
+
? value.message
|
|
41
|
+
: null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default defineAction({
|
|
45
|
+
description:
|
|
46
|
+
"Export one accessible Analytics SQL dashboard table panel's underlying query results to a newly created Google Sheet using the connected Google Drive account. Returns the Sheet URL, spreadsheet id, row count, and export metadata. Only chartType=table panels are supported.",
|
|
47
|
+
schema: z.object({
|
|
48
|
+
dashboardId: z.string().trim().min(1).describe("The SQL dashboard ID"),
|
|
49
|
+
panelId: z.string().trim().min(1).describe("The table panel ID"),
|
|
50
|
+
filters: z.record(z.string(), z.string()).optional().default({}),
|
|
51
|
+
}),
|
|
52
|
+
http: { method: "POST" },
|
|
53
|
+
needsApproval: true,
|
|
54
|
+
toolCallable: false,
|
|
55
|
+
run: async ({ dashboardId, panelId, filters }) => {
|
|
56
|
+
const context = getCredentialContext();
|
|
57
|
+
if (!context) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
"No authenticated context for export-dashboard-panel-to-google-sheet.",
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const dashboard = await getDashboard(dashboardId, {
|
|
64
|
+
email: context.userEmail,
|
|
65
|
+
orgId: context.orgId ?? null,
|
|
66
|
+
});
|
|
67
|
+
if (!dashboard || dashboard.kind !== "sql") {
|
|
68
|
+
throw Object.assign(new Error("Dashboard not found"), {
|
|
69
|
+
statusCode: 404,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const panel = asPanels(dashboard.config).find(
|
|
74
|
+
(candidate) => candidate.id === panelId,
|
|
75
|
+
);
|
|
76
|
+
if (!panel) {
|
|
77
|
+
throw Object.assign(new Error("Dashboard panel not found"), {
|
|
78
|
+
statusCode: 404,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (panel.chartType !== "table") {
|
|
82
|
+
throw new Error("Only table dashboard panels can be exported.");
|
|
83
|
+
}
|
|
84
|
+
if (!isDashboardPanelSource(panel.source)) {
|
|
85
|
+
throw new Error("Dashboard panel has an unsupported data source.");
|
|
86
|
+
}
|
|
87
|
+
if (typeof panel.sql !== "string" && typeof panel.sql !== "object") {
|
|
88
|
+
throw new Error("Dashboard panel has no query to export.");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const rawQuery =
|
|
92
|
+
typeof panel.sql === "string"
|
|
93
|
+
? interpolate(panel.sql, filters, { failClosedTimeVariables: true })
|
|
94
|
+
: panel.sql;
|
|
95
|
+
const query = normalizeDashboardPanelQuery(panel.source, rawQuery);
|
|
96
|
+
const result = await resolveAnalyticsPanelSource(
|
|
97
|
+
{ source: panel.source, query },
|
|
98
|
+
context,
|
|
99
|
+
);
|
|
100
|
+
const missing = missingKeyMessage(result);
|
|
101
|
+
if (missing) throw new Error(missing);
|
|
102
|
+
if (
|
|
103
|
+
!result ||
|
|
104
|
+
typeof result !== "object" ||
|
|
105
|
+
Array.isArray(result) ||
|
|
106
|
+
!("rows" in result) ||
|
|
107
|
+
!Array.isArray(result.rows)
|
|
108
|
+
) {
|
|
109
|
+
throw new Error("Dashboard panel query returned an invalid result.");
|
|
110
|
+
}
|
|
111
|
+
const queryResult = result;
|
|
112
|
+
const columnCount = Array.isArray(queryResult.schema)
|
|
113
|
+
? queryResult.schema.length
|
|
114
|
+
: Object.keys(queryResult.rows[0] ?? {}).length;
|
|
115
|
+
if (queryResult.rows.length > MAX_EXPORT_ROWS) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
`This panel returned more than ${MAX_EXPORT_ROWS.toLocaleString()} rows. Narrow the dashboard filters before exporting.`,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
if (queryResult.rows.length * columnCount > MAX_EXPORT_CELLS) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
"This panel result is too wide to export safely. Narrow the query or reduce its columns.",
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return exportDashboardPanelToGoogleSheet({
|
|
127
|
+
dashboardId,
|
|
128
|
+
dashboardTitle:
|
|
129
|
+
typeof dashboard.title === "string" && dashboard.title.trim()
|
|
130
|
+
? dashboard.title
|
|
131
|
+
: "Analytics dashboard",
|
|
132
|
+
panelId,
|
|
133
|
+
panelTitle:
|
|
134
|
+
typeof panel.title === "string" && panel.title.trim()
|
|
135
|
+
? panel.title
|
|
136
|
+
: panelId,
|
|
137
|
+
source: panel.source,
|
|
138
|
+
rows: queryResult.rows,
|
|
139
|
+
schema: Array.isArray(queryResult.schema) ? queryResult.schema : [],
|
|
140
|
+
truncated: queryResult.truncated,
|
|
141
|
+
bytesProcessed: queryResult.bytesProcessed,
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
});
|
|
@@ -2,12 +2,11 @@ import {
|
|
|
2
2
|
AgentSidebar,
|
|
3
3
|
GuidedQuestionFlow,
|
|
4
4
|
focusAgentChat,
|
|
5
|
-
markAgentChatHomeHandoff,
|
|
6
5
|
navigateWithAgentChatViewTransition,
|
|
7
6
|
useAgentChatHomeHandoff,
|
|
7
|
+
useAgentChatHomeHandoffLinks,
|
|
8
8
|
useGuidedQuestionFlow,
|
|
9
9
|
} from "@agent-native/core/client/agent-chat";
|
|
10
|
-
import { appBasePath } from "@agent-native/core/client/api-path";
|
|
11
10
|
import { useT } from "@agent-native/core/client/i18n";
|
|
12
11
|
import { InvitationBanner } from "@agent-native/core/client/org";
|
|
13
12
|
import { CreativeContextComposerChip } from "@agent-native/creative-context/client";
|
|
@@ -17,7 +16,6 @@ import { useLocation, useNavigate } from "react-router";
|
|
|
17
16
|
import { useNavigationState } from "@/hooks/use-navigation-state";
|
|
18
17
|
import {
|
|
19
18
|
ANALYTICS_CHAT_STORAGE_KEY,
|
|
20
|
-
hasRecentAnalyticsChat,
|
|
21
19
|
markAnalyticsChatActivity,
|
|
22
20
|
} from "@/lib/chat-handoff";
|
|
23
21
|
import { TAB_ID } from "@/lib/tab-id";
|
|
@@ -37,59 +35,6 @@ interface LayoutProps {
|
|
|
37
35
|
|
|
38
36
|
const BARE_ROUTES = new Set(["/chart"]);
|
|
39
37
|
|
|
40
|
-
function stripBasePath(path: string): string {
|
|
41
|
-
const basePath = appBasePath();
|
|
42
|
-
if (!basePath) return path;
|
|
43
|
-
if (path === basePath) return "/";
|
|
44
|
-
if (path.startsWith(`${basePath}/`)) return path.slice(basePath.length);
|
|
45
|
-
if (path.startsWith(`${basePath}?`) || path.startsWith(`${basePath}#`)) {
|
|
46
|
-
return `/${path.slice(basePath.length)}`;
|
|
47
|
-
}
|
|
48
|
-
return path;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function pathnameFromLocalPath(path: string): string {
|
|
52
|
-
return path.split(/[?#]/, 1)[0] || "/";
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function isFrameworkOrApiPath(pathname: string): boolean {
|
|
56
|
-
return (
|
|
57
|
-
pathname === "/_agent-native" ||
|
|
58
|
-
pathname.startsWith("/_agent-native/") ||
|
|
59
|
-
pathname === "/api" ||
|
|
60
|
-
pathname.startsWith("/api/")
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function isStaticAssetPath(pathname: string): boolean {
|
|
65
|
-
const lastSegment = pathname.split("/").pop() ?? "";
|
|
66
|
-
return /\.[A-Za-z0-9]{1,12}$/.test(lastSegment);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function localPathFromAnchor(anchor: HTMLAnchorElement): string | null {
|
|
70
|
-
if (!anchor.href) return null;
|
|
71
|
-
try {
|
|
72
|
-
const url = new URL(anchor.href);
|
|
73
|
-
if (url.origin !== window.location.origin) return null;
|
|
74
|
-
return stripBasePath(`${url.pathname}${url.search}${url.hash}`);
|
|
75
|
-
} catch {
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function shouldHandleAnchorClick(
|
|
81
|
-
event: MouseEvent,
|
|
82
|
-
anchor: HTMLAnchorElement,
|
|
83
|
-
): boolean {
|
|
84
|
-
if (event.defaultPrevented || event.button !== 0) return false;
|
|
85
|
-
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
if (anchor.target && anchor.target !== "_self") return false;
|
|
89
|
-
if (anchor.hasAttribute("download")) return false;
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
38
|
export function Layout({ children }: LayoutProps) {
|
|
94
39
|
useNavigationState();
|
|
95
40
|
const location = useLocation();
|
|
@@ -163,6 +108,12 @@ export function Layout({ children }: LayoutProps) {
|
|
|
163
108
|
activePath: location.pathname,
|
|
164
109
|
enabled: !isAskRoute && !reportScreenshot,
|
|
165
110
|
});
|
|
111
|
+
useAgentChatHomeHandoffLinks({
|
|
112
|
+
storageKey: ANALYTICS_CHAT_STORAGE_KEY,
|
|
113
|
+
chatPath: "/ask",
|
|
114
|
+
enabled: !reportScreenshot,
|
|
115
|
+
requireActiveHandoff: false,
|
|
116
|
+
});
|
|
166
117
|
useEffect(() => {
|
|
167
118
|
function handleChatRunning(event: Event) {
|
|
168
119
|
const detail = (event as CustomEvent).detail;
|
|
@@ -176,38 +127,6 @@ export function Layout({ children }: LayoutProps) {
|
|
|
176
127
|
window.removeEventListener("agentNative.chatRunning", handleChatRunning);
|
|
177
128
|
}, []);
|
|
178
129
|
|
|
179
|
-
useEffect(() => {
|
|
180
|
-
if (!isAskRoute) return;
|
|
181
|
-
|
|
182
|
-
function handleClick(event: MouseEvent) {
|
|
183
|
-
const target = event.target;
|
|
184
|
-
if (!(target instanceof Element)) return;
|
|
185
|
-
const anchor = target.closest("a[href]");
|
|
186
|
-
if (!(anchor instanceof HTMLAnchorElement)) return;
|
|
187
|
-
if (!shouldHandleAnchorClick(event, anchor)) return;
|
|
188
|
-
if (anchor.closest(".agent-panel-root")) return;
|
|
189
|
-
|
|
190
|
-
const path = localPathFromAnchor(anchor);
|
|
191
|
-
const pathname = path ? pathnameFromLocalPath(path) : "";
|
|
192
|
-
if (
|
|
193
|
-
!path ||
|
|
194
|
-
pathname === "/ask" ||
|
|
195
|
-
isFrameworkOrApiPath(pathname) ||
|
|
196
|
-
isStaticAssetPath(pathname) ||
|
|
197
|
-
!hasRecentAnalyticsChat()
|
|
198
|
-
) {
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
event.preventDefault();
|
|
203
|
-
markAgentChatHomeHandoff(ANALYTICS_CHAT_STORAGE_KEY);
|
|
204
|
-
navigateWithAgentChatViewTransition(navigate, path);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
document.addEventListener("click", handleClick, true);
|
|
208
|
-
return () => document.removeEventListener("click", handleClick, true);
|
|
209
|
-
}, [isAskRoute, navigate]);
|
|
210
|
-
|
|
211
130
|
function openAskAgentFullscreen() {
|
|
212
131
|
focusAgentChat();
|
|
213
132
|
navigateWithAgentChatViewTransition(navigate, "/ask");
|
|
@@ -98,7 +98,7 @@ import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
|
|
|
98
98
|
import { OrgSwitcher } from "@agent-native/core/client/org";
|
|
99
99
|
import { FeedbackButton } from "@agent-native/core/client/ui";
|
|
100
100
|
import {
|
|
101
|
-
|
|
101
|
+
ChatHistoryRail,
|
|
102
102
|
type ChatHistoryItem,
|
|
103
103
|
} from "@agent-native/toolkit/chat-history";
|
|
104
104
|
|
|
@@ -1334,7 +1334,7 @@ function AnalyticsChatsSection({ isAskRoute }: { isAskRoute: boolean }) {
|
|
|
1334
1334
|
threads
|
|
1335
1335
|
.filter((thread) => thread.messageCount > 0 && !thread.archivedAt)
|
|
1336
1336
|
.sort(compareThreads)
|
|
1337
|
-
.slice(0,
|
|
1337
|
+
.slice(0, 15),
|
|
1338
1338
|
[threads],
|
|
1339
1339
|
);
|
|
1340
1340
|
const chatItems = useMemo<ChatHistoryItem[]>(
|
|
@@ -1433,40 +1433,37 @@ function AnalyticsChatsSection({ isAskRoute }: { isAskRoute: boolean }) {
|
|
|
1433
1433
|
/>
|
|
1434
1434
|
</div>
|
|
1435
1435
|
))}
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
}
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
className="
|
|
1466
|
-
|
|
1467
|
-
<IconPlus className="h-3 w-3" />
|
|
1468
|
-
{t("chat.newChat")}
|
|
1469
|
-
</button>
|
|
1436
|
+
<ChatHistoryRail
|
|
1437
|
+
items={chatItems}
|
|
1438
|
+
activeId={displayedActiveThreadId}
|
|
1439
|
+
onSelect={(threadId) => openThread(threadId)}
|
|
1440
|
+
onNewChat={() => void handleNewChat()}
|
|
1441
|
+
railLabels={{
|
|
1442
|
+
newChat: t("chat.newChat"),
|
|
1443
|
+
showMore: t("sidebar.showMore", {
|
|
1444
|
+
count: Math.max(0, visibleThreads.length - SIDEBAR_PREVIEW_COUNT),
|
|
1445
|
+
}),
|
|
1446
|
+
showLess: t("sidebar.showLess"),
|
|
1447
|
+
}}
|
|
1448
|
+
renameMaxLength={160}
|
|
1449
|
+
onTogglePin={(threadId) => {
|
|
1450
|
+
const thread = visibleThreads.find((item) => item.id === threadId);
|
|
1451
|
+
if (thread) void pinThread(threadId, !thread.pinnedAt);
|
|
1452
|
+
}}
|
|
1453
|
+
onRename={handleRenameThread}
|
|
1454
|
+
onDelete={(threadId) => void handleArchiveThread(threadId)}
|
|
1455
|
+
labels={{
|
|
1456
|
+
options: (item) =>
|
|
1457
|
+
t("chat.optionsFor", { title: item.titleText ?? "" }),
|
|
1458
|
+
renameInput: (item) =>
|
|
1459
|
+
t("chat.renameThread", { title: item.titleText ?? "" }),
|
|
1460
|
+
rename: t("chat.renameChat"),
|
|
1461
|
+
pin: t("chat.pinChat"),
|
|
1462
|
+
unpin: t("chat.unpinChat"),
|
|
1463
|
+
delete: t("chat.archiveChat"),
|
|
1464
|
+
}}
|
|
1465
|
+
className="min-w-0"
|
|
1466
|
+
/>
|
|
1470
1467
|
</div>
|
|
1471
1468
|
);
|
|
1472
1469
|
}
|
|
@@ -2936,7 +2933,7 @@ export function Sidebar({ mobile }: { mobile?: boolean } = {}) {
|
|
|
2936
2933
|
<div className="space-y-2 pt-2">
|
|
2937
2934
|
<OrgSwitcher />
|
|
2938
2935
|
<TooltipProvider delayDuration={200}>
|
|
2939
|
-
<div className="flex items-center gap-1">
|
|
2936
|
+
<div className="flex items-center justify-end gap-1">
|
|
2940
2937
|
<DevDatabaseLink />
|
|
2941
2938
|
<FeedbackButton className="min-w-0 flex-1" />
|
|
2942
2939
|
<div className="flex shrink-0 items-center gap-0.5">
|
|
@@ -149,10 +149,6 @@
|
|
|
149
149
|
background-color: hsl(var(--background)) !important;
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
.analytics-chat-panel .agent-thread-content {
|
|
153
|
-
padding-top: 4.5rem;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
152
|
.analytics-chat-panel
|
|
157
153
|
[data-agent-page-chat-scrolled]
|
|
158
154
|
[data-agent-page-chat-fade] {
|
|
@@ -2,10 +2,7 @@ import { markAgentChatHomeHandoff } from "@agent-native/core/client/agent-chat";
|
|
|
2
2
|
import { useAgentRouteState } from "@agent-native/core/client/navigation";
|
|
3
3
|
import { useLocation } from "react-router";
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
ANALYTICS_CHAT_STORAGE_KEY,
|
|
7
|
-
hasRecentAnalyticsChat,
|
|
8
|
-
} from "@/lib/chat-handoff";
|
|
5
|
+
import { ANALYTICS_CHAT_STORAGE_KEY } from "@/lib/chat-handoff";
|
|
9
6
|
import { rememberLastOpened } from "@/lib/last-opened";
|
|
10
7
|
import { TAB_ID } from "@/lib/tab-id";
|
|
11
8
|
|
|
@@ -161,9 +158,7 @@ export function useNavigationState() {
|
|
|
161
158
|
},
|
|
162
159
|
onNavigate: (_command, path) => {
|
|
163
160
|
if (location.pathname === "/ask" && pathnameFromPath(path) !== "/ask") {
|
|
164
|
-
|
|
165
|
-
markAgentChatHomeHandoff(ANALYTICS_CHAT_STORAGE_KEY);
|
|
166
|
-
}
|
|
161
|
+
markAgentChatHomeHandoff(ANALYTICS_CHAT_STORAGE_KEY);
|
|
167
162
|
}
|
|
168
163
|
},
|
|
169
164
|
});
|