@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
@@ -104,7 +104,7 @@ const migrations = runMigrations(
104
104
  slug TEXT NOT NULL,
105
105
  brand_color TEXT NOT NULL DEFAULT '#18181B',
106
106
  brand_logo_url TEXT,
107
- default_visibility TEXT NOT NULL DEFAULT 'private',
107
+ default_visibility TEXT NOT NULL DEFAULT 'public',
108
108
  created_at TEXT NOT NULL DEFAULT (datetime('now')),
109
109
  updated_at TEXT NOT NULL DEFAULT (datetime('now')),
110
110
  owner_email TEXT NOT NULL DEFAULT 'local@localhost',
@@ -348,7 +348,7 @@ const migrations = runMigrations(
348
348
  organization_id TEXT PRIMARY KEY,
349
349
  brand_color TEXT NOT NULL DEFAULT '#18181B',
350
350
  brand_logo_url TEXT,
351
- default_visibility TEXT NOT NULL DEFAULT 'private',
351
+ default_visibility TEXT NOT NULL DEFAULT 'public',
352
352
  created_at TEXT NOT NULL DEFAULT (datetime('now')),
353
353
  updated_at TEXT NOT NULL DEFAULT (datetime('now'))
354
354
  )`,
@@ -44,7 +44,7 @@ export default defineEventHandler(async (event: H3Event) => {
44
44
  return {
45
45
  error: "missing_credentials",
46
46
  message:
47
- "Google Calendar OAuth is not configured. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in your environment, or paste them in the agent settings.",
47
+ "Google Calendar OAuth is not configured. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in your environment, or paste them in the agent workspace.",
48
48
  };
49
49
  }
50
50
 
@@ -19,6 +19,7 @@ import {
19
19
  signShortLivedToken,
20
20
  verifyScopedAgentAccessToken,
21
21
  } from "@agent-native/core/server";
22
+ import { resolveAccess } from "@agent-native/core/sharing";
22
23
  import { asc, eq } from "drizzle-orm";
23
24
  import {
24
25
  defineEventHandler,
@@ -45,7 +46,6 @@ import { resolvePlayerVideoUrl } from "../../lib/player-video-url.js";
45
46
  import {
46
47
  getOrganizationRoleForEmail,
47
48
  parseSpaceIds,
48
- sameOwnerEmail,
49
49
  } from "../../lib/recordings.js";
50
50
  import { verifySharePassword } from "../../lib/share-password.js";
51
51
 
@@ -211,9 +211,6 @@ export default defineEventHandler(async (event) => {
211
211
  }
212
212
 
213
213
  const session = await getSession(event).catch(() => null);
214
- const viewerIsOwner = Boolean(
215
- session?.email && sameOwnerEmail(session.email, rec.ownerEmail),
216
- );
217
214
  const tokenAllowsAgentAccess = suppliedAgentAccessToken
218
215
  ? verifyScopedAgentAccessToken(suppliedAgentAccessToken, {
219
216
  resourceKind: CLIP_AGENT_ACCESS_TOKEN_PREFIX,
@@ -221,6 +218,18 @@ export default defineEventHandler(async (event) => {
221
218
  }).ok
222
219
  : false;
223
220
 
221
+ // Share links are public-shell routes, so this endpoint cannot rely on the
222
+ // authenticated player action to authorize private recordings. Resolve the
223
+ // same registered access policy here so explicit user/org grants work before
224
+ // the client redirects to the direct player route.
225
+ const viewerAccess = session?.email
226
+ ? await resolveAccess("recording", rec.id, {
227
+ userEmail: session.email,
228
+ orgId: session.orgId,
229
+ })
230
+ : null;
231
+ const viewerIsOwner = viewerAccess?.role === "owner";
232
+
224
233
  let viewerIsOrgMember = false;
225
234
  if (session?.email && rec.visibility === "org" && rec.organizationId) {
226
235
  try {
@@ -238,7 +247,7 @@ export default defineEventHandler(async (event) => {
238
247
 
239
248
  if (
240
249
  rec.visibility !== "public" &&
241
- !viewerIsOwner &&
250
+ !viewerAccess &&
242
251
  !viewerIsOrgMember &&
243
252
  !tokenAllowsAgentAccess
244
253
  ) {
@@ -196,6 +196,9 @@ export default defineEventHandler(async (event: H3Event) => {
196
196
  status: schema.recordings.status,
197
197
  failureReason: schema.recordings.failureReason,
198
198
  ownerEmail: schema.recordings.ownerEmail,
199
+ videoUrl: schema.recordings.videoUrl,
200
+ videoSizeBytes: schema.recordings.videoSizeBytes,
201
+ durationMs: schema.recordings.durationMs,
199
202
  })
200
203
  .from(schema.recordings)
201
204
  .where(
@@ -255,7 +258,18 @@ export default defineEventHandler(async (event: H3Event) => {
255
258
  // Already finalized — retried final chunk after session was deleted. Skip
256
259
  // buffered path writes so recording-upload-* state stays correct.
257
260
  if (existing.status === "ready") {
258
- return { ok: true, finalized: true };
261
+ const readyState = await readAppState(
262
+ `recording-upload-${recordingId}`,
263
+ ).catch(() => null);
264
+ return {
265
+ ok: true,
266
+ finalized: true,
267
+ status: "ready" as const,
268
+ videoUrl: existing.videoUrl,
269
+ videoSizeBytes: existing.videoSizeBytes,
270
+ durationMs: existing.durationMs,
271
+ sourceSizeBytes: stateNumber(readyState, "sourceSizeBytes"),
272
+ };
259
273
  }
260
274
 
261
275
  // Store chunks in application_state, assemble on finalize.
@@ -569,6 +583,7 @@ export default defineEventHandler(async (event: H3Event) => {
569
583
  id: schema.recordings.id,
570
584
  status: schema.recordings.status,
571
585
  videoUrl: schema.recordings.videoUrl,
586
+ videoSizeBytes: schema.recordings.videoSizeBytes,
572
587
  durationMs: schema.recordings.durationMs,
573
588
  width: schema.recordings.width,
574
589
  height: schema.recordings.height,
@@ -590,12 +605,26 @@ export default defineEventHandler(async (event: H3Event) => {
590
605
  error: err instanceof Error ? err.message : String(err),
591
606
  },
592
607
  );
608
+ const priorReadyStateRaw = await readAppState(
609
+ `recording-upload-${recordingId}`,
610
+ ).catch(() => null);
611
+ const priorReadyState =
612
+ priorReadyStateRaw && typeof priorReadyStateRaw === "object"
613
+ ? (priorReadyStateRaw as Record<string, unknown>)
614
+ : {};
615
+ const sourceSizeBytes =
616
+ stateNumber(priorReadyState, "sourceSizeBytes") ??
617
+ stateNumber(priorReadyState, "bytesReceived");
593
618
  try {
594
619
  await writeAppState(`recording-upload-${recordingId}`, {
620
+ ...priorReadyState,
595
621
  recordingId,
596
622
  status: "ready",
597
623
  progress: 100,
598
624
  videoUrl: committed.videoUrl,
625
+ videoSizeBytes: committed.videoSizeBytes,
626
+ sourceSizeBytes,
627
+ durationMs: committed.durationMs,
599
628
  finishedAt: new Date().toISOString(),
600
629
  });
601
630
  } catch (stateErr) {
@@ -612,6 +641,8 @@ export default defineEventHandler(async (event: H3Event) => {
612
641
  id: committed.id,
613
642
  status: "ready",
614
643
  videoUrl: committed.videoUrl,
644
+ videoSizeBytes: committed.videoSizeBytes,
645
+ sourceSizeBytes,
615
646
  durationMs: committed.durationMs,
616
647
  width: committed.width,
617
648
  height: committed.height,
@@ -709,6 +740,7 @@ async function handleResumableChunk(
709
740
 
710
741
  const raw = await readRawBody(event, false);
711
742
  const bytes: Uint8Array = raw ?? new Uint8Array(0);
743
+ let finalizedSourceSizeBytes = session.bytesUploaded;
712
744
 
713
745
  if (!isFinal && bytes.byteLength === 0) {
714
746
  throw createError({ statusCode: 400, message: "Empty chunk body" });
@@ -806,6 +838,7 @@ async function handleResumableChunk(
806
838
  bytesUploaded: start + bytes.byteLength,
807
839
  lastCommittedIndex: index,
808
840
  });
841
+ finalizedSourceSizeBytes = start + bytes.byteLength;
809
842
 
810
843
  if (!isFinal) {
811
844
  return { ok: true, finalized: false, index, bytes: bytes.byteLength };
@@ -838,6 +871,7 @@ async function handleResumableChunk(
838
871
  id: schema.recordings.id,
839
872
  status: schema.recordings.status,
840
873
  videoUrl: schema.recordings.videoUrl,
874
+ videoSizeBytes: schema.recordings.videoSizeBytes,
841
875
  durationMs: schema.recordings.durationMs,
842
876
  width: schema.recordings.width,
843
877
  height: schema.recordings.height,
@@ -856,11 +890,25 @@ async function handleResumableChunk(
856
890
  `[resumable-chunk-${recordingId}] finalize reported an error after committing a ready recording; returning committed success.`,
857
891
  { error: err instanceof Error ? err.message : String(err) },
858
892
  );
893
+ const priorReadyStateRaw = await readAppState(
894
+ `recording-upload-${recordingId}`,
895
+ ).catch(() => null);
896
+ const priorReadyState =
897
+ priorReadyStateRaw && typeof priorReadyStateRaw === "object"
898
+ ? (priorReadyStateRaw as Record<string, unknown>)
899
+ : {};
900
+ const sourceSizeBytes =
901
+ stateNumber(priorReadyState, "sourceSizeBytes") ??
902
+ finalizedSourceSizeBytes;
859
903
  await writeAppState(`recording-upload-${recordingId}`, {
904
+ ...priorReadyState,
860
905
  recordingId,
861
906
  status: "ready",
862
907
  progress: 100,
863
908
  videoUrl: committed.videoUrl,
909
+ videoSizeBytes: committed.videoSizeBytes,
910
+ sourceSizeBytes,
911
+ durationMs: committed.durationMs,
864
912
  finishedAt: new Date().toISOString(),
865
913
  }).catch((stateErr) =>
866
914
  console.warn(
@@ -875,6 +923,8 @@ async function handleResumableChunk(
875
923
  id: committed.id,
876
924
  status: "ready",
877
925
  videoUrl: committed.videoUrl,
926
+ videoSizeBytes: committed.videoSizeBytes,
927
+ sourceSizeBytes,
878
928
  durationMs: committed.durationMs,
879
929
  width: committed.width,
880
930
  height: committed.height,
@@ -64,7 +64,6 @@ import {
64
64
  loomEmbedUrlForRecording,
65
65
  } from "../../../../shared/loom.js";
66
66
  import { getDb, schema } from "../../../db/index.js";
67
- import { builderCompressedMediaUrl } from "../../../lib/builder-media-compression.js";
68
67
  import { getOrganizationRoleForEmail } from "../../../lib/recordings.js";
69
68
  import { verifySharePassword } from "../../../lib/share-password.js";
70
69
 
@@ -89,8 +88,6 @@ const PROXIED_HEADER_NAMES = [
89
88
  const PROVIDER_MEDIA_FETCH_TIMEOUT_MS = 30_000;
90
89
  const PROTECTED_MEDIA_ACCESS_TTL_SECONDS = 6 * 60 * 60;
91
90
  const PROTECTED_MEDIA_COOKIE_PREFIX = "clips_media_";
92
- const COMPRESSED_BUILDER_MEDIA_MISS_TTL_MS = 5_000;
93
- const compressedBuilderMediaMisses = new Map<string, number>();
94
91
 
95
92
  function appPath(path: string): string {
96
93
  if (!path.startsWith("/")) return path;
@@ -150,42 +147,6 @@ function isRecursiveVideoRouteUrl(value: string, recordingId: string): boolean {
150
147
  }
151
148
  }
152
149
 
153
- function shouldSkipCompressedBuilderMediaProbe(
154
- compressedSourceUrl: string,
155
- ): boolean {
156
- const expiresAt = compressedBuilderMediaMisses.get(compressedSourceUrl);
157
- if (!expiresAt) return false;
158
- if (expiresAt <= Date.now()) {
159
- compressedBuilderMediaMisses.delete(compressedSourceUrl);
160
- return false;
161
- }
162
- return true;
163
- }
164
-
165
- function rememberCompressedBuilderMediaMiss(compressedSourceUrl: string): void {
166
- if (compressedBuilderMediaMisses.size > 1_000) {
167
- for (const [url, expiresAt] of compressedBuilderMediaMisses) {
168
- if (expiresAt <= Date.now()) compressedBuilderMediaMisses.delete(url);
169
- }
170
- }
171
- compressedBuilderMediaMisses.set(
172
- compressedSourceUrl,
173
- Date.now() + COMPRESSED_BUILDER_MEDIA_MISS_TTL_MS,
174
- );
175
- }
176
-
177
- function shouldFallbackToOriginalMedia(
178
- upstream: Response | { error: string; status: number },
179
- ): boolean {
180
- return upstream.status >= 500 || [403, 404, 416].includes(upstream.status);
181
- }
182
-
183
- function shouldRememberCompressedBuilderMediaMiss(
184
- upstream: Response | { error: string; status: number },
185
- ): boolean {
186
- return upstream.status >= 500 || [403, 404].includes(upstream.status);
187
- }
188
-
189
150
  async function fetchProviderMedia(
190
151
  sourceUrl: string,
191
152
  rangeHeader: string | undefined,
@@ -492,31 +453,7 @@ export default defineEventHandler(async (event: H3Event) => {
492
453
 
493
454
  let upstream: Response | { error: string; status: number };
494
455
  try {
495
- const compressedSourceUrl = builderCompressedMediaUrl(sourceUrl);
496
- if (
497
- compressedSourceUrl &&
498
- !shouldSkipCompressedBuilderMediaProbe(compressedSourceUrl)
499
- ) {
500
- try {
501
- upstream = await fetchProviderMedia(
502
- compressedSourceUrl,
503
- rangeHeader,
504
- );
505
- } catch (err) {
506
- upstream = {
507
- status: statusCodeForProviderFetchError(err),
508
- error: messageForProviderFetchError(err),
509
- };
510
- }
511
- if (shouldRememberCompressedBuilderMediaMiss(upstream)) {
512
- rememberCompressedBuilderMediaMiss(compressedSourceUrl);
513
- }
514
- if (shouldFallbackToOriginalMedia(upstream)) {
515
- upstream = await fetchProviderMedia(sourceUrl, rangeHeader);
516
- }
517
- } else {
518
- upstream = await fetchProviderMedia(sourceUrl, rangeHeader);
519
- }
456
+ upstream = await fetchProviderMedia(sourceUrl, rangeHeader);
520
457
  } catch (err) {
521
458
  setResponseStatus(event, statusCodeForProviderFetchError(err));
522
459
  return { error: messageForProviderFetchError(err) };
@@ -18,13 +18,21 @@ export interface MediaWorkerJob {
18
18
  callback: { url: string };
19
19
  }
20
20
 
21
- export interface MediaWorkerCallback {
22
- jobId: string;
23
- status: "done" | "failed";
24
- outputUrl?: string;
25
- error?: string;
26
- durationMs?: number;
27
- }
21
+ export type MediaWorkerCallback =
22
+ | {
23
+ jobId: string;
24
+ status: "done";
25
+ outputUrl?: string;
26
+ error?: string;
27
+ durationMs: number;
28
+ }
29
+ | {
30
+ jobId: string;
31
+ status: "failed";
32
+ outputUrl?: string;
33
+ error?: string;
34
+ durationMs?: number;
35
+ };
28
36
 
29
37
  export interface MediaWorkerSignatureHeaders {
30
38
  [MEDIA_WORKER_TIMESTAMP_HEADER]: string;
@@ -125,22 +133,31 @@ export function parseMediaWorkerCallback(
125
133
  return null;
126
134
  }
127
135
  if (body.error !== undefined && typeof body.error !== "string") return null;
136
+ const durationMs =
137
+ typeof body.durationMs === "number" && Number.isFinite(body.durationMs)
138
+ ? Math.round(body.durationMs)
139
+ : undefined;
140
+ if (body.status === "done") {
141
+ if (durationMs === undefined || durationMs <= 0) return null;
142
+ return {
143
+ jobId: body.jobId,
144
+ status: "done",
145
+ outputUrl: body.outputUrl,
146
+ error: body.error,
147
+ durationMs,
148
+ };
149
+ }
128
150
  if (
129
151
  body.durationMs !== undefined &&
130
- (typeof body.durationMs !== "number" ||
131
- !Number.isFinite(body.durationMs) ||
132
- body.durationMs < 0)
152
+ (durationMs === undefined || durationMs < 0)
133
153
  ) {
134
154
  return null;
135
155
  }
136
156
  return {
137
157
  jobId: body.jobId,
138
- status: body.status,
158
+ status: "failed",
139
159
  outputUrl: body.outputUrl,
140
160
  error: body.error,
141
- durationMs:
142
- typeof body.durationMs === "number"
143
- ? Math.round(body.durationMs)
144
- : undefined,
161
+ durationMs,
145
162
  };
146
163
  }
@@ -21,6 +21,12 @@ actions, and local folders that sync into the same database model.
21
21
 
22
22
  ## Choose The Path
23
23
 
24
+ - Before drafting or materially rewriting, read the `creative-context` skill.
25
+ Retrieve voice, terminology, audience guidance, and factual evidence as
26
+ separate roles; respect opt-out and pinned packs. Apply the exact reuse
27
+ ladder: approved native template/asset unchanged, compose approved pieces,
28
+ lightly adapt a real example, generate from narrow references, then net-new
29
+ only when the relevant corpus is empty.
24
30
  - Use Content actions when the Content MCP/action tools are available:
25
31
  `list-documents`, `search-documents`, `get-document`, `pull-document`,
26
32
  `create-document`, `edit-document`, `update-document`, `delete-document`,
@@ -41,6 +47,16 @@ actions, and local folders that sync into the same database model.
41
47
  `.md`/`.mdx` files directly, preserve frontmatter and MDX imports, and tell
42
48
  the user the Content action surface was not available.
43
49
 
50
+ Retrieval is separate from drafting. Exact source item versions may support
51
+ claims; voice examples alone may not. Persist the immutable `contextPackId` and
52
+ reuse labels with document generation provenance so later edits can explain
53
+ what influenced the copy.
54
+
55
+ For `create-document`, pass the pre-drafting search result's `contextPackId`
56
+ and exact `reuseLabels`. Do not let the final write action search after the
57
+ document body has already been authored; post-hoc search is not provenance.
58
+ Omit both only when the Library is empty or creative context is explicitly Off.
59
+
44
60
  ## Action Examples
45
61
 
46
62
  Prefer JSON input for action calls:
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: creative-context
3
+ description: >-
4
+ Reuse creative context across generation while respecting explicit context
5
+ choices, pinned packs, provenance, and opt-out state.
6
+ scope: app
7
+ metadata:
8
+ internal: true
9
+ ---
10
+
11
+ # Creative Context
12
+
13
+ Use the shared creative-context library to reuse verified source material
14
+ without turning prior work into an invisible global prompt.
15
+
16
+ ## Reuse ladder
17
+
18
+ Apply the first viable option in this exact order:
19
+
20
+ 1. Reuse an approved native asset, component, or template unchanged.
21
+ 2. Compose approved native pieces without flattening or recreating them.
22
+ 3. Duplicate and lightly adapt a real approved example.
23
+ 4. Generate new work conditioned on narrowly retrieved references.
24
+ 5. Generate net-new work only when the relevant corpus is empty.
25
+
26
+ Do not skip directly to imitation or net-new generation when an approved native
27
+ primitive already fits.
28
+
29
+ ## Retrieval procedure
30
+
31
+ Retrieve context in this order, stopping as soon as the current request is
32
+ sufficiently grounded. Keep factual evidence, visual/style references,
33
+ voice/terminology, and structural/layout examples in separate queries so one
34
+ role cannot silently stand in for another:
35
+
36
+ 1. Follow the user's explicit instructions and the object currently selected in
37
+ the app.
38
+ 2. Read the `creative-context` application-state record. If
39
+ `pinnedPackId` is set, prefer that immutable pack. Otherwise use
40
+ `currentPackId` when it records context already selected for this session.
41
+ 3. Call `search-creative-context` with a narrow query for exact facts, visual
42
+ language, audience guidance, prior decisions, or reusable references.
43
+ 4. Call `get-context-item` only for the specific search result versions
44
+ needed for the work. Preserve source and version provenance.
45
+ 5. Fall back to app-local design systems, assets, documents, and current-user
46
+ instructions when the shared library has no relevant evidence.
47
+
48
+ Do not load the whole library or paste large source dumps into a prompt.
49
+ Context packs are generation snapshots; do not silently rewrite a historical
50
+ pack after it has been used.
51
+
52
+ For an inbound Creative Context machine-protocol A2A request, call
53
+ `creative-context-a2a` exactly once with its opaque `requestToken`, then return
54
+ the action's `responseToken` verbatim. Never decode or broaden the request.
55
+
56
+ ## Context opt-out
57
+
58
+ The single state key is `creative-context`:
59
+
60
+ ```json
61
+ {
62
+ "contextMode": "auto",
63
+ "currentPackId": null,
64
+ "pinnedPackId": null
65
+ }
66
+ ```
67
+
68
+ When `contextMode` is `off`, do not search, select, or apply saved creative
69
+ context for subsequent generations. Do not restore a previous pack
70
+ automatically. Historical output may keep its original pack provenance. A
71
+ one-turn instruction such as "ignore the library for this version" wins for
72
+ that turn, but does not change the saved preference unless the user asks.
73
+
74
+ When the user corrects reused context, call `record-context-feedback` against
75
+ the exact item/version and signal whether it was unhelpful, incorrect, or
76
+ outdated. Never invent a source or silently overwrite source history.
77
+
78
+ ## Content reuse
79
+
80
+ Search voice, terminology, audience, and factual evidence as separate intents.
81
+ Use voice/style examples to guide phrasing, but only exact evidence item
82
+ versions may support factual claims. Preserve the returned `contextPackId`
83
+ and short reuse labels with the document generation provenance. A published
84
+ brand profile can guide tone automatically; it never overrides the user's
85
+ current brief, and it must not turn an unsupported prior claim into a fact.
@@ -9,6 +9,14 @@ description: >-
9
9
 
10
10
  The content app can sync documents bidirectionally with Notion. Documents can be linked to Notion pages, pulled from Notion, or pushed to Notion.
11
11
 
12
+ Notion sync is not creative-context retrieval. When drafting new copy from a
13
+ synced page, read the `creative-context` skill first and retrieve voice,
14
+ terminology, audience guidance, and factual evidence as separate roles. Apply
15
+ its exact reuse ladder, respect opt-out/pinned packs, and use app-local Notion
16
+ content as the fallback when the shared corpus has no relevant evidence. Keep
17
+ the resulting immutable `contextPackId` and reuse labels with document
18
+ generation provenance; never infer them from a later Notion sync snapshot.
19
+
12
20
  ## Scripts
13
21
 
14
22
  ### connect-notion-status
@@ -38,6 +38,12 @@ Detailed document editing, Notion, storage, and UI rules live in
38
38
 
39
39
  ## Application State
40
40
 
41
+ - Before generation, follow the creative-context reuse ladder in
42
+ `.agents/skills/creative-context/SKILL.md`: explicit request and current
43
+ document first, then a pinned/current pack, then narrow library search.
44
+ Respect `creative-context.contextMode: "off"` without silently restoring a
45
+ pack.
46
+
41
47
  - `navigation` exposes document, selected block, comment, media, and Notion view
42
48
  context.
43
49
  - `navigate` moves the UI to documents, comments, media, and settings surfaces.
@@ -45,6 +51,9 @@ Detailed document editing, Notion, storage, and UI rules live in
45
51
 
46
52
  ## Skills
47
53
 
54
+ - `creative-context` for cross-app source reuse, pinned packs, provenance, and
55
+ context opt-out.
56
+
48
57
  Read the relevant skill before deeper work:
49
58
 
50
59
  - `document-editing` for structured document updates.
@@ -6,6 +6,10 @@ import {
6
6
  getRequestOrgId,
7
7
  } from "@agent-native/core/server/request-context";
8
8
  import { assertAccess, type ShareRole } from "@agent-native/core/sharing";
9
+ import {
10
+ recordGenerationCreativeContext,
11
+ validateGenerationCreativeContext,
12
+ } from "@agent-native/creative-context/server";
9
13
  import { and, eq, sql } from "drizzle-orm";
10
14
  import { z } from "zod";
11
15
 
@@ -28,6 +32,34 @@ function nanoid(size = 12): string {
28
32
  return id;
29
33
  }
30
34
 
35
+ const reuseLabelSchema = z
36
+ .object({
37
+ itemId: z.string().min(1).optional(),
38
+ itemVersionId: z.string().min(1).optional(),
39
+ kind: z.string().min(1),
40
+ label: z.string().min(1),
41
+ dataRole: z.literal("untrusted-reference").default("untrusted-reference"),
42
+ elementId: z.string().min(1).optional(),
43
+ influence: z
44
+ .enum(["reused", "adapted", "reference-conditioned", "generated"])
45
+ .optional(),
46
+ })
47
+ .superRefine((label, context) => {
48
+ const influence = label.influence ?? "reference-conditioned";
49
+ if (Boolean(label.itemId) !== Boolean(label.itemVersionId)) {
50
+ context.addIssue({
51
+ code: "custom",
52
+ message: "itemId and itemVersionId must be provided together",
53
+ });
54
+ }
55
+ if (influence !== "generated" && !label.itemId) {
56
+ context.addIssue({
57
+ code: "custom",
58
+ message: "Only generated labels may omit context item ids",
59
+ });
60
+ }
61
+ });
62
+
31
63
  export default defineAction({
32
64
  description: "Create a new document.",
33
65
  schema: z.object({
@@ -49,6 +81,21 @@ export default defineAction({
49
81
  ),
50
82
  parentId: z.string().nullish().describe("Parent document ID for nesting"),
51
83
  icon: z.string().optional().describe("Emoji icon"),
84
+ contextPackId: z
85
+ .string()
86
+ .optional()
87
+ .describe("Immutable pack returned by pre-generation context search"),
88
+ contextModeOverride: z
89
+ .literal("off")
90
+ .optional()
91
+ .describe(
92
+ "Disable Creative Context for this document generation only without changing the saved preference.",
93
+ ),
94
+ reuseLabels: z
95
+ .array(reuseLabelSchema)
96
+ .optional()
97
+ .default([])
98
+ .describe("Exact context item versions used to draft this document"),
52
99
  }),
53
100
  mcpApp: {
54
101
  compactCatalog: true,
@@ -62,6 +109,43 @@ export default defineAction({
62
109
  }),
63
110
  },
64
111
  run: async (args) => {
112
+ const hasCreativeContextInput = Boolean(
113
+ args.contextPackId ||
114
+ args.contextModeOverride ||
115
+ args.reuseLabels.length > 0,
116
+ );
117
+ const validatedCreativeContext = hasCreativeContextInput
118
+ ? await validateGenerationCreativeContext({
119
+ contextPackId: args.contextPackId,
120
+ contextModeOverride: args.contextModeOverride,
121
+ reuseLabels: args.reuseLabels,
122
+ })
123
+ : null;
124
+ const creativeContextProvenance = validatedCreativeContext
125
+ ? {
126
+ contextMode: validatedCreativeContext.contextMode,
127
+ contextPackId: validatedCreativeContext.contextPackId,
128
+ reuseLabels: validatedCreativeContext.reuseLabels,
129
+ }
130
+ : null;
131
+ const elementProvenanceFor = (documentId: string) =>
132
+ creativeContextProvenance?.reuseLabels.length
133
+ ? creativeContextProvenance.reuseLabels.map((label) => ({
134
+ elementId: label.elementId ?? documentId,
135
+ influence: label.influence ?? ("reference-conditioned" as const),
136
+ ...(label.itemId ? { itemId: label.itemId } : {}),
137
+ ...(label.itemVersionId
138
+ ? { itemVersionId: label.itemVersionId }
139
+ : {}),
140
+ label: label.label,
141
+ }))
142
+ : [
143
+ {
144
+ elementId: documentId,
145
+ influence: "generated" as const,
146
+ label: "Net-new document",
147
+ },
148
+ ];
65
149
  const title = args.title;
66
150
 
67
151
  let content = args.content || "";
@@ -208,6 +292,15 @@ export default defineAction({
208
292
  );
209
293
 
210
294
  await writeAppState("refresh-signal", { ts: Date.now() });
295
+ if (creativeContextProvenance) {
296
+ await recordGenerationCreativeContext({
297
+ appId: "content",
298
+ artifactType: "document",
299
+ artifactId: doc.id,
300
+ ...creativeContextProvenance,
301
+ elementProvenance: elementProvenanceFor(doc.id),
302
+ });
303
+ }
211
304
 
212
305
  return {
213
306
  id: doc.id,
@@ -231,6 +324,7 @@ export default defineAction({
231
324
  canManage: inheritedRole === "owner" || inheritedRole === "admin",
232
325
  createdAt: doc.createdAt,
233
326
  updatedAt: doc.updatedAt,
327
+ ...(creativeContextProvenance ?? {}),
234
328
  };
235
329
  },
236
330
  link: ({ result }) => {