@agent-native/core 0.115.3 → 0.116.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 +34 -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 +1 -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/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 +16 -6
- package/corpus/core/src/connections/catalog.ts +7 -1
- 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/server/builder-browser.ts +34 -4
- package/corpus/core/src/server/collab-plugin.ts +137 -18
- package/corpus/core/src/server/core-routes-plugin.ts +1 -1
- package/corpus/core/src/server/index.ts +2 -0
- 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/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/desktop/src-tauri/src/native_screen/custom_capture.rs +10 -1
- 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/sidebar/DocumentSidebar.tsx +1 -1
- 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/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 +3 -2
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +17 -6
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.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/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/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +11 -11
- 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/secrets/routes.d.ts +9 -9
- package/dist/server/builder-browser.d.ts +1 -0
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +27 -4
- package/dist/server/builder-browser.js.map +1 -1
- 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.js +1 -1
- 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/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 +3 -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/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 +16 -6
- package/src/connections/catalog.ts +7 -1
- 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/server/builder-browser.ts +34 -4
- package/src/server/collab-plugin.ts +137 -18
- package/src/server/core-routes-plugin.ts +1 -1
- package/src/server/index.ts +2 -0
- 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
|
@@ -9,7 +9,7 @@ A **recurring job** is a prompt that runs on a cron schedule. It's how the agent
|
|
|
9
9
|
|
|
10
10
|
Recurring jobs fire on a clock. To react to _events_ (a booking created, an email received) — same `jobs/` file format plus conditions — see [Automations](/docs/automations).
|
|
11
11
|
|
|
12
|
-
Jobs live in [Agent Resources](/docs/
|
|
12
|
+
Jobs live in [Agent Resources](/docs/agent-resources) at `jobs/<name>.md` — just a Markdown file with YAML frontmatter. No registration, no wiring. Drop the file in and the framework picks it up.
|
|
13
13
|
|
|
14
14
|
## A job file {#job-file}
|
|
15
15
|
|
|
@@ -40,12 +40,12 @@ Jobs live in [Agent Resources](/docs/workspace) at `jobs/<name>.md` — just a M
|
|
|
40
40
|
{
|
|
41
41
|
lines: "7-12",
|
|
42
42
|
label: "The prompt",
|
|
43
|
-
note: "The body is just a prompt — the agent runs it at each firing with all its normal tools and
|
|
43
|
+
note: "The body is just a prompt — the agent runs it at each firing with all its normal tools and agent context.",
|
|
44
44
|
},
|
|
45
45
|
]}
|
|
46
46
|
/>
|
|
47
47
|
|
|
48
|
-
That's it. The body is a prompt the agent runs at each scheduled firing. The agent has access to all the same tools and
|
|
48
|
+
That's it. The body is a prompt the agent runs at each scheduled firing. The agent has access to all the same tools and agent context it has in an interactive chat — actions, skills, memory, connected MCP servers, sub-agents.
|
|
49
49
|
|
|
50
50
|
## Frontmatter {#frontmatter}
|
|
51
51
|
|
|
@@ -54,7 +54,7 @@ That's it. The body is a prompt the agent runs at each scheduled firing. The age
|
|
|
54
54
|
| `schedule` | cron expression | _(required)_ | Standard 5-field cron. `"0 7 * * *"` = every day at 07:00; `"0 */4 * * *"` = every 4 hours. |
|
|
55
55
|
| `enabled` | boolean | `true` | Flip to `false` to pause without deleting the job. |
|
|
56
56
|
| `runAs` | `"creator"` \| `"shared"` | `"creator"` | `"creator"` runs with the job owner's identity and `ANTHROPIC_API_KEY`. `"shared"` uses the org's key. |
|
|
57
|
-
| `createdBy` | email | _(auto)_ | Populated when the job is created through the
|
|
57
|
+
| `createdBy` | email | _(auto)_ | Populated when the job is created through the Agent Resources UI or by the agent. |
|
|
58
58
|
| `orgId` | string | _(auto)_ | Org scope; inherited from the creator's active org. |
|
|
59
59
|
| `lastRun` | ISO timestamp | _(managed)_ | Written by the scheduler after each run. |
|
|
60
60
|
| `lastStatus` | `"success"` \| `"error"` \| … | _(managed)_ | Latest outcome. |
|
|
@@ -211,7 +211,7 @@ The scheduler is a framework plugin (the internal `processRecurringJobs()` routi
|
|
|
211
211
|
|
|
212
212
|
## Debugging a job {#debugging}
|
|
213
213
|
|
|
214
|
-
- Open `jobs/<name>.md` in
|
|
214
|
+
- Open `jobs/<name>.md` in Agent Resources — the frontmatter shows `lastRun`, `lastStatus`, `lastError`, `nextRun`.
|
|
215
215
|
- **Test it without waiting:** there's no force-fire tool. To exercise the same work on demand, either paste the job's prompt into the agent chat and let it run there, or temporarily set the schedule to the next minute so the scheduler picks it up on the next tick (then restore the real cron).
|
|
216
216
|
- **Pause it:** flip `enabled: false`. The file stays put, just stops running.
|
|
217
217
|
|
|
@@ -234,7 +234,7 @@ A single `manage-jobs` tool is registered in every template. The `action` parame
|
|
|
234
234
|
|
|
235
235
|
Don't confuse recurring jobs with `@agent-native/scheduling`:
|
|
236
236
|
|
|
237
|
-
- **Recurring jobs (this page)** — cron-scheduled _prompts_ the agent runs in the background. Framework-level. Lives in
|
|
237
|
+
- **Recurring jobs (this page)** — cron-scheduled _prompts_ the agent runs in the background. Framework-level. Lives in Agent Resources. Runs on any agent-native app.
|
|
238
238
|
- **`@agent-native/scheduling`** — a reusable domain package for building calendar/booking features (event types, availability windows, bookings). Powers the `calendar` template and custom scheduling surfaces.
|
|
239
239
|
|
|
240
240
|
Recurring jobs are "how do I make the agent act on its own?" The scheduling package is "how do I build a calendar app?" Different concerns.
|
|
@@ -242,7 +242,7 @@ Recurring jobs are "how do I make the agent act on its own?" The scheduling pack
|
|
|
242
242
|
## What's next
|
|
243
243
|
|
|
244
244
|
- [**Automations**](/docs/automations) — add event triggers and conditions to the same `jobs/` format
|
|
245
|
-
- [**Agent Resources**](/docs/
|
|
245
|
+
- [**Agent Resources**](/docs/agent-resources) — where jobs live alongside skills, memory, and custom agents
|
|
246
246
|
- [**Actions**](/docs/actions) — the tools a job calls
|
|
247
247
|
- [**MCP Clients**](/docs/mcp-clients) — connect remote or local MCP tools and OAuth grants
|
|
248
248
|
- [**Agent Teams**](/docs/agent-teams) — jobs often spawn sub-agents to do parallel work
|
|
@@ -141,7 +141,7 @@ Create a skill when:
|
|
|
141
141
|
Don't create a skill when:
|
|
142
142
|
|
|
143
143
|
- The guidance already exists in another skill — extend it instead
|
|
144
|
-
- The guidance is a one-off — put it in `AGENTS.md` or
|
|
144
|
+
- The guidance is a one-off — put it in `AGENTS.md` or agent memory instead
|
|
145
145
|
|
|
146
146
|
## Skill format {#skill-format}
|
|
147
147
|
|
|
@@ -299,11 +299,11 @@ This replaces the old hack of relying on Claude Code only reading `.claude/skill
|
|
|
299
299
|
|
|
300
300
|
</Callout>
|
|
301
301
|
|
|
302
|
-
If the knowledge applies to _everyone_ working in the app ("always prefer CTEs over subqueries"), it's a skill or shared `LEARNINGS.md`. If it's about _this particular user_ ("Steve likes concise answers"), it belongs in `memory/MEMORY.md`. See [Agent Resources — Memory](/docs/
|
|
302
|
+
If the knowledge applies to _everyone_ working in the app ("always prefer CTEs over subqueries"), it's a skill or shared `LEARNINGS.md`. If it's about _this particular user_ ("Steve likes concise answers"), it belongs in `memory/MEMORY.md`. See [Agent Resources — Memory](/docs/agent-resources#memory) for the full treatment.
|
|
303
303
|
|
|
304
304
|
## Skills vs SQL resources {#skills-vs-resources}
|
|
305
305
|
|
|
306
|
-
This page frames a skill as a file at `.agents/skills/<name>/SKILL.md`. [Agent Resources](/docs/
|
|
306
|
+
This page frames a skill as a file at `.agents/skills/<name>/SKILL.md`. [Agent Resources](/docs/agent-resources#skills) frames the same skill as a SQL resource at path `skills/<slug>/SKILL.md`, scoped workspace/shared/personal. These are the same concept from two angles: Code mode reads and writes the file directly; App mode stores it as a resource row so it works without a filesystem. Author the content using this page's format either way.
|
|
307
307
|
|
|
308
308
|
## App-backed skills — full details {#app-backed-skills-full}
|
|
309
309
|
|
|
@@ -428,6 +428,6 @@ the same instructions without maintaining a second copy.
|
|
|
428
428
|
## What's next {#whats-next}
|
|
429
429
|
|
|
430
430
|
- [**Writing Agent Instructions**](/docs/writing-agent-instructions) — word skill descriptions and split guidance across AGENTS.md, skills, and memory
|
|
431
|
-
- [**Agent Resources**](/docs/
|
|
431
|
+
- [**Agent Resources**](/docs/agent-resources#skills) — where skills live as SQL resources in App mode
|
|
432
432
|
- [**Agent Mentions**](/docs/agent-mentions) — the `/`-command trigger that invokes a skill in chat
|
|
433
433
|
- [**Plan plugin & marketplace**](/docs/plan-plugin) — a real app-backed skill's end-to-end install and auto-update flow
|
|
@@ -549,7 +549,7 @@ Ask the agent to make changes for you — it can edit its own source. See
|
|
|
549
549
|
|
|
550
550
|
- [**Dispatch**](/docs/dispatch) — the workspace control plane
|
|
551
551
|
- [**Dispatch template**](/docs/template-dispatch) — the scaffolded coordination app
|
|
552
|
-
- [**Agent Resources**](/docs/
|
|
552
|
+
- [**Agent Resources**](/docs/agent-resources) — shared resources across apps
|
|
553
553
|
- [**A2A Protocol**](/docs/a2a-protocol) — cross-app delegation
|
|
554
554
|
- [**Templates**](/docs/cloneable-saas) — the clone-and-own model, and every other domain template to start from
|
|
555
555
|
- [**Getting Started**](/docs/getting-started) — the framework fundamentals: actions, application state, and live sync
|
|
@@ -38,7 +38,7 @@ operations.
|
|
|
38
38
|
import { createCollabPlugin } from "@agent-native/core/server";
|
|
39
39
|
|
|
40
40
|
export default createCollabPlugin({
|
|
41
|
-
resourceType: "document",
|
|
41
|
+
access: { mode: "resource", resourceType: "document" },
|
|
42
42
|
table: "documents",
|
|
43
43
|
contentColumn: "content",
|
|
44
44
|
});
|
|
@@ -89,7 +89,7 @@ The agent isn't a separate app you tab over to. It ships as a handful of React c
|
|
|
89
89
|
|
|
90
90
|
## You can go UI-light {#ui-light}
|
|
91
91
|
|
|
92
|
-
Not every app needs a full dashboard. When the agent _is_ the product, you can skip most of the custom UI: open the app, ask for what you want, and let the agent do the rest. The agent still has its management surface — history,
|
|
92
|
+
Not every app needs a full dashboard. When the agent _is_ the product, you can skip most of the custom UI: open the app, ask for what you want, and let the agent do the rest. The agent still has its management surface — history, agent resources, settings — but the primary interaction is conversation rather than clicks.
|
|
93
93
|
|
|
94
94
|
## You co-edit with it {#you-co-edit}
|
|
95
95
|
|
|
@@ -289,7 +289,7 @@ When the agent creates a draft email, it appears in the UI. When you click "Send
|
|
|
289
289
|
|
|
290
290
|
The reason tools like Claude Code feel so powerful isn't the model — it's the **customization layer**: per-project instructions, skills, memory, sub-agents, connected services. You can shape the agent to your codebase, your preferences, your team.
|
|
291
291
|
|
|
292
|
-
Agent-native gives every user that same customization layer — without ever leaving the app. Each app comes with
|
|
292
|
+
Agent-native gives every user that same customization layer — without ever leaving the app. Each app comes with personal **agent resources** that you (or anyone on your team) can use to:
|
|
293
293
|
|
|
294
294
|
- Edit team-wide rules everyone's agent reads
|
|
295
295
|
- Let the agent remember preferences automatically as you correct it
|
|
@@ -298,9 +298,9 @@ Agent-native gives every user that same customization layer — without ever lea
|
|
|
298
298
|
- Schedule jobs to run on a cron (e.g. "every Monday morning, summarize last week")
|
|
299
299
|
- Connect external services (Gmail, Stripe, Slack, internal APIs) via per-user MCP servers
|
|
300
300
|
|
|
301
|
-
The twist: it's all stored in the database, not the filesystem. There's no dev environment to spin up, no container per user. Every user gets their own full
|
|
301
|
+
The twist: it's all stored in the database, not the filesystem. There's no dev environment to spin up, no container per user. Every user gets their own full set of agent resources — personal memory, personal connections, personal skills — for essentially free, because it's all rows in a table. That's what makes Claude-Code-level flexibility viable inside a real multi-tenant SaaS product.
|
|
302
302
|
|
|
303
|
-
See [Agent Resources](/docs/
|
|
303
|
+
See [Agent Resources](/docs/agent-resources) for the full concept.
|
|
304
304
|
|
|
305
305
|
## What makes it different {#what-makes-it-different}
|
|
306
306
|
|
|
@@ -396,7 +396,7 @@ One action, many surfaces: the agent calls it as a tool, the UI calls it as a ty
|
|
|
396
396
|
- [**Agent Surfaces**](/docs/agent-surfaces) — choose chat, native inline UI, full app pages, embedded sidecar, automation, or external agent access
|
|
397
397
|
- [**Key Concepts**](/docs/key-concepts) — the architecture: SQL, actions, polling sync, context awareness, portability
|
|
398
398
|
- [**Templates**](/docs/cloneable-saas) — templates as complete products you own
|
|
399
|
-
- [**Agent Resources**](/docs/
|
|
399
|
+
- [**Agent Resources**](/docs/agent-resources) — the per-user customization layer (skills, memory, instructions, MCP) backed by SQL, not files
|
|
400
400
|
- [**Dispatch**](/docs/dispatch) — the workspace control plane: secrets vault, Slack/email inbox, cross-app delegation
|
|
401
401
|
- [**Extensions**](/docs/extensions) — sandboxed mini-apps the agent creates instantly without code changes
|
|
402
402
|
- [**Drop-in Agent**](/docs/drop-in-agent) — mount `<AgentPanel>` into any React app
|
|
@@ -7,7 +7,7 @@ description: "Branching, CODEOWNERS, PR review, and how Dispatch handles runtime
|
|
|
7
7
|
|
|
8
8
|
<Callout tone="info">
|
|
9
9
|
|
|
10
|
-
**Which workspace doc?** This page covers **governance** — who reviews, approves, and owns what across many apps in one repo. For the agent customization layer (Agent Resources: `AGENTS.md`, memory, skills, custom agents) see [Agent Resources](/docs/
|
|
10
|
+
**Which workspace doc?** This page covers **governance** — who reviews, approves, and owns what across many apps in one repo. For the agent customization layer (Agent Resources: `AGENTS.md`, memory, skills, custom agents) see [Agent Resources](/docs/agent-resources); for the deployment shape (one monorepo, many apps) see [Multi-App Workspaces](/docs/multi-app-workspace).
|
|
11
11
|
|
|
12
12
|
</Callout>
|
|
13
13
|
|
|
@@ -211,7 +211,7 @@ The [Dispatch](/docs/dispatch) app is the workspace's runtime control plane. It
|
|
|
211
211
|
|
|
212
212
|
Dispatch manages: vault secrets, reusable workspace connections, workspace resources (skills, instructions, agent profiles, MCP servers), approvals, and audit logs. For public app route configuration (`workspaceApp.audience` / `publicPaths` / `protectedPaths`), see [Multi-App Workspaces — Public app routes](/docs/multi-app-workspace#deployment).
|
|
213
213
|
|
|
214
|
-
For the resource model and canonical paths, see [Agent Resources — Global resources](/docs/
|
|
214
|
+
For the resource model and canonical paths, see [Agent Resources — Global resources](/docs/agent-resources#global-resources).
|
|
215
215
|
|
|
216
216
|
## Setup Checklist
|
|
217
217
|
|
|
@@ -232,7 +232,7 @@ For a new workspace, after running `npx @agent-native/core@latest create`:
|
|
|
232
232
|
- [ ] Register reusable workspace connections for shared provider accounts, then
|
|
233
233
|
grant apps such as Brain, Analytics, Mail, or Dispatch only when they need
|
|
234
234
|
that account
|
|
235
|
-
- [ ] Add workspace-wide skills, guardrail instructions, and brand/company reference resources via the Resources page. See [Agent Resources](/docs/
|
|
235
|
+
- [ ] Add workspace-wide skills, guardrail instructions, and brand/company reference resources via the Resources page. See [Agent Resources](/docs/agent-resources#global-resources) for the full resource-model table and the recommended starter pack.
|
|
236
236
|
- [ ] Configure the approval policy and approver emails
|
|
237
237
|
- [ ] Set up SendGrid (`SENDGRID_API_KEY`, `SENDGRID_FROM_EMAIL`) for admin notifications
|
|
238
238
|
- [ ] Connect Slack or Telegram for workspace messaging
|
|
@@ -240,7 +240,7 @@ For a new workspace, after running `npx @agent-native/core@latest create`:
|
|
|
240
240
|
|
|
241
241
|
## What's next {#whats-next}
|
|
242
242
|
|
|
243
|
-
- [**Agent Resources**](/docs/
|
|
243
|
+
- [**Agent Resources**](/docs/agent-resources) — the customization layer this page governs (skills, memory, agents, MCP servers)
|
|
244
244
|
- [**Multi-App Workspaces**](/docs/multi-app-workspace) — the deployment shape: one monorepo, many apps
|
|
245
245
|
- [**Dispatch**](/docs/dispatch) — the runtime control plane referenced throughout this page
|
|
246
246
|
- [**Sharing**](/docs/sharing) — access control for individual resources, complementing repo-level CODEOWNERS
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.116.0",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -385,8 +385,8 @@
|
|
|
385
385
|
"y-protocols": "^1.0.7",
|
|
386
386
|
"yjs": "^13.6.31",
|
|
387
387
|
"zod": "^4.3.6",
|
|
388
|
-
"@agent-native/
|
|
389
|
-
"@agent-native/
|
|
388
|
+
"@agent-native/recap-cli": "0.5.1",
|
|
389
|
+
"@agent-native/toolkit": "^0.9.1"
|
|
390
390
|
},
|
|
391
391
|
"devDependencies": {
|
|
392
392
|
"@ai-sdk/anthropic": "^3.0.71",
|
|
@@ -3986,8 +3986,16 @@ export async function runAgentLoop(opts: {
|
|
|
3986
3986
|
}
|
|
3987
3987
|
}
|
|
3988
3988
|
if (!assistantContent) {
|
|
3989
|
-
|
|
3990
|
-
|
|
3989
|
+
if (!terminalStopReason) {
|
|
3990
|
+
// A stream that disappears without a terminal stop is an interrupted
|
|
3991
|
+
// chunk, not a successful empty answer. Let the continuation path
|
|
3992
|
+
// recover it instead of persisting a tool-only completed turn.
|
|
3993
|
+
send({ type: "auto_continue", reason: "stream_ended" });
|
|
3994
|
+
return usage;
|
|
3995
|
+
}
|
|
3996
|
+
// Route a clean terminal stop with no normalized content through the
|
|
3997
|
+
// empty-final retry/fallback below.
|
|
3998
|
+
assistantContent = [];
|
|
3991
3999
|
}
|
|
3992
4000
|
|
|
3993
4001
|
if (toolCallErrors.size > 0) {
|
|
@@ -4022,7 +4030,9 @@ export async function runAgentLoop(opts: {
|
|
|
4022
4030
|
: part,
|
|
4023
4031
|
);
|
|
4024
4032
|
|
|
4025
|
-
|
|
4033
|
+
if (assistantContentForHistory.length > 0) {
|
|
4034
|
+
messages.push({ role: "assistant", content: assistantContentForHistory });
|
|
4035
|
+
}
|
|
4026
4036
|
|
|
4027
4037
|
const toolCallParts = assistantContent.filter(
|
|
4028
4038
|
(p): p is import("./engine/types.js").EngineToolCallPart =>
|
package/src/cli/doctor.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* itself via `scripts/guard-*.mjs` (see
|
|
5
5
|
* `advisor-plans/reports/005-doctor-design.md` for the full design and
|
|
6
6
|
* `advisor-plans/015-doctor-v1-implementation.md` for the implementation
|
|
7
|
-
* plan). v1 ships
|
|
7
|
+
* plan). v1 ships 9 of those guards, ported to work against a single
|
|
8
8
|
* generated app root instead of this monorepo's multi-template layout —
|
|
9
9
|
* see `../guards/index.ts`.
|
|
10
10
|
*
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
scanDrizzlePush,
|
|
29
29
|
scanEnvCredentials,
|
|
30
30
|
scanEnvMutation,
|
|
31
|
+
scanExplicitCollabAccess,
|
|
31
32
|
scanLocalhostFallback,
|
|
32
33
|
scanUnscopedCredentials,
|
|
33
34
|
scanUnscopedQueries,
|
|
@@ -47,6 +48,7 @@ export type GuardName =
|
|
|
47
48
|
| "db-tool-scoping"
|
|
48
49
|
| "no-env-mutation"
|
|
49
50
|
| "no-localhost-fallback"
|
|
51
|
+
| "explicit-collab-access"
|
|
50
52
|
| "migration-manifest";
|
|
51
53
|
|
|
52
54
|
export const ALL_GUARD_NAMES: GuardName[] = [
|
|
@@ -57,6 +59,7 @@ export const ALL_GUARD_NAMES: GuardName[] = [
|
|
|
57
59
|
"db-tool-scoping",
|
|
58
60
|
"no-env-mutation",
|
|
59
61
|
"no-localhost-fallback",
|
|
62
|
+
"explicit-collab-access",
|
|
60
63
|
"migration-manifest",
|
|
61
64
|
];
|
|
62
65
|
|
|
@@ -150,6 +153,8 @@ function runGuard(
|
|
|
150
153
|
return scanEnvMutation({ root });
|
|
151
154
|
case "no-localhost-fallback":
|
|
152
155
|
return scanLocalhostFallback({ root, extraExemptPaths: [] });
|
|
156
|
+
case "explicit-collab-access":
|
|
157
|
+
return scanExplicitCollabAccess({ root });
|
|
153
158
|
case "migration-manifest": {
|
|
154
159
|
const imports = scanDeprecatedImports({
|
|
155
160
|
root,
|
|
@@ -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;
|