@agent-native/core 0.103.1 → 0.104.0

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 (565) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +30 -0
  3. package/corpus/core/package.json +9 -2
  4. package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
  5. package/corpus/core/src/agent/production-agent.ts +30 -0
  6. package/corpus/core/src/agent/run-store.ts +12 -2
  7. package/corpus/core/src/cli/create.ts +1 -0
  8. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
  9. package/corpus/core/src/cli/templates-meta.ts +4 -3
  10. package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
  11. package/corpus/core/src/client/AgentChatHome.tsx +4 -0
  12. package/corpus/core/src/client/AgentPanel.tsx +321 -223
  13. package/corpus/core/src/client/AssistantChat.tsx +6 -10
  14. package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
  15. package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
  16. package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
  17. package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
  18. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
  19. package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
  20. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
  21. package/corpus/core/src/client/agent-page/types.ts +1 -1
  22. package/corpus/core/src/client/analytics.ts +51 -5
  23. package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
  24. package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
  25. package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
  26. package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
  27. package/corpus/core/src/client/index.ts +16 -1
  28. package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
  30. package/corpus/core/src/client/session-replay.ts +158 -5
  31. package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
  34. package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
  35. package/corpus/core/src/client/use-chat-threads.ts +2 -0
  36. package/corpus/core/src/connections/catalog.ts +49 -7
  37. package/corpus/core/src/db/index.ts +6 -1
  38. package/corpus/core/src/extensions/actions.ts +106 -16
  39. package/corpus/core/src/extensions/content-patch.ts +22 -0
  40. package/corpus/core/src/extensions/routes.ts +18 -0
  41. package/corpus/core/src/extensions/store.ts +8 -0
  42. package/corpus/core/src/index.ts +3 -0
  43. package/corpus/core/src/ingestion/docx.ts +158 -0
  44. package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
  45. package/corpus/core/src/ingestion/figma.ts +548 -0
  46. package/corpus/core/src/ingestion/index.ts +107 -0
  47. package/corpus/core/src/ingestion/media.ts +264 -0
  48. package/corpus/core/src/ingestion/notion.ts +121 -0
  49. package/corpus/core/src/ingestion/office.ts +214 -0
  50. package/corpus/core/src/ingestion/orchestration.ts +160 -0
  51. package/corpus/core/src/ingestion/pptx.ts +333 -0
  52. package/corpus/core/src/ingestion/selection.ts +81 -0
  53. package/corpus/core/src/ingestion/website.ts +151 -0
  54. package/corpus/core/src/integrations/plugin.ts +45 -37
  55. package/corpus/core/src/localization/default-messages.ts +35 -12
  56. package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
  57. package/corpus/core/src/observability/traces.ts +5 -3
  58. package/corpus/core/src/provider-api/index.ts +452 -8
  59. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
  60. package/corpus/core/src/search-utils/index.ts +112 -0
  61. package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
  62. package/corpus/core/src/server/action-discovery.ts +33 -8
  63. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  64. package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  66. package/corpus/core/src/server/core-routes-plugin.ts +12 -0
  67. package/corpus/core/src/server/index.ts +30 -0
  68. package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
  69. package/corpus/core/src/styles/agent-native.css +9 -0
  70. package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  72. package/corpus/core/src/templates/workspace-root/.env.example +12 -0
  73. package/corpus/core/src/workspace-connections/index.ts +6 -0
  74. package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
  75. package/corpus/core/src/workspace-connections/store.ts +16 -0
  76. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
  77. package/corpus/templates/analytics/AGENTS.md +9 -0
  78. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
  79. package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
  80. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
  81. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
  82. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
  83. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
  84. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
  85. package/corpus/templates/analytics/app/i18n-data.ts +3 -3
  86. package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
  87. package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
  88. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  91. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
  92. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
  97. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
  98. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
  99. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
  100. package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
  101. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  102. package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
  103. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
  104. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
  105. package/corpus/templates/assets/AGENTS.md +10 -0
  106. package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
  107. package/corpus/templates/assets/actions/edit-image.ts +2 -0
  108. package/corpus/templates/assets/actions/generate-asset.ts +52 -0
  109. package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
  110. package/corpus/templates/assets/actions/generate-image.ts +219 -1
  111. package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
  112. package/corpus/templates/assets/actions/refine-image.ts +3 -0
  113. package/corpus/templates/assets/actions/restyle-image.ts +2 -0
  114. package/corpus/templates/assets/agent-native.app-skill.json +4 -0
  115. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
  116. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  117. package/corpus/templates/assets/app/i18n-data.ts +29 -13
  118. package/corpus/templates/assets/app/routes/agent.tsx +7 -1
  119. package/corpus/templates/assets/app/routes/library.tsx +9 -0
  120. package/corpus/templates/assets/app/routes/settings.tsx +3 -0
  121. package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
  122. package/corpus/templates/assets/package.json +1 -0
  123. package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
  124. package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
  125. package/corpus/templates/brain/app/i18n-data.ts +3 -3
  126. package/corpus/templates/brain/app/lib/brain.ts +1 -1
  127. package/corpus/templates/brain/server/lib/search.ts +17 -67
  128. package/corpus/templates/calendar/app/i18n-data.ts +3 -3
  129. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
  130. package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
  131. package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
  132. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  133. package/corpus/templates/clips/AGENTS.md +4 -0
  134. package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
  135. package/corpus/templates/clips/actions/create-meeting.ts +6 -2
  136. package/corpus/templates/clips/actions/create-organization.ts +3 -2
  137. package/corpus/templates/clips/actions/create-recording.ts +4 -1
  138. package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
  139. package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
  140. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
  141. package/corpus/templates/clips/actions/list-meetings.ts +23 -5
  142. package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
  143. package/corpus/templates/clips/actions/remove-silences.ts +10 -1
  144. package/corpus/templates/clips/actions/request-transcript.ts +53 -11
  145. package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
  146. package/corpus/templates/clips/actions/search-recordings.ts +5 -8
  147. package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
  148. package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
  149. package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
  150. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
  151. package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
  152. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
  153. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
  154. package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
  155. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
  156. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
  157. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  158. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  159. package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
  160. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  161. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  162. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  163. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  164. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  165. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  166. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
  167. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
  168. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
  169. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
  170. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
  171. package/corpus/templates/clips/app/routes/record.tsx +23 -2
  172. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
  173. package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
  182. package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
  183. package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
  186. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  187. package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
  188. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
  189. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
  190. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
  191. package/corpus/templates/clips/desktop/src/app.tsx +66 -28
  192. package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
  193. package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
  194. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
  195. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
  196. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
  197. package/corpus/templates/clips/desktop/src/styles.css +13 -11
  198. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
  199. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  200. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
  201. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
  202. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
  203. package/corpus/templates/clips/server/db/schema.ts +2 -2
  204. package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
  205. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
  206. package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
  207. package/corpus/templates/clips/server/lib/recordings.ts +40 -1
  208. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  209. package/corpus/templates/clips/server/plugins/db.ts +2 -2
  210. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
  211. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
  212. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
  213. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
  214. package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
  215. package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
  216. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
  217. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
  218. package/corpus/templates/content/AGENTS.md +9 -0
  219. package/corpus/templates/content/actions/create-document.ts +94 -0
  220. package/corpus/templates/content/actions/edit-document.ts +144 -4
  221. package/corpus/templates/content/actions/update-document.ts +138 -0
  222. package/corpus/templates/content/agent-native.app-skill.json +4 -0
  223. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
  224. package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
  225. package/corpus/templates/content/app/i18n-data.ts +13 -4
  226. package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
  227. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
  228. package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
  229. package/corpus/templates/content/package.json +1 -0
  230. package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
  231. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
  232. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  233. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  234. package/corpus/templates/design/AGENTS.md +6 -0
  235. package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
  236. package/corpus/templates/design/actions/edit-design.ts +128 -0
  237. package/corpus/templates/design/actions/generate-design.ts +278 -14
  238. package/corpus/templates/design/actions/generate-screens.ts +42 -1
  239. package/corpus/templates/design/agent-native.app-skill.json +4 -0
  240. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
  241. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  242. package/corpus/templates/design/app/i18n-data.ts +10 -4
  243. package/corpus/templates/design/app/routes/agent.tsx +2 -1
  244. package/corpus/templates/design/app/routes/settings.tsx +3 -0
  245. package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
  246. package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  247. package/corpus/templates/design/package.json +1 -0
  248. package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
  249. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
  250. package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
  251. package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
  252. package/corpus/templates/design/shared/generation-session.ts +7 -0
  253. package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
  254. package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
  255. package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
  256. package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
  257. package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
  258. package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
  259. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
  260. package/corpus/templates/plan/AGENTS.md +21 -1
  261. package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
  262. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
  263. package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
  264. package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
  265. package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
  266. package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
  267. package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
  268. package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
  269. package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
  270. package/corpus/templates/plan/server/plan-mdx.ts +75 -2
  271. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
  272. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
  273. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
  274. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
  275. package/corpus/templates/slides/AGENTS.md +6 -0
  276. package/corpus/templates/slides/actions/add-slide.ts +230 -14
  277. package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
  278. package/corpus/templates/slides/actions/create-deck.ts +130 -0
  279. package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
  280. package/corpus/templates/slides/actions/import-file.ts +5 -4
  281. package/corpus/templates/slides/actions/patch-deck.ts +200 -10
  282. package/corpus/templates/slides/actions/update-slide.ts +208 -15
  283. package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
  284. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
  285. package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
  286. package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
  287. package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
  288. package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
  289. package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
  290. package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
  291. package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
  292. package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
  293. package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
  294. package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
  295. package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
  296. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
  297. package/corpus/templates/slides/app/routes/agent.tsx +7 -1
  298. package/corpus/templates/slides/app/routes/settings.tsx +3 -0
  299. package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
  300. package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
  301. package/corpus/templates/slides/package.json +1 -0
  302. package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
  303. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
  304. package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
  305. package/dist/agent/engine/credential-errors.d.ts +1 -1
  306. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  307. package/dist/agent/engine/credential-errors.js +2 -2
  308. package/dist/agent/engine/credential-errors.js.map +1 -1
  309. package/dist/agent/production-agent.d.ts.map +1 -1
  310. package/dist/agent/production-agent.js +25 -0
  311. package/dist/agent/production-agent.js.map +1 -1
  312. package/dist/agent/run-store.d.ts.map +1 -1
  313. package/dist/agent/run-store.js +12 -2
  314. package/dist/agent/run-store.js.map +1 -1
  315. package/dist/cli/create.d.ts.map +1 -1
  316. package/dist/cli/create.js +1 -0
  317. package/dist/cli/create.js.map +1 -1
  318. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  319. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  320. package/dist/cli/skills-content/visual-plan-skill.js +30 -11
  321. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  322. package/dist/cli/templates-meta.d.ts.map +1 -1
  323. package/dist/cli/templates-meta.js +4 -3
  324. package/dist/cli/templates-meta.js.map +1 -1
  325. package/dist/client/AgentAskPopover.d.ts +11 -0
  326. package/dist/client/AgentAskPopover.d.ts.map +1 -0
  327. package/dist/client/AgentAskPopover.js +30 -0
  328. package/dist/client/AgentAskPopover.js.map +1 -0
  329. package/dist/client/AgentChatHome.d.ts +1 -1
  330. package/dist/client/AgentChatHome.d.ts.map +1 -1
  331. package/dist/client/AgentChatHome.js +2 -2
  332. package/dist/client/AgentChatHome.js.map +1 -1
  333. package/dist/client/AgentPanel.d.ts +9 -19
  334. package/dist/client/AgentPanel.d.ts.map +1 -1
  335. package/dist/client/AgentPanel.js +119 -80
  336. package/dist/client/AgentPanel.js.map +1 -1
  337. package/dist/client/AssistantChat.d.ts.map +1 -1
  338. package/dist/client/AssistantChat.js +4 -4
  339. package/dist/client/AssistantChat.js.map +1 -1
  340. package/dist/client/MultiTabAssistantChat.d.ts +3 -9
  341. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  342. package/dist/client/MultiTabAssistantChat.js +49 -189
  343. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  344. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  345. package/dist/client/agent-chat-adapter.js +12 -1
  346. package/dist/client/agent-chat-adapter.js.map +1 -1
  347. package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
  348. package/dist/client/agent-page/AgentContextTab.js +26 -28
  349. package/dist/client/agent-page/AgentContextTab.js.map +1 -1
  350. package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
  351. package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
  352. package/dist/client/agent-page/AgentEmptyState.js +6 -0
  353. package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
  354. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
  355. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  356. package/dist/client/agent-page/AgentJobsTab.js +90 -58
  357. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  358. package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
  359. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
  360. package/dist/client/agent-page/AgentTabFrame.js +7 -0
  361. package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
  362. package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
  363. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  364. package/dist/client/agent-page/AgentTabsPage.js +135 -99
  365. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  366. package/dist/client/agent-page/types.d.ts +1 -1
  367. package/dist/client/agent-page/types.d.ts.map +1 -1
  368. package/dist/client/agent-page/types.js.map +1 -1
  369. package/dist/client/analytics.d.ts +10 -3
  370. package/dist/client/analytics.d.ts.map +1 -1
  371. package/dist/client/analytics.js +37 -2
  372. package/dist/client/analytics.js.map +1 -1
  373. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  374. package/dist/client/chat/run-recovery.js +10 -3
  375. package/dist/client/chat/run-recovery.js.map +1 -1
  376. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  377. package/dist/client/composer/PromptComposer.js +2 -2
  378. package/dist/client/composer/PromptComposer.js.map +1 -1
  379. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  380. package/dist/client/composer/TiptapComposer.js +15 -3
  381. package/dist/client/composer/TiptapComposer.js.map +1 -1
  382. package/dist/client/dynamic-suggestions.js +3 -3
  383. package/dist/client/dynamic-suggestions.js.map +1 -1
  384. package/dist/client/index.d.ts +4 -3
  385. package/dist/client/index.d.ts.map +1 -1
  386. package/dist/client/index.js +3 -2
  387. package/dist/client/index.js.map +1 -1
  388. package/dist/client/resources/ResourceTree.d.ts +5 -1
  389. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  390. package/dist/client/resources/ResourceTree.js +74 -5
  391. package/dist/client/resources/ResourceTree.js.map +1 -1
  392. package/dist/client/resources/ResourcesPanel.d.ts +11 -2
  393. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  394. package/dist/client/resources/ResourcesPanel.js +105 -31
  395. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  396. package/dist/client/session-replay.d.ts +28 -0
  397. package/dist/client/session-replay.d.ts.map +1 -1
  398. package/dist/client/session-replay.js +122 -8
  399. package/dist/client/session-replay.js.map +1 -1
  400. package/dist/client/settings/AutomationsSection.d.ts +3 -1
  401. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  402. package/dist/client/settings/AutomationsSection.js +16 -6
  403. package/dist/client/settings/AutomationsSection.js.map +1 -1
  404. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  405. package/dist/client/settings/SettingsPanel.js +3 -3
  406. package/dist/client/settings/SettingsPanel.js.map +1 -1
  407. package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
  408. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  409. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  410. package/dist/client/settings/agent-settings-search.js +2 -2
  411. package/dist/client/settings/agent-settings-search.js.map +1 -1
  412. package/dist/client/use-chat-threads.d.ts +2 -0
  413. package/dist/client/use-chat-threads.d.ts.map +1 -1
  414. package/dist/client/use-chat-threads.js.map +1 -1
  415. package/dist/collab/routes.d.ts +1 -1
  416. package/dist/connections/catalog.d.ts +41 -7
  417. package/dist/connections/catalog.d.ts.map +1 -1
  418. package/dist/connections/catalog.js +40 -7
  419. package/dist/connections/catalog.js.map +1 -1
  420. package/dist/db/index.d.ts +2 -2
  421. package/dist/db/index.d.ts.map +1 -1
  422. package/dist/db/index.js +2 -2
  423. package/dist/db/index.js.map +1 -1
  424. package/dist/extensions/actions.d.ts.map +1 -1
  425. package/dist/extensions/actions.js +85 -15
  426. package/dist/extensions/actions.js.map +1 -1
  427. package/dist/extensions/content-patch.d.ts +4 -0
  428. package/dist/extensions/content-patch.d.ts.map +1 -1
  429. package/dist/extensions/content-patch.js +18 -0
  430. package/dist/extensions/content-patch.js.map +1 -1
  431. package/dist/extensions/routes.d.ts.map +1 -1
  432. package/dist/extensions/routes.js +14 -0
  433. package/dist/extensions/routes.js.map +1 -1
  434. package/dist/extensions/store.d.ts +1 -0
  435. package/dist/extensions/store.d.ts.map +1 -1
  436. package/dist/extensions/store.js +4 -1
  437. package/dist/extensions/store.js.map +1 -1
  438. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  439. package/dist/index.d.ts +1 -1
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js +1 -1
  442. package/dist/index.js.map +1 -1
  443. package/dist/ingestion/docx.d.ts +16 -0
  444. package/dist/ingestion/docx.d.ts.map +1 -0
  445. package/dist/ingestion/docx.js +129 -0
  446. package/dist/ingestion/docx.js.map +1 -0
  447. package/dist/ingestion/figma-node-to-html.d.ts +304 -0
  448. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
  449. package/dist/ingestion/figma-node-to-html.js +1292 -0
  450. package/dist/ingestion/figma-node-to-html.js.map +1 -0
  451. package/dist/ingestion/figma.d.ts +115 -0
  452. package/dist/ingestion/figma.d.ts.map +1 -0
  453. package/dist/ingestion/figma.js +399 -0
  454. package/dist/ingestion/figma.js.map +1 -0
  455. package/dist/ingestion/index.d.ts +11 -0
  456. package/dist/ingestion/index.d.ts.map +1 -0
  457. package/dist/ingestion/index.js +11 -0
  458. package/dist/ingestion/index.js.map +1 -0
  459. package/dist/ingestion/media.d.ts +36 -0
  460. package/dist/ingestion/media.d.ts.map +1 -0
  461. package/dist/ingestion/media.js +178 -0
  462. package/dist/ingestion/media.js.map +1 -0
  463. package/dist/ingestion/notion.d.ts +12 -0
  464. package/dist/ingestion/notion.d.ts.map +1 -0
  465. package/dist/ingestion/notion.js +104 -0
  466. package/dist/ingestion/notion.js.map +1 -0
  467. package/dist/ingestion/office.d.ts +45 -0
  468. package/dist/ingestion/office.d.ts.map +1 -0
  469. package/dist/ingestion/office.js +141 -0
  470. package/dist/ingestion/office.js.map +1 -0
  471. package/dist/ingestion/orchestration.d.ts +52 -0
  472. package/dist/ingestion/orchestration.d.ts.map +1 -0
  473. package/dist/ingestion/orchestration.js +89 -0
  474. package/dist/ingestion/orchestration.js.map +1 -0
  475. package/dist/ingestion/pptx.d.ts +28 -0
  476. package/dist/ingestion/pptx.d.ts.map +1 -0
  477. package/dist/ingestion/pptx.js +255 -0
  478. package/dist/ingestion/pptx.js.map +1 -0
  479. package/dist/ingestion/selection.d.ts +20 -0
  480. package/dist/ingestion/selection.d.ts.map +1 -0
  481. package/dist/ingestion/selection.js +52 -0
  482. package/dist/ingestion/selection.js.map +1 -0
  483. package/dist/ingestion/website.d.ts +27 -0
  484. package/dist/ingestion/website.d.ts.map +1 -0
  485. package/dist/ingestion/website.js +100 -0
  486. package/dist/ingestion/website.js.map +1 -0
  487. package/dist/integrations/plugin.d.ts.map +1 -1
  488. package/dist/integrations/plugin.js +32 -27
  489. package/dist/integrations/plugin.js.map +1 -1
  490. package/dist/localization/default-messages.d.ts +22 -0
  491. package/dist/localization/default-messages.d.ts.map +1 -1
  492. package/dist/localization/default-messages.js +31 -9
  493. package/dist/localization/default-messages.js.map +1 -1
  494. package/dist/notifications/routes.d.ts +1 -1
  495. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  496. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  497. package/dist/observability/hosted-model-experiment.js +90 -0
  498. package/dist/observability/hosted-model-experiment.js.map +1 -0
  499. package/dist/observability/traces.d.ts.map +1 -1
  500. package/dist/observability/traces.js +5 -3
  501. package/dist/observability/traces.js.map +1 -1
  502. package/dist/progress/routes.d.ts +1 -1
  503. package/dist/provider-api/index.d.ts +35 -4
  504. package/dist/provider-api/index.d.ts.map +1 -1
  505. package/dist/provider-api/index.js +339 -8
  506. package/dist/provider-api/index.js.map +1 -1
  507. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  508. package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
  509. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  510. package/dist/search-utils/index.d.ts +12 -0
  511. package/dist/search-utils/index.d.ts.map +1 -0
  512. package/dist/search-utils/index.js +95 -0
  513. package/dist/search-utils/index.js.map +1 -0
  514. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  515. package/dist/secrets/register-framework-secrets.js +57 -0
  516. package/dist/secrets/register-framework-secrets.js.map +1 -1
  517. package/dist/server/action-discovery.d.ts +8 -0
  518. package/dist/server/action-discovery.d.ts.map +1 -1
  519. package/dist/server/action-discovery.js +26 -9
  520. package/dist/server/action-discovery.js.map +1 -1
  521. package/dist/server/agent-chat/framework-prompts.js +2 -2
  522. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  523. package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
  524. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  525. package/dist/server/agent-chat/prompt-resources.js +95 -0
  526. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  527. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  528. package/dist/server/agent-chat-plugin.js +7 -0
  529. package/dist/server/agent-chat-plugin.js.map +1 -1
  530. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  531. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  532. package/dist/server/core-routes-plugin.js +5 -0
  533. package/dist/server/core-routes-plugin.js.map +1 -1
  534. package/dist/server/index.d.ts +5 -1
  535. package/dist/server/index.d.ts.map +1 -1
  536. package/dist/server/index.js +5 -1
  537. package/dist/server/index.js.map +1 -1
  538. package/dist/server/workspace-provider-oauth.d.ts +48 -0
  539. package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
  540. package/dist/server/workspace-provider-oauth.js +415 -0
  541. package/dist/server/workspace-provider-oauth.js.map +1 -0
  542. package/dist/styles/agent-native.css +9 -0
  543. package/dist/templates/chat/app/i18n/en-US.ts +3 -3
  544. package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
  545. package/dist/templates/default/app/i18n/en-US.ts +3 -3
  546. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  547. package/dist/templates/workspace-root/.env.example +12 -0
  548. package/dist/workspace-connections/index.d.ts +1 -0
  549. package/dist/workspace-connections/index.d.ts.map +1 -1
  550. package/dist/workspace-connections/index.js +1 -0
  551. package/dist/workspace-connections/index.js.map +1 -1
  552. package/dist/workspace-connections/lifecycle.d.ts +16 -0
  553. package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
  554. package/dist/workspace-connections/lifecycle.js +14 -0
  555. package/dist/workspace-connections/lifecycle.js.map +1 -0
  556. package/dist/workspace-connections/store.d.ts.map +1 -1
  557. package/dist/workspace-connections/store.js +16 -0
  558. package/dist/workspace-connections/store.js.map +1 -1
  559. package/package.json +10 -3
  560. package/src/templates/chat/app/i18n/en-US.ts +3 -3
  561. package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
  562. package/src/templates/chat/app/lib/agent-page.tsx +10 -1
  563. package/src/templates/default/app/i18n/en-US.ts +3 -3
  564. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  565. package/src/templates/workspace-root/.env.example +12 -0
@@ -1,9 +1,14 @@
1
1
  import {
2
- IconBrain,
2
+ IconBook2,
3
+ IconChecklist,
3
4
  IconClock,
4
5
  IconExternalLink,
5
6
  IconFolder,
7
+ IconHistory,
8
+ IconHierarchy2,
9
+ IconNotes,
6
10
  IconPlugConnected,
11
+ IconTopologyRing2,
7
12
  IconSearch,
8
13
  IconShieldLock,
9
14
  IconX,
@@ -17,6 +22,7 @@ import {
17
22
  useRef,
18
23
  useState,
19
24
  type ComponentType,
25
+ type ReactNode,
20
26
  } from "react";
21
27
 
22
28
  import {
@@ -27,11 +33,6 @@ import {
27
33
  type McpConnectTemplateValues,
28
34
  } from "../../shared/mcp-connect-content.js";
29
35
  import { appPath } from "../api-path.js";
30
- import {
31
- Tooltip,
32
- TooltipContent,
33
- TooltipTrigger,
34
- } from "../components/ui/tooltip.js";
35
36
  import { useT } from "../i18n.js";
36
37
  import { useOrg } from "../org/hooks.js";
37
38
  import {
@@ -40,6 +41,7 @@ import {
40
41
  // host for the existing MCP management flow.
41
42
  } from "../resources/McpIntegrationDialog.js";
42
43
  import { McpServerDetail } from "../resources/McpServerDetail.js";
44
+ import type { ResourceView } from "../resources/ResourcesPanel.js";
43
45
  import {
44
46
  useCreateMcpServer,
45
47
  useDeleteMcpServer,
@@ -47,12 +49,13 @@ import {
47
49
  type McpServer,
48
50
  type McpServerScope,
49
51
  } from "../resources/use-mcp-servers.js";
50
- import { AgentsSection } from "../settings/AgentsSection.js";
51
52
  import type {
52
53
  SettingsSearchEntry,
53
54
  SettingsTabItem,
54
55
  } from "../settings/SettingsTabsPage.js";
55
56
  import { cn } from "../utils.js";
57
+ import { AgentEmptyState } from "./AgentEmptyState.js";
58
+ import { AgentTabFrame } from "./AgentTabFrame.js";
56
59
  import type { AgentPageScope, AgentPageTabProps } from "./types.js";
57
60
 
58
61
  const AgentContextTab = lazy(() =>
@@ -89,6 +92,9 @@ function resolveTabId(
89
92
  ): string | null {
90
93
  const normalized = normalizeTabId(value);
91
94
  if (!normalized) return null;
95
+ if (normalized === "context" && tabs.some((tab) => tab.id === "snapshots")) {
96
+ return "snapshots";
97
+ }
92
98
  if (tabs.some((tab) => tab.id === normalized)) return normalized;
93
99
  const section = normalized.split(":", 1)[0];
94
100
  const owner = tabs.find((tab) =>
@@ -101,7 +107,7 @@ function resolveTabId(
101
107
 
102
108
  function updateTabHash(tabId: string) {
103
109
  if (typeof window === "undefined") return;
104
- const hash = tabId === "context" ? "" : `#${encodeURIComponent(tabId)}`;
110
+ const hash = tabId === "files" ? "" : `#${encodeURIComponent(tabId)}`;
105
111
  window.history.pushState(
106
112
  null,
107
113
  "",
@@ -109,29 +115,6 @@ function updateTabHash(tabId: string) {
109
115
  );
110
116
  }
111
117
 
112
- function initialScope(): AgentPageScope {
113
- if (typeof window === "undefined") return "user";
114
- try {
115
- const queryScope = new URLSearchParams(window.location.search).get("scope");
116
- if (queryScope === "org" || queryScope === "user") return queryScope;
117
- return localStorage.getItem("agent-page-scope") === "org" ? "org" : "user";
118
- } catch {
119
- return "user";
120
- }
121
- }
122
-
123
- function updateScopeUrl(scope: AgentPageScope) {
124
- if (typeof window === "undefined") return;
125
- const search = new URLSearchParams(window.location.search);
126
- search.set("scope", scope);
127
- const query = search.toString();
128
- window.history.replaceState(
129
- null,
130
- "",
131
- `${window.location.pathname}${query ? `?${query}` : ""}${window.location.hash}`,
132
- );
133
- }
134
-
135
118
  function TabLoading() {
136
119
  return (
137
120
  <div className="space-y-3" aria-busy="true">
@@ -150,23 +133,60 @@ function EmptySlot({ label }: { label: string }) {
150
133
  );
151
134
  }
152
135
 
153
- function FilesTab({ scope }: AgentPageTabProps) {
154
- return (
155
- <div className="h-[calc(100vh-14rem)] min-h-[480px]">
156
- <ResourcesPanel
157
- key={scope}
158
- showMcpServers={false}
159
- scope={scope === "org" ? "shared" : "personal"}
160
- />
161
- </div>
162
- );
163
- }
136
+ const RESOURCE_TAB_COPY: Record<
137
+ ResourceView,
138
+ { title: string; description: string }
139
+ > = {
140
+ files: {
141
+ title: "Files",
142
+ description: "Plain workspace files the agent can read and write.",
143
+ },
144
+ instructions: {
145
+ title: "Instructions",
146
+ description:
147
+ "The rules, preferences, and project guidance that steer the agent.",
148
+ },
149
+ agents: {
150
+ title: "Agents",
151
+ description: "Reusable profiles for focused sub-agents and delegated work.",
152
+ },
153
+ memory: {
154
+ title: "Memory",
155
+ description: "Durable notes the agent can retrieve across conversations.",
156
+ },
157
+ skills: {
158
+ title: "Skills",
159
+ description:
160
+ "Specialized instructions that give the agent repeatable abilities.",
161
+ },
162
+ learnings: {
163
+ title: "Learnings",
164
+ description:
165
+ "Corrections and patterns worth carrying forward for future work.",
166
+ },
167
+ "remote-agents": {
168
+ title: "Remote agents",
169
+ description: "Other agents this workspace can call through A2A.",
170
+ },
171
+ };
164
172
 
165
- function ScopeBadge({ scope }: { scope: McpServerScope }) {
173
+ function AgentResourceTab({
174
+ scope,
175
+ view,
176
+ }: AgentPageTabProps & { view: ResourceView }) {
177
+ const copy = RESOURCE_TAB_COPY[view];
166
178
  return (
167
- <span className="rounded-full border border-border bg-muted/40 px-2 py-0.5 text-[10px] font-medium text-muted-foreground">
168
- {scope === "user" ? "Personal" : "Organization"}
169
- </span>
179
+ <AgentTabFrame title={copy.title} description={copy.description}>
180
+ <div className="min-h-[480px]">
181
+ <ResourcesPanel
182
+ key={`${scope}-${view}`}
183
+ showMcpServers={false}
184
+ resourceFilter={view}
185
+ resourceTreeVariant={view === "files" ? "tree" : "collection"}
186
+ scope="personal"
187
+ />
188
+ </div>
189
+ </AgentTabFrame>
170
190
  );
171
191
  }
172
192
 
@@ -190,7 +210,7 @@ function ServerStatus({ server }: { server: McpServer }) {
190
210
  );
191
211
  }
192
212
 
193
- function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
213
+ function ConnectionsTab({ canManageOrg = false }: AgentPageTabProps) {
194
214
  const t = useT();
195
215
  const serversQuery = useMcpServers();
196
216
  const createServer = useCreateMcpServer();
@@ -202,7 +222,6 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
202
222
  const data = serversQuery.data;
203
223
  const hasOrg = Boolean(data?.orgId);
204
224
  const canCreateOrgMcp = hasOrg && canManageOrg;
205
- const activeScope: McpServerScope = scope === "org" ? "org" : "user";
206
225
 
207
226
  const onCreateMcpServer = useCallback(
208
227
  async (args: {
@@ -252,8 +271,8 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
252
271
  <div
253
272
  key={key}
254
273
  className={cn(
255
- "rounded-lg border border-border bg-card p-3 transition-colors",
256
- selected && "border-foreground/30 bg-accent/20",
274
+ "group/connection-row py-4 transition-colors first:pt-5 last:pb-5",
275
+ selected && "bg-accent/20",
257
276
  )}
258
277
  >
259
278
  <div className="flex items-start gap-3">
@@ -266,12 +285,6 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
266
285
  <span className="truncate text-sm font-medium text-foreground">
267
286
  {server.name}
268
287
  </span>
269
- <ScopeBadge scope={server.scope} />
270
- {server.scope === activeScope && (
271
- <span className="text-[10px] text-muted-foreground">
272
- Selected scope
273
- </span>
274
- )}
275
288
  </div>
276
289
  <code className="mt-1 block truncate text-[11px] text-muted-foreground">
277
290
  {server.url}
@@ -309,29 +322,23 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
309
322
  };
310
323
 
311
324
  return (
312
- <div className="space-y-8">
313
- <section className="space-y-3">
314
- <div className="flex flex-wrap items-start justify-between gap-3">
315
- <div>
316
- <h2 className="text-base font-semibold text-foreground">
317
- MCP servers
318
- </h2>
319
- <p className="mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground">
320
- Tools and services this agent can reach. The page scope controls
321
- where new servers are saved.
322
- </p>
323
- </div>
324
- <button
325
- type="button"
326
- onClick={() => {
327
- setError(null);
328
- setDialogOpen(true);
329
- }}
330
- className="cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90"
331
- >
332
- {t("mcpIntegrations.connect")}
333
- </button>
334
- </div>
325
+ <AgentTabFrame
326
+ title="Connections"
327
+ description="Tools and services this agent can reach, grouped by where they are configured."
328
+ actions={
329
+ <button
330
+ type="button"
331
+ onClick={() => {
332
+ setError(null);
333
+ setDialogOpen(true);
334
+ }}
335
+ className="cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90"
336
+ >
337
+ {t("mcpIntegrations.connect")}
338
+ </button>
339
+ }
340
+ >
341
+ <section className="space-y-4">
335
342
  {error && (
336
343
  <p className="rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive">
337
344
  {error}
@@ -343,40 +350,45 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
343
350
  <p className="rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive">
344
351
  Could not load MCP servers.
345
352
  </p>
346
- ) : data && data.user.length + data.org.length > 0 ? (
347
- <div className="space-y-2">
348
- {data.user.map(renderServer)}
349
- {data.org.map(renderServer)}
350
- </div>
351
353
  ) : (
352
- <div className="rounded-lg border border-dashed border-border p-5 text-sm text-muted-foreground">
353
- No MCP servers are connected yet.
354
+ <div className="space-y-6">
355
+ {[
356
+ { label: "Personal", servers: data?.user ?? [] },
357
+ { label: "Organization", servers: data?.org ?? [] },
358
+ ].map((section) => (
359
+ <section key={section.label} className="space-y-2">
360
+ <h2 className="text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground/70">
361
+ {section.label}
362
+ </h2>
363
+ {section.servers.length > 0 ? (
364
+ <div className="divide-y divide-border/60 border-y border-border/60">
365
+ {section.servers.map(renderServer)}
366
+ </div>
367
+ ) : (
368
+ <AgentEmptyState
369
+ icon={IconPlugConnected}
370
+ title={`No ${section.label.toLowerCase()} connections yet`}
371
+ description={
372
+ section.label === "Personal"
373
+ ? "Connect a service to give the agent access to it."
374
+ : "Organization connections shared with this workspace will appear here."
375
+ }
376
+ />
377
+ )}
378
+ </section>
379
+ ))}
354
380
  </div>
355
381
  )}
356
382
  <McpIntegrationDialog
357
383
  open={dialogOpen}
358
384
  onOpenChange={setDialogOpen}
359
- defaultScope={activeScope}
385
+ defaultScope="user"
360
386
  canCreateOrgMcp={canCreateOrgMcp}
361
387
  hasOrg={hasOrg}
362
388
  onCreateMcpServer={onCreateMcpServer}
363
389
  />
364
390
  </section>
365
-
366
- <section className="space-y-3 border-t border-border/70 pt-6">
367
- <div>
368
- <h2 className="text-base font-semibold text-foreground">
369
- Remote agents
370
- </h2>
371
- <p className="mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground">
372
- Other agents this app can call through A2A.
373
- </p>
374
- </div>
375
- <div className="rounded-lg border border-border bg-card p-4">
376
- <AgentsSection />
377
- </div>
378
- </section>
379
- </div>
391
+ </AgentTabFrame>
380
392
  );
381
393
  }
382
394
 
@@ -490,130 +502,142 @@ function AccessTab({
490
502
  MCP_CONNECT_GUIDES[0];
491
503
 
492
504
  return (
493
- <div className="space-y-6">
494
- <div>
495
- <h2 className="text-base font-semibold text-foreground">Access</h2>
496
- <p className="mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground">
497
- Choose which external clients can talk to this app&apos;s agent and
498
- follow the setup for each one. Grants, scopes, and revocation will
499
- live here in a future pass.
500
- </p>
501
- </div>
502
- {urls ? (
503
- <>
504
- <CopyField label="MCP URL" value={urls.mcpUrl} />
505
- {agentCardAvailable && (
506
- <CopyField label="A2A agent card" value={urls.agentCardUrl} />
507
- )}
508
- <section className="space-y-3 rounded-lg border border-border bg-card p-4">
509
- <div>
510
- <h3 className="text-sm font-semibold text-foreground">
511
- Client setup
512
- </h3>
513
- <p className="mt-1 text-xs text-muted-foreground">
514
- These instructions are also available on the full connect page.
515
- </p>
516
- </div>
517
- <div
518
- className="flex gap-1 overflow-x-auto border-b border-border pb-2"
519
- role="tablist"
520
- aria-label="Choose your AI assistant"
521
- >
522
- {MCP_CONNECT_GUIDES.map((item) => (
523
- <button
524
- key={item.id}
525
- type="button"
526
- role="tab"
527
- aria-selected={item.id === guide?.id}
528
- onClick={() => setActiveGuide(item.id)}
529
- className={cn(
530
- "shrink-0 cursor-pointer rounded-md px-2.5 py-1.5 text-xs font-medium",
531
- item.id === guide?.id
532
- ? "bg-accent text-foreground"
533
- : "text-muted-foreground hover:bg-accent/50 hover:text-foreground",
534
- )}
535
- >
536
- {item.label}
537
- </button>
538
- ))}
539
- </div>
540
- {guide && templateValues && (
541
- <div className="space-y-3 pt-1" role="tabpanel">
542
- {guide.steps?.length ? (
543
- <ol className="list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground">
544
- {guide.steps.map((step) => (
545
- <li key={step}>
546
- {interpolateMcpConnectTemplate(step, templateValues)}
547
- </li>
548
- ))}
549
- </ol>
550
- ) : null}
551
- {guide.intro && (
552
- <p className="text-xs text-muted-foreground">
553
- {interpolateMcpConnectTemplate(guide.intro, templateValues)}
554
- </p>
555
- )}
556
- {guide.commandTemplate && (
557
- <CopyField
558
- label="Command"
559
- value={interpolateMcpConnectTemplate(
560
- guide.commandTemplate,
561
- templateValues,
562
- )}
563
- />
564
- )}
565
- {guide.configTemplate && (
566
- <CopyField
567
- label="MCP config"
568
- value={interpolateMcpConnectTemplate(
569
- guide.configTemplate,
570
- templateValues,
505
+ <AgentTabFrame
506
+ title="Access"
507
+ description="Choose which external clients can talk to this app's agent."
508
+ >
509
+ <div className="space-y-6">
510
+ {urls ? (
511
+ <>
512
+ <CopyField label="MCP URL" value={urls.mcpUrl} />
513
+ {agentCardAvailable && (
514
+ <CopyField label="A2A agent card" value={urls.agentCardUrl} />
515
+ )}
516
+ <section className="space-y-3 border-t border-border/70 pt-6">
517
+ <div>
518
+ <h3 className="text-sm font-semibold text-foreground">
519
+ Client setup
520
+ </h3>
521
+ <p className="mt-1 text-xs text-muted-foreground">
522
+ These instructions are also available on the full connect
523
+ page.
524
+ </p>
525
+ </div>
526
+ <div
527
+ className="flex gap-1 overflow-x-auto border-b border-border pb-2"
528
+ role="tablist"
529
+ aria-label="Choose your AI assistant"
530
+ >
531
+ {MCP_CONNECT_GUIDES.map((item) => (
532
+ <button
533
+ key={item.id}
534
+ type="button"
535
+ role="tab"
536
+ aria-selected={item.id === guide?.id}
537
+ onClick={() => setActiveGuide(item.id)}
538
+ className={cn(
539
+ "shrink-0 cursor-pointer rounded-md px-2.5 py-1.5 text-xs font-medium",
540
+ item.id === guide?.id
541
+ ? "bg-accent text-foreground"
542
+ : "text-muted-foreground hover:bg-accent/50 hover:text-foreground",
571
543
  )}
572
- />
573
- )}
574
- {guide.action?.kind === "link" && guide.action.href && (
575
- <a
576
- href={guide.action.href}
577
- target="_blank"
578
- rel="noopener noreferrer"
579
- className="inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent"
580
544
  >
581
- {guide.action.label}
582
- <IconExternalLink className="size-3.5" />
583
- </a>
584
- )}
585
- {guide.note && (
586
- <p className="text-xs leading-relaxed text-muted-foreground">
587
- {interpolateMcpConnectTemplate(guide.note, templateValues)}
588
- </p>
589
- )}
545
+ {item.label}
546
+ </button>
547
+ ))}
590
548
  </div>
591
- )}
592
- </section>
593
- <section className="rounded-lg border border-border/70 bg-muted/10 p-4">
594
- <h3 className="text-sm font-semibold text-foreground">
595
- {MCP_STATIC_TOKEN_FALLBACK.title}
596
- </h3>
597
- <p className="mt-1 text-xs leading-relaxed text-muted-foreground">
598
- {MCP_STATIC_TOKEN_FALLBACK.state}. Open the connect page to create
599
- a token for clients that cannot complete OAuth.
600
- </p>
601
- <a
602
- href={urls.connectUrl}
603
- className="mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent"
604
- >
605
- Open full connect page
606
- <IconExternalLink className="size-3.5" />
607
- </a>
608
- </section>
609
- </>
610
- ) : (
611
- <TabLoading />
612
- )}
613
- </div>
549
+ {guide && templateValues && (
550
+ <div className="space-y-3 pt-1" role="tabpanel">
551
+ {guide.steps?.length ? (
552
+ <ol className="list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground">
553
+ {guide.steps.map((step) => (
554
+ <li key={step}>
555
+ {interpolateMcpConnectTemplate(step, templateValues)}
556
+ </li>
557
+ ))}
558
+ </ol>
559
+ ) : null}
560
+ {guide.intro && (
561
+ <p className="text-xs text-muted-foreground">
562
+ {interpolateMcpConnectTemplate(
563
+ guide.intro,
564
+ templateValues,
565
+ )}
566
+ </p>
567
+ )}
568
+ {guide.commandTemplate && (
569
+ <CopyField
570
+ label="Command"
571
+ value={interpolateMcpConnectTemplate(
572
+ guide.commandTemplate,
573
+ templateValues,
574
+ )}
575
+ />
576
+ )}
577
+ {guide.configTemplate && (
578
+ <CopyField
579
+ label="MCP config"
580
+ value={interpolateMcpConnectTemplate(
581
+ guide.configTemplate,
582
+ templateValues,
583
+ )}
584
+ />
585
+ )}
586
+ {guide.action?.kind === "link" && guide.action.href && (
587
+ <a
588
+ href={guide.action.href}
589
+ target="_blank"
590
+ rel="noopener noreferrer"
591
+ className="inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent"
592
+ >
593
+ {guide.action.label}
594
+ <IconExternalLink className="size-3.5" />
595
+ </a>
596
+ )}
597
+ {guide.note && (
598
+ <p className="text-xs leading-relaxed text-muted-foreground">
599
+ {interpolateMcpConnectTemplate(
600
+ guide.note,
601
+ templateValues,
602
+ )}
603
+ </p>
604
+ )}
605
+ </div>
606
+ )}
607
+ </section>
608
+ <section className="border-t border-border/70 pt-6">
609
+ <h3 className="text-sm font-semibold text-foreground">
610
+ {MCP_STATIC_TOKEN_FALLBACK.title}
611
+ </h3>
612
+ <p className="mt-1 text-xs leading-relaxed text-muted-foreground">
613
+ {MCP_STATIC_TOKEN_FALLBACK.state}. Open the connect page to
614
+ create a token for clients that cannot complete OAuth.
615
+ </p>
616
+ <a
617
+ href={urls.connectUrl}
618
+ className="mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent"
619
+ >
620
+ Open full connect page
621
+ <IconExternalLink className="size-3.5" />
622
+ </a>
623
+ </section>
624
+ </>
625
+ ) : (
626
+ <TabLoading />
627
+ )}
628
+ </div>
629
+ </AgentTabFrame>
614
630
  );
615
631
  }
616
632
 
633
+ export interface AgentPageExtraTabContext extends AgentPageTabProps {
634
+ scopeControl: ReactNode;
635
+ }
636
+
637
+ export type AgentPageExtraTabFactory = (
638
+ context: AgentPageExtraTabContext,
639
+ ) => SettingsTabItem;
640
+
617
641
  export interface AgentTabsPageProps {
618
642
  /**
619
643
  * Human-readable app name used in the Access tab's connect instructions
@@ -622,6 +646,8 @@ export interface AgentTabsPageProps {
622
646
  */
623
647
  appName?: string;
624
648
  extraTabs?: SettingsTabItem[];
649
+ /** Scoped app-specific tabs that receive the current Agent workspace scope. */
650
+ extraTabFactories?: AgentPageExtraTabFactory[];
625
651
  defaultTab?: string;
626
652
  className?: string;
627
653
  /** Whether to render the Agent page search box. Defaults to true. */
@@ -635,20 +661,19 @@ export interface AgentTabsPageProps {
635
661
  export function AgentTabsPage({
636
662
  appName,
637
663
  extraTabs = [],
638
- defaultTab = "context",
664
+ extraTabFactories = [],
665
+ defaultTab = "files",
639
666
  className,
640
667
  enableSearch = true,
641
- searchPlaceholder = "Search agent settings",
668
+ searchPlaceholder = "Search agent workspace",
642
669
  hiddenTabs = [],
643
670
  value,
644
671
  onValueChange,
645
672
  }: AgentTabsPageProps) {
646
- const { data: org, isLoading: orgLoading } = useOrg();
647
- const hasOrg = Boolean(org?.orgId);
673
+ const { data: org } = useOrg();
648
674
  const canManageOrg =
649
675
  !org?.orgId || org.role === "owner" || org.role === "admin";
650
- const [scope, setScope] = useState<AgentPageScope>(initialScope);
651
- const scopeInitialized = useRef(false);
676
+ const scope: AgentPageScope = "user";
652
677
  const rootRef = useRef<HTMLDivElement | null>(null);
653
678
  const searchRef = useRef<HTMLInputElement | null>(null);
654
679
  const [query, setQuery] = useState("");
@@ -656,57 +681,121 @@ export function AgentTabsPage({
656
681
  () => new Set(hiddenTabs.map((tab) => normalizeTabId(tab)).filter(Boolean)),
657
682
  [hiddenTabs],
658
683
  );
684
+ const scopeControl: ReactNode = null;
685
+ const scopedExtraTabs = useMemo(
686
+ () =>
687
+ extraTabFactories.map((factory) =>
688
+ factory({ scope, canManageOrg, scopeControl }),
689
+ ),
690
+ [canManageOrg, extraTabFactories, scope, scopeControl],
691
+ );
659
692
 
660
693
  const tabs = useMemo<SettingsTabItem[]>(
661
694
  () => [
662
695
  {
663
- id: "context",
664
- label: "Context",
665
- icon: IconBrain,
666
- keywords: "influence provenance prompt",
696
+ id: "files",
697
+ label: "Files",
698
+ icon: IconFolder,
699
+ group: "resources",
700
+ keywords: "workspace plain files documents uploads",
667
701
  content: (
668
- <div className="space-y-4">
669
- <div>
670
- <h1 className="text-lg font-semibold text-foreground">Context</h1>
671
- <p className="mt-1 text-sm leading-relaxed text-muted-foreground">
672
- See what can influence this agent and why.
673
- </p>
674
- </div>
675
- <div className="min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4">
676
- <Suspense fallback={<TabLoading />}>
677
- <AgentContextTab scope={scope} canManageOrg={canManageOrg} />
678
- </Suspense>
679
- </div>
680
- </div>
702
+ <Suspense fallback={<TabLoading />}>
703
+ <AgentResourceTab scope={scope} view="files" />
704
+ </Suspense>
681
705
  ),
682
706
  },
683
707
  {
684
- id: "files",
685
- label: "Files",
686
- icon: IconFolder,
687
- keywords: "workspace resources instructions skills",
708
+ id: "instructions",
709
+ label: "Instructions",
710
+ icon: IconChecklist,
711
+ group: "resources",
712
+ keywords: "agents md rules preferences guidance",
688
713
  content: (
689
- <div className="space-y-4">
690
- <div>
691
- <h1 className="text-lg font-semibold text-foreground">Files</h1>
692
- <p className="mt-1 text-sm leading-relaxed text-muted-foreground">
693
- Workspace files that shape the agent&apos;s context.
694
- </p>
695
- </div>
696
- <Suspense fallback={<TabLoading />}>
697
- <FilesTab scope={scope} canManageOrg={canManageOrg} />
698
- </Suspense>
699
- </div>
714
+ <Suspense fallback={<TabLoading />}>
715
+ <AgentResourceTab scope={scope} view="instructions" />
716
+ </Suspense>
717
+ ),
718
+ },
719
+ {
720
+ id: "agents",
721
+ label: "Agents",
722
+ icon: IconHierarchy2,
723
+ group: "resources",
724
+ keywords: "custom sub agents delegate profiles",
725
+ content: (
726
+ <Suspense fallback={<TabLoading />}>
727
+ <AgentResourceTab scope={scope} view="agents" />
728
+ </Suspense>
729
+ ),
730
+ },
731
+ {
732
+ id: "memory",
733
+ label: "Memory",
734
+ icon: IconNotes,
735
+ group: "resources",
736
+ keywords: "long term notes memory index recall",
737
+ content: (
738
+ <Suspense fallback={<TabLoading />}>
739
+ <AgentResourceTab scope={scope} view="memory" />
740
+ </Suspense>
741
+ ),
742
+ },
743
+ {
744
+ id: "skills",
745
+ label: "Skills",
746
+ icon: IconBook2,
747
+ group: "resources",
748
+ keywords: "abilities reusable instructions workflows",
749
+ content: (
750
+ <Suspense fallback={<TabLoading />}>
751
+ <AgentResourceTab scope={scope} view="skills" />
752
+ </Suspense>
753
+ ),
754
+ },
755
+ {
756
+ id: "learnings",
757
+ label: "Learnings",
758
+ icon: IconHistory,
759
+ group: "resources",
760
+ keywords: "corrections patterns knowledge feedback",
761
+ content: (
762
+ <Suspense fallback={<TabLoading />}>
763
+ <AgentResourceTab scope={scope} view="learnings" />
764
+ </Suspense>
765
+ ),
766
+ },
767
+ {
768
+ id: "remote-agents",
769
+ label: "Remote agents",
770
+ icon: IconTopologyRing2,
771
+ group: "resources",
772
+ keywords: "a2a connected remote agents delegation",
773
+ content: (
774
+ <Suspense fallback={<TabLoading />}>
775
+ <AgentResourceTab scope={scope} view="remote-agents" />
776
+ </Suspense>
777
+ ),
778
+ },
779
+ {
780
+ id: "snapshots",
781
+ label: "Snapshots",
782
+ icon: IconHistory,
783
+ group: "agent",
784
+ keywords: "context recent loads provenance tokens",
785
+ content: (
786
+ <Suspense fallback={<TabLoading />}>
787
+ <AgentContextTab scope={scope} canManageOrg={canManageOrg} />
788
+ </Suspense>
700
789
  ),
701
790
  },
702
791
  {
703
792
  id: "connections",
704
793
  label: "Connections",
705
794
  icon: IconPlugConnected,
706
- keywords: "mcp servers tools remote agents a2a",
795
+ group: "agent",
796
+ keywords: "mcp servers tools integrations",
707
797
  searchEntries: [
708
798
  { id: "mcp-servers", label: "MCP servers", keywords: "tools" },
709
- { id: "remote-agents", label: "Remote agents", keywords: "a2a" },
710
799
  ],
711
800
  content: <ConnectionsTab scope={scope} canManageOrg={canManageOrg} />,
712
801
  },
@@ -714,27 +803,19 @@ export function AgentTabsPage({
714
803
  id: "jobs",
715
804
  label: "Jobs",
716
805
  icon: IconClock,
806
+ group: "agent",
717
807
  keywords: "scheduled automations recurring",
718
808
  content: (
719
- <div className="space-y-4">
720
- <div>
721
- <h1 className="text-lg font-semibold text-foreground">Jobs</h1>
722
- <p className="mt-1 text-sm leading-relaxed text-muted-foreground">
723
- Scheduled work that can run with this agent.
724
- </p>
725
- </div>
726
- <div className="min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4">
727
- <Suspense fallback={<TabLoading />}>
728
- <AgentJobsTab scope={scope} canManageOrg={canManageOrg} />
729
- </Suspense>
730
- </div>
731
- </div>
809
+ <Suspense fallback={<TabLoading />}>
810
+ <AgentJobsTab scope={scope} canManageOrg={canManageOrg} />
811
+ </Suspense>
732
812
  ),
733
813
  },
734
814
  {
735
815
  id: "access",
736
816
  label: "Access",
737
817
  icon: IconShieldLock,
818
+ group: "agent",
738
819
  keywords: "external clients oauth a2a exposure",
739
820
  searchEntries: [
740
821
  {
@@ -757,8 +838,9 @@ export function AgentTabsPage({
757
838
  ),
758
839
  },
759
840
  ...extraTabs,
841
+ ...scopedExtraTabs,
760
842
  ],
761
- [canManageOrg, extraTabs, scope],
843
+ [appName, canManageOrg, extraTabs, scope, scopedExtraTabs],
762
844
  );
763
845
  const visibleTabs = useMemo(
764
846
  () => tabs.filter((tab) => !normalizedHiddenTabs.has(tab.id)),
@@ -786,22 +868,6 @@ export function AgentTabsPage({
786
868
  return groups;
787
869
  }, [visibleTabs]);
788
870
 
789
- useEffect(() => {
790
- if (scopeInitialized.current || orgLoading) return;
791
- scopeInitialized.current = true;
792
- if (!hasOrg && scope === "org") setScope("user");
793
- }, [hasOrg, orgLoading, scope]);
794
-
795
- useEffect(() => {
796
- if (orgLoading) return;
797
- const resolvedScope = hasOrg ? scope : "user";
798
- if (resolvedScope !== scope) {
799
- setScope(resolvedScope);
800
- return;
801
- }
802
- updateScopeUrl(resolvedScope);
803
- }, [hasOrg, orgLoading, scope]);
804
-
805
871
  useEffect(() => {
806
872
  if (!isControlled && !visibleTabs.some((tab) => tab.id === internalTab)) {
807
873
  setInternalTab(fallbackTab);
@@ -826,15 +892,6 @@ export function AgentTabsPage({
826
892
  [isControlled, onValueChange],
827
893
  );
828
894
 
829
- const changeScope = (next: AgentPageScope) => {
830
- if (next === "org" && !hasOrg) return;
831
- setScope(next);
832
- try {
833
- localStorage.setItem("agent-page-scope", next);
834
- } catch {}
835
- updateScopeUrl(next);
836
- };
837
-
838
895
  const searchIndex = useMemo(() => {
839
896
  const entries: Array<
840
897
  SettingsSearchEntry & { tabId: string; haystack: string }
@@ -893,62 +950,6 @@ export function AgentTabsPage({
893
950
  className,
894
951
  )}
895
952
  >
896
- <header className="flex shrink-0 flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3 sm:px-6">
897
- <div>
898
- <h1 className="text-base font-semibold text-foreground">Agent</h1>
899
- <p className="mt-0.5 text-xs text-muted-foreground">
900
- What can influence this agent, and why.
901
- </p>
902
- </div>
903
- <div className="flex items-center gap-2">
904
- <span className="text-xs text-muted-foreground">Scope</span>
905
- <div
906
- className="flex rounded-md border border-border bg-muted/30 p-0.5"
907
- role="radiogroup"
908
- aria-label="Agent scope"
909
- >
910
- <button
911
- type="button"
912
- role="radio"
913
- aria-checked={scope !== "org" || !hasOrg}
914
- onClick={() => changeScope("user")}
915
- className={cn(
916
- "cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium",
917
- scope !== "org" || !hasOrg
918
- ? "bg-background text-foreground shadow-sm"
919
- : "text-muted-foreground hover:text-foreground",
920
- )}
921
- >
922
- Personal
923
- </button>
924
- {hasOrg && (
925
- <Tooltip>
926
- <TooltipTrigger asChild>
927
- <button
928
- type="button"
929
- role="radio"
930
- aria-checked={scope === "org"}
931
- onClick={() => changeScope("org")}
932
- className={cn(
933
- "cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium",
934
- scope === "org"
935
- ? "bg-background text-foreground shadow-sm"
936
- : "text-muted-foreground hover:text-foreground",
937
- )}
938
- >
939
- Organization
940
- </button>
941
- </TooltipTrigger>
942
- {!canManageOrg && (
943
- <TooltipContent>
944
- Organization settings are read-only for members.
945
- </TooltipContent>
946
- )}
947
- </Tooltip>
948
- )}
949
- </div>
950
- </div>
951
- </header>
952
953
  <div className="flex min-h-0 flex-1 flex-col sm:flex-row">
953
954
  <div className="flex shrink-0 flex-col gap-2 bg-background p-2 sm:min-h-0 sm:w-56 sm:overflow-y-auto sm:p-3">
954
955
  {enableSearch ? (
@@ -990,7 +991,7 @@ export function AgentTabsPage({
990
991
  >
991
992
  {results.length === 0 ? (
992
993
  <p className="px-2 py-6 text-center text-xs text-muted-foreground">
993
- No matching agent settings
994
+ No matching agent workspace items
994
995
  </p>
995
996
  ) : (
996
997
  results.map((entry) => (
@@ -1028,6 +1029,16 @@ export function AgentTabsPage({
1028
1029
  "sm:mt-2 sm:border-t sm:border-border/60 sm:pt-2",
1029
1030
  )}
1030
1031
  >
1032
+ {group.id === "resources" && (
1033
+ <div className="hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block">
1034
+ Agent resources
1035
+ </div>
1036
+ )}
1037
+ {group.id === "agent" && (
1038
+ <div className="hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block">
1039
+ Agent operations
1040
+ </div>
1041
+ )}
1031
1042
  <div className="contents sm:flex sm:flex-col sm:gap-1">
1032
1043
  {group.tabs.map((tab) => {
1033
1044
  const Icon = tab.icon as SettingsTabIcon | undefined;
@@ -1036,6 +1047,7 @@ export function AgentTabsPage({
1036
1047
  <button
1037
1048
  key={tab.id}
1038
1049
  type="button"
1050
+ id={`agent-tab-${tab.id}`}
1039
1051
  role="tab"
1040
1052
  aria-selected={selected}
1041
1053
  aria-controls={`agent-tabpanel-${tab.id}`}