@agent-native/core 0.118.0 → 0.118.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +21 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/client.ts +32 -10
- package/corpus/core/src/cli/index.ts +18 -10
- package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
- package/corpus/core/src/cli/templates-meta.ts +0 -12
- package/corpus/core/src/cli/workspace-dev.ts +1 -1
- package/corpus/core/src/client/AgentPanel.tsx +9 -1
- package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
- package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
- package/corpus/core/src/client/chat/message-components.tsx +53 -8
- package/corpus/core/src/client/chat/tool-call-display.tsx +24 -9
- package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
- package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
- package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
- package/corpus/core/src/client/error-capture.ts +2 -6
- package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +20 -14
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +7 -17
- package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
- package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
- package/corpus/core/src/client/session-replay.ts +3 -3
- package/corpus/core/src/client/settings/SettingsPanel.tsx +15 -6
- package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
- package/corpus/core/src/deploy/build.ts +2 -1
- package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
- package/corpus/core/src/integrations/adapters/slack.ts +84 -5
- package/corpus/core/src/integrations/index.ts +5 -1
- package/corpus/core/src/localization/default-messages.ts +1 -1
- package/corpus/core/src/mcp-client/oauth-routes.ts +45 -12
- package/corpus/core/src/server/realtime-voice.ts +4 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
- package/corpus/core/src/terminal/cli-registry.ts +1 -1
- package/corpus/core/src/vite/client.ts +166 -1
- package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
- package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
- package/corpus/templates/brain/app/routes/sources.tsx +181 -114
- package/corpus/templates/clips/AGENTS.md +8 -6
- package/corpus/templates/clips/actions/request-transcript.ts +90 -420
- package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
- package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
- package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
- package/corpus/templates/clips/app/routes/download.tsx +3 -2
- package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
- package/corpus/templates/clips/server/register-secrets.ts +7 -6
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
- package/corpus/templates/content/app/i18n-data.ts +10 -0
- package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
- package/corpus/templates/plan/app/entry.client.tsx +3 -0
- package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
- package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
- package/corpus/templates/slides/app/pages/Index.tsx +1 -0
- package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
- package/corpus/toolkit/CHANGELOG.md +9 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/composer/PromptComposer.tsx +5 -1
- package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
- package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +30 -0
- package/corpus/toolkit/src/conformance/runner.tsx +153 -1
- package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
- package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
- package/corpus/toolkit/src/editor/index.ts +2 -0
- package/corpus/toolkit/src/styles.css +52 -23
- package/dist/a2a/client.d.ts +3 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +17 -12
- package/dist/a2a/client.js.map +1 -1
- package/dist/cli/index.js +18 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/multi-frontier-runs.js +3 -3
- package/dist/cli/multi-frontier-runs.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +0 -12
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspace-dev.js +1 -1
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +4 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +3 -5
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +17 -18
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
- package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
- package/dist/client/chat/action-chat-ui-surface.js +10 -0
- package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
- package/dist/client/chat/message-components.d.ts +3 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +40 -7
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +3 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +13 -9
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.js +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
- package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
- package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
- package/dist/client/conversation/AgentConversation.js +3 -2
- package/dist/client/conversation/AgentConversation.js.map +1 -1
- package/dist/client/error-capture.d.ts.map +1 -1
- package/dist/client/error-capture.js +2 -2
- package/dist/client/error-capture.js.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
- package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.js +9 -8
- package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +3 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- 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 +4 -17
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/client/resources/mcp-integration-logos.js +2 -2
- package/dist/client/resources/mcp-integration-logos.js.map +1 -1
- package/dist/client/route-chunk-recovery.d.ts.map +1 -1
- package/dist/client/route-chunk-recovery.js +5 -3
- package/dist/client/route-chunk-recovery.js.map +1 -1
- package/dist/client/session-replay.js +3 -3
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +2 -2
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/transcription/use-live-transcription.d.ts +3 -3
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
- package/dist/client/transcription/use-live-transcription.js +22 -11
- package/dist/client/transcription/use-live-transcription.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/guards/db-tool-scoping.js +1 -1
- package/dist/guards/db-tool-scoping.js.map +1 -1
- package/dist/integrations/adapters/slack.d.ts +1 -0
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +61 -5
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/index.d.ts +1 -1
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -1
- package/dist/integrations/index.js.map +1 -1
- package/dist/localization/default-messages.js +1 -1
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp-client/oauth-routes.d.ts +3 -0
- package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
- package/dist/mcp-client/oauth-routes.js +41 -12
- package/dist/mcp-client/oauth-routes.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +3 -3
- package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/realtime-voice.d.ts.map +1 -1
- package/dist/server/realtime-voice.js +1 -1
- package/dist/server/realtime-voice.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
- package/dist/terminal/cli-registry.js +1 -1
- package/dist/terminal/cli-registry.js.map +1 -1
- package/dist/vite/client.d.ts +8 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +113 -2
- package/dist/vite/client.js.map +1 -1
- package/package.json +2 -2
- package/src/a2a/client.ts +32 -10
- package/src/cli/index.ts +18 -10
- package/src/cli/multi-frontier-runs.ts +5 -3
- package/src/cli/templates-meta.ts +0 -12
- package/src/cli/workspace-dev.ts +1 -1
- package/src/client/AgentPanel.tsx +9 -1
- package/src/client/RunStuckBanner.tsx +39 -47
- package/src/client/chat/action-chat-ui-surface.tsx +32 -0
- package/src/client/chat/message-components.tsx +53 -8
- package/src/client/chat/tool-call-display.tsx +24 -9
- package/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
- package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
- package/src/client/conversation/AgentConversation.tsx +12 -1
- package/src/client/error-capture.ts +2 -6
- package/src/client/resources/McpConnectionSuggestion.tsx +20 -14
- package/src/client/resources/ResourcesPanel.tsx +5 -1
- package/src/client/resources/mcp-integration-catalog.ts +7 -17
- package/src/client/resources/mcp-integration-logos.ts +2 -2
- package/src/client/route-chunk-recovery.ts +5 -3
- package/src/client/session-replay.ts +3 -3
- package/src/client/settings/SettingsPanel.tsx +15 -6
- package/src/client/transcription/use-live-transcription.ts +64 -45
- package/src/deploy/build.ts +2 -1
- package/src/guards/db-tool-scoping.ts +1 -1
- package/src/integrations/adapters/slack.ts +84 -5
- package/src/integrations/index.ts +5 -1
- package/src/localization/default-messages.ts +1 -1
- package/src/mcp-client/oauth-routes.ts +45 -12
- package/src/server/realtime-voice.ts +4 -1
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
- package/src/terminal/cli-registry.ts +1 -1
- package/src/vite/client.ts +166 -1
- package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -177
- package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
- package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -220
- package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
- package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
- package/corpus/templates/crm/.env.example +0 -5
- package/corpus/templates/crm/AGENTS.md +0 -120
- package/corpus/templates/crm/CHANGELOG.md +0 -1
- package/corpus/templates/crm/DEVELOPING.md +0 -66
- package/corpus/templates/crm/README.md +0 -106
- package/corpus/templates/crm/_gitignore +0 -12
- package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
- package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
- package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
- package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
- package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
- package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
- package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
- package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
- package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
- package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
- package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
- package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
- package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
- package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
- package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
- package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
- package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
- package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
- package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
- package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
- package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
- package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
- package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
- package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
- package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
- package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
- package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
- package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
- package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
- package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
- package/corpus/templates/crm/actions/navigate.ts +0 -63
- package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
- package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
- package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
- package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
- package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
- package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
- package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
- package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
- package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
- package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
- package/corpus/templates/crm/actions/run.ts +0 -7
- package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
- package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
- package/corpus/templates/crm/actions/sync-crm.ts +0 -146
- package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
- package/corpus/templates/crm/actions/view-screen.ts +0 -218
- package/corpus/templates/crm/agent-native.app-skill.json +0 -58
- package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
- package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -78
- package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -226
- package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -414
- package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
- package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
- package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -362
- package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -93
- package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -97
- package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
- package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/badge.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/button.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/card.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/dialog.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/input.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/label.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/select.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/sheet.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/skeleton.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/switch.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/table.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/tabs.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/textarea.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +0 -17
- package/corpus/templates/crm/app/design-system.ts +0 -3
- package/corpus/templates/crm/app/entry.client.tsx +0 -16
- package/corpus/templates/crm/app/entry.server.tsx +0 -10
- package/corpus/templates/crm/app/global.css +0 -167
- package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
- package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
- package/corpus/templates/crm/app/i18n/index.ts +0 -34
- package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
- package/corpus/templates/crm/app/lib/navigation.ts +0 -54
- package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
- package/corpus/templates/crm/app/lib/types.ts +0 -172
- package/corpus/templates/crm/app/lib/utils.ts +0 -1
- package/corpus/templates/crm/app/root.tsx +0 -91
- package/corpus/templates/crm/app/routes/_index.tsx +0 -26
- package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
- package/corpus/templates/crm/app/routes/agent.tsx +0 -5
- package/corpus/templates/crm/app/routes/ask.tsx +0 -53
- package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
- package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
- package/corpus/templates/crm/app/routes/people.tsx +0 -41
- package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
- package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
- package/corpus/templates/crm/app/routes/settings.tsx +0 -63
- package/corpus/templates/crm/app/routes/setup.tsx +0 -308
- package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
- package/corpus/templates/crm/app/routes/views.tsx +0 -333
- package/corpus/templates/crm/app/routes.ts +0 -17
- package/corpus/templates/crm/app/vite-env.d.ts +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
- package/corpus/templates/crm/components.json +0 -20
- package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
- package/corpus/templates/crm/learnings.defaults.md +0 -5
- package/corpus/templates/crm/package.json +0 -59
- package/corpus/templates/crm/public/favicon.svg +0 -1
- package/corpus/templates/crm/public/icon-180.svg +0 -1
- package/corpus/templates/crm/public/manifest.json +0 -11
- package/corpus/templates/crm/react-router.config.ts +0 -7
- package/corpus/templates/crm/server/crm/adapter.ts +0 -32
- package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
- package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
- package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
- package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
- package/corpus/templates/crm/server/crm/read-through.ts +0 -207
- package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
- package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
- package/corpus/templates/crm/server/db/index.ts +0 -169
- package/corpus/templates/crm/server/db/schema.ts +0 -441
- package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
- package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
- package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
- package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
- package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
- package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
- package/corpus/templates/crm/server/middleware/auth.ts +0 -4
- package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
- package/corpus/templates/crm/server/plugins/auth.ts +0 -14
- package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
- package/corpus/templates/crm/server/plugins/db.ts +0 -454
- package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
- package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
- package/corpus/templates/crm/shared/crm-contract.ts +0 -254
- package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
- package/corpus/templates/crm/ssr-entry.ts +0 -11
- package/corpus/templates/crm/tsconfig.json +0 -24
- package/corpus/templates/crm/vite.config.ts +0 -15
- package/corpus/templates/crm/vitest.config.ts +0 -5
|
@@ -4,10 +4,11 @@ import type { OAuthClientInformationMixed } from "@modelcontextprotocol/sdk/shar
|
|
|
4
4
|
import {
|
|
5
5
|
deleteCookie,
|
|
6
6
|
defineEventHandler,
|
|
7
|
+
getChunkedCookie,
|
|
7
8
|
getCookie,
|
|
8
9
|
getMethod,
|
|
9
10
|
getQuery,
|
|
10
|
-
|
|
11
|
+
setChunkedCookie,
|
|
11
12
|
setResponseStatus,
|
|
12
13
|
type H3Event,
|
|
13
14
|
} from "h3";
|
|
@@ -32,6 +33,9 @@ import {
|
|
|
32
33
|
|
|
33
34
|
const FLOW_COOKIE = "an_mcp_oauth_flow";
|
|
34
35
|
const FLOW_TTL_SECONDS = 10 * 60;
|
|
36
|
+
const FLOW_COOKIE_CHUNK_SIZE = 2_800;
|
|
37
|
+
const FLOW_COOKIE_MAX_CHUNKS = 8;
|
|
38
|
+
const CHUNKED_COOKIE_PREFIX = "__chunked__";
|
|
35
39
|
|
|
36
40
|
export interface McpOAuthFlow {
|
|
37
41
|
name: string;
|
|
@@ -189,13 +193,7 @@ async function handleMcpOAuthStart(
|
|
|
189
193
|
...(safeReturnUrl ? { returnUrl: safeReturnUrl } : {}),
|
|
190
194
|
expiresAt: Date.now() + FLOW_TTL_SECONDS * 1_000,
|
|
191
195
|
};
|
|
192
|
-
|
|
193
|
-
httpOnly: true,
|
|
194
|
-
secure: redirectUri.startsWith("https://"),
|
|
195
|
-
sameSite: "lax",
|
|
196
|
-
path: "/",
|
|
197
|
-
maxAge: FLOW_TTL_SECONDS,
|
|
198
|
-
});
|
|
196
|
+
setMcpOAuthFlowCookie(event, flow, redirectUri.startsWith("https://"));
|
|
199
197
|
return redirectWithStagedCookies(event, started.authorizationUrl.href);
|
|
200
198
|
} catch {
|
|
201
199
|
setResponseStatus(event, 400);
|
|
@@ -217,8 +215,8 @@ async function handleMcpOAuthCallback(
|
|
|
217
215
|
const code = text(query.code);
|
|
218
216
|
const state = text(query.state);
|
|
219
217
|
const providerError = text(query.error);
|
|
220
|
-
const flow =
|
|
221
|
-
|
|
218
|
+
const flow = readMcpOAuthFlowCookie(event);
|
|
219
|
+
clearMcpOAuthFlowCookies(event);
|
|
222
220
|
if (providerError || !code || !state) {
|
|
223
221
|
setResponseStatus(event, 400);
|
|
224
222
|
return { error: "MCP OAuth authorization was not completed." };
|
|
@@ -275,8 +273,36 @@ async function handleMcpOAuthCallback(
|
|
|
275
273
|
}
|
|
276
274
|
}
|
|
277
275
|
|
|
278
|
-
function
|
|
279
|
-
|
|
276
|
+
export function setMcpOAuthFlowCookie(
|
|
277
|
+
event: H3Event,
|
|
278
|
+
flow: McpOAuthFlow,
|
|
279
|
+
secure: boolean,
|
|
280
|
+
): void {
|
|
281
|
+
const encrypted = encryptSecretValue(JSON.stringify(flow));
|
|
282
|
+
const chunkCount = Math.ceil(encrypted.length / FLOW_COOKIE_CHUNK_SIZE);
|
|
283
|
+
if (chunkCount > FLOW_COOKIE_MAX_CHUNKS) {
|
|
284
|
+
throw new Error("MCP OAuth flow state exceeds the cookie size limit.");
|
|
285
|
+
}
|
|
286
|
+
setChunkedCookie(event, FLOW_COOKIE, encrypted, {
|
|
287
|
+
httpOnly: true,
|
|
288
|
+
secure,
|
|
289
|
+
sameSite: "lax",
|
|
290
|
+
path: "/",
|
|
291
|
+
maxAge: FLOW_TTL_SECONDS,
|
|
292
|
+
chunkMaxLength: FLOW_COOKIE_CHUNK_SIZE,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export function readMcpOAuthFlowCookie(event: H3Event): McpOAuthFlow | null {
|
|
297
|
+
const primaryCookie = getCookie(event, FLOW_COOKIE);
|
|
298
|
+
if (!primaryCookie) return null;
|
|
299
|
+
if (primaryCookie.startsWith(CHUNKED_COOKIE_PREFIX)) {
|
|
300
|
+
const rawCount = primaryCookie.slice(CHUNKED_COOKIE_PREFIX.length);
|
|
301
|
+
if (!/^\d+$/.test(rawCount)) return null;
|
|
302
|
+
const chunkCount = Number(rawCount);
|
|
303
|
+
if (chunkCount < 2 || chunkCount > FLOW_COOKIE_MAX_CHUNKS) return null;
|
|
304
|
+
}
|
|
305
|
+
const encrypted = getChunkedCookie(event, FLOW_COOKIE);
|
|
280
306
|
if (!encrypted) return null;
|
|
281
307
|
try {
|
|
282
308
|
const parsed = JSON.parse(decryptSecretValue(encrypted)) as McpOAuthFlow;
|
|
@@ -286,6 +312,13 @@ function readFlow(event: H3Event): McpOAuthFlow | null {
|
|
|
286
312
|
}
|
|
287
313
|
}
|
|
288
314
|
|
|
315
|
+
export function clearMcpOAuthFlowCookies(event: H3Event): void {
|
|
316
|
+
deleteCookie(event, FLOW_COOKIE, { path: "/" });
|
|
317
|
+
for (let index = 1; index <= FLOW_COOKIE_MAX_CHUNKS; index += 1) {
|
|
318
|
+
deleteCookie(event, `${FLOW_COOKIE}.${index}`, { path: "/" });
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
289
322
|
export function isValidMcpOAuthFlow(
|
|
290
323
|
flow: McpOAuthFlow,
|
|
291
324
|
email: string,
|
|
@@ -201,7 +201,10 @@ export function resolveRealtimeVoiceReasoningEffort(
|
|
|
201
201
|
): "minimal" | "low" | "medium" {
|
|
202
202
|
const normalized = value?.trim().toLowerCase();
|
|
203
203
|
return normalized &&
|
|
204
|
-
Object.
|
|
204
|
+
Object.prototype.hasOwnProperty.call(
|
|
205
|
+
REALTIME_VOICE_REASONING_EFFORT,
|
|
206
|
+
normalized,
|
|
207
|
+
)
|
|
205
208
|
? REALTIME_VOICE_REASONING_EFFORT[
|
|
206
209
|
normalized as keyof typeof REALTIME_VOICE_REASONING_EFFORT
|
|
207
210
|
]
|
|
@@ -57,11 +57,13 @@ action before requesting microphone permission.
|
|
|
57
57
|
controls contain only settings and the separate end-session action.
|
|
58
58
|
- The orb's compact waveform stays visible for the full session and reflects
|
|
59
59
|
actual microphone or assistant audio activity. At silence it rests at its
|
|
60
|
-
baseline instead of turning into a loading spinner.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
baseline instead of turning into a loading spinner. Once connected, a soft,
|
|
61
|
+
slowly rotating blue glow marks the live session; brighten and speed up the
|
|
62
|
+
glow while the agent is working, and keep it static under reduced motion.
|
|
63
|
+
While connecting, show a distinct compact spinner; when the session becomes
|
|
64
|
+
live, the assistant gives one brief spoken greeting so readiness is
|
|
65
|
+
unambiguous. Do not apply a text-sized `max_output_tokens` cap to that audio
|
|
66
|
+
greeting because audio tokens can truncate it mid-sentence.
|
|
65
67
|
- The orb settings cog opens in place without ending voice mode or navigating
|
|
66
68
|
away. Nested pickers must not dismiss the settings popover. Language and
|
|
67
69
|
intelligence update the active Realtime session; the microphone picker swaps
|
|
@@ -42,7 +42,7 @@ export const CLI_REGISTRY: Record<string, CliEntry> = {
|
|
|
42
42
|
|
|
43
43
|
/** Check if a command name is in the CLI_REGISTRY allowlist */
|
|
44
44
|
export function isAllowedCommand(cmd: string): boolean {
|
|
45
|
-
return Object.
|
|
45
|
+
return Object.prototype.hasOwnProperty.call(CLI_REGISTRY, cmd);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/** Check if a CLI command exists on PATH (safe — no shell interpolation) */
|
package/src/vite/client.ts
CHANGED
|
@@ -732,7 +732,6 @@ function findCorePackageRoot(cwd: string): string | null {
|
|
|
732
732
|
const candidates = [
|
|
733
733
|
path.resolve(cwd, "../../packages/core"), // templates/<name>/
|
|
734
734
|
path.resolve(cwd, "../core"), // packages/<name>/
|
|
735
|
-
path.resolve(cwd, "node_modules/@agent-native/core"),
|
|
736
735
|
];
|
|
737
736
|
for (const candidate of candidates) {
|
|
738
737
|
try {
|
|
@@ -2315,6 +2314,165 @@ function portExposer(): Plugin {
|
|
|
2315
2314
|
};
|
|
2316
2315
|
}
|
|
2317
2316
|
|
|
2317
|
+
function isNitroEnvironmentUnavailable(error: unknown): boolean {
|
|
2318
|
+
const candidate = error as {
|
|
2319
|
+
name?: unknown;
|
|
2320
|
+
status?: unknown;
|
|
2321
|
+
statusCode?: unknown;
|
|
2322
|
+
message?: unknown;
|
|
2323
|
+
};
|
|
2324
|
+
return (
|
|
2325
|
+
candidate?.name === "NitroViteError" &&
|
|
2326
|
+
(candidate.status === 503 || candidate.statusCode === 503) &&
|
|
2327
|
+
typeof candidate.message === "string" &&
|
|
2328
|
+
/Vite environment .+ is unavailable/.test(candidate.message)
|
|
2329
|
+
);
|
|
2330
|
+
}
|
|
2331
|
+
|
|
2332
|
+
type NitroModuleNode = {
|
|
2333
|
+
id: string | null;
|
|
2334
|
+
ssrError?: Error | null;
|
|
2335
|
+
transformResult: unknown | null;
|
|
2336
|
+
};
|
|
2337
|
+
|
|
2338
|
+
type NitroModuleGraph = {
|
|
2339
|
+
idToModuleMap: Map<string, NitroModuleNode>;
|
|
2340
|
+
};
|
|
2341
|
+
|
|
2342
|
+
const NITRO_STARTUP_SETTLE_MS = 1_000;
|
|
2343
|
+
const NITRO_STARTUP_TIMEOUT_MS = 30_000;
|
|
2344
|
+
|
|
2345
|
+
function nitroModuleGraphSignature(environment: unknown): string | null {
|
|
2346
|
+
const graph = (environment as { moduleGraph?: NitroModuleGraph } | undefined)
|
|
2347
|
+
?.moduleGraph;
|
|
2348
|
+
if (!graph) return null;
|
|
2349
|
+
|
|
2350
|
+
const modules = [...graph.idToModuleMap.values()];
|
|
2351
|
+
const entry = modules.find((module) =>
|
|
2352
|
+
module.id
|
|
2353
|
+
?.replaceAll("\\", "/")
|
|
2354
|
+
.endsWith("/nitro/dist/runtime/internal/vite/dev-entry.mjs"),
|
|
2355
|
+
);
|
|
2356
|
+
if (!entry?.transformResult && !entry?.ssrError) return null;
|
|
2357
|
+
|
|
2358
|
+
let transformed = 0;
|
|
2359
|
+
let errors = 0;
|
|
2360
|
+
for (const module of modules) {
|
|
2361
|
+
if (module.transformResult) transformed += 1;
|
|
2362
|
+
if (module.ssrError) errors += 1;
|
|
2363
|
+
}
|
|
2364
|
+
return `${modules.length}:${transformed}:${errors}`;
|
|
2365
|
+
}
|
|
2366
|
+
|
|
2367
|
+
function isHtmlDocumentRequest(req: IncomingMessage): boolean {
|
|
2368
|
+
return (
|
|
2369
|
+
(req.method === "GET" || req.method === "HEAD") &&
|
|
2370
|
+
(req.headers.accept ?? "").includes("text/html")
|
|
2371
|
+
);
|
|
2372
|
+
}
|
|
2373
|
+
|
|
2374
|
+
function sendNitroStartingResponse(
|
|
2375
|
+
req: IncomingMessage,
|
|
2376
|
+
res: ServerResponse,
|
|
2377
|
+
): void {
|
|
2378
|
+
res.statusCode = 503;
|
|
2379
|
+
res.setHeader("cache-control", "no-store");
|
|
2380
|
+
res.setHeader("content-type", "text/html; charset=utf-8");
|
|
2381
|
+
res.setHeader("retry-after", "1");
|
|
2382
|
+
if (req.method === "HEAD") {
|
|
2383
|
+
res.end();
|
|
2384
|
+
return;
|
|
2385
|
+
}
|
|
2386
|
+
res.end(
|
|
2387
|
+
'<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="refresh" content="0.25"><title>Starting…</title></head><body></body></html>',
|
|
2388
|
+
);
|
|
2389
|
+
}
|
|
2390
|
+
|
|
2391
|
+
function nitroStartupGate(
|
|
2392
|
+
options: {
|
|
2393
|
+
now?: () => number;
|
|
2394
|
+
settleMs?: number;
|
|
2395
|
+
timeoutMs?: number;
|
|
2396
|
+
} = {},
|
|
2397
|
+
): Plugin {
|
|
2398
|
+
return {
|
|
2399
|
+
name: "agent-native-nitro-startup-gate",
|
|
2400
|
+
apply: "serve",
|
|
2401
|
+
enforce: "pre",
|
|
2402
|
+
configureServer(server) {
|
|
2403
|
+
const now = options.now ?? Date.now;
|
|
2404
|
+
const settleMs = options.settleMs ?? NITRO_STARTUP_SETTLE_MS;
|
|
2405
|
+
const timeoutMs = options.timeoutMs ?? NITRO_STARTUP_TIMEOUT_MS;
|
|
2406
|
+
const startedAt = now();
|
|
2407
|
+
let graphSignature: string | null = null;
|
|
2408
|
+
let graphStableAt: number | undefined;
|
|
2409
|
+
let startupComplete = false;
|
|
2410
|
+
|
|
2411
|
+
server.middlewares.use((req, res, next) => {
|
|
2412
|
+
if (startupComplete || !isHtmlDocumentRequest(req)) {
|
|
2413
|
+
next();
|
|
2414
|
+
return;
|
|
2415
|
+
}
|
|
2416
|
+
|
|
2417
|
+
const timestamp = now();
|
|
2418
|
+
if (timestamp - startedAt >= timeoutMs) {
|
|
2419
|
+
startupComplete = true;
|
|
2420
|
+
next();
|
|
2421
|
+
return;
|
|
2422
|
+
}
|
|
2423
|
+
|
|
2424
|
+
const nextGraphSignature = nitroModuleGraphSignature(
|
|
2425
|
+
server.environments?.nitro,
|
|
2426
|
+
);
|
|
2427
|
+
if (nextGraphSignature) {
|
|
2428
|
+
if (nextGraphSignature !== graphSignature) {
|
|
2429
|
+
graphSignature = nextGraphSignature;
|
|
2430
|
+
graphStableAt = timestamp;
|
|
2431
|
+
} else if (
|
|
2432
|
+
graphStableAt !== undefined &&
|
|
2433
|
+
timestamp - graphStableAt >= settleMs
|
|
2434
|
+
) {
|
|
2435
|
+
startupComplete = true;
|
|
2436
|
+
next();
|
|
2437
|
+
return;
|
|
2438
|
+
}
|
|
2439
|
+
} else {
|
|
2440
|
+
graphSignature = null;
|
|
2441
|
+
graphStableAt = undefined;
|
|
2442
|
+
}
|
|
2443
|
+
|
|
2444
|
+
sendNitroStartingResponse(req, res);
|
|
2445
|
+
});
|
|
2446
|
+
},
|
|
2447
|
+
};
|
|
2448
|
+
}
|
|
2449
|
+
|
|
2450
|
+
function nitroStartupRecovery(): Plugin {
|
|
2451
|
+
return {
|
|
2452
|
+
name: "agent-native-nitro-startup-recovery",
|
|
2453
|
+
apply: "serve",
|
|
2454
|
+
configureServer(server) {
|
|
2455
|
+
server.middlewares.use(function nitroStartupErrorRecovery(
|
|
2456
|
+
error: unknown,
|
|
2457
|
+
req: IncomingMessage,
|
|
2458
|
+
res: ServerResponse,
|
|
2459
|
+
next: (error?: unknown) => void,
|
|
2460
|
+
) {
|
|
2461
|
+
if (
|
|
2462
|
+
!isNitroEnvironmentUnavailable(error) ||
|
|
2463
|
+
!isHtmlDocumentRequest(req) ||
|
|
2464
|
+
res.headersSent
|
|
2465
|
+
) {
|
|
2466
|
+
next(error);
|
|
2467
|
+
return;
|
|
2468
|
+
}
|
|
2469
|
+
|
|
2470
|
+
sendNitroStartingResponse(req, res);
|
|
2471
|
+
});
|
|
2472
|
+
},
|
|
2473
|
+
};
|
|
2474
|
+
}
|
|
2475
|
+
|
|
2318
2476
|
/**
|
|
2319
2477
|
* Silence benign connection-reset noise from Vite's dev middleware.
|
|
2320
2478
|
* Fires when a browser closes/reloads/navigates mid-request — the peer has
|
|
@@ -2693,6 +2851,7 @@ function createAgentNativePlugins(
|
|
|
2693
2851
|
embedDevFrameHeaders(),
|
|
2694
2852
|
baseRedirectGuard(),
|
|
2695
2853
|
portExposer(),
|
|
2854
|
+
nitroStartupGate(),
|
|
2696
2855
|
silenceConnectionResets(),
|
|
2697
2856
|
rolldownInputFix(),
|
|
2698
2857
|
// Nitro Vite plugin for dev-mode API route serving and HMR.
|
|
@@ -2702,6 +2861,9 @@ function createAgentNativePlugins(
|
|
|
2702
2861
|
: includeNitro
|
|
2703
2862
|
? [nitroPlugin]
|
|
2704
2863
|
: []),
|
|
2864
|
+
// Nitro can reject the first document request while its Vite environment
|
|
2865
|
+
// is still importing. This error handler must follow Nitro's middleware.
|
|
2866
|
+
nitroStartupRecovery(),
|
|
2705
2867
|
includeReactTransform ? createReactTransformPlugin() : null,
|
|
2706
2868
|
createDesignSystemThemePlugin(options.designSystemTheme),
|
|
2707
2869
|
createTailwindPlugin(options),
|
|
@@ -3096,5 +3258,8 @@ export {
|
|
|
3096
3258
|
getDefaultOptimizeDeps as _getDefaultOptimizeDeps,
|
|
3097
3259
|
findCorePackageRoot as _findCorePackageRoot,
|
|
3098
3260
|
getReactRouterAliases as _getReactRouterAliases,
|
|
3261
|
+
nitroStartupGate as _nitroStartupGate,
|
|
3262
|
+
nitroStartupRecovery as _nitroStartupRecovery,
|
|
3263
|
+
nitroModuleGraphSignature as _nitroModuleGraphSignature,
|
|
3099
3264
|
debounceNitroFullReloadHotUpdate as _debounceNitroFullReloadHotUpdate,
|
|
3100
3265
|
};
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: agent-native-docs
|
|
3
|
-
description: >-
|
|
4
|
-
How to find version-matched Agent Native framework docs and source bundled in
|
|
5
|
-
node_modules. Use before implementing or answering questions about
|
|
6
|
-
@agent-native/core APIs, generated apps, workspaces, templates, or advanced
|
|
7
|
-
features.
|
|
8
|
-
scope: dev
|
|
9
|
-
metadata:
|
|
10
|
-
internal: true
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Agent Native Docs Lookup
|
|
14
|
-
|
|
15
|
-
## Rule
|
|
16
|
-
|
|
17
|
-
Before implementing or explaining non-trivial Agent Native behavior, read the
|
|
18
|
-
version-matched docs installed with `@agent-native/core`. When examples,
|
|
19
|
-
imports, or implementation details matter, inspect the packaged source corpus
|
|
20
|
-
too.
|
|
21
|
-
|
|
22
|
-
## Why
|
|
23
|
-
|
|
24
|
-
Generated apps and workspaces may be on a different framework version than the
|
|
25
|
-
public docs or model memory. The installed package is the source that matches
|
|
26
|
-
the app in front of you. It also includes a source-only corpus of core and
|
|
27
|
-
first-party templates so agents can replicate current best-practice patterns
|
|
28
|
-
without needing the framework monorepo checkout.
|
|
29
|
-
|
|
30
|
-
## How
|
|
31
|
-
|
|
32
|
-
From a generated app directory:
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
pnpm action docs-search --query "<feature>"
|
|
36
|
-
pnpm action docs-search --slug <slug>
|
|
37
|
-
pnpm action docs-search --list
|
|
38
|
-
pnpm action source-search --query "<pattern>"
|
|
39
|
-
pnpm action source-search --path templates/plan/AGENTS.md
|
|
40
|
-
pnpm action source-search --path toolkit/src/index.ts
|
|
41
|
-
pnpm action source-search --list
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
The headless `pnpm agent` loop and built-in app agent also expose a read-only
|
|
45
|
-
`docs-search` tool with the same `query`, `slug`, and `list` options, plus a
|
|
46
|
-
read-only `source-search` tool with `query`, `path`, and `list`.
|
|
47
|
-
|
|
48
|
-
If the action runner is unavailable, search the package directly:
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
rg -n "actions|automations|a2a|sharing" node_modules/@agent-native/core/docs
|
|
52
|
-
rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Then read `node_modules/@agent-native/core/docs/AGENTS.md` or the matching file
|
|
56
|
-
under `node_modules/@agent-native/core/docs/content/`. For source examples,
|
|
57
|
-
read files under `node_modules/@agent-native/core/corpus/core/` or
|
|
58
|
-
`node_modules/@agent-native/core/corpus/templates/`.
|
|
59
|
-
|
|
60
|
-
Toolkit source is searchable at `toolkit/` in the Core corpus and also ships as
|
|
61
|
-
readable TypeScript under `node_modules/@agent-native/toolkit/src/`. Read
|
|
62
|
-
`customizing-agent-native` before taking ownership of a shared component: inspect package
|
|
63
|
-
source as a read-only reference, then configure, compose, or eject the smallest
|
|
64
|
-
supported unit into app-owned source. Preserve public actions, application
|
|
65
|
-
state, auth, and agent-chat runtime contracts. Never edit `node_modules` or
|
|
66
|
-
deep-import its private source. Manual copying is only the fallback described by
|
|
67
|
-
an unknown third-party package's add-style blueprint.
|
|
68
|
-
|
|
69
|
-
## Reuse Proven Patterns (rg + cp)
|
|
70
|
-
|
|
71
|
-
Version-matched installed source outranks web docs or memory: it is the exact
|
|
72
|
-
code shipping with this app. `node_modules/@agent-native/core/corpus/templates/`
|
|
73
|
-
holds source for every first-party template, not just the one this app started
|
|
74
|
-
from, so a pattern from the mail template is fair game for a tasks app. Grep
|
|
75
|
-
across it, then copy a whole file as a starting point instead of writing the
|
|
76
|
-
pattern from scratch:
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
# Find how other templates solved a similar problem
|
|
80
|
-
rg -n "drag.*drop|reorder" node_modules/@agent-native/core/corpus/templates
|
|
81
|
-
|
|
82
|
-
# Grab a proven action file as a starting point, then adapt names/schema
|
|
83
|
-
cp node_modules/@agent-native/core/corpus/templates/mail/actions/archive-email.ts \
|
|
84
|
-
actions/archive-item.ts
|
|
85
|
-
|
|
86
|
-
# Read the full framework source behind an API, not just the corpus copy
|
|
87
|
-
rg -n "defineAction" node_modules/@agent-native/core/src/action.ts
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Copying template-level app code (actions, components, skill files) is the
|
|
91
|
-
expected reuse path — templates exist to be forked. This is different from
|
|
92
|
-
copying `core`/`toolkit` **runtime internals**: for those, follow
|
|
93
|
-
`customizing-agent-native`'s configure/compose/eject ladder instead of
|
|
94
|
-
hand-duplicating framework logic.
|
|
95
|
-
|
|
96
|
-
## Useful Slugs
|
|
97
|
-
|
|
98
|
-
| Need | Slugs |
|
|
99
|
-
| ------------------------------ | ------------------------------------------------------------- |
|
|
100
|
-
| Actions and typed client calls | `actions`, `client` |
|
|
101
|
-
| SQL, auth, access, sharing | `database`, `authentication`, `security`, `sharing` |
|
|
102
|
-
| UI state visible to the agent | `context-awareness` |
|
|
103
|
-
| Headless and chat-first apps | `pure-agent-apps`, `agent-surfaces`, `using-your-agent` |
|
|
104
|
-
| Automations and schedules | `automations`, `recurring-jobs` |
|
|
105
|
-
| Cross-app and external agents | `a2a-protocol`, `external-agents`, `mcp-protocol`, `mcp-apps` |
|
|
106
|
-
| Skills and instructions | `skills-guide`, `writing-agent-instructions` |
|
|
107
|
-
|
|
108
|
-
## Don't
|
|
109
|
-
|
|
110
|
-
- Do not rely on memory for framework APIs when package docs are present.
|
|
111
|
-
- Do not add custom REST wrappers for app data before reading `actions`.
|
|
112
|
-
- Do not add inline LLM calls before reading `using-your-agent` and
|
|
113
|
-
`agent-surfaces`.
|
|
114
|
-
- Do not copy framework runtime internals when a public API or narrow UI copy
|
|
115
|
-
will do; read `customizing-agent-native` for the supported override ladder.
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: agent-native-toolkit
|
|
3
|
-
description: >-
|
|
4
|
-
Inventory and ownership rules for shared Agent Native workspace UI. Use
|
|
5
|
-
before building app chrome, settings, navigation, sharing, collaboration,
|
|
6
|
-
setup, history, comments, chat rails, agent UX, or repeated workspace behavior.
|
|
7
|
-
scope: dev
|
|
8
|
-
metadata:
|
|
9
|
-
internal: true
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Agent-Native Toolkit
|
|
13
|
-
|
|
14
|
-
Use this skill when deciding whether app chrome, settings, collaboration,
|
|
15
|
-
sharing, navigation, organization, setup, history, comments, or agent UX should
|
|
16
|
-
be built app-locally or moved into reusable framework/toolkit pieces.
|
|
17
|
-
|
|
18
|
-
## Core Rule
|
|
19
|
-
|
|
20
|
-
Apps own domain models, domain actions, and product-specific workflows. The
|
|
21
|
-
framework and `@agent-native/toolkit` own repeated workspace behavior users
|
|
22
|
-
expect to work the same everywhere.
|
|
23
|
-
|
|
24
|
-
Move behavior into shared toolkit primitives when it is:
|
|
25
|
-
|
|
26
|
-
- workspace-wide, such as settings, nav, search, org membership, or setup
|
|
27
|
-
- agent-visible, such as context, actions, run progress, or proof-of-done
|
|
28
|
-
- governed, such as secrets, permissions, sharing, audit, or billing
|
|
29
|
-
- repeated by two or more apps
|
|
30
|
-
- not tied to one domain model
|
|
31
|
-
|
|
32
|
-
Keep behavior app-local when the abstraction would hide important domain
|
|
33
|
-
language or make a simple app-specific workflow harder to understand.
|
|
34
|
-
|
|
35
|
-
## Discover Before Building
|
|
36
|
-
|
|
37
|
-
Before creating an app-local version of repeated workspace or agent UI:
|
|
38
|
-
|
|
39
|
-
1. Check the reusable kits below and the installed package documentation.
|
|
40
|
-
2. Search installed public components and source with `docs-search` and
|
|
41
|
-
`source-search`.
|
|
42
|
-
3. Run `agent-native eject --list` to see the version-matched units published
|
|
43
|
-
by the packages installed in this app.
|
|
44
|
-
4. Read `customizing-agent-native` and configure, compose, or eject the
|
|
45
|
-
smallest unit instead of recreating shared behavior from memory.
|
|
46
|
-
|
|
47
|
-
Use public package exports at runtime. Published source and ejection manifests
|
|
48
|
-
are discovery and ownership-transfer mechanisms, not private runtime APIs.
|
|
49
|
-
|
|
50
|
-
## Design-System Boundary
|
|
51
|
-
|
|
52
|
-
Every app keeps an explicit design-system seam in `app/design-system.ts` using
|
|
53
|
-
`defineDesignSystem` from `@agent-native/toolkit/design-system`, and supplies it
|
|
54
|
-
to `ToolkitProvider`. The semantic contract contains:
|
|
55
|
-
|
|
56
|
-
- nine leaf components: `ActionButton`, `IconButton`, `TextField`, `TextArea`,
|
|
57
|
-
`Spinner`, `Skeleton`, `Status`, `Surface`, and `Avatar`
|
|
58
|
-
- eight behavior components: `Tooltip`, `Menu`, `Popover`, `Dialog`, `Picker`,
|
|
59
|
-
`Checkbox`, `Switch`, and `Tabs`
|
|
60
|
-
|
|
61
|
-
These are semantic contracts, not styling contracts. An adapter may use
|
|
62
|
-
Tailwind/shadcn, MUI-style theme providers, React Aria, CSS modules, CSS-in-JS,
|
|
63
|
-
or another React design system. Do not assume CVA, utility classes, or even a
|
|
64
|
-
`className`; behavior adapters may supply their overlay and focus
|
|
65
|
-
implementation wholesale while honoring portal, focus-restoration, keyboard,
|
|
66
|
-
dismissal, ARIA, and z-index interoperability.
|
|
67
|
-
|
|
68
|
-
Pages, routes, and domain components import ordinary controls through the app's
|
|
69
|
-
local adapter layer, usually `@/components/ui/*`. They must not import
|
|
70
|
-
`@agent-native/toolkit/ui/*` directly. Toolkit feature exports are still the
|
|
71
|
-
right home for shared workspace behavior; their presentation flows through the
|
|
72
|
-
registered semantic components, feature controller, and product-level slots.
|
|
73
|
-
|
|
74
|
-
Customer adapter packages are normal npm packages imported explicitly by the
|
|
75
|
-
app. Never auto-detect them or load React components from JSON. Run the adapter
|
|
76
|
-
against `@agent-native/toolkit/conformance` in customer CI before adopting it.
|
|
77
|
-
|
|
78
|
-
## Settings Direction
|
|
79
|
-
|
|
80
|
-
Durable settings belong in the Settings app or a registered settings route. The
|
|
81
|
-
agent sidebar should not become a second settings app. It can show contextual
|
|
82
|
-
quick controls and deep links such as:
|
|
83
|
-
|
|
84
|
-
- `/settings/ai`
|
|
85
|
-
- `/settings/connections`
|
|
86
|
-
- `/settings/secrets`
|
|
87
|
-
- `/settings/usage`
|
|
88
|
-
- `/settings/apps/:appId`
|
|
89
|
-
|
|
90
|
-
The shared Account section is the canonical profile surface at
|
|
91
|
-
`/settings#account`. It owns the editable display name and existing avatar
|
|
92
|
-
control through the authenticated `get-user-profile` and `update-user-profile`
|
|
93
|
-
actions. Shared workspace chrome such as `OrgSwitcher` should link to this
|
|
94
|
-
surface rather than creating an app-local profile page.
|
|
95
|
-
|
|
96
|
-
When adding a new API key, OAuth grant, provider connection, model selector, app
|
|
97
|
-
preference, notification preference, or usage/billing surface, register it as a
|
|
98
|
-
settings tab or app settings panel first. Only add sidebar UI when it is needed
|
|
99
|
-
in the moment of agent use.
|
|
100
|
-
|
|
101
|
-
## Reusable Kits
|
|
102
|
-
|
|
103
|
-
- **Settings kit**: a searchable settings page with account, workspace, AI
|
|
104
|
-
models, LLM keys, connections, secrets, usage, notifications, changelog, and
|
|
105
|
-
app-specific panels. Search is on by default; register a `SettingsSearchEntry`
|
|
106
|
-
per control so users find settings by name across tabs.
|
|
107
|
-
- **Collaboration kit**: Yjs docs, presence, agent presence, live cursors,
|
|
108
|
-
remote selections, recent edit highlights, real-time sync indicators, and
|
|
109
|
-
undo/redo grouping.
|
|
110
|
-
- **Sharing kit**: private/workspace/org/public-link access, invites, roles,
|
|
111
|
-
expirations, agent-readable links, and resource registration.
|
|
112
|
-
- **Navigation and command kit**: app shell, side nav, breadcrumbs, app switcher,
|
|
113
|
-
command palette entries, recent resources, pinned resources, and global search.
|
|
114
|
-
- **Organization kit**: folders, tags, favorites, archive, trash, ownership,
|
|
115
|
-
membership, and common resource metadata.
|
|
116
|
-
- **Setup and connections kit**: declarative setup requirements, model readiness,
|
|
117
|
-
missing-secret states, OAuth grants, and provider connection health.
|
|
118
|
-
- **Agent UX kit**: sidebar, composer, staged context, mentions, voice, human
|
|
119
|
-
approval, generative UI, progress, and screen-state exposure.
|
|
120
|
-
- **Chat history kit**: presentational chat lists and recent-chat rails belong
|
|
121
|
-
in Toolkit; Core keeps thread persistence, agent execution, transport, and
|
|
122
|
-
page-to-sidebar handoff. Use Toolkit's `ChatHistoryRail` for the standard
|
|
123
|
-
five-item sidebar preview and a footer row with New chat followed by an
|
|
124
|
-
ellipsis disclosure up to fifteen. Apps inject routing, labels, and domain
|
|
125
|
-
actions.
|
|
126
|
-
- **Agent page kit**: the full-page `/agent` surface (`AgentTabsPage` from
|
|
127
|
-
`@agent-native/core/client`) with Context, Files, Connections, Jobs, and
|
|
128
|
-
Access tabs plus a Personal/Organization scope toggle. The canonical home
|
|
129
|
-
for context transparency, MCP servers, A2A remote agents, recurring
|
|
130
|
-
jobs/automations, and external-client connect flows. See the `agent-page`
|
|
131
|
-
skill.
|
|
132
|
-
- **History and recovery kit**: audit log, activity feed, version history,
|
|
133
|
-
checkpoints, undo, redo, restore, and proof-of-done.
|
|
134
|
-
- **Comments and review kit**: anchored comments, pins, mentions, review
|
|
135
|
-
requests, resolved threads, agent follow-up tasks, and notifications.
|
|
136
|
-
- **Workflow and observability kit**: notifications, approvals, scheduled work,
|
|
137
|
-
background runs, recurring jobs, traces, evals, feedback, and run timelines.
|
|
138
|
-
|
|
139
|
-
## Implementation Checklist
|
|
140
|
-
|
|
141
|
-
When adding or refactoring one of these areas:
|
|
142
|
-
|
|
143
|
-
1. Search existing framework and template code for duplicated UI or actions.
|
|
144
|
-
2. Decide the shared contract: data shape, action API, feature-level headless
|
|
145
|
-
controller, default view, semantic components, and product-level render
|
|
146
|
-
slots.
|
|
147
|
-
3. Keep shared data provider-agnostic and scoped by auth/sharing rules.
|
|
148
|
-
4. Expose the same capability to the UI and agent through actions or documented
|
|
149
|
-
client helpers.
|
|
150
|
-
5. Register app-specific labels, routes, resource adapters, and settings panels
|
|
151
|
-
instead of hardcoding app names in core UI.
|
|
152
|
-
6. Update docs and relevant skills so future apps discover the shared path.
|
|
153
|
-
7. Keep the component easy to adopt piecemeal: expose props/slots first and
|
|
154
|
-
ship readable source plus a complete ejection unit so apps can take ownership
|
|
155
|
-
of the smallest feature when needed. See `customizing-agent-native` for the
|
|
156
|
-
configure → compose → eject → propose seam ladder.
|
|
157
|
-
8. Keep one controller as the source of truth for the default and custom render
|
|
158
|
-
paths. A custom design must not fork actions, analytics, async state, or
|
|
159
|
-
accessibility behavior.
|
|
160
|
-
9. Verify the default adapter and at least one non-Tailwind adapter with the
|
|
161
|
-
conformance kit, including focus and portal stacking across mixed overlay
|
|
162
|
-
implementations.
|
|
163
|
-
|
|
164
|
-
## Related Skills
|
|
165
|
-
|
|
166
|
-
Read these alongside this skill when the work touches the specific area:
|
|
167
|
-
|
|
168
|
-
- `sharing`
|
|
169
|
-
- `real-time-collab`
|
|
170
|
-
- `real-time-sync`
|
|
171
|
-
- `client-side-routing`
|
|
172
|
-
- `context-awareness`
|
|
173
|
-
- `onboarding`
|
|
174
|
-
- `secrets`
|
|
175
|
-
- `audit-log`
|
|
176
|
-
- `observability`
|
|
177
|
-
- `frontend-design`
|