@agent-native/core 0.114.16 → 0.115.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-native.eject.json +2 -0
- package/corpus/README.md +3 -3
- package/corpus/core/CHANGELOG.md +41 -0
- package/corpus/core/agent-native.eject.json +2 -0
- package/corpus/core/docs/content/agent-native-toolkit.mdx +16 -0
- package/corpus/core/docs/content/recurring-jobs.mdx +35 -6
- package/corpus/core/export-snapshot.json +4 -0
- package/corpus/core/package.json +5 -1
- package/corpus/core/src/action.ts +22 -1
- package/corpus/core/src/agent/production-agent.ts +122 -3
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +19 -2
- package/corpus/core/src/cli/templates-meta.ts +12 -0
- package/corpus/core/src/client/AssistantChat.tsx +53 -26
- package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +19 -0
- package/corpus/core/src/client/agent-page/use-jobs.ts +1 -0
- package/corpus/core/src/client/blocks/library/wireframe.tsx +3 -1
- package/corpus/core/src/client/chat/message-components.tsx +35 -1
- package/corpus/core/src/client/chat/tool-call-display.tsx +38 -3
- package/corpus/core/src/connections/catalog.ts +20 -1
- package/corpus/core/src/connections/reader.ts +65 -0
- package/corpus/core/src/dashboard-storage/index.ts +27 -0
- package/corpus/core/src/dashboard-storage/panel-source.ts +168 -0
- package/corpus/core/src/dashboard-storage/schema.ts +62 -0
- package/corpus/core/src/dashboard-storage/store.ts +333 -0
- package/corpus/core/src/deploy/build.ts +95 -16
- package/corpus/core/src/eject/provider-api-definitions.ts +1 -0
- package/corpus/core/src/eject/workspace-connections.ts +1 -0
- package/corpus/core/src/extensions/actions.ts +199 -73
- package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +2 -0
- package/corpus/core/src/jobs/scheduler.ts +71 -4
- package/corpus/core/src/jobs/tools.ts +31 -1
- package/corpus/core/src/localization/default-messages.ts +1 -0
- package/corpus/core/src/mcp-client/index.ts +6 -0
- package/corpus/core/src/provider-api/actions/provider-api.ts +1 -1
- package/corpus/core/src/provider-api/index.ts +190 -5
- package/corpus/core/src/secrets/register-framework-secrets.ts +8 -0
- package/corpus/core/src/server/agent-chat/context-tools.ts +9 -0
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
- package/corpus/core/src/server/agent-chat-plugin.ts +22 -2
- package/corpus/core/src/server/core-routes-plugin.ts +1 -0
- package/corpus/core/src/server/credential-provider.ts +9 -3
- package/corpus/core/src/server/workspace-provider-oauth.ts +181 -4
- package/corpus/core/src/styles/agent-native.css +45 -2
- package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/core/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
- package/corpus/core/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
- package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
- package/corpus/core/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
- package/corpus/core/src/triggers/actions.ts +11 -2
- package/corpus/core/src/triggers/dispatcher.ts +20 -1
- package/corpus/core/src/triggers/types.ts +5 -0
- package/corpus/core/src/vite/action-types-plugin.ts +9 -1
- package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/analytics/AGENTS.md +11 -11
- package/corpus/templates/analytics/_gitignore +39 -0
- package/corpus/templates/analytics/actions/query-dashboard-panel.ts +30 -0
- package/corpus/templates/analytics/actions/update-dashboard.ts +2 -1
- package/corpus/templates/analytics/app/lib/sql-query.ts +11 -25
- package/corpus/templates/analytics/changelog/2026-07-21-fixed-extension-updates-failing-before-changes-could-be-appl.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +1 -0
- package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +51 -0
- package/corpus/templates/analytics/server/lib/prometheus.ts +1 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/calendar/_gitignore +39 -0
- package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/templates/chat/AGENTS.md +1 -1
- package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/clips/AGENTS.md +7 -0
- package/corpus/templates/clips/actions/prepare-crm-call-evidence.ts +58 -0
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +88 -11
- package/corpus/templates/clips/changelog/2026-07-21-crm-call-evidence-handoff.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-21-recording-retries-and-restarts-keep-their-upload-session-so-.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +20 -5
- package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +19 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +8 -0
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +9 -0
- package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +54 -28
- package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/content/_gitignore +39 -0
- package/corpus/templates/content/learnings.defaults.md +5 -0
- package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +133 -0
- package/corpus/templates/crm/.agents/skills/crm/SKILL.md +128 -0
- package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +145 -0
- package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +100 -0
- package/corpus/templates/crm/.env.example +5 -0
- package/corpus/templates/crm/AGENTS.md +120 -0
- package/corpus/templates/crm/CHANGELOG.md +1 -0
- package/corpus/templates/crm/DEVELOPING.md +66 -0
- package/corpus/templates/crm/README.md +106 -0
- package/corpus/templates/crm/_gitignore +12 -0
- package/corpus/templates/crm/actions/_crm-action-utils.ts +87 -0
- package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
- package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
- package/corpus/templates/crm/actions/apply-crm-proposals.ts +203 -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-record.ts +148 -0
- package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
- package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
- package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
- package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +33 -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.ts +75 -0
- package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -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-proposals.ts +31 -0
- package/corpus/templates/crm/actions/list-crm-records.ts +79 -0
- package/corpus/templates/crm/actions/list-crm-saved-views.ts +15 -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-signal-tracker.ts +87 -0
- package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
- package/corpus/templates/crm/actions/navigate.ts +63 -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/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-saved-view-program.ts +103 -0
- package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +275 -0
- package/corpus/templates/crm/actions/run.ts +11 -0
- package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
- package/corpus/templates/crm/actions/save-crm-saved-view.ts +119 -0
- package/corpus/templates/crm/actions/sync-crm.ts +146 -0
- package/corpus/templates/crm/actions/update-crm-record.ts +508 -0
- package/corpus/templates/crm/actions/view-screen.ts +218 -0
- package/corpus/templates/crm/agent-native.app-skill.json +58 -0
- package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
- package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +83 -0
- package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +225 -0
- package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +413 -0
- package/corpus/templates/crm/app/components/crm/RecordActions.tsx +510 -0
- package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +134 -0
- package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +367 -0
- package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +92 -0
- package/corpus/templates/crm/app/components/crm/Surface.tsx +96 -0
- package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +106 -0
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +84 -0
- package/corpus/templates/crm/app/entry.client.tsx +16 -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-navigation-state.ts +60 -0
- package/corpus/templates/crm/app/i18n/en-US.ts +89 -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 +54 -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 +88 -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/opportunities.tsx +41 -0
- package/corpus/templates/crm/app/routes/people.tsx +41 -0
- package/corpus/templates/crm/app/routes/proposals.tsx +266 -0
- package/corpus/templates/crm/app/routes/records.$recordId.tsx +35 -0
- package/corpus/templates/crm/app/routes/settings.tsx +63 -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 +333 -0
- package/corpus/templates/crm/app/routes.ts +17 -0
- package/corpus/templates/crm/app/vite-env.d.ts +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +6 -0
- package/corpus/templates/crm/components.json +20 -0
- package/corpus/templates/crm/docs/architecture/crm-contract.md +180 -0
- package/corpus/templates/crm/learnings.defaults.md +5 -0
- package/corpus/templates/crm/package.json +59 -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 +711 -0
- package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1143 -0
- package/corpus/templates/crm/server/crm/native-adapter.ts +1715 -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 +1170 -0
- package/corpus/templates/crm/server/db/index.ts +169 -0
- package/corpus/templates/crm/server/db/schema.ts +441 -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 +100 -0
- package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +144 -0
- package/corpus/templates/crm/server/lib/intelligence/summary.ts +141 -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 +68 -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 +454 -0
- package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
- package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
- package/corpus/templates/crm/shared/crm-contract.ts +254 -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/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/forms/_gitignore +39 -0
- package/corpus/templates/forms/learnings.defaults.md +5 -0
- package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/macros/_gitignore +39 -0
- package/corpus/templates/macros/learnings.defaults.md +5 -0
- package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/mail/_gitignore +39 -0
- package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +19 -2
- package/corpus/templates/plan/AGENTS.md +10 -0
- package/corpus/templates/plan/actions/create-prototype-plan.ts +27 -3
- package/corpus/templates/plan/actions/get-plan-blocks.ts +1 -1
- package/corpus/templates/plan/actions/update-visual-plan.ts +3 -2
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +18 -4
- package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +10 -3
- package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +3 -1
- package/corpus/templates/plan/app/i18n/en-US.ts +6 -0
- package/corpus/templates/plan/app/lib/create-plan-routing.ts +39 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +31 -107
- package/corpus/templates/plan/changelog/2026-07-22-high-fidelity-mockup-requests-now-preserve-branded-css-use-d.md +6 -0
- package/corpus/templates/plan/shared/plan-content.ts +110 -2
- package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/slides/_gitignore +39 -0
- package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/templates/tasks/_gitignore +39 -0
- package/corpus/toolkit/CHANGELOG.md +12 -0
- package/corpus/toolkit/README.md +30 -0
- package/corpus/toolkit/agent-native.eject.json +33 -0
- package/corpus/toolkit/package.json +15 -1
- package/corpus/toolkit/src/dashboard/DataTable.tsx +273 -0
- package/corpus/toolkit/src/dashboard/DateRangePicker.tsx +57 -0
- package/corpus/toolkit/src/dashboard/GenericChartPanel.tsx +461 -0
- package/corpus/toolkit/src/dashboard/MetricCard.tsx +54 -0
- package/corpus/toolkit/src/dashboard/StatsCard.tsx +49 -0
- package/corpus/toolkit/src/dashboard/dashboard-layout.ts +329 -0
- package/corpus/toolkit/src/dashboard/index.ts +6 -0
- package/corpus/toolkit/src/index.ts +1 -0
- package/corpus/toolkit/src/ui/calendar.tsx +8 -8
- package/corpus/toolkit/src/ui/date-picker.tsx +4 -1
- package/dist/action.d.ts +14 -1
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts +3 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +97 -3
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +19 -2
- package/dist/cli/skills-content/visual-plan-skill.js.map +1 -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/client/AssistantChat.d.ts +4 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +30 -17
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.js +3 -1
- package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
- package/dist/client/agent-page/use-jobs.d.ts +1 -0
- package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
- package/dist/client/agent-page/use-jobs.js.map +1 -1
- package/dist/client/blocks/library/wireframe.d.ts.map +1 -1
- package/dist/client/blocks/library/wireframe.js +3 -2
- package/dist/client/blocks/library/wireframe.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +5 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +17 -1
- 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 +17 -7
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +17 -3
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +16 -1
- package/dist/connections/catalog.js.map +1 -1
- package/dist/connections/reader.d.ts +18 -0
- package/dist/connections/reader.d.ts.map +1 -1
- package/dist/connections/reader.js +41 -0
- package/dist/connections/reader.js.map +1 -1
- package/dist/dashboard-storage/index.d.ts +4 -0
- package/dist/dashboard-storage/index.d.ts.map +1 -0
- package/dist/dashboard-storage/index.js +4 -0
- package/dist/dashboard-storage/index.js.map +1 -0
- package/dist/dashboard-storage/panel-source.d.ts +68 -0
- package/dist/dashboard-storage/panel-source.d.ts.map +1 -0
- package/dist/dashboard-storage/panel-source.js +76 -0
- package/dist/dashboard-storage/panel-source.js.map +1 -0
- package/dist/dashboard-storage/schema.d.ts +562 -0
- package/dist/dashboard-storage/schema.d.ts.map +1 -0
- package/dist/dashboard-storage/schema.js +32 -0
- package/dist/dashboard-storage/schema.js.map +1 -0
- package/dist/dashboard-storage/store.d.ts +62 -0
- package/dist/dashboard-storage/store.d.ts.map +1 -0
- package/dist/dashboard-storage/store.js +227 -0
- package/dist/dashboard-storage/store.js.map +1 -0
- package/dist/deploy/build.d.ts +7 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +78 -14
- package/dist/deploy/build.js.map +1 -1
- package/dist/eject/provider-api-definitions.d.ts +2 -1
- package/dist/eject/provider-api-definitions.d.ts.map +1 -1
- package/dist/eject/provider-api-definitions.js +1 -0
- package/dist/eject/provider-api-definitions.js.map +1 -1
- package/dist/eject/workspace-connections.d.ts.map +1 -1
- package/dist/eject/workspace-connections.js +1 -0
- package/dist/eject/workspace-connections.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +165 -67
- package/dist/extensions/actions.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/jobs/actions/list-recurring-jobs.d.ts +1 -0
- package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
- package/dist/jobs/actions/list-recurring-jobs.js +1 -0
- package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +17 -2
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +51 -2
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +32 -2
- package/dist/jobs/tools.js.map +1 -1
- package/dist/localization/default-messages.d.ts +1 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +1 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp-client/index.d.ts +2 -0
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +5 -0
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
- package/dist/provider-api/actions/provider-api.d.ts +8 -6
- package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
- package/dist/provider-api/actions/provider-api.js +1 -1
- package/dist/provider-api/actions/provider-api.js.map +1 -1
- package/dist/provider-api/index.d.ts +11 -7
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +143 -5
- package/dist/provider-api/index.js.map +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +7 -0
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
- package/dist/server/agent-chat/context-tools.js +9 -0
- package/dist/server/agent-chat/context-tools.js.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +2 -2
- package/dist/server/agent-chat/framework-prompts.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +18 -2
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +1 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +4 -3
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +9 -3
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +6 -1
- package/dist/server/workspace-provider-oauth.d.ts.map +1 -1
- package/dist/server/workspace-provider-oauth.js +141 -4
- package/dist/server/workspace-provider-oauth.js.map +1 -1
- package/dist/styles/agent-native.css +45 -2
- package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/dist/templates/chat/AGENTS.md +1 -1
- package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/dist/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
- package/dist/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
- package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
- package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
- package/dist/triggers/actions.d.ts.map +1 -1
- package/dist/triggers/actions.js +10 -2
- package/dist/triggers/actions.js.map +1 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +15 -0
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/triggers/types.d.ts +5 -0
- package/dist/triggers/types.d.ts.map +1 -1
- package/dist/triggers/types.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +4 -1
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +16 -0
- package/docs/content/recurring-jobs.mdx +35 -6
- package/package.json +7 -3
- package/src/action.ts +22 -1
- package/src/agent/production-agent.ts +122 -3
- package/src/cli/skills-content/visual-plan-skill.ts +19 -2
- package/src/cli/templates-meta.ts +12 -0
- package/src/client/AssistantChat.tsx +53 -26
- package/src/client/agent-page/AgentJobsTab.tsx +19 -0
- package/src/client/agent-page/use-jobs.ts +1 -0
- package/src/client/blocks/library/wireframe.tsx +3 -1
- package/src/client/chat/message-components.tsx +35 -1
- package/src/client/chat/tool-call-display.tsx +38 -3
- package/src/connections/catalog.ts +20 -1
- package/src/connections/reader.ts +65 -0
- package/src/dashboard-storage/index.ts +27 -0
- package/src/dashboard-storage/panel-source.ts +168 -0
- package/src/dashboard-storage/schema.ts +62 -0
- package/src/dashboard-storage/store.ts +333 -0
- package/src/deploy/build.ts +95 -16
- package/src/eject/provider-api-definitions.ts +1 -0
- package/src/eject/workspace-connections.ts +1 -0
- package/src/extensions/actions.ts +199 -73
- package/src/jobs/actions/list-recurring-jobs.ts +2 -0
- package/src/jobs/scheduler.ts +71 -4
- package/src/jobs/tools.ts +31 -1
- package/src/localization/default-messages.ts +1 -0
- package/src/mcp-client/index.ts +6 -0
- package/src/provider-api/actions/provider-api.ts +1 -1
- package/src/provider-api/index.ts +190 -5
- package/src/secrets/register-framework-secrets.ts +8 -0
- package/src/server/agent-chat/context-tools.ts +9 -0
- package/src/server/agent-chat/framework-prompts.ts +2 -2
- package/src/server/agent-chat-plugin.ts +22 -2
- package/src/server/core-routes-plugin.ts +1 -0
- package/src/server/credential-provider.ts +9 -3
- package/src/server/workspace-provider-oauth.ts +181 -4
- package/src/styles/agent-native.css +45 -2
- package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/src/templates/chat/AGENTS.md +1 -1
- package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
- package/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
- package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
- package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
- package/src/triggers/actions.ts +11 -2
- package/src/triggers/dispatcher.ts +20 -1
- package/src/triggers/types.ts +5 -0
- package/src/vite/action-types-plugin.ts +9 -1
- package/corpus/templates/analytics/server/handlers/sql-query.ts +0 -36
- package/corpus/templates/analytics/server/routes/api/sql-query.post.ts +0 -1
|
@@ -39,6 +39,7 @@ export type GenericWorkspaceOAuthProvider =
|
|
|
39
39
|
| "google_drive"
|
|
40
40
|
| "github"
|
|
41
41
|
| "hubspot"
|
|
42
|
+
| "salesforce"
|
|
42
43
|
| "jira"
|
|
43
44
|
| "sentry"
|
|
44
45
|
| "notion";
|
|
@@ -48,6 +49,7 @@ const SUPPORTED_PROVIDERS = new Set<GenericWorkspaceOAuthProvider>([
|
|
|
48
49
|
"google_drive",
|
|
49
50
|
"github",
|
|
50
51
|
"hubspot",
|
|
52
|
+
"salesforce",
|
|
51
53
|
"jira",
|
|
52
54
|
"sentry",
|
|
53
55
|
"notion",
|
|
@@ -55,6 +57,8 @@ const SUPPORTED_PROVIDERS = new Set<GenericWorkspaceOAuthProvider>([
|
|
|
55
57
|
const FLOW_TTL_SECONDS = 10 * 60;
|
|
56
58
|
const PROVIDER_REQUEST_TIMEOUT_MS = 10_000;
|
|
57
59
|
const PROVIDER_RESPONSE_MAX_BYTES = 256 * 1024;
|
|
60
|
+
const SALESFORCE_PRODUCTION_LOGIN_URL = "https://login.salesforce.com";
|
|
61
|
+
const SALESFORCE_SANDBOX_LOGIN_URL = "https://test.salesforce.com";
|
|
58
62
|
|
|
59
63
|
export interface WorkspaceProviderOAuthFlow {
|
|
60
64
|
provider: GenericWorkspaceOAuthProvider;
|
|
@@ -64,6 +68,7 @@ export interface WorkspaceProviderOAuthFlow {
|
|
|
64
68
|
owner: string;
|
|
65
69
|
orgId?: string;
|
|
66
70
|
appId: string;
|
|
71
|
+
salesforceLoginUrl?: string;
|
|
67
72
|
expiresAt: number;
|
|
68
73
|
}
|
|
69
74
|
|
|
@@ -112,6 +117,14 @@ export async function handleWorkspaceProviderOAuthStart(
|
|
|
112
117
|
}
|
|
113
118
|
const provider = requiredProvider(providerId);
|
|
114
119
|
const query = getQuery(event);
|
|
120
|
+
const salesforceLoginUrl =
|
|
121
|
+
providerId === "salesforce"
|
|
122
|
+
? resolveSalesforceOAuthLoginUrl(text(query.environment))
|
|
123
|
+
: undefined;
|
|
124
|
+
if (providerId === "salesforce" && !salesforceLoginUrl) {
|
|
125
|
+
setResponseStatus(event, 400);
|
|
126
|
+
return { error: "Salesforce environment must be production or sandbox." };
|
|
127
|
+
}
|
|
115
128
|
const appId = normalizeAppId(
|
|
116
129
|
text(query.appId) ??
|
|
117
130
|
process.env.AGENT_NATIVE_WORKSPACE_APP_ID ??
|
|
@@ -163,6 +176,7 @@ export async function handleWorkspaceProviderOAuthStart(
|
|
|
163
176
|
owner: session.email,
|
|
164
177
|
orgId,
|
|
165
178
|
appId,
|
|
179
|
+
...(salesforceLoginUrl ? { salesforceLoginUrl } : {}),
|
|
166
180
|
expiresAt: Date.now() + FLOW_TTL_SECONDS * 1_000,
|
|
167
181
|
};
|
|
168
182
|
setCookie(
|
|
@@ -183,6 +197,14 @@ export async function handleWorkspaceProviderOAuthStart(
|
|
|
183
197
|
redirectUri,
|
|
184
198
|
state,
|
|
185
199
|
challenge,
|
|
200
|
+
...(salesforceLoginUrl
|
|
201
|
+
? {
|
|
202
|
+
authorizationUrl: salesforceOAuthEndpoint(
|
|
203
|
+
salesforceLoginUrl,
|
|
204
|
+
"authorize",
|
|
205
|
+
),
|
|
206
|
+
}
|
|
207
|
+
: {}),
|
|
186
208
|
});
|
|
187
209
|
return Response.redirect(authorizationUrl, 302);
|
|
188
210
|
},
|
|
@@ -259,6 +281,14 @@ export async function handleWorkspaceProviderOAuthCallback(
|
|
|
259
281
|
code,
|
|
260
282
|
verifier: flow.verifier,
|
|
261
283
|
redirectUri: flow.redirectUri,
|
|
284
|
+
...(providerId === "salesforce"
|
|
285
|
+
? {
|
|
286
|
+
tokenUrl: salesforceOAuthEndpoint(
|
|
287
|
+
flow.salesforceLoginUrl ?? SALESFORCE_PRODUCTION_LOGIN_URL,
|
|
288
|
+
"token",
|
|
289
|
+
),
|
|
290
|
+
}
|
|
291
|
+
: {}),
|
|
262
292
|
});
|
|
263
293
|
const identities = await resolveWorkspaceProviderIdentities(
|
|
264
294
|
providerId,
|
|
@@ -299,10 +329,18 @@ export async function handleWorkspaceProviderOAuthCallback(
|
|
|
299
329
|
);
|
|
300
330
|
const connectionConfig = {
|
|
301
331
|
credentialMode: "oauth",
|
|
302
|
-
...(providerId === "hubspot" ||
|
|
332
|
+
...(providerId === "hubspot" ||
|
|
333
|
+
providerId === "salesforce" ||
|
|
334
|
+
providerId === "jira"
|
|
303
335
|
? { externalAccountId: identity.accountId }
|
|
304
336
|
: {}),
|
|
305
337
|
...(identity.config ?? {}),
|
|
338
|
+
...(providerId === "salesforce"
|
|
339
|
+
? {
|
|
340
|
+
salesforceLoginUrl:
|
|
341
|
+
flow.salesforceLoginUrl ?? SALESFORCE_PRODUCTION_LOGIN_URL,
|
|
342
|
+
}
|
|
343
|
+
: {}),
|
|
306
344
|
};
|
|
307
345
|
const connection = await upsertWorkspaceConnection({
|
|
308
346
|
...(existing ? { id: existing.id } : {}),
|
|
@@ -339,10 +377,13 @@ export function buildWorkspaceProviderAuthorizationUrl(input: {
|
|
|
339
377
|
redirectUri: string;
|
|
340
378
|
state: string;
|
|
341
379
|
challenge: string;
|
|
380
|
+
authorizationUrl?: string;
|
|
342
381
|
}): string {
|
|
343
382
|
if (!input.provider.oauth)
|
|
344
383
|
throw new Error("Provider does not support OAuth.");
|
|
345
|
-
const url = new URL(
|
|
384
|
+
const url = new URL(
|
|
385
|
+
input.authorizationUrl ?? input.provider.oauth.authorizationUrl,
|
|
386
|
+
);
|
|
346
387
|
url.searchParams.set("client_id", input.clientId);
|
|
347
388
|
url.searchParams.set("redirect_uri", input.redirectUri);
|
|
348
389
|
url.searchParams.set("response_type", "code");
|
|
@@ -378,8 +419,9 @@ export async function exchangeWorkspaceProviderOAuthCode(input: {
|
|
|
378
419
|
code: string;
|
|
379
420
|
verifier: string;
|
|
380
421
|
redirectUri: string;
|
|
422
|
+
tokenUrl?: string;
|
|
381
423
|
}): Promise<Record<string, unknown>> {
|
|
382
|
-
const tokenUrl = input.provider.oauth?.tokenUrl;
|
|
424
|
+
const tokenUrl = input.tokenUrl ?? input.provider.oauth?.tokenUrl;
|
|
383
425
|
if (!tokenUrl) throw new Error("Provider does not support OAuth.");
|
|
384
426
|
const authorization = `Basic ${Buffer.from(`${input.clientId}:${input.clientSecret}`).toString("base64")}`;
|
|
385
427
|
if (input.providerId === "github") {
|
|
@@ -444,6 +486,36 @@ export async function exchangeWorkspaceProviderOAuthCode(input: {
|
|
|
444
486
|
: {}),
|
|
445
487
|
};
|
|
446
488
|
}
|
|
489
|
+
if (input.providerId === "salesforce") {
|
|
490
|
+
const { response, body } = await fetchBoundedProviderJson(
|
|
491
|
+
tokenUrl,
|
|
492
|
+
{
|
|
493
|
+
method: "POST",
|
|
494
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
495
|
+
body: new URLSearchParams({
|
|
496
|
+
grant_type: "authorization_code",
|
|
497
|
+
client_id: input.clientId,
|
|
498
|
+
client_secret: input.clientSecret,
|
|
499
|
+
code: input.code,
|
|
500
|
+
redirect_uri: input.redirectUri,
|
|
501
|
+
}),
|
|
502
|
+
},
|
|
503
|
+
input.provider.label,
|
|
504
|
+
);
|
|
505
|
+
const accessToken = text(body.access_token);
|
|
506
|
+
if (!response.ok || !accessToken) {
|
|
507
|
+
throw new Error(
|
|
508
|
+
`${input.provider.label} OAuth token exchange failed (${response.status}).`,
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
const expiresIn = Number(body.expires_in);
|
|
512
|
+
return {
|
|
513
|
+
...body,
|
|
514
|
+
...(Number.isFinite(expiresIn) && expiresIn > 0
|
|
515
|
+
? { expiry_date: Date.now() + expiresIn * 1_000 }
|
|
516
|
+
: {}),
|
|
517
|
+
};
|
|
518
|
+
}
|
|
447
519
|
if (input.providerId === "jira") {
|
|
448
520
|
const { response, body } = await fetchBoundedProviderJsonValue(
|
|
449
521
|
tokenUrl,
|
|
@@ -679,6 +751,26 @@ async function resolveWorkspaceProviderIdentitySingle(
|
|
|
679
751
|
label: text(body.hub_domain) ?? `HubSpot portal ${accountId}`,
|
|
680
752
|
};
|
|
681
753
|
}
|
|
754
|
+
if (providerId === "salesforce") {
|
|
755
|
+
const instanceUrl = normalizeSalesforceInstanceUrl(
|
|
756
|
+
text(tokens.instance_url),
|
|
757
|
+
);
|
|
758
|
+
const identity = parseSalesforceIdentityUrl(text(tokens.id));
|
|
759
|
+
if (!instanceUrl || !identity) {
|
|
760
|
+
throw new Error(
|
|
761
|
+
"Salesforce OAuth response did not identify the connected organization.",
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
return {
|
|
765
|
+
accountId: identity.organizationId,
|
|
766
|
+
label: instanceUrl.hostname,
|
|
767
|
+
config: {
|
|
768
|
+
salesforceInstanceUrl: instanceUrl.origin,
|
|
769
|
+
salesforceIdentityUrl: identity.url.href,
|
|
770
|
+
salesforceOrganizationId: identity.organizationId,
|
|
771
|
+
},
|
|
772
|
+
};
|
|
773
|
+
}
|
|
682
774
|
if (providerId === "sentry") {
|
|
683
775
|
const accessToken = text(tokens.access_token)!;
|
|
684
776
|
const { response, body: user } = await fetchBoundedProviderJson(
|
|
@@ -799,7 +891,13 @@ export function scopedOAuthAccountId(
|
|
|
799
891
|
owner: string,
|
|
800
892
|
accountId: string,
|
|
801
893
|
): string {
|
|
802
|
-
if (
|
|
894
|
+
if (
|
|
895
|
+
provider !== "hubspot" &&
|
|
896
|
+
provider !== "salesforce" &&
|
|
897
|
+
provider !== "jira"
|
|
898
|
+
) {
|
|
899
|
+
return accountId;
|
|
900
|
+
}
|
|
803
901
|
const ownerKey = crypto
|
|
804
902
|
.createHash("sha256")
|
|
805
903
|
.update(`${provider}:${owner.trim().toLowerCase()}`)
|
|
@@ -902,9 +1000,88 @@ function clientCredentialKeys(
|
|
|
902
1000
|
const integrationPrefix = `HUBSPOT_INTEGRATION_CLIENT_${suffix}`;
|
|
903
1001
|
return [integrationPrefix, `HUBSPOT_CLIENT_${suffix}`];
|
|
904
1002
|
}
|
|
1003
|
+
if (provider === "salesforce") {
|
|
1004
|
+
const integrationPrefix = `SALESFORCE_INTEGRATION_CLIENT_${suffix}`;
|
|
1005
|
+
const consumerCredential = `SALESFORCE_CONSUMER_${
|
|
1006
|
+
field === "id" ? "KEY" : "SECRET"
|
|
1007
|
+
}`;
|
|
1008
|
+
return [
|
|
1009
|
+
integrationPrefix,
|
|
1010
|
+
`SALESFORCE_CLIENT_${suffix}`,
|
|
1011
|
+
consumerCredential,
|
|
1012
|
+
];
|
|
1013
|
+
}
|
|
905
1014
|
return [`${prefix}_CLIENT_${suffix}`];
|
|
906
1015
|
}
|
|
907
1016
|
|
|
1017
|
+
function normalizeSalesforceInstanceUrl(value: string | undefined): URL | null {
|
|
1018
|
+
if (!value) return null;
|
|
1019
|
+
try {
|
|
1020
|
+
const url = new URL(value);
|
|
1021
|
+
const host = url.hostname.toLowerCase();
|
|
1022
|
+
if (
|
|
1023
|
+
url.protocol !== "https:" ||
|
|
1024
|
+
url.username ||
|
|
1025
|
+
url.password ||
|
|
1026
|
+
url.port ||
|
|
1027
|
+
(host !== "salesforce.com" && !host.endsWith(".salesforce.com"))
|
|
1028
|
+
) {
|
|
1029
|
+
return null;
|
|
1030
|
+
}
|
|
1031
|
+
return new URL(url.origin);
|
|
1032
|
+
} catch {
|
|
1033
|
+
return null;
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
function parseSalesforceIdentityUrl(
|
|
1038
|
+
value: string | undefined,
|
|
1039
|
+
): { organizationId: string; url: URL } | null {
|
|
1040
|
+
if (!value) return null;
|
|
1041
|
+
try {
|
|
1042
|
+
const url = new URL(value);
|
|
1043
|
+
const host = url.hostname.toLowerCase();
|
|
1044
|
+
if (
|
|
1045
|
+
url.protocol !== "https:" ||
|
|
1046
|
+
url.username ||
|
|
1047
|
+
url.password ||
|
|
1048
|
+
url.port ||
|
|
1049
|
+
(host !== "salesforce.com" && !host.endsWith(".salesforce.com"))
|
|
1050
|
+
) {
|
|
1051
|
+
return null;
|
|
1052
|
+
}
|
|
1053
|
+
const match = url.pathname.match(/^\/id\/([^/]+)\/[^/]+\/?$/);
|
|
1054
|
+
if (!match?.[1]) return null;
|
|
1055
|
+
return { organizationId: match[1], url };
|
|
1056
|
+
} catch {
|
|
1057
|
+
return null;
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
export function resolveSalesforceOAuthLoginUrl(
|
|
1062
|
+
environment: string | undefined,
|
|
1063
|
+
): string | null {
|
|
1064
|
+
const normalized = environment?.trim().toLowerCase();
|
|
1065
|
+
if (!normalized || normalized === "production") {
|
|
1066
|
+
return SALESFORCE_PRODUCTION_LOGIN_URL;
|
|
1067
|
+
}
|
|
1068
|
+
if (normalized === "sandbox") return SALESFORCE_SANDBOX_LOGIN_URL;
|
|
1069
|
+
return null;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
export function salesforceOAuthEndpoint(
|
|
1073
|
+
loginUrl: string,
|
|
1074
|
+
phase: "authorize" | "token",
|
|
1075
|
+
): string {
|
|
1076
|
+
if (
|
|
1077
|
+
loginUrl !== SALESFORCE_PRODUCTION_LOGIN_URL &&
|
|
1078
|
+
loginUrl !== SALESFORCE_SANDBOX_LOGIN_URL
|
|
1079
|
+
) {
|
|
1080
|
+
throw new Error("Invalid Salesforce OAuth login URL.");
|
|
1081
|
+
}
|
|
1082
|
+
return `${loginUrl}/services/oauth2/${phase}`;
|
|
1083
|
+
}
|
|
1084
|
+
|
|
908
1085
|
async function resolveProviderClientCredentials(
|
|
909
1086
|
provider: GenericWorkspaceOAuthProvider,
|
|
910
1087
|
): Promise<[string | null, string | null]> {
|
|
@@ -771,6 +771,7 @@
|
|
|
771
771
|
|
|
772
772
|
.agent-composer-missing-key-trigger {
|
|
773
773
|
display: flex;
|
|
774
|
+
cursor: pointer;
|
|
774
775
|
min-height: 4.5rem;
|
|
775
776
|
width: 100%;
|
|
776
777
|
flex: 1;
|
|
@@ -783,6 +784,9 @@
|
|
|
783
784
|
text-align: start;
|
|
784
785
|
color: hsl(var(--foreground));
|
|
785
786
|
outline: none;
|
|
787
|
+
transition:
|
|
788
|
+
background-color 150ms ease-out,
|
|
789
|
+
box-shadow 150ms ease-out;
|
|
786
790
|
}
|
|
787
791
|
|
|
788
792
|
.agent-composer-missing-key-trigger:hover {
|
|
@@ -793,6 +797,14 @@
|
|
|
793
797
|
box-shadow: inset 0 0 0 2px hsl(var(--ring));
|
|
794
798
|
}
|
|
795
799
|
|
|
800
|
+
.agent-composer-missing-key-content {
|
|
801
|
+
display: flex;
|
|
802
|
+
min-width: 0;
|
|
803
|
+
flex-direction: column;
|
|
804
|
+
align-items: flex-start;
|
|
805
|
+
gap: 0.5rem;
|
|
806
|
+
}
|
|
807
|
+
|
|
796
808
|
.agent-composer-missing-key-copy {
|
|
797
809
|
display: flex;
|
|
798
810
|
min-width: 0;
|
|
@@ -812,6 +824,31 @@
|
|
|
812
824
|
color: hsl(var(--muted-foreground));
|
|
813
825
|
}
|
|
814
826
|
|
|
827
|
+
.agent-composer-missing-key-cta {
|
|
828
|
+
display: inline-flex;
|
|
829
|
+
min-height: 2rem;
|
|
830
|
+
align-items: center;
|
|
831
|
+
justify-content: center;
|
|
832
|
+
border-radius: 0.375rem;
|
|
833
|
+
background: hsl(var(--foreground));
|
|
834
|
+
padding: 0.5rem 0.75rem;
|
|
835
|
+
color: hsl(var(--background));
|
|
836
|
+
font-size: 0.75rem;
|
|
837
|
+
font-weight: 600;
|
|
838
|
+
line-height: 1rem;
|
|
839
|
+
transition:
|
|
840
|
+
opacity 150ms ease-out,
|
|
841
|
+
transform 150ms ease-out;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
.agent-composer-missing-key-trigger:hover .agent-composer-missing-key-cta {
|
|
845
|
+
opacity: 0.9;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
.agent-composer-missing-key-trigger:active .agent-composer-missing-key-cta {
|
|
849
|
+
transform: scale(0.98);
|
|
850
|
+
}
|
|
851
|
+
|
|
815
852
|
.agent-composer-root--hero .agent-composer-missing-key-trigger {
|
|
816
853
|
min-height: 7.5rem;
|
|
817
854
|
justify-content: center;
|
|
@@ -824,6 +861,10 @@
|
|
|
824
861
|
line-height: 1.375rem;
|
|
825
862
|
}
|
|
826
863
|
|
|
864
|
+
.agent-composer-root--hero .agent-composer-missing-key-content {
|
|
865
|
+
align-items: center;
|
|
866
|
+
}
|
|
867
|
+
|
|
827
868
|
.agent-composer-stack {
|
|
828
869
|
position: relative;
|
|
829
870
|
flex-shrink: 0;
|
|
@@ -881,13 +922,15 @@
|
|
|
881
922
|
line-height: 1.125rem;
|
|
882
923
|
}
|
|
883
924
|
|
|
884
|
-
.agent-thinking-indicator__text
|
|
925
|
+
.agent-thinking-indicator__text,
|
|
926
|
+
.agent-running-shimmer {
|
|
885
927
|
display: inline-block;
|
|
886
928
|
}
|
|
887
929
|
|
|
888
930
|
@media (prefers-reduced-motion: no-preference) {
|
|
889
931
|
@supports ((background-clip: text) or (-webkit-background-clip: text)) {
|
|
890
|
-
.agent-thinking-indicator__text
|
|
932
|
+
.agent-thinking-indicator__text,
|
|
933
|
+
.agent-running-shimmer {
|
|
891
934
|
color: transparent;
|
|
892
935
|
background: linear-gradient(
|
|
893
936
|
90deg,
|
|
@@ -66,6 +66,33 @@ state, auth, and agent-chat runtime contracts. Never edit `node_modules` or
|
|
|
66
66
|
deep-import its private source. Manual copying is only the fallback described by
|
|
67
67
|
an unknown third-party package's add-style blueprint.
|
|
68
68
|
|
|
69
|
+
## Reuse Proven Patterns (rg + cp)
|
|
70
|
+
|
|
71
|
+
Version-matched installed source outranks web docs or memory: it is the exact
|
|
72
|
+
code shipping with this app. `node_modules/@agent-native/core/corpus/templates/`
|
|
73
|
+
holds source for every first-party template, not just the one this app started
|
|
74
|
+
from, so a pattern from the mail template is fair game for a tasks app. Grep
|
|
75
|
+
across it, then copy a whole file as a starting point instead of writing the
|
|
76
|
+
pattern from scratch:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Find how other templates solved a similar problem
|
|
80
|
+
rg -n "drag.*drop|reorder" node_modules/@agent-native/core/corpus/templates
|
|
81
|
+
|
|
82
|
+
# Grab a proven action file as a starting point, then adapt names/schema
|
|
83
|
+
cp node_modules/@agent-native/core/corpus/templates/mail/actions/archive-email.ts \
|
|
84
|
+
actions/archive-item.ts
|
|
85
|
+
|
|
86
|
+
# Read the full framework source behind an API, not just the corpus copy
|
|
87
|
+
rg -n "defineAction" node_modules/@agent-native/core/src/action.ts
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Copying template-level app code (actions, components, skill files) is the
|
|
91
|
+
expected reuse path — templates exist to be forked. This is different from
|
|
92
|
+
copying `core`/`toolkit` **runtime internals**: for those, follow
|
|
93
|
+
`customizing-agent-native`'s configure/compose/eject ladder instead of
|
|
94
|
+
hand-duplicating framework logic.
|
|
95
|
+
|
|
69
96
|
## Useful Slugs
|
|
70
97
|
|
|
71
98
|
| Need | Slugs |
|
|
@@ -66,6 +66,33 @@ state, auth, and agent-chat runtime contracts. Never edit `node_modules` or
|
|
|
66
66
|
deep-import its private source. Manual copying is only the fallback described by
|
|
67
67
|
an unknown third-party package's add-style blueprint.
|
|
68
68
|
|
|
69
|
+
## Reuse Proven Patterns (rg + cp)
|
|
70
|
+
|
|
71
|
+
Version-matched installed source outranks web docs or memory: it is the exact
|
|
72
|
+
code shipping with this app. `node_modules/@agent-native/core/corpus/templates/`
|
|
73
|
+
holds source for every first-party template, not just the one this app started
|
|
74
|
+
from, so a pattern from the mail template is fair game for a tasks app. Grep
|
|
75
|
+
across it, then copy a whole file as a starting point instead of writing the
|
|
76
|
+
pattern from scratch:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Find how other templates solved a similar problem
|
|
80
|
+
rg -n "drag.*drop|reorder" node_modules/@agent-native/core/corpus/templates
|
|
81
|
+
|
|
82
|
+
# Grab a proven action file as a starting point, then adapt names/schema
|
|
83
|
+
cp node_modules/@agent-native/core/corpus/templates/mail/actions/archive-email.ts \
|
|
84
|
+
actions/archive-item.ts
|
|
85
|
+
|
|
86
|
+
# Read the full framework source behind an API, not just the corpus copy
|
|
87
|
+
rg -n "defineAction" node_modules/@agent-native/core/src/action.ts
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Copying template-level app code (actions, components, skill files) is the
|
|
91
|
+
expected reuse path — templates exist to be forked. This is different from
|
|
92
|
+
copying `core`/`toolkit` **runtime internals**: for those, follow
|
|
93
|
+
`customizing-agent-native`'s configure/compose/eject ladder instead of
|
|
94
|
+
hand-duplicating framework logic.
|
|
95
|
+
|
|
69
96
|
## Useful Slugs
|
|
70
97
|
|
|
71
98
|
| Need | Slugs |
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: app-branding
|
|
3
|
+
description: >-
|
|
4
|
+
How to rename or rebrand the app so every surface — title, package metadata,
|
|
5
|
+
PWA manifest, and icons — stays consistent. Use when a prompt establishes or
|
|
6
|
+
implies a new app name, title, or visual identity, OR when you generate an app
|
|
7
|
+
title, theme, or icon yourself while scaffolding an app from an initial prompt.
|
|
8
|
+
scope: dev
|
|
9
|
+
metadata:
|
|
10
|
+
internal: true
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# App Branding
|
|
14
|
+
|
|
15
|
+
## Trigger
|
|
16
|
+
|
|
17
|
+
Read this skill whenever the app's name, title, or visual identity is being
|
|
18
|
+
established or changed — whether the user states it or **you derive it yourself**.
|
|
19
|
+
|
|
20
|
+
- **Explicit** — the prompt names the app: "rename this app to …", "this is a
|
|
21
|
+
Todo app called …", "call this app …".
|
|
22
|
+
- **Implicit / agent-generated** — the prompt describes what to build but leaves
|
|
23
|
+
the branding to you: "build me a habit tracker", "turn this into a recipe
|
|
24
|
+
manager", "make a CRM for my studio". The moment you decide on a title, theme
|
|
25
|
+
color, or icon from that prompt, treat it as a branding change and apply the
|
|
26
|
+
full checklist so your generated identity lands on every surface — not just
|
|
27
|
+
the one screen you happen to be building.
|
|
28
|
+
|
|
29
|
+
If you are inventing an app title, theme, or icon as part of scaffolding a new
|
|
30
|
+
app from an initial prompt, that counts — run the checklist in the same pass.
|
|
31
|
+
|
|
32
|
+
## Rule
|
|
33
|
+
|
|
34
|
+
Apply **all** of the updates below in a single consistent pass. Depending on the
|
|
35
|
+
template, the app name may live in one source-of-truth module or be spread
|
|
36
|
+
across several files — either way, a partial rename leaves the app half-branded
|
|
37
|
+
(a stale tab title, launcher label, or icon).
|
|
38
|
+
|
|
39
|
+
Derive three values once, then reuse them everywhere:
|
|
40
|
+
|
|
41
|
+
- **Title** — human-readable display name, e.g. `"My Task App"`.
|
|
42
|
+
- **Slug** — URL/npm-safe form: lowercase letters, digits, and hyphens only,
|
|
43
|
+
e.g. `"my-task-app"`.
|
|
44
|
+
- **Description** — one sentence describing what the app does.
|
|
45
|
+
|
|
46
|
+
## Locate the layout first
|
|
47
|
+
|
|
48
|
+
Branding lives in different places depending on the template. Detect which
|
|
49
|
+
layout you are in before editing:
|
|
50
|
+
|
|
51
|
+
- **Centralized layout** — `app/lib/app-config.ts` exists. It is the single
|
|
52
|
+
source of truth for the name and title; the frontend surfaces (`<title>`,
|
|
53
|
+
route `meta()`, header, sidebar, index heading, `apple-mobile-web-app-title`)
|
|
54
|
+
derive from its `APP_NAME` / `APP_TITLE` exports, so you change the name in one
|
|
55
|
+
place.
|
|
56
|
+
- **Inlined layout** — no `app/lib/app-config.ts`. The name and title are
|
|
57
|
+
written directly into `package.json`, each route's `meta()`, and
|
|
58
|
+
`app/root.tsx`. You must update each surface individually.
|
|
59
|
+
|
|
60
|
+
When in doubt, `grep -rn` the current title and slug across `app/`, `server/`,
|
|
61
|
+
`package.json`, and `public/` and fix every real hit — the two layouts share the
|
|
62
|
+
manifest and icon steps regardless.
|
|
63
|
+
|
|
64
|
+
## The Checklist
|
|
65
|
+
|
|
66
|
+
### Step 1 — App name + title source
|
|
67
|
+
|
|
68
|
+
**Centralized layout** (`app/lib/app-config.ts`): change both constants and stop —
|
|
69
|
+
the rest of the frontend derives from them.
|
|
70
|
+
|
|
71
|
+
- `rawAppName` → the **slug**.
|
|
72
|
+
- `rawAppTitle` → the **title**.
|
|
73
|
+
|
|
74
|
+
**Inlined layout** (no `app-config.ts`): set the title/slug at each surface.
|
|
75
|
+
|
|
76
|
+
- Every route `meta()` title under `app/routes/*.tsx` (e.g. `_index.tsx`,
|
|
77
|
+
`agent.tsx`, `settings.tsx`) — replace the app title. These are seeded from a
|
|
78
|
+
`{{APP_TITLE}}` placeholder at scaffold time and become plain literals
|
|
79
|
+
afterward.
|
|
80
|
+
- Any `useActionQuery("hello", { name: … })` in `app/routes/_index.tsx` seeded
|
|
81
|
+
with the title.
|
|
82
|
+
- `app/root.tsx` `apple-mobile-web-app-title` — a literal (often `"App"`); set it
|
|
83
|
+
to the **title**.
|
|
84
|
+
|
|
85
|
+
### Step 2 — `package.json` (both layouts)
|
|
86
|
+
|
|
87
|
+
- `displayName` → the **title** (add the field if the template omits it).
|
|
88
|
+
- `description` → the **description** (add if absent).
|
|
89
|
+
- `name` → the **slug**. Only change this if the user explicitly asks to rename
|
|
90
|
+
the package (it is the npm package identifier).
|
|
91
|
+
|
|
92
|
+
### Step 3 — Login / auth title (centralized layout only)
|
|
93
|
+
|
|
94
|
+
If `server/plugins/auth.ts` exists it keeps its **own** duplicate `rawAppTitle`,
|
|
95
|
+
used on the login/signup pages. Set it to the same **title** as
|
|
96
|
+
`app/lib/app-config.ts`. (The inlined layout's `server/middleware/auth.ts`
|
|
97
|
+
carries no app title — skip this step there.)
|
|
98
|
+
|
|
99
|
+
### Step 4 — `public/manifest.json` (both layouts)
|
|
100
|
+
|
|
101
|
+
This is a static file (not generated by a plugin). Update:
|
|
102
|
+
|
|
103
|
+
- `name` → the **title** (full install name in OS app drawers).
|
|
104
|
+
- `short_name` → a compact launcher label; keep it ≤12 characters, abbreviating
|
|
105
|
+
the title if needed.
|
|
106
|
+
- `description` → the same **description** used in `package.json`.
|
|
107
|
+
|
|
108
|
+
### Step 5 — Icon SVG files (both layouts)
|
|
109
|
+
|
|
110
|
+
Replace the icon files with a new mark that reflects the app's identity. The set
|
|
111
|
+
present depends on the template; update each one you find:
|
|
112
|
+
|
|
113
|
+
| File | Purpose |
|
|
114
|
+
| --- | --- |
|
|
115
|
+
| `public/favicon.svg` | Browser tab favicon |
|
|
116
|
+
| `public/icon-180.svg` | Apple touch icon (iOS home screen) |
|
|
117
|
+
| `public/icon-192.svg` | PWA install icon (Android / Chrome) |
|
|
118
|
+
| `public/icon-512.svg` | PWA install icon (large / splash) |
|
|
119
|
+
|
|
120
|
+
Build the icon from **SVG primitives** — do not embed a base64-encoded PNG. All
|
|
121
|
+
files should share the same visual design; only the `width` and `height`
|
|
122
|
+
attributes differ. A simple, reliable approach: a filled rounded square in the
|
|
123
|
+
brand color with the first letter (or a relevant glyph) centered in white.
|
|
124
|
+
|
|
125
|
+
Template to adapt (change `fill`, the letter/glyph, and `rx` to suit the brand):
|
|
126
|
+
|
|
127
|
+
```svg
|
|
128
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 192 192">
|
|
129
|
+
<rect width="192" height="192" rx="40" fill="#2563EB"/>
|
|
130
|
+
<text x="96" y="130" font-family="system-ui, sans-serif" font-size="110"
|
|
131
|
+
font-weight="700" fill="white" text-anchor="middle">A</text>
|
|
132
|
+
</svg>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Keep `width`/`height` at `180`, `192`, and `512` for the respective icon files;
|
|
136
|
+
`favicon.svg` can use any of these sizes (the `viewBox` keeps it scalable).
|
|
137
|
+
|
|
138
|
+
## What NOT to change
|
|
139
|
+
|
|
140
|
+
These are stable identifiers or template-internal files, not user-facing brand:
|
|
141
|
+
|
|
142
|
+
- `configureTracking({ app, template })` in `app/root.tsx` — analytics
|
|
143
|
+
identifiers seeded at scaffold time; leave them. This holds even in the inlined
|
|
144
|
+
layout, where `app` was seeded from the slug — changing it re-keys analytics
|
|
145
|
+
history.
|
|
146
|
+
- `server/plugins/agent-chat.ts` `appId` (centralized layout) — a stable
|
|
147
|
+
platform analytics/routing key; leave it exactly as scaffolded.
|
|
148
|
+
- `.github/workflows/*.yml` — template automation; references the repo/template
|
|
149
|
+
identity, not the running app.
|
|
150
|
+
- `AGENTS.md` / `DEVELOPING.md` — developer docs for the template itself.
|
|
151
|
+
|
|
152
|
+
## Verification
|
|
153
|
+
|
|
154
|
+
- `pnpm typecheck` passes.
|
|
155
|
+
- Grep for the old title/slug across `app/`, `server/`, `package.json`, and
|
|
156
|
+
`public/` — no unintended leftovers remain (except the intentional
|
|
157
|
+
"do not change" identifiers above).
|
|
158
|
+
- The browser tab title, sidebar/header, and index heading all show the new
|
|
159
|
+
title.
|