@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
|
@@ -66,7 +66,7 @@ import {
|
|
|
66
66
|
normalizeTooltipText,
|
|
67
67
|
} from "./components/ui/tooltip.js";
|
|
68
68
|
import { ErrorReportActions } from "./ErrorReportActions.js";
|
|
69
|
-
import { FeedbackButton } from "./FeedbackButton.js";
|
|
69
|
+
import { FeedbackButton, resolveFeedbackUrl } from "./FeedbackButton.js";
|
|
70
70
|
import { RunsTrayMenuItem } from "./progress/RunsTray.js";
|
|
71
71
|
import { ShareButton } from "./sharing/ShareButton.js";
|
|
72
72
|
// Lazy-load the full assistant-ui chat stack (tiptap composer + react-markdown +
|
|
@@ -773,6 +773,7 @@ function AgentPanelInner({
|
|
|
773
773
|
...assistantChatProps
|
|
774
774
|
}: AgentPanelProps) {
|
|
775
775
|
const t = useT();
|
|
776
|
+
const feedbackEnabled = resolveFeedbackUrl() !== null;
|
|
776
777
|
const navigate = useNavigate();
|
|
777
778
|
const mounted = useClientOnly();
|
|
778
779
|
const keyPrefix = storageKey ? `:${storageKey}` : "";
|
|
@@ -1218,23 +1219,25 @@ function AgentPanelInner({
|
|
|
1218
1219
|
/>
|
|
1219
1220
|
);
|
|
1220
1221
|
})()}
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1222
|
+
{feedbackEnabled ? (
|
|
1223
|
+
<FeedbackButton
|
|
1224
|
+
variant="icon"
|
|
1225
|
+
side="bottom"
|
|
1226
|
+
align="end"
|
|
1227
|
+
chatSessionId={activeChatSessionId}
|
|
1228
|
+
chatStorageKey={storageKey}
|
|
1229
|
+
open={feedbackOpen}
|
|
1230
|
+
onOpenChange={setFeedbackOpen}
|
|
1231
|
+
trigger={
|
|
1232
|
+
<button
|
|
1233
|
+
type="button"
|
|
1234
|
+
tabIndex={-1}
|
|
1235
|
+
aria-hidden="true"
|
|
1236
|
+
className="pointer-events-none absolute end-0 top-full h-px w-px opacity-0"
|
|
1237
|
+
/>
|
|
1238
|
+
}
|
|
1239
|
+
/>
|
|
1240
|
+
) : null}
|
|
1238
1241
|
{mode === "chat" && (
|
|
1239
1242
|
<IconTooltip content={t("agentPanel.newChat")}>
|
|
1240
1243
|
<button
|
|
@@ -1355,17 +1358,19 @@ function AgentPanelInner({
|
|
|
1355
1358
|
{t("agentPanel.settings")}
|
|
1356
1359
|
</DropdownMenuItem>
|
|
1357
1360
|
)}
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1361
|
+
{feedbackEnabled ? (
|
|
1362
|
+
<DropdownMenuItem
|
|
1363
|
+
onSelect={() => {
|
|
1364
|
+
// Defer past the closing DropdownMenu's focus-restore/dismiss-layer
|
|
1365
|
+
// teardown, otherwise it can immediately dismiss the Popover we're
|
|
1366
|
+
// opening in the same tick (Radix nested-overlay race).
|
|
1367
|
+
setTimeout(() => setFeedbackOpen(true), 0);
|
|
1368
|
+
}}
|
|
1369
|
+
>
|
|
1370
|
+
<IconMessageDots size={14} className="shrink-0" />
|
|
1371
|
+
{t("agentPanel.feedback")}
|
|
1372
|
+
</DropdownMenuItem>
|
|
1373
|
+
) : null}
|
|
1369
1374
|
{onToggleFullscreen && (
|
|
1370
1375
|
<DropdownMenuItem onSelect={onToggleFullscreen}>
|
|
1371
1376
|
{isFullscreen ? (
|
|
@@ -1464,6 +1469,7 @@ function AgentPanelInner({
|
|
|
1464
1469
|
closeOtherCliTabs,
|
|
1465
1470
|
closeTabHint,
|
|
1466
1471
|
feedbackOpen,
|
|
1472
|
+
feedbackEnabled,
|
|
1467
1473
|
getChatThreadShareUrl,
|
|
1468
1474
|
headerMenuOpen,
|
|
1469
1475
|
isFullscreen,
|
|
@@ -1541,24 +1547,42 @@ function AgentPanelInner({
|
|
|
1541
1547
|
[getChatThreadShareUrl, t],
|
|
1542
1548
|
);
|
|
1543
1549
|
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
const activeTabRefCb = useCallback((el: HTMLDivElement | null) => {
|
|
1547
|
-
if (!el) return;
|
|
1550
|
+
const activeTabResizeObserverRef = useRef<ResizeObserver | null>(null);
|
|
1551
|
+
const scrollActiveTabIntoView = useCallback((el: HTMLDivElement) => {
|
|
1548
1552
|
const container = el.parentElement;
|
|
1549
1553
|
if (!container) return;
|
|
1550
|
-
// Use rAF so layout is settled after React commit
|
|
1551
1554
|
requestAnimationFrame(() => {
|
|
1552
|
-
const
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
container.scrollLeft += tabRect.right - containerRect.right;
|
|
1558
|
-
}
|
|
1555
|
+
const delta = getActiveTabScrollDelta(
|
|
1556
|
+
container.getBoundingClientRect(),
|
|
1557
|
+
el.getBoundingClientRect(),
|
|
1558
|
+
);
|
|
1559
|
+
if (delta !== 0) container.scrollLeft += delta;
|
|
1559
1560
|
});
|
|
1560
1561
|
}, []);
|
|
1561
1562
|
|
|
1563
|
+
// The sidebar stays mounted while closed and animates its width on open, so
|
|
1564
|
+
// the active tab ref alone can run before the overflow container is usable.
|
|
1565
|
+
const activeTabRefCb = useCallback(
|
|
1566
|
+
(el: HTMLDivElement | null) => {
|
|
1567
|
+
activeTabResizeObserverRef.current?.disconnect();
|
|
1568
|
+
activeTabResizeObserverRef.current = null;
|
|
1569
|
+
if (!el) return;
|
|
1570
|
+
const container = el.parentElement;
|
|
1571
|
+
if (!container) return;
|
|
1572
|
+
|
|
1573
|
+
const observer =
|
|
1574
|
+
typeof ResizeObserver === "undefined"
|
|
1575
|
+
? null
|
|
1576
|
+
: new ResizeObserver(() => scrollActiveTabIntoView(el));
|
|
1577
|
+
observer?.observe(container);
|
|
1578
|
+
activeTabResizeObserverRef.current = observer;
|
|
1579
|
+
scrollActiveTabIntoView(el);
|
|
1580
|
+
},
|
|
1581
|
+
[scrollActiveTabIntoView],
|
|
1582
|
+
);
|
|
1583
|
+
|
|
1584
|
+
useEffect(() => () => activeTabResizeObserverRef.current?.disconnect(), []);
|
|
1585
|
+
|
|
1562
1586
|
const renderChatHeader = useCallback(
|
|
1563
1587
|
({
|
|
1564
1588
|
tabs,
|
|
@@ -2108,6 +2132,20 @@ const SIDEBAR_FULLSCREEN_Z_INDEX = 90;
|
|
|
2108
2132
|
/** Shared max width of the centered fullscreen chat column and composer. */
|
|
2109
2133
|
const FULLSCREEN_CHAT_COLUMN_MAX_PX = 684;
|
|
2110
2134
|
|
|
2135
|
+
export function getActiveTabScrollDelta(
|
|
2136
|
+
containerRect: Pick<DOMRect, "left" | "right">,
|
|
2137
|
+
tabRect: Pick<DOMRect, "left" | "right">,
|
|
2138
|
+
margin = 24,
|
|
2139
|
+
): number {
|
|
2140
|
+
if (tabRect.left < containerRect.left + margin) {
|
|
2141
|
+
return tabRect.left - containerRect.left - margin;
|
|
2142
|
+
}
|
|
2143
|
+
if (tabRect.right > containerRect.right - margin) {
|
|
2144
|
+
return tabRect.right - containerRect.right + margin;
|
|
2145
|
+
}
|
|
2146
|
+
return 0;
|
|
2147
|
+
}
|
|
2148
|
+
|
|
2111
2149
|
function ResizeHandle({
|
|
2112
2150
|
position,
|
|
2113
2151
|
onDrag,
|
|
@@ -173,6 +173,11 @@ import {
|
|
|
173
173
|
useGuidedQuestionFlow,
|
|
174
174
|
} from "./guided-questions.js";
|
|
175
175
|
import { useT } from "./i18n.js";
|
|
176
|
+
import {
|
|
177
|
+
addMcpConnectionCompleteListener,
|
|
178
|
+
consumeMcpConnectionResume,
|
|
179
|
+
type McpConnectionResumeRequest,
|
|
180
|
+
} from "./resources/mcp-connection-resume.js";
|
|
176
181
|
import { McpConnectionSuggestion } from "./resources/McpConnectionSuggestion.js";
|
|
177
182
|
import {
|
|
178
183
|
AgentAutoContinueSignal,
|
|
@@ -1513,20 +1518,24 @@ export function resolveAssistantChatRunningStatusLabel({
|
|
|
1513
1518
|
return "Thinking";
|
|
1514
1519
|
}
|
|
1515
1520
|
|
|
1516
|
-
function
|
|
1521
|
+
function contentHasVisibleTailReasoning(content: unknown): boolean {
|
|
1517
1522
|
if (!Array.isArray(content)) return false;
|
|
1518
|
-
|
|
1519
|
-
|
|
1523
|
+
for (let index = content.length - 1; index >= 0; index -= 1) {
|
|
1524
|
+
const part = content[index];
|
|
1525
|
+
if (!part || typeof part !== "object") continue;
|
|
1520
1526
|
const candidate = part as { type?: unknown; text?: unknown };
|
|
1521
|
-
|
|
1522
|
-
candidate.type === "reasoning" &&
|
|
1523
|
-
typeof candidate.text
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
+
if (
|
|
1528
|
+
(candidate.type === "text" || candidate.type === "reasoning") &&
|
|
1529
|
+
(typeof candidate.text !== "string" || candidate.text.trim().length === 0)
|
|
1530
|
+
) {
|
|
1531
|
+
continue;
|
|
1532
|
+
}
|
|
1533
|
+
return candidate.type === "reasoning";
|
|
1534
|
+
}
|
|
1535
|
+
return false;
|
|
1527
1536
|
}
|
|
1528
1537
|
|
|
1529
|
-
function
|
|
1538
|
+
function contentHasToolCall(
|
|
1530
1539
|
content: unknown,
|
|
1531
1540
|
toolName?: string | null,
|
|
1532
1541
|
): boolean {
|
|
@@ -1540,7 +1549,6 @@ function contentHasUnresolvedToolCall(
|
|
|
1540
1549
|
};
|
|
1541
1550
|
return (
|
|
1542
1551
|
candidate.type === "tool-call" &&
|
|
1543
|
-
candidate.result === undefined &&
|
|
1544
1552
|
(!toolName || candidate.toolName === toolName)
|
|
1545
1553
|
);
|
|
1546
1554
|
});
|
|
@@ -1565,17 +1573,19 @@ export function shouldShowGlobalRunningStatus({
|
|
|
1565
1573
|
latestMessage && typeof latestMessage === "object"
|
|
1566
1574
|
? (latestMessage as { role?: unknown; content?: unknown })
|
|
1567
1575
|
: null;
|
|
1568
|
-
const
|
|
1576
|
+
const latestMessageHasTailReasoning =
|
|
1569
1577
|
message?.role === "assistant" &&
|
|
1570
|
-
|
|
1571
|
-
const
|
|
1572
|
-
message?.role === "assistant" &&
|
|
1573
|
-
|
|
1578
|
+
contentHasVisibleTailReasoning(message.content);
|
|
1579
|
+
const latestMessageHasTool =
|
|
1580
|
+
message?.role === "assistant" && contentHasToolCall(message.content);
|
|
1581
|
+
const reconnectHasTool = contentHasToolCall(reconnectContent);
|
|
1582
|
+
const reconnectHasTailReasoning =
|
|
1583
|
+
contentHasVisibleTailReasoning(reconnectContent);
|
|
1574
1584
|
const matchingActivityToolIsVisible = Boolean(
|
|
1575
1585
|
runningActivityTool &&
|
|
1576
1586
|
((message?.role === "assistant" &&
|
|
1577
|
-
|
|
1578
|
-
|
|
1587
|
+
contentHasToolCall(message.content, runningActivityTool)) ||
|
|
1588
|
+
contentHasToolCall(reconnectContent, runningActivityTool)),
|
|
1579
1589
|
);
|
|
1580
1590
|
|
|
1581
1591
|
// A pending card for the same tool is already the running indicator.
|
|
@@ -1584,11 +1594,7 @@ export function shouldShowGlobalRunningStatus({
|
|
|
1584
1594
|
if (runningActivityLabel && matchingActivityToolIsVisible) {
|
|
1585
1595
|
return false;
|
|
1586
1596
|
}
|
|
1587
|
-
if (
|
|
1588
|
-
!runningActivityLabel &&
|
|
1589
|
-
(latestMessageHasUnresolvedTool ||
|
|
1590
|
-
contentHasUnresolvedToolCall(reconnectContent))
|
|
1591
|
-
) {
|
|
1597
|
+
if (!runningActivityLabel && (latestMessageHasTool || reconnectHasTool)) {
|
|
1592
1598
|
return false;
|
|
1593
1599
|
}
|
|
1594
1600
|
// The reasoning cell already owns the generic Thinking state. Activity
|
|
@@ -1596,14 +1602,20 @@ export function shouldShowGlobalRunningStatus({
|
|
|
1596
1602
|
// rendering both makes a second Thinking row flash beneath the thought.
|
|
1597
1603
|
if (
|
|
1598
1604
|
runningActivityLabel === "Thinking" &&
|
|
1599
|
-
(
|
|
1605
|
+
(latestMessageHasTool ||
|
|
1606
|
+
reconnectHasTool ||
|
|
1607
|
+
latestMessageHasTailReasoning ||
|
|
1608
|
+
reconnectHasTailReasoning)
|
|
1600
1609
|
) {
|
|
1601
1610
|
return false;
|
|
1602
1611
|
}
|
|
1603
1612
|
if (runningActivityLabel) return true;
|
|
1604
1613
|
|
|
1605
1614
|
return (
|
|
1606
|
-
!
|
|
1615
|
+
!latestMessageHasTool &&
|
|
1616
|
+
!reconnectHasTool &&
|
|
1617
|
+
!latestMessageHasTailReasoning &&
|
|
1618
|
+
!reconnectHasTailReasoning
|
|
1607
1619
|
);
|
|
1608
1620
|
}
|
|
1609
1621
|
|
|
@@ -4676,6 +4688,40 @@ const AssistantChatInner = forwardRef<
|
|
|
4676
4688
|
],
|
|
4677
4689
|
);
|
|
4678
4690
|
|
|
4691
|
+
const mcpResumeTimerRef = useRef<number | null>(null);
|
|
4692
|
+
const scheduleMcpConnectionResume = useCallback(
|
|
4693
|
+
(request: McpConnectionResumeRequest) => {
|
|
4694
|
+
if (mcpResumeTimerRef.current !== null) {
|
|
4695
|
+
window.clearTimeout(mcpResumeTimerRef.current);
|
|
4696
|
+
}
|
|
4697
|
+
mcpResumeTimerRef.current = window.setTimeout(() => {
|
|
4698
|
+
mcpResumeTimerRef.current = null;
|
|
4699
|
+
void addToQueue(request.message);
|
|
4700
|
+
}, 0);
|
|
4701
|
+
},
|
|
4702
|
+
[addToQueue],
|
|
4703
|
+
);
|
|
4704
|
+
|
|
4705
|
+
useEffect(() => {
|
|
4706
|
+
const pending = consumeMcpConnectionResume();
|
|
4707
|
+
if (pending) scheduleMcpConnectionResume(pending);
|
|
4708
|
+
|
|
4709
|
+
return addMcpConnectionCompleteListener(() => {
|
|
4710
|
+
const completed = consumeMcpConnectionResume();
|
|
4711
|
+
if (completed) scheduleMcpConnectionResume(completed);
|
|
4712
|
+
});
|
|
4713
|
+
}, [scheduleMcpConnectionResume]);
|
|
4714
|
+
|
|
4715
|
+
useEffect(
|
|
4716
|
+
() => () => {
|
|
4717
|
+
if (mcpResumeTimerRef.current !== null) {
|
|
4718
|
+
window.clearTimeout(mcpResumeTimerRef.current);
|
|
4719
|
+
mcpResumeTimerRef.current = null;
|
|
4720
|
+
}
|
|
4721
|
+
},
|
|
4722
|
+
[],
|
|
4723
|
+
);
|
|
4724
|
+
|
|
4679
4725
|
useEffect(() => {
|
|
4680
4726
|
if (!pendingReconnectRecovery) return;
|
|
4681
4727
|
const recovery = pendingReconnectRecovery;
|
|
@@ -17,9 +17,6 @@ import { useOptionalLocale } from "./i18n.js";
|
|
|
17
17
|
import { useSession } from "./use-session.js";
|
|
18
18
|
import { cn } from "./utils.js";
|
|
19
19
|
|
|
20
|
-
const DEFAULT_FEEDBACK_URL =
|
|
21
|
-
"https://forms.agent-native.com/f/agent-native-feedback/_16ewV";
|
|
22
|
-
|
|
23
20
|
function isSyntheticAgentNativeAnonymousEmail(
|
|
24
21
|
value: string | null | undefined,
|
|
25
22
|
): boolean {
|
|
@@ -234,7 +231,8 @@ export interface FeedbackButtonProps {
|
|
|
234
231
|
*/
|
|
235
232
|
variant?: "sidebar" | "icon" | "outlined";
|
|
236
233
|
label?: string;
|
|
237
|
-
|
|
234
|
+
/** Defaults to VITE_AGENT_NATIVE_FEEDBACK_URL. Missing, blank, or null hides the control. */
|
|
235
|
+
url?: string | null;
|
|
238
236
|
className?: string;
|
|
239
237
|
/** Which side the popover opens on. Defaults match the variant. */
|
|
240
238
|
side?: "top" | "bottom" | "left" | "right";
|
|
@@ -267,10 +265,38 @@ const honeypotStyle: CSSProperties = {
|
|
|
267
265
|
overflow: "hidden",
|
|
268
266
|
};
|
|
269
267
|
|
|
270
|
-
|
|
268
|
+
function clientEnv(): Record<string, string | boolean | undefined> | undefined {
|
|
269
|
+
const importMetaEnv = (
|
|
270
|
+
import.meta as unknown as {
|
|
271
|
+
env?: Record<string, string | boolean | undefined>;
|
|
272
|
+
}
|
|
273
|
+
).env;
|
|
274
|
+
const processEnv = (
|
|
275
|
+
globalThis as typeof globalThis & {
|
|
276
|
+
process?: { env?: Record<string, string | boolean | undefined> };
|
|
277
|
+
}
|
|
278
|
+
).process?.env;
|
|
279
|
+
|
|
280
|
+
if (importMetaEnv && processEnv) return { ...processEnv, ...importMetaEnv };
|
|
281
|
+
return importMetaEnv ?? processEnv;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export function resolveFeedbackUrl(url?: string | null): string | null {
|
|
285
|
+
const value =
|
|
286
|
+
url === undefined ? clientEnv()?.VITE_AGENT_NATIVE_FEEDBACK_URL : url;
|
|
287
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export function FeedbackButton(props: FeedbackButtonProps) {
|
|
291
|
+
const url = resolveFeedbackUrl(props.url);
|
|
292
|
+
if (!url) return null;
|
|
293
|
+
return <FeedbackPopoverButton {...props} url={url} />;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function FeedbackPopoverButton({
|
|
271
297
|
variant = "sidebar",
|
|
272
298
|
label,
|
|
273
|
-
url
|
|
299
|
+
url,
|
|
274
300
|
className,
|
|
275
301
|
side,
|
|
276
302
|
align = "end",
|
|
@@ -281,7 +307,7 @@ export function FeedbackButton({
|
|
|
281
307
|
open: controlledOpen,
|
|
282
308
|
onOpenChange,
|
|
283
309
|
trigger: customTrigger,
|
|
284
|
-
}: FeedbackButtonProps) {
|
|
310
|
+
}: Omit<FeedbackButtonProps, "url"> & { url: string }) {
|
|
285
311
|
const target = parseTarget(url);
|
|
286
312
|
const { session } = useSession();
|
|
287
313
|
const localeContext = useOptionalLocale();
|
|
@@ -53,7 +53,6 @@ import {
|
|
|
53
53
|
TooltipTrigger,
|
|
54
54
|
} from "./components/ui/tooltip.js";
|
|
55
55
|
import { isTrustedFrameMessage } from "./frame.js";
|
|
56
|
-
import { KeepTabOpenNotice } from "./KeepTabOpenNotice.js";
|
|
57
56
|
import { RunStuckBanner } from "./RunStuckBanner.js";
|
|
58
57
|
import { callAction } from "./use-action.js";
|
|
59
58
|
import { useChangeVersion } from "./use-change-version.js";
|
|
@@ -703,7 +702,7 @@ export type MultiTabAssistantChatProps = Omit<
|
|
|
703
702
|
showTabBar?: boolean;
|
|
704
703
|
/** Optional custom single-row header renderer */
|
|
705
704
|
renderHeader?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;
|
|
706
|
-
/** Optional
|
|
705
|
+
/** Optional page-level top-bar actions renderer for the active tab. */
|
|
707
706
|
renderOverlay?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;
|
|
708
707
|
/** Hide the chat content while keeping the header visible. Used when CLI/resources mode is active. */
|
|
709
708
|
contentHidden?: boolean;
|
|
@@ -2442,7 +2441,11 @@ export function MultiTabAssistantChat({
|
|
|
2442
2441
|
|
|
2443
2442
|
{/* Chat content with optional overlay */}
|
|
2444
2443
|
<div
|
|
2445
|
-
className=
|
|
2444
|
+
className={cn(
|
|
2445
|
+
"relative flex-1 flex flex-col min-h-0",
|
|
2446
|
+
renderOverlay && "pt-14",
|
|
2447
|
+
)}
|
|
2448
|
+
data-agent-page-chat-topbar={renderOverlay ? "" : undefined}
|
|
2446
2449
|
data-agent-page-chat-scrolled={
|
|
2447
2450
|
renderOverlay && pageOverlayScrolled ? "" : undefined
|
|
2448
2451
|
}
|
|
@@ -2494,11 +2497,6 @@ export function MultiTabAssistantChat({
|
|
|
2494
2497
|
contentHidden || tabId !== activeThreadId ? "none" : "flex",
|
|
2495
2498
|
}}
|
|
2496
2499
|
>
|
|
2497
|
-
<KeepTabOpenNotice
|
|
2498
|
-
threadId={tabId}
|
|
2499
|
-
enabled={tabId === activeThreadId}
|
|
2500
|
-
apiUrl={apiUrl}
|
|
2501
|
-
/>
|
|
2502
2500
|
<RunStuckBanner
|
|
2503
2501
|
threadId={tabId}
|
|
2504
2502
|
enabled={tabId === activeThreadId}
|
|
@@ -23,6 +23,7 @@ import { agentNativePath } from "./api-path.js";
|
|
|
23
23
|
import { formatChatErrorText, normalizeChatError } from "./error-format.js";
|
|
24
24
|
import {
|
|
25
25
|
AgentAutoContinueSignal,
|
|
26
|
+
appendMissingFinalResponseWarning,
|
|
26
27
|
type AgentActivityTrailEntry,
|
|
27
28
|
type AgentAutoContinueErrorInfo,
|
|
28
29
|
type ContentPart,
|
|
@@ -2321,14 +2322,22 @@ export function createAgentChatAdapter(
|
|
|
2321
2322
|
|
|
2322
2323
|
if (status === "completed") {
|
|
2323
2324
|
// The turn finished server-side; the events we managed to fold are
|
|
2324
|
-
// the durable transcript.
|
|
2325
|
+
// the durable transcript. Never turn a terminal tool-only chunk
|
|
2326
|
+
// into a blank successful message when no explicit `done` event
|
|
2327
|
+
// passed through the normal SSE finalizer.
|
|
2325
2328
|
settleInterruptedToolCalls(content, undefined, {
|
|
2326
2329
|
includeActivity: true,
|
|
2327
2330
|
});
|
|
2331
|
+
const runWarning = appendMissingFinalResponseWarning(content);
|
|
2328
2332
|
yield {
|
|
2329
2333
|
content: [...content],
|
|
2330
2334
|
status: { type: "complete" as const, reason: "stop" as const },
|
|
2331
|
-
metadata: {
|
|
2335
|
+
metadata: {
|
|
2336
|
+
custom: {
|
|
2337
|
+
...(runId ? { runId } : {}),
|
|
2338
|
+
...(runWarning ? { runWarning } : {}),
|
|
2339
|
+
},
|
|
2340
|
+
},
|
|
2332
2341
|
} as ChatModelRunResult;
|
|
2333
2342
|
clearActiveRun();
|
|
2334
2343
|
return;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { IconHelpCircle } from "@tabler/icons-react";
|
|
1
2
|
import type { ReactNode } from "react";
|
|
2
3
|
|
|
3
4
|
import { cn } from "../utils.js";
|
|
@@ -5,6 +6,8 @@ import { cn } from "../utils.js";
|
|
|
5
6
|
interface AgentTabFrameProps {
|
|
6
7
|
title: string;
|
|
7
8
|
description: string;
|
|
9
|
+
helpHref?: string;
|
|
10
|
+
helpLabel?: string;
|
|
8
11
|
actions?: ReactNode;
|
|
9
12
|
children: ReactNode;
|
|
10
13
|
className?: string;
|
|
@@ -14,6 +17,8 @@ interface AgentTabFrameProps {
|
|
|
14
17
|
export function AgentTabFrame({
|
|
15
18
|
title,
|
|
16
19
|
description,
|
|
20
|
+
helpHref,
|
|
21
|
+
helpLabel,
|
|
17
22
|
actions,
|
|
18
23
|
children,
|
|
19
24
|
className,
|
|
@@ -24,9 +29,23 @@ export function AgentTabFrame({
|
|
|
24
29
|
>
|
|
25
30
|
<header className="flex flex-wrap items-start justify-between gap-4 border-b border-border/70 pb-5">
|
|
26
31
|
<div className="space-y-1">
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
<div className="flex items-center gap-1.5">
|
|
33
|
+
<h2 className="text-xl font-semibold tracking-tight text-foreground">
|
|
34
|
+
{title}
|
|
35
|
+
</h2>
|
|
36
|
+
{helpHref && (
|
|
37
|
+
<a
|
|
38
|
+
href={helpHref}
|
|
39
|
+
target="_blank"
|
|
40
|
+
rel="noopener noreferrer"
|
|
41
|
+
aria-label={helpLabel ?? `Open ${title} documentation`}
|
|
42
|
+
title={helpLabel ?? `Open ${title} documentation`}
|
|
43
|
+
className="inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground"
|
|
44
|
+
>
|
|
45
|
+
<IconHelpCircle className="size-4" />
|
|
46
|
+
</a>
|
|
47
|
+
)}
|
|
48
|
+
</div>
|
|
30
49
|
<p className="max-w-2xl text-sm leading-relaxed text-muted-foreground">
|
|
31
50
|
{description}
|
|
32
51
|
</p>
|
|
@@ -133,40 +133,48 @@ function EmptySlot({ label }: { label: string }) {
|
|
|
133
133
|
);
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
export const AGENT_RESOURCE_DOCS_HREF: Record<ResourceView, string> = {
|
|
137
|
+
files: "https://agent-native.com/docs/agent-resources#resources-tab",
|
|
138
|
+
instructions: "https://agent-native.com/docs/agent-resources#agents-md",
|
|
139
|
+
agents: "https://agent-native.com/docs/agent-resources#custom-agents",
|
|
140
|
+
memory: "https://agent-native.com/docs/agent-resources#memory",
|
|
141
|
+
skills: "https://agent-native.com/docs/skills-guide",
|
|
142
|
+
learnings: "https://agent-native.com/docs/agent-resources#memory",
|
|
143
|
+
"remote-agents":
|
|
144
|
+
"https://agent-native.com/docs/agent-resources#remote-vs-custom-agents",
|
|
145
|
+
};
|
|
146
|
+
|
|
136
147
|
const RESOURCE_TAB_COPY: Record<
|
|
137
148
|
ResourceView,
|
|
138
|
-
{
|
|
149
|
+
{ titleKey: string; descriptionKey: string }
|
|
139
150
|
> = {
|
|
140
151
|
files: {
|
|
141
|
-
|
|
142
|
-
|
|
152
|
+
titleKey: "agentResources.files.title",
|
|
153
|
+
descriptionKey: "agentResources.files.description",
|
|
143
154
|
},
|
|
144
155
|
instructions: {
|
|
145
|
-
|
|
146
|
-
description
|
|
147
|
-
"The rules, preferences, and project guidance that steer the agent.",
|
|
156
|
+
titleKey: "agentResources.instructions.title",
|
|
157
|
+
descriptionKey: "agentResources.instructions.description",
|
|
148
158
|
},
|
|
149
159
|
agents: {
|
|
150
|
-
|
|
151
|
-
|
|
160
|
+
titleKey: "agentResources.agents.title",
|
|
161
|
+
descriptionKey: "agentResources.agents.description",
|
|
152
162
|
},
|
|
153
163
|
memory: {
|
|
154
|
-
|
|
155
|
-
|
|
164
|
+
titleKey: "agentResources.memory.title",
|
|
165
|
+
descriptionKey: "agentResources.memory.description",
|
|
156
166
|
},
|
|
157
167
|
skills: {
|
|
158
|
-
|
|
159
|
-
description
|
|
160
|
-
"Specialized instructions that give the agent repeatable abilities.",
|
|
168
|
+
titleKey: "agentResources.skills.title",
|
|
169
|
+
descriptionKey: "agentResources.skills.description",
|
|
161
170
|
},
|
|
162
171
|
learnings: {
|
|
163
|
-
|
|
164
|
-
description
|
|
165
|
-
"Corrections and patterns worth carrying forward for future work.",
|
|
172
|
+
titleKey: "agentResources.learnings.title",
|
|
173
|
+
descriptionKey: "agentResources.learnings.description",
|
|
166
174
|
},
|
|
167
175
|
"remote-agents": {
|
|
168
|
-
|
|
169
|
-
|
|
176
|
+
titleKey: "agentResources.remoteAgents.title",
|
|
177
|
+
descriptionKey: "agentResources.remoteAgents.description",
|
|
170
178
|
},
|
|
171
179
|
};
|
|
172
180
|
|
|
@@ -174,9 +182,16 @@ function AgentResourceTab({
|
|
|
174
182
|
scope,
|
|
175
183
|
view,
|
|
176
184
|
}: AgentPageTabProps & { view: ResourceView }) {
|
|
185
|
+
const t = useT();
|
|
177
186
|
const copy = RESOURCE_TAB_COPY[view];
|
|
187
|
+
const title = t(copy.titleKey);
|
|
178
188
|
return (
|
|
179
|
-
<AgentTabFrame
|
|
189
|
+
<AgentTabFrame
|
|
190
|
+
title={title}
|
|
191
|
+
description={t(copy.descriptionKey)}
|
|
192
|
+
helpHref={AGENT_RESOURCE_DOCS_HREF[view]}
|
|
193
|
+
helpLabel={t("agentResources.openDocs", { section: title })}
|
|
194
|
+
>
|
|
180
195
|
<div className="min-h-[480px]">
|
|
181
196
|
<ResourcesPanel
|
|
182
197
|
key={`${scope}-${view}`}
|
package/src/client/analytics.ts
CHANGED
|
@@ -50,6 +50,13 @@ declare global {
|
|
|
50
50
|
__AGENT_NATIVE_CONFIG__?: {
|
|
51
51
|
sentryDsn?: string;
|
|
52
52
|
sentryEnvironment?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Hosted Realtime Gateway config. Impersonal (same for every visitor),
|
|
55
|
+
* so it is safe inside the CDN-cached SSR shell — unlike the per-user
|
|
56
|
+
* subscribe token, which is minted client-side after load. Absent when
|
|
57
|
+
* the app uses the in-process (local) transport.
|
|
58
|
+
*/
|
|
59
|
+
realtime?: { transport?: string; gatewayBaseUrl?: string };
|
|
53
60
|
};
|
|
54
61
|
}
|
|
55
62
|
}
|