@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
@@ -0,0 +1,205 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ import { registerOnboardingStep } from "@agent-native/core/onboarding";
4
+ import {
5
+ getRequestOrgId,
6
+ getRequestUserEmail,
7
+ } from "@agent-native/core/server/request-context";
8
+ import {
9
+ readCreativeContextMedia,
10
+ setupCreativeContext,
11
+ type CreativeContextProjectionAdapters,
12
+ } from "@agent-native/creative-context/server";
13
+ import { getCreativeContextItem } from "@agent-native/creative-context/store";
14
+ import { listContextSources } from "@agent-native/creative-context/store";
15
+ import type { ContextMedia } from "@agent-native/creative-context/types";
16
+ import { and, eq } from "drizzle-orm";
17
+ import { nanoid } from "nanoid";
18
+
19
+ import { getDb, schema } from "../db/index.js";
20
+ import { createAssetFromBuffer } from "../lib/assets.js";
21
+ import { seedDefaultGenerationPresets } from "../lib/generation-presets.js";
22
+ import { nowIso, parseJson, stringifyJson } from "../lib/json.js";
23
+
24
+ const IMPORT_LIBRARY_TITLE = "Creative context imports";
25
+
26
+ async function ensureImportLibrary() {
27
+ const ownerEmail = getRequestUserEmail();
28
+ if (!ownerEmail) throw new Error("no authenticated user");
29
+ const db = getDb();
30
+ const [existing] = await db
31
+ .select()
32
+ .from(schema.assetLibraries)
33
+ .where(
34
+ and(
35
+ eq(schema.assetLibraries.ownerEmail, ownerEmail),
36
+ eq(schema.assetLibraries.title, IMPORT_LIBRARY_TITLE),
37
+ ),
38
+ )
39
+ .limit(1);
40
+ if (existing) return existing;
41
+ const now = nowIso();
42
+ const row = {
43
+ id: nanoid(),
44
+ title: IMPORT_LIBRARY_TITLE,
45
+ description:
46
+ "Reference media projected from governed Creative Context sources.",
47
+ customInstructions: "",
48
+ styleBrief: "{}",
49
+ settings: stringifyJson({ sourceType: "brand-import" }),
50
+ ownerEmail,
51
+ orgId: getRequestOrgId(),
52
+ createdAt: now,
53
+ updatedAt: now,
54
+ };
55
+ await db.insert(schema.assetLibraries).values(row);
56
+ await seedDefaultGenerationPresets({ db, libraryId: row.id, now });
57
+ return row;
58
+ }
59
+
60
+ function projectedAssetId(ownerEmail: string, dedupeKey: string) {
61
+ return `cc-${createHash("sha256")
62
+ .update(`${ownerEmail}:${dedupeKey}`)
63
+ .digest("hex")
64
+ .slice(0, 24)}`;
65
+ }
66
+
67
+ async function projectMedia(input: {
68
+ sourceId: string;
69
+ itemId: string;
70
+ itemVersionId: string;
71
+ media: ContextMedia;
72
+ sourceType: "brand-import";
73
+ dedupeKey: string;
74
+ }) {
75
+ if (input.media.kind !== "image" && input.media.kind !== "video") return null;
76
+ const ownerEmail = getRequestUserEmail();
77
+ if (!ownerEmail) throw new Error("no authenticated user");
78
+ const id = projectedAssetId(ownerEmail, input.dedupeKey);
79
+ const db = getDb();
80
+ const [existing] = await db
81
+ .select()
82
+ .from(schema.assets)
83
+ .where(eq(schema.assets.id, id))
84
+ .limit(1);
85
+ if (existing) return existing;
86
+ const [library, detail, loaded] = await Promise.all([
87
+ ensureImportLibrary(),
88
+ getCreativeContextItem(input.itemId, input.itemVersionId),
89
+ readCreativeContextMedia({
90
+ mediaId: input.media.id,
91
+ itemId: input.itemId,
92
+ itemVersionId: input.itemVersionId,
93
+ }),
94
+ ]);
95
+ if (!detail) throw new Error("Creative context item is not accessible");
96
+ return createAssetFromBuffer({
97
+ id,
98
+ libraryId: library.id,
99
+ buffer: Buffer.from(loaded.data),
100
+ mimeType: loaded.mimeType,
101
+ role: input.media.kind === "video" ? "video_reference" : "style_reference",
102
+ status: "reference",
103
+ title: detail.item.title,
104
+ description: input.media.caption ?? input.media.altText,
105
+ altText: input.media.altText,
106
+ metadata: {
107
+ sourceType: input.sourceType,
108
+ contentHash: input.media.contentHash,
109
+ creativeContext: {
110
+ sourceId: input.sourceId,
111
+ itemId: input.itemId,
112
+ itemVersionId: input.itemVersionId,
113
+ mediaId: input.media.id,
114
+ dedupeKey: input.dedupeKey,
115
+ },
116
+ },
117
+ });
118
+ }
119
+
120
+ const projections: CreativeContextProjectionAdapters = {
121
+ media: {
122
+ project: async (input) => {
123
+ await projectMedia(input);
124
+ },
125
+ },
126
+ canonicalLogo: {
127
+ apply: async ({ itemId, itemVersionId, payload }) => {
128
+ const mediaId =
129
+ typeof payload.mediaId === "string" ? payload.mediaId : undefined;
130
+ if (!mediaId) {
131
+ throw new Error("Canonical-logo confirmation requires payload.mediaId");
132
+ }
133
+ const detail = await getCreativeContextItem(itemId, itemVersionId);
134
+ const media = detail?.media.find((candidate) => candidate.id === mediaId);
135
+ if (!detail || !media || media.kind !== "image") {
136
+ throw new Error("Canonical-logo media is not accessible");
137
+ }
138
+ const ownerEmail = getRequestUserEmail();
139
+ if (!ownerEmail) throw new Error("no authenticated user");
140
+ const dedupeKey = `${media.id}:${itemVersionId}`;
141
+ const asset = await projectMedia({
142
+ sourceId: detail.item.sourceId,
143
+ itemId,
144
+ itemVersionId,
145
+ media,
146
+ sourceType: "brand-import",
147
+ dedupeKey,
148
+ });
149
+ if (!asset)
150
+ throw new Error("Canonical-logo media could not be projected");
151
+ await getDb()
152
+ .update(schema.assets)
153
+ .set({
154
+ role: "logo_reference",
155
+ metadata: stringifyJson({
156
+ ...parseJson<Record<string, unknown>>(asset.metadata, {}),
157
+ sourceType: "brand-import",
158
+ contentHash: media.contentHash,
159
+ canonicalLogo: true,
160
+ creativeContext: {
161
+ sourceId: detail.item.sourceId,
162
+ itemId,
163
+ itemVersionId,
164
+ mediaId,
165
+ dedupeKey,
166
+ },
167
+ }),
168
+ updatedAt: nowIso(),
169
+ })
170
+ .where(eq(schema.assets.id, asset.id));
171
+ await getDb()
172
+ .update(schema.assetLibraries)
173
+ .set({ canonicalLogoAssetId: asset.id, updatedAt: nowIso() })
174
+ .where(eq(schema.assetLibraries.id, asset.libraryId));
175
+ },
176
+ },
177
+ };
178
+
179
+ registerOnboardingStep({
180
+ id: "creative-context-library",
181
+ order: 18,
182
+ required: false,
183
+ title: "Connect your creative library",
184
+ description:
185
+ "Connect prior work and reference sources so agents can reuse approved creative context.",
186
+ methods: [
187
+ {
188
+ id: "library",
189
+ kind: "link",
190
+ primary: true,
191
+ label: "Open Library",
192
+ payload: { url: "/agent#library", external: false },
193
+ },
194
+ ],
195
+ isComplete: async () => {
196
+ try {
197
+ const result = await listContextSources({ limit: 1 });
198
+ return result.sources.length > 0;
199
+ } catch {
200
+ return false;
201
+ }
202
+ },
203
+ });
204
+
205
+ export default setupCreativeContext({ appId: "assets", projections });
@@ -57,10 +57,10 @@ const enUS = {
57
57
  brainNavigationDescription: "Navigate between Brain work surfaces.",
58
58
  },
59
59
  settings: {
60
- agentTitle: "Agent settings",
60
+ agentTitle: "Agent workspace",
61
61
  agentDescription:
62
- "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
63
- openAgentSettings: "Open agent settings",
62
+ "Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
63
+ openAgentSettings: "Open agent workspace",
64
64
  eyebrow: "Customize",
65
65
  title: "Customize Brain",
66
66
  description:
@@ -927,7 +927,7 @@ export const navItems: Array<{
927
927
  },
928
928
  {
929
929
  view: "agent",
930
- label: "Agent settings",
930
+ label: "Agent workspace",
931
931
  href: "/agent",
932
932
  icon: IconBrain,
933
933
  },
@@ -1,3 +1,9 @@
1
+ import {
2
+ buildSearchSnippet,
3
+ escapeLikeTerm,
4
+ normalizeSearchTerms,
5
+ scoreSearchText as scoreSharedSearchText,
6
+ } from "@agent-native/core/search-utils";
1
7
  import { discoverAgents } from "@agent-native/core/server/agent-discovery";
2
8
  import { accessFilter } from "@agent-native/core/sharing";
3
9
  import { listWorkspaceConnectionProviderCatalogForApp } from "@agent-native/core/workspace-connections";
@@ -80,25 +86,6 @@ export interface FederatedSearchCoverage {
80
86
  };
81
87
  }
82
88
 
83
- const STOPWORDS = new Set([
84
- "about",
85
- "does",
86
- "from",
87
- "have",
88
- "what",
89
- "when",
90
- "where",
91
- "which",
92
- "while",
93
- "with",
94
- "why",
95
- "the",
96
- "and",
97
- "for",
98
- "our",
99
- "did",
100
- ]);
101
-
102
89
  const APP_ID = "brain";
103
90
  const BRAIN_SOURCE_PROVIDERS = [
104
91
  "manual",
@@ -197,24 +184,7 @@ const FEDERATED_DELEGATION_TARGETS: Array<{
197
184
  },
198
185
  ];
199
186
 
200
- export function escapeLikeTerm(value: string): string {
201
- return value.replace(/[\\%_]/g, (match) => `\\${match}`);
202
- }
203
-
204
- export function normalizeSearchTerms(query: string): string[] {
205
- const phrase = query
206
- .toLowerCase()
207
- .split(/[^a-z0-9-]+/)
208
- .map((token) => token.trim())
209
- .filter(Boolean)
210
- .join(" ");
211
- if (!phrase) return [];
212
- const tokens = phrase
213
- .split(/[^a-z0-9-]+/)
214
- .map((token) => token.trim())
215
- .filter((token) => token.length > 2 && !STOPWORDS.has(token));
216
- return Array.from(new Set([phrase, ...tokens])).slice(0, 8);
217
- }
187
+ export { escapeLikeTerm, normalizeSearchTerms };
218
188
 
219
189
  function likeEscaped(column: unknown, term: string): SQL {
220
190
  return sql`lower(${column}) like ${`%${escapeLikeTerm(term)}%`} escape '\\'`;
@@ -319,21 +289,7 @@ export function buildSnippet(
319
289
  terms: string[],
320
290
  maxLength = 260,
321
291
  ): string {
322
- const text = cleanText(value);
323
- if (text.length <= maxLength) return text;
324
- const lower = text.toLowerCase();
325
- const firstIndex = terms.reduce((best, term) => {
326
- const index = lower.indexOf(term);
327
- return index >= 0 && (best < 0 || index < best) ? index : best;
328
- }, -1);
329
- const start = Math.max(
330
- 0,
331
- (firstIndex < 0 ? 0 : firstIndex) - Math.floor(maxLength / 3),
332
- );
333
- const end = Math.min(text.length, start + maxLength);
334
- const prefix = start > 0 ? "..." : "";
335
- const suffix = end < text.length ? "..." : "";
336
- return `${prefix}${text.slice(start, end).trim()}${suffix}`;
292
+ return buildSearchSnippet(value, terms, maxLength);
337
293
  }
338
294
 
339
295
  export function scoreSearchText(
@@ -346,21 +302,15 @@ export function scoreSearchText(
346
302
  },
347
303
  terms: string[],
348
304
  ): number {
349
- const title = cleanText(fields.title).toLowerCase();
350
- const summary = cleanText(fields.summary).toLowerCase();
351
- const body = cleanText(fields.body).toLowerCase();
352
- const metadata = cleanText(`${fields.provider ?? ""} ${fields.status ?? ""}`)
353
- .toLowerCase()
354
- .trim();
355
- let score = 0;
356
- terms.forEach((term, index) => {
357
- const phraseBoost = index === 0 ? 2 : 1;
358
- if (title.includes(term)) score += 40 * phraseBoost;
359
- if (summary.includes(term)) score += 20 * phraseBoost;
360
- if (body.includes(term)) score += 8 * phraseBoost;
361
- if (metadata.includes(term)) score += 6 * phraseBoost;
362
- });
363
- return score;
305
+ return scoreSharedSearchText(
306
+ {
307
+ title: fields.title,
308
+ summary: fields.summary,
309
+ body: fields.body,
310
+ metadata: `${fields.provider ?? ""} ${fields.status ?? ""}`,
311
+ },
312
+ terms,
313
+ );
364
314
  }
365
315
 
366
316
  export function sourceUrlFromMetadata(
@@ -225,10 +225,10 @@ const enUS = {
225
225
  languageTitle: "Language",
226
226
  languageDescription: "Choose the interface language for Calendar.",
227
227
  languageLabel: "Interface language",
228
- agentTitle: "Agent settings",
228
+ agentTitle: "Agent workspace",
229
229
  agentDescription:
230
- "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
231
- openAgentSettings: "Open agent settings",
230
+ "Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
231
+ openAgentSettings: "Open agent workspace",
232
232
  googleCalendar: "Google Calendar",
233
233
  googleDescription: "Connect your Google Calendar to sync events.",
234
234
  googleFailed: "Google sign-in failed",
@@ -132,8 +132,6 @@ const PREVIEW_COLLAPSED_STORAGE_KEY = "calendar.bookingLinks.previewCollapsed";
132
132
  const BRAND_LINK_CLASS = "font-semibold text-[#00B5FF] hover:text-[#33C4FF]";
133
133
  const BRAND_ICON_LINK_CLASS =
134
134
  "text-[#00B5FF] hover:bg-[#00B5FF]/10 hover:text-[#33C4FF]";
135
- const BRAND_PILL_LINK_CLASS =
136
- "border-[#00B5FF]/35 bg-[#00B5FF]/10 font-semibold text-[#00B5FF] hover:border-[#00B5FF]/55 hover:bg-[#00B5FF]/15 hover:text-[#33C4FF]";
137
135
  const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
138
136
  const BOOKING_SLOT_STEP_MINUTES = 30;
139
137
 
@@ -1634,31 +1632,34 @@ export default function BookingLinksPage({
1634
1632
  <div className="flex shrink-0 items-center gap-2">
1635
1633
  {link.isActive && (
1636
1634
  <>
1637
- <button
1635
+ <Button
1638
1636
  type="button"
1637
+ variant="outline"
1638
+ size="sm"
1639
1639
  onClick={(e) => {
1640
1640
  e.stopPropagation();
1641
1641
  void copyPreviewUrl(link.slug);
1642
1642
  }}
1643
- className={cn(
1644
- "flex items-center gap-1.5 rounded-full border px-3 py-1.5 text-xs sm:px-4 sm:text-sm",
1645
- BRAND_PILL_LINK_CLASS,
1646
- )}
1643
+ className="rounded-full"
1647
1644
  >
1648
1645
  <IconLink className="h-3.5 w-3.5" />
1649
1646
  {t("bookingLinks.copyLink")}
1650
- </button>
1651
- <a
1652
- href={bookingPreviewPath(link.slug)}
1653
- target="_blank"
1654
- rel="noopener noreferrer"
1655
- className={cn(
1656
- "flex h-9 w-9 items-center justify-center rounded-full border",
1657
- BRAND_PILL_LINK_CLASS,
1658
- )}
1647
+ </Button>
1648
+ <Button
1649
+ asChild
1650
+ variant="outline"
1651
+ size="icon"
1652
+ className="h-9 w-9 rounded-full"
1653
+ aria-label={t("bookingLinks.openBookingLink")}
1659
1654
  >
1660
- <IconExternalLink className="h-4 w-4" />
1661
- </a>
1655
+ <a
1656
+ href={bookingPreviewPath(link.slug)}
1657
+ target="_blank"
1658
+ rel="noopener noreferrer"
1659
+ >
1660
+ <IconExternalLink className="h-4 w-4" />
1661
+ </a>
1662
+ </Button>
1662
1663
  </>
1663
1664
  )}
1664
1665
 
@@ -11,10 +11,10 @@ const messages = {
11
11
  "Manage team members, organization access, and shared workspace preferences.",
12
12
  openTeamSettings: "Open team settings",
13
13
  openResourceSettings: "Open resource settings",
14
- agentTitle: "Agent settings",
14
+ agentTitle: "Agent workspace",
15
15
  agentDescription:
16
- "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
17
- openAgentSettings: "Open agent settings",
16
+ "Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
17
+ openAgentSettings: "Open agent workspace",
18
18
  },
19
19
  chat: {
20
20
  archiveChat: "Archive Chat",
@@ -8,6 +8,8 @@ type AgentClientModule = {
8
8
  AgentChatSurface: ComponentType<{
9
9
  mode?: "panel" | "page";
10
10
  className?: string;
11
+ showHeader?: boolean;
12
+ showTabBar?: boolean;
11
13
  }>;
12
14
  AgentTabsPage?: ComponentType<AgentPageProps>;
13
15
  };
@@ -33,7 +35,14 @@ export function resolveAgentPageComponent(
33
35
  if (existing) return existing;
34
36
 
35
37
  const legacyAgentPage = function LegacyAgentPage() {
36
- return <client.AgentChatSurface mode="page" className="h-full" />;
38
+ return (
39
+ <client.AgentChatSurface
40
+ mode="page"
41
+ className="h-full"
42
+ showHeader={false}
43
+ showTabBar={false}
44
+ />
45
+ );
37
46
  };
38
47
  legacyAgentPages.set(client, legacyAgentPage);
39
48
  return legacyAgentPage;
@@ -58,7 +58,7 @@ Both fields are set by `start-meeting-recording`. Agents that operate on a recor
58
58
 
59
59
  ## Calendar reminders
60
60
 
61
- Calendar events fire a desktop notification **1 minute before** the meeting start and keep it visible until **5 minutes after** start unless dismissed (consumer: the desktop tray in `src-tauri/`). The tray polls `list-meetings`, which reads Google Calendar live, so upcoming reminders do not depend on a manual sync or pre-created `meetings` rows. Desktop Zoom joins use Zoom's native `zoommtg://` link so the Zoom app opens directly without an intermediate browser tab; unsupported Zoom link shapes and other providers retain their HTTPS join URL. Agents do not need to schedule reminders manually.
61
+ Calendar events fire a desktop notification **1 minute before** the meeting start and keep it visible until **5 minutes after** start unless dismissed (consumer: the desktop tray in `src-tauri/`). The tray polls `list-meetings`, which reads Google Calendar live and excludes events the current user has declined, so upcoming reminders do not depend on a manual sync or pre-created `meetings` rows. The normal Meetings list remains calendar-backed and is not filtered by the reminder-only exclusion. Desktop Zoom joins use Zoom's native `zoommtg://` link so the Zoom app opens directly without an intermediate browser tab; unsupported Zoom link shapes and other providers retain their HTTPS join URL. Agents do not need to schedule reminders manually.
62
62
 
63
63
  ## Adhoc Zoom / Teams detection (desktop)
64
64
 
@@ -16,6 +16,10 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
16
16
  - Never hardcode API keys, tokens, webhook URLs, signing secrets, private Builder/internal data, customer data, or credential-looking literals. Use secrets/OAuth/runtime configuration and obvious placeholders in examples.
17
17
  - Use actions for recording metadata, transcripts, cleanup, summaries, chapters,
18
18
  comments, spaces/folders, meetings, and sharing. Do not bypass access helpers.
19
+ - Organization admins can use `set-organization-branding` with
20
+ `defaultVisibility=public|org|private` to choose the visibility applied when
21
+ new recordings omit an explicit visibility. The default remains `public`, and
22
+ explicit visibility wins (for example, bug-report recordings use `org`).
19
23
  - Use `move-recording` for both single and bulk folder moves. Pass `id` for one
20
24
  clip or `ids` for selected clips, and `folderId: null` to move them to the
21
25
  library or space root.
@@ -53,6 +53,19 @@ const GEMINI_BYOK_MODEL = "gemini-2.0-flash-lite";
53
53
  const GEMINI_BYOK_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_BYOK_MODEL}:generateContent`;
54
54
 
55
55
  const MAX_INPUT_CHARS = 200_000;
56
+ const MAX_CLEANUP_OUTPUT_TOKENS = 32_000;
57
+
58
+ export function cleanupMaxOutputTokens(
59
+ task: "cleanup" | "title" | "summary",
60
+ transcriptLength: number,
61
+ ): number {
62
+ if (task === "title") return 1_024;
63
+ if (task === "summary") return 4_096;
64
+ return Math.min(
65
+ MAX_CLEANUP_OUTPUT_TOKENS,
66
+ Math.max(1_024, Math.ceil(transcriptLength / 3) + 512),
67
+ );
68
+ }
56
69
 
57
70
  const CLIPS_TRANSCRIPT_AGENT_INSTRUCTIONS = [
58
71
  "Relevant Clips AGENTS.md rules:",
@@ -117,6 +130,10 @@ export default defineAction({
117
130
  language: args.language,
118
131
  });
119
132
  const wantJson = args.task === "summary";
133
+ const maxOutputTokens = cleanupMaxOutputTokens(
134
+ args.task,
135
+ transcript.length,
136
+ );
120
137
 
121
138
  // 1) Builder gateway (preferred — uses Builder.io Connect credentials).
122
139
  const builderCreds = await resolveBuilderCredentials();
@@ -133,7 +150,7 @@ export default defineAction({
133
150
  try {
134
151
  const text = await callBuilderGateway({
135
152
  prompt,
136
- wantJson,
153
+ maxOutputTokens,
137
154
  });
138
155
  if (text.trim()) {
139
156
  await clearBuilderCreditsExhausted();
@@ -170,6 +187,7 @@ export default defineAction({
170
187
  apiKey: geminiKey,
171
188
  prompt,
172
189
  wantJson,
190
+ maxOutputTokens,
173
191
  });
174
192
  return shapeResult(args.task, text, "gemini-byok", contextPack);
175
193
  }
@@ -189,10 +207,10 @@ async function resolveUserGeminiKey(): Promise<string | null> {
189
207
 
190
208
  async function callBuilderGateway({
191
209
  prompt,
192
- wantJson,
210
+ maxOutputTokens,
193
211
  }: {
194
212
  prompt: { system: string; user: string };
195
- wantJson: boolean;
213
+ maxOutputTokens: number;
196
214
  }): Promise<string> {
197
215
  const engine = createBuilderEngine();
198
216
  const controller = new AbortController();
@@ -213,7 +231,7 @@ async function callBuilderGateway({
213
231
  ],
214
232
  tools: [],
215
233
  abortSignal: controller.signal,
216
- maxOutputTokens: wantJson ? 4096 : 1024,
234
+ maxOutputTokens,
217
235
  temperature: 0,
218
236
  });
219
237
  for await (const event of events) {
@@ -232,6 +250,10 @@ async function callBuilderGateway({
232
250
  ? `Builder gateway returned ${event.errorCode}`
233
251
  : "Builder gateway returned an error");
234
252
  }
253
+ if (event.type === "stop" && event.reason === "max_tokens") {
254
+ terminalError =
255
+ "Builder gateway truncated transcript cleanup at the output-token limit";
256
+ }
235
257
  }
236
258
  } finally {
237
259
  clearTimeout(timeout);
@@ -280,10 +302,12 @@ async function callGeminiByok({
280
302
  apiKey,
281
303
  prompt,
282
304
  wantJson,
305
+ maxOutputTokens,
283
306
  }: {
284
307
  apiKey: string;
285
308
  prompt: { system: string; user: string };
286
309
  wantJson: boolean;
310
+ maxOutputTokens: number;
287
311
  }): Promise<string> {
288
312
  const controller = new AbortController();
289
313
  const timeout = setTimeout(() => controller.abort(), 30_000);
@@ -302,6 +326,7 @@ async function callGeminiByok({
302
326
  ],
303
327
  generationConfig: {
304
328
  temperature: 0,
329
+ maxOutputTokens,
305
330
  ...(wantJson ? { responseMimeType: "application/json" } : {}),
306
331
  },
307
332
  }),
@@ -314,8 +339,14 @@ async function callGeminiByok({
314
339
  const data = (await res.json()) as {
315
340
  candidates?: Array<{
316
341
  content?: { parts?: Array<{ text?: string }> };
342
+ finishReason?: string;
317
343
  }>;
318
344
  };
345
+ if (data.candidates?.[0]?.finishReason === "MAX_TOKENS") {
346
+ throw new Error(
347
+ "Gemini truncated transcript cleanup at the output-token limit",
348
+ );
349
+ }
319
350
  return (
320
351
  data.candidates?.[0]?.content?.parts
321
352
  ?.map((p) => p.text ?? "")
@@ -17,6 +17,7 @@ import { getDb, schema } from "../server/db/index.js";
17
17
  import {
18
18
  getCurrentOwnerEmail,
19
19
  getActiveOrganizationId,
20
+ getOrganizationDefaultVisibility,
20
21
  nanoid,
21
22
  } from "../server/lib/recordings.js";
22
23
 
@@ -64,7 +65,9 @@ export default defineAction({
64
65
  visibility: z
65
66
  .enum(["private", "org", "public"])
66
67
  .optional()
67
- .describe("Initial visibility — defaults to private"),
68
+ .describe(
69
+ "Initial visibility. When omitted, uses the organization default and falls back to public.",
70
+ ),
68
71
  source: z
69
72
  .enum(["calendar", "adhoc", "manual"])
70
73
  .optional()
@@ -187,7 +190,8 @@ export default defineAction({
187
190
  }
188
191
  }
189
192
 
190
- const visibility = args.visibility ?? "private";
193
+ const visibility =
194
+ args.visibility ?? (await getOrganizationDefaultVisibility(orgId));
191
195
 
192
196
  try {
193
197
  await db.insert(schema.meetings).values({
@@ -20,7 +20,7 @@ import { getCurrentOwnerEmail } from "../server/lib/recordings.js";
20
20
 
21
21
  export default defineAction({
22
22
  description:
23
- "Create a new organization and add the caller as an admin member. Seeds a Clips-specific organization_settings row with default brand color #18181B and private visibility, then activates the new org for the caller. Returns the new organization id.",
23
+ "Create a new organization and add the caller as an admin member. Seeds a Clips-specific organization_settings row with default brand color #18181B and public visibility, then activates the new org for the caller. Returns the new organization id.",
24
24
  schema: z.object({
25
25
  name: z.string().min(1).describe("Organization name"),
26
26
  }),
@@ -40,7 +40,7 @@ export default defineAction({
40
40
  .values({
41
41
  organizationId: id,
42
42
  brandColor: "#18181B",
43
- defaultVisibility: "private",
43
+ defaultVisibility: "public",
44
44
  createdAt: nowIso,
45
45
  updatedAt: nowIso,
46
46
  })
@@ -55,6 +55,7 @@ export default defineAction({
55
55
  name,
56
56
  brandColor: "#18181B",
57
57
  brandLogoUrl: null,
58
+ defaultVisibility: "public",
58
59
  createdAt: nowIso,
59
60
  };
60
61
  },
@@ -18,6 +18,7 @@ import { MAX_UPLOAD_BYTES } from "@shared/upload-limits.js";
18
18
  import { getDb, schema } from "../server/db/index.js";
19
19
  import {
20
20
  getCurrentOwnerEmail,
21
+ getOrganizationDefaultVisibility,
21
22
  nanoid,
22
23
  requireOrganizationAccess,
23
24
  stringifySpaceIds,
@@ -45,6 +46,8 @@ export default defineAction({
45
46
  const { organizationId } = await requireOrganizationAccess(
46
47
  args.organizationId,
47
48
  );
49
+ const defaultVisibility =
50
+ await getOrganizationDefaultVisibility(organizationId);
48
51
 
49
52
  const spaceIds = (args.spaceIds ?? []).filter(
50
53
  (value, index, arr) => value && arr.indexOf(value) === index,
@@ -64,7 +67,7 @@ export default defineAction({
64
67
  uploadProgress: 0,
65
68
  hasAudio: args.hasAudio ?? true,
66
69
  hasCamera: args.hasCamera ?? false,
67
- visibility: args.visibility ?? "public",
70
+ visibility: args.visibility ?? defaultVisibility,
68
71
  width: args.width ?? 0,
69
72
  height: args.height ?? 0,
70
73
  ownerEmail,