@agent-native/core 0.114.16 → 0.115.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-native.eject.json +2 -0
- package/corpus/README.md +3 -3
- package/corpus/core/CHANGELOG.md +29 -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 +105 -3
- 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/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/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 +83 -3
- package/dist/agent/production-agent.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/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/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.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/observability/routes.d.ts +5 -5
- 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/secrets/routes.d.ts +9 -9
- 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/transcribe-voice.d.ts +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 +6 -2
- package/src/action.ts +22 -1
- package/src/agent/production-agent.ts +105 -3
- 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/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
|
@@ -104,6 +104,10 @@ function ToolLongRunningHintShell({
|
|
|
104
104
|
children: React.ReactNode;
|
|
105
105
|
}) {
|
|
106
106
|
const [showLongRunningHint, setShowLongRunningHint] = useState(false);
|
|
107
|
+
// useState initializer runs once at mount: a row that mounts already
|
|
108
|
+
// resolved never animates, while a tool appended during an active stream
|
|
109
|
+
// mounts running and animates in.
|
|
110
|
+
const [animateEntry] = useState(isRunning);
|
|
107
111
|
|
|
108
112
|
useEffect(() => {
|
|
109
113
|
if (!isRunning) {
|
|
@@ -118,14 +122,21 @@ function ToolLongRunningHintShell({
|
|
|
118
122
|
}, [isRunning, toolName]);
|
|
119
123
|
|
|
120
124
|
return (
|
|
121
|
-
|
|
125
|
+
<div
|
|
126
|
+
className={cn(
|
|
127
|
+
"agent-tool-call",
|
|
128
|
+
animateEntry &&
|
|
129
|
+
"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-1 motion-safe:duration-200 motion-safe:ease-[var(--ease-out-strong)]",
|
|
130
|
+
)}
|
|
131
|
+
data-running={isRunning ? "true" : undefined}
|
|
132
|
+
>
|
|
122
133
|
{children}
|
|
123
134
|
{isRunning && showLongRunningHint && (
|
|
124
135
|
<div className="mt-0.5 px-2.5 text-[11px] leading-snug text-muted-foreground/80">
|
|
125
136
|
Still working. Large updates can take a minute or two.
|
|
126
137
|
</div>
|
|
127
138
|
)}
|
|
128
|
-
|
|
139
|
+
</div>
|
|
129
140
|
);
|
|
130
141
|
}
|
|
131
142
|
|
|
@@ -542,6 +553,7 @@ export function ToolCallDisplay({
|
|
|
542
553
|
structuredMeta,
|
|
543
554
|
approval,
|
|
544
555
|
repeatCount,
|
|
556
|
+
isLatestRunning = isRunning,
|
|
545
557
|
}: {
|
|
546
558
|
toolName: string;
|
|
547
559
|
argsText?: string;
|
|
@@ -553,6 +565,7 @@ export function ToolCallDisplay({
|
|
|
553
565
|
structuredMeta?: Record<string, unknown>;
|
|
554
566
|
approval?: { approvalKey: string; dismissed?: boolean };
|
|
555
567
|
repeatCount?: number;
|
|
568
|
+
isLatestRunning?: boolean;
|
|
556
569
|
}) {
|
|
557
570
|
// Delegate to bespoke cells when structured metadata is present.
|
|
558
571
|
// These must be separate components so hook order in ToolCallDisplayGeneric
|
|
@@ -603,6 +616,7 @@ export function ToolCallDisplay({
|
|
|
603
616
|
mcpApp={mcpApp}
|
|
604
617
|
chatUI={chatUI}
|
|
605
618
|
isRunning={isRunning}
|
|
619
|
+
isLatestRunning={isLatestRunning}
|
|
606
620
|
approval={approval}
|
|
607
621
|
repeatCount={repeatCount}
|
|
608
622
|
/>,
|
|
@@ -617,6 +631,7 @@ function ToolCallDisplayGeneric({
|
|
|
617
631
|
mcpApp,
|
|
618
632
|
chatUI,
|
|
619
633
|
isRunning,
|
|
634
|
+
isLatestRunning,
|
|
620
635
|
approval,
|
|
621
636
|
repeatCount,
|
|
622
637
|
}: {
|
|
@@ -627,6 +642,7 @@ function ToolCallDisplayGeneric({
|
|
|
627
642
|
mcpApp?: AgentMcpAppPayload;
|
|
628
643
|
chatUI?: ActionChatUIConfig;
|
|
629
644
|
isRunning: boolean;
|
|
645
|
+
isLatestRunning: boolean;
|
|
630
646
|
approval?: { approvalKey: string; dismissed?: boolean };
|
|
631
647
|
repeatCount?: number;
|
|
632
648
|
}) {
|
|
@@ -786,7 +802,14 @@ function ToolCallDisplayGeneric({
|
|
|
786
802
|
</>
|
|
787
803
|
)}
|
|
788
804
|
</span>
|
|
789
|
-
<span
|
|
805
|
+
<span
|
|
806
|
+
className={cn(
|
|
807
|
+
"min-w-0 truncate font-normal",
|
|
808
|
+
isRunning && isLatestRunning && "agent-running-shimmer",
|
|
809
|
+
)}
|
|
810
|
+
>
|
|
811
|
+
{displayName}
|
|
812
|
+
</span>
|
|
790
813
|
{repeatCount && repeatCount > 1 && (
|
|
791
814
|
<span
|
|
792
815
|
className="shrink-0 rounded border border-border/60 px-1.5 py-0.5 text-[10px] leading-none text-muted-foreground"
|
|
@@ -864,6 +887,7 @@ export function ToolCallFallback({
|
|
|
864
887
|
activity?: boolean;
|
|
865
888
|
approval?: { approvalKey: string; dismissed?: boolean };
|
|
866
889
|
repeatCount?: number;
|
|
890
|
+
isLatestRunning?: boolean;
|
|
867
891
|
}) {
|
|
868
892
|
const chatRunning = React.useContext(ChatRunningContext);
|
|
869
893
|
const isRunning =
|
|
@@ -884,6 +908,7 @@ export function ToolCallFallback({
|
|
|
884
908
|
chatUI={rest.chatUI}
|
|
885
909
|
structuredMeta={rest.structuredMeta}
|
|
886
910
|
isRunning={isRunning}
|
|
911
|
+
isLatestRunning={rest.isLatestRunning}
|
|
887
912
|
approval={rest.approval}
|
|
888
913
|
repeatCount={rest.repeatCount}
|
|
889
914
|
/>
|
|
@@ -910,6 +935,15 @@ export function ReconnectStreamMessage({
|
|
|
910
935
|
content.at(-1)?.type === "text" ? content.length - 1 : -1;
|
|
911
936
|
const streamingReasoningPartIndex =
|
|
912
937
|
content.at(-1)?.type === "reasoning" ? content.length - 1 : -1;
|
|
938
|
+
const latestRunningToolIndex = content.reduce(
|
|
939
|
+
(latestIndex, part, index) =>
|
|
940
|
+
part.type === "tool-call" &&
|
|
941
|
+
part.result === undefined &&
|
|
942
|
+
(chatRunning || part.activity === true)
|
|
943
|
+
? index
|
|
944
|
+
: latestIndex,
|
|
945
|
+
-1,
|
|
946
|
+
);
|
|
913
947
|
|
|
914
948
|
const renderPart = (part: ContentPart, i: number) => {
|
|
915
949
|
if (part.type === "text") {
|
|
@@ -949,6 +983,7 @@ export function ReconnectStreamMessage({
|
|
|
949
983
|
isRunning={
|
|
950
984
|
part.result === undefined && (chatRunning || part.activity === true)
|
|
951
985
|
}
|
|
986
|
+
isLatestRunning={i === latestRunningToolIndex}
|
|
952
987
|
approval={part.approval}
|
|
953
988
|
repeatCount={part.repeatCount}
|
|
954
989
|
/>
|
|
@@ -13,6 +13,7 @@ export type WorkspaceConnectionTemplateUse =
|
|
|
13
13
|
| "calendar"
|
|
14
14
|
| "clips"
|
|
15
15
|
| "content"
|
|
16
|
+
| "crm"
|
|
16
17
|
| "design"
|
|
17
18
|
| "dispatch"
|
|
18
19
|
| "forms"
|
|
@@ -27,6 +28,7 @@ export type WorkspaceConnectionProviderId =
|
|
|
27
28
|
| "gmail"
|
|
28
29
|
| "google_drive"
|
|
29
30
|
| "hubspot"
|
|
31
|
+
| "salesforce"
|
|
30
32
|
| "jira"
|
|
31
33
|
| "sentry"
|
|
32
34
|
| "granola"
|
|
@@ -239,7 +241,24 @@ export const WORKSPACE_CONNECTION_PROVIDERS = [
|
|
|
239
241
|
],
|
|
240
242
|
},
|
|
241
243
|
capabilities: ["search", "import", "crm"],
|
|
242
|
-
recommendedTemplateUses: ["analytics", "brain", "mail", "dispatch"],
|
|
244
|
+
recommendedTemplateUses: ["analytics", "brain", "crm", "mail", "dispatch"],
|
|
245
|
+
}),
|
|
246
|
+
defineWorkspaceConnectionProvider({
|
|
247
|
+
id: "salesforce",
|
|
248
|
+
label: "Salesforce",
|
|
249
|
+
description:
|
|
250
|
+
"CRM accounts, contacts, opportunities, custom objects, and activity history for customer-aware apps.",
|
|
251
|
+
credentialKeys: [],
|
|
252
|
+
oauth: {
|
|
253
|
+
provider: "salesforce",
|
|
254
|
+
authorizationUrl:
|
|
255
|
+
"https://login.salesforce.com/services/oauth2/authorize",
|
|
256
|
+
tokenUrl: "https://login.salesforce.com/services/oauth2/token",
|
|
257
|
+
refreshUrl: "https://login.salesforce.com/services/oauth2/token",
|
|
258
|
+
scopes: ["api", "refresh_token", "id"],
|
|
259
|
+
},
|
|
260
|
+
capabilities: ["search", "import", "crm"],
|
|
261
|
+
recommendedTemplateUses: ["analytics", "brain", "crm", "dispatch"],
|
|
243
262
|
}),
|
|
244
263
|
defineWorkspaceConnectionProvider({
|
|
245
264
|
id: "jira",
|
|
@@ -506,6 +506,71 @@ export const PROVIDER_READERS = [
|
|
|
506
506
|
notes:
|
|
507
507
|
"Templates define object allow-lists and property projections; core only documents the reader shape.",
|
|
508
508
|
}),
|
|
509
|
+
defineProviderReader({
|
|
510
|
+
providerId: "salesforce",
|
|
511
|
+
label: "Salesforce reader",
|
|
512
|
+
description:
|
|
513
|
+
"Normalized metadata for CRM object lookup through template-owned Salesforce integrations.",
|
|
514
|
+
implementationStatus: "template-owned",
|
|
515
|
+
credentialKeys: providerCredentialKeys("salesforce"),
|
|
516
|
+
requiredCredentialKeys: requiredCredentialKeys("salesforce"),
|
|
517
|
+
capabilities: [
|
|
518
|
+
{
|
|
519
|
+
capability: "search",
|
|
520
|
+
label: "CRM search",
|
|
521
|
+
description:
|
|
522
|
+
"Search Salesforce CRM records with provider-native SOQL or object filters.",
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
capability: "crm",
|
|
526
|
+
label: "CRM retrieval",
|
|
527
|
+
description:
|
|
528
|
+
"Read Salesforce standard and custom CRM objects when a template owns object mapping.",
|
|
529
|
+
},
|
|
530
|
+
],
|
|
531
|
+
operations: [
|
|
532
|
+
operation(
|
|
533
|
+
"search",
|
|
534
|
+
"Search Salesforce CRM",
|
|
535
|
+
"Find CRM records matching text, SOQL, or provider-native filters.",
|
|
536
|
+
"template-owned",
|
|
537
|
+
[
|
|
538
|
+
...searchParameters,
|
|
539
|
+
{
|
|
540
|
+
name: "objectType",
|
|
541
|
+
type: "string",
|
|
542
|
+
description:
|
|
543
|
+
"Optional Salesforce object API name such as Account, Contact, Opportunity, or a custom object.",
|
|
544
|
+
},
|
|
545
|
+
],
|
|
546
|
+
),
|
|
547
|
+
operation(
|
|
548
|
+
"get",
|
|
549
|
+
"Get Salesforce CRM object",
|
|
550
|
+
"Load one Salesforce CRM record by object API name and id.",
|
|
551
|
+
"template-owned",
|
|
552
|
+
[
|
|
553
|
+
...getParameters,
|
|
554
|
+
{
|
|
555
|
+
name: "objectType",
|
|
556
|
+
type: "string",
|
|
557
|
+
required: true,
|
|
558
|
+
description:
|
|
559
|
+
"Salesforce object API name such as Account, Contact, Opportunity, or a custom object.",
|
|
560
|
+
},
|
|
561
|
+
],
|
|
562
|
+
),
|
|
563
|
+
operation(
|
|
564
|
+
"listRecent",
|
|
565
|
+
"List recent Salesforce CRM objects",
|
|
566
|
+
"List recently updated CRM records visible to the connected Salesforce user.",
|
|
567
|
+
"template-owned",
|
|
568
|
+
listRecentParameters,
|
|
569
|
+
),
|
|
570
|
+
],
|
|
571
|
+
notes:
|
|
572
|
+
"Templates define object allow-lists, field projections, and API-version selection; core only documents the reader shape.",
|
|
573
|
+
}),
|
|
509
574
|
defineProviderReader({
|
|
510
575
|
providerId: "gmail",
|
|
511
576
|
label: "Gmail reader",
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export {
|
|
2
|
+
createDashboardStorageSchema,
|
|
3
|
+
type DashboardStorageSchema,
|
|
4
|
+
type DashboardStorageSchemaOptions,
|
|
5
|
+
} from "./schema.js";
|
|
6
|
+
export {
|
|
7
|
+
createDashboardStorage,
|
|
8
|
+
DashboardStorageConflictError,
|
|
9
|
+
type DashboardRecord,
|
|
10
|
+
type DashboardRevisionRecord,
|
|
11
|
+
type DashboardStorageOptions,
|
|
12
|
+
type DashboardWriteInput,
|
|
13
|
+
} from "./store.js";
|
|
14
|
+
export {
|
|
15
|
+
createPanelSourceResolverRegistry,
|
|
16
|
+
createProgramPanelSourceResolver,
|
|
17
|
+
parseProgramPanelDescriptor,
|
|
18
|
+
type DashboardPanelColumn,
|
|
19
|
+
type PanelSourceFailure,
|
|
20
|
+
type PanelSourceRequest,
|
|
21
|
+
type PanelSourceResolver,
|
|
22
|
+
type PanelSourceResolverRegistry,
|
|
23
|
+
type PanelSourceResponse,
|
|
24
|
+
type PanelSourceResult,
|
|
25
|
+
type ProgramPanelContext,
|
|
26
|
+
type ProgramPanelDescriptor,
|
|
27
|
+
} from "./panel-source.js";
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { runDataProgram } from "../data-programs/index.js";
|
|
2
|
+
|
|
3
|
+
export interface DashboardPanelColumn {
|
|
4
|
+
name: string;
|
|
5
|
+
type: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface PanelSourceRequest<TSource extends string = string> {
|
|
9
|
+
source: TSource;
|
|
10
|
+
query: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface PanelSourceResult {
|
|
14
|
+
rows: Record<string, unknown>[];
|
|
15
|
+
schema?: DashboardPanelColumn[];
|
|
16
|
+
truncated?: boolean;
|
|
17
|
+
bytesProcessed?: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface PanelSourceFailure {
|
|
21
|
+
error: string;
|
|
22
|
+
message?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type PanelSourceResponse = PanelSourceResult | PanelSourceFailure;
|
|
26
|
+
|
|
27
|
+
export interface PanelSourceResolver<
|
|
28
|
+
TSource extends string = string,
|
|
29
|
+
TContext = unknown,
|
|
30
|
+
> {
|
|
31
|
+
source: TSource;
|
|
32
|
+
resolve(
|
|
33
|
+
request: PanelSourceRequest<TSource>,
|
|
34
|
+
context: TContext,
|
|
35
|
+
): Promise<PanelSourceResponse>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface PanelSourceResolverRegistry<
|
|
39
|
+
TSource extends string = string,
|
|
40
|
+
TContext = unknown,
|
|
41
|
+
> {
|
|
42
|
+
readonly sources: readonly TSource[];
|
|
43
|
+
resolve(
|
|
44
|
+
request: PanelSourceRequest<TSource>,
|
|
45
|
+
context: TContext,
|
|
46
|
+
): Promise<PanelSourceResponse>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function createPanelSourceResolverRegistry<
|
|
50
|
+
TSource extends string = string,
|
|
51
|
+
TContext = unknown,
|
|
52
|
+
>(options: {
|
|
53
|
+
resolvers: readonly PanelSourceResolver<TSource, TContext>[];
|
|
54
|
+
}): PanelSourceResolverRegistry<TSource, TContext> {
|
|
55
|
+
const resolvers = new Map<TSource, PanelSourceResolver<TSource, TContext>>();
|
|
56
|
+
for (const resolver of options.resolvers) {
|
|
57
|
+
const source = resolver.source.trim() as TSource;
|
|
58
|
+
if (!source) throw new Error("Panel source resolver requires a source.");
|
|
59
|
+
if (resolvers.has(source)) {
|
|
60
|
+
throw new Error(`Duplicate panel source resolver: ${source}`);
|
|
61
|
+
}
|
|
62
|
+
resolvers.set(source, resolver);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
sources: [...resolvers.keys()],
|
|
67
|
+
async resolve(request, context) {
|
|
68
|
+
const resolver = resolvers.get(request.source);
|
|
69
|
+
if (!resolver) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`Unsupported dashboard panel source: ${request.source}`,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
return resolver.resolve(request, context);
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface ProgramPanelContext {
|
|
80
|
+
userEmail: string;
|
|
81
|
+
orgId?: string | null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface ProgramPanelDescriptor {
|
|
85
|
+
programId: string;
|
|
86
|
+
params?: Record<string, unknown>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface ProgramPanelRunResult {
|
|
90
|
+
ok: boolean;
|
|
91
|
+
rows?: Record<string, unknown>[];
|
|
92
|
+
schema?: DashboardPanelColumn[];
|
|
93
|
+
truncated?: boolean;
|
|
94
|
+
lastGoodRun?: {
|
|
95
|
+
rows: Record<string, unknown>[];
|
|
96
|
+
schema: DashboardPanelColumn[];
|
|
97
|
+
truncated?: boolean;
|
|
98
|
+
};
|
|
99
|
+
error?: { code: string; message: string };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function parseProgramPanelDescriptor(
|
|
103
|
+
query: string,
|
|
104
|
+
): ProgramPanelDescriptor {
|
|
105
|
+
let value: unknown;
|
|
106
|
+
try {
|
|
107
|
+
value = JSON.parse(query);
|
|
108
|
+
} catch {
|
|
109
|
+
throw new Error("Program panel query must be a JSON object.");
|
|
110
|
+
}
|
|
111
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
112
|
+
throw new Error("Program panel query must be a JSON object.");
|
|
113
|
+
}
|
|
114
|
+
const descriptor = value as Record<string, unknown>;
|
|
115
|
+
if (
|
|
116
|
+
typeof descriptor.programId !== "string" ||
|
|
117
|
+
!descriptor.programId.trim()
|
|
118
|
+
) {
|
|
119
|
+
throw new Error("Program panel query requires a programId.");
|
|
120
|
+
}
|
|
121
|
+
const params =
|
|
122
|
+
descriptor.params &&
|
|
123
|
+
typeof descriptor.params === "object" &&
|
|
124
|
+
!Array.isArray(descriptor.params)
|
|
125
|
+
? (descriptor.params as Record<string, unknown>)
|
|
126
|
+
: undefined;
|
|
127
|
+
return { programId: descriptor.programId.trim(), params };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function createProgramPanelSourceResolver(options: {
|
|
131
|
+
appId: string;
|
|
132
|
+
run?: (args: {
|
|
133
|
+
programId: string;
|
|
134
|
+
appId: string;
|
|
135
|
+
params?: Record<string, unknown>;
|
|
136
|
+
ctx: { userEmail: string; orgId: string | null };
|
|
137
|
+
triggeredBy: "panel_view";
|
|
138
|
+
}) => Promise<ProgramPanelRunResult>;
|
|
139
|
+
}): PanelSourceResolver<"program", ProgramPanelContext> {
|
|
140
|
+
const run = options.run ?? runDataProgram;
|
|
141
|
+
return {
|
|
142
|
+
source: "program",
|
|
143
|
+
async resolve(request, context) {
|
|
144
|
+
const descriptor = parseProgramPanelDescriptor(request.query);
|
|
145
|
+
const result = await run({
|
|
146
|
+
programId: descriptor.programId,
|
|
147
|
+
appId: options.appId,
|
|
148
|
+
params: descriptor.params,
|
|
149
|
+
ctx: {
|
|
150
|
+
userEmail: context.userEmail,
|
|
151
|
+
orgId: context.orgId ?? null,
|
|
152
|
+
},
|
|
153
|
+
triggeredBy: "panel_view",
|
|
154
|
+
});
|
|
155
|
+
if (result.ok) {
|
|
156
|
+
return {
|
|
157
|
+
rows: result.rows ?? [],
|
|
158
|
+
schema: result.schema,
|
|
159
|
+
truncated: result.truncated,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (result.lastGoodRun) return result.lastGoodRun;
|
|
163
|
+
throw new Error(
|
|
164
|
+
`${result.error?.code ?? "program_failed"}: ${result.error?.message ?? "Data program failed."}`,
|
|
165
|
+
);
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createSharesTable,
|
|
3
|
+
index,
|
|
4
|
+
now,
|
|
5
|
+
ownableColumns,
|
|
6
|
+
table,
|
|
7
|
+
text,
|
|
8
|
+
} from "../db/schema.js";
|
|
9
|
+
|
|
10
|
+
export interface DashboardStorageSchemaOptions {
|
|
11
|
+
dashboardsTable?: string;
|
|
12
|
+
revisionsTable?: string;
|
|
13
|
+
sharesTable?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function createDashboardStorageSchema(
|
|
17
|
+
options: DashboardStorageSchemaOptions = {},
|
|
18
|
+
) {
|
|
19
|
+
const dashboardsTable = options.dashboardsTable ?? "dashboards";
|
|
20
|
+
const revisionsTable = options.revisionsTable ?? "dashboard_revisions";
|
|
21
|
+
const sharesTable = options.sharesTable ?? "dashboard_shares";
|
|
22
|
+
|
|
23
|
+
const dashboards = table(dashboardsTable, {
|
|
24
|
+
id: text("id").primaryKey(),
|
|
25
|
+
kind: text("kind").notNull(),
|
|
26
|
+
title: text("title").notNull().default("Untitled"),
|
|
27
|
+
config: text("config").notNull(),
|
|
28
|
+
createdAt: text("created_at").notNull().default(now()),
|
|
29
|
+
updatedAt: text("updated_at").notNull().default(now()),
|
|
30
|
+
updatedBy: text("updated_by"),
|
|
31
|
+
archivedAt: text("archived_at"),
|
|
32
|
+
...ownableColumns(),
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const dashboardShares = createSharesTable(sharesTable);
|
|
36
|
+
|
|
37
|
+
const dashboardRevisions = table(
|
|
38
|
+
revisionsTable,
|
|
39
|
+
{
|
|
40
|
+
id: text("id").primaryKey(),
|
|
41
|
+
dashboardId: text("dashboard_id").notNull(),
|
|
42
|
+
kind: text("kind").notNull(),
|
|
43
|
+
title: text("title").notNull(),
|
|
44
|
+
config: text("config").notNull(),
|
|
45
|
+
createdAt: text("created_at").notNull().default(now()),
|
|
46
|
+
createdBy: text("created_by"),
|
|
47
|
+
...ownableColumns(),
|
|
48
|
+
},
|
|
49
|
+
(revision) => ({
|
|
50
|
+
dashboardCreatedIdx: index(`${revisionsTable}_dashboard_created_idx`).on(
|
|
51
|
+
revision.dashboardId,
|
|
52
|
+
revision.createdAt,
|
|
53
|
+
),
|
|
54
|
+
}),
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
return { dashboards, dashboardRevisions, dashboardShares };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type DashboardStorageSchema = ReturnType<
|
|
61
|
+
typeof createDashboardStorageSchema
|
|
62
|
+
>;
|