@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
|
@@ -14,9 +14,9 @@ import {
|
|
|
14
14
|
ComposerPrimitive,
|
|
15
15
|
useMessagePartReasoning,
|
|
16
16
|
useMessagePartRuntime,
|
|
17
|
+
useAuiState,
|
|
17
18
|
} from "@assistant-ui/react";
|
|
18
19
|
import type { Attachment } from "@assistant-ui/react";
|
|
19
|
-
import { useAuiState } from "@assistant-ui/store";
|
|
20
20
|
import {
|
|
21
21
|
IconX,
|
|
22
22
|
IconCheck,
|
|
@@ -71,6 +71,7 @@ import {
|
|
|
71
71
|
} from "./markdown-renderer.js";
|
|
72
72
|
import {
|
|
73
73
|
ToolCallFallback,
|
|
74
|
+
ToolActivityPresentation,
|
|
74
75
|
FilesChangedSummary,
|
|
75
76
|
ASSISTANT_VISIBLE_TOOL_CALL_LIMIT,
|
|
76
77
|
ChatRunningContext,
|
|
@@ -862,7 +863,7 @@ export function assistantMessageHasUnresolvedTool(content: unknown): boolean {
|
|
|
862
863
|
// Only the last assistant message may shimmer as "the currently running
|
|
863
864
|
// tool" — an older message's dangling unresolved tool-call must never
|
|
864
865
|
// shimmer once a later run is active.
|
|
865
|
-
export function
|
|
866
|
+
export function computeActiveTailToolCallId(
|
|
866
867
|
content: ContentPart[] | undefined,
|
|
867
868
|
{ chatRunning, isLast }: { chatRunning: boolean; isLast: boolean },
|
|
868
869
|
): string | null {
|
|
@@ -870,9 +871,7 @@ export function computeLatestRunningToolCallId(
|
|
|
870
871
|
return (
|
|
871
872
|
content?.reduce(
|
|
872
873
|
(latestToolCallId, part) =>
|
|
873
|
-
part.type === "tool-call" &&
|
|
874
|
-
part.result === undefined &&
|
|
875
|
-
(chatRunning || part.activity === true)
|
|
874
|
+
part.type === "tool-call" && (chatRunning || part.activity === true)
|
|
876
875
|
? part.toolCallId
|
|
877
876
|
: latestToolCallId,
|
|
878
877
|
null as string | null,
|
|
@@ -900,6 +899,18 @@ export function shouldShowAssistantMessageFooter({
|
|
|
900
899
|
return statusIsTerminal;
|
|
901
900
|
}
|
|
902
901
|
|
|
902
|
+
export function shouldShowMissingFinalResponse({
|
|
903
|
+
statusIsTerminal,
|
|
904
|
+
hasAssistantText,
|
|
905
|
+
hasUnresolvedTool,
|
|
906
|
+
}: {
|
|
907
|
+
statusIsTerminal: boolean;
|
|
908
|
+
hasAssistantText: boolean;
|
|
909
|
+
hasUnresolvedTool: boolean;
|
|
910
|
+
}): boolean {
|
|
911
|
+
return statusIsTerminal && !hasAssistantText && !hasUnresolvedTool;
|
|
912
|
+
}
|
|
913
|
+
|
|
903
914
|
export function shouldShowAssistantWorkSummary({
|
|
904
915
|
isLast,
|
|
905
916
|
isComplete,
|
|
@@ -1061,12 +1072,18 @@ export function AssistantMessage() {
|
|
|
1061
1072
|
const hasRenderableContent = assistantMessageHasRenderableContent(msg);
|
|
1062
1073
|
const hasUnresolvedTool = assistantMessageHasUnresolvedTool(msg.content);
|
|
1063
1074
|
const responseConnectionText = messageTextFromContent(msg.content);
|
|
1075
|
+
const statusIsTerminal = assistantMessageStatusIsTerminal(msg);
|
|
1076
|
+
const showMissingFinalResponse = shouldShowMissingFinalResponse({
|
|
1077
|
+
statusIsTerminal,
|
|
1078
|
+
hasAssistantText: responseConnectionText.trim().length > 0,
|
|
1079
|
+
hasUnresolvedTool,
|
|
1080
|
+
});
|
|
1064
1081
|
const responseConnectionContext = latestUserMessageText(thread.messages);
|
|
1065
1082
|
const isComplete = shouldShowAssistantMessageFooter({
|
|
1066
1083
|
isLast,
|
|
1067
1084
|
chatRunning,
|
|
1068
1085
|
hasRenderableContent,
|
|
1069
|
-
statusIsTerminal
|
|
1086
|
+
statusIsTerminal,
|
|
1070
1087
|
hasUnresolvedTool,
|
|
1071
1088
|
});
|
|
1072
1089
|
const cpCtx = React.useContext(CheckpointContext);
|
|
@@ -1178,7 +1195,7 @@ export function AssistantMessage() {
|
|
|
1178
1195
|
(p.type !== "tool-call" || p.activity !== true) &&
|
|
1179
1196
|
isCollapsibleAssistantWorkPart(p),
|
|
1180
1197
|
);
|
|
1181
|
-
const
|
|
1198
|
+
const activeTailToolCallId = computeActiveTailToolCallId(msgContent, {
|
|
1182
1199
|
chatRunning,
|
|
1183
1200
|
isLast,
|
|
1184
1201
|
});
|
|
@@ -1226,21 +1243,31 @@ export function AssistantMessage() {
|
|
|
1226
1243
|
case "reasoning":
|
|
1227
1244
|
return <ReasoningMessagePart />;
|
|
1228
1245
|
case "tool-call":
|
|
1229
|
-
return (
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1246
|
+
return part.toolUI ? (
|
|
1247
|
+
<ToolActivityPresentation
|
|
1248
|
+
toolName={part.toolName}
|
|
1249
|
+
isRunning={part.status?.type === "running"}
|
|
1250
|
+
isActiveTail={part.toolCallId === activeTailToolCallId}
|
|
1251
|
+
>
|
|
1252
|
+
{part.toolUI}
|
|
1253
|
+
</ToolActivityPresentation>
|
|
1254
|
+
) : (
|
|
1255
|
+
<ToolCallFallback
|
|
1256
|
+
{...part}
|
|
1257
|
+
isActiveTail={part.toolCallId === activeTailToolCallId}
|
|
1258
|
+
/>
|
|
1238
1259
|
);
|
|
1239
1260
|
default:
|
|
1240
1261
|
return null;
|
|
1241
1262
|
}
|
|
1242
1263
|
}}
|
|
1243
1264
|
</MessagePrimitive.GroupedParts>
|
|
1265
|
+
{showMissingFinalResponse && (
|
|
1266
|
+
<p role="status" className="text-muted-foreground">
|
|
1267
|
+
The agent stopped without sending a final message. Ask it to
|
|
1268
|
+
continue or retry.
|
|
1269
|
+
</p>
|
|
1270
|
+
)}
|
|
1244
1271
|
{isComplete && hasCodeAgentTools && msgContent && (
|
|
1245
1272
|
<FilesChangedSummary parts={msgContent} />
|
|
1246
1273
|
)}
|
|
@@ -94,20 +94,22 @@ export const ApprovalContext = React.createContext<ApprovalContextValue | null>(
|
|
|
94
94
|
|
|
95
95
|
export const TOOL_LONG_RUNNING_HINT_DELAY_MS = 45_000;
|
|
96
96
|
|
|
97
|
-
function
|
|
97
|
+
export function ToolActivityPresentation({
|
|
98
98
|
toolName,
|
|
99
99
|
isRunning,
|
|
100
|
+
isActiveTail,
|
|
100
101
|
children,
|
|
101
102
|
}: {
|
|
102
103
|
toolName: string;
|
|
103
104
|
isRunning: boolean;
|
|
105
|
+
isActiveTail: boolean;
|
|
104
106
|
children: React.ReactNode;
|
|
105
107
|
}) {
|
|
106
108
|
const [showLongRunningHint, setShowLongRunningHint] = useState(false);
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
//
|
|
110
|
-
const [animateEntry] = useState(
|
|
109
|
+
// A batched update can first reveal a tool with its result already attached.
|
|
110
|
+
// Presentation follows the active chat tail rather than execution state so
|
|
111
|
+
// that newly revealed completed tools still get their entrance motion.
|
|
112
|
+
const [animateEntry] = useState(isActiveTail);
|
|
111
113
|
|
|
112
114
|
useEffect(() => {
|
|
113
115
|
if (!isRunning) {
|
|
@@ -125,10 +127,10 @@ function ToolLongRunningHintShell({
|
|
|
125
127
|
<div
|
|
126
128
|
className={cn(
|
|
127
129
|
"agent-tool-call",
|
|
128
|
-
animateEntry &&
|
|
129
|
-
"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-1 motion-safe:duration-200 motion-safe:ease-[var(--ease-out-strong)]",
|
|
130
|
+
animateEntry && "agent-tool-call--entering",
|
|
130
131
|
)}
|
|
131
132
|
data-running={isRunning ? "true" : undefined}
|
|
133
|
+
data-active-tail={isActiveTail ? "true" : undefined}
|
|
132
134
|
>
|
|
133
135
|
{children}
|
|
134
136
|
{isRunning && showLongRunningHint && (
|
|
@@ -554,6 +556,7 @@ export function ToolCallDisplay({
|
|
|
554
556
|
approval,
|
|
555
557
|
repeatCount,
|
|
556
558
|
isLatestRunning = isRunning,
|
|
559
|
+
isActiveTail,
|
|
557
560
|
}: {
|
|
558
561
|
toolName: string;
|
|
559
562
|
argsText?: string;
|
|
@@ -565,16 +568,24 @@ export function ToolCallDisplay({
|
|
|
565
568
|
structuredMeta?: Record<string, unknown>;
|
|
566
569
|
approval?: { approvalKey: string; dismissed?: boolean };
|
|
567
570
|
repeatCount?: number;
|
|
571
|
+
/** The latest tool shown while the overall chat turn is still active. */
|
|
572
|
+
isActiveTail?: boolean;
|
|
573
|
+
/** @deprecated Use isActiveTail. */
|
|
568
574
|
isLatestRunning?: boolean;
|
|
569
575
|
}) {
|
|
576
|
+
const showActiveTail = isActiveTail ?? isLatestRunning;
|
|
570
577
|
// Delegate to bespoke cells when structured metadata is present.
|
|
571
578
|
// These must be separate components so hook order in ToolCallDisplayGeneric
|
|
572
579
|
// is always stable (no conditional hook calls).
|
|
573
580
|
const toolKind = structuredMeta?.toolKind as string | undefined;
|
|
574
581
|
const wrapToolDisplay = (children: React.ReactNode) => (
|
|
575
|
-
<
|
|
582
|
+
<ToolActivityPresentation
|
|
583
|
+
toolName={toolName}
|
|
584
|
+
isRunning={isRunning}
|
|
585
|
+
isActiveTail={showActiveTail}
|
|
586
|
+
>
|
|
576
587
|
{children}
|
|
577
|
-
</
|
|
588
|
+
</ToolActivityPresentation>
|
|
578
589
|
);
|
|
579
590
|
if (toolKind === "bash") {
|
|
580
591
|
return wrapToolDisplay(
|
|
@@ -616,7 +627,7 @@ export function ToolCallDisplay({
|
|
|
616
627
|
mcpApp={mcpApp}
|
|
617
628
|
chatUI={chatUI}
|
|
618
629
|
isRunning={isRunning}
|
|
619
|
-
|
|
630
|
+
isActiveTail={showActiveTail}
|
|
620
631
|
approval={approval}
|
|
621
632
|
repeatCount={repeatCount}
|
|
622
633
|
/>,
|
|
@@ -631,7 +642,7 @@ function ToolCallDisplayGeneric({
|
|
|
631
642
|
mcpApp,
|
|
632
643
|
chatUI,
|
|
633
644
|
isRunning,
|
|
634
|
-
|
|
645
|
+
isActiveTail,
|
|
635
646
|
approval,
|
|
636
647
|
repeatCount,
|
|
637
648
|
}: {
|
|
@@ -642,7 +653,7 @@ function ToolCallDisplayGeneric({
|
|
|
642
653
|
mcpApp?: AgentMcpAppPayload;
|
|
643
654
|
chatUI?: ActionChatUIConfig;
|
|
644
655
|
isRunning: boolean;
|
|
645
|
-
|
|
656
|
+
isActiveTail: boolean;
|
|
646
657
|
approval?: { approvalKey: string; dismissed?: boolean };
|
|
647
658
|
repeatCount?: number;
|
|
648
659
|
}) {
|
|
@@ -734,6 +745,7 @@ function ToolCallDisplayGeneric({
|
|
|
734
745
|
resultText: result,
|
|
735
746
|
resultJson: parsedResult,
|
|
736
747
|
isRunning,
|
|
748
|
+
isActiveTail,
|
|
737
749
|
chatUI,
|
|
738
750
|
};
|
|
739
751
|
const skipRegistryRenderer =
|
|
@@ -805,7 +817,7 @@ function ToolCallDisplayGeneric({
|
|
|
805
817
|
<span
|
|
806
818
|
className={cn(
|
|
807
819
|
"min-w-0 truncate font-normal",
|
|
808
|
-
|
|
820
|
+
isActiveTail && "agent-running-shimmer",
|
|
809
821
|
)}
|
|
810
822
|
>
|
|
811
823
|
{displayName}
|
|
@@ -888,6 +900,7 @@ export function ToolCallFallback({
|
|
|
888
900
|
approval?: { approvalKey: string; dismissed?: boolean };
|
|
889
901
|
repeatCount?: number;
|
|
890
902
|
isLatestRunning?: boolean;
|
|
903
|
+
isActiveTail?: boolean;
|
|
891
904
|
}) {
|
|
892
905
|
const chatRunning = React.useContext(ChatRunningContext);
|
|
893
906
|
const isRunning =
|
|
@@ -908,6 +921,7 @@ export function ToolCallFallback({
|
|
|
908
921
|
chatUI={rest.chatUI}
|
|
909
922
|
structuredMeta={rest.structuredMeta}
|
|
910
923
|
isRunning={isRunning}
|
|
924
|
+
isActiveTail={rest.isActiveTail}
|
|
911
925
|
isLatestRunning={rest.isLatestRunning}
|
|
912
926
|
approval={rest.approval}
|
|
913
927
|
repeatCount={rest.repeatCount}
|
|
@@ -935,11 +949,9 @@ export function ReconnectStreamMessage({
|
|
|
935
949
|
content.at(-1)?.type === "text" ? content.length - 1 : -1;
|
|
936
950
|
const streamingReasoningPartIndex =
|
|
937
951
|
content.at(-1)?.type === "reasoning" ? content.length - 1 : -1;
|
|
938
|
-
const
|
|
952
|
+
const latestActiveToolIndex = content.reduce(
|
|
939
953
|
(latestIndex, part, index) =>
|
|
940
|
-
part.type === "tool-call" &&
|
|
941
|
-
part.result === undefined &&
|
|
942
|
-
(chatRunning || part.activity === true)
|
|
954
|
+
part.type === "tool-call" && (chatRunning || part.activity === true)
|
|
943
955
|
? index
|
|
944
956
|
: latestIndex,
|
|
945
957
|
-1,
|
|
@@ -983,7 +995,7 @@ export function ReconnectStreamMessage({
|
|
|
983
995
|
isRunning={
|
|
984
996
|
part.result === undefined && (chatRunning || part.activity === true)
|
|
985
997
|
}
|
|
986
|
-
|
|
998
|
+
isActiveTail={i === latestActiveToolIndex}
|
|
987
999
|
approval={part.approval}
|
|
988
1000
|
repeatCount={part.repeatCount}
|
|
989
1001
|
/>
|
|
@@ -9,6 +9,11 @@ import { useEffect, useMemo, useState } from "react";
|
|
|
9
9
|
import { agentNativePath } from "../api-path.js";
|
|
10
10
|
import { openAgentSettings } from "../CommandMenu.js";
|
|
11
11
|
import { useT } from "../i18n.js";
|
|
12
|
+
import {
|
|
13
|
+
clearMcpConnectionResume,
|
|
14
|
+
notifyMcpConnectionComplete,
|
|
15
|
+
saveMcpConnectionResume,
|
|
16
|
+
} from "./mcp-connection-resume.js";
|
|
12
17
|
import {
|
|
13
18
|
buildMcpOAuthStartUrl,
|
|
14
19
|
findMcpIntegrationForText,
|
|
@@ -144,6 +149,7 @@ export function McpConnectionSuggestion({
|
|
|
144
149
|
}
|
|
145
150
|
|
|
146
151
|
if (canStartOAuth(integration)) {
|
|
152
|
+
saveMcpConnectionResume(variant === "response" ? contextText : text);
|
|
147
153
|
window.location.assign(
|
|
148
154
|
agentNativePath(
|
|
149
155
|
buildMcpOAuthStartUrl({
|
|
@@ -162,6 +168,7 @@ export function McpConnectionSuggestion({
|
|
|
162
168
|
integration.authMode === "none" &&
|
|
163
169
|
integration.connectionMode === "direct"
|
|
164
170
|
) {
|
|
171
|
+
saveMcpConnectionResume(variant === "response" ? contextText : text);
|
|
165
172
|
setConnecting(true);
|
|
166
173
|
try {
|
|
167
174
|
await createMcpServer.mutateAsync({
|
|
@@ -171,7 +178,9 @@ export function McpConnectionSuggestion({
|
|
|
171
178
|
description: integration.description,
|
|
172
179
|
});
|
|
173
180
|
setDismissedId(integration.id);
|
|
181
|
+
notifyMcpConnectionComplete();
|
|
174
182
|
} catch (cause) {
|
|
183
|
+
clearMcpConnectionResume();
|
|
175
184
|
setError(
|
|
176
185
|
cause instanceof Error ? cause.message : t("mcpIntegrations.failed"),
|
|
177
186
|
);
|
|
@@ -181,6 +190,7 @@ export function McpConnectionSuggestion({
|
|
|
181
190
|
return;
|
|
182
191
|
}
|
|
183
192
|
|
|
193
|
+
saveMcpConnectionResume(variant === "response" ? contextText : text);
|
|
184
194
|
setDialogOpen(true);
|
|
185
195
|
};
|
|
186
196
|
|
|
@@ -262,13 +272,20 @@ export function McpConnectionSuggestion({
|
|
|
262
272
|
)}
|
|
263
273
|
<McpIntegrationDialog
|
|
264
274
|
open={dialogOpen}
|
|
265
|
-
onOpenChange={
|
|
275
|
+
onOpenChange={(open) => {
|
|
276
|
+
setDialogOpen(open);
|
|
277
|
+
if (!open) clearMcpConnectionResume();
|
|
278
|
+
}}
|
|
266
279
|
initialIntegrationId={integration.id}
|
|
267
280
|
defaultScope="user"
|
|
268
281
|
canCreateOrgMcp={false}
|
|
269
282
|
hasOrg={Boolean(mcpServersQuery.data?.orgId)}
|
|
270
283
|
onCreateMcpServer={(args) => createMcpServer.mutateAsync(args)}
|
|
271
|
-
onCreated={() =>
|
|
284
|
+
onCreated={() => {
|
|
285
|
+
setDismissedId(integration.id);
|
|
286
|
+
saveMcpConnectionResume(variant === "response" ? contextText : text);
|
|
287
|
+
notifyMcpConnectionComplete();
|
|
288
|
+
}}
|
|
272
289
|
integrations={integrations}
|
|
273
290
|
/>
|
|
274
291
|
</>
|
|
@@ -849,16 +849,13 @@ export function ResourceTree({
|
|
|
849
849
|
)}
|
|
850
850
|
|
|
851
851
|
{isEmpty && !creating && !isLoading && (
|
|
852
|
-
<div className="flex items-start
|
|
853
|
-
<
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
</p>
|
|
860
|
-
{emptyStateAction}
|
|
861
|
-
</div>
|
|
852
|
+
<div className="flex flex-col items-start border-y border-border/60 px-2 py-5">
|
|
853
|
+
<p className="ps-5 text-xs text-muted-foreground">
|
|
854
|
+
{variant === "collection"
|
|
855
|
+
? "No resources in this collection yet"
|
|
856
|
+
: "No files yet"}
|
|
857
|
+
</p>
|
|
858
|
+
{emptyStateAction && <div className="mt-4">{emptyStateAction}</div>}
|
|
862
859
|
</div>
|
|
863
860
|
)}
|
|
864
861
|
</div>
|
|
@@ -11,8 +11,6 @@ import {
|
|
|
11
11
|
IconCode,
|
|
12
12
|
IconClock,
|
|
13
13
|
IconHierarchy2,
|
|
14
|
-
IconExternalLink,
|
|
15
|
-
IconHelp,
|
|
16
14
|
IconPlugConnected,
|
|
17
15
|
} from "@tabler/icons-react";
|
|
18
16
|
import React, {
|
|
@@ -80,9 +78,15 @@ import {
|
|
|
80
78
|
type TreeNode,
|
|
81
79
|
} from "./use-resources.js";
|
|
82
80
|
|
|
83
|
-
const WORKSPACE_DOCS_URL = "https://agent-native.com/docs/workspace";
|
|
84
81
|
const LOCAL_WORKSPACE_RESOURCE_METADATA_SOURCE = "local-workspace-resource";
|
|
85
82
|
|
|
83
|
+
export function normalizeResourceFileName(name: string): string {
|
|
84
|
+
const trimmed = name.trim();
|
|
85
|
+
if (!trimmed || trimmed.endsWith("/")) return "";
|
|
86
|
+
const finalSegment = trimmed.split("/").pop() ?? "";
|
|
87
|
+
return /\.[^/]+$/.test(finalSegment) ? trimmed : `${trimmed}.md`;
|
|
88
|
+
}
|
|
89
|
+
|
|
86
90
|
const EMPTY_RESOURCE_ACTION_LABELS: Record<ResourceView, string> = {
|
|
87
91
|
files: "Add file",
|
|
88
92
|
instructions: "Add instructions",
|
|
@@ -380,9 +384,9 @@ function CreateMenu({
|
|
|
380
384
|
}, [view]);
|
|
381
385
|
|
|
382
386
|
const submitFile = () => {
|
|
383
|
-
const
|
|
384
|
-
if (
|
|
385
|
-
onCreateFile(
|
|
387
|
+
const normalizedName = normalizeResourceFileName(value);
|
|
388
|
+
if (normalizedName) {
|
|
389
|
+
onCreateFile(normalizedName);
|
|
386
390
|
setOpen(false);
|
|
387
391
|
}
|
|
388
392
|
};
|
|
@@ -606,7 +610,7 @@ The result should be a reusable agent profile, not a one-off task response.`,
|
|
|
606
610
|
{
|
|
607
611
|
icon: <IconPlus className="h-3.5 w-3.5" />,
|
|
608
612
|
label: "Create File",
|
|
609
|
-
desc: "
|
|
613
|
+
desc: t("agentResources.createFile.menuDescription"),
|
|
610
614
|
action: () => setView("file"),
|
|
611
615
|
},
|
|
612
616
|
{
|
|
@@ -843,7 +847,7 @@ The result should be a reusable agent profile, not a one-off task response.`,
|
|
|
843
847
|
{view === "file" && (
|
|
844
848
|
<div className="p-3">
|
|
845
849
|
<label className="mb-1.5 block text-[11px] font-medium text-muted-foreground">
|
|
846
|
-
|
|
850
|
+
{t("agentResources.createFile.nameLabel")}
|
|
847
851
|
</label>
|
|
848
852
|
<input
|
|
849
853
|
ref={inputRef as React.RefObject<HTMLInputElement>}
|
|
@@ -857,12 +861,12 @@ The result should be a reusable agent profile, not a one-off task response.`,
|
|
|
857
861
|
}
|
|
858
862
|
}}
|
|
859
863
|
className="w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
|
|
860
|
-
placeholder="
|
|
864
|
+
placeholder={t("agentResources.createFile.namePlaceholder")}
|
|
861
865
|
/>
|
|
862
866
|
<div className="mt-2.5 flex justify-end">
|
|
863
867
|
<button
|
|
864
868
|
onClick={submitFile}
|
|
865
|
-
disabled={!value
|
|
869
|
+
disabled={!normalizeResourceFileName(value)}
|
|
866
870
|
className="rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none"
|
|
867
871
|
>
|
|
868
872
|
Create
|
|
@@ -1145,9 +1149,9 @@ Create skill files under \`skills/<name>/SKILL.md\` to give the agent specialize
|
|
|
1145
1149
|
|-------|------|-------------|
|
|
1146
1150
|
| *(use the skill button to create one)* | \`skills/example/SKILL.md\` | |
|
|
1147
1151
|
|
|
1148
|
-
##
|
|
1152
|
+
## Agent resource files
|
|
1149
1153
|
|
|
1150
|
-
|
|
1154
|
+
Agent resources are files users intentionally add, edit, or manage. Agents may create hidden \`agent_scratch\` resources for temporary working notes, scripts, or intermediate results; only promote those files into the visible agent resources list when a user explicitly asks to keep them.
|
|
1151
1155
|
`;
|
|
1152
1156
|
|
|
1153
1157
|
const WORKSPACE_RESOURCE_OWNER = "__workspace__";
|
|
@@ -1185,6 +1189,7 @@ export function ResourcesPanel({
|
|
|
1185
1189
|
resourceTreeVariant = "tree",
|
|
1186
1190
|
mcpIntegrations,
|
|
1187
1191
|
}: ResourcesPanelProps = {}) {
|
|
1192
|
+
const t = useT();
|
|
1188
1193
|
const { data: org } = useOrg();
|
|
1189
1194
|
// Non-admin org members get read-only access to organization resources.
|
|
1190
1195
|
// Solo deployments (no orgId) behave as owner — users can edit their own.
|
|
@@ -1398,7 +1403,11 @@ export function ResourcesPanel({
|
|
|
1398
1403
|
|
|
1399
1404
|
const handleCreateFile = useCallback(
|
|
1400
1405
|
(parentPath: string, name: string, scope: ResourceScope) => {
|
|
1401
|
-
const
|
|
1406
|
+
const normalizedName = normalizeResourceFileName(name);
|
|
1407
|
+
if (!normalizedName) return;
|
|
1408
|
+
const path = parentPath
|
|
1409
|
+
? `${parentPath}/${normalizedName}`
|
|
1410
|
+
: normalizedName;
|
|
1402
1411
|
createResource.mutate(
|
|
1403
1412
|
{ path, content: "", shared: scope === "shared" },
|
|
1404
1413
|
{
|
|
@@ -1421,8 +1430,14 @@ export function ResourcesPanel({
|
|
|
1421
1430
|
|
|
1422
1431
|
const handleCreateFromToolbar = useCallback(
|
|
1423
1432
|
(targetScope: ResourceScope, name: string) => {
|
|
1433
|
+
const normalizedName = normalizeResourceFileName(name);
|
|
1434
|
+
if (!normalizedName) return;
|
|
1424
1435
|
createResource.mutate(
|
|
1425
|
-
{
|
|
1436
|
+
{
|
|
1437
|
+
path: normalizedName,
|
|
1438
|
+
content: "",
|
|
1439
|
+
shared: targetScope === "shared",
|
|
1440
|
+
},
|
|
1426
1441
|
{
|
|
1427
1442
|
onSuccess: (data) => {
|
|
1428
1443
|
setSelectedResourceId(data.id);
|
|
@@ -1662,13 +1677,15 @@ export function ResourcesPanel({
|
|
|
1662
1677
|
<TooltipTrigger asChild>
|
|
1663
1678
|
<button
|
|
1664
1679
|
onClick={handleBack}
|
|
1665
|
-
aria-label="
|
|
1680
|
+
aria-label={t("agentResources.backToResources")}
|
|
1666
1681
|
className="flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50"
|
|
1667
1682
|
>
|
|
1668
1683
|
<IconArrowLeft className="h-3.5 w-3.5" />
|
|
1669
1684
|
</button>
|
|
1670
1685
|
</TooltipTrigger>
|
|
1671
|
-
<TooltipContent>
|
|
1686
|
+
<TooltipContent>
|
|
1687
|
+
{t("agentResources.backToResources")}
|
|
1688
|
+
</TooltipContent>
|
|
1672
1689
|
</Tooltip>
|
|
1673
1690
|
</TooltipProvider>
|
|
1674
1691
|
{selectedMcpServer ? (
|
|
@@ -1843,24 +1860,6 @@ export function ResourcesPanel({
|
|
|
1843
1860
|
</TooltipContent>
|
|
1844
1861
|
</Tooltip>
|
|
1845
1862
|
</TooltipProvider>
|
|
1846
|
-
<TooltipProvider delayDuration={200}>
|
|
1847
|
-
<Tooltip>
|
|
1848
|
-
<TooltipTrigger asChild>
|
|
1849
|
-
<a
|
|
1850
|
-
href={WORKSPACE_DOCS_URL}
|
|
1851
|
-
target="_blank"
|
|
1852
|
-
rel="noopener noreferrer"
|
|
1853
|
-
aria-label="Open Resources docs"
|
|
1854
|
-
className="flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50"
|
|
1855
|
-
>
|
|
1856
|
-
<IconHelp className="h-3.5 w-3.5" />
|
|
1857
|
-
</a>
|
|
1858
|
-
</TooltipTrigger>
|
|
1859
|
-
<TooltipContent side="left" sideOffset={8}>
|
|
1860
|
-
Open Resources docs
|
|
1861
|
-
</TooltipContent>
|
|
1862
|
-
</Tooltip>
|
|
1863
|
-
</TooltipProvider>
|
|
1864
1863
|
</>
|
|
1865
1864
|
)}
|
|
1866
1865
|
<input
|
|
@@ -1915,42 +1914,6 @@ export function ResourcesPanel({
|
|
|
1915
1914
|
)
|
|
1916
1915
|
) : (
|
|
1917
1916
|
<div className="flex-1 min-h-0 overflow-y-auto">
|
|
1918
|
-
{!personalTreeQuery.isLoading &&
|
|
1919
|
-
!sharedTreeQuery.isLoading &&
|
|
1920
|
-
!workspaceTreeQuery.isLoading &&
|
|
1921
|
-
visibleWorkspaceTree.length === 0 &&
|
|
1922
|
-
displayedPersonalTree.length === 0 &&
|
|
1923
|
-
displayedSharedTree.length === 0 && (
|
|
1924
|
-
<div className="mx-2 mt-2 rounded-md border border-border bg-muted/30 p-2.5 text-[11px] text-muted-foreground">
|
|
1925
|
-
<p className="mb-1 font-medium text-foreground">
|
|
1926
|
-
This is your Workspace
|
|
1927
|
-
</p>
|
|
1928
|
-
<p className="mb-1.5 leading-snug">
|
|
1929
|
-
Files the agent reads and writes — notes, instructions,
|
|
1930
|
-
skills, custom agents, scheduled jobs, and inherited
|
|
1931
|
-
workspace context. They live in the database or, in local
|
|
1932
|
-
file mode, in the attached repo.
|
|
1933
|
-
</p>
|
|
1934
|
-
<p className="mb-2 leading-snug">
|
|
1935
|
-
<span className="text-foreground">Workspace</span> is
|
|
1936
|
-
inherited from Dispatch or local file mode.{" "}
|
|
1937
|
-
<span className="text-foreground">Organization</span> is
|
|
1938
|
-
visible to everyone in your organization
|
|
1939
|
-
{org?.orgId ? " — only admins can edit. " : ". "}
|
|
1940
|
-
<span className="text-foreground">Personal</span> is just
|
|
1941
|
-
for you.
|
|
1942
|
-
</p>
|
|
1943
|
-
<a
|
|
1944
|
-
href={WORKSPACE_DOCS_URL}
|
|
1945
|
-
target="_blank"
|
|
1946
|
-
rel="noopener noreferrer"
|
|
1947
|
-
className="inline-flex items-center gap-1 text-foreground hover:underline"
|
|
1948
|
-
>
|
|
1949
|
-
Learn more
|
|
1950
|
-
<IconExternalLink className="h-3 w-3" />
|
|
1951
|
-
</a>
|
|
1952
|
-
</div>
|
|
1953
|
-
)}
|
|
1954
1917
|
{visibleWorkspaceTree.length > 0 && (
|
|
1955
1918
|
<ResourceTree
|
|
1956
1919
|
tree={visibleWorkspaceTree}
|