@agent-native/core 0.123.0 → 0.123.2
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 +1 -1
- package/corpus/core/CHANGELOG.md +24 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/templates-meta.ts +12 -0
- package/corpus/core/src/deploy/build.ts +8 -0
- package/corpus/core/src/server/builder-browser.ts +76 -0
- package/corpus/core/src/server/core-routes-plugin.ts +15 -5
- package/corpus/templates/assets/app/global.css +0 -4
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +195 -167
- package/corpus/templates/assets/changelog/2026-07-23-drafts-preview-panel-now-fills-the-full-width-with-a-large-p.md +6 -0
- package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +1 -0
- package/corpus/templates/content/actions/_builder-cms-write-client.ts +55 -9
- package/corpus/templates/content/actions/_database-source-utils.ts +756 -182
- package/corpus/templates/content/actions/change-content-database-source-role.ts +21 -20
- package/corpus/templates/content/actions/execute-builder-source-execution.ts +49 -8
- package/corpus/templates/content/actions/materialize-builder-required-fields.ts +42 -9
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +88 -90
- package/corpus/templates/content/actions/preview-builder-source-review.ts +4 -3
- package/corpus/templates/content/actions/refresh-content-database-source.ts +36 -9
- package/corpus/templates/content/actions/set-content-database-source-write-mode.ts +28 -24
- package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +62 -12
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +91 -16
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +15 -1
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +234 -44
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +194 -16
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +95 -42
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +4 -2
- package/corpus/templates/content/app/components/editor/extensions/CodeBlockNode.tsx +10 -166
- package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +32 -8
- package/corpus/templates/content/app/components/editor/extensions/VideoNode.ts +14 -0
- package/corpus/templates/content/app/components/editor/registrySlashItems.ts +5 -1
- package/corpus/templates/content/app/hooks/use-content-database.ts +59 -2
- package/corpus/templates/content/app/hooks/use-documents.ts +18 -26
- package/corpus/templates/content/app/root.tsx +1 -6
- package/corpus/templates/content/changelog/2026-07-24-builder-can-now-publish-approved-updates-to-entries-that-are.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-collection-loading-no-longer-restarts-from-the-begin.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-connections-now-complete-securely-from-netlify-deplo.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-draft-creation-now-scopes-execution-to-the-selected-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-review-now-distinguishes-preparing-a-safe-dry-run-from.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-source-imports-now-recover-from-a-transient-paginati.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-source-refresh-now-preserves-the-provider-bound-fiel.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-update-reviews-now-open-reliably-on-large-collection.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-write-policy-controls-now-reflect-successful-changes.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-date-properties-now-save-reliably-when-selected-with-the-nat.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-editor-slash-search-now-keeps-multi-word-block-names-open.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-exact-editor-slash-commands-now-execute-on-enter-even-if-the.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-new-collaborative-pages-now-save-their-first-edits.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-new-local-builder-rows-no-longer-remain-locked-behind-a-none.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-opening-or-closing-a-collaborative-document-no-longer-lets-u.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-selected-text-now-opens-the-link-editor-with-command-k-or-co.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-slash-menu-block-choices-no-longer-stall-pointer-interaction.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-uploaded-and-embedded-media-now-stay-intact-while-collaborative-document-drafts-save.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-video-link-insertion-now-keeps-its-source-panel-open-while-t.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-builder-publishing-now-shows-safe-validation-details-instead.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-builder-reviews-stay-responsive-on-large-collections-and-pre.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-collaborative-documents-no-longer-flash-duplicated-recent-bl.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-corrected-builder-updates-are-now-reviewed-separately-from-f.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-documents-now-remain-read-only-until-their-live-collaborativ.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-slash-command-menus-now-stay-reachable-when-editing-near-the.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-the-slash-menu-now-shows-one-clear-callout-choice-instead-of.md +6 -0
- package/corpus/templates/content/shared/api.ts +1 -0
- package/corpus/templates/content/shared/builder-mdx.ts +73 -16
- package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +177 -0
- package/corpus/templates/crm/.agents/skills/crm/SKILL.md +205 -0
- package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +220 -0
- package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/crm/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +122 -0
- package/corpus/templates/crm/.env.example +5 -0
- package/corpus/templates/crm/AGENTS.md +82 -0
- package/corpus/templates/crm/CHANGELOG.md +25 -0
- package/corpus/templates/crm/DEVELOPING.md +66 -0
- package/corpus/templates/crm/README.md +122 -0
- package/corpus/templates/crm/_gitignore +12 -0
- package/corpus/templates/crm/actions/_crm-action-utils.ts +98 -0
- package/corpus/templates/crm/actions/_crm-attribute-utils.ts +219 -0
- package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
- package/corpus/templates/crm/actions/_crm-data-program-actions.ts +15 -0
- package/corpus/templates/crm/actions/_crm-list-utils.ts +775 -0
- package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
- package/corpus/templates/crm/actions/add-crm-record-to-list.ts +164 -0
- package/corpus/templates/crm/actions/apply-crm-proposals.ts +291 -0
- package/corpus/templates/crm/actions/archive-crm-attribute.ts +69 -0
- package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
- package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
- package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
- package/corpus/templates/crm/actions/create-crm-attribute.ts +350 -0
- package/corpus/templates/crm/actions/create-crm-list.ts +194 -0
- package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
- package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
- package/corpus/templates/crm/actions/delete-crm-saved-view.ts +68 -0
- package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
- package/corpus/templates/crm/actions/estimate-crm-enrichment.ts +229 -0
- package/corpus/templates/crm/actions/find-crm-duplicates.ts +87 -0
- package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
- package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +35 -0
- package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
- package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
- package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
- package/corpus/templates/crm/actions/get-crm-record-page.ts +287 -0
- package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
- package/corpus/templates/crm/actions/get-crm-workspace.ts +364 -0
- package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
- package/corpus/templates/crm/actions/list-crm-attributes.ts +71 -0
- package/corpus/templates/crm/actions/list-crm-connections.ts +68 -0
- package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
- package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
- package/corpus/templates/crm/actions/list-crm-enrichment-slots.ts +28 -0
- package/corpus/templates/crm/actions/list-crm-list-entries.ts +192 -0
- package/corpus/templates/crm/actions/list-crm-lists.ts +80 -0
- package/corpus/templates/crm/actions/list-crm-proposals.ts +55 -0
- package/corpus/templates/crm/actions/list-crm-record-field-history.ts +201 -0
- package/corpus/templates/crm/actions/list-crm-record-values.ts +200 -0
- package/corpus/templates/crm/actions/list-crm-records.ts +103 -0
- package/corpus/templates/crm/actions/list-crm-saved-views.ts +66 -0
- package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
- package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
- package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
- package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
- package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
- package/corpus/templates/crm/actions/manage-crm-attribute-option.ts +272 -0
- package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
- package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
- package/corpus/templates/crm/actions/merge-crm-records.ts +691 -0
- package/corpus/templates/crm/actions/navigate.ts +54 -0
- package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
- package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
- package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
- package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
- package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
- package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
- package/corpus/templates/crm/actions/remove-crm-list-entry.ts +79 -0
- package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
- package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
- package/corpus/templates/crm/actions/run-crm-attribute-fill.ts +443 -0
- package/corpus/templates/crm/actions/run-crm-enrichment.ts +647 -0
- package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
- package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +265 -0
- package/corpus/templates/crm/actions/run.ts +7 -0
- package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
- package/corpus/templates/crm/actions/save-crm-saved-view.ts +296 -0
- package/corpus/templates/crm/actions/sync-crm.ts +146 -0
- package/corpus/templates/crm/actions/update-crm-attribute.ts +111 -0
- package/corpus/templates/crm/actions/update-crm-list-entry.ts +102 -0
- package/corpus/templates/crm/actions/update-crm-list.ts +97 -0
- package/corpus/templates/crm/actions/update-crm-record.ts +543 -0
- package/corpus/templates/crm/actions/view-screen.ts +324 -0
- package/corpus/templates/crm/agent-native.app-skill.json +69 -0
- package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
- package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +78 -0
- package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +220 -0
- package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +414 -0
- package/corpus/templates/crm/app/components/crm/RecordActions.tsx +648 -0
- package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +488 -0
- package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +232 -0
- package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +93 -0
- package/corpus/templates/crm/app/components/crm/Surface.tsx +97 -0
- package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
- package/corpus/templates/crm/app/components/crm/board/CrmBoard.tsx +988 -0
- package/corpus/templates/crm/app/components/crm/board/board-model.ts +399 -0
- package/corpus/templates/crm/app/components/crm/board/entry-filter.ts +150 -0
- package/corpus/templates/crm/app/components/crm/board/view-draft.ts +227 -0
- package/corpus/templates/crm/app/components/crm/grid/CrmGrid.tsx +1033 -0
- package/corpus/templates/crm/app/components/crm/grid/GridCell.tsx +620 -0
- package/corpus/templates/crm/app/components/crm/grid/clipboard.ts +84 -0
- package/corpus/templates/crm/app/components/crm/grid/model.ts +304 -0
- package/corpus/templates/crm/app/components/crm/grid/navigation.ts +220 -0
- package/corpus/templates/crm/app/components/crm/grid/query.ts +214 -0
- package/corpus/templates/crm/app/components/crm/record/AttributePanel.tsx +192 -0
- package/corpus/templates/crm/app/components/crm/record/FieldHistory.tsx +179 -0
- package/corpus/templates/crm/app/components/crm/record/RecordHeader.tsx +103 -0
- package/corpus/templates/crm/app/components/crm/record/RecordLists.tsx +235 -0
- package/corpus/templates/crm/app/components/crm/record/RecordTabs.tsx +206 -0
- package/corpus/templates/crm/app/components/crm/record/field-editors.tsx +245 -0
- package/corpus/templates/crm/app/components/crm/record/record-data.ts +603 -0
- package/corpus/templates/crm/app/components/crm/settings/AdvancedSettings.tsx +49 -0
- package/corpus/templates/crm/app/components/crm/settings/AttributeOptionsEditor.tsx +441 -0
- package/corpus/templates/crm/app/components/crm/settings/ConnectionSettings.tsx +169 -0
- package/corpus/templates/crm/app/components/crm/settings/FieldsSettings.tsx +935 -0
- package/corpus/templates/crm/app/components/crm/settings/ListsSettings.tsx +339 -0
- package/corpus/templates/crm/app/components/crm/settings/settings-admin.ts +377 -0
- package/corpus/templates/crm/app/components/crm/shared/AttributeValueParts.tsx +69 -0
- package/corpus/templates/crm/app/components/crm/shared/attribute-value.ts +591 -0
- package/corpus/templates/crm/app/components/layout/CrmCommandMenu.tsx +556 -0
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +130 -0
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +407 -0
- package/corpus/templates/crm/app/components/layout/command-palette-search.ts +126 -0
- package/corpus/templates/crm/app/components/layout/crm-ui-intents.ts +41 -0
- package/corpus/templates/crm/app/components/layout/sidebar-collapse.ts +40 -0
- package/corpus/templates/crm/app/components/layout/sidebar-lists.ts +109 -0
- package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/button.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/card.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/hover-card.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/input.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/label.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/select.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/table.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +17 -0
- package/corpus/templates/crm/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/crm/app/design-system.ts +3 -0
- package/corpus/templates/crm/app/entry.client.tsx +19 -0
- package/corpus/templates/crm/app/entry.server.tsx +10 -0
- package/corpus/templates/crm/app/global.css +167 -0
- package/corpus/templates/crm/app/hooks/use-keyboard-shortcuts.ts +206 -0
- package/corpus/templates/crm/app/hooks/use-navigation-state.ts +48 -0
- package/corpus/templates/crm/app/i18n/en-US.ts +684 -0
- package/corpus/templates/crm/app/i18n/index.ts +34 -0
- package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
- package/corpus/templates/crm/app/lib/navigation.ts +17 -0
- package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
- package/corpus/templates/crm/app/lib/types.ts +172 -0
- package/corpus/templates/crm/app/lib/utils.ts +1 -0
- package/corpus/templates/crm/app/root.tsx +93 -0
- package/corpus/templates/crm/app/routes/_index.tsx +26 -0
- package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
- package/corpus/templates/crm/app/routes/agent.tsx +5 -0
- package/corpus/templates/crm/app/routes/ask.tsx +53 -0
- package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
- package/corpus/templates/crm/app/routes/lists.tsx +228 -0
- package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
- package/corpus/templates/crm/app/routes/people.tsx +41 -0
- package/corpus/templates/crm/app/routes/proposals.tsx +388 -0
- package/corpus/templates/crm/app/routes/records.$recordId.tsx +53 -0
- package/corpus/templates/crm/app/routes/records.tsx +64 -0
- package/corpus/templates/crm/app/routes/settings.tsx +118 -0
- package/corpus/templates/crm/app/routes/setup.tsx +308 -0
- package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
- package/corpus/templates/crm/app/routes/views.tsx +683 -0
- package/corpus/templates/crm/app/routes.ts +19 -0
- package/corpus/templates/crm/app/vite-env.d.ts +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-any-list-or-view-can-be-shown-as-a-board-grouped-by-stage-so.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-crm-now-finds-likely-duplicate-records-and-tells-you-exactly.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-enrichment-now-shows-what-a-run-will-cost-before-it-starts-g.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-lists-turn-any-set-of-records-into-a-pipeline-with-its-own-s.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-moving-a-record-or-list-entry-into-a-stage-that-was-retired-.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-opening-a-record-now-shows-one-page-with-its-fields-the-list.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-press-cmd-k-to-jump-to-any-record-list-view-or-setting-and-u.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-provider-record-edits-now-show-an-exact-before-after-diff-an.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-record-page-attribute-labels-now-read-in-full-instead-of-bei.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-records-now-use-typed-fields-currency-dates-ratings-status-s.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-retyping-a-value-on-the-record-page-now-replaces-it-instead-.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-settings-now-has-fields-and-lists-tabs-for-adding-fields-edi.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-the-proposal-review-now-shows-the-field-that-actually-change.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-the-record-grid-is-now-a-real-spreadsheet-filter-sort-and-pa.md +6 -0
- package/corpus/templates/crm/components.json +20 -0
- package/corpus/templates/crm/docs/architecture/crm-contract.md +214 -0
- package/corpus/templates/crm/docs/features/README.md +55 -0
- package/corpus/templates/crm/docs/features/f1-records-and-fields.mdx +52 -0
- package/corpus/templates/crm/docs/features/f2-lists-pipelines-and-views.mdx +48 -0
- package/corpus/templates/crm/docs/features/f3-work-and-record-quality.mdx +40 -0
- package/corpus/templates/crm/docs/features/f4-evidence-and-chat.mdx +47 -0
- package/corpus/templates/crm/learnings.defaults.md +5 -0
- package/corpus/templates/crm/netlify.toml +11 -0
- package/corpus/templates/crm/package.json +61 -0
- package/corpus/templates/crm/public/favicon.svg +1 -0
- package/corpus/templates/crm/public/icon-180.svg +1 -0
- package/corpus/templates/crm/public/manifest.json +11 -0
- package/corpus/templates/crm/react-router.config.ts +7 -0
- package/corpus/templates/crm/server/crm/adapter.ts +32 -0
- package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
- package/corpus/templates/crm/server/crm/crm-mirror.ts +721 -0
- package/corpus/templates/crm/server/crm/field-policy-attributes.ts +48 -0
- package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1146 -0
- package/corpus/templates/crm/server/crm/native-adapter.ts +1810 -0
- package/corpus/templates/crm/server/crm/provider-record-link.ts +264 -0
- package/corpus/templates/crm/server/crm/read-through.ts +207 -0
- package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
- package/corpus/templates/crm/server/db/crm-store.ts +1112 -0
- package/corpus/templates/crm/server/db/index.ts +191 -0
- package/corpus/templates/crm/server/db/schema.ts +647 -0
- package/corpus/templates/crm/server/lib/crm-query.ts +1558 -0
- package/corpus/templates/crm/server/lib/dedupe.ts +714 -0
- package/corpus/templates/crm/server/lib/enrichment-cost.ts +381 -0
- package/corpus/templates/crm/server/lib/enrichment-slots.ts +519 -0
- package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
- package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
- package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +94 -0
- package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +39 -0
- package/corpus/templates/crm/server/lib/intelligence/summary.ts +19 -0
- package/corpus/templates/crm/server/lib/lifecycle.ts +634 -0
- package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
- package/corpus/templates/crm/server/middleware/auth.ts +4 -0
- package/corpus/templates/crm/server/plugins/agent-chat.ts +65 -0
- package/corpus/templates/crm/server/plugins/auth.ts +14 -0
- package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
- package/corpus/templates/crm/server/plugins/db.ts +738 -0
- package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
- package/corpus/templates/crm/shared/crm-attributes.ts +469 -0
- package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
- package/corpus/templates/crm/shared/crm-contract.ts +417 -0
- package/corpus/templates/crm/shared/crm-navigation.ts +190 -0
- package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
- package/corpus/templates/crm/ssr-entry.ts +11 -0
- package/corpus/templates/crm/tsconfig.json +24 -0
- package/corpus/templates/crm/vite.config.ts +15 -0
- package/corpus/templates/crm/vitest.config.ts +5 -0
- package/corpus/templates/design/app/i18n-data.ts +12 -12
- package/corpus/templates/design/changelog/2026-07-26-apply-design-updates-from-a-centered-top-toolbar-without-cov.md +6 -0
- package/corpus/toolkit/CHANGELOG.md +6 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/editor/useCollabReconcile.ts +14 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +12 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/collab/routes.d.ts +2 -2
- package/dist/deploy/build.js +6 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/server/builder-browser.d.ts +13 -0
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +59 -0
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +10 -5
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/package.json +2 -2
- package/src/cli/templates-meta.ts +12 -0
- package/src/deploy/build.ts +8 -0
- package/src/server/builder-browser.ts +76 -0
- package/src/server/core-routes-plugin.ts +15 -5
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: fixed
|
|
3
|
+
date: 2026-07-26
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Moving a record or list entry into a stage that was retired or never declared is now refused with the reason and the stages you can pick, and a stage somebody else moved in the meantime is reported instead of being overwritten
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
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
|
+
It is the _design_ record: identity, field policy, access scope, the write
|
|
8
|
+
matrix, and the provider-model validation behind them. The operating rules an
|
|
9
|
+
agent follows every turn live in [`AGENTS.md`](../../AGENTS.md), and the
|
|
10
|
+
workflows behind them in the [`crm` skill](../../.agents/skills/crm/SKILL.md).
|
|
11
|
+
Those two are the single source; this document explains _why_ they say what they
|
|
12
|
+
say and must not restate them differently.
|
|
13
|
+
|
|
14
|
+
## Canonical vocabulary
|
|
15
|
+
|
|
16
|
+
- **Connection**: an authorized workspace integration grant and provider
|
|
17
|
+
account. Tokens remain in workspace connections; CRM stores only the
|
|
18
|
+
connection id and non-secret account metadata. Native SQL uses a CRM-owned
|
|
19
|
+
native connection identity and never has an integration token.
|
|
20
|
+
- **Object definition**: a provider or CRM-owned schema for one object type,
|
|
21
|
+
including field types and effective capabilities for its authority.
|
|
22
|
+
- **Attribute**: one typed field definition on an object type or a list. Its
|
|
23
|
+
type comes from the registry in `shared/crm-attributes.ts`; its `apiSlug` and
|
|
24
|
+
type are immutable once assigned, because every stored value row is keyed and
|
|
25
|
+
typed by them. Authority is `provider`, `derived-local`, or
|
|
26
|
+
`local-authoritative` per attribute — this, not the connection mode, is what
|
|
27
|
+
decides who may write a field.
|
|
28
|
+
- **Attribute option**: a managed allowed value for a `status` or `select`
|
|
29
|
+
attribute, optionally carrying a stage SLA (`targetDays`). Options are never
|
|
30
|
+
auto-created by a value write; an unknown value is a typed 422.
|
|
31
|
+
- **Field value**: bitemporal. A change closes the current row (`activeUntil`)
|
|
32
|
+
and opens a new one (`activeFrom`) with its actor and provenance, so value
|
|
33
|
+
history and stage history are the same thing. An equal write is suppressed
|
|
34
|
+
entirely. `historyTracked = false` opts a churny mirror field out of history
|
|
35
|
+
by updating in place; that is not the same as "never changed".
|
|
36
|
+
- **Record**: one provider or native object instance. Canonical kinds are
|
|
37
|
+
`account`, `person`, `opportunity`, `activity`, `task`, and `custom`.
|
|
38
|
+
- **List**: a workflow overlay over exactly one object type, with its own entry
|
|
39
|
+
attributes. **List entry**: one record's membership in a list, holding that
|
|
40
|
+
list's attribute values. Lists and entries are local-authoritative on every
|
|
41
|
+
backend including HubSpot and Salesforce, so a pipeline never requires a
|
|
42
|
+
provider write. There is deliberately no unique constraint on
|
|
43
|
+
`(list_id, record_id)`: two open deals for one company are two entries.
|
|
44
|
+
- **Saved view**: stored filter, ordered sort, columns, audience, and a `table`
|
|
45
|
+
or `board` presentation (a board groups by a status attribute). A filter
|
|
46
|
+
condition value may be the literal `"@currentUser"`, resolved server-side
|
|
47
|
+
against the calling actor.
|
|
48
|
+
- **Relationship**: a directed edge between records. It preserves a provider
|
|
49
|
+
relationship id or source reference field and optional directional labels.
|
|
50
|
+
- **Interaction**: a bounded relationship event such as a meeting, call,
|
|
51
|
+
email, or note. Rich media remains in its source app/provider.
|
|
52
|
+
- **Evidence**: a URL/id plus bounded quote, timestamp, speaker, and source
|
|
53
|
+
metadata supporting a CRM claim. Evidence is not a transcript or media blob.
|
|
54
|
+
- **Signal**: a first-class, reviewable moment, call summary, or next step with
|
|
55
|
+
a bounded quote/summary, timestamp, confidence, detector/model metadata, and
|
|
56
|
+
an evidence reference. Signals never contain transcript bodies.
|
|
57
|
+
- **Cadence**: desired contact interval, last meaningful interaction, and next
|
|
58
|
+
contact date for an account or person.
|
|
59
|
+
- **Mirror**: a scoped local projection for fast lists, monitoring, joins, and
|
|
60
|
+
agent context. It is not a second ungoverned copy of the upstream CRM.
|
|
61
|
+
- **Local field**: a derived or user-authored field whose authority is CRM.
|
|
62
|
+
- **Mutation**: a typed create/update/delete/association request with an
|
|
63
|
+
idempotency key and optional expected remote revision.
|
|
64
|
+
- **Proposal**: a mutation awaiting review or an agent-generated preview.
|
|
65
|
+
|
|
66
|
+
The TypeScript source of truth is
|
|
67
|
+
[`shared/crm-contract.ts`](../../shared/crm-contract.ts).
|
|
68
|
+
|
|
69
|
+
## Identity and provenance
|
|
70
|
+
|
|
71
|
+
Connected-provider identity is the tuple:
|
|
72
|
+
|
|
73
|
+
`connection_id + provider + object_type + remote_id`
|
|
74
|
+
|
|
75
|
+
Native SQL record ids are opaque CRM-local identifiers with `provider: native`;
|
|
76
|
+
they are never sent upstream. Email and domain are matching
|
|
77
|
+
signals, not identity keys. Every mirrored field keeps field-level provenance:
|
|
78
|
+
provider, connection, object type, remote id, optional field name, observed
|
|
79
|
+
revision/time, and optional evidence reference.
|
|
80
|
+
|
|
81
|
+
Relationships preserve direction because HubSpot association type ids and
|
|
82
|
+
Salesforce reference fields are directional. Identity resolution may link two
|
|
83
|
+
records, but never merges provider identities or silently overwrites one
|
|
84
|
+
provider with another.
|
|
85
|
+
|
|
86
|
+
## Thin mirror and authority
|
|
87
|
+
|
|
88
|
+
The mirror contains only configured cohorts: selected pipelines, active
|
|
89
|
+
accounts, their linked people, explicitly linked records, recent interaction
|
|
90
|
+
metadata, and local-owned objects. List and monitoring views read from it;
|
|
91
|
+
record detail performs a read-through refresh; long-tail or exhaustive work
|
|
92
|
+
uses provider API requests and staged data programs.
|
|
93
|
+
|
|
94
|
+
Every mirrored record stores the remote revision, sync cursor/time, tombstone,
|
|
95
|
+
connection identity, and access-scope key. Upstream is authoritative for every
|
|
96
|
+
attribute whose authority is `provider`; CRM is authoritative for
|
|
97
|
+
`derived-local` and `local-authoritative` attributes, and for all lists, list
|
|
98
|
+
entries, and entry values regardless of backend. In Native SQL mode CRM is
|
|
99
|
+
authoritative for the record and all its fields; no remote revision, provider
|
|
100
|
+
token, or sync cursor is invented.
|
|
101
|
+
|
|
102
|
+
Authority is per attribute, which is what the `hybrid` connection mode was for.
|
|
103
|
+
That mode is deprecated: the enum value stays for rows already carrying it
|
|
104
|
+
(schema changes are additive), it is no longer offered or documented, and it
|
|
105
|
+
must be read as `mirrored`.
|
|
106
|
+
|
|
107
|
+
No raw provider response, audio, video, transcript, screenshot, base64 body, or
|
|
108
|
+
file payload is stored in CRM SQL.
|
|
109
|
+
|
|
110
|
+
## Call intelligence boundary
|
|
111
|
+
|
|
112
|
+
CRM may link one Clips artifact to several CRM records through separate scoped
|
|
113
|
+
evidence rows. Deterministic keyword detectors operate only on the bounded
|
|
114
|
+
stored excerpts. Smart detectors and summaries are delegated to agent chat;
|
|
115
|
+
server actions do not call a model. Delegated results are accepted only when
|
|
116
|
+
the run, record, tracker, and evidence scopes agree and every quote/timestamp
|
|
117
|
+
is grounded to the stored evidence excerpt. Clips retains recording,
|
|
118
|
+
transcript, consent, recovery, and media ownership.
|
|
119
|
+
|
|
120
|
+
The default-off Clips review recipe is scoped to one explicitly selected CRM
|
|
121
|
+
record, and its trigger is installed in Clips because that is where
|
|
122
|
+
`clip.created` is registered. The contract's requirement is only that CRM
|
|
123
|
+
receives an opaque id and a durable page reference — never media, a transcript,
|
|
124
|
+
a temporary grant, an inferred record, or a provider write — so both CRM record
|
|
125
|
+
ACLs and Clips page access hold without duplicating source media. The exact
|
|
126
|
+
activation sequence is in the `crm` skill.
|
|
127
|
+
|
|
128
|
+
## Field storage policy
|
|
129
|
+
|
|
130
|
+
Unknown fields are **not mirrored**. A field value enters the mirror only when
|
|
131
|
+
it is on the configured allow-list.
|
|
132
|
+
|
|
133
|
+
| Policy | Stored locally | Read behavior | Write authority |
|
|
134
|
+
| --------------------- | ----------------------------------------- | --------------------------------- | ------------------------------ |
|
|
135
|
+
| `mirrored` | Bounded typed value | Mirror, then read-through refresh | Provider |
|
|
136
|
+
| `remote-only` | Metadata, never the value | Fetch ephemerally from provider | Provider |
|
|
137
|
+
| `redacted` | Neither metadata value nor value | Do not fetch or expose | None |
|
|
138
|
+
| `derived-local` | Typed value plus provenance/evidence refs | Local | CRM computation |
|
|
139
|
+
| `local-authoritative` | Typed value | Local | Human or approved CRM workflow |
|
|
140
|
+
|
|
141
|
+
Sensitive fields default to `redacted`; other newly discovered fields default
|
|
142
|
+
to `remote-only`. An admin must explicitly allow-list a field as `mirrored`.
|
|
143
|
+
|
|
144
|
+
## Access-scope semantics
|
|
145
|
+
|
|
146
|
+
`ownableColumns()` and framework access checks provide the local privacy
|
|
147
|
+
boundary. Provider access remains a second, non-substitutable boundary.
|
|
148
|
+
|
|
149
|
+
Connected records and field projections carry the connection actor, grant id,
|
|
150
|
+
record-visibility mode, object CRUD capabilities, and hashes/fingerprints for
|
|
151
|
+
effective field and sharing access. A service-account mirror must not be shown
|
|
152
|
+
as though it inherited a human user's Salesforce sharing or field-level
|
|
153
|
+
permissions. Reads fail closed when the current access scope cannot be proven
|
|
154
|
+
compatible. Scope changes invalidate or quarantine affected mirror rows until
|
|
155
|
+
they are refreshed. Native SQL uses its CRM ownership/share scope and does not
|
|
156
|
+
claim or emulate an upstream provider permission.
|
|
157
|
+
|
|
158
|
+
## Write policy matrix
|
|
159
|
+
|
|
160
|
+
| Initiator and operation | Default decision | Required behavior |
|
|
161
|
+
| ------------------------------------------------------------------- | --------------------- | --------------------------------------------------------- |
|
|
162
|
+
| Human, direct scoped edit | Execute | Optimistic UI, conflict check, undo where possible, audit |
|
|
163
|
+
| Agent, local and reversible | Execute | Must pass access and stored policy; audit |
|
|
164
|
+
| Agent, provider and reversible | Propose | Preview first; execute only with delegated authority |
|
|
165
|
+
| Agent, bulk/destructive/ownership/amount/stage/external side effect | Require approval | Preview exact scope and changed fields; fail closed |
|
|
166
|
+
| Automation with stored policy | Execute inside policy | No per-run prompt; stop and propose/deny outside policy |
|
|
167
|
+
|
|
168
|
+
Named high-risk classes remain approval-gated even when routine provider writes
|
|
169
|
+
have delegated authority. A later policy version may add field-specific
|
|
170
|
+
delegation without weakening the destructive/bulk boundary. A human `execute`
|
|
171
|
+
decision assumes the initiating UI has already collected any required
|
|
172
|
+
destructive confirmation; the policy layer does not add a second prompt.
|
|
173
|
+
|
|
174
|
+
All mutations are idempotent, access-checked, audited, and record the actor,
|
|
175
|
+
policy decision, before/after field summary, provider response status, and
|
|
176
|
+
remote revision. Provider conflicts never overwrite silently.
|
|
177
|
+
|
|
178
|
+
`applyMutation` represents one logical record mutation, not one HTTP request.
|
|
179
|
+
Adapters may use provider batch endpoints internally. A future bulk action can
|
|
180
|
+
add an `applyMutations` adapter method without changing the single-mutation
|
|
181
|
+
contract.
|
|
182
|
+
|
|
183
|
+
## Provider-model validation
|
|
184
|
+
|
|
185
|
+
| Contract concern | Native SQL | HubSpot | Salesforce | Contract consequence |
|
|
186
|
+
| ----------------------------- | ----------------------------------------------- | --------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------- |
|
|
187
|
+
| 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 |
|
|
188
|
+
| Record ids | CRM-local opaque id | String ids | 15/18-character string ids | Record refs preserve provider and opaque identity |
|
|
189
|
+
| Schema discovery | CRM-owned canonical schema | Properties and CRM schemas APIs | sObject/Object Info describe | Adapter returns object and field capabilities |
|
|
190
|
+
| Accounts/people/opportunities | Account/person/opportunity | Companies/contacts/deals | Account/Contact/Opportunity | Canonical kind is separate from provider object type |
|
|
191
|
+
| Relationships | CRM-directed edge | Directional association type ids and labels | Reference fields and child relationships | Directed edge preserves type, label, and source field |
|
|
192
|
+
| Custom objects | Generic display/link/write, no object authoring | Schema-discovered | `__c` and describe-discovered | V1 generic discover/search/display/link/write support |
|
|
193
|
+
| Remote revision | Local mutation version | `updatedAt` | `LastModifiedDate` or `SystemModstamp` | Revision is opaque; Native never claims a remote revision |
|
|
194
|
+
| Deletion | CRM tombstone/archive policy | Archived records | Deleted records/query-all semantics | Tombstone is first-class and sync-capability gated |
|
|
195
|
+
| 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 |
|
|
196
|
+
| Conditional write | Local version check | Provider-specific conflict strategy | `If-Unmodified-Since`/revision-aware update where available | Adapter reports capability and never invents success |
|
|
197
|
+
|
|
198
|
+
Reference checks used for this validation:
|
|
199
|
+
|
|
200
|
+
- [HubSpot CRM objects and associations](https://developers.hubspot.com/docs/api-reference/latest/crm/understanding-the-crm)
|
|
201
|
+
- [HubSpot association definitions and labels](https://developers.hubspot.com/docs/api-reference/latest/crm/associations/associations-schema/guide)
|
|
202
|
+
- [Salesforce object metadata](https://developer.salesforce.com/docs/platform/graphql/guide/query-objectinfo.html)
|
|
203
|
+
- [Salesforce record queries and effective permissions](https://developer.salesforce.com/docs/platform/graphql/guide/query-record-objects.html)
|
|
204
|
+
- [Salesforce revision-aware record updates](https://developer.salesforce.com/docs/platform/lwc/guide/reference-update-record.html)
|
|
205
|
+
|
|
206
|
+
## Initial-scope boundary
|
|
207
|
+
|
|
208
|
+
This scope is Native SQL plus a HubSpot and Salesforce companion. Native SQL is
|
|
209
|
+
the portable, local-authoritative replacement path; it does not depend on or
|
|
210
|
+
synchronize to HubSpot or Salesforce. Provider migration, a full
|
|
211
|
+
object-authoring engine, and a page builder remain out of scope. Provider writes
|
|
212
|
+
stay proposal-first until an adapter can prove the required revision,
|
|
213
|
+
access-scope, and approval guarantees — a proposal handed off for completion
|
|
214
|
+
upstream is the finished state of that flow, not a degraded one.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# CRM — Features
|
|
2
|
+
|
|
3
|
+
This folder explains what CRM is for and what users can do in the product. It
|
|
4
|
+
describes the shipped user experience; the [CRM contract](../architecture/crm-contract.md)
|
|
5
|
+
and the [agent guide](../../AGENTS.md) cover implementation and operating rules.
|
|
6
|
+
|
|
7
|
+
## Shipped core
|
|
8
|
+
|
|
9
|
+
CRM gives teams one place to work with customer records, pipeline context, and
|
|
10
|
+
follow-up work:
|
|
11
|
+
|
|
12
|
+
- **Records and fields (F1)** — spreadsheet-style records with typed
|
|
13
|
+
attributes, filtering, sorting, pagination, keyboard navigation, and value
|
|
14
|
+
history.
|
|
15
|
+
- **Lists, pipelines, and views (F2)** — local workflow lists with entry
|
|
16
|
+
fields, saved table views, and status-based boards.
|
|
17
|
+
- **Work and record quality (F3)** — follow-up tasks, pipeline dashboards,
|
|
18
|
+
duplicate detection and merge, and approval-gated enrichment.
|
|
19
|
+
- **Evidence and chat (F4)** — bounded call evidence, reviewable signals, and
|
|
20
|
+
agent actions that use the same product rules as the UI.
|
|
21
|
+
|
|
22
|
+
## Modes
|
|
23
|
+
|
|
24
|
+
CRM can start as a standalone system of record or as a scoped companion to a
|
|
25
|
+
connected CRM:
|
|
26
|
+
|
|
27
|
+
- **Native SQL** — CRM owns accounts, people, opportunities, lists, views,
|
|
28
|
+
tasks, and local fields. No provider account is required.
|
|
29
|
+
- **HubSpot or Salesforce** — the connected provider remains authoritative for
|
|
30
|
+
its own fields. CRM adds scoped record work, local lists and pipelines,
|
|
31
|
+
saved views, tasks, evidence, and analysis.
|
|
32
|
+
|
|
33
|
+
In either mode, lists and their entry values remain local to CRM. Provider edits
|
|
34
|
+
are prepared as reviewable proposals with an exact before/after diff; the final
|
|
35
|
+
change is completed in the provider.
|
|
36
|
+
|
|
37
|
+
## Features
|
|
38
|
+
|
|
39
|
+
| Feature | Status | What it covers |
|
|
40
|
+
| ---------------------------------------------------------------------- | ------ | --------------------------------------------------------- |
|
|
41
|
+
| [F1 — Records and fields](./f1-records-and-fields.mdx) | done | Records, typed attributes, grid, record page, and history |
|
|
42
|
+
| [F2 — Lists, pipelines, and views](./f2-lists-pipelines-and-views.mdx) | done | Workflow lists, boards, saved views, and stage history |
|
|
43
|
+
| [F3 — Work and record quality](./f3-work-and-record-quality.mdx) | done | Tasks, dashboards, dedupe, merge, and enrichment |
|
|
44
|
+
| [F4 — Evidence and chat](./f4-evidence-and-chat.mdx) | done | Call evidence, signals, agent parity, and useful prompts |
|
|
45
|
+
|
|
46
|
+
## First steps
|
|
47
|
+
|
|
48
|
+
1. Open **Set up CRM** and choose **Start with Native SQL**, or authorize and
|
|
49
|
+
grant a HubSpot or Salesforce connection from shared Settings.
|
|
50
|
+
2. Add records or sync a small, recent provider cohort.
|
|
51
|
+
3. Create a list for the workflow you want to manage, then add records to it.
|
|
52
|
+
4. Save a table or board view for the way you want to return to that work.
|
|
53
|
+
|
|
54
|
+
The command menu (**⌘K**) can open records, lists, views, settings, and work
|
|
55
|
+
without requiring a particular navigation path.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: F1
|
|
3
|
+
title: Records and fields
|
|
4
|
+
status: done
|
|
5
|
+
order: 1
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# F1 — Records and fields
|
|
9
|
+
|
|
10
|
+
## What it is
|
|
11
|
+
|
|
12
|
+
A **record** is a customer, company, opportunity, activity, task, or custom
|
|
13
|
+
object that CRM can find and work with. Records are displayed in a spreadsheet-
|
|
14
|
+
style grid and can be opened in a detail page without losing the surrounding
|
|
15
|
+
list context.
|
|
16
|
+
|
|
17
|
+
## What users can do
|
|
18
|
+
|
|
19
|
+
<!-- status: done -->
|
|
20
|
+
|
|
21
|
+
- Add native records for accounts, people, opportunities, activities, tasks,
|
|
22
|
+
and custom objects.
|
|
23
|
+
- Search, filter, sort by multiple columns, and move through paginated results.
|
|
24
|
+
- Move through cells with the keyboard and copy or paste tab-separated values.
|
|
25
|
+
- Open a record to see its fields, lists, interactions, evidence, and history.
|
|
26
|
+
- Create and manage typed attributes from **Settings → Fields**.
|
|
27
|
+
- Find likely duplicates, inspect the matching reasons, and merge records with
|
|
28
|
+
an explicit survivor choice.
|
|
29
|
+
|
|
30
|
+
## Typed fields
|
|
31
|
+
|
|
32
|
+
Fields can be text, numbers, checkboxes, currency, dates, timestamps, ratings,
|
|
33
|
+
statuses, selects, record or actor references, locations, domains, email
|
|
34
|
+
addresses, and phone numbers. Status and select fields use managed options, so
|
|
35
|
+
an accidental value cannot create an untracked stage.
|
|
36
|
+
|
|
37
|
+
## History and authority
|
|
38
|
+
|
|
39
|
+
Each meaningful field change records who changed it and when. A record's stage
|
|
40
|
+
history is therefore part of its value history. Repeating the same value does
|
|
41
|
+
not create another history entry.
|
|
42
|
+
|
|
43
|
+
In Native SQL mode, CRM owns the record and its local fields. In connected mode,
|
|
44
|
+
the provider owns provider fields while CRM owns local fields and workflow
|
|
45
|
+
data. CRM does not silently overwrite provider data.
|
|
46
|
+
|
|
47
|
+
## Connected records
|
|
48
|
+
|
|
49
|
+
Connect HubSpot or Salesforce from shared Settings and grant the connection to
|
|
50
|
+
CRM. Start with a small, recent cohort and an explicit object scope. CRM keeps
|
|
51
|
+
the configured mirror bounded; unknown or sensitive provider fields are not
|
|
52
|
+
automatically copied into CRM.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: F2
|
|
3
|
+
title: Lists, pipelines, and views
|
|
4
|
+
status: done
|
|
5
|
+
order: 2
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# F2 — Lists, pipelines, and views
|
|
9
|
+
|
|
10
|
+
## What it is
|
|
11
|
+
|
|
12
|
+
A **list** is a local workflow overlay for one record type. It can represent a
|
|
13
|
+
sales pipeline, account segment, onboarding queue, or any other process without
|
|
14
|
+
requiring a write to HubSpot or Salesforce. A record's membership is a list
|
|
15
|
+
entry, and each entry can have its own fields.
|
|
16
|
+
|
|
17
|
+
## What users can do
|
|
18
|
+
|
|
19
|
+
<!-- status: done -->
|
|
20
|
+
|
|
21
|
+
- Create a list for accounts, people, opportunities, or another object type.
|
|
22
|
+
- Add and remove records from a list.
|
|
23
|
+
- Add list-specific fields such as stage, owner, priority, or next step.
|
|
24
|
+
- Move an entry between stages and review the time spent in each stage.
|
|
25
|
+
- Save filters, ordered sorts, columns, and audience settings as a view.
|
|
26
|
+
- Open a saved view as a table or as a board grouped by a status field.
|
|
27
|
+
|
|
28
|
+
## How it behaves
|
|
29
|
+
|
|
30
|
+
- Lists, entries, and entry values are local-authoritative in Native SQL and
|
|
31
|
+
connected modes.
|
|
32
|
+
- One record may have multiple entries when the workflow needs them, such as
|
|
33
|
+
two opportunities for the same company.
|
|
34
|
+
- A board groups by a managed status attribute; it is another presentation of
|
|
35
|
+
the same saved view, not a separate copy of the pipeline.
|
|
36
|
+
- A view using `@currentUser` resolves that filter for the person viewing it,
|
|
37
|
+
so one shared view can show each teammate their own work.
|
|
38
|
+
|
|
39
|
+
## A typical pipeline
|
|
40
|
+
|
|
41
|
+
1. Create an **Opportunities** list.
|
|
42
|
+
2. Add a status field with stages such as New, Qualified, Proposal, and Won.
|
|
43
|
+
3. Add records to the list and fill in entry-specific amount, owner, and next
|
|
44
|
+
step fields.
|
|
45
|
+
4. Save a table view for detailed work and a board view for stage review.
|
|
46
|
+
|
|
47
|
+
The same workflow works over native records or records mirrored from a
|
|
48
|
+
connected provider.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: F3
|
|
3
|
+
title: Work and record quality
|
|
4
|
+
status: done
|
|
5
|
+
order: 3
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# F3 — Work and record quality
|
|
9
|
+
|
|
10
|
+
## What it is
|
|
11
|
+
|
|
12
|
+
CRM keeps follow-up work beside the record context that explains it. Tasks,
|
|
13
|
+
pipeline dashboards, duplicate review, and enrichment are separate workflows
|
|
14
|
+
so a cleanup or spend decision does not get hidden inside a record edit.
|
|
15
|
+
|
|
16
|
+
## What users can do
|
|
17
|
+
|
|
18
|
+
<!-- status: done -->
|
|
19
|
+
|
|
20
|
+
- Create and manage local follow-up tasks from a record or the Work view.
|
|
21
|
+
- Review pipeline value and stage distribution in the dashboard.
|
|
22
|
+
- Ask CRM to find likely duplicates and show the email, domain, or name signal
|
|
23
|
+
behind each match.
|
|
24
|
+
- Choose the surviving record before merging. CRM promotes values the survivor
|
|
25
|
+
lacks, moves related workflow data, and keeps the losing record linked as a
|
|
26
|
+
tombstone rather than silently deleting it.
|
|
27
|
+
- Run a free enrichment verification pass, review the evidence and estimated
|
|
28
|
+
line-item cost, then approve the exact records for the paid pass.
|
|
29
|
+
|
|
30
|
+
## Spend and approval gates
|
|
31
|
+
|
|
32
|
+
The enrichment flow has two phases:
|
|
33
|
+
|
|
34
|
+
1. **Verify** gathers evidence and estimates what the paid run would cost.
|
|
35
|
+
2. **Approve** selects the exact records and fields that may be enriched.
|
|
36
|
+
3. **Run** performs the paid work only for the approved input set.
|
|
37
|
+
|
|
38
|
+
A failed provider slot is reported as a failure, not as an empty result. Bulk,
|
|
39
|
+
destructive, ownership, amount, stage, and external-effect changes require an
|
|
40
|
+
exact preview and approval.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: F4
|
|
3
|
+
title: Evidence and chat
|
|
4
|
+
status: done
|
|
5
|
+
order: 4
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# F4 — Evidence and chat
|
|
9
|
+
|
|
10
|
+
## What it is
|
|
11
|
+
|
|
12
|
+
CRM can connect a bounded piece of call evidence to a record and turn it into a
|
|
13
|
+
reviewable signal. The agent is the conversational interface to the same CRM
|
|
14
|
+
actions the UI uses, so work stays visible, permission-scoped, and reversible
|
|
15
|
+
where possible.
|
|
16
|
+
|
|
17
|
+
## Call evidence and signals
|
|
18
|
+
|
|
19
|
+
<!-- status: done -->
|
|
20
|
+
|
|
21
|
+
- Attach a source URL or id, a bounded quote, speaker, timestamp, and summary
|
|
22
|
+
to a CRM record.
|
|
23
|
+
- Run deterministic keyword trackers over the stored excerpt.
|
|
24
|
+
- Delegate smart moments and summaries through agent chat.
|
|
25
|
+
- Review each signal and confirm or dismiss it before it becomes part of the
|
|
26
|
+
record's working context.
|
|
27
|
+
|
|
28
|
+
CRM stores references and bounded excerpts, not recordings, transcripts, or
|
|
29
|
+
other raw media. The source app keeps ownership of the original call artifact.
|
|
30
|
+
|
|
31
|
+
## Chat parity
|
|
32
|
+
|
|
33
|
+
The agent can use the same actions as the UI: list records, create a list, save
|
|
34
|
+
a view, add a task, inspect a record, prepare a provider proposal, and navigate
|
|
35
|
+
to the relevant screen. It reads the current CRM screen when that context
|
|
36
|
+
matters and keeps the UI synchronized after a change.
|
|
37
|
+
|
|
38
|
+
Useful prompts include:
|
|
39
|
+
|
|
40
|
+
- “Show me open opportunities in the Proposal stage.”
|
|
41
|
+
- “Create a board view for this list grouped by stage.”
|
|
42
|
+
- “Add a follow-up task for this account next Tuesday.”
|
|
43
|
+
- “Find likely duplicates for this company and explain each match.”
|
|
44
|
+
- “Prepare the provider change, but do not apply it.”
|
|
45
|
+
|
|
46
|
+
Provider changes remain proposal-first: CRM shows the exact diff and hands the
|
|
47
|
+
final upstream action back to HubSpot or Salesforce.
|
|
@@ -0,0 +1,5 @@
|
|
|
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. -->
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
[build]
|
|
2
|
+
ignore = "node ./scripts/netlify-ignore-build.mjs crm"
|
|
3
|
+
command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && NITRO_PRESET=netlify pnpm --filter crm build"
|
|
4
|
+
publish = "templates/crm/dist"
|
|
5
|
+
functions = "templates/crm/.netlify/functions-internal"
|
|
6
|
+
|
|
7
|
+
[build.environment]
|
|
8
|
+
GA_MEASUREMENT_ID = "G-ESF7FYXGN9"
|
|
9
|
+
GTM_CONTAINER_ID = "GTM-N3WSTXZ"
|
|
10
|
+
NITRO_PRESET = "netlify"
|
|
11
|
+
NPM_CONFIG_PRODUCTION = "false"
|