@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
package/agent-native.eject.json
CHANGED
package/corpus/README.md
CHANGED
package/corpus/core/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# @agent-native/core
|
|
2
2
|
|
|
3
|
+
## 0.115.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 321567c: Add `app-branding` and `app-permissions` to the default framework skill set. `app-branding` is layout-aware — it handles both the centralized `app/lib/app-config.ts` source-of-truth layout and the inlined layout where the name/title live across `package.json`, route `meta()`, and `app/root.tsx`. Generated apps using `frameworkSkills: "default"` now receive both skills on scaffold and `skills update`.
|
|
8
|
+
|
|
9
|
+
## 0.115.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 0341a7d: Allow the published CLI to scaffold the hidden CRM template explicitly, and include factory-backed actions in production static registries.
|
|
14
|
+
- 0341a7d: Pass trusted trigger automation lineage and a stored policy id to action runs.
|
|
15
|
+
- 0341a7d: Add reusable per-app dashboard storage factories, bounded revision history, and provider-neutral panel source resolvers.
|
|
16
|
+
- 0341a7d: Add Salesforce workspace connections and CRM reader metadata for template-owned integrations.
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- 0341a7d: Allow hosted authenticated requests to use deployment-level transactional email configuration.
|
|
21
|
+
- 0341a7d: Keep Netlify-hosted apps and their databases warm with site-local scheduled health checks.
|
|
22
|
+
- 0341a7d: Prevent duplicate Thinking statuses and scroll bounce during streamed reasoning, while giving active tool rows a clear live state and new tool rows a subtle entrance.
|
|
23
|
+
- 0341a7d: Require an explicit workspace connection when making Salesforce provider API requests, so each request uses a matched instance URL and OAuth account.
|
|
24
|
+
- 0341a7d: Prevent model gateways from breaking extension edits by using a compact required update contract and normalizing optional placeholder arguments before validation.
|
|
25
|
+
- 0341a7d: Fix Salesforce token refresh when configured with Consumer Key/Secret.
|
|
26
|
+
- 0341a7d: Allow recurring jobs to bind an explicit MCP tool allowlist and resolve those connected capabilities with the job's existing user/org OAuth context.
|
|
27
|
+
- 0341a7d: Teach the agent-native-docs skill to reuse node_modules reference source with rg and cp: version-matched installed source beats web docs, and every first-party template's corpus is fair game to copy and adapt, not just runtime internals that need the customizing-agent-native ladder.
|
|
28
|
+
- 0341a7d: Make the missing-AI composer state visibly actionable with a Connect AI button.
|
|
29
|
+
- Updated dependencies [0341a7d]
|
|
30
|
+
- @agent-native/toolkit@0.9.0
|
|
31
|
+
|
|
3
32
|
## 0.114.16
|
|
4
33
|
|
|
5
34
|
### Patch Changes
|
|
@@ -112,6 +112,22 @@ being rebuilt in slightly different ways every time.
|
|
|
112
112
|
keep an independent lifecycle manifest, dependency graph, and release cadence.
|
|
113
113
|
- Dispatch remains a **separate product**, not a Toolkit capability module.
|
|
114
114
|
|
|
115
|
+
## Dashboard kit {#dashboard-kit}
|
|
116
|
+
|
|
117
|
+
`@agent-native/toolkit/dashboard` is an ejectable, presentation-only unit for
|
|
118
|
+
metric and stats cards, data tables, date-range controls, panel ordering and
|
|
119
|
+
layout, and generic chart rendering. It receives rows and callbacks from an
|
|
120
|
+
app-owned adapter: it never fetches data, resolves credentials, or owns a
|
|
121
|
+
dashboard's state.
|
|
122
|
+
|
|
123
|
+
Use `agent-native eject inspect toolkit/dashboard` before applying
|
|
124
|
+
`toolkit/dashboard` to an app. Keep durable dashboards in that app with
|
|
125
|
+
`@agent-native/core/dashboard-storage`: instantiate its access-scoped schema
|
|
126
|
+
and store per app, not in a cross-app dashboard table. Panel data flows through
|
|
127
|
+
a `PanelSourceResolver`; the built-in `program` source runs an app-owned data
|
|
128
|
+
program and is the canonical no-provider default. Provider resolvers belong in
|
|
129
|
+
the app that owns their connection and query policy.
|
|
130
|
+
|
|
115
131
|
## Implementation Boundary {#implementation-boundary}
|
|
116
132
|
|
|
117
133
|
Toolkit docs are organized by reusable product capability, not npm package.
|
|
@@ -60,9 +60,37 @@ That's it. The body is a prompt the agent runs at each scheduled firing. The age
|
|
|
60
60
|
| `lastStatus` | `"success"` \| `"error"` \| … | _(managed)_ | Latest outcome. |
|
|
61
61
|
| `lastError` | string | _(managed)_ | Error message if the last run failed. |
|
|
62
62
|
| `nextRun` | ISO timestamp | _(managed)_ | Computed from `schedule`; used by the scheduler to decide when to fire next. |
|
|
63
|
+
| `mcpTools` | array of MCP tool names | _(none)_ | Optional explicit allowlist such as `mcp__server__tool`; credentials stay in the connected MCP grant. |
|
|
63
64
|
|
|
64
65
|
The `last*` and `nextRun` fields are written by the scheduler. You can read them to see the history, but don't edit them by hand — the next run will overwrite.
|
|
65
66
|
|
|
67
|
+
## Connecting MCP tools to a job {#connected-mcps}
|
|
68
|
+
|
|
69
|
+
Recurring jobs can use remote or local MCP tools that are already connected to
|
|
70
|
+
the app. Ask the agent to discover the exact names with `tool-search`, then
|
|
71
|
+
bind only the tools that job needs with `mcpTools`:
|
|
72
|
+
|
|
73
|
+
```md
|
|
74
|
+
---
|
|
75
|
+
schedule: "0 * * * *"
|
|
76
|
+
enabled: true
|
|
77
|
+
mcpTools:
|
|
78
|
+
["mcp__meeting-notes__list_recordings", "mcp__meeting-notes__get_transcript"]
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
Find new recordings since the last successful run. Extract only actionable
|
|
82
|
+
follow-ups, then call the app's bounded import action once with stable source
|
|
83
|
+
and external ids, a short citation, and the recording URL. Do not import the
|
|
84
|
+
full transcript.
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The job stores tool names, not MCP URLs, access tokens, or OAuth refresh
|
|
88
|
+
tokens. At run time, the framework resolves the connected grant in the job's
|
|
89
|
+
creator or organization request context and exposes only the allowlisted
|
|
90
|
+
tools. Keep the list narrow, and use an idempotent app action for the final
|
|
91
|
+
import so overlapping runs do not create duplicates. See [MCP Clients](/docs/mcp-clients)
|
|
92
|
+
for connection and OAuth setup.
|
|
93
|
+
|
|
66
94
|
## Cron syntax {#cron}
|
|
67
95
|
|
|
68
96
|
Standard 5-field cron (minute, hour, day-of-month, month, day-of-week):
|
|
@@ -191,12 +219,12 @@ The scheduler is a framework plugin (the internal `processRecurringJobs()` routi
|
|
|
191
219
|
|
|
192
220
|
A single `manage-jobs` tool is registered in every template. The `action` parameter selects the operation:
|
|
193
221
|
|
|
194
|
-
| Action | Parameters
|
|
195
|
-
| -------- |
|
|
196
|
-
| `create` | `name`, `schedule`, `instructions` (required); `scope`, `runAs`, `model` | Create a new recurring job |
|
|
197
|
-
| `list` | `scope` (`personal`, `shared`, or all)
|
|
198
|
-
| `update` | `name` (required); `schedule`, `instructions`, `enabled`, `runAs`, `model` | Edit an existing job |
|
|
199
|
-
| `delete` | `name` (required)
|
|
222
|
+
| Action | Parameters | Purpose |
|
|
223
|
+
| -------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
|
|
224
|
+
| `create` | `name`, `schedule`, `instructions` (required); `scope`, `runAs`, `model`, `mcpTools` | Create a new recurring job |
|
|
225
|
+
| `list` | `scope` (`personal`, `shared`, or all) | List all jobs with status (schedule, enabled, last/next run) |
|
|
226
|
+
| `update` | `name` (required); `schedule`, `instructions`, `enabled`, `runAs`, `model`, `mcpTools` | Edit an existing job |
|
|
227
|
+
| `delete` | `name` (required) | Delete a job — always confirm with the user first |
|
|
200
228
|
|
|
201
229
|
`model` is optional on both `create` and `update` — pass a model id to override the channel/app/engine default for that one routine.
|
|
202
230
|
|
|
@@ -216,4 +244,5 @@ Recurring jobs are "how do I make the agent act on its own?" The scheduling pack
|
|
|
216
244
|
- [**Automations**](/docs/automations) — add event triggers and conditions to the same `jobs/` format
|
|
217
245
|
- [**Agent Resources**](/docs/workspace) — where jobs live alongside skills, memory, and custom agents
|
|
218
246
|
- [**Actions**](/docs/actions) — the tools a job calls
|
|
247
|
+
- [**MCP Clients**](/docs/mcp-clients) — connect remote or local MCP tools and OAuth grants
|
|
219
248
|
- [**Agent Teams**](/docs/agent-teams) — jobs often spawn sub-agents to do parallel work
|
|
@@ -144,6 +144,10 @@
|
|
|
144
144
|
"dist/data-programs/index.d.ts",
|
|
145
145
|
"dist/data-programs/index.js"
|
|
146
146
|
],
|
|
147
|
+
"./dashboard-storage": [
|
|
148
|
+
"dist/dashboard-storage/index.d.ts",
|
|
149
|
+
"dist/dashboard-storage/index.js"
|
|
150
|
+
],
|
|
147
151
|
"./data-widgets": ["dist/data-widgets/index.js"],
|
|
148
152
|
"./db": ["dist/db/index.js"],
|
|
149
153
|
"./db-admin": ["dist/db-admin/index.js"],
|
package/corpus/core/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.115.1",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -276,6 +276,10 @@
|
|
|
276
276
|
"types": "./dist/data-programs/index.d.ts",
|
|
277
277
|
"default": "./dist/data-programs/index.js"
|
|
278
278
|
},
|
|
279
|
+
"./dashboard-storage": {
|
|
280
|
+
"types": "./dist/dashboard-storage/index.d.ts",
|
|
281
|
+
"default": "./dist/dashboard-storage/index.js"
|
|
282
|
+
},
|
|
279
283
|
"./local-artifacts": {
|
|
280
284
|
"types": "./dist/local-artifacts/index.d.ts",
|
|
281
285
|
"default": "./dist/local-artifacts/index.js"
|
|
@@ -27,8 +27,27 @@ import type { ActionAuditConfig } from "./audit/types.js";
|
|
|
27
27
|
* - `"a2a"` — a direct, explicitly exposed read-only A2A action dispatch.
|
|
28
28
|
* Natural-language A2A delegation still runs through the agent loop and its
|
|
29
29
|
* selected actions are attributed as `"tool"`.
|
|
30
|
+
* - `"automation"` — an event-triggered automation dispatched from a stored
|
|
31
|
+
* workspace trigger with trusted trigger lineage.
|
|
30
32
|
*/
|
|
31
|
-
export type ActionCaller =
|
|
33
|
+
export type ActionCaller =
|
|
34
|
+
| "tool"
|
|
35
|
+
| "http"
|
|
36
|
+
| "frontend"
|
|
37
|
+
| "cli"
|
|
38
|
+
| "mcp"
|
|
39
|
+
| "a2a"
|
|
40
|
+
| "automation";
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Trusted automation lineage added by the trigger dispatcher. Action inputs
|
|
44
|
+
* must never be used to create or override this context.
|
|
45
|
+
*/
|
|
46
|
+
export interface ActionAutomationContext {
|
|
47
|
+
triggerId: string;
|
|
48
|
+
triggerName: string;
|
|
49
|
+
policyId?: string;
|
|
50
|
+
}
|
|
32
51
|
|
|
33
52
|
/**
|
|
34
53
|
* Context passed as the optional second argument to an action's `run`.
|
|
@@ -56,6 +75,8 @@ export interface ActionRunContext {
|
|
|
56
75
|
orgId?: string | null;
|
|
57
76
|
/** How this action was invoked. */
|
|
58
77
|
caller: ActionCaller;
|
|
78
|
+
/** Present only for trigger-dispatched automation calls. */
|
|
79
|
+
automation?: ActionAutomationContext;
|
|
59
80
|
/** Verified network lineage for direct delegated action calls. */
|
|
60
81
|
networkProtocol?: "a2a" | "mcp" | "provider-api";
|
|
61
82
|
networkId?: string;
|
|
@@ -8,7 +8,11 @@ import {
|
|
|
8
8
|
} from "h3";
|
|
9
9
|
import type { EventHandler as H3EventHandler } from "h3";
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
isAgentActionStopError,
|
|
13
|
+
type ActionAutomationContext,
|
|
14
|
+
type ActionCaller,
|
|
15
|
+
} from "../action.js";
|
|
12
16
|
import { readAppState } from "../application-state/script-helpers.js";
|
|
13
17
|
import { isReadOnlyShellCommand } from "../coding-tools/index.js";
|
|
14
18
|
import { extensionIdFromPathname } from "../extensions/path.js";
|
|
@@ -3107,6 +3111,91 @@ const rawToolInputAjv = new Ajv({
|
|
|
3107
3111
|
|
|
3108
3112
|
const rawToolInputValidatorCache = new WeakMap<object, ValidateFunction>();
|
|
3109
3113
|
|
|
3114
|
+
const optionalPlaceholderAjv = new Ajv({
|
|
3115
|
+
strict: false,
|
|
3116
|
+
allErrors: false,
|
|
3117
|
+
coerceTypes: false,
|
|
3118
|
+
useDefaults: false,
|
|
3119
|
+
removeAdditional: false,
|
|
3120
|
+
});
|
|
3121
|
+
|
|
3122
|
+
const optionalPlaceholderValidatorCache = new WeakMap<
|
|
3123
|
+
object,
|
|
3124
|
+
ValidateFunction
|
|
3125
|
+
>();
|
|
3126
|
+
|
|
3127
|
+
function isStructurallyEmptyToolValue(value: unknown): boolean {
|
|
3128
|
+
if (value === false) return true;
|
|
3129
|
+
if (value === null) return true;
|
|
3130
|
+
if (typeof value === "string") return value.trim().length === 0;
|
|
3131
|
+
if (Array.isArray(value)) {
|
|
3132
|
+
return (
|
|
3133
|
+
value.length === 0 ||
|
|
3134
|
+
value.every(
|
|
3135
|
+
(item) =>
|
|
3136
|
+
item !== null &&
|
|
3137
|
+
typeof item === "object" &&
|
|
3138
|
+
!Array.isArray(item) &&
|
|
3139
|
+
Object.keys(item).length === 0,
|
|
3140
|
+
)
|
|
3141
|
+
);
|
|
3142
|
+
}
|
|
3143
|
+
return (
|
|
3144
|
+
typeof value === "object" &&
|
|
3145
|
+
value !== null &&
|
|
3146
|
+
Object.keys(value).length === 0
|
|
3147
|
+
);
|
|
3148
|
+
}
|
|
3149
|
+
|
|
3150
|
+
function schemaAcceptsToolValue(schema: object, value: unknown): boolean {
|
|
3151
|
+
let validator = optionalPlaceholderValidatorCache.get(schema);
|
|
3152
|
+
if (!validator) {
|
|
3153
|
+
try {
|
|
3154
|
+
validator = optionalPlaceholderAjv.compile(schema);
|
|
3155
|
+
optionalPlaceholderValidatorCache.set(schema, validator);
|
|
3156
|
+
} catch {
|
|
3157
|
+
return false;
|
|
3158
|
+
}
|
|
3159
|
+
}
|
|
3160
|
+
return Boolean(validator(value));
|
|
3161
|
+
}
|
|
3162
|
+
|
|
3163
|
+
/**
|
|
3164
|
+
* Some model gateways fill every optional tool field with an empty sentinel
|
|
3165
|
+
* instead of omitting it. One schema-invalid empty value proves that pattern;
|
|
3166
|
+
* only then strip the other optional empty/default sentinels from the call.
|
|
3167
|
+
* Calls whose empty values are all schema-valid keep their intentional clears.
|
|
3168
|
+
*/
|
|
3169
|
+
function normalizeOptionalToolPlaceholders(
|
|
3170
|
+
schema: RawJsonSchema | undefined,
|
|
3171
|
+
input: unknown,
|
|
3172
|
+
): { input: unknown; changed: boolean } {
|
|
3173
|
+
if (!schema?.properties || !input || typeof input !== "object") {
|
|
3174
|
+
return { input, changed: false };
|
|
3175
|
+
}
|
|
3176
|
+
if (Array.isArray(input)) return { input, changed: false };
|
|
3177
|
+
|
|
3178
|
+
const required = new Set(
|
|
3179
|
+
Array.isArray(schema.required) ? schema.required : [],
|
|
3180
|
+
);
|
|
3181
|
+
const placeholders: string[] = [];
|
|
3182
|
+
let hasSchemaInvalidPlaceholder = false;
|
|
3183
|
+
for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
|
|
3184
|
+
if (required.has(key) || !isStructurallyEmptyToolValue(value)) continue;
|
|
3185
|
+
const propertySchema = schema.properties[key];
|
|
3186
|
+
if (!propertySchema || typeof propertySchema !== "object") continue;
|
|
3187
|
+
placeholders.push(key);
|
|
3188
|
+
if (!schemaAcceptsToolValue(propertySchema, value)) {
|
|
3189
|
+
hasSchemaInvalidPlaceholder = true;
|
|
3190
|
+
}
|
|
3191
|
+
}
|
|
3192
|
+
if (!hasSchemaInvalidPlaceholder) return { input, changed: false };
|
|
3193
|
+
|
|
3194
|
+
const normalized = { ...(input as Record<string, unknown>) };
|
|
3195
|
+
for (const key of placeholders) delete normalized[key];
|
|
3196
|
+
return { input: normalized, changed: true };
|
|
3197
|
+
}
|
|
3198
|
+
|
|
3110
3199
|
function getRawToolInputValidator(schema: RawJsonSchema): ValidateFunction {
|
|
3111
3200
|
const cached = rawToolInputValidatorCache.get(schema);
|
|
3112
3201
|
if (cached) return cached;
|
|
@@ -3163,6 +3252,8 @@ export async function runAgentLoop(opts: {
|
|
|
3163
3252
|
orgId?: string | null;
|
|
3164
3253
|
/** Action invocation attribution. Defaults to the normal agent tool loop. */
|
|
3165
3254
|
actionCaller?: ActionCaller;
|
|
3255
|
+
/** Trusted trigger lineage for automation-dispatched action calls. */
|
|
3256
|
+
automation?: ActionAutomationContext;
|
|
3166
3257
|
/** Concrete execution id used for cross-app trace correlation. */
|
|
3167
3258
|
runId?: string;
|
|
3168
3259
|
/** Verified/telemetry-only delegated lineage supplied by the transport. */
|
|
@@ -4068,11 +4159,20 @@ export async function runAgentLoop(opts: {
|
|
|
4068
4159
|
const runToolCall = async (
|
|
4069
4160
|
toolCall: import("./engine/types.js").EngineToolCallPart,
|
|
4070
4161
|
): Promise<EngineContentPart> => {
|
|
4162
|
+
const actionEntry = actions[toolCall.name];
|
|
4163
|
+
const placeholderNormalization = actionEntry
|
|
4164
|
+
? normalizeOptionalToolPlaceholders(
|
|
4165
|
+
actionEntry.tool.parameters,
|
|
4166
|
+
toolCall.input,
|
|
4167
|
+
)
|
|
4168
|
+
: { input: toolCall.input, changed: false };
|
|
4169
|
+
if (placeholderNormalization.changed) {
|
|
4170
|
+
toolCall = { ...toolCall, input: placeholderNormalization.input };
|
|
4171
|
+
}
|
|
4071
4172
|
const wireToolInput = JSON.stringify(toolCall.input ?? {});
|
|
4072
4173
|
const normalizedToolInput = normalizeToolCallInputForHistory(
|
|
4073
4174
|
toolCall.input,
|
|
4074
4175
|
);
|
|
4075
|
-
const actionEntry = actions[toolCall.name];
|
|
4076
4176
|
const sourceSweepGuard = shouldGuardRepeatedSourceSweep({
|
|
4077
4177
|
toolName: toolCall.name,
|
|
4078
4178
|
entry: actionEntry,
|
|
@@ -4227,6 +4327,7 @@ export async function runAgentLoop(opts: {
|
|
|
4227
4327
|
userEmail: getRequestUserEmail(),
|
|
4228
4328
|
orgId: getRequestOrgId() ?? null,
|
|
4229
4329
|
caller: opts.actionCaller ?? "tool",
|
|
4330
|
+
automation: opts.automation,
|
|
4230
4331
|
networkProtocol: opts.networkProtocol,
|
|
4231
4332
|
networkId: opts.networkId,
|
|
4232
4333
|
networkPeer: opts.networkPeer,
|
|
@@ -4490,7 +4591,7 @@ export async function runAgentLoop(opts: {
|
|
|
4490
4591
|
});
|
|
4491
4592
|
|
|
4492
4593
|
const toolCallSchemaError = toolCallErrors.get(toolCall.id);
|
|
4493
|
-
if (toolCallSchemaError) {
|
|
4594
|
+
if (toolCallSchemaError && !placeholderNormalization.changed) {
|
|
4494
4595
|
const result = finalizeToolErrorResult(
|
|
4495
4596
|
toolInputSchemaErrorResult(
|
|
4496
4597
|
toolCall.name,
|
|
@@ -4663,6 +4764,7 @@ export async function runAgentLoop(opts: {
|
|
|
4663
4764
|
userEmail: actionUserEmail ?? undefined,
|
|
4664
4765
|
orgId: actionOrgId,
|
|
4665
4766
|
caller: opts.actionCaller ?? "tool",
|
|
4767
|
+
automation: opts.automation,
|
|
4666
4768
|
networkProtocol: opts.networkProtocol,
|
|
4667
4769
|
networkId: opts.networkId,
|
|
4668
4770
|
networkPeer: opts.networkPeer,
|
|
@@ -228,6 +228,18 @@ export const TEMPLATES: TemplateMeta[] = [
|
|
|
228
228
|
hidden: true,
|
|
229
229
|
core: false,
|
|
230
230
|
},
|
|
231
|
+
{
|
|
232
|
+
name: "crm",
|
|
233
|
+
label: "CRM",
|
|
234
|
+
hint: "Agent-native CRM companion with scoped HubSpot intelligence, workflows, and write proposals",
|
|
235
|
+
icon: "Users",
|
|
236
|
+
color: "#2563EB",
|
|
237
|
+
colorRgb: "37 99 235",
|
|
238
|
+
devPort: 8107,
|
|
239
|
+
hidden: true,
|
|
240
|
+
defaultMode: "dev",
|
|
241
|
+
core: false,
|
|
242
|
+
},
|
|
231
243
|
{
|
|
232
244
|
name: "macros",
|
|
233
245
|
label: "Macros",
|
|
@@ -1591,6 +1591,15 @@ export function shouldShowGlobalRunningStatus({
|
|
|
1591
1591
|
) {
|
|
1592
1592
|
return false;
|
|
1593
1593
|
}
|
|
1594
|
+
// The reasoning cell already owns the generic Thinking state. Activity
|
|
1595
|
+
// events can briefly reassert that same label between reasoning deltas;
|
|
1596
|
+
// rendering both makes a second Thinking row flash beneath the thought.
|
|
1597
|
+
if (
|
|
1598
|
+
runningActivityLabel === "Thinking" &&
|
|
1599
|
+
(latestMessageHasReasoning || contentHasVisibleReasoning(reconnectContent))
|
|
1600
|
+
) {
|
|
1601
|
+
return false;
|
|
1602
|
+
}
|
|
1594
1603
|
if (runningActivityLabel) return true;
|
|
1595
1604
|
|
|
1596
1605
|
return (
|
|
@@ -1598,6 +1607,16 @@ export function shouldShowGlobalRunningStatus({
|
|
|
1598
1607
|
);
|
|
1599
1608
|
}
|
|
1600
1609
|
|
|
1610
|
+
export function assistantChatAutoscrollStatusKey({
|
|
1611
|
+
showGlobalRunningStatus,
|
|
1612
|
+
runningStatusLabel,
|
|
1613
|
+
}: {
|
|
1614
|
+
showGlobalRunningStatus: boolean;
|
|
1615
|
+
runningStatusLabel: string;
|
|
1616
|
+
}): string {
|
|
1617
|
+
return showGlobalRunningStatus ? runningStatusLabel : "idle";
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1601
1620
|
type QueuedMessage = {
|
|
1602
1621
|
id: string;
|
|
1603
1622
|
text: string;
|
|
@@ -4804,11 +4823,28 @@ const AssistantChatInner = forwardRef<
|
|
|
4804
4823
|
adapterHandoffPending || reconnectTailOnlyRef.current,
|
|
4805
4824
|
},
|
|
4806
4825
|
);
|
|
4826
|
+
const latestMessage = messages[messages.length - 1];
|
|
4827
|
+
const reconnectStatusContent =
|
|
4828
|
+
visibleReconnectContent.length > 0
|
|
4829
|
+
? visibleReconnectContent
|
|
4830
|
+
: reconnectContent.length === 0
|
|
4831
|
+
? reconnectActivityContent
|
|
4832
|
+
: [];
|
|
4833
|
+
const showGlobalRunningStatus = shouldShowGlobalRunningStatus({
|
|
4834
|
+
showRunningInUI,
|
|
4835
|
+
runningActivityLabel,
|
|
4836
|
+
runningActivityTool,
|
|
4837
|
+
latestMessage,
|
|
4838
|
+
reconnectContent: reconnectStatusContent,
|
|
4839
|
+
});
|
|
4807
4840
|
const autoscrollFollowKey = [
|
|
4808
4841
|
messages.map(messageFollowKey).join(";"),
|
|
4809
4842
|
`q:${queuedMessages.map(queuedMessageFollowKey).join("|")}`,
|
|
4810
4843
|
`r:${reconnectContentFollowKey(visibleReconnectContent)}`,
|
|
4811
|
-
`status:${
|
|
4844
|
+
`status:${assistantChatAutoscrollStatusKey({
|
|
4845
|
+
showGlobalRunningStatus,
|
|
4846
|
+
runningStatusLabel,
|
|
4847
|
+
})}`,
|
|
4812
4848
|
].join(";;");
|
|
4813
4849
|
const {
|
|
4814
4850
|
scrollRef,
|
|
@@ -4882,21 +4918,7 @@ const AssistantChatInner = forwardRef<
|
|
|
4882
4918
|
() => latestNonRecoveryUserMessageText(messages),
|
|
4883
4919
|
[messages],
|
|
4884
4920
|
);
|
|
4885
|
-
const latestMessage = messages[messages.length - 1];
|
|
4886
4921
|
const latestMessageRole = latestMessage?.role;
|
|
4887
|
-
const reconnectStatusContent =
|
|
4888
|
-
visibleReconnectContent.length > 0
|
|
4889
|
-
? visibleReconnectContent
|
|
4890
|
-
: reconnectContent.length === 0
|
|
4891
|
-
? reconnectActivityContent
|
|
4892
|
-
: [];
|
|
4893
|
-
const showGlobalRunningStatus = shouldShowGlobalRunningStatus({
|
|
4894
|
-
showRunningInUI,
|
|
4895
|
-
runningActivityLabel,
|
|
4896
|
-
runningActivityTool,
|
|
4897
|
-
latestMessage,
|
|
4898
|
-
reconnectContent: reconnectStatusContent,
|
|
4899
|
-
});
|
|
4900
4922
|
const latestAssistantWasPlan =
|
|
4901
4923
|
latestMessageRole === "assistant" &&
|
|
4902
4924
|
getRequestModeMetadata(latestMessage) === "plan";
|
|
@@ -5535,18 +5557,23 @@ const AssistantChatInner = forwardRef<
|
|
|
5535
5557
|
className="agent-composer-missing-key-trigger"
|
|
5536
5558
|
aria-label="Connect AI to start chatting"
|
|
5537
5559
|
>
|
|
5538
|
-
<span className="agent-composer-missing-key-
|
|
5539
|
-
<span className="agent-composer-missing-key-
|
|
5540
|
-
|
|
5541
|
-
|
|
5542
|
-
|
|
5543
|
-
|
|
5544
|
-
{missingApiKeySetupLayout !== "sidebar" ? (
|
|
5545
|
-
<span className="agent-composer-missing-key-description">
|
|
5546
|
-
Builder.io includes free credits, or use
|
|
5547
|
-
your own API key.
|
|
5560
|
+
<span className="agent-composer-missing-key-content">
|
|
5561
|
+
<span className="agent-composer-missing-key-copy">
|
|
5562
|
+
<span className="agent-composer-missing-key-title">
|
|
5563
|
+
{missingApiKeySetupLayout === "sidebar"
|
|
5564
|
+
? "Connect AI to chat"
|
|
5565
|
+
: "Connect AI to start chatting"}
|
|
5548
5566
|
</span>
|
|
5549
|
-
|
|
5567
|
+
{missingApiKeySetupLayout !== "sidebar" ? (
|
|
5568
|
+
<span className="agent-composer-missing-key-description">
|
|
5569
|
+
Builder.io includes free credits, or use
|
|
5570
|
+
your own API key.
|
|
5571
|
+
</span>
|
|
5572
|
+
) : null}
|
|
5573
|
+
</span>
|
|
5574
|
+
<span className="agent-composer-missing-key-cta">
|
|
5575
|
+
Connect AI
|
|
5576
|
+
</span>
|
|
5550
5577
|
</span>
|
|
5551
5578
|
</button>
|
|
5552
5579
|
</PopoverTrigger>
|
|
@@ -432,6 +432,25 @@ export function AgentJobsTab({ canManageOrg = false }: AgentPageTabProps) {
|
|
|
432
432
|
<p className="mt-1 whitespace-pre-wrap text-sm text-muted-foreground">
|
|
433
433
|
{detailsTarget.instructions}
|
|
434
434
|
</p>
|
|
435
|
+
{detailsTarget.mcpTools.length > 0 ? (
|
|
436
|
+
<div className="mt-4">
|
|
437
|
+
<p className="text-xs font-medium text-foreground">
|
|
438
|
+
{t("jobs.mcpTools", {
|
|
439
|
+
defaultValue: "Connected MCP tools",
|
|
440
|
+
})}
|
|
441
|
+
</p>
|
|
442
|
+
<div className="mt-1 flex flex-wrap gap-1.5">
|
|
443
|
+
{detailsTarget.mcpTools.map((toolName) => (
|
|
444
|
+
<code
|
|
445
|
+
key={toolName}
|
|
446
|
+
className="rounded bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground"
|
|
447
|
+
>
|
|
448
|
+
{toolName}
|
|
449
|
+
</code>
|
|
450
|
+
))}
|
|
451
|
+
</div>
|
|
452
|
+
</div>
|
|
453
|
+
) : null}
|
|
435
454
|
</div>
|
|
436
455
|
) : null}
|
|
437
456
|
</DialogContent>
|
|
@@ -859,6 +859,27 @@ export function assistantMessageHasUnresolvedTool(content: unknown): boolean {
|
|
|
859
859
|
});
|
|
860
860
|
}
|
|
861
861
|
|
|
862
|
+
// Only the last assistant message may shimmer as "the currently running
|
|
863
|
+
// tool" — an older message's dangling unresolved tool-call must never
|
|
864
|
+
// shimmer once a later run is active.
|
|
865
|
+
export function computeLatestRunningToolCallId(
|
|
866
|
+
content: ContentPart[] | undefined,
|
|
867
|
+
{ chatRunning, isLast }: { chatRunning: boolean; isLast: boolean },
|
|
868
|
+
): string | null {
|
|
869
|
+
if (!isLast) return null;
|
|
870
|
+
return (
|
|
871
|
+
content?.reduce(
|
|
872
|
+
(latestToolCallId, part) =>
|
|
873
|
+
part.type === "tool-call" &&
|
|
874
|
+
part.result === undefined &&
|
|
875
|
+
(chatRunning || part.activity === true)
|
|
876
|
+
? part.toolCallId
|
|
877
|
+
: latestToolCallId,
|
|
878
|
+
null as string | null,
|
|
879
|
+
) ?? null
|
|
880
|
+
);
|
|
881
|
+
}
|
|
882
|
+
|
|
862
883
|
export function shouldShowAssistantMessageFooter({
|
|
863
884
|
isLast,
|
|
864
885
|
chatRunning,
|
|
@@ -1157,6 +1178,10 @@ export function AssistantMessage() {
|
|
|
1157
1178
|
(p.type !== "tool-call" || p.activity !== true) &&
|
|
1158
1179
|
isCollapsibleAssistantWorkPart(p),
|
|
1159
1180
|
);
|
|
1181
|
+
const latestRunningToolCallId = computeLatestRunningToolCallId(msgContent, {
|
|
1182
|
+
chatRunning,
|
|
1183
|
+
isLast,
|
|
1184
|
+
});
|
|
1160
1185
|
|
|
1161
1186
|
if (!hasRenderableContent) return null;
|
|
1162
1187
|
|
|
@@ -1201,7 +1226,16 @@ export function AssistantMessage() {
|
|
|
1201
1226
|
case "reasoning":
|
|
1202
1227
|
return <ReasoningMessagePart />;
|
|
1203
1228
|
case "tool-call":
|
|
1204
|
-
return
|
|
1229
|
+
return (
|
|
1230
|
+
part.toolUI ?? (
|
|
1231
|
+
<ToolCallFallback
|
|
1232
|
+
{...part}
|
|
1233
|
+
isLatestRunning={
|
|
1234
|
+
part.toolCallId === latestRunningToolCallId
|
|
1235
|
+
}
|
|
1236
|
+
/>
|
|
1237
|
+
)
|
|
1238
|
+
);
|
|
1205
1239
|
default:
|
|
1206
1240
|
return null;
|
|
1207
1241
|
}
|