@agent-native/core 0.118.0 → 0.119.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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +32 -0
- package/corpus/core/docs/content/a2a-protocol.mdx +15 -0
- package/corpus/core/docs/content/template-chat.mdx +1 -1
- package/corpus/core/docs/content/template-plan.mdx +3 -3
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/activity.ts +371 -0
- package/corpus/core/src/a2a/client.ts +35 -11
- package/corpus/core/src/a2a/index.ts +21 -0
- package/corpus/core/src/a2a/types.ts +8 -0
- package/corpus/core/src/agent/model-config.ts +19 -23
- package/corpus/core/src/agent/production-agent.ts +167 -100
- package/corpus/core/src/agent/types.ts +16 -1
- 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 +214 -44
- 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/chat-model-groups.ts +67 -27
- 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/sharing/ShareButton.tsx +1 -27
- package/corpus/core/src/client/sharing/ShareDialog.tsx +0 -16
- package/corpus/core/src/client/sharing/useShareButtonController.ts +0 -7
- package/corpus/core/src/client/sharing/useShareDialogController.ts +0 -2
- package/corpus/core/src/client/sse-event-processor.ts +85 -1
- 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 +7 -1
- package/corpus/core/src/mcp-client/oauth-routes.ts +45 -12
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -18
- package/corpus/core/src/scripts/call-agent.ts +49 -6
- package/corpus/core/src/server/agent-chat-plugin.ts +50 -10
- package/corpus/core/src/server/realtime-voice.ts +4 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
- 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/changelog/2026-07-23-fixed-recordings-failing-to-save-with-a-cancelled-or-cleanup.md +6 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
- package/corpus/templates/clips/server/plugins/db.ts +9 -1
- 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/activity.d.ts +50 -0
- package/dist/a2a/activity.d.ts.map +1 -0
- package/dist/a2a/activity.js +236 -0
- package/dist/a2a/activity.js.map +1 -0
- package/dist/a2a/client.d.ts +5 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +18 -13
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/index.d.ts +2 -1
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +1 -0
- package/dist/a2a/index.js.map +1 -1
- package/dist/a2a/types.d.ts +1 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts +2 -2
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/model-config.d.ts +16 -16
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +19 -23
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts +26 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +137 -80
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/types.d.ts +10 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.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 +76 -23
- 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/chat-model-groups.d.ts.map +1 -1
- package/dist/client/chat-model-groups.js +44 -21
- package/dist/client/chat-model-groups.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/sharing/ShareButton.d.ts +1 -1
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +3 -4
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +1 -2
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/sharing/useShareButtonController.d.ts +0 -1
- package/dist/client/sharing/useShareButtonController.d.ts.map +1 -1
- package/dist/client/sharing/useShareButtonController.js +0 -6
- package/dist/client/sharing/useShareButtonController.js.map +1 -1
- package/dist/client/sharing/useShareDialogController.d.ts +0 -1
- package/dist/client/sharing/useShareDialogController.d.ts.map +1 -1
- package/dist/client/sharing/useShareDialogController.js +0 -1
- package/dist/client/sharing/useShareDialogController.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +12 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +63 -1
- package/dist/client/sse-event-processor.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/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +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.d.ts +6 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +7 -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/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/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +1 -18
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +49 -6
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +38 -10
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- 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/a2a-protocol/SKILL.md +16 -0
- 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/docs/content/a2a-protocol.mdx +15 -0
- package/docs/content/template-chat.mdx +1 -1
- package/docs/content/template-plan.mdx +3 -3
- package/package.json +2 -2
- package/src/a2a/activity.ts +371 -0
- package/src/a2a/client.ts +35 -11
- package/src/a2a/index.ts +21 -0
- package/src/a2a/types.ts +8 -0
- package/src/agent/model-config.ts +19 -23
- package/src/agent/production-agent.ts +167 -100
- package/src/agent/types.ts +16 -1
- 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 +214 -44
- package/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
- package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
- package/src/client/chat-model-groups.ts +67 -27
- 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/sharing/ShareButton.tsx +1 -27
- package/src/client/sharing/ShareDialog.tsx +0 -16
- package/src/client/sharing/useShareButtonController.ts +0 -7
- package/src/client/sharing/useShareDialogController.ts +0 -2
- package/src/client/sse-event-processor.ts +85 -1
- 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 +7 -1
- package/src/mcp-client/oauth-routes.ts +45 -12
- package/src/scripts/agent-engines/list-agent-engines.ts +1 -18
- package/src/scripts/call-agent.ts +49 -6
- package/src/server/agent-chat-plugin.ts +50 -10
- package/src/server/realtime-voice.ts +4 -1
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
- 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/core/src/observability/hosted-model-experiment.ts +0 -118
- 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
- package/dist/observability/hosted-model-experiment.d.ts +0 -39
- package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
- package/dist/observability/hosted-model-experiment.js +0 -90
- package/dist/observability/hosted-model-experiment.js.map +0 -1
- package/src/observability/hosted-model-experiment.ts +0 -118
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
useActionMutation,
|
|
3
|
-
useActionQuery,
|
|
4
|
-
} from "@agent-native/core/client/hooks";
|
|
5
|
-
import { IconBookmark, IconPlus } from "@tabler/icons-react";
|
|
6
|
-
import { useState } from "react";
|
|
7
|
-
import { Link, useNavigate } from "react-router";
|
|
8
|
-
import { toast } from "sonner";
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
LoadingRows,
|
|
12
|
-
PageHeader,
|
|
13
|
-
SetupEmptyState,
|
|
14
|
-
} from "@/components/crm/Surface";
|
|
15
|
-
import { Badge } from "@/components/ui/badge";
|
|
16
|
-
import { Button } from "@/components/ui/button";
|
|
17
|
-
import {
|
|
18
|
-
Dialog,
|
|
19
|
-
DialogContent,
|
|
20
|
-
DialogDescription,
|
|
21
|
-
DialogFooter,
|
|
22
|
-
DialogHeader,
|
|
23
|
-
DialogTitle,
|
|
24
|
-
DialogTrigger,
|
|
25
|
-
} from "@/components/ui/dialog";
|
|
26
|
-
import { Input } from "@/components/ui/input";
|
|
27
|
-
import { Label } from "@/components/ui/label";
|
|
28
|
-
import {
|
|
29
|
-
Select,
|
|
30
|
-
SelectContent,
|
|
31
|
-
SelectItem,
|
|
32
|
-
SelectTrigger,
|
|
33
|
-
SelectValue,
|
|
34
|
-
} from "@/components/ui/select";
|
|
35
|
-
import { asText, type CrmKind, type CrmSavedView } from "@/lib/types";
|
|
36
|
-
|
|
37
|
-
export default function SavedViewsRoute() {
|
|
38
|
-
const viewsQuery = useActionQuery<unknown>(
|
|
39
|
-
"list-crm-saved-views" as never,
|
|
40
|
-
{} as never,
|
|
41
|
-
);
|
|
42
|
-
const views = normalizeSavedViews(viewsQuery.data);
|
|
43
|
-
return (
|
|
44
|
-
<>
|
|
45
|
-
<PageHeader
|
|
46
|
-
eyebrow="CRM"
|
|
47
|
-
title="Saved views"
|
|
48
|
-
description="Executable, permission-aware slices with optional data-program context."
|
|
49
|
-
actions={<CreateSavedViewDialog />}
|
|
50
|
-
/>
|
|
51
|
-
{viewsQuery.isLoading ? (
|
|
52
|
-
<LoadingRows rows={5} />
|
|
53
|
-
) : views.length ? (
|
|
54
|
-
<div className="grid gap-2 p-5 sm:grid-cols-2 sm:p-7 xl:grid-cols-3">
|
|
55
|
-
{views.map((view) => (
|
|
56
|
-
<Link
|
|
57
|
-
key={view.id}
|
|
58
|
-
to={`/${kindRoute(view.kind)}?view=${encodeURIComponent(view.id)}`}
|
|
59
|
-
className="group rounded-lg border border-border/70 bg-card p-4 transition-colors hover:bg-muted/50"
|
|
60
|
-
>
|
|
61
|
-
<div className="flex items-start gap-3">
|
|
62
|
-
<IconBookmark className="mt-0.5 size-4 text-muted-foreground" />
|
|
63
|
-
<div className="min-w-0">
|
|
64
|
-
<p className="truncate text-sm font-medium">{view.name}</p>
|
|
65
|
-
<p className="mt-1 line-clamp-2 text-sm text-muted-foreground">
|
|
66
|
-
{view.description || view.query || "Saved CRM view"}
|
|
67
|
-
</p>
|
|
68
|
-
<div className="mt-3 flex flex-wrap gap-2">
|
|
69
|
-
{view.kind ? (
|
|
70
|
-
<Badge
|
|
71
|
-
variant="secondary"
|
|
72
|
-
className="capitalize font-normal"
|
|
73
|
-
>
|
|
74
|
-
{view.kind}s
|
|
75
|
-
</Badge>
|
|
76
|
-
) : null}
|
|
77
|
-
{view.dataProgramId ? (
|
|
78
|
-
<Badge variant="outline" className="font-normal">
|
|
79
|
-
Data program
|
|
80
|
-
</Badge>
|
|
81
|
-
) : null}
|
|
82
|
-
</div>
|
|
83
|
-
</div>
|
|
84
|
-
</div>
|
|
85
|
-
</Link>
|
|
86
|
-
))}
|
|
87
|
-
</div>
|
|
88
|
-
) : (
|
|
89
|
-
<SetupEmptyState
|
|
90
|
-
title="No saved views yet"
|
|
91
|
-
description="Create a focused view with a record type, search, field filters, and optional data-program context."
|
|
92
|
-
/>
|
|
93
|
-
)}
|
|
94
|
-
</>
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function CreateSavedViewDialog() {
|
|
99
|
-
const navigate = useNavigate();
|
|
100
|
-
const [open, setOpen] = useState(false);
|
|
101
|
-
const [name, setName] = useState("");
|
|
102
|
-
const [description, setDescription] = useState("");
|
|
103
|
-
const [kind, setKind] = useState<CrmKind>("account");
|
|
104
|
-
const [query, setQuery] = useState("");
|
|
105
|
-
const [field, setField] = useState("");
|
|
106
|
-
const [value, setValue] = useState("");
|
|
107
|
-
const [dataProgramId, setDataProgramId] = useState("");
|
|
108
|
-
const save = useActionMutation<
|
|
109
|
-
{ id: string },
|
|
110
|
-
{
|
|
111
|
-
name: string;
|
|
112
|
-
description?: string;
|
|
113
|
-
kind: CrmKind;
|
|
114
|
-
filters?: Record<string, unknown>;
|
|
115
|
-
columns: string[];
|
|
116
|
-
sort: Array<{ field: string; direction: "desc" }>;
|
|
117
|
-
dataProgramId?: string;
|
|
118
|
-
}
|
|
119
|
-
>("save-crm-saved-view" as never);
|
|
120
|
-
|
|
121
|
-
async function saveView() {
|
|
122
|
-
const filters: Record<string, unknown> = {};
|
|
123
|
-
if (query.trim()) filters.query = query.trim();
|
|
124
|
-
if (field.trim() && value.trim()) {
|
|
125
|
-
filters.fieldEquals = { [field.trim()]: value.trim() };
|
|
126
|
-
}
|
|
127
|
-
try {
|
|
128
|
-
const saved = await save.mutateAsync({
|
|
129
|
-
name: name.trim(),
|
|
130
|
-
description: description.trim() || undefined,
|
|
131
|
-
kind,
|
|
132
|
-
filters: Object.keys(filters).length ? filters : undefined,
|
|
133
|
-
columns: [
|
|
134
|
-
"displayName",
|
|
135
|
-
"domain",
|
|
136
|
-
"primaryEmail",
|
|
137
|
-
"ownerName",
|
|
138
|
-
"stage",
|
|
139
|
-
"nextContactAt",
|
|
140
|
-
"remoteUpdatedAt",
|
|
141
|
-
],
|
|
142
|
-
sort: [{ field: "updatedAt", direction: "desc" }],
|
|
143
|
-
dataProgramId: dataProgramId.trim() || undefined,
|
|
144
|
-
});
|
|
145
|
-
setOpen(false);
|
|
146
|
-
toast.success("Saved view created.");
|
|
147
|
-
navigate(`/${kindRoute(kind)}?view=${encodeURIComponent(saved.id)}`);
|
|
148
|
-
} catch (error) {
|
|
149
|
-
toast.error(
|
|
150
|
-
error instanceof Error ? error.message : "View could not be saved.",
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
return (
|
|
156
|
-
<Dialog open={open} onOpenChange={setOpen}>
|
|
157
|
-
<DialogTrigger asChild>
|
|
158
|
-
<Button size="sm" className="gap-2">
|
|
159
|
-
<IconPlus className="size-4" /> New view
|
|
160
|
-
</Button>
|
|
161
|
-
</DialogTrigger>
|
|
162
|
-
<DialogContent className="sm:max-w-lg">
|
|
163
|
-
<DialogHeader>
|
|
164
|
-
<DialogTitle>Create saved view</DialogTitle>
|
|
165
|
-
<DialogDescription>
|
|
166
|
-
Views store bounded filters and presentation settings, not provider
|
|
167
|
-
rows.
|
|
168
|
-
</DialogDescription>
|
|
169
|
-
</DialogHeader>
|
|
170
|
-
<div className="grid gap-4 py-2 sm:grid-cols-2">
|
|
171
|
-
<Field label="Name" htmlFor="view-name" className="sm:col-span-2">
|
|
172
|
-
<Input
|
|
173
|
-
id="view-name"
|
|
174
|
-
value={name}
|
|
175
|
-
maxLength={120}
|
|
176
|
-
onChange={(event) => setName(event.target.value)}
|
|
177
|
-
/>
|
|
178
|
-
</Field>
|
|
179
|
-
<Field
|
|
180
|
-
label="Description"
|
|
181
|
-
htmlFor="view-description"
|
|
182
|
-
className="sm:col-span-2"
|
|
183
|
-
>
|
|
184
|
-
<Input
|
|
185
|
-
id="view-description"
|
|
186
|
-
value={description}
|
|
187
|
-
maxLength={500}
|
|
188
|
-
onChange={(event) => setDescription(event.target.value)}
|
|
189
|
-
/>
|
|
190
|
-
</Field>
|
|
191
|
-
<Field label="Record type" htmlFor="view-kind">
|
|
192
|
-
<Select
|
|
193
|
-
value={kind}
|
|
194
|
-
onValueChange={(next) => setKind(next as CrmKind)}
|
|
195
|
-
>
|
|
196
|
-
<SelectTrigger id="view-kind">
|
|
197
|
-
<SelectValue />
|
|
198
|
-
</SelectTrigger>
|
|
199
|
-
<SelectContent>
|
|
200
|
-
<SelectItem value="account">Accounts</SelectItem>
|
|
201
|
-
<SelectItem value="person">People</SelectItem>
|
|
202
|
-
<SelectItem value="opportunity">Opportunities</SelectItem>
|
|
203
|
-
</SelectContent>
|
|
204
|
-
</Select>
|
|
205
|
-
</Field>
|
|
206
|
-
<Field label="Search" htmlFor="view-query">
|
|
207
|
-
<Input
|
|
208
|
-
id="view-query"
|
|
209
|
-
value={query}
|
|
210
|
-
maxLength={120}
|
|
211
|
-
placeholder="Name contains…"
|
|
212
|
-
onChange={(event) => setQuery(event.target.value)}
|
|
213
|
-
/>
|
|
214
|
-
</Field>
|
|
215
|
-
<Field label="Field" htmlFor="view-field">
|
|
216
|
-
<Input
|
|
217
|
-
id="view-field"
|
|
218
|
-
value={field}
|
|
219
|
-
maxLength={120}
|
|
220
|
-
placeholder="stage"
|
|
221
|
-
onChange={(event) => setField(event.target.value)}
|
|
222
|
-
/>
|
|
223
|
-
</Field>
|
|
224
|
-
<Field label="Equals" htmlFor="view-value">
|
|
225
|
-
<Input
|
|
226
|
-
id="view-value"
|
|
227
|
-
value={value}
|
|
228
|
-
maxLength={240}
|
|
229
|
-
placeholder="Qualified"
|
|
230
|
-
onChange={(event) => setValue(event.target.value)}
|
|
231
|
-
/>
|
|
232
|
-
</Field>
|
|
233
|
-
<Field
|
|
234
|
-
label="Data program ID"
|
|
235
|
-
htmlFor="view-program"
|
|
236
|
-
className="sm:col-span-2"
|
|
237
|
-
>
|
|
238
|
-
<Input
|
|
239
|
-
id="view-program"
|
|
240
|
-
value={dataProgramId}
|
|
241
|
-
maxLength={128}
|
|
242
|
-
placeholder="Optional saved cross-source program"
|
|
243
|
-
onChange={(event) => setDataProgramId(event.target.value)}
|
|
244
|
-
/>
|
|
245
|
-
</Field>
|
|
246
|
-
</div>
|
|
247
|
-
<DialogFooter>
|
|
248
|
-
<Button
|
|
249
|
-
disabled={!name.trim() || save.isPending}
|
|
250
|
-
onClick={() => void saveView()}
|
|
251
|
-
>
|
|
252
|
-
Save and open
|
|
253
|
-
</Button>
|
|
254
|
-
</DialogFooter>
|
|
255
|
-
</DialogContent>
|
|
256
|
-
</Dialog>
|
|
257
|
-
);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
function Field({
|
|
261
|
-
label,
|
|
262
|
-
htmlFor,
|
|
263
|
-
className,
|
|
264
|
-
children,
|
|
265
|
-
}: {
|
|
266
|
-
label: string;
|
|
267
|
-
htmlFor: string;
|
|
268
|
-
className?: string;
|
|
269
|
-
children: React.ReactNode;
|
|
270
|
-
}) {
|
|
271
|
-
return (
|
|
272
|
-
<div className={`grid gap-2 ${className ?? ""}`}>
|
|
273
|
-
<Label htmlFor={htmlFor}>{label}</Label>
|
|
274
|
-
{children}
|
|
275
|
-
</div>
|
|
276
|
-
);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
function normalizeSavedViews(data: unknown): CrmSavedView[] {
|
|
280
|
-
const entries =
|
|
281
|
-
data &&
|
|
282
|
-
typeof data === "object" &&
|
|
283
|
-
Array.isArray((data as { views?: unknown[] }).views)
|
|
284
|
-
? (data as { views: unknown[] }).views
|
|
285
|
-
: [];
|
|
286
|
-
return entries.flatMap((entry) => {
|
|
287
|
-
if (!entry || typeof entry !== "object") return [];
|
|
288
|
-
const item = entry as Record<string, unknown>;
|
|
289
|
-
const id = asText(item.id);
|
|
290
|
-
const name = asText(item.name);
|
|
291
|
-
if (!id || !name) return [];
|
|
292
|
-
return [
|
|
293
|
-
{
|
|
294
|
-
id,
|
|
295
|
-
name,
|
|
296
|
-
description: asText(item.description),
|
|
297
|
-
kind: asKind(item.kind),
|
|
298
|
-
query: readableFilters(item.filters ?? item.query),
|
|
299
|
-
dataProgramId: asText(item.dataProgramId),
|
|
300
|
-
},
|
|
301
|
-
];
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
function readableFilters(value: unknown) {
|
|
306
|
-
if (typeof value === "string") {
|
|
307
|
-
try {
|
|
308
|
-
return readableFilters(JSON.parse(value) as unknown);
|
|
309
|
-
} catch {
|
|
310
|
-
return value;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
314
|
-
return undefined;
|
|
315
|
-
return Object.entries(value)
|
|
316
|
-
.slice(0, 4)
|
|
317
|
-
.map(([key, entry]) => `${key}: ${String(entry)}`)
|
|
318
|
-
.join(" · ");
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
function asKind(value: unknown): CrmKind | undefined {
|
|
322
|
-
return value === "account" || value === "person" || value === "opportunity"
|
|
323
|
-
? value
|
|
324
|
-
: undefined;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
function kindRoute(kind: CrmKind | undefined) {
|
|
328
|
-
return kind === "person"
|
|
329
|
-
? "people"
|
|
330
|
-
: kind === "opportunity"
|
|
331
|
-
? "opportunities"
|
|
332
|
-
: "accounts";
|
|
333
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { type RouteConfig, index, route } from "@react-router/dev/routes";
|
|
2
|
-
|
|
3
|
-
export default [
|
|
4
|
-
index("./routes/_index.tsx"),
|
|
5
|
-
route("accounts", "./routes/accounts.tsx"),
|
|
6
|
-
route("people", "./routes/people.tsx"),
|
|
7
|
-
route("opportunities", "./routes/opportunities.tsx"),
|
|
8
|
-
route("records/:recordId", "./routes/records.$recordId.tsx"),
|
|
9
|
-
route("tasks", "./routes/tasks.tsx"),
|
|
10
|
-
route("proposals", "./routes/proposals.tsx"),
|
|
11
|
-
route("views", "./routes/views.tsx"),
|
|
12
|
-
route("dashboard", "./routes/dashboard.tsx"),
|
|
13
|
-
route("ask", "./routes/ask.tsx"),
|
|
14
|
-
route("setup", "./routes/setup.tsx"),
|
|
15
|
-
route("settings/*", "./routes/settings.tsx"),
|
|
16
|
-
route("agent", "./routes/agent.tsx"),
|
|
17
|
-
] satisfies RouteConfig;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
-
"style": "default",
|
|
4
|
-
"rsc": false,
|
|
5
|
-
"tsx": true,
|
|
6
|
-
"tailwind": {
|
|
7
|
-
"config": "",
|
|
8
|
-
"css": "app/global.css",
|
|
9
|
-
"baseColor": "slate",
|
|
10
|
-
"cssVariables": true,
|
|
11
|
-
"prefix": ""
|
|
12
|
-
},
|
|
13
|
-
"aliases": {
|
|
14
|
-
"components": "@/components",
|
|
15
|
-
"utils": "@/lib/utils",
|
|
16
|
-
"ui": "@/components/ui",
|
|
17
|
-
"lib": "@/lib",
|
|
18
|
-
"hooks": "@/hooks"
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
# CRM kernel contract
|
|
2
|
-
|
|
3
|
-
This contract is the boundary for the Native SQL CRM and the HubSpot and
|
|
4
|
-
Salesforce companion implementations. It prevents either connected provider's
|
|
5
|
-
object model or permission semantics from becoming the product model.
|
|
6
|
-
|
|
7
|
-
## Canonical vocabulary
|
|
8
|
-
|
|
9
|
-
- **Connection**: an authorized workspace integration grant and provider
|
|
10
|
-
account. Tokens remain in workspace connections; CRM stores only the
|
|
11
|
-
connection id and non-secret account metadata. Native SQL uses a CRM-owned
|
|
12
|
-
native connection identity and never has an integration token.
|
|
13
|
-
- **Object definition**: a provider or CRM-owned schema for one object type,
|
|
14
|
-
including field types and effective capabilities for its authority.
|
|
15
|
-
- **Record**: one provider or native object instance. Canonical kinds are
|
|
16
|
-
`account`, `person`, `opportunity`, `activity`, `task`, and `custom`.
|
|
17
|
-
- **Relationship**: a directed edge between records. It preserves a provider
|
|
18
|
-
relationship id or source reference field and optional directional labels.
|
|
19
|
-
- **Interaction**: a bounded relationship event such as a meeting, call,
|
|
20
|
-
email, or note. Rich media remains in its source app/provider.
|
|
21
|
-
- **Evidence**: a URL/id plus bounded quote, timestamp, speaker, and source
|
|
22
|
-
metadata supporting a CRM claim. Evidence is not a transcript or media blob.
|
|
23
|
-
- **Signal**: a first-class, reviewable moment, call summary, or next step with
|
|
24
|
-
a bounded quote/summary, timestamp, confidence, detector/model metadata, and
|
|
25
|
-
an evidence reference. Signals never contain transcript bodies.
|
|
26
|
-
- **Cadence**: desired contact interval, last meaningful interaction, and next
|
|
27
|
-
contact date for an account or person.
|
|
28
|
-
- **Mirror**: a scoped local projection for fast lists, monitoring, joins, and
|
|
29
|
-
agent context. It is not a second ungoverned copy of the upstream CRM.
|
|
30
|
-
- **Local field**: a derived or user-authored field whose authority is CRM.
|
|
31
|
-
- **Mutation**: a typed create/update/delete/association request with an
|
|
32
|
-
idempotency key and optional expected remote revision.
|
|
33
|
-
- **Proposal**: a mutation awaiting review or an agent-generated preview.
|
|
34
|
-
|
|
35
|
-
The TypeScript source of truth is
|
|
36
|
-
[`shared/crm-contract.ts`](../../shared/crm-contract.ts).
|
|
37
|
-
|
|
38
|
-
## Identity and provenance
|
|
39
|
-
|
|
40
|
-
Connected-provider identity is the tuple:
|
|
41
|
-
|
|
42
|
-
`connection_id + provider + object_type + remote_id`
|
|
43
|
-
|
|
44
|
-
Native SQL record ids are opaque CRM-local identifiers with `provider: native`;
|
|
45
|
-
they are never sent upstream. Email and domain are matching
|
|
46
|
-
signals, not identity keys. Every mirrored field keeps field-level provenance:
|
|
47
|
-
provider, connection, object type, remote id, optional field name, observed
|
|
48
|
-
revision/time, and optional evidence reference.
|
|
49
|
-
|
|
50
|
-
Relationships preserve direction because HubSpot association type ids and
|
|
51
|
-
Salesforce reference fields are directional. Identity resolution may link two
|
|
52
|
-
records, but never merges provider identities or silently overwrites one
|
|
53
|
-
provider with another.
|
|
54
|
-
|
|
55
|
-
## Thin mirror and authority
|
|
56
|
-
|
|
57
|
-
The mirror contains only configured cohorts: selected pipelines, active
|
|
58
|
-
accounts, their linked people, explicitly linked records, recent interaction
|
|
59
|
-
metadata, and local-owned objects. List and monitoring views read from it;
|
|
60
|
-
record detail performs a read-through refresh; long-tail or exhaustive work
|
|
61
|
-
uses provider API requests and staged data programs.
|
|
62
|
-
|
|
63
|
-
Every mirrored record stores the remote revision, sync cursor/time, tombstone,
|
|
64
|
-
connection identity, and access-scope key. Upstream is authoritative in
|
|
65
|
-
Connected mode. In Hybrid mode, upstream remains authoritative for remote
|
|
66
|
-
fields while CRM is authoritative for `derived-local` and
|
|
67
|
-
`local-authoritative` fields. In Native SQL mode, CRM is authoritative for the
|
|
68
|
-
record and all CRM-owned fields; no remote revision, provider token, or sync
|
|
69
|
-
cursor is invented.
|
|
70
|
-
|
|
71
|
-
No raw provider response, audio, video, transcript, screenshot, base64 body, or
|
|
72
|
-
file payload is stored in CRM SQL.
|
|
73
|
-
|
|
74
|
-
## Call intelligence boundary
|
|
75
|
-
|
|
76
|
-
CRM may link one Clips artifact to several CRM records through separate scoped
|
|
77
|
-
evidence rows. Deterministic keyword detectors operate only on the bounded
|
|
78
|
-
stored excerpts. Smart detectors and summaries are delegated to agent chat;
|
|
79
|
-
server actions do not call a model. Delegated results are accepted only when
|
|
80
|
-
the run, record, tracker, and evidence scopes agree and every quote/timestamp
|
|
81
|
-
is grounded to the stored evidence excerpt. Clips retains recording,
|
|
82
|
-
transcript, consent, recovery, and media ownership.
|
|
83
|
-
|
|
84
|
-
The default-off Clips review recipe is scoped to one explicitly selected CRM
|
|
85
|
-
record. It may react to `clip.created` only after a human approves the exact
|
|
86
|
-
A2A activation call. The trigger is installed in Clips, where that event is
|
|
87
|
-
registered. It ignores the event URL and calls the access-checked
|
|
88
|
-
`prepare-crm-call-evidence` read action with the opaque clip id. CRM receives
|
|
89
|
-
only the returned durable HTTPS `/r/<id>` page, id, and capture time, then links
|
|
90
|
-
it to the selected record through `attach-call-evidence`. Media, transcripts,
|
|
91
|
-
temporary grants, inferred records, tasks, field updates, and provider writes
|
|
92
|
-
are outside this delegation. This preserves both CRM record ACLs and Clips page
|
|
93
|
-
access without duplicating source media.
|
|
94
|
-
|
|
95
|
-
## Field storage policy
|
|
96
|
-
|
|
97
|
-
Unknown fields are **not mirrored**. A field value enters the mirror only when
|
|
98
|
-
it is on the configured allow-list.
|
|
99
|
-
|
|
100
|
-
| Policy | Stored locally | Read behavior | Write authority |
|
|
101
|
-
| --------------------- | ----------------------------------------- | --------------------------------- | ------------------------------ |
|
|
102
|
-
| `mirrored` | Bounded typed value | Mirror, then read-through refresh | Provider |
|
|
103
|
-
| `remote-only` | Metadata, never the value | Fetch ephemerally from provider | Provider |
|
|
104
|
-
| `redacted` | Neither metadata value nor value | Do not fetch or expose | None |
|
|
105
|
-
| `derived-local` | Typed value plus provenance/evidence refs | Local | CRM computation |
|
|
106
|
-
| `local-authoritative` | Typed value | Local | Human or approved CRM workflow |
|
|
107
|
-
|
|
108
|
-
Sensitive fields default to `redacted`; other newly discovered fields default
|
|
109
|
-
to `remote-only`. An admin must explicitly allow-list a field as `mirrored`.
|
|
110
|
-
|
|
111
|
-
## Access-scope semantics
|
|
112
|
-
|
|
113
|
-
`ownableColumns()` and framework access checks provide the local privacy
|
|
114
|
-
boundary. Provider access remains a second, non-substitutable boundary.
|
|
115
|
-
|
|
116
|
-
Connected records and field projections carry the connection actor, grant id,
|
|
117
|
-
record-visibility mode, object CRUD capabilities, and hashes/fingerprints for
|
|
118
|
-
effective field and sharing access. A service-account mirror must not be shown
|
|
119
|
-
as though it inherited a human user's Salesforce sharing or field-level
|
|
120
|
-
permissions. Reads fail closed when the current access scope cannot be proven
|
|
121
|
-
compatible. Scope changes invalidate or quarantine affected mirror rows until
|
|
122
|
-
they are refreshed. Native SQL uses its CRM ownership/share scope and does not
|
|
123
|
-
claim or emulate an upstream provider permission.
|
|
124
|
-
|
|
125
|
-
## Write policy matrix
|
|
126
|
-
|
|
127
|
-
| Initiator and operation | Default decision | Required behavior |
|
|
128
|
-
| ------------------------------------------------------------------- | --------------------- | --------------------------------------------------------- |
|
|
129
|
-
| Human, direct scoped edit | Execute | Optimistic UI, conflict check, undo where possible, audit |
|
|
130
|
-
| Agent, local and reversible | Execute | Must pass access and stored policy; audit |
|
|
131
|
-
| Agent, provider and reversible | Propose | Preview first; execute only with delegated authority |
|
|
132
|
-
| Agent, bulk/destructive/ownership/amount/stage/external side effect | Require approval | Preview exact scope and changed fields; fail closed |
|
|
133
|
-
| Automation with stored policy | Execute inside policy | No per-run prompt; stop and propose/deny outside policy |
|
|
134
|
-
|
|
135
|
-
Named high-risk classes remain approval-gated even when routine provider writes
|
|
136
|
-
have delegated authority. A later policy version may add field-specific
|
|
137
|
-
delegation without weakening the destructive/bulk boundary. A human `execute`
|
|
138
|
-
decision assumes the initiating UI has already collected any required
|
|
139
|
-
destructive confirmation; the policy layer does not add a second prompt.
|
|
140
|
-
|
|
141
|
-
All mutations are idempotent, access-checked, audited, and record the actor,
|
|
142
|
-
policy decision, before/after field summary, provider response status, and
|
|
143
|
-
remote revision. Provider conflicts never overwrite silently.
|
|
144
|
-
|
|
145
|
-
`applyMutation` represents one logical record mutation, not one HTTP request.
|
|
146
|
-
Adapters may use provider batch endpoints internally. A future bulk action can
|
|
147
|
-
add an `applyMutations` adapter method without changing the single-mutation
|
|
148
|
-
contract.
|
|
149
|
-
|
|
150
|
-
## Provider-model validation
|
|
151
|
-
|
|
152
|
-
| Contract concern | Native SQL | HubSpot | Salesforce | Contract consequence |
|
|
153
|
-
| ----------------------------- | ----------------------------------------------- | --------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------- |
|
|
154
|
-
| Object names | Canonical CRM and generic custom object names | Built-ins plus numeric/custom object type ids | Standard and `__c` API names | `objectType` is an opaque case-preserving string |
|
|
155
|
-
| Record ids | CRM-local opaque id | String ids | 15/18-character string ids | Record refs preserve provider and opaque identity |
|
|
156
|
-
| Schema discovery | CRM-owned canonical schema | Properties and CRM schemas APIs | sObject/Object Info describe | Adapter returns object and field capabilities |
|
|
157
|
-
| Accounts/people/opportunities | Account/person/opportunity | Companies/contacts/deals | Account/Contact/Opportunity | Canonical kind is separate from provider object type |
|
|
158
|
-
| Relationships | CRM-directed edge | Directional association type ids and labels | Reference fields and child relationships | Directed edge preserves type, label, and source field |
|
|
159
|
-
| Custom objects | Generic display/link/write, no object authoring | Schema-discovered | `__c` and describe-discovered | V1 generic discover/search/display/link/write support |
|
|
160
|
-
| Remote revision | Local mutation version | `updatedAt` | `LastModifiedDate` or `SystemModstamp` | Revision is opaque; Native never claims a remote revision |
|
|
161
|
-
| Deletion | CRM tombstone/archive policy | Archived records | Deleted records/query-all semantics | Tombstone is first-class and sync-capability gated |
|
|
162
|
-
| Permissions | CRM ownership and sharing scope | OAuth scopes, object/property sensitivity | CRUD, FLS, record sharing | Access scope is stored and checked independently of local ACL |
|
|
163
|
-
| Conditional write | Local version check | Provider-specific conflict strategy | `If-Unmodified-Since`/revision-aware update where available | Adapter reports capability and never invents success |
|
|
164
|
-
|
|
165
|
-
Reference checks used for this validation:
|
|
166
|
-
|
|
167
|
-
- [HubSpot CRM objects and associations](https://developers.hubspot.com/docs/api-reference/latest/crm/understanding-the-crm)
|
|
168
|
-
- [HubSpot association definitions and labels](https://developers.hubspot.com/docs/api-reference/latest/crm/associations/associations-schema/guide)
|
|
169
|
-
- [Salesforce object metadata](https://developer.salesforce.com/docs/platform/graphql/guide/query-objectinfo.html)
|
|
170
|
-
- [Salesforce record queries and effective permissions](https://developer.salesforce.com/docs/platform/graphql/guide/query-record-objects.html)
|
|
171
|
-
- [Salesforce revision-aware record updates](https://developer.salesforce.com/docs/platform/lwc/guide/reference-update-record.html)
|
|
172
|
-
|
|
173
|
-
## Initial-scope boundary
|
|
174
|
-
|
|
175
|
-
This run builds Native SQL plus HubSpot and Salesforce Connected/Hybrid
|
|
176
|
-
companion behavior. Native SQL is the portable, local-authoritative replacement
|
|
177
|
-
path; it does not depend on or synchronize to HubSpot or Salesforce. Provider
|
|
178
|
-
migration, a full object-authoring engine, and a page builder remain out of
|
|
179
|
-
scope. Provider writes stay proposal-first until an adapter can prove the
|
|
180
|
-
required revision, access-scope, and approval guarantees.
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
# Learnings
|
|
2
|
-
|
|
3
|
-
<!-- This file is your app's memory. The AI reads it at the start of every conversation and updates it when it learns something new. -->
|
|
4
|
-
<!-- Your personal learnings.md is gitignored so preferences and private info stay local. -->
|
|
5
|
-
<!-- This defaults file is what new checkouts start with. -->
|