@agent-native/core 0.137.2 → 0.137.4

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.
Files changed (176) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  3. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +53 -1
  4. package/corpus/templates/analytics/actions/gong-calls.ts +37 -17
  5. package/corpus/templates/analytics/app/lib/data-sources.ts +1 -1
  6. package/corpus/templates/analytics/server/lib/gong.ts +51 -2
  7. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  8. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +53 -1
  9. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  10. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +53 -1
  11. package/corpus/templates/brain/app/routes/settings.tsx +1 -1
  12. package/corpus/templates/brain/server/register-secrets.ts +1 -1
  13. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  14. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +53 -1
  15. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  16. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +53 -1
  17. package/corpus/templates/chat/AGENTS.md +11 -0
  18. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
  19. package/corpus/templates/chat/app/root.tsx +1 -1
  20. package/corpus/templates/chat/app/routes/agent.tsx +29 -13
  21. package/corpus/templates/chat/vite.config.ts +42 -0
  22. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  23. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +53 -1
  24. package/corpus/templates/clips/app/components/library/empty-state.tsx +1 -3
  25. package/corpus/templates/clips/app/components/library/library-grid.tsx +2 -6
  26. package/corpus/templates/clips/app/components/library/library-layout.tsx +2 -6
  27. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +1 -3
  28. package/corpus/templates/clips/app/routes/bug-report.tsx +1 -8
  29. package/corpus/templates/clips/app/routes/import.tsx +1 -3
  30. package/corpus/templates/clips/changelog/2026-08-04-recording-buttons-are-now-text-only-for-a-cleaner-clips-inte.md +6 -0
  31. package/corpus/templates/clips/changelog/2026-08-04-save-settings-now-matches-the-other-clips-settings-buttons.md +6 -0
  32. package/corpus/templates/clips/chrome-extension/src/styles.css +1 -0
  33. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  34. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +53 -1
  35. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  36. package/corpus/templates/crm/app/routes/settings.tsx +2 -2
  37. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  38. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +53 -1
  39. package/corpus/templates/design/actions/import-figma-clipboard.ts +1 -1
  40. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  41. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +53 -1
  42. package/corpus/templates/dispatch/changelog/2026-08-04-dispatch-keeps-connected-chats-out-of-local-history-by-defau.md +6 -0
  43. package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  44. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +53 -1
  45. package/corpus/templates/factory/README.md +1 -1
  46. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  47. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +53 -1
  48. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  49. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +53 -1
  50. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  51. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +53 -1
  52. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +0 -2
  53. package/corpus/templates/mail/app/pages/SettingsPage.tsx +1 -1
  54. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  55. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +53 -1
  56. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  57. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +53 -1
  58. package/corpus/templates/slides/actions/generate-image-api.ts +15 -4
  59. package/corpus/templates/slides/actions/import-google-slides-reference.ts +83 -0
  60. package/corpus/templates/slides/actions/import-pptx.ts +134 -117
  61. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +387 -0
  62. package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +78 -48
  63. package/corpus/templates/slides/app/components/editor/NewDeckReferenceStep.tsx +377 -187
  64. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +0 -1
  65. package/corpus/templates/slides/app/hooks/use-deck-design-system.ts +20 -1
  66. package/corpus/templates/slides/app/i18n/en-US.ts +15 -0
  67. package/corpus/templates/slides/app/lib/new-deck-reference-selection.ts +22 -0
  68. package/corpus/templates/slides/app/pages/DeckEditor.tsx +4 -1
  69. package/corpus/templates/slides/app/pages/Index.tsx +172 -85
  70. package/corpus/templates/slides/server/lib/assets-image-delegation.ts +4 -2
  71. package/corpus/templates/slides/shared/api.ts +14 -1
  72. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  73. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +53 -1
  74. package/dist/chat-threads/schema.d.ts +57 -0
  75. package/dist/chat-threads/schema.js +3 -0
  76. package/dist/chat-threads/store.d.ts +26 -0
  77. package/dist/chat-threads/store.js +84 -6
  78. package/dist/client/AgentPanel.js +11 -5
  79. package/dist/client/ConnectBuilderCard.js +1 -1
  80. package/dist/client/agent-page/AgentEmptyState.d.ts +2 -1
  81. package/dist/client/agent-page/AgentEmptyState.js +6 -2
  82. package/dist/client/agent-page/AgentJobsTab.d.ts +3 -1
  83. package/dist/client/agent-page/AgentJobsTab.js +55 -44
  84. package/dist/client/agent-page/AgentTabFrame.d.ts +2 -1
  85. package/dist/client/agent-page/AgentTabFrame.js +4 -2
  86. package/dist/client/agent-page/AgentTabsPage.js +12 -8
  87. package/dist/client/agent-page/AgentWorkspaceContent.d.ts +10 -0
  88. package/dist/client/agent-page/AgentWorkspaceContent.js +110 -0
  89. package/dist/client/agent-page/AutomationDetailsDialog.js +1 -1
  90. package/dist/client/chat/run-recovery.js +3 -3
  91. package/dist/client/error-format.js +1 -1
  92. package/dist/client/integrations/IntegrationsPanel.d.ts +1 -0
  93. package/dist/client/integrations/IntegrationsPanel.js +149 -5
  94. package/dist/client/onboarding/FirstRunOnboarding.js +130 -15
  95. package/dist/client/onboarding/index.d.ts +1 -1
  96. package/dist/client/onboarding/index.js +1 -1
  97. package/dist/client/onboarding/use-onboarding.js +12 -2
  98. package/dist/client/onboarding/use-preview-mode.d.ts +4 -0
  99. package/dist/client/onboarding/use-preview-mode.js +9 -0
  100. package/dist/client/resources/BuiltinCapabilityDetail.js +2 -2
  101. package/dist/client/resources/ResourceTree.d.ts +4 -1
  102. package/dist/client/resources/ResourceTree.js +13 -8
  103. package/dist/client/resources/ResourcesPanel.js +7 -3
  104. package/dist/client/resources/mcp-integration-catalog.js +4 -4
  105. package/dist/client/resources/use-mcp-servers.js +6 -6
  106. package/dist/client/settings/AgentsSection.js +15 -16
  107. package/dist/client/settings/AutomationsSection.js +1 -1
  108. package/dist/client/settings/DemoModeSection.js +1 -1
  109. package/dist/client/settings/SettingsPanel.d.ts +3 -1
  110. package/dist/client/settings/SettingsPanel.js +284 -88
  111. package/dist/client/settings/SettingsRow.js +1 -1
  112. package/dist/client/settings/SettingsSection.d.ts +6 -4
  113. package/dist/client/settings/SettingsSection.js +6 -6
  114. package/dist/client/settings/SettingsTabsPage.js +47 -25
  115. package/dist/client/settings/VoiceTranscriptionSection.d.ts +3 -1
  116. package/dist/client/settings/VoiceTranscriptionSection.js +20 -8
  117. package/dist/client/settings/agent-settings-search.d.ts +1 -1
  118. package/dist/client/settings/agent-settings-search.js +8 -8
  119. package/dist/client/transcription/BuilderTranscriptionCta.js +2 -2
  120. package/dist/client/use-chat-threads.d.ts +9 -0
  121. package/dist/client/use-chat-threads.js +22 -6
  122. package/dist/collab/routes.d.ts +1 -1
  123. package/dist/integrations/google-docs-poller.js +9 -1
  124. package/dist/integrations/webhook-handler.js +11 -1
  125. package/dist/jobs/scheduler.d.ts +4 -1
  126. package/dist/jobs/scheduler.js +34 -9
  127. package/dist/localization/default-messages.js +40 -40
  128. package/dist/mcp-client/oauth-routes.js +1 -1
  129. package/dist/notifications/routes.d.ts +1 -1
  130. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  131. package/dist/provider-api/actions/provider-api.d.ts +15 -15
  132. package/dist/resources/handlers.d.ts +1 -1
  133. package/dist/secrets/onboarding.js +1 -1
  134. package/dist/secrets/routes.d.ts +9 -9
  135. package/dist/server/agent-chat/browser-team-tools.d.ts +1 -0
  136. package/dist/server/agent-chat/browser-team-tools.js +1 -0
  137. package/dist/server/agent-chat-plugin.js +14 -1
  138. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  139. package/dist/server/agent-teams.d.ts +2 -0
  140. package/dist/server/agent-teams.js +2 -0
  141. package/dist/server/workspace-provider-oauth.js +1 -1
  142. package/dist/setup-connections/onboarding.js +2 -2
  143. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  144. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +53 -1
  145. package/dist/templates/chat/AGENTS.md +11 -0
  146. package/dist/templates/chat/app/components/layout/Layout.tsx +1 -1
  147. package/dist/templates/chat/app/root.tsx +1 -1
  148. package/dist/templates/chat/app/routes/agent.tsx +29 -13
  149. package/dist/templates/chat/vite.config.ts +42 -0
  150. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  151. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +53 -1
  152. package/dist/templates/default/AGENTS.md +11 -0
  153. package/dist/templates/default/vite.config.ts +42 -0
  154. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  155. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  156. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +53 -1
  157. package/dist/templates/workspace-core/AGENTS.md +11 -0
  158. package/dist/templates/workspace-root/AGENTS.md +14 -0
  159. package/dist/vite/client.js +56 -0
  160. package/package.json +2 -2
  161. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  162. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +53 -1
  163. package/src/templates/chat/AGENTS.md +11 -0
  164. package/src/templates/chat/app/components/layout/Layout.tsx +1 -1
  165. package/src/templates/chat/app/root.tsx +1 -1
  166. package/src/templates/chat/app/routes/agent.tsx +29 -13
  167. package/src/templates/chat/vite.config.ts +42 -0
  168. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  169. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +53 -1
  170. package/src/templates/default/AGENTS.md +11 -0
  171. package/src/templates/default/vite.config.ts +42 -0
  172. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  173. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  174. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +53 -1
  175. package/src/templates/workspace-core/AGENTS.md +11 -0
  176. package/src/templates/workspace-root/AGENTS.md +14 -0
@@ -12,7 +12,8 @@ export function parseJobFrontmatter(content) {
12
12
  export function buildJobContent(meta, body) {
13
13
  return buildJobResourceContent(meta, body);
14
14
  }
15
- let _isRunning = false;
15
+ const MAX_CONCURRENT_SCHEDULED_JOBS = 8;
16
+ const _activeScheduledJobs = new Set();
16
17
  // Skip the DB query on every tick if we recently confirmed no jobs exist.
17
18
  // `_hasJobsCache` is invalidated whenever a `jobs/*` resource is written or
18
19
  // deleted (subscribed below), and refreshed at most every 5 minutes.
@@ -39,12 +40,12 @@ function subscribeToJobsResourceEvents() {
39
40
  }
40
41
  /**
41
42
  * Process all due recurring jobs. Called every 60 seconds.
42
- * Sequential execution with 5-minute timeout per job.
43
+ *
44
+ * Scans may overlap while a long-running job is executing. Each resource is
45
+ * still protected by its persisted running state and a process-local key, so
46
+ * one job cannot run twice while leaving other due jobs waiting behind it.
43
47
  */
44
48
  export async function processRecurringJobs(deps) {
45
- // Prevent concurrent runs
46
- if (_isRunning)
47
- return;
48
49
  subscribeToJobsResourceEvents();
49
50
  // Skip if we recently confirmed there are no job resources to run.
50
51
  const nowMs = Date.now();
@@ -52,7 +53,8 @@ export async function processRecurringJobs(deps) {
52
53
  nowMs - _lastJobsCheck < JOBS_CHECK_INTERVAL_MS) {
53
54
  return;
54
55
  }
55
- _isRunning = true;
56
+ const reservedJobKeys = new Set();
57
+ const startedJobKeys = new Set();
56
58
  try {
57
59
  const jobResources = await resourceListAllOwners("jobs/");
58
60
  _hasJobsCache = jobResources.some((r) => r.path.endsWith(".md") && !r.path.endsWith(".keep"));
@@ -60,6 +62,7 @@ export async function processRecurringJobs(deps) {
60
62
  if (!_hasJobsCache)
61
63
  return;
62
64
  const now = new Date();
65
+ const dueJobs = [];
63
66
  for (const resource of jobResources) {
64
67
  // Skip non-markdown or .keep files
65
68
  if (!resource.path.endsWith(".md"))
@@ -104,8 +107,25 @@ export async function processRecurringJobs(deps) {
104
107
  // Skip if body is empty
105
108
  if (!body.trim())
106
109
  continue;
107
- // Execute the job
108
- await executeJob(resource, meta, body, deps, now);
110
+ const key = `${resource.owner}:${resource.path}`;
111
+ if (_activeScheduledJobs.has(key))
112
+ continue;
113
+ if (_activeScheduledJobs.size >= MAX_CONCURRENT_SCHEDULED_JOBS)
114
+ continue;
115
+ _activeScheduledJobs.add(key);
116
+ reservedJobKeys.add(key);
117
+ dueJobs.push({ key, resource, meta, body });
118
+ }
119
+ const outcomes = await Promise.allSettled(dueJobs.map(({ key, resource, meta, body }) => {
120
+ startedJobKeys.add(key);
121
+ return executeJob(resource, meta, body, deps, now).finally(() => {
122
+ _activeScheduledJobs.delete(key);
123
+ });
124
+ }));
125
+ for (const outcome of outcomes) {
126
+ if (outcome.status === "rejected") {
127
+ console.error("[recurring-jobs] Job execution error:", outcome.reason);
128
+ }
109
129
  }
110
130
  }
111
131
  catch (err) {
@@ -125,7 +145,12 @@ export async function processRecurringJobs(deps) {
125
145
  console.error("[recurring-jobs] Error processing jobs:", detail);
126
146
  }
127
147
  finally {
128
- _isRunning = false;
148
+ // A scan can fail after reserving a job but before dispatching it. Do not
149
+ // leave that reservation blocking the job on every subsequent tick.
150
+ for (const key of reservedJobKeys) {
151
+ if (!startedJobKeys.has(key))
152
+ _activeScheduledJobs.delete(key);
153
+ }
129
154
  }
130
155
  }
131
156
  export const jobRunCutOffReason = backgroundRunCutOffReason;
@@ -34,9 +34,9 @@ const messages = {
34
34
  openTeamSettings: "Open team settings",
35
35
  openResourceSettings: "Open resource settings",
36
36
  backHome: "Back to home",
37
- mcpConnectionsTitle: "MCP connections",
38
- mcpConnectionsDescription: "Connect remote MCP servers so the agent can use their tools.",
39
- openMcpConnections: "Manage MCP connections",
37
+ mcpConnectionsTitle: "Agent integrations",
38
+ mcpConnectionsDescription: "Connect tools and services so the agent can use them.",
39
+ openMcpConnections: "Open integrations",
40
40
  profileTitle: "Account",
41
41
  profileDescription: "Your name, profile photo, and signed-in identity.",
42
42
  profileLoading: "Loading...",
@@ -256,17 +256,17 @@ const messages = {
256
256
  openApp: "Open app",
257
257
  notDispatchOrWorkspaceApp: " a Dispatch tab or a workspace app in this workspace.",
258
258
  agentsDescription: "Dispatch can delegate to the built-in app suite over A2A by default. Add extra agents here only if you want to route work to apps outside that built-in set.",
259
- mcpAccessUpdated: "MCP app access updated",
259
+ mcpAccessUpdated: "Agent integration access updated",
260
260
  selectAppForMcp: "Select at least one app, or expose all apps.",
261
- mcpUrlCopied: "MCP URL copied",
262
- mcpUrlCopyFailed: "Could not copy MCP URL",
263
- unifiedMcpGateway: "Unified MCP gateway",
261
+ mcpUrlCopied: "Agent integration URL copied",
262
+ mcpUrlCopyFailed: "Could not copy agent integration URL",
263
+ unifiedMcpGateway: "Unified agent integration gateway",
264
264
  unifiedMcpGatewayDescription: "Connect external agents to Dispatch once, then route to granted workspace apps through",
265
265
  allApps: "All apps",
266
266
  selectedApps: "Selected apps",
267
267
  loading: "Loading",
268
268
  grantedCount: "{{count}} granted",
269
- exposeAllAppsMcp: "Expose all apps through Dispatch MCP",
269
+ exposeAllAppsMcp: "Expose all apps through Dispatch",
270
270
  copyUrl: "Copy URL",
271
271
  metricsUnavailable: "Metrics unavailable",
272
272
  unableToLoadUsage: "Unable to load usage.",
@@ -388,7 +388,7 @@ const messages = {
388
388
  askAgentTitle: "Ask the agent",
389
389
  askAgentPlaceholder: "Tell the agent what you want to do…",
390
390
  connectAi: "Connect AI",
391
- builderOrOwnKeys: "Use Builder.io (free credits), or add your own provider keys.",
391
+ builderOrOwnKeys: "Use Builder.io free credits, or add your own provider keys.",
392
392
  connectBuilderIo: "Connect Builder.io",
393
393
  connectingBuilder: "Connecting Builder.io…",
394
394
  builderModelCredits: "Free credits for Claude, OpenAI & Gemini",
@@ -566,7 +566,7 @@ const messages = {
566
566
  automationPrompt: "Create an automation that does this: ",
567
567
  cancel: "Cancel",
568
568
  instructions: "Instructions",
569
- mcpTools: "Connected MCP tools",
569
+ mcpTools: "Connected agent tools",
570
570
  automationEventTrigger: "On {{event}}",
571
571
  scheduledTrigger: "Scheduled",
572
572
  eventTrigger: "Event-triggered",
@@ -838,9 +838,9 @@ const messages = {
838
838
  },
839
839
  mcpIntegrations: {
840
840
  menuLabel: "Integrations",
841
- menuDescription: "Connect MCP tools to the agent",
841
+ menuDescription: "Connect tools and services to the agent",
842
842
  title: "Connect integrations",
843
- description: "Browse {{count}} MCP integrations or add a custom server.",
843
+ description: "Browse {{count}} agent integrations or add a custom one.",
844
844
  searchPlaceholder: "Search integrations",
845
845
  addYourOwn: "Add your own",
846
846
  noMatches: "No integrations match that search.",
@@ -853,21 +853,21 @@ const messages = {
853
853
  connectSuggestionWithApiToken: "Connect {{name}} with an API token to use it in chat",
854
854
  dismissSuggestion: "Dismiss integration suggestion",
855
855
  backToIntegrations: "Back to integrations",
856
- customTitle: "Add custom MCP server",
856
+ customTitle: "Add custom agent integration",
857
857
  configureTitle: "Configure {{name}}",
858
858
  presetNoAuthDescription: "Preset values are filled in. Test the endpoint or connect it now.",
859
859
  presetAuthDescription: "Preset values are filled in. Add any required authorization details before connecting.",
860
- customDescription: "Paste a Streamable HTTP or SSE MCP endpoint and optional headers.",
860
+ customDescription: "Paste a Streamable HTTP or SSE endpoint and optional headers.",
861
861
  oauthNotice: "This provider usually requires an OAuth setup. Follow the provider docs, or add an Authorization header if your endpoint supports token-based access.",
862
862
  personal: "Personal",
863
863
  organization: "Organization",
864
- serverNameRequired: "Enter a server name before connecting with OAuth.",
865
- serverName: "Server name",
864
+ serverNameRequired: "Enter an integration name before connecting with OAuth.",
865
+ serverName: "Integration name",
866
866
  url: "URL",
867
867
  fieldDescription: "Description",
868
868
  headers: "Headers",
869
- serverNamePlaceholder: "Server name",
870
- urlPlaceholder: "https://mcp.example.com/mcp",
869
+ serverNamePlaceholder: "Integration name",
870
+ urlPlaceholder: "https://example.com/agent-integration",
871
871
  descriptionPlaceholder: "Description (optional)",
872
872
  headersPlaceholder: "Authorization: Bearer <token>",
873
873
  openSetupDocs: "Open setup docs",
@@ -889,12 +889,12 @@ const messages = {
889
889
  notion: {
890
890
  description: "Search pages and team knowledge.",
891
891
  useCase: "Documentation, knowledge management, notes, content creation",
892
- setupNote: "Notion MCP uses user OAuth. Enterprise workspaces can audit MCP usage and allow or block clients; reconnect after admin policy changes.",
892
+ setupNote: "The Notion integration uses user OAuth. Enterprise workspaces can audit integration usage and allow or block clients; reconnect after admin policy changes.",
893
893
  },
894
894
  granola: {
895
895
  description: "Search meeting notes, transcripts, and action items.",
896
896
  useCase: "Meeting notes, recordings, transcripts, action items, follow-ups",
897
- setupNote: "Granola MCP uses browser OAuth. Authorize the signed-in Granola account and review which meeting notes and transcripts the agent can access.",
897
+ setupNote: "The Granola integration uses browser OAuth. Authorize the signed-in Granola account and review which meeting notes and transcripts the agent can access.",
898
898
  },
899
899
  semgrep: {
900
900
  description: "Scan code for security findings.",
@@ -919,32 +919,32 @@ const messages = {
919
919
  atlassian: {
920
920
  description: "Read and write Jira issues and Confluence content.",
921
921
  useCase: "Project management, issue tracking, documentation, team collaboration",
922
- setupNote: "Atlassian admins manage the allowed AI domains and Rovo MCP permissions. Use the current Streamable HTTP endpoint, /v1/mcp, and reconnect after policy changes.",
922
+ setupNote: "Atlassian admins manage the allowed AI domains and Rovo integration permissions. Use the current Streamable HTTP endpoint, /v1/mcp, and reconnect after policy changes.",
923
923
  },
924
924
  cloudflare: {
925
- description: "Search and operate Cloudflare services through MCP.",
925
+ description: "Search and operate Cloudflare services through its integration.",
926
926
  useCase: "DNS, Workers, domains, security, observability, platform APIs",
927
- setupNote: "Cloudflare's managed MCP directory contains product-specific servers as well as the broad API server. Review the scopes and choose the narrowest endpoint that fits your workflow.",
927
+ setupNote: "Cloudflare's managed integration directory contains product-specific integrations as well as the broad API integration. Review the scopes and choose the narrowest endpoint that fits your workflow.",
928
928
  },
929
929
  gitlab: {
930
930
  description: "Read and manage GitLab projects, issues, and merge requests.",
931
931
  useCase: "Repositories, issues, merge requests, CI/CD, code analytics",
932
- setupNote: "GitLab MCP is currently beta. On GitLab.com, a top-level group admin must allow MCP access before OAuth can complete; self-managed instances have an equivalent instance setting.",
932
+ setupNote: "The GitLab integration is currently beta. On GitLab.com, a top-level group admin must allow integration access before OAuth can complete; self-managed instances have an equivalent instance setting.",
933
933
  },
934
934
  figma: {
935
935
  description: "Bring Figma design context and canvas actions into an agent.",
936
936
  useCase: "Design files, components, variables, design systems, canvas",
937
- setupNote: "Figma MCP only allows clients listed in Figma's MCP Catalog, so this remote endpoint cannot connect from Agent Native yet. Use the Figma REST API fallback with a personal access token for reading file and node context; MCP canvas actions remain unavailable until Figma approves Agent Native.",
937
+ setupNote: "The Figma integration only allows clients listed in Figma's integration catalog, so this remote endpoint cannot connect from Agent Native yet. Use the Figma REST API fallback with a personal access token for reading file and node context; canvas actions remain unavailable until Figma approves Agent Native.",
938
938
  },
939
939
  canva: {
940
940
  description: "Search, create, and update Canva designs and assets.",
941
941
  useCase: "Designs, templates, assets, brand kits, exports, collaboration",
942
- setupNote: "Canva MCP uses per-user OAuth and requires clients to allow Canva's canva.com and canva.ai domains. Confirm the current redirect and client setup in Canva's MCP documentation before connecting.",
942
+ setupNote: "The Canva integration uses per-user OAuth and requires clients to allow Canva's canva.com and canva.ai domains. Confirm the current redirect and client setup in Canva's integration documentation before connecting.",
943
943
  },
944
944
  vercel: {
945
945
  description: "Search Vercel docs and inspect projects, deployments, and logs.",
946
946
  useCase: "Deployments, projects, logs, domains, hosting, documentation",
947
- setupNote: "Vercel MCP only accepts reviewed and approved AI clients. Agent Native must be added to Vercel's supported-client list before a generic framework connection will work.",
947
+ setupNote: "The Vercel integration only accepts reviewed and approved AI clients. Agent Native must be added to Vercel's supported-client list before a generic framework connection will work.",
948
948
  },
949
949
  github: {
950
950
  description: "Read repositories, issues, pull requests, and code context.",
@@ -952,54 +952,54 @@ const messages = {
952
952
  setupNote: "GitHub does not use a Figma-style vendor client allowlist. Its hosted endpoint is tied to GitHub Copilot integrations; clients need a registered OAuth app, and organizations may enforce OAuth App Access Policies.",
953
953
  },
954
954
  slack: {
955
- description: "Search Slack conversations and take workspace actions through MCP.",
955
+ description: "Search Slack conversations and take workspace actions through its integration.",
956
956
  useCase: "Messages, channels, people, company memory, workflows",
957
- setupNote: "Slack MCP requires a registered Slack app with a fixed app ID. Dynamic client registration is not supported, and only Slack Marketplace or internal apps may connect. Use Slack's managed messaging OAuth flow for Agent Native workflows.",
957
+ setupNote: "The Slack integration requires a registered Slack app with a fixed app ID. Dynamic client registration is not supported, and only Slack Marketplace or internal apps may connect. Use Slack's managed messaging OAuth flow for Agent Native workflows.",
958
958
  },
959
959
  asana: {
960
960
  description: "Search and manage Asana tasks, projects, and work graph data.",
961
961
  useCase: "Tasks, projects, portfolios, planning, workload",
962
- setupNote: "Asana's V2 MCP server requires a pre-registered MCP OAuth app and does not support dynamic client registration. Configure an Asana app client before connecting.",
962
+ setupNote: "Asana's agent integration requires a pre-registered OAuth app and does not support dynamic client registration. Configure an Asana app client before connecting.",
963
963
  },
964
964
  hubspot: {
965
- description: "Search and update HubSpot CRM records through MCP.",
965
+ description: "Search and update HubSpot CRM records through its integration.",
966
966
  useCase: "CRM, contacts, companies, deals, tickets, customer analytics",
967
- setupNote: "HubSpot MCP requires a HubSpot MCP Auth App and PKCE. Create the app in the HubSpot Developer Platform before connecting; the existing HubSpot OAuth connector remains available to app actions.",
967
+ setupNote: "The HubSpot integration requires a HubSpot Auth App and PKCE. Create the app in the HubSpot Developer Platform before connecting; the existing HubSpot OAuth connector remains available to app actions.",
968
968
  },
969
969
  intercom: {
970
970
  description: "Search conversations and customer support knowledge.",
971
971
  useCase: "Customer support, conversations, contacts, help center content",
972
- setupNote: "Intercom MCP uses OAuth and is available for US-hosted workspaces. Confirm the workspace region and requested scopes during authorization.",
972
+ setupNote: "The Intercom integration uses OAuth and is available for US-hosted workspaces. Confirm the workspace region and requested scopes during authorization.",
973
973
  },
974
974
  monday: {
975
975
  description: "Work with boards, items, and team workflows.",
976
976
  useCase: "Work management, boards, projects, tasks, team operations",
977
- setupNote: "monday.com MCP uses OAuth over Streamable HTTP. Choose the workspace and permissions to share during authorization.",
977
+ setupNote: "The monday.com integration uses OAuth over Streamable HTTP. Choose the workspace and permissions to share during authorization.",
978
978
  },
979
979
  webflow: {
980
980
  description: "Read and update Webflow sites and content.",
981
981
  useCase: "Websites, CMS, site content, publishing, design workflows",
982
- setupNote: "Webflow MCP uses OAuth. Designer capabilities may install Webflow's Bridge App during authorization; Data API access is available separately.",
982
+ setupNote: "The Webflow integration uses OAuth. Designer capabilities may install Webflow's Bridge App during authorization; Data API access is available separately.",
983
983
  },
984
984
  paypal: {
985
985
  description: "Work with PayPal payments, invoices, and commerce data.",
986
986
  useCase: "Payments, invoices, transactions, merchant operations",
987
- setupNote: "PayPal exposes OAuth discovery and login for its remote MCP server. Agent Native uses the currently live /sse endpoint; review the merchant permissions before authorizing.",
987
+ setupNote: "PayPal exposes OAuth discovery and login for its remote agent integration. Agent Native uses the currently live /sse endpoint; review the merchant permissions before authorizing.",
988
988
  },
989
989
  box: {
990
990
  description: "Search and manage files and folders in Box.",
991
991
  useCase: "Files, folders, enterprise content, search, collaboration",
992
- setupNote: "Box MCP is beta and requires an administrator to enable it. Custom clients also need Box Integration Credentials, a redirect URI, and approved scopes.",
992
+ setupNote: "The Box integration is beta and requires an administrator to enable it. Custom clients also need Box Integration Credentials, a redirect URI, and approved scopes.",
993
993
  },
994
994
  netlify: {
995
995
  description: "Inspect and operate Netlify sites and deployments.",
996
996
  useCase: "Sites, deployments, builds, domains, hosting operations",
997
- setupNote: "Netlify documents a remote MCP setup for supported clients. Review the site and team permissions before completing OAuth.",
997
+ setupNote: "Netlify documents a remote integration setup for supported clients. Review the site and team permissions before completing OAuth.",
998
998
  },
999
999
  zapier: {
1000
- description: "Connect MCP tools to thousands of app actions.",
1000
+ description: "Connect tools to thousands of app actions.",
1001
1001
  useCase: "Automation, workflows, app actions, cross-service operations",
1002
- setupNote: "Zapier MCP uses a user-created MCP server and connection token for unlisted clients. Create the server in Zapier, then paste its generated bearer token into the header field.",
1002
+ setupNote: "Zapier's agent integration uses a user-created connection and token for unlisted clients. Create the connection in Zapier, then paste its generated bearer token into the header field.",
1003
1003
  },
1004
1004
  },
1005
1005
  auth: {
@@ -190,7 +190,7 @@ async function handleMcpOAuthCallback(event, options) {
190
190
  }
191
191
  await options.reconfigure();
192
192
  const returnPath = flow.returnUrl ??
193
- `/settings/connections?connected=mcp-${encodeURIComponent(flow.name)}`;
193
+ `/settings?connected=mcp-${encodeURIComponent(flow.name)}#integrations`;
194
194
  return redirectWithStagedCookies(event, getAppUrl(event, returnPath));
195
195
  }
196
196
  catch {
@@ -28,7 +28,7 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
28
28
  } | {
29
29
  count?: undefined;
30
30
  updated?: undefined;
31
- ok: boolean;
32
31
  error?: undefined;
32
+ ok: boolean;
33
33
  }>>;
34
34
  //# sourceMappingURL=routes.d.ts.map
@@ -75,10 +75,8 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
75
75
  user: "user";
76
76
  }>>;
77
77
  }, z.core.$strip>>, {
78
- id?: undefined;
79
- provider?: undefined;
80
78
  deleted?: undefined;
81
- found?: undefined;
79
+ message?: undefined;
82
80
  providers: {
83
81
  id: string;
84
82
  label: string;
@@ -89,45 +87,47 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
89
87
  updatedAt: number;
90
88
  }[];
91
89
  count: number;
90
+ provider?: undefined;
91
+ found?: undefined;
92
92
  registered?: undefined;
93
+ id?: undefined;
93
94
  label?: undefined;
94
- message?: undefined;
95
95
  } | {
96
- count?: undefined;
97
- id?: undefined;
98
96
  deleted?: undefined;
97
+ count?: undefined;
98
+ message?: undefined;
99
99
  providers?: undefined;
100
100
  found: boolean;
101
101
  provider: import("../custom-registry.js").CustomProviderConfig;
102
102
  registered?: undefined;
103
+ id?: undefined;
103
104
  label?: undefined;
104
- message?: undefined;
105
105
  } | {
106
- count?: undefined;
107
- provider?: undefined;
108
106
  deleted?: undefined;
107
+ count?: undefined;
108
+ message?: undefined;
109
109
  providers?: undefined;
110
+ provider?: undefined;
110
111
  found: boolean;
111
112
  id: string;
112
113
  registered?: undefined;
113
114
  label?: undefined;
114
- message?: undefined;
115
115
  } | {
116
116
  count?: undefined;
117
+ message?: undefined;
118
+ providers?: undefined;
117
119
  provider?: undefined;
118
120
  found?: undefined;
119
- providers?: undefined;
120
121
  deleted: boolean;
121
122
  id: string;
122
123
  registered?: undefined;
123
124
  label?: undefined;
124
- message?: undefined;
125
125
  } | {
126
+ deleted?: undefined;
126
127
  count?: undefined;
128
+ providers?: undefined;
127
129
  provider?: undefined;
128
- deleted?: undefined;
129
130
  found?: undefined;
130
- providers?: undefined;
131
131
  registered: boolean;
132
132
  id: string;
133
133
  label: string;
@@ -311,9 +311,9 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
311
311
  notes?: string | undefined;
312
312
  scope?: "org" | "user" | undefined;
313
313
  }, {
314
- message?: undefined;
315
314
  id?: undefined;
316
- found?: undefined;
315
+ provider?: undefined;
316
+ deleted?: undefined;
317
317
  providers: {
318
318
  id: string;
319
319
  label: string;
@@ -324,46 +324,46 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
324
324
  updatedAt: number;
325
325
  }[];
326
326
  count: number;
327
- provider?: undefined;
328
- deleted?: undefined;
327
+ found?: undefined;
329
328
  registered?: undefined;
330
329
  label?: undefined;
331
- } | {
332
330
  message?: undefined;
331
+ } | {
333
332
  id?: undefined;
333
+ deleted?: undefined;
334
334
  count?: undefined;
335
335
  providers?: undefined;
336
336
  found: boolean;
337
337
  provider: import("../custom-registry.js").CustomProviderConfig;
338
- deleted?: undefined;
339
338
  registered?: undefined;
340
339
  label?: undefined;
341
- } | {
342
340
  message?: undefined;
341
+ } | {
342
+ provider?: undefined;
343
+ deleted?: undefined;
343
344
  count?: undefined;
344
345
  providers?: undefined;
345
- provider?: undefined;
346
346
  found: boolean;
347
347
  id: string;
348
- deleted?: undefined;
349
348
  registered?: undefined;
350
349
  label?: undefined;
351
- } | {
352
350
  message?: undefined;
353
- found?: undefined;
351
+ } | {
352
+ provider?: undefined;
354
353
  count?: undefined;
355
354
  providers?: undefined;
356
- provider?: undefined;
355
+ found?: undefined;
357
356
  deleted: boolean;
358
357
  id: string;
359
358
  registered?: undefined;
360
359
  label?: undefined;
360
+ message?: undefined;
361
361
  } | {
362
- found?: undefined;
363
- count?: undefined;
364
- providers?: undefined;
365
362
  provider?: undefined;
366
363
  deleted?: undefined;
364
+ count?: undefined;
365
+ providers?: undefined;
366
+ found?: undefined;
367
367
  registered: boolean;
368
368
  id: string;
369
369
  label: string;
@@ -48,8 +48,8 @@ export declare function handleUpdateResource(event: any): Promise<import("./stor
48
48
  }>;
49
49
  /** DELETE /_agent-native/resources/:id — delete a resource */
50
50
  export declare function handleDeleteResource(event: any): Promise<{
51
- ok?: undefined;
52
51
  error: string;
52
+ ok?: undefined;
53
53
  } | {
54
54
  error?: undefined;
55
55
  ok: boolean;
@@ -44,7 +44,7 @@ export function maybeRegisterSecretOnboardingStep(secret) {
44
44
  kind: "link",
45
45
  primary: true,
46
46
  label: `Open ${secret.label} settings`,
47
- description: "Paste the key in the sidebar's API Keys & Connections section.",
47
+ description: "Paste the key in Settings Integrations API keys.",
48
48
  payload: {
49
49
  // Fragment handled by the sidebar — expands the Secrets section
50
50
  // and focuses the matching input.
@@ -34,37 +34,37 @@ export declare function createListSecretsHandler(): import("h3").EventHandlerWit
34
34
  /** POST /_agent-native/secrets/:key — write a secret. */
35
35
  export declare function createWriteSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
36
36
  error: string;
37
- ok?: undefined;
38
37
  status?: undefined;
38
+ ok?: undefined;
39
39
  } | {
40
- error?: undefined;
41
40
  ok: boolean;
42
41
  status: string;
42
+ error?: undefined;
43
43
  } | {
44
- ok?: undefined;
45
44
  error: string;
46
45
  removed?: undefined;
46
+ ok?: undefined;
47
47
  } | {
48
- error?: undefined;
49
48
  ok: boolean;
50
49
  removed: boolean;
50
+ error?: undefined;
51
51
  }>>;
52
52
  /**
53
53
  * POST /_agent-native/secrets/:key/test — validate an optional candidate value
54
54
  * or the current stored value without changing anything.
55
55
  */
56
56
  export declare function createTestSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
57
- ok?: undefined;
58
57
  error: string;
59
58
  note?: undefined;
59
+ ok?: undefined;
60
60
  } | {
61
- error?: undefined;
62
61
  ok: boolean;
63
62
  note?: undefined;
64
- } | {
65
63
  error?: undefined;
64
+ } | {
66
65
  ok: boolean;
67
66
  note: string;
67
+ error?: undefined;
68
68
  } | {
69
69
  note?: undefined;
70
70
  ok: boolean;
@@ -95,12 +95,12 @@ export interface AdHocSecretPayload {
95
95
  export declare function createAdHocSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<AdHocSecretPayload[] | {
96
96
  error: string;
97
97
  } | {
98
- error?: undefined;
99
98
  ok: boolean;
100
99
  key: string;
101
- } | {
102
100
  error?: undefined;
101
+ } | {
103
102
  ok: boolean;
104
103
  removed: boolean;
104
+ error?: undefined;
105
105
  }>>;
106
106
  //# sourceMappingURL=routes.d.ts.map
@@ -16,6 +16,7 @@ export declare function createTeamTools(deps: {
16
16
  getEngine: () => AgentEngine;
17
17
  getModel: () => string;
18
18
  getParentThreadId: () => string;
19
+ getAppId?: () => string | null | undefined;
19
20
  getParentRunId?: () => string;
20
21
  getSend: () => ((event: import("../../agent/types.js").AgentChatEvent) => void) | null;
21
22
  }): Record<string, ActionEntry>;
@@ -402,6 +402,7 @@ export function createTeamTools(deps) {
402
402
  model: selectedModel,
403
403
  name: selectedName || undefined,
404
404
  parentThreadId: deps.getParentThreadId(),
405
+ parentSourceAppId: deps.getAppId?.() ?? null,
405
406
  parentRunId: deps.getParentRunId?.(),
406
407
  parentSend: (event) => {
407
408
  if (capturedSend)
@@ -20,7 +20,7 @@ import { appendThreadDebugHistory } from "../agent/thread-debug-history.js";
20
20
  import { attachToolSearch } from "../agent/tool-search.js";
21
21
  import { readAppStateForCurrentTab } from "../application-state/script-helpers.js";
22
22
  import { runChatThreadDataMigrations } from "../chat-threads/migrations.js";
23
- import { adoptThreadScopeIfUnscoped, createThread, forkThread, getThread, registerChatThreadsShareable, resolveRunThreadScope, resolveThreadAccess, listThreads, searchThreads, renameThread, createThreadShareLink, getThreadByShareToken, getThreadShareState, revokeThreadShareLink, setThreadArchived, setThreadPinned, setThreadScope, updateThreadData, withThreadDataLock, deleteThread, setThreadQueuedMessages, } from "../chat-threads/store.js";
23
+ import { adoptThreadScopeIfUnscoped, createThread, forkThread, getThread, registerChatThreadsShareable, resolveRunThreadScope, resolveThreadAccess, listThreads, searchThreads, renameThread, createThreadShareLink, getThreadByShareToken, getThreadShareState, revokeThreadShareLink, setThreadArchived, setThreadPinned, setThreadScope, updateThreadData, withThreadDataLock, deleteThread, setThreadQueuedMessages, setThreadSourceIfMissing, } from "../chat-threads/store.js";
24
24
  import { isCheckpointRestorePath } from "../checkpoints/route-match.js";
25
25
  import { createDbAdminAgentTools } from "../db-admin/agent-tools.js";
26
26
  import { isTransientDatabaseError } from "../db/client.js";
@@ -2014,12 +2014,18 @@ export function createAgentChatPlugin(options) {
2014
2014
  thread = await createThread(ownerEmail, {
2015
2015
  id: threadId,
2016
2016
  scope: runScope,
2017
+ source: options?.appId ? { appId: options.appId } : null,
2017
2018
  });
2018
2019
  }
2019
2020
  catch {
2020
2021
  thread = await getThread(threadId);
2021
2022
  }
2022
2023
  }
2024
+ if (options?.appId) {
2025
+ await setThreadSourceIfMissing(threadId, {
2026
+ appId: options.appId,
2027
+ });
2028
+ }
2023
2029
  if (!thread) {
2024
2030
  throw createError({
2025
2031
  statusCode: 404,
@@ -2113,6 +2119,7 @@ export function createAgentChatPlugin(options) {
2113
2119
  },
2114
2120
  getModel: () => getRequestRunContext()?.model ?? resolvedModel,
2115
2121
  getParentThreadId: () => getRequestRunContext()?.threadId ?? "",
2122
+ getAppId: () => options?.appId ?? null,
2116
2123
  getParentRunId: () => getRequestRunContext()?.runId ?? "",
2117
2124
  getSend: () => {
2118
2125
  // Return the send for the current run's thread
@@ -4318,10 +4325,13 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
4318
4325
  const q = query.q ? String(query.q).trim() : "";
4319
4326
  const scope = parseScopeFromQuery(query);
4320
4327
  const unscopedOnly = String(query.unscoped ?? "") === "1";
4328
+ const includeExternal = String(query.includeExternal ?? "") === "1";
4321
4329
  if (q) {
4322
4330
  const threads = await searchThreads(owner, q, limit, {
4323
4331
  scope: scope ?? undefined,
4324
4332
  orgId,
4333
+ includeExternal,
4334
+ sourceAppId: options?.appId ?? null,
4325
4335
  });
4326
4336
  return { threads };
4327
4337
  }
@@ -4332,6 +4342,8 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
4332
4342
  scope: scope ?? undefined,
4333
4343
  unscopedOnly,
4334
4344
  orgId,
4345
+ includeExternal,
4346
+ sourceAppId: options?.appId ?? null,
4335
4347
  });
4336
4348
  return { threads };
4337
4349
  }
@@ -4358,6 +4370,7 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
4358
4370
  id: body?.id,
4359
4371
  title: body?.title ?? "",
4360
4372
  scope: parseScopeFromBody(body?.scope),
4373
+ source: options?.appId ? { appId: options.appId } : null,
4361
4374
  });
4362
4375
  return thread;
4363
4376
  }
@@ -27,11 +27,11 @@ export declare function resolveAgentEngineApiKeyWriteTarget(event: H3Event, scop
27
27
  export declare function createAgentEngineApiKeyHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
28
28
  error: any;
29
29
  } | {
30
+ error?: undefined;
30
31
  ok: boolean;
31
32
  key: string;
32
33
  baseUrlKey?: string;
33
34
  scope: AgentEngineApiKeyScope;
34
- error?: undefined;
35
35
  }>>;
36
36
  export {};
37
37
  //# sourceMappingURL=agent-engine-api-key-route.d.ts.map