@agent-native/core 0.103.0 → 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 (572) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +36 -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/vite/client.ts +2 -0
  74. package/corpus/core/src/workspace-connections/index.ts +6 -0
  75. package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
  76. package/corpus/core/src/workspace-connections/store.ts +16 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
  78. package/corpus/templates/analytics/AGENTS.md +9 -0
  79. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
  80. package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
  81. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
  82. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
  83. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
  84. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
  85. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
  86. package/corpus/templates/analytics/app/i18n-data.ts +3 -3
  87. package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
  88. package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
  91. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  92. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
  93. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
  98. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
  99. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
  100. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
  101. package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
  102. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  103. package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
  104. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
  105. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
  106. package/corpus/templates/assets/AGENTS.md +10 -0
  107. package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
  108. package/corpus/templates/assets/actions/edit-image.ts +2 -0
  109. package/corpus/templates/assets/actions/generate-asset.ts +52 -0
  110. package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
  111. package/corpus/templates/assets/actions/generate-image.ts +219 -1
  112. package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
  113. package/corpus/templates/assets/actions/refine-image.ts +3 -0
  114. package/corpus/templates/assets/actions/restyle-image.ts +2 -0
  115. package/corpus/templates/assets/agent-native.app-skill.json +4 -0
  116. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
  117. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  118. package/corpus/templates/assets/app/i18n-data.ts +29 -13
  119. package/corpus/templates/assets/app/routes/agent.tsx +7 -1
  120. package/corpus/templates/assets/app/routes/library.tsx +9 -0
  121. package/corpus/templates/assets/app/routes/settings.tsx +3 -0
  122. package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
  123. package/corpus/templates/assets/package.json +1 -0
  124. package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
  125. package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
  126. package/corpus/templates/brain/app/i18n-data.ts +3 -3
  127. package/corpus/templates/brain/app/lib/brain.ts +1 -1
  128. package/corpus/templates/brain/server/lib/search.ts +17 -67
  129. package/corpus/templates/calendar/app/i18n-data.ts +3 -3
  130. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
  131. package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
  132. package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
  133. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  134. package/corpus/templates/clips/AGENTS.md +4 -0
  135. package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
  136. package/corpus/templates/clips/actions/create-meeting.ts +6 -2
  137. package/corpus/templates/clips/actions/create-organization.ts +3 -2
  138. package/corpus/templates/clips/actions/create-recording.ts +4 -1
  139. package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
  140. package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
  141. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
  142. package/corpus/templates/clips/actions/list-meetings.ts +23 -5
  143. package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
  144. package/corpus/templates/clips/actions/remove-silences.ts +10 -1
  145. package/corpus/templates/clips/actions/request-transcript.ts +53 -11
  146. package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
  147. package/corpus/templates/clips/actions/search-recordings.ts +5 -8
  148. package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
  149. package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
  150. package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
  151. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
  152. package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
  153. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
  154. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
  155. package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
  156. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
  157. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
  158. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  159. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  160. package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
  161. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  162. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  163. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  164. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  165. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  166. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  167. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
  168. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
  169. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
  170. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
  171. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
  172. package/corpus/templates/clips/app/routes/record.tsx +23 -2
  173. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
  174. package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
  182. package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
  183. package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
  186. package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
  187. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  188. package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
  189. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
  190. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
  191. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
  192. package/corpus/templates/clips/desktop/src/app.tsx +66 -28
  193. package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
  194. package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
  195. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
  196. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
  197. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
  198. package/corpus/templates/clips/desktop/src/styles.css +13 -11
  199. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
  200. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  201. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
  202. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
  203. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
  204. package/corpus/templates/clips/server/db/schema.ts +2 -2
  205. package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
  206. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
  207. package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
  208. package/corpus/templates/clips/server/lib/recordings.ts +40 -1
  209. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  210. package/corpus/templates/clips/server/plugins/db.ts +2 -2
  211. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
  212. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
  213. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
  214. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
  215. package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
  216. package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
  217. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
  218. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
  219. package/corpus/templates/content/AGENTS.md +9 -0
  220. package/corpus/templates/content/actions/create-document.ts +94 -0
  221. package/corpus/templates/content/actions/edit-document.ts +144 -4
  222. package/corpus/templates/content/actions/update-document.ts +138 -0
  223. package/corpus/templates/content/agent-native.app-skill.json +4 -0
  224. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
  225. package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
  226. package/corpus/templates/content/app/i18n-data.ts +13 -4
  227. package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
  228. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
  229. package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
  230. package/corpus/templates/content/package.json +1 -0
  231. package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
  232. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
  233. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  234. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  235. package/corpus/templates/design/AGENTS.md +6 -0
  236. package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
  237. package/corpus/templates/design/actions/edit-design.ts +128 -0
  238. package/corpus/templates/design/actions/generate-design.ts +278 -14
  239. package/corpus/templates/design/actions/generate-screens.ts +42 -1
  240. package/corpus/templates/design/agent-native.app-skill.json +4 -0
  241. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
  242. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  243. package/corpus/templates/design/app/i18n-data.ts +10 -4
  244. package/corpus/templates/design/app/routes/agent.tsx +2 -1
  245. package/corpus/templates/design/app/routes/settings.tsx +3 -0
  246. package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
  247. package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  248. package/corpus/templates/design/package.json +1 -0
  249. package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
  250. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
  251. package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
  252. package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
  253. package/corpus/templates/design/shared/generation-session.ts +7 -0
  254. package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
  255. package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
  256. package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
  257. package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
  258. package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
  259. package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
  260. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
  261. package/corpus/templates/plan/AGENTS.md +21 -1
  262. package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
  263. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
  264. package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
  265. package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
  266. package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
  267. package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
  268. package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
  269. package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
  270. package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
  271. package/corpus/templates/plan/server/plan-mdx.ts +75 -2
  272. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
  273. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
  274. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
  275. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
  276. package/corpus/templates/slides/AGENTS.md +6 -0
  277. package/corpus/templates/slides/actions/add-slide.ts +230 -14
  278. package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
  279. package/corpus/templates/slides/actions/create-deck.ts +130 -0
  280. package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
  281. package/corpus/templates/slides/actions/import-file.ts +5 -4
  282. package/corpus/templates/slides/actions/patch-deck.ts +200 -10
  283. package/corpus/templates/slides/actions/update-slide.ts +208 -15
  284. package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
  285. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
  286. package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
  287. package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
  288. package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
  289. package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
  290. package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
  291. package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
  292. package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
  293. package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
  294. package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
  295. package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
  296. package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
  297. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
  298. package/corpus/templates/slides/app/routes/agent.tsx +7 -1
  299. package/corpus/templates/slides/app/routes/settings.tsx +3 -0
  300. package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
  301. package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
  302. package/corpus/templates/slides/package.json +1 -0
  303. package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
  304. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
  305. package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
  306. package/dist/agent/engine/credential-errors.d.ts +1 -1
  307. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  308. package/dist/agent/engine/credential-errors.js +2 -2
  309. package/dist/agent/engine/credential-errors.js.map +1 -1
  310. package/dist/agent/production-agent.d.ts.map +1 -1
  311. package/dist/agent/production-agent.js +25 -0
  312. package/dist/agent/production-agent.js.map +1 -1
  313. package/dist/agent/run-store.d.ts.map +1 -1
  314. package/dist/agent/run-store.js +12 -2
  315. package/dist/agent/run-store.js.map +1 -1
  316. package/dist/cli/create.d.ts.map +1 -1
  317. package/dist/cli/create.js +1 -0
  318. package/dist/cli/create.js.map +1 -1
  319. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  320. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  321. package/dist/cli/skills-content/visual-plan-skill.js +30 -11
  322. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  323. package/dist/cli/templates-meta.d.ts.map +1 -1
  324. package/dist/cli/templates-meta.js +4 -3
  325. package/dist/cli/templates-meta.js.map +1 -1
  326. package/dist/client/AgentAskPopover.d.ts +11 -0
  327. package/dist/client/AgentAskPopover.d.ts.map +1 -0
  328. package/dist/client/AgentAskPopover.js +30 -0
  329. package/dist/client/AgentAskPopover.js.map +1 -0
  330. package/dist/client/AgentChatHome.d.ts +1 -1
  331. package/dist/client/AgentChatHome.d.ts.map +1 -1
  332. package/dist/client/AgentChatHome.js +2 -2
  333. package/dist/client/AgentChatHome.js.map +1 -1
  334. package/dist/client/AgentPanel.d.ts +9 -19
  335. package/dist/client/AgentPanel.d.ts.map +1 -1
  336. package/dist/client/AgentPanel.js +119 -80
  337. package/dist/client/AgentPanel.js.map +1 -1
  338. package/dist/client/AssistantChat.d.ts.map +1 -1
  339. package/dist/client/AssistantChat.js +4 -4
  340. package/dist/client/AssistantChat.js.map +1 -1
  341. package/dist/client/MultiTabAssistantChat.d.ts +3 -9
  342. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  343. package/dist/client/MultiTabAssistantChat.js +49 -189
  344. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  345. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  346. package/dist/client/agent-chat-adapter.js +12 -1
  347. package/dist/client/agent-chat-adapter.js.map +1 -1
  348. package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
  349. package/dist/client/agent-page/AgentContextTab.js +26 -28
  350. package/dist/client/agent-page/AgentContextTab.js.map +1 -1
  351. package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
  352. package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
  353. package/dist/client/agent-page/AgentEmptyState.js +6 -0
  354. package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
  355. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
  356. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  357. package/dist/client/agent-page/AgentJobsTab.js +90 -58
  358. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  359. package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
  360. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
  361. package/dist/client/agent-page/AgentTabFrame.js +7 -0
  362. package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
  363. package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
  364. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  365. package/dist/client/agent-page/AgentTabsPage.js +135 -99
  366. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  367. package/dist/client/agent-page/types.d.ts +1 -1
  368. package/dist/client/agent-page/types.d.ts.map +1 -1
  369. package/dist/client/agent-page/types.js.map +1 -1
  370. package/dist/client/analytics.d.ts +10 -3
  371. package/dist/client/analytics.d.ts.map +1 -1
  372. package/dist/client/analytics.js +37 -2
  373. package/dist/client/analytics.js.map +1 -1
  374. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  375. package/dist/client/chat/run-recovery.js +10 -3
  376. package/dist/client/chat/run-recovery.js.map +1 -1
  377. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  378. package/dist/client/composer/PromptComposer.js +2 -2
  379. package/dist/client/composer/PromptComposer.js.map +1 -1
  380. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  381. package/dist/client/composer/TiptapComposer.js +15 -3
  382. package/dist/client/composer/TiptapComposer.js.map +1 -1
  383. package/dist/client/dynamic-suggestions.js +3 -3
  384. package/dist/client/dynamic-suggestions.js.map +1 -1
  385. package/dist/client/index.d.ts +4 -3
  386. package/dist/client/index.d.ts.map +1 -1
  387. package/dist/client/index.js +3 -2
  388. package/dist/client/index.js.map +1 -1
  389. package/dist/client/resources/ResourceTree.d.ts +5 -1
  390. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  391. package/dist/client/resources/ResourceTree.js +74 -5
  392. package/dist/client/resources/ResourceTree.js.map +1 -1
  393. package/dist/client/resources/ResourcesPanel.d.ts +11 -2
  394. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  395. package/dist/client/resources/ResourcesPanel.js +105 -31
  396. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  397. package/dist/client/session-replay.d.ts +28 -0
  398. package/dist/client/session-replay.d.ts.map +1 -1
  399. package/dist/client/session-replay.js +122 -8
  400. package/dist/client/session-replay.js.map +1 -1
  401. package/dist/client/settings/AutomationsSection.d.ts +3 -1
  402. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  403. package/dist/client/settings/AutomationsSection.js +16 -6
  404. package/dist/client/settings/AutomationsSection.js.map +1 -1
  405. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  406. package/dist/client/settings/SettingsPanel.js +3 -3
  407. package/dist/client/settings/SettingsPanel.js.map +1 -1
  408. package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
  409. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  410. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  411. package/dist/client/settings/agent-settings-search.js +2 -2
  412. package/dist/client/settings/agent-settings-search.js.map +1 -1
  413. package/dist/client/use-chat-threads.d.ts +2 -0
  414. package/dist/client/use-chat-threads.d.ts.map +1 -1
  415. package/dist/client/use-chat-threads.js.map +1 -1
  416. package/dist/collab/awareness.d.ts +2 -2
  417. package/dist/collab/awareness.d.ts.map +1 -1
  418. package/dist/collab/routes.d.ts +1 -1
  419. package/dist/connections/catalog.d.ts +41 -7
  420. package/dist/connections/catalog.d.ts.map +1 -1
  421. package/dist/connections/catalog.js +40 -7
  422. package/dist/connections/catalog.js.map +1 -1
  423. package/dist/db/index.d.ts +2 -2
  424. package/dist/db/index.d.ts.map +1 -1
  425. package/dist/db/index.js +2 -2
  426. package/dist/db/index.js.map +1 -1
  427. package/dist/extensions/actions.d.ts.map +1 -1
  428. package/dist/extensions/actions.js +85 -15
  429. package/dist/extensions/actions.js.map +1 -1
  430. package/dist/extensions/content-patch.d.ts +4 -0
  431. package/dist/extensions/content-patch.d.ts.map +1 -1
  432. package/dist/extensions/content-patch.js +18 -0
  433. package/dist/extensions/content-patch.js.map +1 -1
  434. package/dist/extensions/routes.d.ts.map +1 -1
  435. package/dist/extensions/routes.js +14 -0
  436. package/dist/extensions/routes.js.map +1 -1
  437. package/dist/extensions/store.d.ts +1 -0
  438. package/dist/extensions/store.d.ts.map +1 -1
  439. package/dist/extensions/store.js +4 -1
  440. package/dist/extensions/store.js.map +1 -1
  441. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  442. package/dist/index.d.ts +1 -1
  443. package/dist/index.d.ts.map +1 -1
  444. package/dist/index.js +1 -1
  445. package/dist/index.js.map +1 -1
  446. package/dist/ingestion/docx.d.ts +16 -0
  447. package/dist/ingestion/docx.d.ts.map +1 -0
  448. package/dist/ingestion/docx.js +129 -0
  449. package/dist/ingestion/docx.js.map +1 -0
  450. package/dist/ingestion/figma-node-to-html.d.ts +304 -0
  451. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
  452. package/dist/ingestion/figma-node-to-html.js +1292 -0
  453. package/dist/ingestion/figma-node-to-html.js.map +1 -0
  454. package/dist/ingestion/figma.d.ts +115 -0
  455. package/dist/ingestion/figma.d.ts.map +1 -0
  456. package/dist/ingestion/figma.js +399 -0
  457. package/dist/ingestion/figma.js.map +1 -0
  458. package/dist/ingestion/index.d.ts +11 -0
  459. package/dist/ingestion/index.d.ts.map +1 -0
  460. package/dist/ingestion/index.js +11 -0
  461. package/dist/ingestion/index.js.map +1 -0
  462. package/dist/ingestion/media.d.ts +36 -0
  463. package/dist/ingestion/media.d.ts.map +1 -0
  464. package/dist/ingestion/media.js +178 -0
  465. package/dist/ingestion/media.js.map +1 -0
  466. package/dist/ingestion/notion.d.ts +12 -0
  467. package/dist/ingestion/notion.d.ts.map +1 -0
  468. package/dist/ingestion/notion.js +104 -0
  469. package/dist/ingestion/notion.js.map +1 -0
  470. package/dist/ingestion/office.d.ts +45 -0
  471. package/dist/ingestion/office.d.ts.map +1 -0
  472. package/dist/ingestion/office.js +141 -0
  473. package/dist/ingestion/office.js.map +1 -0
  474. package/dist/ingestion/orchestration.d.ts +52 -0
  475. package/dist/ingestion/orchestration.d.ts.map +1 -0
  476. package/dist/ingestion/orchestration.js +89 -0
  477. package/dist/ingestion/orchestration.js.map +1 -0
  478. package/dist/ingestion/pptx.d.ts +28 -0
  479. package/dist/ingestion/pptx.d.ts.map +1 -0
  480. package/dist/ingestion/pptx.js +255 -0
  481. package/dist/ingestion/pptx.js.map +1 -0
  482. package/dist/ingestion/selection.d.ts +20 -0
  483. package/dist/ingestion/selection.d.ts.map +1 -0
  484. package/dist/ingestion/selection.js +52 -0
  485. package/dist/ingestion/selection.js.map +1 -0
  486. package/dist/ingestion/website.d.ts +27 -0
  487. package/dist/ingestion/website.d.ts.map +1 -0
  488. package/dist/ingestion/website.js +100 -0
  489. package/dist/ingestion/website.js.map +1 -0
  490. package/dist/integrations/plugin.d.ts.map +1 -1
  491. package/dist/integrations/plugin.js +32 -27
  492. package/dist/integrations/plugin.js.map +1 -1
  493. package/dist/localization/default-messages.d.ts +22 -0
  494. package/dist/localization/default-messages.d.ts.map +1 -1
  495. package/dist/localization/default-messages.js +31 -9
  496. package/dist/localization/default-messages.js.map +1 -1
  497. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  498. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  499. package/dist/observability/hosted-model-experiment.js +90 -0
  500. package/dist/observability/hosted-model-experiment.js.map +1 -0
  501. package/dist/observability/routes.d.ts +5 -5
  502. package/dist/observability/traces.d.ts.map +1 -1
  503. package/dist/observability/traces.js +5 -3
  504. package/dist/observability/traces.js.map +1 -1
  505. package/dist/progress/routes.d.ts +1 -1
  506. package/dist/provider-api/index.d.ts +35 -4
  507. package/dist/provider-api/index.d.ts.map +1 -1
  508. package/dist/provider-api/index.js +339 -8
  509. package/dist/provider-api/index.js.map +1 -1
  510. package/dist/resources/handlers.d.ts +1 -1
  511. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  512. package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
  513. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  514. package/dist/search-utils/index.d.ts +12 -0
  515. package/dist/search-utils/index.d.ts.map +1 -0
  516. package/dist/search-utils/index.js +95 -0
  517. package/dist/search-utils/index.js.map +1 -0
  518. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  519. package/dist/secrets/register-framework-secrets.js +57 -0
  520. package/dist/secrets/register-framework-secrets.js.map +1 -1
  521. package/dist/secrets/routes.d.ts +9 -9
  522. package/dist/server/action-discovery.d.ts +8 -0
  523. package/dist/server/action-discovery.d.ts.map +1 -1
  524. package/dist/server/action-discovery.js +26 -9
  525. package/dist/server/action-discovery.js.map +1 -1
  526. package/dist/server/agent-chat/framework-prompts.js +2 -2
  527. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  528. package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
  529. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  530. package/dist/server/agent-chat/prompt-resources.js +95 -0
  531. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  532. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  533. package/dist/server/agent-chat-plugin.js +7 -0
  534. package/dist/server/agent-chat-plugin.js.map +1 -1
  535. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  536. package/dist/server/core-routes-plugin.js +5 -0
  537. package/dist/server/core-routes-plugin.js.map +1 -1
  538. package/dist/server/index.d.ts +5 -1
  539. package/dist/server/index.d.ts.map +1 -1
  540. package/dist/server/index.js +5 -1
  541. package/dist/server/index.js.map +1 -1
  542. package/dist/server/workspace-provider-oauth.d.ts +48 -0
  543. package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
  544. package/dist/server/workspace-provider-oauth.js +415 -0
  545. package/dist/server/workspace-provider-oauth.js.map +1 -0
  546. package/dist/styles/agent-native.css +9 -0
  547. package/dist/templates/chat/app/i18n/en-US.ts +3 -3
  548. package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
  549. package/dist/templates/default/app/i18n/en-US.ts +3 -3
  550. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  551. package/dist/templates/workspace-root/.env.example +12 -0
  552. package/dist/vite/client.d.ts.map +1 -1
  553. package/dist/vite/client.js +2 -0
  554. package/dist/vite/client.js.map +1 -1
  555. package/dist/workspace-connections/index.d.ts +1 -0
  556. package/dist/workspace-connections/index.d.ts.map +1 -1
  557. package/dist/workspace-connections/index.js +1 -0
  558. package/dist/workspace-connections/index.js.map +1 -1
  559. package/dist/workspace-connections/lifecycle.d.ts +16 -0
  560. package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
  561. package/dist/workspace-connections/lifecycle.js +14 -0
  562. package/dist/workspace-connections/lifecycle.js.map +1 -0
  563. package/dist/workspace-connections/store.d.ts.map +1 -1
  564. package/dist/workspace-connections/store.js +16 -0
  565. package/dist/workspace-connections/store.js.map +1 -1
  566. package/package.json +10 -3
  567. package/src/templates/chat/app/i18n/en-US.ts +3 -3
  568. package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
  569. package/src/templates/chat/app/lib/agent-page.tsx +10 -1
  570. package/src/templates/default/app/i18n/en-US.ts +3 -3
  571. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  572. package/src/templates/workspace-root/.env.example +12 -0
@@ -1,9 +1,8 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { IconBrain, IconClock, IconExternalLink, IconFolder, IconPlugConnected, IconSearch, IconShieldLock, IconX, } from "@tabler/icons-react";
2
+ import { IconBook2, IconChecklist, IconClock, IconExternalLink, IconFolder, IconHistory, IconHierarchy2, IconNotes, IconPlugConnected, IconTopologyRing2, IconSearch, IconShieldLock, IconX, } from "@tabler/icons-react";
3
3
  import { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState, } from "react";
4
4
  import { MCP_CONNECT_GUIDES, MCP_CONNECT_MCP_URL_TEMPLATE, MCP_STATIC_TOKEN_FALLBACK, interpolateMcpConnectTemplate, } from "../../shared/mcp-connect-content.js";
5
5
  import { appPath } from "../api-path.js";
6
- import { Tooltip, TooltipContent, TooltipTrigger, } from "../components/ui/tooltip.js";
7
6
  import { useT } from "../i18n.js";
8
7
  import { useOrg } from "../org/hooks.js";
9
8
  import { McpIntegrationDialog,
@@ -12,8 +11,9 @@ import { McpIntegrationDialog,
12
11
  } from "../resources/McpIntegrationDialog.js";
13
12
  import { McpServerDetail } from "../resources/McpServerDetail.js";
14
13
  import { useCreateMcpServer, useDeleteMcpServer, useMcpServers, } from "../resources/use-mcp-servers.js";
15
- import { AgentsSection } from "../settings/AgentsSection.js";
16
14
  import { cn } from "../utils.js";
15
+ import { AgentEmptyState } from "./AgentEmptyState.js";
16
+ import { AgentTabFrame } from "./AgentTabFrame.js";
17
17
  const AgentContextTab = lazy(() => import("./AgentContextTab.js").then((module) => ({
18
18
  default: module.AgentContextTab,
19
19
  })));
@@ -36,6 +36,9 @@ function resolveTabId(tabs, value) {
36
36
  const normalized = normalizeTabId(value);
37
37
  if (!normalized)
38
38
  return null;
39
+ if (normalized === "context" && tabs.some((tab) => tab.id === "snapshots")) {
40
+ return "snapshots";
41
+ }
39
42
  if (tabs.some((tab) => tab.id === normalized))
40
43
  return normalized;
41
44
  const section = normalized.split(":", 1)[0];
@@ -45,41 +48,48 @@ function resolveTabId(tabs, value) {
45
48
  function updateTabHash(tabId) {
46
49
  if (typeof window === "undefined")
47
50
  return;
48
- const hash = tabId === "context" ? "" : `#${encodeURIComponent(tabId)}`;
51
+ const hash = tabId === "files" ? "" : `#${encodeURIComponent(tabId)}`;
49
52
  window.history.pushState(null, "", `${window.location.pathname}${window.location.search}${hash}`);
50
53
  }
51
- function initialScope() {
52
- if (typeof window === "undefined")
53
- return "user";
54
- try {
55
- const queryScope = new URLSearchParams(window.location.search).get("scope");
56
- if (queryScope === "org" || queryScope === "user")
57
- return queryScope;
58
- return localStorage.getItem("agent-page-scope") === "org" ? "org" : "user";
59
- }
60
- catch {
61
- return "user";
62
- }
63
- }
64
- function updateScopeUrl(scope) {
65
- if (typeof window === "undefined")
66
- return;
67
- const search = new URLSearchParams(window.location.search);
68
- search.set("scope", scope);
69
- const query = search.toString();
70
- window.history.replaceState(null, "", `${window.location.pathname}${query ? `?${query}` : ""}${window.location.hash}`);
71
- }
72
54
  function TabLoading() {
73
55
  return (_jsxs("div", { className: "space-y-3", "aria-busy": "true", children: [_jsx("div", { className: "h-5 w-36 animate-pulse rounded bg-muted" }), _jsx("div", { className: "h-20 animate-pulse rounded-lg border border-border bg-muted/30" }), _jsx("div", { className: "h-20 animate-pulse rounded-lg border border-border bg-muted/30" })] }));
74
56
  }
75
57
  function EmptySlot({ label }) {
76
58
  return (_jsx("div", { className: "flex min-h-[220px] items-center justify-center rounded-lg border border-dashed border-border/70 bg-muted/10", children: _jsx("span", { className: "sr-only", children: label }) }));
77
59
  }
78
- function FilesTab({ scope }) {
79
- return (_jsx("div", { className: "h-[calc(100vh-14rem)] min-h-[480px]", children: _jsx(ResourcesPanel, { showMcpServers: false, scope: scope === "org" ? "shared" : "personal" }, scope) }));
80
- }
81
- function ScopeBadge({ scope }) {
82
- return (_jsx("span", { className: "rounded-full border border-border bg-muted/40 px-2 py-0.5 text-[10px] font-medium text-muted-foreground", children: scope === "user" ? "Personal" : "Organization" }));
60
+ const RESOURCE_TAB_COPY = {
61
+ files: {
62
+ title: "Files",
63
+ description: "Plain workspace files the agent can read and write.",
64
+ },
65
+ instructions: {
66
+ title: "Instructions",
67
+ description: "The rules, preferences, and project guidance that steer the agent.",
68
+ },
69
+ agents: {
70
+ title: "Agents",
71
+ description: "Reusable profiles for focused sub-agents and delegated work.",
72
+ },
73
+ memory: {
74
+ title: "Memory",
75
+ description: "Durable notes the agent can retrieve across conversations.",
76
+ },
77
+ skills: {
78
+ title: "Skills",
79
+ description: "Specialized instructions that give the agent repeatable abilities.",
80
+ },
81
+ learnings: {
82
+ title: "Learnings",
83
+ description: "Corrections and patterns worth carrying forward for future work.",
84
+ },
85
+ "remote-agents": {
86
+ title: "Remote agents",
87
+ description: "Other agents this workspace can call through A2A.",
88
+ },
89
+ };
90
+ function AgentResourceTab({ scope, view, }) {
91
+ const copy = RESOURCE_TAB_COPY[view];
92
+ return (_jsx(AgentTabFrame, { title: copy.title, description: copy.description, children: _jsx("div", { className: "min-h-[480px]", children: _jsx(ResourcesPanel, { showMcpServers: false, resourceFilter: view, resourceTreeVariant: view === "files" ? "tree" : "collection", scope: "personal" }, `${scope}-${view}`) }) }));
83
93
  }
84
94
  function ServerStatus({ server }) {
85
95
  if (server.status.state === "connected") {
@@ -90,7 +100,7 @@ function ServerStatus({ server }) {
90
100
  }
91
101
  return (_jsx("span", { className: "text-[11px] text-muted-foreground", children: "Status unknown" }));
92
102
  }
93
- function ConnectionsTab({ scope, canManageOrg = false }) {
103
+ function ConnectionsTab({ canManageOrg = false }) {
94
104
  const t = useT();
95
105
  const serversQuery = useMcpServers();
96
106
  const createServer = useCreateMcpServer();
@@ -102,7 +112,6 @@ function ConnectionsTab({ scope, canManageOrg = false }) {
102
112
  const data = serversQuery.data;
103
113
  const hasOrg = Boolean(data?.orgId);
104
114
  const canCreateOrgMcp = hasOrg && canManageOrg;
105
- const activeScope = scope === "org" ? "org" : "user";
106
115
  const onCreateMcpServer = useCallback(async (args) => {
107
116
  if (args.scope === "org" && !canCreateOrgMcp) {
108
117
  throw new Error("Only organization admins can add organization MCP servers.");
@@ -132,12 +141,17 @@ function ConnectionsTab({ scope, canManageOrg = false }) {
132
141
  const key = `${server.scope}:${server.id}`;
133
142
  const canDelete = server.scope === "user" || canManageOrg;
134
143
  const selected = selectedServer?.id === server.id && selectedServer.scope === server.scope;
135
- return (_jsxs("div", { className: cn("rounded-lg border border-border bg-card p-3 transition-colors", selected && "border-foreground/30 bg-accent/20"), children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsxs("button", { type: "button", onClick: () => setSelectedServer(selected ? null : server), className: "min-w-0 flex-1 cursor-pointer text-start", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "truncate text-sm font-medium text-foreground", children: server.name }), _jsx(ScopeBadge, { scope: server.scope }), server.scope === activeScope && (_jsx("span", { className: "text-[10px] text-muted-foreground", children: "Selected scope" }))] }), _jsx("code", { className: "mt-1 block truncate text-[11px] text-muted-foreground", children: server.url }), _jsxs("div", { className: "mt-2 flex items-center gap-2", children: [_jsx(ServerStatus, { server: server }), server.description && (_jsx("span", { className: "truncate text-[11px] text-muted-foreground/70", children: server.description }))] })] }), canDelete && (_jsx("button", { type: "button", onClick: () => void removeServer(server), disabled: deleteServer.isPending, className: cn("cursor-pointer rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground hover:bg-destructive/10 hover:text-destructive", deleteTarget === key && "bg-destructive/10 text-destructive"), children: deleteTarget === key ? "Confirm" : "Delete" }))] }), selected && (_jsx("div", { className: "mt-3 border-t border-border/70 pt-3", children: _jsx(McpServerDetail, { server: server }) }))] }, key));
144
+ return (_jsxs("div", { className: cn("group/connection-row py-4 transition-colors first:pt-5 last:pb-5", selected && "bg-accent/20"), children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsxs("button", { type: "button", onClick: () => setSelectedServer(selected ? null : server), className: "min-w-0 flex-1 cursor-pointer text-start", children: [_jsx("div", { className: "flex flex-wrap items-center gap-2", children: _jsx("span", { className: "truncate text-sm font-medium text-foreground", children: server.name }) }), _jsx("code", { className: "mt-1 block truncate text-[11px] text-muted-foreground", children: server.url }), _jsxs("div", { className: "mt-2 flex items-center gap-2", children: [_jsx(ServerStatus, { server: server }), server.description && (_jsx("span", { className: "truncate text-[11px] text-muted-foreground/70", children: server.description }))] })] }), canDelete && (_jsx("button", { type: "button", onClick: () => void removeServer(server), disabled: deleteServer.isPending, className: cn("cursor-pointer rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground hover:bg-destructive/10 hover:text-destructive", deleteTarget === key && "bg-destructive/10 text-destructive"), children: deleteTarget === key ? "Confirm" : "Delete" }))] }), selected && (_jsx("div", { className: "mt-3 border-t border-border/70 pt-3", children: _jsx(McpServerDetail, { server: server }) }))] }, key));
136
145
  };
137
- return (_jsxs("div", { className: "space-y-8", children: [_jsxs("section", { className: "space-y-3", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-base font-semibold text-foreground", children: "MCP servers" }), _jsx("p", { className: "mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground", children: "Tools and services this agent can reach. The page scope controls where new servers are saved." })] }), _jsx("button", { type: "button", onClick: () => {
138
- setError(null);
139
- setDialogOpen(true);
140
- }, className: "cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90", children: t("mcpIntegrations.connect") })] }), error && (_jsx("p", { className: "rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive", children: error })), serversQuery.isLoading ? (_jsx(TabLoading, {})) : serversQuery.isError ? (_jsx("p", { className: "rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive", children: "Could not load MCP servers." })) : data && data.user.length + data.org.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [data.user.map(renderServer), data.org.map(renderServer)] })) : (_jsx("div", { className: "rounded-lg border border-dashed border-border p-5 text-sm text-muted-foreground", children: "No MCP servers are connected yet." })), _jsx(McpIntegrationDialog, { open: dialogOpen, onOpenChange: setDialogOpen, defaultScope: activeScope, canCreateOrgMcp: canCreateOrgMcp, hasOrg: hasOrg, onCreateMcpServer: onCreateMcpServer })] }), _jsxs("section", { className: "space-y-3 border-t border-border/70 pt-6", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-base font-semibold text-foreground", children: "Remote agents" }), _jsx("p", { className: "mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground", children: "Other agents this app can call through A2A." })] }), _jsx("div", { className: "rounded-lg border border-border bg-card p-4", children: _jsx(AgentsSection, {}) })] })] }));
146
+ return (_jsx(AgentTabFrame, { title: "Connections", description: "Tools and services this agent can reach, grouped by where they are configured.", actions: _jsx("button", { type: "button", onClick: () => {
147
+ setError(null);
148
+ setDialogOpen(true);
149
+ }, className: "cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90", children: t("mcpIntegrations.connect") }), children: _jsxs("section", { className: "space-y-4", children: [error && (_jsx("p", { className: "rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive", children: error })), serversQuery.isLoading ? (_jsx(TabLoading, {})) : serversQuery.isError ? (_jsx("p", { className: "rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive", children: "Could not load MCP servers." })) : (_jsx("div", { className: "space-y-6", children: [
150
+ { label: "Personal", servers: data?.user ?? [] },
151
+ { label: "Organization", servers: data?.org ?? [] },
152
+ ].map((section) => (_jsxs("section", { className: "space-y-2", children: [_jsx("h2", { className: "text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground/70", children: section.label }), section.servers.length > 0 ? (_jsx("div", { className: "divide-y divide-border/60 border-y border-border/60", children: section.servers.map(renderServer) })) : (_jsx(AgentEmptyState, { icon: IconPlugConnected, title: `No ${section.label.toLowerCase()} connections yet`, description: section.label === "Personal"
153
+ ? "Connect a service to give the agent access to it."
154
+ : "Organization connections shared with this workspace will appear here." }))] }, section.label))) })), _jsx(McpIntegrationDialog, { open: dialogOpen, onOpenChange: setDialogOpen, defaultScope: "user", canCreateOrgMcp: canCreateOrgMcp, hasOrg: hasOrg, onCreateMcpServer: onCreateMcpServer })] }) }));
141
155
  }
142
156
  function CopyField({ label, value }) {
143
157
  const [copied, setCopied] = useState(false);
@@ -210,43 +224,93 @@ function AccessTab({ appName: appNameProp, }) {
210
224
  : null;
211
225
  const guide = MCP_CONNECT_GUIDES.find((item) => item.id === activeGuide) ??
212
226
  MCP_CONNECT_GUIDES[0];
213
- return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-base font-semibold text-foreground", children: "Access" }), _jsx("p", { className: "mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground", children: "Choose which external clients can talk to this app's agent and follow the setup for each one. Grants, scopes, and revocation will live here in a future pass." })] }), urls ? (_jsxs(_Fragment, { children: [_jsx(CopyField, { label: "MCP URL", value: urls.mcpUrl }), agentCardAvailable && (_jsx(CopyField, { label: "A2A agent card", value: urls.agentCardUrl })), _jsxs("section", { className: "space-y-3 rounded-lg border border-border bg-card p-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-sm font-semibold text-foreground", children: "Client setup" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "These instructions are also available on the full connect page." })] }), _jsx("div", { className: "flex gap-1 overflow-x-auto border-b border-border pb-2", role: "tablist", "aria-label": "Choose your AI assistant", children: MCP_CONNECT_GUIDES.map((item) => (_jsx("button", { type: "button", role: "tab", "aria-selected": item.id === guide?.id, onClick: () => setActiveGuide(item.id), className: cn("shrink-0 cursor-pointer rounded-md px-2.5 py-1.5 text-xs font-medium", item.id === guide?.id
227
+ return (_jsx(AgentTabFrame, { title: "Access", description: "Choose which external clients can talk to this app's agent.", children: _jsx("div", { className: "space-y-6", children: urls ? (_jsxs(_Fragment, { children: [_jsx(CopyField, { label: "MCP URL", value: urls.mcpUrl }), agentCardAvailable && (_jsx(CopyField, { label: "A2A agent card", value: urls.agentCardUrl })), _jsxs("section", { className: "space-y-3 border-t border-border/70 pt-6", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-sm font-semibold text-foreground", children: "Client setup" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "These instructions are also available on the full connect page." })] }), _jsx("div", { className: "flex gap-1 overflow-x-auto border-b border-border pb-2", role: "tablist", "aria-label": "Choose your AI assistant", children: MCP_CONNECT_GUIDES.map((item) => (_jsx("button", { type: "button", role: "tab", "aria-selected": item.id === guide?.id, onClick: () => setActiveGuide(item.id), className: cn("shrink-0 cursor-pointer rounded-md px-2.5 py-1.5 text-xs font-medium", item.id === guide?.id
214
228
  ? "bg-accent text-foreground"
215
- : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), children: item.label }, item.id))) }), guide && templateValues && (_jsxs("div", { className: "space-y-3 pt-1", role: "tabpanel", children: [guide.steps?.length ? (_jsx("ol", { className: "list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground", children: guide.steps.map((step) => (_jsx("li", { children: interpolateMcpConnectTemplate(step, templateValues) }, step))) })) : null, guide.intro && (_jsx("p", { className: "text-xs text-muted-foreground", children: interpolateMcpConnectTemplate(guide.intro, templateValues) })), guide.commandTemplate && (_jsx(CopyField, { label: "Command", value: interpolateMcpConnectTemplate(guide.commandTemplate, templateValues) })), guide.configTemplate && (_jsx(CopyField, { label: "MCP config", value: interpolateMcpConnectTemplate(guide.configTemplate, templateValues) })), guide.action?.kind === "link" && guide.action.href && (_jsxs("a", { href: guide.action.href, target: "_blank", rel: "noopener noreferrer", 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", children: [guide.action.label, _jsx(IconExternalLink, { className: "size-3.5" })] })), guide.note && (_jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: interpolateMcpConnectTemplate(guide.note, templateValues) }))] }))] }), _jsxs("section", { className: "rounded-lg border border-border/70 bg-muted/10 p-4", children: [_jsx("h3", { className: "text-sm font-semibold text-foreground", children: MCP_STATIC_TOKEN_FALLBACK.title }), _jsxs("p", { className: "mt-1 text-xs leading-relaxed text-muted-foreground", children: [MCP_STATIC_TOKEN_FALLBACK.state, ". Open the connect page to create a token for clients that cannot complete OAuth."] }), _jsxs("a", { href: urls.connectUrl, 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", children: ["Open full connect page", _jsx(IconExternalLink, { className: "size-3.5" })] })] })] })) : (_jsx(TabLoading, {}))] }));
229
+ : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), children: item.label }, item.id))) }), guide && templateValues && (_jsxs("div", { className: "space-y-3 pt-1", role: "tabpanel", children: [guide.steps?.length ? (_jsx("ol", { className: "list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground", children: guide.steps.map((step) => (_jsx("li", { children: interpolateMcpConnectTemplate(step, templateValues) }, step))) })) : null, guide.intro && (_jsx("p", { className: "text-xs text-muted-foreground", children: interpolateMcpConnectTemplate(guide.intro, templateValues) })), guide.commandTemplate && (_jsx(CopyField, { label: "Command", value: interpolateMcpConnectTemplate(guide.commandTemplate, templateValues) })), guide.configTemplate && (_jsx(CopyField, { label: "MCP config", value: interpolateMcpConnectTemplate(guide.configTemplate, templateValues) })), guide.action?.kind === "link" && guide.action.href && (_jsxs("a", { href: guide.action.href, target: "_blank", rel: "noopener noreferrer", 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", children: [guide.action.label, _jsx(IconExternalLink, { className: "size-3.5" })] })), guide.note && (_jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: interpolateMcpConnectTemplate(guide.note, templateValues) }))] }))] }), _jsxs("section", { className: "border-t border-border/70 pt-6", children: [_jsx("h3", { className: "text-sm font-semibold text-foreground", children: MCP_STATIC_TOKEN_FALLBACK.title }), _jsxs("p", { className: "mt-1 text-xs leading-relaxed text-muted-foreground", children: [MCP_STATIC_TOKEN_FALLBACK.state, ". Open the connect page to create a token for clients that cannot complete OAuth."] }), _jsxs("a", { href: urls.connectUrl, 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", children: ["Open full connect page", _jsx(IconExternalLink, { className: "size-3.5" })] })] })] })) : (_jsx(TabLoading, {})) }) }));
216
230
  }
217
- export function AgentTabsPage({ appName, extraTabs = [], defaultTab = "context", className, enableSearch = true, searchPlaceholder = "Search agent settings", hiddenTabs = [], value, onValueChange, }) {
218
- const { data: org, isLoading: orgLoading } = useOrg();
219
- const hasOrg = Boolean(org?.orgId);
231
+ export function AgentTabsPage({ appName, extraTabs = [], extraTabFactories = [], defaultTab = "files", className, enableSearch = true, searchPlaceholder = "Search agent workspace", hiddenTabs = [], value, onValueChange, }) {
232
+ const { data: org } = useOrg();
220
233
  const canManageOrg = !org?.orgId || org.role === "owner" || org.role === "admin";
221
- const [scope, setScope] = useState(initialScope);
222
- const scopeInitialized = useRef(false);
234
+ const scope = "user";
223
235
  const rootRef = useRef(null);
224
236
  const searchRef = useRef(null);
225
237
  const [query, setQuery] = useState("");
226
238
  const normalizedHiddenTabs = useMemo(() => new Set(hiddenTabs.map((tab) => normalizeTabId(tab)).filter(Boolean)), [hiddenTabs]);
239
+ const scopeControl = null;
240
+ const scopedExtraTabs = useMemo(() => extraTabFactories.map((factory) => factory({ scope, canManageOrg, scopeControl })), [canManageOrg, extraTabFactories, scope, scopeControl]);
227
241
  const tabs = useMemo(() => [
228
- {
229
- id: "context",
230
- label: "Context",
231
- icon: IconBrain,
232
- keywords: "influence provenance prompt",
233
- content: (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Context" }), _jsx("p", { className: "mt-1 text-sm leading-relaxed text-muted-foreground", children: "See what can influence this agent and why." })] }), _jsx("div", { className: "min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4", children: _jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentContextTab, { scope: scope, canManageOrg: canManageOrg }) }) })] })),
234
- },
235
242
  {
236
243
  id: "files",
237
244
  label: "Files",
238
245
  icon: IconFolder,
239
- keywords: "workspace resources instructions skills",
240
- content: (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Files" }), _jsx("p", { className: "mt-1 text-sm leading-relaxed text-muted-foreground", children: "Workspace files that shape the agent's context." })] }), _jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(FilesTab, { scope: scope, canManageOrg: canManageOrg }) })] })),
246
+ group: "resources",
247
+ keywords: "workspace plain files documents uploads",
248
+ content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentResourceTab, { scope: scope, view: "files" }) })),
249
+ },
250
+ {
251
+ id: "instructions",
252
+ label: "Instructions",
253
+ icon: IconChecklist,
254
+ group: "resources",
255
+ keywords: "agents md rules preferences guidance",
256
+ content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentResourceTab, { scope: scope, view: "instructions" }) })),
257
+ },
258
+ {
259
+ id: "agents",
260
+ label: "Agents",
261
+ icon: IconHierarchy2,
262
+ group: "resources",
263
+ keywords: "custom sub agents delegate profiles",
264
+ content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentResourceTab, { scope: scope, view: "agents" }) })),
265
+ },
266
+ {
267
+ id: "memory",
268
+ label: "Memory",
269
+ icon: IconNotes,
270
+ group: "resources",
271
+ keywords: "long term notes memory index recall",
272
+ content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentResourceTab, { scope: scope, view: "memory" }) })),
273
+ },
274
+ {
275
+ id: "skills",
276
+ label: "Skills",
277
+ icon: IconBook2,
278
+ group: "resources",
279
+ keywords: "abilities reusable instructions workflows",
280
+ content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentResourceTab, { scope: scope, view: "skills" }) })),
281
+ },
282
+ {
283
+ id: "learnings",
284
+ label: "Learnings",
285
+ icon: IconHistory,
286
+ group: "resources",
287
+ keywords: "corrections patterns knowledge feedback",
288
+ content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentResourceTab, { scope: scope, view: "learnings" }) })),
289
+ },
290
+ {
291
+ id: "remote-agents",
292
+ label: "Remote agents",
293
+ icon: IconTopologyRing2,
294
+ group: "resources",
295
+ keywords: "a2a connected remote agents delegation",
296
+ content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentResourceTab, { scope: scope, view: "remote-agents" }) })),
297
+ },
298
+ {
299
+ id: "snapshots",
300
+ label: "Snapshots",
301
+ icon: IconHistory,
302
+ group: "agent",
303
+ keywords: "context recent loads provenance tokens",
304
+ content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentContextTab, { scope: scope, canManageOrg: canManageOrg }) })),
241
305
  },
242
306
  {
243
307
  id: "connections",
244
308
  label: "Connections",
245
309
  icon: IconPlugConnected,
246
- keywords: "mcp servers tools remote agents a2a",
310
+ group: "agent",
311
+ keywords: "mcp servers tools integrations",
247
312
  searchEntries: [
248
313
  { id: "mcp-servers", label: "MCP servers", keywords: "tools" },
249
- { id: "remote-agents", label: "Remote agents", keywords: "a2a" },
250
314
  ],
251
315
  content: _jsx(ConnectionsTab, { scope: scope, canManageOrg: canManageOrg }),
252
316
  },
@@ -254,13 +318,15 @@ export function AgentTabsPage({ appName, extraTabs = [], defaultTab = "context",
254
318
  id: "jobs",
255
319
  label: "Jobs",
256
320
  icon: IconClock,
321
+ group: "agent",
257
322
  keywords: "scheduled automations recurring",
258
- content: (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Jobs" }), _jsx("p", { className: "mt-1 text-sm leading-relaxed text-muted-foreground", children: "Scheduled work that can run with this agent." })] }), _jsx("div", { className: "min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4", children: _jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentJobsTab, { scope: scope, canManageOrg: canManageOrg }) }) })] })),
323
+ content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentJobsTab, { scope: scope, canManageOrg: canManageOrg }) })),
259
324
  },
260
325
  {
261
326
  id: "access",
262
327
  label: "Access",
263
328
  icon: IconShieldLock,
329
+ group: "agent",
264
330
  keywords: "external clients oauth a2a exposure",
265
331
  searchEntries: [
266
332
  {
@@ -277,7 +343,8 @@ export function AgentTabsPage({ appName, extraTabs = [], defaultTab = "context",
277
343
  content: (_jsx(AccessTab, { scope: scope, canManageOrg: canManageOrg, appName: appName })),
278
344
  },
279
345
  ...extraTabs,
280
- ], [canManageOrg, extraTabs, scope]);
346
+ ...scopedExtraTabs,
347
+ ], [appName, canManageOrg, extraTabs, scope, scopedExtraTabs]);
281
348
  const visibleTabs = useMemo(() => tabs.filter((tab) => !normalizedHiddenTabs.has(tab.id)), [normalizedHiddenTabs, tabs]);
282
349
  const fallbackTab = visibleTabs.some((tab) => tab.id === defaultTab)
283
350
  ? defaultTab
@@ -302,23 +369,6 @@ export function AgentTabsPage({ appName, extraTabs = [], defaultTab = "context",
302
369
  }
303
370
  return groups;
304
371
  }, [visibleTabs]);
305
- useEffect(() => {
306
- if (scopeInitialized.current || orgLoading)
307
- return;
308
- scopeInitialized.current = true;
309
- if (!hasOrg && scope === "org")
310
- setScope("user");
311
- }, [hasOrg, orgLoading, scope]);
312
- useEffect(() => {
313
- if (orgLoading)
314
- return;
315
- const resolvedScope = hasOrg ? scope : "user";
316
- if (resolvedScope !== scope) {
317
- setScope(resolvedScope);
318
- return;
319
- }
320
- updateScopeUrl(resolvedScope);
321
- }, [hasOrg, orgLoading, scope]);
322
372
  useEffect(() => {
323
373
  if (!isControlled && !visibleTabs.some((tab) => tab.id === internalTab)) {
324
374
  setInternalTab(fallbackTab);
@@ -340,16 +390,6 @@ export function AgentTabsPage({ appName, extraTabs = [], defaultTab = "context",
340
390
  setInternalTab(tabId);
341
391
  onValueChange?.(tabId);
342
392
  }, [isControlled, onValueChange]);
343
- const changeScope = (next) => {
344
- if (next === "org" && !hasOrg)
345
- return;
346
- setScope(next);
347
- try {
348
- localStorage.setItem("agent-page-scope", next);
349
- }
350
- catch { }
351
- updateScopeUrl(next);
352
- };
353
393
  const searchIndex = useMemo(() => {
354
394
  const entries = [];
355
395
  for (const tab of visibleTabs) {
@@ -391,22 +431,18 @@ export function AgentTabsPage({ appName, extraTabs = [], defaultTab = "context",
391
431
  updateTabHash(entry.tabId);
392
432
  }
393
433
  }, [changeTab, isControlled]);
394
- return (_jsxs("div", { ref: rootRef, className: cn("flex h-full min-h-0 w-full flex-col overflow-hidden bg-background", className), children: [_jsxs("header", { className: "flex shrink-0 flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3 sm:px-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-base font-semibold text-foreground", children: "Agent" }), _jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: "What can influence this agent, and why." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs text-muted-foreground", children: "Scope" }), _jsxs("div", { className: "flex rounded-md border border-border bg-muted/30 p-0.5", role: "radiogroup", "aria-label": "Agent scope", children: [_jsx("button", { type: "button", role: "radio", "aria-checked": scope !== "org" || !hasOrg, onClick: () => changeScope("user"), className: cn("cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium", scope !== "org" || !hasOrg
395
- ? "bg-background text-foreground shadow-sm"
396
- : "text-muted-foreground hover:text-foreground"), children: "Personal" }), hasOrg && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", role: "radio", "aria-checked": scope === "org", onClick: () => changeScope("org"), className: cn("cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium", scope === "org"
397
- ? "bg-background text-foreground shadow-sm"
398
- : "text-muted-foreground hover:text-foreground"), children: "Organization" }) }), !canManageOrg && (_jsx(TooltipContent, { children: "Organization settings are read-only for members." }))] }))] })] })] }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col sm:flex-row", children: [_jsxs("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", children: [enableSearch ? (_jsxs("div", { className: "relative sm:mb-1", children: [_jsx(IconSearch, { className: "pointer-events-none absolute start-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { ref: searchRef, type: "search", value: query, onChange: (event) => setQuery(event.target.value), onKeyDown: (event) => {
399
- if (event.key === "Escape")
400
- setQuery("");
401
- if (event.key === "Enter" && results[0]) {
402
- event.preventDefault();
403
- selectSearchResult(results[0]);
404
- }
405
- }, placeholder: searchPlaceholder, "aria-label": searchPlaceholder, className: "h-8 w-full rounded-md border border-border bg-background ps-8 pe-7 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground focus:border-foreground/30 focus:ring-2 focus:ring-accent/40" }), query && (_jsx("button", { type: "button", onClick: () => setQuery(""), "aria-label": "Clear search", className: "absolute end-1.5 top-1/2 flex size-5 -translate-y-1/2 cursor-pointer items-center justify-center rounded text-muted-foreground hover:bg-accent/60 hover:text-foreground", children: _jsx(IconX, { className: "size-3.5" }) }))] })) : null, query.trim() ? (_jsx("div", { role: "listbox", "aria-label": "Agent search results", className: "flex flex-col gap-0.5", children: results.length === 0 ? (_jsx("p", { className: "px-2 py-6 text-center text-xs text-muted-foreground", children: "No matching agent settings" })) : (results.map((entry) => (_jsx("button", { type: "button", role: "option", onClick: () => selectSearchResult(entry), className: "flex cursor-pointer items-start gap-2 rounded-md px-2.5 py-2 text-start text-sm text-foreground hover:bg-accent/60", children: _jsxs("span", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate font-medium", children: entry.label }), _jsx("span", { className: "truncate text-[11px] text-muted-foreground", children: entry.description ?? entry.tabId })] }) }, entry.id)))) })) : (_jsx("nav", { "aria-label": "Agent sections", role: "tablist", className: "flex gap-1 overflow-x-auto sm:flex-col sm:overflow-x-visible", children: tabGroups.map((group, groupIndex) => (_jsx("div", { className: cn("contents sm:block", groupIndex > 0 &&
406
- "sm:mt-2 sm:border-t sm:border-border/60 sm:pt-2"), children: _jsx("div", { className: "contents sm:flex sm:flex-col sm:gap-1", children: group.tabs.map((tab) => {
434
+ return (_jsx("div", { ref: rootRef, className: cn("flex h-full min-h-0 w-full flex-col overflow-hidden bg-background", className), children: _jsxs("div", { className: "flex min-h-0 flex-1 flex-col sm:flex-row", children: [_jsxs("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", children: [enableSearch ? (_jsxs("div", { className: "relative sm:mb-1", children: [_jsx(IconSearch, { className: "pointer-events-none absolute start-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { ref: searchRef, type: "search", value: query, onChange: (event) => setQuery(event.target.value), onKeyDown: (event) => {
435
+ if (event.key === "Escape")
436
+ setQuery("");
437
+ if (event.key === "Enter" && results[0]) {
438
+ event.preventDefault();
439
+ selectSearchResult(results[0]);
440
+ }
441
+ }, placeholder: searchPlaceholder, "aria-label": searchPlaceholder, className: "h-8 w-full rounded-md border border-border bg-background ps-8 pe-7 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground focus:border-foreground/30 focus:ring-2 focus:ring-accent/40" }), query && (_jsx("button", { type: "button", onClick: () => setQuery(""), "aria-label": "Clear search", className: "absolute end-1.5 top-1/2 flex size-5 -translate-y-1/2 cursor-pointer items-center justify-center rounded text-muted-foreground hover:bg-accent/60 hover:text-foreground", children: _jsx(IconX, { className: "size-3.5" }) }))] })) : null, query.trim() ? (_jsx("div", { role: "listbox", "aria-label": "Agent search results", className: "flex flex-col gap-0.5", children: results.length === 0 ? (_jsx("p", { className: "px-2 py-6 text-center text-xs text-muted-foreground", children: "No matching agent workspace items" })) : (results.map((entry) => (_jsx("button", { type: "button", role: "option", onClick: () => selectSearchResult(entry), className: "flex cursor-pointer items-start gap-2 rounded-md px-2.5 py-2 text-start text-sm text-foreground hover:bg-accent/60", children: _jsxs("span", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate font-medium", children: entry.label }), _jsx("span", { className: "truncate text-[11px] text-muted-foreground", children: entry.description ?? entry.tabId })] }) }, entry.id)))) })) : (_jsx("nav", { "aria-label": "Agent sections", role: "tablist", className: "flex gap-1 overflow-x-auto sm:flex-col sm:overflow-x-visible", children: tabGroups.map((group, groupIndex) => (_jsxs("div", { className: cn("contents sm:block", groupIndex > 0 &&
442
+ "sm:mt-2 sm:border-t sm:border-border/60 sm:pt-2"), children: [group.id === "resources" && (_jsx("div", { className: "hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block", children: "Agent resources" })), group.id === "agent" && (_jsx("div", { className: "hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block", children: "Agent operations" })), _jsx("div", { className: "contents sm:flex sm:flex-col sm:gap-1", children: group.tabs.map((tab) => {
407
443
  const Icon = tab.icon;
408
444
  const selected = tab.id === selectedTab?.id;
409
- return (_jsxs("button", { type: "button", role: "tab", "aria-selected": selected, "aria-controls": `agent-tabpanel-${tab.id}`, onClick: () => {
445
+ return (_jsxs("button", { type: "button", id: `agent-tab-${tab.id}`, role: "tab", "aria-selected": selected, "aria-controls": `agent-tabpanel-${tab.id}`, onClick: () => {
410
446
  changeTab(tab.id);
411
447
  if (!isControlled)
412
448
  updateTabHash(tab.id);
@@ -415,6 +451,6 @@ export function AgentTabsPage({ appName, extraTabs = [], defaultTab = "context",
415
451
  : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), children: [Icon ? (_jsx(Icon, { className: cn("size-4 shrink-0", selected
416
452
  ? "text-foreground"
417
453
  : "text-muted-foreground") })) : null, _jsx("span", { className: "truncate", children: tab.label })] }, tab.id));
418
- }) }) }, group.id))) }))] }), _jsx("div", { id: `agent-tabpanel-${selectedTab?.id ?? "context"}`, role: "tabpanel", "aria-labelledby": `agent-tab-${selectedTab?.id ?? "context"}`, className: "min-h-0 min-w-0 flex-1 overflow-y-auto p-4 sm:p-6", children: selectedTab?.content ?? _jsx(EmptySlot, { label: "Agent section" }) })] })] }));
454
+ }) })] }, group.id))) }))] }), _jsx("div", { id: `agent-tabpanel-${selectedTab?.id ?? "context"}`, role: "tabpanel", "aria-labelledby": `agent-tab-${selectedTab?.id ?? "context"}`, className: "min-h-0 min-w-0 flex-1 overflow-y-auto p-4 sm:p-6", children: selectedTab?.content ?? _jsx(EmptySlot, { label: "Agent section" }) })] }) }));
419
455
  }
420
456
  //# sourceMappingURL=AgentTabsPage.js.map