@agent-native/core 0.145.4 → 0.145.6

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 (398) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +18 -0
  3. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  4. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +17 -1
  5. package/corpus/templates/analytics/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  6. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +1 -0
  7. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +22 -3
  8. package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +76 -23
  9. package/corpus/templates/analytics/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  10. package/corpus/templates/analytics/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  11. package/corpus/templates/analytics/AGENTS.md +2 -1
  12. package/corpus/templates/analytics/actions/account-deep-dive.ts +83 -47
  13. package/corpus/templates/analytics/actions/create-dashboard-folder.ts +27 -0
  14. package/corpus/templates/analytics/actions/gong-calls.ts +3 -3
  15. package/corpus/templates/analytics/actions/list-dashboard-folders.ts +26 -0
  16. package/corpus/templates/analytics/actions/list-sql-dashboards.ts +1 -0
  17. package/corpus/templates/analytics/actions/set-dashboard-folder.ts +26 -0
  18. package/corpus/templates/analytics/app/components/ProviderCorpusJobNotifier.tsx +18 -3
  19. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +6 -4
  20. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
  21. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +12 -2
  22. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +35 -20
  23. package/corpus/templates/analytics/app/global.css +17 -0
  24. package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +29 -15
  25. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +15 -3
  26. package/corpus/templates/analytics/app/i18n-data.ts +296 -0
  27. package/corpus/templates/analytics/app/lib/prefetch-keys.ts +23 -2
  28. package/corpus/templates/analytics/app/pages/DashboardOverview.tsx +642 -0
  29. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +66 -31
  30. package/corpus/templates/analytics/app/root.tsx +4 -0
  31. package/corpus/templates/analytics/app/routes/dashboards._index.tsx +5 -1
  32. package/corpus/templates/analytics/changelog/2026-08-07-added-a-dashboards-overview-with-personal-and-shared-folders.md +6 -0
  33. package/corpus/templates/analytics/changelog/2026-08-07-analytics-tracking-and-chat-startup-no-longer-emit-avoidable.md +6 -0
  34. package/corpus/templates/analytics/changelog/2026-08-07-dashboard-panels-now-load-custom-api-data-programs-reliably.md +6 -0
  35. package/corpus/templates/analytics/changelog/2026-08-07-gong-searches-conserve-api-quota-and-report-incomplete-coverage.md +6 -0
  36. package/corpus/templates/analytics/changelog/2026-08-07-searchable-dashboards-make-personal-and-shared-folders-easie.md +6 -0
  37. package/corpus/templates/analytics/netlify.toml +3 -0
  38. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +112 -0
  39. package/corpus/templates/analytics/server/db/index.ts +12 -0
  40. package/corpus/templates/analytics/server/db/schema.ts +14 -0
  41. package/corpus/templates/analytics/server/jobs/analytics-rollup-backfill.ts +4 -0
  42. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +1 -0
  43. package/corpus/templates/analytics/server/lib/analytics-query-catalog.ts +85 -15
  44. package/corpus/templates/analytics/server/lib/dashboard-folders-store.ts +168 -0
  45. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +9 -4
  46. package/corpus/templates/analytics/server/lib/dashboards-store.ts +116 -1
  47. package/corpus/templates/analytics/server/lib/first-party-analytics-rollups.ts +4 -8
  48. package/corpus/templates/analytics/server/lib/gong.ts +139 -78
  49. package/corpus/templates/analytics/server/plugins/db.ts +55 -15
  50. package/corpus/templates/analytics/server/plugins/session-replay-retention-jobs.ts +6 -2
  51. package/corpus/templates/analytics/server/routes/api/session-replay/retention.post.ts +65 -0
  52. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +18 -0
  53. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  54. package/corpus/templates/assets/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  55. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +1 -0
  56. package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +76 -23
  57. package/corpus/templates/assets/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  58. package/corpus/templates/assets/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  59. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +18 -0
  60. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  61. package/corpus/templates/brain/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  62. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +1 -0
  63. package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +76 -23
  64. package/corpus/templates/brain/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  65. package/corpus/templates/brain/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  66. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +18 -0
  67. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  68. package/corpus/templates/calendar/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  69. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +1 -0
  70. package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +76 -23
  71. package/corpus/templates/calendar/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  72. package/corpus/templates/calendar/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  73. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +18 -0
  74. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  75. package/corpus/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  76. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +1 -0
  77. package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +76 -23
  78. package/corpus/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  79. package/corpus/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  80. package/corpus/templates/chat/.env.example +3 -0
  81. package/corpus/templates/chat/AGENTS.md +4 -0
  82. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +18 -0
  83. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  84. package/corpus/templates/clips/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  85. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +1 -0
  86. package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +76 -23
  87. package/corpus/templates/clips/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  88. package/corpus/templates/clips/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  89. package/corpus/templates/clips/actions/lib/audio-only-transcription.ts +4 -0
  90. package/corpus/templates/clips/actions/request-transcript.ts +52 -3
  91. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +8 -3
  92. package/corpus/templates/clips/app/components/editor/waveform.tsx +2 -1
  93. package/corpus/templates/clips/app/components/library/search-bar.tsx +1 -1
  94. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +3 -10
  95. package/corpus/templates/clips/app/global.css +9 -0
  96. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -0
  97. package/corpus/templates/clips/changelog/2026-08-07-screen-recordings-now-capture-tab-and-system-audio-even-when.md +6 -0
  98. package/corpus/templates/clips/changelog/2026-08-07-transcription-now-retries-transient-cloud-failures-automatic.md +6 -0
  99. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +10 -11
  100. package/corpus/templates/clips/server/db/schema.ts +7 -0
  101. package/corpus/templates/clips/server/plugins/db.ts +8 -0
  102. package/corpus/templates/clips/shared/recording-capture.ts +38 -0
  103. package/corpus/templates/clips/shared/transcript-failure.ts +89 -0
  104. package/corpus/templates/content/.agents/skills/actions/SKILL.md +18 -0
  105. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  106. package/corpus/templates/content/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  107. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +1 -0
  108. package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +76 -23
  109. package/corpus/templates/content/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  110. package/corpus/templates/content/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  111. package/corpus/templates/content/.env.example +9 -3
  112. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -0
  113. package/corpus/templates/content/changelog/2026-08-07-collapsed-sidebar-utility-buttons-stay-anchored-at-the-botto.md +6 -0
  114. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  115. package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +76 -23
  116. package/corpus/templates/crm/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  117. package/corpus/templates/crm/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  118. package/corpus/templates/design/.agents/skills/actions/SKILL.md +18 -0
  119. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  120. package/corpus/templates/design/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  121. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +1 -0
  122. package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +76 -23
  123. package/corpus/templates/design/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  124. package/corpus/templates/design/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  125. package/corpus/templates/design/actions/view-screen.ts +1 -0
  126. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +14 -1
  127. package/corpus/templates/design/changelog/2026-08-07-cmd-c-now-copies-selected-text-in-the-agent-panel-instead-of.md +6 -0
  128. package/corpus/templates/design/changelog/2026-08-07-real-time-voice-can-now-read-the-current-selection-and-edit-.md +6 -0
  129. package/corpus/templates/design/server/lib/reprompt-action-guard.ts +7 -3
  130. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +18 -0
  131. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  132. package/corpus/templates/dispatch/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  133. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +1 -0
  134. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +76 -23
  135. package/corpus/templates/dispatch/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  136. package/corpus/templates/dispatch/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  137. package/corpus/templates/factory/.agents/skills/actions/SKILL.md +18 -0
  138. package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  139. package/corpus/templates/factory/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  140. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +1 -0
  141. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +76 -23
  142. package/corpus/templates/factory/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  143. package/corpus/templates/factory/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  144. package/corpus/templates/factory/actions/babysit-agent-native-pull-request.ts +279 -0
  145. package/corpus/templates/factory/actions/get-factory-automation-health.ts +23 -4
  146. package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +1 -1
  147. package/corpus/templates/factory/app/routes/factory.tsx +21 -3
  148. package/corpus/templates/factory/changelog/2026-08-07-factory-can-keep-builder-bot-pull-requests-moving-by-request.md +6 -0
  149. package/corpus/templates/factory/server/lib/require-factory-automation.ts +1 -0
  150. package/corpus/templates/factory/server/plugins/agent-chat.ts +4 -1
  151. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +81 -12
  152. package/corpus/templates/factory/server/triage/github-client.ts +31 -0
  153. package/corpus/templates/factory/server/triage/pr-babysit.ts +75 -1
  154. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +18 -0
  155. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  156. package/corpus/templates/forms/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  157. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +1 -0
  158. package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +76 -23
  159. package/corpus/templates/forms/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  160. package/corpus/templates/forms/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  161. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  162. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +1 -0
  163. package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +76 -23
  164. package/corpus/templates/macros/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  165. package/corpus/templates/macros/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  166. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +18 -0
  167. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  168. package/corpus/templates/mail/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  169. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +1 -0
  170. package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +76 -23
  171. package/corpus/templates/mail/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  172. package/corpus/templates/mail/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  173. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +18 -0
  174. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  175. package/corpus/templates/plan/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  176. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +1 -0
  177. package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +76 -23
  178. package/corpus/templates/plan/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  179. package/corpus/templates/plan/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  180. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -1
  181. package/corpus/templates/plan/changelog/2026-08-07-inline-help-icons-now-stay-visually-balanced-with-nearby-tex.md +6 -0
  182. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +18 -0
  183. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  184. package/corpus/templates/slides/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  185. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +1 -0
  186. package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +76 -23
  187. package/corpus/templates/slides/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  188. package/corpus/templates/slides/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  189. package/corpus/templates/slides/.env.example +5 -0
  190. package/corpus/templates/slides/changelog/2026-08-07-fixed-generated-slides-briefly-disappearing-while-they-are-b.md +6 -0
  191. package/corpus/templates/slides/server/plugins/collab.ts +20 -8
  192. package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +18 -0
  193. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  194. package/corpus/templates/tasks/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  195. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +1 -0
  196. package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +76 -23
  197. package/corpus/templates/tasks/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  198. package/corpus/templates/tasks/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  199. package/corpus/templates/tasks/.env.example +3 -0
  200. package/dist/agent/production-agent.js +24 -3
  201. package/dist/client/AgentPanel.d.ts +6 -0
  202. package/dist/client/AgentPanel.js +176 -30
  203. package/dist/client/AssistantChat.d.ts +2 -0
  204. package/dist/client/AssistantChat.js +4 -1
  205. package/dist/client/ConnectBuilderCard.js +6 -11
  206. package/dist/client/MultiTabAssistantChat.js +1 -1
  207. package/dist/client/RuntimeConfigNotice.d.ts +1 -0
  208. package/dist/client/RuntimeConfigNotice.js +94 -0
  209. package/dist/client/agent-chat/index.d.ts +1 -1
  210. package/dist/client/agent-chat/index.js +1 -1
  211. package/dist/client/agent-chat-adapter.js +85 -4
  212. package/dist/client/agent-page/AgentTabsPage.js +1 -1
  213. package/dist/client/agent-sidebar-state.d.ts +6 -0
  214. package/dist/client/agent-sidebar-state.js +25 -0
  215. package/dist/client/app-providers.js +2 -1
  216. package/dist/client/assistant-ui-recovery.js +1 -1
  217. package/dist/client/chat/index.d.ts +1 -1
  218. package/dist/client/chat/index.js +1 -1
  219. package/dist/client/chat/markdown-renderer.d.ts +2 -1
  220. package/dist/client/chat/markdown-renderer.js +48 -2
  221. package/dist/client/chat/message-components.d.ts +6 -0
  222. package/dist/client/chat/message-components.js +182 -53
  223. package/dist/client/chat/tool-call-display.d.ts +16 -4
  224. package/dist/client/chat/tool-call-display.js +225 -18
  225. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  226. package/dist/client/frame-protocol.d.ts +4 -0
  227. package/dist/client/i18n.js +9 -0
  228. package/dist/client/integrations/IntegrationsPanel.js +2 -5
  229. package/dist/client/onboarding/FirstRunOnboarding.js +2 -3
  230. package/dist/client/org/TeamPage.js +49 -6
  231. package/dist/client/org/hooks.d.ts +7 -2
  232. package/dist/client/org/hooks.js +11 -4
  233. package/dist/client/resources/McpConnectionSuggestion.js +2 -3
  234. package/dist/client/resources/McpIntegrationDialog.js +2 -16
  235. package/dist/client/resources/McpIntegrationLogo.d.ts +11 -0
  236. package/dist/client/resources/McpIntegrationLogo.js +14 -0
  237. package/dist/client/resources/ResourceTree.js +1 -1
  238. package/dist/client/resources/mcp-integration-logos.d.ts +1 -0
  239. package/dist/client/resources/mcp-integration-logos.js +47 -18
  240. package/dist/client/settings/useBuilderStatus.js +6 -0
  241. package/dist/client/ui/index.d.ts +1 -0
  242. package/dist/client/ui/index.js +1 -0
  243. package/dist/collab/struct-routes.d.ts +1 -1
  244. package/dist/config.d.ts +26 -3
  245. package/dist/config.js +106 -14
  246. package/dist/db/ddl-guard.d.ts +15 -2
  247. package/dist/db/ddl-guard.js +53 -5
  248. package/dist/jobs/scheduler.js +7 -0
  249. package/dist/localization/default-messages.d.ts +17 -0
  250. package/dist/localization/default-messages.js +17 -0
  251. package/dist/mcp/oauth-client-metadata.js +5 -1
  252. package/dist/mcp/oauth-route.d.ts +5 -4
  253. package/dist/mcp/oauth-route.js +25 -9
  254. package/dist/mcp/server.d.ts +1 -1
  255. package/dist/mcp/server.js +9 -10
  256. package/dist/notifications/routes.d.ts +3 -3
  257. package/dist/org/handlers.d.ts +1 -0
  258. package/dist/org/handlers.js +17 -2
  259. package/dist/provider-api/actions/custom-provider-registration.d.ts +9 -9
  260. package/dist/provider-api/actions/provider-api.d.ts +7 -7
  261. package/dist/provider-api/corpus-jobs.d.ts +12 -2
  262. package/dist/provider-api/corpus-jobs.js +31 -1
  263. package/dist/provider-api/index.d.ts +2 -0
  264. package/dist/provider-api/index.js +7 -1
  265. package/dist/secrets/routes.d.ts +6 -6
  266. package/dist/server/agent-chat/recurring-jobs-runtime.d.ts +1 -1
  267. package/dist/server/agent-chat/recurring-jobs-runtime.js +14 -2
  268. package/dist/server/agent-chat/script-entries.js +12 -1
  269. package/dist/server/agent-chat-plugin.js +2 -2
  270. package/dist/server/auth.d.ts +1 -0
  271. package/dist/server/auth.js +85 -1
  272. package/dist/server/better-auth-instance.d.ts +9 -0
  273. package/dist/server/better-auth-instance.js +25 -11
  274. package/dist/server/core-routes-plugin.d.ts +7 -0
  275. package/dist/server/core-routes-plugin.js +51 -5
  276. package/dist/server/create-server.js +23 -2
  277. package/dist/server/db-pressure.d.ts +38 -0
  278. package/dist/server/db-pressure.js +147 -0
  279. package/dist/server/index.d.ts +1 -0
  280. package/dist/server/index.js +1 -0
  281. package/dist/server/legacy-auth-migration.d.ts +10 -0
  282. package/dist/server/legacy-auth-migration.js +37 -0
  283. package/dist/server/onboarding-html.js +206 -2
  284. package/dist/server/poll.d.ts +26 -0
  285. package/dist/server/poll.js +108 -13
  286. package/dist/server/realtime-voice.d.ts +2 -1
  287. package/dist/server/realtime-voice.js +38 -56
  288. package/dist/server/short-lived-token.d.ts +43 -0
  289. package/dist/server/short-lived-token.js +74 -0
  290. package/dist/server/ssr-handler.js +4 -1
  291. package/dist/shared/index.d.ts +1 -0
  292. package/dist/shared/index.js +1 -0
  293. package/dist/shared/runtime-config.d.ts +44 -0
  294. package/dist/shared/runtime-config.js +284 -0
  295. package/dist/styles/agent-native.css +48 -1
  296. package/dist/templates/chat/.agents/skills/actions/SKILL.md +18 -0
  297. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  298. package/dist/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  299. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +1 -0
  300. package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +76 -23
  301. package/dist/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  302. package/dist/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  303. package/dist/templates/chat/.env.example +3 -0
  304. package/dist/templates/chat/AGENTS.md +4 -0
  305. package/dist/templates/default/.agents/skills/actions/SKILL.md +18 -0
  306. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  307. package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  308. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +1 -0
  309. package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +76 -23
  310. package/dist/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  311. package/dist/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  312. package/dist/templates/default/AGENTS.md +6 -1
  313. package/dist/templates/default/app/i18n/ar-SA.ts +6 -0
  314. package/dist/templates/default/app/i18n/de-DE.ts +6 -0
  315. package/dist/templates/default/app/i18n/en-US.ts +6 -0
  316. package/dist/templates/default/app/i18n/es-ES.ts +6 -0
  317. package/dist/templates/default/app/i18n/fr-FR.ts +6 -0
  318. package/dist/templates/default/app/i18n/hi-IN.ts +6 -0
  319. package/dist/templates/default/app/i18n/ja-JP.ts +6 -0
  320. package/dist/templates/default/app/i18n/ko-KR.ts +6 -0
  321. package/dist/templates/default/app/i18n/pt-BR.ts +6 -0
  322. package/dist/templates/default/app/i18n/zh-CN.ts +6 -0
  323. package/dist/templates/default/app/i18n/zh-TW.ts +6 -0
  324. package/dist/templates/headless/.agents/skills/actions/SKILL.md +18 -0
  325. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  326. package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +76 -23
  327. package/dist/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  328. package/dist/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  329. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +18 -0
  330. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  331. package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  332. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -0
  333. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +76 -23
  334. package/dist/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  335. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  336. package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +4 -0
  337. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +8 -0
  338. package/dist/templates/workspace-core/AGENTS.md +7 -2
  339. package/dist/templates/workspace-root/AGENTS.md +5 -0
  340. package/dist/vite/client.d.ts +3 -3
  341. package/dist/vite/client.js +47 -1
  342. package/dist/vite/index.d.ts +1 -1
  343. package/docs/content/agent-native-config.mdx +240 -139
  344. package/docs/content/authentication.mdx +17 -0
  345. package/docs/content/deployment.mdx +19 -14
  346. package/docs/content/drop-in-agent.mdx +19 -2
  347. package/docs/content/environment-variables.mdx +63 -38
  348. package/docs/content/getting-started-actions.mdx +15 -6
  349. package/docs/content/getting-started-database.mdx +14 -10
  350. package/docs/content/getting-started-pages.mdx +32 -35
  351. package/docs/content/getting-started.mdx +7 -6
  352. package/package.json +2 -2
  353. package/src/templates/chat/.agents/skills/actions/SKILL.md +18 -0
  354. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  355. package/src/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  356. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +1 -0
  357. package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +76 -23
  358. package/src/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  359. package/src/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  360. package/src/templates/chat/.env.example +3 -0
  361. package/src/templates/chat/AGENTS.md +4 -0
  362. package/src/templates/default/.agents/skills/actions/SKILL.md +18 -0
  363. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  364. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  365. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +1 -0
  366. package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +76 -23
  367. package/src/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  368. package/src/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  369. package/src/templates/default/AGENTS.md +6 -1
  370. package/src/templates/default/app/i18n/ar-SA.ts +6 -0
  371. package/src/templates/default/app/i18n/de-DE.ts +6 -0
  372. package/src/templates/default/app/i18n/en-US.ts +6 -0
  373. package/src/templates/default/app/i18n/es-ES.ts +6 -0
  374. package/src/templates/default/app/i18n/fr-FR.ts +6 -0
  375. package/src/templates/default/app/i18n/hi-IN.ts +6 -0
  376. package/src/templates/default/app/i18n/ja-JP.ts +6 -0
  377. package/src/templates/default/app/i18n/ko-KR.ts +6 -0
  378. package/src/templates/default/app/i18n/pt-BR.ts +6 -0
  379. package/src/templates/default/app/i18n/zh-CN.ts +6 -0
  380. package/src/templates/default/app/i18n/zh-TW.ts +6 -0
  381. package/src/templates/headless/.agents/skills/actions/SKILL.md +18 -0
  382. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  383. package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +76 -23
  384. package/src/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  385. package/src/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  386. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +18 -0
  387. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  388. package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +45 -47
  389. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -0
  390. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +76 -23
  391. package/src/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  392. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +64 -0
  393. package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +4 -0
  394. package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +8 -0
  395. package/src/templates/workspace-core/AGENTS.md +7 -2
  396. package/src/templates/workspace-root/AGENTS.md +5 -0
  397. package/corpus/templates/dispatch/app/routes/admin.apps.$appId.tsx +0 -1
  398. package/corpus/templates/dispatch/app/routes/admin.apps.tsx +0 -1
@@ -1,4 +1,4 @@
1
- import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
1
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
2
2
  import { canInviteOrgMembers, canManageOrg, canManageOrgDomain, } from "../../org/permissions.js";
3
3
  import { agentNativePath } from "../api-path.js";
4
4
  const ORG_BASE = agentNativePath("/_agent-native/org");
@@ -51,14 +51,21 @@ export function useOrgRole() {
51
51
  error: query.error,
52
52
  };
53
53
  }
54
- export function useOrgMembers() {
54
+ export const ORG_MEMBER_PAGE_SIZE = 25;
55
+ export function useOrgMembers(offset = 0) {
55
56
  // Scope the cache by active orgId so switching or creating an org forces a
56
57
  // fresh fetch rather than briefly showing the previous org's members.
57
58
  const { data: org } = useOrg();
59
+ const params = new URLSearchParams({
60
+ limit: String(ORG_MEMBER_PAGE_SIZE),
61
+ offset: String(offset),
62
+ });
58
63
  return useQuery({
59
- queryKey: ["org-members", org?.orgId ?? null],
60
- queryFn: () => apiFetch(`${ORG_BASE}/members`),
64
+ queryKey: ["org-members", org?.orgId ?? null, offset],
65
+ queryFn: () => apiFetch(`${ORG_BASE}/members?${params}`),
66
+ enabled: Boolean(org?.orgId),
61
67
  staleTime: 30_000,
68
+ placeholderData: (previousData, previousQuery) => previousQuery?.queryKey[1] === org?.orgId ? previousData : undefined,
62
69
  });
63
70
  }
64
71
  export function useOrgInvitations() {
@@ -7,6 +7,7 @@ import { useT } from "../i18n.js";
7
7
  import { clearMcpConnectionResume, notifyMcpConnectionComplete, saveMcpConnectionResume, } from "./mcp-connection-resume.js";
8
8
  import { buildMcpOAuthStartUrl, findMcpIntegrationForText, getMcpIntegrationApiFallback, getDefaultMcpIntegrations, isMcpConnectionFailureText, navigateToMcpOAuthStart, shouldOfferMcpIntegrationOrganizationScope, } from "./mcp-integration-catalog.js";
9
9
  import { McpIntegrationDialog } from "./McpIntegrationDialog.js";
10
+ import { McpIntegrationLogo } from "./McpIntegrationLogo.js";
10
11
  import { useCreateMcpServer, useMcpServers, } from "./use-mcp-servers.js";
11
12
  export function findMcpConnectionSuggestionIntegration({ text, contextText = "", variant = "composer", integrations = getDefaultMcpIntegrations(), }) {
12
13
  return findMcpIntegrationForText(variant === "response" ? contextText : text, integrations);
@@ -51,7 +52,6 @@ export function McpConnectionSuggestion({ text, contextText = "", variant = "com
51
52
  const [dismissedId, setDismissedId] = useState(null);
52
53
  const [connecting, setConnecting] = useState(false);
53
54
  const [error, setError] = useState(null);
54
- const [logoLoadFailed, setLogoLoadFailed] = useState(false);
55
55
  const integrations = useMemo(() => integrationOptions ?? getDefaultMcpIntegrations(), [integrationOptions]);
56
56
  const integration = useMemo(() => findMcpConnectionSuggestionIntegration({
57
57
  text,
@@ -81,7 +81,6 @@ export function McpConnectionSuggestion({ text, contextText = "", variant = "com
81
81
  useEffect(() => {
82
82
  setError(null);
83
83
  setConnecting(false);
84
- setLogoLoadFailed(false);
85
84
  }, [integration?.id, integration?.logoUrl, variant]);
86
85
  if (!shouldSuggest)
87
86
  return null;
@@ -146,7 +145,7 @@ export function McpConnectionSuggestion({ text, contextText = "", variant = "com
146
145
  : t("mcpIntegrations.connect");
147
146
  return (_jsxs(_Fragment, { children: [_jsxs("div", { className: variant === "response"
148
147
  ? "agent-mcp-connection-suggestion agent-mcp-connection-suggestion--response mt-3 flex max-w-[520px] items-center gap-2 rounded-lg border border-primary/20 bg-primary/5 px-3 py-2 text-[12px]"
149
- : "agent-mcp-connection-suggestion agent-mcp-connection-suggestion--composer mx-auto mb-2 flex w-[min(calc(100%_-_1.5rem),684px)] items-center gap-2 rounded-lg border border-primary/20 bg-primary/5 px-3 py-2 text-[12px]", "data-mcp-connection-suggestion": integration.id, "data-mcp-connection-suggestion-variant": variant, children: [_jsxs("div", { className: "relative flex h-6 w-6 shrink-0 items-center justify-center overflow-hidden rounded-md border border-border bg-background text-[10px] font-semibold text-muted-foreground", children: [shouldRenderMcpIntegrationFallback(integration.logoUrl, logoLoadFailed) ? (_jsx("span", { "aria-hidden": "true", children: integration.name.slice(0, 1) })) : null, integration.logoUrl && (_jsx("img", { src: integration.logoUrl, alt: "", className: `absolute h-5 w-5 object-contain${logoLoadFailed ? " hidden" : ""}`, onError: () => setLogoLoadFailed(true) }))] }), _jsx("span", { className: "min-w-0 flex-1 leading-snug text-foreground", children: t(hasApiFallback(apiFallback)
148
+ : "agent-mcp-connection-suggestion agent-mcp-connection-suggestion--composer mx-auto mb-2 flex w-[min(calc(100%_-_1.5rem),684px)] items-center gap-2 rounded-lg border border-primary/20 bg-primary/5 px-3 py-2 text-[12px]", "data-mcp-connection-suggestion": integration.id, "data-mcp-connection-suggestion-variant": variant, children: [_jsx(McpIntegrationLogo, { name: integration.name, logoUrl: integration.logoUrl, integrationId: integration.id, className: "size-6 rounded-md text-[10px]", imageClassName: "size-5" }), _jsx("span", { className: "min-w-0 flex-1 leading-snug text-foreground", children: t(hasApiFallback(apiFallback)
150
149
  ? "mcpIntegrations.connectSuggestionWithApiToken"
151
150
  : "mcpIntegrations.connectSuggestion", { name: integration.name }) }), _jsxs("button", { type: "button", onClick: () => void connect(), disabled: connecting, "aria-busy": connecting, className: "inline-flex shrink-0 items-center gap-1 rounded-md bg-primary px-2.5 py-1.5 text-[11px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-60", children: [connecting && _jsx(IconLoader2, { className: "h-3 w-3 animate-spin" }), !connecting &&
152
151
  canStartOAuth(integration) &&
@@ -8,22 +8,8 @@ import { Tooltip, TooltipContent, TooltipTrigger, } from "../components/ui/toolt
8
8
  import { useT } from "../i18n.js";
9
9
  import { cn } from "../utils.js";
10
10
  import { buildMcpOAuthStartUrl, createMcpIntegrationFormDefaults, filterMcpIntegrations, getMcpIntegrationApiFallback, getDefaultMcpIntegrations, isCustomMcpIntegrationEnabled, navigateToMcpOAuthStart, resolveMcpIntegrationScope, shouldOfferMcpIntegrationOrganizationScope, shouldOfferMcpOrganizationScope, } from "./mcp-integration-catalog.js";
11
+ import { McpIntegrationLogo } from "./McpIntegrationLogo.js";
11
12
  import { formatMcpServerError, getMcpUrlValidationError, testMcpServerUrl, useMcpServers, } from "./use-mcp-servers.js";
12
- function IntegrationLogo({ name, logoUrl }) {
13
- const [loaded, setLoaded] = useState(false);
14
- const [loadFailed, setLoadFailed] = useState(false);
15
- useEffect(() => {
16
- setLoaded(false);
17
- setLoadFailed(false);
18
- }, [logoUrl]);
19
- return (_jsxs("div", { className: "relative flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-md border border-border bg-background text-[11px] font-semibold text-muted-foreground", children: [_jsx("span", { "aria-hidden": "true", hidden: loaded, children: name.slice(0, 1) }), _jsx("img", { src: logoUrl, alt: "", loading: "lazy", decoding: "async", className: "absolute inset-1 h-6 w-6 object-contain", hidden: loadFailed, onLoad: () => {
20
- setLoadFailed(false);
21
- setLoaded(true);
22
- }, onError: () => {
23
- setLoadFailed(true);
24
- setLoaded(false);
25
- } })] }));
26
- }
27
13
  function parseHeaderLines(text) {
28
14
  const out = {};
29
15
  for (const line of text.split(/\r?\n/)) {
@@ -306,7 +292,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
306
292
  const connected = connectedUrls.has(compareUrl(integration.url));
307
293
  const requiresHeaders = integration.authMode === "headers";
308
294
  const setupOnly = requiresMcpIntegrationSetup(integration);
309
- return (_jsxs("article", { className: "flex min-h-[128px] flex-col rounded-md border border-border bg-card p-4 transition-colors hover:border-border/80 hover:bg-accent/20", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(IntegrationLogo, { name: integration.name, logoUrl: integration.logoUrl }), _jsxs("div", { className: "min-w-0", children: [_jsx("h3", { className: "truncate text-[13px] font-semibold text-foreground", children: integration.name }), integration.availability !== "ready" && (_jsx("span", { className: "mt-0.5 inline-flex rounded-full border border-border/70 bg-muted/40 px-1.5 py-0.5 text-[9px] font-medium text-muted-foreground", children: integration.availability === "beta"
295
+ return (_jsxs("article", { className: "flex min-h-[128px] flex-col rounded-md border border-border bg-card p-4 transition-colors hover:border-border/80 hover:bg-accent/20", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(McpIntegrationLogo, { name: integration.name, logoUrl: integration.logoUrl, integrationId: integration.id, className: "size-8 rounded-md", imageClassName: "size-6" }), _jsxs("div", { className: "min-w-0", children: [_jsx("h3", { className: "truncate text-[13px] font-semibold text-foreground", children: integration.name }), integration.availability !== "ready" && (_jsx("span", { className: "mt-0.5 inline-flex rounded-full border border-border/70 bg-muted/40 px-1.5 py-0.5 text-[9px] font-medium text-muted-foreground", children: integration.availability === "beta"
310
296
  ? t("mcpIntegrations.status.beta")
311
297
  : integration.availability ===
312
298
  "client-restricted"
@@ -0,0 +1,11 @@
1
+ import { type CSSProperties } from "react";
2
+ export interface McpIntegrationLogoProps {
3
+ name: string;
4
+ logoUrl: string;
5
+ integrationId?: string;
6
+ className?: string;
7
+ imageClassName?: string;
8
+ style?: CSSProperties;
9
+ title?: string;
10
+ }
11
+ export declare function McpIntegrationLogo({ name, logoUrl, integrationId, className, imageClassName, style, title, }: McpIntegrationLogoProps): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { cn } from "../utils.js";
4
+ import { mcpIntegrationLogoNeedsDarkModeFilter } from "./mcp-integration-logos.js";
5
+ export function McpIntegrationLogo({ name, logoUrl, integrationId, className, imageClassName, style, title, }) {
6
+ const [failedLogoUrl, setFailedLogoUrl] = useState(null);
7
+ const showFallback = !logoUrl || failedLogoUrl === logoUrl;
8
+ const invertOnDark = integrationId !== undefined &&
9
+ mcpIntegrationLogoNeedsDarkModeFilter(integrationId);
10
+ useEffect(() => {
11
+ setFailedLogoUrl(null);
12
+ }, [logoUrl]);
13
+ return (_jsx("span", { className: cn("relative flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border/70 bg-background text-xs font-semibold text-muted-foreground", className), style: style, title: title, children: showFallback ? (_jsx("span", { "aria-hidden": "true", children: name.slice(0, 1) })) : (_jsx("img", { src: logoUrl, alt: "", loading: "lazy", decoding: "async", className: cn("size-7 object-contain", invertOnDark && "dark:invert dark:hue-rotate-180", imageClassName), title: title, onError: () => setFailedLogoUrl(logoUrl) })) }));
14
+ }
@@ -262,7 +262,7 @@ export function ResourceTree({ tree, variant = "tree", selectedId, onSelect, onC
262
262
  ? "overflow-hidden rounded-xl border border-border/70 bg-card text-card-foreground"
263
263
  : "p-1", dragOver && !readOnly && "ring-1 ring-inset ring-accent"), onDragOver: readOnly ? undefined : handleDragOver, onDragLeave: readOnly ? undefined : handleDragLeave, onDrop: readOnly ? undefined : handleDrop, children: [_jsx("div", { className: cn("group/root flex items-center justify-between", variant === "collection" ? "px-4 py-3" : "px-1.5 py-1"), children: _jsxs(TooltipProvider, { delayDuration: 200, children: [_jsxs("span", { className: cn("flex items-center gap-1.5 font-medium text-muted-foreground", variant === "collection"
264
264
  ? "text-sm"
265
- : "text-[11px] uppercase tracking-wide text-muted-foreground/60"), children: [title, headingHint && (_jsx("span", { className: "text-[10px] font-normal normal-case tracking-normal text-muted-foreground/50", children: headingHint })), titleTooltip && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": `About ${title}`, className: "flex h-3.5 w-3.5 items-center justify-center rounded-full text-muted-foreground/40 hover:text-muted-foreground", children: _jsx(IconHelpCircle, { className: "h-3 w-3" }) }) }), _jsx(TooltipContent, { children: titleTooltip })] }))] }), sectionAction ??
265
+ : "text-[11px] uppercase tracking-wide text-muted-foreground/60"), children: [title, headingHint && (_jsx("span", { className: "text-[10px] font-normal normal-case tracking-normal text-muted-foreground/50", children: headingHint })), titleTooltip && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": `About ${title}`, className: "flex h-3.5 w-3.5 items-center justify-center rounded-full text-muted-foreground/40 hover:text-muted-foreground", children: _jsx(IconHelpCircle, { className: "h-2.5 w-2.5" }) }) }), _jsx(TooltipContent, { children: titleTooltip })] }))] }), sectionAction ??
266
266
  (variant === "tree" && !readOnly && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: () => handleStartCreate("", "file"), "aria-label": "New file", className: "flex h-5 w-5 items-center justify-center rounded text-muted-foreground/50 opacity-0 group-hover/root:opacity-100 hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { className: "h-3 w-3" }) }) }), _jsx(TooltipContent, { children: "New file" })] })))] }) }), variant === "collection"
267
267
  ? leafResources.length > 0 && (_jsx("div", { className: "divide-y divide-border/60 px-4", children: leafResources.map((node) => (_jsx(CollectionResourceRow, { node: node, selectedId: selectedId, deletingId: deletingId, readOnly: readOnly, onSelect: onSelect, onDelete: onDelete }, node.resource.id))) }))
268
268
  : tree.map((node) => (_jsx(TreeNodeRow, { node: node, depth: 0, expanded: expanded, selectedId: selectedId, deletingId: deletingId, readOnly: readOnly, onToggle: toggleExpand, onSelect: onSelect, onDelete: onDelete, onStartCreate: handleStartCreate }, node.resource?.id ?? node.path))), isLoading && isEmpty && (_jsx("div", { className: cn("px-1 py-1"), children: Array.from({ length: 3 }).map((_, i) => (_jsxs("div", { className: cn("flex items-center gap-2 px-1.5 py-1", variant === "collection" && "gap-3 px-2.5 py-3"), children: [_jsx("div", { className: cn("rounded bg-muted-foreground/10 animate-pulse", variant === "collection" ? "size-8" : "h-3.5 w-3.5"), style: { animationDelay: `${i * 75}ms` } }), _jsx("div", { className: "h-3 rounded bg-muted-foreground/10 animate-pulse", style: {
@@ -1 +1,2 @@
1
+ export declare function mcpIntegrationLogoNeedsDarkModeFilter(id: string): boolean;
1
2
  export declare function mcpIntegrationLogo(id: string): string;
@@ -107,26 +107,55 @@ const LOGOS = {
107
107
  mime: "image/svg+xml",
108
108
  data: "PHN2ZyBmaWxsPSIjRkY0RjAwIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+WmFwaWVyPC90aXRsZT48cGF0aCBkPSJNNC4xNTcgMEE0LjE1MSA0LjE1MSAwIDAgMCAwIDQuMTYxdjE1LjY3OEE0LjE1MSA0LjE1MSAwIDAgMCA0LjE1NyAyNGgxNS42ODJBNC4xNTIgNC4xNTIgMCAwIDAgMjQgMTkuODM5VjQuMTYxQTQuMTUyIDQuMTUyIDAgMCAwIDE5LjgzOSAwSDQuMTU3Wm0xMC42MSA4Ljc2MWguMDNhLjU3Ny41NzcgMCAwIDEgLjIzLjAzOC41ODUuNTg1IDAgMCAxIC4yMDEuMTI0LjYzLjYzIDAgMCAxIC4xNjIuNDMxLjYxMi42MTIgMCAwIDEtLjE2Mi40MzUuNTguNTggMCAwIDEtLjIwMS4xMjguNTguNTggMCAwIDEtLjIzLjA0Mi41MjkuNTI5IDAgMCAxLS4yMzUtLjA0Mi41ODUuNTg1IDAgMCAxLS4zMzItLjMyOC41NTkuNTU5IDAgMCAxLS4wMzgtLjIzNS42MTMuNjEzIDAgMCAxIC4xNy0uNDMxLjU5LjU5IDAgMCAxIC40MDUtLjE2MlptMi44NTMgMS41NzJjLjAzLjAwNC4wNjEuMDA0LjA5NS4wMDQuMzI1LS4wMTEuNjQ2LjA2NC45MzcuMjE5LjIzOC4xNDQuNDMxLjM1NS41NTIuNjA5LjEyOC4yNzkuMTg5LjU4Mi4xODUuODg4di4xOTNhMiAyIDAgMCAxIDAgLjIxOWgtMi40OThjLjAwMy4yMjcuMDc1LjQ1LjIwNC42NDJhLjc4Ljc4IDAgMCAwIC42NDYuMjY1LjcxNC43MTQgMCAwIDAgLjQ4NC0uMTM2LjY0Mi42NDIgMCAwIDAgLjIzLS4zMThsLjkxNS4yNTdhMS4zOTggMS4zOTggMCAwIDEtLjI4LjUzN2MtLjE0LjE1OS0uMzIxLjI4NC0uNTIxLjM1NWEyLjIzNCAyLjIzNCAwIDAgMS0uODM2LjEzNiAxLjkyMyAxLjkyMyAwIDAgMS0xLjAwMS0uMjQ1IDEuNjE4IDEuNjE4IDAgMCAxLS42NjUtLjcwMyAyLjIyMSAyLjIyMSAwIDAgMS0uMjI3LTEuMDM2IDEuOTUgMS45NSAwIDAgMSAuNDgtMS4zOTggMS45IDEuOSAwIDAgMSAxLjMtLjQ4OFptLTkuNjA3LjAyM2MuMTYyLjAwNC4zMjUuMDI2LjQ4LjA3OS4yMDcuMDY1LjQuMTc0LjU2My4zMTQuMjYuMzAyLjM5My42OTIuMzY2IDEuMDg4djIuMjc2SDguNTNsLS4xMDktLjcxMWgtLjA2NWMtLjA2NC4xNjMtLjE1NS4zMS0uMjcyLjQzOWExLjEyMiAxLjEyMiAwIDAgMS0uMzc0LjI2NCAxLjAyMyAxLjAyMyAwIDAgMS0uNDUzLjA4MyAxLjMzNCAxLjMzNCAwIDAgMS0uODY2LS4yNjQuOTY1Ljk2NSAwIDAgMS0uMzI5LS44MDEuOTkzLjk5MyAwIDAgMSAuMDc2LS40MzEgMS4wMiAxLjAyIDAgMCAxIC4yNDItLjM2MyAxLjQ3OCAxLjQ3OCAwIDAgMSAxLjA0My0uMzAzaC45NTJ2LS4xODFhLjY5Ni42OTYgMCAwIDAtLjEzNi0uNDU0LjU1My41NTMgMCAwIDAtLjQzOC0uMTU0LjY5NS42OTUgMCAwIDAtLjM3OC4wODYuNDguNDggMCAwIDAtLjE5My4yNTRsLS45OS0uMTQ0YTEuMjYgMS4yNiAwIDAgMSAuMjU3LS41NjNjLjE0LS4xNzQuMzIxLS4zMDIuNTMzLS4zNzguMjYxLS4wOTEuNTQtLjEzNi44Mi0uMTI5LjA1My0uMDAzLjEwNi0uMDA3LjE2My0uMDA3Wm00LjM4NC4wMDdjLjE3NCAwIC4zNDcuMDM4LjUwNi4xMTQuMTgyLjA4My4zNC4yMTEuNDU4LjM3NC4yNTcuNDIzLjM3Ny45MTEuMzUxIDEuNDA2YTIuNTMgMi41MyAwIDAgMS0uMzU1IDEuNDQ4IDEuMTQ4IDEuMTQ4IDAgMCAxLTEuMDA5LjUxN2MtLjIwNCAwLS40MDEtLjA0NS0uNTgyLS4xMzZhMS4wNTIgMS4wNTIgMCAwIDEtLjQ4LS40NTcgMS4yOTggMS4yOTggMCAwIDEtLjExNC0uMjM0aC0uMDQ1bC4wMDQgMS43ODRoLTEuMDU5di00LjcxM2guOTA0bC4xMTcuODA1aC4wNTdjLjA2OC0uMjA4LjE3Ny0uNDAxLjMyOC0uNTZhMS4xMjkgMS4xMjkgMCAwIDEgLjg0My0uMzQ0aC4wNzZ2LS4wMDRabTcuNTU5LjA4NGguOTAzbC4xMTMuODA1aC4wNTNhMS4zNyAxLjM3IDAgMCAxIC4yMzUtLjQ4NC44MTMuODEzIDAgMCAxIC4zMTMtLjI0Mi44Mi44MiAwIDAgMSAuMzktLjA3NmguMjM0djEuMDUxaC0uNDAxYS42NjIuNjYyIDAgMCAwLS4zMTMuMDA4LjYyMy42MjMgMCAwIDAtLjI3Mi4xNTUuNjYzLjY2MyAwIDAgMC0uMTc0LjI2LjY4My42ODMgMCAwIDAtLjAyNy4zMTR2MS44NzVoLTEuMDU0di0zLjY2NlptLTE3LjUxNS4wMDNoMy4yNjJ2Ljg5NkwzLjczIDEzLjEwNGwuMDM0LjExM2gxLjk3M2wuMDQyLjlIMi40di0uOWwxLjkzMS0xLjc1NC0uMDQ1LS4xMTdIMi40NDF2LS44OTZabTExLjgxNSAwaDEuMDU1djMuNjU5aC0xLjA1NVYxMC40NVptMy40NDMuNjg0LjAxOS4wMTZhLjY5LjY5IDAgMCAwLS4zNTEuMDQ1Ljc1Ni43NTYgMCAwIDAtLjI4Ny4yMDRjLS4xMS4xNTUtLjE3NC4zMzYtLjE4OS41MjJoMS41NDVjLS4wMzQtLjUyNi0uMjU3LS43ODctLjc0LS43ODdoLjAwM1ptLTUuNzE4LjE2M2MtLjAyNiAwLS4wNTcgMC0uMDgzLjAwNGEuNzguNzggMCAwIDAtLjMxLjA1My43NDYuNzQ2IDAgMCAwLS4yNTcuMTg5IDEuMDE2IDEuMDE2IDAgMCAwLS4yMDQuNjk1di4wNjRjLS4wMTUuMjU3LjA1Ny41MDcuMjA0LjcxMWEuNjM0LjYzNCAwIDAgMCAuMjUzLjE5Ni42MzguNjM4IDAgMCAwIC4zMTQuMDYxLjY0NC42NDQgMCAwIDAgLjU3OC0uMjY1Yy4xNC0uMjIzLjIwNC0uNDguMTg5LS43NGExLjIxNiAxLjIxNiAwIDAgMC0uMTgxLS43MTEuNjc3LjY3NyAwIDAgMC0uNTAzLS4yNTdabS00LjUwOSAxLjI2NmEuNDY0LjQ2NCAwIDAgMC0uMjY4LjEwMi4zNzMuMzczIDAgMCAwLS4xMTQuMjc2YzAgLjA1My4wMDguMTA2LjAyNy4xNTVhLjM3NS4zNzUgMCAwIDAgLjA4Ny4xMzIuNTc2LjU3NiAwIDAgMCAuMzk3LjExdi4wMDRhLjg2My44NjMgMCAwIDAgLjU2My0uMTgyLjU3My41NzMgMCAwIDAgLjIxMS0uNDU3di0uMTRoLS45MDNaIi8+PC9zdmc+",
109
109
  },
110
+ amplitude: {
111
+ mime: "image/png",
112
+ data: "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABjhJREFUWEetl3tQ1FUUx8+5+9uFfbOIL4RdI0vFR5iOmj2kp4NlTs70wlKXjDLTzMHUMmcqaybTohqNfK6PHuaUJDNNOU5ZOaE5lkOEgi9Y1CCQfcGyu7/f757mh4IL7C4L9vtjZ+d3z/eczz333HPvDyHOx5bfMphE8WEEmEpEYwExHQiMxEBGwkYgfhYYHONABwYKloPHN6EYj2vsySjN7pnEAFYS0EMIoOrJ/so4/ssAingiFTo/SXLF0kQFSM33pgiSXAiEuYrH+AJ3tcLLSPhKjcO0LZo+ouOh9sZJHISvAWBI3wJ3U30lqc32S5vQ3w2x64v0PPcDSLQPAHXRgqcms2CDh2tEuVeZKRXUPOfcpmRPuN9OGUizN05ioPoxWvBEDfDCZ3Vnc8arvefruSZ3bcvNl1w8Id4sIcAhfbN5WsVeDLVrOgDa1lzkJ2Kl/e052vNPZWuaRIlQLSCVVkr6J9e2jCCKF0Gxo4+c2y0vdQOw5nl2A9HsaK7GDmXNJauNlRcbST3jLd/IzwoMVSPTWWBuYUvGoTLJEjcCAZFKlV271fhL235Rfq6kXiiNVe0bX9CeeXCCxvPip35byVExZdYUdcMH83XOwxWiYfY6//C4Aa4Y/uHcbp4AgNQGYLW7igFwZjQngywYOrLO9FeDh4Qpy7xjleIz6VA6Xmgq0whAdy73jXI28MTeQCDxB2scyd+hLb9hMBfVtbGazNx7NXVvztZe/LgkMGDdvmB6e6CihbrTSkGu2RMYvPmHYGpvAIiouNZheQStdvdzAFAUS7x3pf7kxJsEf84bzcMramRDu237Mpw4x7Uz1/gyewMAAK1Soz8FbXbP5wT0ZDSxxYDinx+ayupdXD15mW9seMUPsrDg0fXGckU7Yal3TIObNL2BYER3o3WeqxwQR0UT3p8lNG1ZrD+/88dgv9d3B4Z2tTvwlrF8+BAWfLHIbyv5XUzpDQAQLlaWQOlMpnbhohmJF3KnapokmVDmCEYd8RQjk+rdJNS5ZbUsA3IOIHFATgA3D2bBFDOTlMZUXi1rRZkwIBILhhD9IWL+AKm8raTy+EF18ISY3BKgawcawntonefmgNda6mcFuso7MtXNvZpJnMYvb/Fbv/lN7N9hTlCE6XluEQmE9pfK9hqeyvwKkl6L8o4l+nN1TVy9aJO/W/oVTYIa+K6lhrOIAAXb/OnV9ZG3o8wJy6q5QQo7P4hoA1rtnn8AaFCkSYy7UeUrfs1QtfmHYMqaPQFbtIl+86r+5Phhgn/JFr91X/gMr3a22zMF9+EKKam7nt5UAH4FoDsiOZ89VVP/zlzthcffbR52pFI2RwNY9FDCxYJZiXVf/hKyLHe0ZoTbKS38viyN6/3iQEf/uLYENAetea4PgHBJJOdrntaenzlZ4751sScr1tGblaHyfbvKUKUU6qSl3lvCz6bXHkus+blcMkfKACM2EtPymnIYse8iAWxdrK9q9Mjq5TsCN8SqMxVDOrreWNbfjNK01b4Rpy5wvWKvVgGVrjOV3fOqd7S3tfN1DgGcNduTbJj56N+aZkNaLQAN6BrEmAhySAYMisB6KvTXH0+smT8toXF9cXDgR/sDaYp99mjB9fz0hPon1raM6KYneNfpSFpx9TDyvAFAq3sKEmv8lqGsef9qY2WDm4Q7V3jHtIaAKVv6++OSeddPoU5FTgCSiuimaoel+grAArcFAngagPr1FUJxVLzKWJGVwVr3HxXN9W6uzs3WNE0p8I1xt1DHNm/zT1DkdCQtUP523Ihs87x5hHxrXwEU3fhhzPf1SmOV0hOUZ9Wu1iFdZw8A9bLMRl3cabrcCaAtE3b3HgB47Hogpo4WXI9MVjcd+lsyFZeGdb22iYMMHKbX7kg60B6j06U0NZ90gug5CAC3XQ9ENC0RLqx1mDeGj3f7LsjIbzLLIismgOz/EUImzl+q3ZG8oavPiB8mmY+Sptngfg8IF4UfVH0DwjriNDc87TEzED6Y/ozvLuRyIQCM60NwEQi2ypytai+4SD7i+OYjtM1z5XBk8xEgBwBiXj6RwEkMvghxKqpzWKp7Ao8D4JqL1BmXdJp+2okc2BhglA4cjAQkI8JlIDjDQHWs2mE61VPQ8PH/AObqn3Nux/NwAAAAAElFTkSuQmCC",
113
+ },
114
+ apollo: {
115
+ mime: "image/png",
116
+ data: "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",
117
+ },
118
+ "common-room": {
119
+ mime: "image/svg+xml",
120
+ data: "PHN2ZyB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgdmlld0JveD0iMCAwIDEwMSAxMDEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xNy41ODQgNTIuMDM2NUw0Ni4yOTQzIDE2Ljk5NjNDNDkuNTM0NiAxOS4wMzA5IDU2LjA2MDQgMjMuMjM1OCA1Ni4yNDEyIDIzLjc3ODNDNTYuNDY3MyAyNC40NTY1IDc1LjkwOSA0NS4wMjg1IDc2LjEzNSA0Ni44MzdDNzYuMzYxMSA0OC42NDU2IDczLjY0ODMgNjcuNjM1MSA3MS44Mzk4IDcyLjM4MjVDNzAuMzkzIDc2LjE4MDQgNTYuMDE1MiA4My45MTE4IDQ5LjAwNzEgODcuMzAyOEwxNy41ODQgNTIuMDM2NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik05NS42Nzc2IDM5LjE2OTZMNjEuMDgzMyA0LjU3NTAyQzU1LjA4NDEgLTEuNDI0MjYgNDUuMjcwNyAtMS40MjQyNiAzOS4yNzE1IDQuNTc1MDJMNC42NzcxNiAzOS4xNjk2Qy0xLjMyMjA3IDQ1LjE2ODggLTEuMzIyMDcgNTQuOTgyMyA0LjY3NzE2IDYwLjk4MTZMMzkuMjcxNSA5NS41NzYxQzQ1LjI3MDcgMTAxLjU3NSA1NS4wODk2IDEwMS41NzUgNjEuMDg4OSA5NS41NzYxTDk1LjY4MzIgNjAuOTgxNkMxMDEuNjc3IDU0Ljk4MjMgMTAxLjY3NyA0NS4xNjg4IDk1LjY3NzYgMzkuMTY5NlpNNjQuMTE5MSA2NC4wMTczTDUwLjE4MDIgNzcuOTU2NEwyMi4zMDIzIDUwLjA3ODNMNTAuMTgwMiAyMi4yMDAzTDY0LjExOTEgMzYuMTM5M0w1MC4xODAyIDUwLjA3ODNMNjQuMTE5MSA2NC4wMTczWiIgZmlsbD0iYmxhY2siLz4KPC9zdmc+Cg==",
121
+ },
122
+ exa: {
123
+ mime: "image/png",
124
+ data: "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACgUlEQVR42u2XXUiTYRTHf8/euem7V6sbQcFMsgyJQoigizDqIuhDiW6iksBISrGS7MsP3JhWlBUqWnThjX2RBGlSRCREF0UEkURkGWYSUhCpe7e5ue3pQmaY6Eq3hNq5ex8O5/lxzvn/eR+Ruu6bZA7DwBxHFCAKYAyVUF+hkb06ZkbFS07pdD4bnR2AGieYFy8YdEhudHhCXmo2wZ5tsSgG0F1y9h0Ixvx4QW+/n1v3p4ewH7agGOB6h4fnXb7w7ICU0NPnx3ZIZUmqMmXexrUm8nLNvOnxY2twhW8JpYQim44AGq0acWYxKScp0cCZUgtOl6TYruPxyvCqoLvXT80lF0sXKVQUqhPnqEBDpcaCBMHRs04+fPJHRoYtbR7udnrZlWMmZ4Np/PxIvsqq5Uaab49w77E3sj5QftFJ/0CAmhILKUkG1mTFULAjlldvfZy+7Aq/D/waw7rkYLVOa10CjVUayYkGHE5JoVVn1EdkAISAq7XxE850t2RFhhEpYW+Zg89fAv+oFQdluLvUMf6dlWmktS6Brm4fyYkGLpRpbN43NKMu/HEHEjRBfYWG2yMpsukU253EWwRNVo0Y418YQXD7g2p4+nKUKzdHWLnMyMn9amQB8nLNbF1v4lq7h/ZHP/V+vtnFi9c+8rfHsinbFBmAjDSF8gMq7z76qW6aqHefH4rtOt+HJeeOWVi8UAkvgBDQWKUhgSKrjtsz2ecHvgY4UevEogoaKjXMJhFegPRUhao6F+/7pvb5B0+8tLR5yExXqCpWw+uEgw5JWorC8YLpC4/6JP4A7Nxi5s7D0P8EIQFcbsmQQyIYK/o7oTvHRqSpoccgoi+jKMB/D/ADRpbjdBgK8S0AAAAASUVORK5CYII=",
125
+ },
126
+ gong: {
127
+ mime: "image/svg+xml",
128
+ data: "PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiByeD0iODUuMzMzMyIgZmlsbD0iIzgwMzlERiIvPgo8cmVjdCB4PSI1My40NDQ2IiB5PSI1My40NDQ2IiB3aWR0aD0iMjEuMzMzMyIgaGVpZ2h0PSIyMS4zMzMzIiBmaWxsPSIjM0UwMDc1Ii8+CjxyZWN0IHg9IjQzNy4zMzMiIHk9IjUzLjMzMzMiIHdpZHRoPSIyMS4zMzMzIiBoZWlnaHQ9IjIxLjMzMzMiIGZpbGw9IiMzRTAwNzUiLz4KPHJlY3QgeD0iNDM3LjMzMyIgeT0iNDM3LjMzMyIgd2lkdGg9IjIxLjMzMzMiIGhlaWdodD0iMjEuMzMzMyIgZmlsbD0iIzNFMDA3NSIvPgo8cmVjdCB4PSI1My4zMzMzIiB5PSI0MzcuMzMzIiB3aWR0aD0iMjEuMzMzMyIgaGVpZ2h0PSIyMS4zMzMzIiBmaWxsPSIjM0UwMDc1Ii8+CjxwYXRoIGQ9Ik00MjcuMiAyMjkuODE0SDMyOC4xNDZDMzIyLjY3NyAyMjkuODE0IDMxOC40MjMgMjM1Ljg4NyAzMjAuMjQ2IDI0MC43NDVMMzQzLjk0NiAzMDIuMDc1QzM0NS4xNjIgMzA0LjUwNCAzNDIuNzMxIDMwNy41NCAzMzkuNjkzIDMwNy41NEwzMDkuMzA4IDMwNS43MTlDMzA4LjA5MyAzMDUuNzE5IDMwNi44NzcgMzA2LjMyNiAzMDUuNjYyIDMwNy41NEwyODIuNTcgMzQwLjkzOEMyODEuMzU0IDM0Mi43NiAyNzguOTI0IDM0My4zNjcgMjc2LjQ5MyAzNDIuMTUzTDI0MS4yNDcgMzE4LjQ3MUMyNDAuMDMxIDMxNy4yNTYgMjM4LjIwOCAzMTcuMjU2IDIzNi4zODUgMzE4LjQ3MUwxODcuNzcgMzUxLjI2MUMxODQuNzMyIDM1My42OSAxODAuNDc4IDM1MC42NTQgMTgxLjY5MyAzNDcuMDExTDE5NS42NyAyOTguNDMyQzE5Ni4yNzggMjk2LjYxIDE5NS4wNjIgMjk0LjE4MSAxOTMuMjM5IDI5My41NzRMMTY3LjcxNiAyODMuMjUxQzE2NS4yODUgMjgyLjAzNyAxNjQuMDcgMjc5IDE2NS44OTMgMjc3LjE3OUwxODguMzc4IDI0OS4yNDZDMTg5LjU5MyAyNDguMDMxIDE4OS41OTMgMjQ1LjYwMiAxODguMzc4IDI0NC4zODhMMTY5LjUzOSAyMTcuMDYyQzE2Ny43MTYgMjE0LjYzNCAxNjkuNTM5IDIxMC45OSAxNzIuNTc4IDIxMC45OUwyMDIuMzU1IDIwOC41NjFDMjA0Ljc4NSAyMDguNTYxIDIwNi4wMDEgMjA2Ljc0IDIwNi4wMDEgMjA0LjMxMUwyMDMuNTcgMTYzLjAxOUMyMDMuNTcgMTU5Ljk4MiAyMDYuNjA4IDE1OC4xNjEgMjA5LjAzOSAxNTguNzY4TDI0NS41MDEgMTczLjk0OUMyNDcuMzI0IDE3NC41NTYgMjQ5LjE0NyAxNzMuOTQ5IDI1MC4zNjIgMTcyLjczNEwyNzUuODg1IDE0NC44MDJDMjc3LjcwOCAxNDIuMzczIDI4MS4zNTQgMTQyLjk4IDI4Mi41NyAxNDYuMDE2TDI5Ny43NjIgMTg0Ljg3OUMyOTkuNTg1IDE4OS43MzcgMzA1LjY2MiAxOTEuNTU5IDMwOS45MTYgMTg4LjUyMkwzNjkuNDY5IDE0NC4xOTRDMzc2LjE1NCAxMzkuMzM3IDM3MS45IDEyOC40MDYgMzYzLjM5MiAxMjkuNjIxTDMyNS4xMDggMTM0LjQ3OUMzMjMuMjg1IDEzNC40NzkgMzIxLjQ2MiAxMzMuODcxIDMyMC44NTQgMTMyLjA1TDMwMC4xOTMgNzkuMjIwM0MyOTcuNzYyIDczLjc1NTIgMjkxLjA3NyA3Mi41NDA4IDI4Ni44MjMgNzYuNzkxNEwyNDEuODU0IDEyNS4zN0MyNDAuNjM5IDEyNi41ODUgMjM4LjgxNiAxMjcuMTkyIDIzNi45OTMgMTI2LjU4NUwxNzguMDQ3IDEwMS42ODhDMTcyLjU3OCA5OS4yNTkxIDE2Ny4xMDkgMTAyLjkwMiAxNjYuNTAxIDEwOC45NzVMMTY0LjA3IDE2OS42OThDMTY0LjA3IDE3Mi4xMjcgMTYyLjI0NyAxNzMuMzQyIDE2MC40MjQgMTczLjM0MkwxMDYuMzM5IDE3Ni45ODVDMTAwLjI2MyAxNzcuNTkyIDk2LjYxNjQgMTg0LjI3MiAxMDAuMjYzIDE4OS43MzdMMTM2LjExNiAyNDIuNTY2QzEzNy4zMzIgMjQzLjc4MSAxMzcuMzMyIDI0Ni4yMSAxMzYuMTE2IDI0Ny40MjRMOTkuNjU0OSAyODkuMzIzQzk2LjYxNjQgMjkyLjM2IDk4LjQzOTUgMjk5LjAzOSAxMDMuMzAxIDMwMC44NjFMMTQ1LjIzMiAzMTkuMDc4QzE0Ny4wNTUgMzE5LjY4NSAxNDguMjcgMzIyLjExNCAxNDcuNjYyIDMyMy45MzZMMTIwLjkyNCA0MjcuNzczQzExOS4xMDEgNDM1LjA2IDEyNy42MDkgNDQwLjUyNSAxMzMuNjg2IDQzNi4yNzRMMjMzLjk1NCAzNjQuNjJDMjM1LjE3IDM2My40MDYgMjM2Ljk5MyAzNjMuNDA2IDIzOC44MTYgMzY0LjYyTDI4NC4zOTMgMzk2LjgwNEMyODguMDM5IDM5OS4yMzMgMjkzLjUwOCAzOTguNjI2IDI5NS45MzkgMzk0LjM3NUwzMjQuNSAzNTAuNjU0QzMyNS4xMDggMzQ5LjQ0IDMyNi45MzEgMzQ4LjgzMiAzMjguMTQ2IDM0OC44MzJMMzk2LjIwOCAzNTcuMzM0QzQwMS42NzcgMzU3Ljk0MSA0MDcuMTQ2IDM1My42OSA0MDUuMzIzIDM0OC4yMjVMMzc2Ljc2MiAyNzQuNzVDMzc2LjE1NCAyNzIuOTI4IDM3Ni43NjIgMjcwLjQ5OSAzNzkuMTkyIDI2OS4yODVMNDMwLjg0NiAyNDQuOTk1QzQzOC4xMzggMjQxLjM1MiA0MzUuNzA4IDIyOS44MTQgNDI3LjIgMjI5LjgxNFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=",
129
+ },
130
+ grafana: {
131
+ mime: "image/x-icon",
132
+ data: "AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAAAAAAAAAAAACnA+AApuvgAKcH4RSnB+FkpwPgcJ8H4Bii/+BEpwfhHKMP40yjD+KQpv/gGKcH4AAAAAAAAAAAAAAAAAAAAAAAqufgAKrn4Biq7+LQqu/j8Krr4zSq5+LAquvjMKrv46Sq7+P8qu/jmKrr4Kiq6+AAw0vgAAAAAAAAAAAAAAAAALLP3ACyz9wYssfe1LLH3/yyx9/8ssff/LLH3+Syx9/Qssff9LLH3/iyw96ErrPcSK633AAAAAAAAAAAALbD3ACuk9gArpPYmK6f21Cun9v8rqPbjK6r3hCus90Irrfc2K6v3ayuo99grp/b9K6b2pCuj9kgsofUKLJj1ACuY9RIsmvVbLJ31vCye9f8snvXZLKH2PSWX8wArlfQZLJb1LiuS9A0sofY5LJ714Sye9f8snvXhLJ71LSuQ9CUrk/S1K5T0+yuU9P8rlPT5K5b0XiuS9AArkfRGK5T0kyuX9ForlvQtKYbzACuV9JArlPT/K5X0liyc9QYsjfQ+LIv06SyL9P8si/T/LIv01SuN9Bgsh/MLLIv0pyuN9DgsjPQAK4/0ACyL9AAsi/RuLIv0/yyL9Fgsi/QALYr0AyyD83QsgfPyLIHz/yyB874sgfMHLILzFSyB87osf/MsLIDzACt88wArefMELIDznCyB8/MsgvM4LIX0ACt98wAqhPQDLHjyeSx38v8sd/LMLHXyECuA8wQsePKjLHXyoCxx8iIscfIdLHTydCx38vMsePKlLHbyICx08jUAAAAALG3yACxt8jgsbPLyLGzy7yxq8jcsbfIALHDyLixu8sQsa/LfLGvy4Cxs8vIsbvKsLHHyHixq8lcsbfJTK1rxACtg8QArX/FOK2Dx9ith8f8rX/GZK1jxBith8QArZ/EaK2bxWStl8WwrZvFEK2ryCitc8SgrYPGqK2TxJita8QArWfEBK1rxnita8f8rWvH/K1rx9Sta8XwrWvEQK1rxACta8QArV/EAK1TxAita8TgrWvHAK1rxeitU8QArWvEAK1rxCSta8b0rWvH/K1rx/yta8f8rWvH6K1rxwyta8YArWvFiK1rxbCta8aMrWvHsK1rxvCta8RErWvEAK1rxACta8QIrWvFFK1rxgSta8XwrWvF1K1rxySta8forWvH/K1rx/yta8fgrWvHlK1rx+Cta8Y4rWvEAK1rxAAAAAAAAAAAAAAAAAAAAAAArWvEAK1rxACta8RQrWvGqK1rx/yta8d4rWvFSK1rxICta8T0rWvEjK1rxACta8QAAAAAAAAAAAAAAAAAAAAAAAAAAACta8QArWvEAK1rxNSta8dErWvFsK1rxACta8QAAAAAAAAAAAAAAAAAAAAAA4AcAAOAHAADgAwAA4AAAAIAAAAACEAAAAFEAAABhAACAAAAAwgAAAMEAAACA4QAAgAEAAIADAAD8AwAA/h8AAA==",
133
+ },
134
+ "google-workspace": {
135
+ mime: "image/png",
136
+ data: "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAADN0lEQVQ4jZ2US2icVRTHf+d+r3k0GZXYGAwzbRBFlDYQcCNIFbFUUExLXVTqA6QI3SSFUlAQEXQjqbgtWVSkokELPgo2YhMEpWIXQZSWWkiMFpOaNI/JZOab7373uJgkbZKRUg/czeF/fpz/PedeoUnooZ6AP/K9pGYv0I3QBSYGueZMdN6QniGOh2R01G6slU2w/Y/0kngDWLONenBDpgLigwQ4L0TFjGPkiP/VZ1/8J1Bfe+g4sd9HHMBSCPWwAVJpSCUEE64CQTxAXvG/PPXhKsOswT7YOkDbch9hCq0xZBPwLKgDtAJcRxzKutJhbzH49OamDICeDZ/jnmo/7VXIptBWg9Z6max7G9/bLsMjLTL8XRth1CFijoEsgDvjRcmzMnqyts6yDuHRGl1hISxxLd+wWon+ZCq7SwZ/GW86tGf2F+m48285cSLZNBT9OXoaK1+zbGA+gGW/TlV2yKGZy81gtwqfIDiA78AHwgRmdVAOLv4vGICvWn8Y8RFfIAfYdLCZsPtddc3yRh1uZVkyWu8z6upFFBCDGoHOysXb6cghII0Tm6BkNimqhdztAJEbq+wwvg9MovaOVJU6ik3TB4Efm5SOKgqkgNdgQRdQXH0fAtN+Cr86Z3fUcCwqVFQPNAOOvS5PbMztfMedFqG4llAmjHN8PK9Qdo45VWZUXv3kp+j+Wzl94L3qduvFe6xYEhPjcE6Eb0WH8M4XuTKtlCoqJPhcVX/y93ph18nHpyaawToHf7vLxuZsKtITJVsI0wxRkj938Vj2SSPPk6rQDzCjhnHn8Y8GxVmTH9t57tE37x3Z07lGGnlrS3j6/RdmspculPN/9cTh4ppZMfrGyj02YuAHMzDpcv3zRCxohsu2iyXNs0QLqYZl6/LXnYYlTQpQ64SkgNhWgqRArtoxMHX4vqPrgAD7vm8/vqi5viVyXLUl6uSINYNiUDxSF6JpHhe3g22BtAWJt360fPCplxFRuOn7Avj8sekjVc3sm3MtExYh1nBleAZVQcRiTA0RC+rPitQOL7+4+6VV2KYOV6PnQk8wPretN5XcXpBukC7AojKFRmMuLXxTNnefYvfRysbafwFOiFhxqOMpZwAAAABJRU5ErkJggg==",
137
+ },
138
+ pylon: {
139
+ mime: "image/png",
140
+ data: "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAHlBMVEVHcExbDv9bDv9bDv9bDv9bDv9bDv9bDf9bDf9bDv+pPS6zAAAACXRSTlMAVfTGGuCHNaEilxe2AAAD/ElEQVR4nO1b2XbjIAw1u/3/Pzw4aVJrAcRiqw+j9iU5AV20IUDatn7yPhkTdxeCPTLZ4NwejUneD0zWz91kzm/GByCbgezmXgzeRIfYYrIu3gUiL73B/AviDkGk5tqRHNJK7t44OfMPuXViMD2Lv4rBrOA+tPqFUkgT7F8Q5mzBxzDH/zhCnBCCmWb/gjBsClK/b5Hdh9i3tG+LHyiNWIKpzGnPzSdev4nn5lRD0a2GWJwtxLzvnQjx/HmPLNus7bNFv5eW/htiCYAXlUP23oHAF9S/p8skPIDXpsWPdmIEiRUkdugSgK0YPoLQFFnzp/GkAqAEQeYMHH+706FVAHkaLopIEHgGOjuuAYBfSWjaAWN/BQ9qAsh6oHO1LJHxv5LY2gBYITS8kWIuDpAA4BYUa/xJ/LXln4sAMCHVVqJywj+u7aRCAMyeXnYFrLEaWDEAKlZX+iXWVz1yiQHQyFrIDzBSW48acgBEtbxkcQRqZVIdAIgdsPEIeWBV/70AiHQZ50KKqvjfCAC8PGpeOARb16QuANjCSUg2ByKbD/xH7Q9QGwBaIdHw5AFIkHMmJIKGANYDwGYAhpSSwKUAEBNgBbVDwDIAKB4BK5gVgPDcAT3hYgWpMO1qACjW/MYCmobcAwAx+sa6aRMUA4D7zdcMp01QfvaM7KjCUeoOAB6M+skLPPSOICQ7AgAu1r51AKKgNV5IfbvhhxKDG+hFfoQdAwAN/u0HzFf3AUDLfWECQpFf5gwCAEHPkquWIJ5oFMAW8Dhgl3INDAMAOtixVXRMNAoAjMs2D6Jj4yiwBABwxJyfg89yJxwHAESeVww2gp471VEAwOhyVgLm6bDBcQARDoyj8wwDQEsGAolGTsPIE1Q68ELbQccoAOB3bj4fnQWw5FGk7zb+uuawrXkVGQZgtyX8xwEc/wHoA1A3QnU3fB7AX4uEw5vRPgoAbUbq27F6QgLmeTwlywPVk1L1tFz9YKJ+NNM/nKofz9UvKPSvaNAl1ZYhSP7XXVJBIwjtt5o3EWMSEXdNp35RqXZV+30xUL+sVr+u13+weOrJBgrg+nCn/mil/myn/nD5yNMtVDOu45gUQffjNR1BCli6bqnaAJAC6K6LK02aUy4uYNAv4dAvYlEv46F5Qb38sKOQCRt48QSoXcr1UDFbTbXa5XxcalKsiL6loJHbE54t6Vxc1ErTjPbBhynrtU+W9eoXNhcQPFjarV/cPlven6bL+8sInmpw2O5o8ehiv61ucmmmNww12nxgTnhDm8+m3ui06bd66Te7bertficpNzy+IWi2fJ6k3fR6Ul/b77G47fdFyo3PPxg0W7+/ID7N74T3/c3vHww/7f9uRfv/P8Ai/iCGtYjKAAAAAElFTkSuQmCC",
141
+ },
142
+ "builder-cms": {
143
+ mime: "image/png",
144
+ data: "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",
145
+ },
110
146
  };
111
- const FALLBACK_MONOGRAMS = {
112
- amplitude: "AM",
113
- apollo: "AP",
114
- "common-room": "CR",
115
- exa: "EX",
116
- gong: "GO",
117
- grafana: "GF",
118
- "google-workspace": "GW",
119
- pylon: "PY",
120
- "builder-cms": "B",
121
- };
147
+ const DARK_MODE_FILTER_LOGO_IDS = new Set([
148
+ "common-room",
149
+ "github",
150
+ "notion",
151
+ "vercel",
152
+ ]);
153
+ export function mcpIntegrationLogoNeedsDarkModeFilter(id) {
154
+ return DARK_MODE_FILTER_LOGO_IDS.has(id);
155
+ }
122
156
  export function mcpIntegrationLogo(id) {
123
157
  const logo = LOGOS[id];
124
- if (!logo) {
125
- const label = FALLBACK_MONOGRAMS[id];
126
- if (!label)
127
- return "";
128
- const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><text x="12" y="12" text-anchor="middle" dominant-baseline="central" font-family="Arial,sans-serif" font-size="${label.length > 1 ? 8 : 14}" font-weight="700" fill="currentColor">${label}</text></svg>`;
129
- return `data:image/svg+xml,${encodeURIComponent(svg)}`;
130
- }
158
+ if (!logo)
159
+ return "";
131
160
  return `data:${logo.mime};base64,${logo.data}`;
132
161
  }
@@ -584,6 +584,7 @@ export function useBuilderConnectFlow(opts = {}) {
584
584
  return;
585
585
  if (s) {
586
586
  setHasFetchedStatus(true);
587
+ setStatusResolved(true);
587
588
  setConfigured(!!s.configured);
588
589
  setEnvManaged(!!s.envManaged);
589
590
  setBuilderEnabled(!!s.builderEnabled);
@@ -622,6 +623,7 @@ export function useBuilderConnectFlow(opts = {}) {
622
623
  }
623
624
  if (s) {
624
625
  setHasFetchedStatus(true);
626
+ setStatusResolved(true);
625
627
  setConfigured(!!s.configured);
626
628
  setEnvManaged(!!s.envManaged);
627
629
  setBuilderEnabled(!!s.builderEnabled);
@@ -685,6 +687,8 @@ export function useBuilderConnectFlow(opts = {}) {
685
687
  const s = await fetchStatus(signal);
686
688
  if (!mountedRef.current)
687
689
  return;
690
+ if (s)
691
+ setStatusResolved(true);
688
692
  if (s?.configured) {
689
693
  setConfigured(true);
690
694
  setEnvManaged(!!s.envManaged);
@@ -769,6 +773,7 @@ export function useBuilderConnectFlow(opts = {}) {
769
773
  : null;
770
774
  setHasFetchedStatus(true);
771
775
  if (s) {
776
+ setStatusResolved(true);
772
777
  setConfigured(false);
773
778
  setEnvManaged(!!s.envManaged);
774
779
  setBuilderEnabled(!!s.builderEnabled);
@@ -785,6 +790,7 @@ export function useBuilderConnectFlow(opts = {}) {
785
790
  return;
786
791
  }
787
792
  setHasFetchedStatus(true);
793
+ setStatusResolved(true);
788
794
  setConfigured(true);
789
795
  setEnvManaged(!!s.envManaged);
790
796
  setBuilderEnabled(!!s.builderEnabled);
@@ -11,6 +11,7 @@ export { getClientSurface, type ClientSurface } from "../client-surface.js";
11
11
  export { ErrorBoundary } from "../ErrorBoundary.js";
12
12
  export { ClientOnly } from "../ClientOnly.js";
13
13
  export { DefaultSpinner } from "../DefaultSpinner.js";
14
+ export { RuntimeConfigNotice } from "../RuntimeConfigNotice.js";
14
15
  export { RouteTransitionIndicator, ROUTE_TRANSITION_INDICATOR_DELAY_MS, } from "../RouteTransitionIndicator.js";
15
16
  export { getThemeInitScript, themeInitScript, type ThemePreference, } from "../theme.js";
16
17
  export { APPEARANCE_PRESETS, applyAppearance, getStoredAppearance, useAppearance, useAppearanceSync, type AppearancePresetId, } from "../appearance.js";
@@ -11,6 +11,7 @@ export { getClientSurface } from "../client-surface.js";
11
11
  export { ErrorBoundary } from "../ErrorBoundary.js";
12
12
  export { ClientOnly } from "../ClientOnly.js";
13
13
  export { DefaultSpinner } from "../DefaultSpinner.js";
14
+ export { RuntimeConfigNotice } from "../RuntimeConfigNotice.js";
14
15
  export { RouteTransitionIndicator, ROUTE_TRANSITION_INDICATOR_DELAY_MS, } from "../RouteTransitionIndicator.js";
15
16
  export { getThemeInitScript, themeInitScript, } from "../theme.js";
16
17
  export { APPEARANCE_PRESETS, applyAppearance, getStoredAppearance, useAppearance, useAppearanceSync, } from "../appearance.js";
@@ -13,8 +13,8 @@
13
13
  * Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
14
14
  */
15
15
  export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
16
- error: string;
17
16
  ok?: undefined;
17
+ error: string;
18
18
  } | {
19
19
  error?: undefined;
20
20
  ok: boolean;
package/dist/config.d.ts CHANGED
@@ -2,8 +2,8 @@
2
2
  * Public, non-secret configuration for an Agent-Native app.
3
3
  *
4
4
  * This module is intentionally free of Node and framework imports so it can be
5
- * used from a typed `agent-native.config.ts` file and from browser code after
6
- * Vite serializes the resolved config into the client bundle.
5
+ * used from a typed `agent-native.ts` file and from browser code after Vite
6
+ * serializes the resolved config into the client bundle.
7
7
  */
8
8
  export declare const AGENT_NATIVE_CONFIG_VERSION: 1;
9
9
  export type AgentNativeFirstRunOnboardingMode = "off" | "connect" | "connect-and-integrations";
@@ -21,9 +21,32 @@ export interface AgentNativeOnboardingConfig {
21
21
  */
22
22
  firstRun?: AgentNativeFirstRunOnboardingSetting;
23
23
  }
24
+ export interface AgentNativeRuntimeAuthConfig {
25
+ /** Whether the app expects the framework or a custom auth layer to run. */
26
+ enabled?: boolean;
27
+ }
28
+ export interface AgentNativeRuntimeDatabaseConfig {
29
+ /** Whether production needs a persistent remote database. */
30
+ required?: boolean;
31
+ }
32
+ export interface AgentNativeRuntimeEnvironmentConfig {
33
+ /** Additional non-secret environment keys required by this app. */
34
+ required?: string[];
35
+ }
36
+ export interface AgentNativeRuntimeConfig {
37
+ auth?: AgentNativeRuntimeAuthConfig;
38
+ database?: AgentNativeRuntimeDatabaseConfig;
39
+ environment?: AgentNativeRuntimeEnvironmentConfig;
40
+ }
41
+ export interface AgentNativeDiagnosticsConfig {
42
+ /** Fail a production Vite build when runtime configuration has issues. */
43
+ failOnBuild?: boolean;
44
+ }
24
45
  export interface AgentNativeConfig {
25
46
  version?: typeof AGENT_NATIVE_CONFIG_VERSION;
26
47
  onboarding?: AgentNativeOnboardingConfig;
48
+ runtime?: AgentNativeRuntimeConfig;
49
+ diagnostics?: AgentNativeDiagnosticsConfig;
27
50
  }
28
51
  export interface AgentNativeConfigContext {
29
52
  command: "serve" | "build";
@@ -34,7 +57,7 @@ export interface AgentNativeConfigContext {
34
57
  export type AgentNativeConfigFactory = (context: AgentNativeConfigContext) => AgentNativeConfig;
35
58
  export type AgentNativeConfigInput = AgentNativeConfig | AgentNativeConfigFactory;
36
59
  /**
37
- * Type-safe authoring helper for `agent-native.config.ts`.
60
+ * Type-safe authoring helper for `agent-native.ts`.
38
61
  *
39
62
  * Like Next's typed config file, this is deliberately identity-like: the
40
63
  * framework evaluates the exported object or factory in the Vite config
package/dist/config.js CHANGED
@@ -2,12 +2,12 @@
2
2
  * Public, non-secret configuration for an Agent-Native app.
3
3
  *
4
4
  * This module is intentionally free of Node and framework imports so it can be
5
- * used from a typed `agent-native.config.ts` file and from browser code after
6
- * Vite serializes the resolved config into the client bundle.
5
+ * used from a typed `agent-native.ts` file and from browser code after Vite
6
+ * serializes the resolved config into the client bundle.
7
7
  */
8
8
  export const AGENT_NATIVE_CONFIG_VERSION = 1;
9
9
  /**
10
- * Type-safe authoring helper for `agent-native.config.ts`.
10
+ * Type-safe authoring helper for `agent-native.ts`.
11
11
  *
12
12
  * Like Next's typed config file, this is deliberately identity-like: the
13
13
  * framework evaluates the exported object or factory in the Vite config
@@ -25,21 +25,27 @@ export function normalizeAgentNativeConfig(input, source = "agent-native config"
25
25
  throw new Error(`${source}.version must be ${AGENT_NATIVE_CONFIG_VERSION} when provided`);
26
26
  }
27
27
  const onboardingValue = input.onboarding;
28
- if (onboardingValue === undefined) {
29
- return input.version === undefined
30
- ? {}
31
- : { version: AGENT_NATIVE_CONFIG_VERSION };
32
- }
33
- if (!isRecord(onboardingValue)) {
34
- throw new Error(`${source}.onboarding must be an object`);
35
- }
36
- const firstRun = normalizeFirstRunSetting(onboardingValue.firstRun, `${source}.onboarding.firstRun`);
37
- return {
28
+ const runtimeValue = input.runtime;
29
+ const diagnosticsValue = input.diagnostics;
30
+ const normalized = {
38
31
  ...(input.version === undefined
39
32
  ? {}
40
33
  : { version: AGENT_NATIVE_CONFIG_VERSION }),
41
- onboarding: firstRun === undefined ? {} : { firstRun },
42
34
  };
35
+ if (onboardingValue !== undefined) {
36
+ if (!isRecord(onboardingValue)) {
37
+ throw new Error(`${source}.onboarding must be an object`);
38
+ }
39
+ const firstRun = normalizeFirstRunSetting(onboardingValue.firstRun, `${source}.onboarding.firstRun`);
40
+ normalized.onboarding = firstRun === undefined ? {} : { firstRun };
41
+ }
42
+ if (runtimeValue !== undefined) {
43
+ normalized.runtime = normalizeRuntimeConfig(runtimeValue, `${source}.runtime`);
44
+ }
45
+ if (diagnosticsValue !== undefined) {
46
+ normalized.diagnostics = normalizeDiagnosticsConfig(diagnosticsValue, `${source}.diagnostics`);
47
+ }
48
+ return normalized;
43
49
  }
44
50
  export function mergeAgentNativeConfigs(base, override) {
45
51
  return {
@@ -54,6 +60,37 @@ export function mergeAgentNativeConfigs(base, override) {
54
60
  ...override.onboarding,
55
61
  }
56
62
  : undefined,
63
+ runtime: base.runtime || override.runtime
64
+ ? {
65
+ ...base.runtime,
66
+ ...override.runtime,
67
+ auth: base.runtime?.auth || override.runtime?.auth
68
+ ? {
69
+ ...base.runtime?.auth,
70
+ ...override.runtime?.auth,
71
+ }
72
+ : undefined,
73
+ database: base.runtime?.database || override.runtime?.database
74
+ ? {
75
+ ...base.runtime?.database,
76
+ ...override.runtime?.database,
77
+ }
78
+ : undefined,
79
+ environment: base.runtime?.environment || override.runtime?.environment
80
+ ? {
81
+ ...base.runtime?.environment,
82
+ ...override.runtime?.environment,
83
+ required: mergeStringLists(base.runtime?.environment?.required, override.runtime?.environment?.required),
84
+ }
85
+ : undefined,
86
+ }
87
+ : undefined,
88
+ diagnostics: base.diagnostics || override.diagnostics
89
+ ? {
90
+ ...base.diagnostics,
91
+ ...override.diagnostics,
92
+ }
93
+ : undefined,
57
94
  };
58
95
  }
59
96
  export function resolveAgentNativeConfig(input, context) {
@@ -100,6 +137,61 @@ function normalizeFirstRunSetting(value, source) {
100
137
  }
101
138
  return result;
102
139
  }
140
+ function normalizeRuntimeConfig(value, source) {
141
+ if (!isRecord(value)) {
142
+ throw new Error(`${source} must be an object`);
143
+ }
144
+ const result = {};
145
+ for (const section of ["auth", "database", "environment"]) {
146
+ const sectionValue = value[section];
147
+ if (sectionValue === undefined)
148
+ continue;
149
+ if (!isRecord(sectionValue)) {
150
+ throw new Error(`${source}.${section} must be an object`);
151
+ }
152
+ if (section === "environment") {
153
+ const required = normalizeRequiredEnvKeys(sectionValue.required, `${source}.environment.required`);
154
+ result.environment = required === undefined ? {} : { required };
155
+ continue;
156
+ }
157
+ const field = section === "auth" ? "enabled" : "required";
158
+ const fieldValue = sectionValue[field];
159
+ if (fieldValue !== undefined && typeof fieldValue !== "boolean") {
160
+ throw new Error(`${source}.${section}.${field} must be a boolean`);
161
+ }
162
+ result[section] = fieldValue === undefined ? {} : { [field]: fieldValue };
163
+ }
164
+ return result;
165
+ }
166
+ function normalizeDiagnosticsConfig(value, source) {
167
+ if (!isRecord(value)) {
168
+ throw new Error(`${source} must be an object`);
169
+ }
170
+ if (value.failOnBuild !== undefined &&
171
+ typeof value.failOnBuild !== "boolean") {
172
+ throw new Error(`${source}.failOnBuild must be a boolean`);
173
+ }
174
+ return value.failOnBuild === undefined
175
+ ? {}
176
+ : { failOnBuild: value.failOnBuild };
177
+ }
178
+ function normalizeRequiredEnvKeys(value, source) {
179
+ if (value === undefined)
180
+ return undefined;
181
+ if (!Array.isArray(value) || value.some((key) => typeof key !== "string")) {
182
+ throw new Error(`${source} must be an array of environment variable names`);
183
+ }
184
+ const keys = value.map((key) => key.trim());
185
+ if (keys.some((key) => !/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))) {
186
+ throw new Error(`${source} must contain valid environment variable names`);
187
+ }
188
+ return [...new Set(keys)];
189
+ }
190
+ function mergeStringLists(base, override) {
191
+ if (base === undefined && override === undefined)
192
+ return undefined;
193
+ return [...new Set([...(base ?? []), ...(override ?? [])])];
194
+ }
103
195
  function isFirstRunMode(value) {
104
196
  return (value === "off" ||
105
197
  value === "connect" ||
@@ -57,8 +57,8 @@ export declare function pgTableExists(table: string, injectedClient?: DbExec, di
57
57
  */
58
58
  export declare function pgColumnExists(table: string, column: string, injectedClient?: DbExec): Promise<boolean | undefined>;
59
59
  /**
60
- * True when running against Postgres AND an index with the given name already
61
- * exists in the `public` schema. Returns `false` on SQLite, for invalid
60
+ * True when running against Postgres AND a valid, ready index with the given
61
+ * name already exists in the `public` schema. Returns `false` on SQLite, for invalid
62
62
  * identifiers, and `undefined` when `pg_indexes` is unreadable.
63
63
  *
64
64
  * `CREATE INDEX` (without CONCURRENTLY) takes a `SHARE` lock that blocks
@@ -134,6 +134,19 @@ export declare function ensureIndexExists(indexName: string, createIndexSql: str
134
134
  injectedClient?: DbExec;
135
135
  dialectIsPostgres?: boolean;
136
136
  }): Promise<boolean>;
137
+ /**
138
+ * Ensure an additive Postgres index with `CREATE INDEX CONCURRENTLY`.
139
+ *
140
+ * This is deliberately separate from `ensureIndexExists`: the normal helper
141
+ * wraps DDL in a transaction so it can scope `lock_timeout`, but PostgreSQL
142
+ * forbids `CREATE INDEX CONCURRENTLY` inside a transaction. The caller must
143
+ * supply the concurrent form of the statement; direct execution keeps the
144
+ * build outside a transaction and avoids blocking writes on a large table.
145
+ */
146
+ export declare function ensureIndexExistsConcurrently(indexName: string, createIndexSql: string, options?: {
147
+ injectedClient?: DbExec;
148
+ dialectIsPostgres?: boolean;
149
+ }): Promise<boolean>;
137
150
  /** True when an error looks like a Postgres `lock_timeout` (SQLSTATE 55P03). */
138
151
  export declare function isLockTimeoutError(err: unknown): boolean;
139
152
  /**