@agent-native/core 0.69.0 → 0.70.1

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 (336) hide show
  1. package/README.md +15 -15
  2. package/corpus/README.md +2 -2
  3. package/corpus/core/CHANGELOG.md +109 -0
  4. package/corpus/core/docs/design/durable-agent-runs.md +217 -0
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/action.ts +89 -0
  7. package/corpus/core/src/agent/model-config.ts +0 -2
  8. package/corpus/core/src/agent/run-loop-with-resume.ts +48 -0
  9. package/corpus/core/src/changelog/parse.ts +245 -0
  10. package/corpus/core/src/cli/changelog.ts +199 -0
  11. package/corpus/core/src/cli/index.ts +19 -0
  12. package/corpus/core/src/cli/recap.ts +24 -1
  13. package/corpus/core/src/cli/skills.ts +74 -47
  14. package/corpus/core/src/client/AgentPanel.tsx +5 -3
  15. package/corpus/core/src/client/AssistantChat.tsx +8 -0
  16. package/corpus/core/src/client/CommandMenu.tsx +183 -75
  17. package/corpus/core/src/client/agent-chat-adapter.ts +44 -7
  18. package/corpus/core/src/client/analytics.ts +181 -0
  19. package/corpus/core/src/client/changelog/Changelog.tsx +321 -0
  20. package/corpus/core/src/client/client-surface.ts +41 -0
  21. package/corpus/core/src/client/composer/TiptapComposer.tsx +123 -12
  22. package/corpus/core/src/client/feedback-context.ts +4 -0
  23. package/corpus/core/src/client/index.ts +12 -0
  24. package/corpus/core/src/client/mcp-apps/McpAppRenderer.tsx +54 -0
  25. package/corpus/core/src/client/settings/useBuilderStatus.ts +82 -20
  26. package/corpus/core/src/client/sse-event-processor.ts +7 -1
  27. package/corpus/core/src/mcp/build-server.ts +57 -1
  28. package/corpus/core/src/mcp/embed-app.ts +197 -7
  29. package/corpus/core/src/mcp/oauth-route.ts +109 -13
  30. package/corpus/core/src/server/attribution.ts +211 -0
  31. package/corpus/core/src/server/auth.ts +6 -0
  32. package/corpus/core/src/server/better-auth-instance.ts +49 -5
  33. package/corpus/core/src/server/builder-browser.ts +27 -1
  34. package/corpus/core/src/server/core-routes-plugin.ts +136 -0
  35. package/corpus/core/src/server/google-oauth.ts +19 -6
  36. package/corpus/core/src/server/onboarding-html.ts +35 -0
  37. package/corpus/core/src/shared/mcp-embed-headers.ts +1 -1
  38. package/corpus/core/src/styles/agent-conversation.css +21 -0
  39. package/corpus/core/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  40. package/corpus/core/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
  41. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  42. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +22 -0
  43. package/corpus/templates/analytics/AGENTS.md +8 -1
  44. package/corpus/templates/analytics/CHANGELOG.md +10 -0
  45. package/corpus/templates/analytics/actions/install-dashboard-template.ts +99 -4
  46. package/corpus/templates/analytics/actions/open-traffic-dashboard.ts +1 -1
  47. package/corpus/templates/analytics/actions/update-dashboard.ts +39 -8
  48. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +30 -3
  49. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +180 -144
  50. package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -3
  51. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
  52. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +221 -215
  53. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +6 -6
  54. package/corpus/templates/analytics/app/lib/demo-dashboard-path.ts +1 -1
  55. package/corpus/templates/analytics/app/lib/last-opened.ts +2 -1
  56. package/corpus/templates/analytics/app/pages/Settings.tsx +4 -0
  57. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +3 -3
  58. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +2 -2
  59. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +32 -2
  60. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +101 -99
  61. package/corpus/templates/analytics/app/pages/overview/OverviewPage.tsx +1 -1
  62. package/corpus/templates/analytics/app/routes/adhoc.$id.tsx +18 -5
  63. package/corpus/templates/analytics/app/routes/catalog.tsx +1 -1
  64. package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +9 -0
  65. package/corpus/templates/analytics/app/routes/traffic.tsx +1 -1
  66. package/corpus/templates/analytics/changelog/2026-06-23-long-dashboard-and-analysis-names-in-the-sidebar-now-truncat.md +6 -0
  67. package/corpus/templates/analytics/changelog/2026-06-23-open-any-dashboard-chart-full-screen-in-a-modal-from-the-pan.md +6 -0
  68. package/corpus/templates/analytics/changelog/2026-06-23-the-dashboards-and-analyses-sidebar-settings-buttons-now-sta.md +6 -0
  69. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +145 -0
  70. package/corpus/templates/analytics/server/db/index.ts +1 -1
  71. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +9 -2
  72. package/corpus/templates/analytics/server/lib/demo-dashboards.ts +1 -1
  73. package/corpus/templates/analytics/server/plugins/agent-chat.ts +2 -2
  74. package/corpus/templates/analytics/server/plugins/core-routes.ts +6 -6
  75. package/corpus/templates/assets/CHANGELOG.md +10 -0
  76. package/corpus/templates/assets/actions/generate-image.ts +24 -0
  77. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
  78. package/corpus/templates/assets/app/global.css +17 -1
  79. package/corpus/templates/assets/app/root.tsx +7 -1
  80. package/corpus/templates/assets/app/routes/_index.tsx +94 -14
  81. package/corpus/templates/assets/app/routes/settings.tsx +6 -0
  82. package/corpus/templates/assets/changelog/2026-06-23-chat-dates-in-the-sidebar-no-longer-wrap-onto-two-lines.md +6 -0
  83. package/corpus/templates/assets/changelog/2026-06-23-clicking-image-video-or-refine-on-the-start-screen-now-drops.md +6 -0
  84. package/corpus/templates/assets/changelog/2026-06-23-pick-your-image-generation-model-right-from-the-chat-model-m.md +6 -0
  85. package/corpus/templates/brain/CHANGELOG.md +10 -0
  86. package/corpus/templates/brain/app/root.tsx +7 -1
  87. package/corpus/templates/brain/app/routes/settings.tsx +8 -1
  88. package/corpus/templates/calendar/CHANGELOG.md +10 -0
  89. package/corpus/templates/calendar/app/pages/Settings.tsx +4 -0
  90. package/corpus/templates/calendar/app/root.tsx +7 -1
  91. package/corpus/templates/chat/CHANGELOG.md +10 -0
  92. package/corpus/templates/chat/app/root.tsx +7 -1
  93. package/corpus/templates/clips/CHANGELOG.md +10 -0
  94. package/corpus/templates/clips/app/components/library/library-grid.tsx +1 -20
  95. package/corpus/templates/clips/app/components/player/share-dialog.tsx +33 -7
  96. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +8 -0
  97. package/corpus/templates/clips/app/components/player/video-player.tsx +150 -20
  98. package/corpus/templates/clips/app/components/recorder/countdown-overlay.tsx +72 -48
  99. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +7 -11
  100. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +31 -0
  101. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +71 -0
  102. package/corpus/templates/clips/app/lib/countdown-audio-cue.ts +35 -17
  103. package/corpus/templates/clips/app/root.tsx +7 -1
  104. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +15 -1
  105. package/corpus/templates/clips/app/routes/record.tsx +78 -5
  106. package/corpus/templates/clips/app/routes/share.$shareId.tsx +86 -5
  107. package/corpus/templates/clips/changelog/2026-06-23-clips-shared-in-slack-no-longer-show-a-could-not-start-playb.md +6 -0
  108. package/corpus/templates/clips/changelog/2026-06-23-made-the-play-button-on-shared-and-embedded-clips-scale-with.md +6 -0
  109. package/corpus/templates/clips/changelog/2026-06-23-public-clip-share-links-now-show-whether-they-ll-play-inline.md +6 -0
  110. package/corpus/templates/clips/changelog/2026-06-23-removed-select-button-from-library-hover-a-clip-to-select-it.md +6 -0
  111. package/corpus/templates/clips/changelog/2026-06-23-screen-camera-recordings-now-keep-the-presenter-s-face-in-th.md +6 -0
  112. package/corpus/templates/clips/changelog/2026-06-23-shared-video-links-now-play-for-anyone-without-signing-in.md +6 -0
  113. package/corpus/templates/clips/changelog/2026-06-23-skip-or-cancel-the-recording-countdown-with-buttons-beside-t.md +6 -0
  114. package/corpus/templates/clips/changelog/2026-06-23-the-desktop-camera-bubble-now-looks-sharp-the-instant-it-ope.md +6 -0
  115. package/corpus/templates/clips/changelog/2026-06-23-the-desktop-recording-widget-now-grows-downward-only-when-yo.md +6 -0
  116. package/corpus/templates/clips/changelog/2026-06-23-the-recording-start-sound-is-now-a-softer-more-modern-chime.md +6 -0
  117. package/corpus/templates/clips/chrome-extension/public/manifest.json +17 -8
  118. package/corpus/templates/clips/chrome-extension/src/background.ts +769 -180
  119. package/corpus/templates/clips/chrome-extension/src/content-script.ts +177 -0
  120. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +466 -329
  121. package/corpus/templates/clips/chrome-extension/src/overlay.css +377 -0
  122. package/corpus/templates/clips/chrome-extension/src/overlay.html +12 -0
  123. package/corpus/templates/clips/chrome-extension/src/overlay.ts +330 -0
  124. package/corpus/templates/clips/chrome-extension/src/permission.html +227 -0
  125. package/corpus/templates/clips/chrome-extension/src/permission.ts +105 -0
  126. package/corpus/templates/clips/chrome-extension/src/popup.html +3 -0
  127. package/corpus/templates/clips/chrome-extension/src/popup.ts +50 -2
  128. package/corpus/templates/clips/chrome-extension/src/styles.css +50 -0
  129. package/corpus/templates/clips/chrome-extension/vite.config.ts +3 -0
  130. package/corpus/templates/clips/desktop/src/lib/audio-cue.ts +41 -24
  131. package/corpus/templates/clips/desktop/src/lib/bubble-webrtc.ts +119 -2
  132. package/corpus/templates/clips/desktop/src/lib/recorder.ts +20 -0
  133. package/corpus/templates/clips/desktop/src/main.tsx +3 -0
  134. package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +21 -2
  135. package/corpus/templates/clips/desktop/src/overlays/region-record-border.tsx +76 -0
  136. package/corpus/templates/clips/desktop/src/styles.css +119 -2
  137. package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +2 -1
  138. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +140 -1
  139. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -0
  140. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +4 -1
  141. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +85 -6
  142. package/corpus/templates/clips/shared/share-attribution.ts +79 -0
  143. package/corpus/templates/content/AGENTS.md +20 -3
  144. package/corpus/templates/content/CHANGELOG.md +10 -0
  145. package/corpus/templates/content/actions/_database-utils.ts +15 -0
  146. package/corpus/templates/content/actions/_property-utils.ts +371 -4
  147. package/corpus/templates/content/actions/configure-document-property.ts +35 -1
  148. package/corpus/templates/content/actions/create-content-database.ts +5 -1
  149. package/corpus/templates/content/actions/delete-document-property.ts +52 -2
  150. package/corpus/templates/content/actions/duplicate-document-property.ts +34 -17
  151. package/corpus/templates/content/actions/reorder-document-property.ts +79 -0
  152. package/corpus/templates/content/actions/set-document-property.ts +39 -0
  153. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +806 -0
  154. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +226 -68
  155. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +59 -30
  156. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +25 -1
  157. package/corpus/templates/content/app/components/editor/blockFieldSaveController.ts +180 -0
  158. package/corpus/templates/content/app/components/editor/blockFieldSaveRegistry.ts +179 -0
  159. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +244 -0
  160. package/corpus/templates/content/app/components/editor/previewDocumentSaveRegistry.ts +132 -0
  161. package/corpus/templates/content/app/global.css +9 -0
  162. package/corpus/templates/content/app/hooks/use-document-properties.ts +21 -0
  163. package/corpus/templates/content/app/root.tsx +7 -1
  164. package/corpus/templates/content/server/db/schema.ts +30 -0
  165. package/corpus/templates/content/server/plugins/db.ts +87 -0
  166. package/corpus/templates/content/shared/api.ts +7 -0
  167. package/corpus/templates/content/shared/properties.ts +109 -0
  168. package/corpus/templates/design/CHANGELOG.md +10 -0
  169. package/corpus/templates/design/actions/generate-design.ts +4 -0
  170. package/corpus/templates/design/app/root.tsx +7 -1
  171. package/corpus/templates/design/app/routes/settings.tsx +10 -2
  172. package/corpus/templates/dispatch/CHANGELOG.md +10 -0
  173. package/corpus/templates/dispatch/app/root.tsx +7 -1
  174. package/corpus/templates/forms/.agents/skills/form-responses/SKILL.md +10 -0
  175. package/corpus/templates/forms/CHANGELOG.md +10 -0
  176. package/corpus/templates/forms/actions/export-responses.ts +6 -0
  177. package/corpus/templates/forms/actions/list-responses.ts +2 -0
  178. package/corpus/templates/forms/actions/response-insights.ts +2 -0
  179. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +138 -1
  180. package/corpus/templates/forms/app/root.tsx +7 -1
  181. package/corpus/templates/forms/changelog/2026-06-23-response-tables-now-show-the-page-each-submission-came-from-.md +6 -0
  182. package/corpus/templates/forms/changelog/2026-06-23-response-tables-now-show-whether-feedback-came-from-the-web-.md +6 -0
  183. package/corpus/templates/forms/server/db/schema.ts +7 -0
  184. package/corpus/templates/forms/server/handlers/submissions.ts +19 -2
  185. package/corpus/templates/forms/server/lib/integrations.ts +76 -2
  186. package/corpus/templates/forms/server/plugins/db.ts +20 -0
  187. package/corpus/templates/forms/shared/types.ts +12 -0
  188. package/corpus/templates/macros/CHANGELOG.md +10 -0
  189. package/corpus/templates/macros/app/root.tsx +7 -1
  190. package/corpus/templates/mail/CHANGELOG.md +10 -0
  191. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +3 -0
  192. package/corpus/templates/mail/app/pages/SettingsPage.tsx +27 -0
  193. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +31 -17
  194. package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -4
  195. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +34 -24
  196. package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -4
  197. package/corpus/templates/plan/AGENTS.md +4 -0
  198. package/corpus/templates/plan/CHANGELOG.md +10 -0
  199. package/corpus/templates/plan/actions/view-screen.ts +5 -0
  200. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +98 -1
  201. package/corpus/templates/plan/app/components/plan/wireframe/html-artboard.css +3 -1
  202. package/corpus/templates/plan/app/pages/PlansPage.tsx +107 -7
  203. package/corpus/templates/plan/app/root.tsx +7 -1
  204. package/corpus/templates/plan/changelog/2026-06-23-large-diagrams-in-a-plan-now-scroll-within-their-block-inste.md +6 -0
  205. package/corpus/templates/plan/shared/share-attribution.ts +72 -0
  206. package/corpus/templates/slides/CHANGELOG.md +10 -0
  207. package/corpus/templates/slides/app/root.tsx +7 -1
  208. package/corpus/templates/videos/CHANGELOG.md +4 -151
  209. package/corpus/templates/videos/app/root.tsx +7 -1
  210. package/dist/action.js +87 -0
  211. package/dist/action.js.map +1 -1
  212. package/dist/agent/engine/builder-engine.d.ts +1 -1
  213. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  214. package/dist/agent/model-config.d.ts +2 -2
  215. package/dist/agent/model-config.d.ts.map +1 -1
  216. package/dist/agent/model-config.js +0 -2
  217. package/dist/agent/model-config.js.map +1 -1
  218. package/dist/agent/run-loop-with-resume.d.ts +13 -0
  219. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  220. package/dist/agent/run-loop-with-resume.js +44 -0
  221. package/dist/agent/run-loop-with-resume.js.map +1 -1
  222. package/dist/changelog/parse.d.ts +70 -0
  223. package/dist/changelog/parse.d.ts.map +1 -0
  224. package/dist/changelog/parse.js +200 -0
  225. package/dist/changelog/parse.js.map +1 -0
  226. package/dist/cli/changelog.d.ts +4 -0
  227. package/dist/cli/changelog.d.ts.map +1 -0
  228. package/dist/cli/changelog.js +166 -0
  229. package/dist/cli/changelog.js.map +1 -0
  230. package/dist/cli/index.js +18 -0
  231. package/dist/cli/index.js.map +1 -1
  232. package/dist/cli/recap.d.ts.map +1 -1
  233. package/dist/cli/recap.js +22 -1
  234. package/dist/cli/recap.js.map +1 -1
  235. package/dist/cli/skills.d.ts +3 -3
  236. package/dist/cli/skills.d.ts.map +1 -1
  237. package/dist/cli/skills.js +74 -47
  238. package/dist/cli/skills.js.map +1 -1
  239. package/dist/client/AgentPanel.d.ts.map +1 -1
  240. package/dist/client/AgentPanel.js +5 -3
  241. package/dist/client/AgentPanel.js.map +1 -1
  242. package/dist/client/AssistantChat.d.ts +6 -1
  243. package/dist/client/AssistantChat.d.ts.map +1 -1
  244. package/dist/client/AssistantChat.js +2 -2
  245. package/dist/client/AssistantChat.js.map +1 -1
  246. package/dist/client/CommandMenu.d.ts +17 -1
  247. package/dist/client/CommandMenu.d.ts.map +1 -1
  248. package/dist/client/CommandMenu.js +49 -13
  249. package/dist/client/CommandMenu.js.map +1 -1
  250. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  251. package/dist/client/agent-chat-adapter.js +43 -6
  252. package/dist/client/agent-chat-adapter.js.map +1 -1
  253. package/dist/client/analytics.d.ts +18 -0
  254. package/dist/client/analytics.d.ts.map +1 -1
  255. package/dist/client/analytics.js +177 -0
  256. package/dist/client/analytics.js.map +1 -1
  257. package/dist/client/changelog/Changelog.d.ts +47 -0
  258. package/dist/client/changelog/Changelog.d.ts.map +1 -0
  259. package/dist/client/changelog/Changelog.js +138 -0
  260. package/dist/client/changelog/Changelog.js.map +1 -0
  261. package/dist/client/client-surface.d.ts +17 -0
  262. package/dist/client/client-surface.d.ts.map +1 -0
  263. package/dist/client/client-surface.js +24 -0
  264. package/dist/client/client-surface.js.map +1 -0
  265. package/dist/client/composer/TiptapComposer.d.ts +26 -1
  266. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  267. package/dist/client/composer/TiptapComposer.js +27 -5
  268. package/dist/client/composer/TiptapComposer.js.map +1 -1
  269. package/dist/client/feedback-context.d.ts +3 -0
  270. package/dist/client/feedback-context.d.ts.map +1 -1
  271. package/dist/client/feedback-context.js +2 -0
  272. package/dist/client/feedback-context.js.map +1 -1
  273. package/dist/client/index.d.ts +3 -1
  274. package/dist/client/index.d.ts.map +1 -1
  275. package/dist/client/index.js +3 -1
  276. package/dist/client/index.js.map +1 -1
  277. package/dist/client/mcp-apps/McpAppRenderer.d.ts +1 -0
  278. package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  279. package/dist/client/mcp-apps/McpAppRenderer.js +42 -1
  280. package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
  281. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  282. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  283. package/dist/client/settings/useBuilderStatus.js +58 -10
  284. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  285. package/dist/client/sse-event-processor.d.ts.map +1 -1
  286. package/dist/client/sse-event-processor.js +7 -1
  287. package/dist/client/sse-event-processor.js.map +1 -1
  288. package/dist/mcp/build-server.d.ts +21 -0
  289. package/dist/mcp/build-server.d.ts.map +1 -1
  290. package/dist/mcp/build-server.js +43 -1
  291. package/dist/mcp/build-server.js.map +1 -1
  292. package/dist/mcp/embed-app.d.ts.map +1 -1
  293. package/dist/mcp/embed-app.js +197 -7
  294. package/dist/mcp/embed-app.js.map +1 -1
  295. package/dist/mcp/oauth-route.d.ts.map +1 -1
  296. package/dist/mcp/oauth-route.js +95 -12
  297. package/dist/mcp/oauth-route.js.map +1 -1
  298. package/dist/server/attribution.d.ts +83 -0
  299. package/dist/server/attribution.d.ts.map +1 -0
  300. package/dist/server/attribution.js +178 -0
  301. package/dist/server/attribution.js.map +1 -0
  302. package/dist/server/auth.d.ts.map +1 -1
  303. package/dist/server/auth.js +7 -0
  304. package/dist/server/auth.js.map +1 -1
  305. package/dist/server/better-auth-instance.d.ts +9 -1
  306. package/dist/server/better-auth-instance.d.ts.map +1 -1
  307. package/dist/server/better-auth-instance.js +32 -2
  308. package/dist/server/better-auth-instance.js.map +1 -1
  309. package/dist/server/builder-browser.d.ts +4 -0
  310. package/dist/server/builder-browser.d.ts.map +1 -1
  311. package/dist/server/builder-browser.js +20 -1
  312. package/dist/server/builder-browser.js.map +1 -1
  313. package/dist/server/core-routes-plugin.d.ts +25 -0
  314. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  315. package/dist/server/core-routes-plugin.js +101 -0
  316. package/dist/server/core-routes-plugin.js.map +1 -1
  317. package/dist/server/google-oauth.d.ts.map +1 -1
  318. package/dist/server/google-oauth.js +16 -2
  319. package/dist/server/google-oauth.js.map +1 -1
  320. package/dist/server/onboarding-html.d.ts.map +1 -1
  321. package/dist/server/onboarding-html.js +35 -0
  322. package/dist/server/onboarding-html.js.map +1 -1
  323. package/dist/shared/mcp-embed-headers.js +1 -1
  324. package/dist/shared/mcp-embed-headers.js.map +1 -1
  325. package/dist/styles/agent-conversation.css +21 -0
  326. package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  327. package/dist/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
  328. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  329. package/docs/design/durable-agent-runs.md +217 -0
  330. package/package.json +1 -1
  331. package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  332. package/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
  333. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  334. package/corpus/templates/analytics/app/pages/About.tsx +0 -108
  335. package/corpus/templates/analytics/app/routes/about.tsx +0 -9
  336. /package/corpus/templates/analytics/app/routes/{dashboards.tsx → dashboards._index.tsx} +0 -0
@@ -16,10 +16,18 @@ import {
16
16
  appApiPath,
17
17
  openBuilderConnectPopup,
18
18
  useActionQuery,
19
+ ChangelogSettingsCard,
19
20
  } from "@agent-native/core/client";
21
+ import changelog from "../../CHANGELOG.md?raw";
20
22
  import { toast } from "sonner";
21
23
  import { Button } from "@/components/ui/button";
22
- import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
24
+ import {
25
+ Card,
26
+ CardContent,
27
+ CardDescription,
28
+ CardHeader,
29
+ CardTitle,
30
+ } from "@/components/ui/card";
23
31
  import { Input } from "@/components/ui/input";
24
32
  import { Label } from "@/components/ui/label";
25
33
  import { PageHeader } from "@/components/library/page-header";
@@ -389,6 +397,8 @@ export default function SettingsIndexRoute() {
389
397
  Preferences and connected services for this Clips workspace.
390
398
  </p>
391
399
 
400
+ <ChangelogSettingsCard markdown={changelog} />
401
+
392
402
  <Card id="video-storage" className="scroll-mt-16">
393
403
  <CardHeader>
394
404
  <CardTitle className="text-base flex items-center gap-2">
@@ -462,6 +472,10 @@ export default function SettingsIndexRoute() {
462
472
  <IconBrandSlack className="size-4 text-primary" />
463
473
  Agent-Native Clips for Slack
464
474
  </CardTitle>
475
+ <CardDescription>
476
+ Share a public clip, paste the link in Slack, and it plays inline
477
+ — no extra steps for viewers. Connect each workspace once.
478
+ </CardDescription>
465
479
  </CardHeader>
466
480
  <CardContent className="space-y-4">
467
481
  <div className="flex flex-col gap-3 rounded-md border border-border bg-accent/30 px-3 py-3 sm:flex-row sm:items-center sm:justify-between">
@@ -486,6 +486,65 @@ function captureThumbnailFromPreview(
486
486
  });
487
487
  }
488
488
 
489
+ /** Resolve once the off-screen video has a decoded frame, or after a timeout. */
490
+ function waitForVideoFrame(
491
+ video: HTMLVideoElement,
492
+ timeoutMs: number,
493
+ ): Promise<void> {
494
+ if (video.videoWidth > 0 && video.readyState >= 2) return Promise.resolve();
495
+ return new Promise((resolve) => {
496
+ let settled = false;
497
+ const finish = () => {
498
+ if (settled) return;
499
+ settled = true;
500
+ video.removeEventListener("loadeddata", onReady);
501
+ video.removeEventListener("canplay", onReady);
502
+ clearTimeout(timer);
503
+ resolve();
504
+ };
505
+ const onReady = () => {
506
+ if (video.videoWidth > 0 && video.readyState >= 2) finish();
507
+ };
508
+ video.addEventListener("loadeddata", onReady);
509
+ video.addEventListener("canplay", onReady);
510
+ const timer = setTimeout(finish, timeoutMs);
511
+ onReady();
512
+ });
513
+ }
514
+
515
+ /**
516
+ * Capture a thumbnail from a MediaStream that isn't bound to a visible element
517
+ * — used for the screen+camera composite so the thumbnail includes the camera
518
+ * bubble. Best effort: if it misses, the player's backfill path (which reads
519
+ * the recorded file, also composited) still produces a face thumbnail.
520
+ */
521
+ function captureThumbnailFromStream(
522
+ stream: MediaStream,
523
+ recordingId: string,
524
+ ): void {
525
+ const video = document.createElement("video");
526
+ video.srcObject = stream;
527
+ video.muted = true;
528
+ video.playsInline = true;
529
+ void (async () => {
530
+ try {
531
+ await video.play().catch(() => {});
532
+ await waitForVideoFrame(video, 1500);
533
+ const blob = await captureVideoThumbnailBlob(video);
534
+ if (blob) await uploadRecordingThumbnail(recordingId, blob);
535
+ } catch {
536
+ // best effort — the player has a backfill path if this misses.
537
+ } finally {
538
+ try {
539
+ video.pause();
540
+ } catch {
541
+ // ignore
542
+ }
543
+ video.srcObject = null;
544
+ }
545
+ })();
546
+ }
547
+
489
548
  interface PendingRecording {
490
549
  id: string;
491
550
  uploadChunkUrl: string;
@@ -1024,7 +1083,14 @@ export default function RecordRoute() {
1024
1083
  // chose a specific mic, do not start a parallel system-default mic
1025
1084
  // session for instant transcription; the recorded audio still uses
1026
1085
  // the exact selected device and can be transcribed after upload.
1027
- if (wantsMic && !opts.micDeviceId && liveTranscription.supported) {
1086
+ //
1087
+ // The one exception is when a stale saved mic forced the engine to
1088
+ // fall back to the system default during acquire(): the recording is
1089
+ // now on the default device, so live transcription would use the same
1090
+ // mic and is safe to start.
1091
+ const usingDefaultMic =
1092
+ !opts.micDeviceId || engine.didMicFallBackToDefault();
1093
+ if (wantsMic && usingDefaultMic && liveTranscription.supported) {
1028
1094
  liveTranscription.start();
1029
1095
  }
1030
1096
 
@@ -1673,10 +1739,17 @@ export default function RecordRoute() {
1673
1739
  }
1674
1740
  setUiState("uploading");
1675
1741
  try {
1676
- // Capture a still-frame thumbnail from the preview while the stream is
1677
- // still live — otherwise the library would show a blank card until the
1678
- // owner opens the recording and triggers the player's backfill path.
1679
- captureThumbnailFromPreview(previewVideoRef.current, pending.id);
1742
+ // Capture a still-frame thumbnail while the stream is still live
1743
+ // otherwise the library would show a blank card until the owner opens the
1744
+ // recording and triggers the player's backfill path. In screen+camera
1745
+ // mode the visible preview is screen-only, so grab the composited stream
1746
+ // (screen + camera bubble) to keep the presenter's face in the thumbnail.
1747
+ const compositeStream = engine.getCompositeStream();
1748
+ if (compositeStream) {
1749
+ captureThumbnailFromStream(compositeStream, pending.id);
1750
+ } else {
1751
+ captureThumbnailFromPreview(previewVideoRef.current, pending.id);
1752
+ }
1680
1753
 
1681
1754
  // Stop live transcription and save the native web transcript before the
1682
1755
  // engine finalizes. This gives the recording an instant transcript
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  useCallback,
3
3
  useEffect,
4
+ useMemo,
4
5
  useRef,
5
6
  useState,
6
7
  type ReactNode,
@@ -22,6 +23,7 @@ import {
22
23
  agentNativePath,
23
24
  appBasePath,
24
25
  appPath,
26
+ track,
25
27
  useSession,
26
28
  AgentPanel,
27
29
  getBrowserTabId,
@@ -70,6 +72,10 @@ import {
70
72
  clipsSharePageTitle,
71
73
  displayRecordingTitle,
72
74
  } from "../../shared/share-meta";
75
+ import {
76
+ buildSignupAttributionQuery,
77
+ readShareAttribution,
78
+ } from "../../shared/share-attribution";
73
79
 
74
80
  type SharePageMetaRecording = {
75
81
  id: string;
@@ -274,6 +280,61 @@ export default function ShareRoute() {
274
280
  const loaderData = useLoaderData<typeof loader>() as SharePageLoaderData;
275
281
  const { shareId } = useParams<{ shareId: string }>();
276
282
  const navigate = useNavigate();
283
+
284
+ // Viral attribution: read the `ref`/`via` the visitor arrived on (the tagged
285
+ // share link) so we can fire funnel events and forward attribution into the
286
+ // signup URL even when cookies are blocked or `document.referrer` is empty.
287
+ const attribution = useMemo(
288
+ () =>
289
+ readShareAttribution(
290
+ typeof window === "undefined" ? "" : window.location.search,
291
+ ),
292
+ [],
293
+ );
294
+ const recordingId = shareId ?? "";
295
+
296
+ // share_cta_click — fired alongside (never instead of) the real navigation.
297
+ // `track` is non-throwing, but guard anyway so tracking can never break a CTA.
298
+ const fireShareCtaClick = useCallback(
299
+ (cta: "signup" | "download" | "try_clips" | "signin") => {
300
+ try {
301
+ void track("share_cta_click", {
302
+ surface: "clip",
303
+ recording_id: recordingId,
304
+ cta,
305
+ ref: attribution.ref,
306
+ via: attribution.via,
307
+ });
308
+ } catch {
309
+ // Never let analytics break a CTA.
310
+ }
311
+ },
312
+ [recordingId, attribution.ref, attribution.via],
313
+ );
314
+
315
+ // Forward attribution into the signup URL so it survives blocked cookies.
316
+ const signupHref = appPath(
317
+ `/signup?${buildSignupAttributionQuery(attribution.via)}`,
318
+ );
319
+
320
+ // share_view — fire once when the public share page mounts. The ref guard
321
+ // prevents double-fire across re-renders / StrictMode double-invocation.
322
+ const shareViewFiredRef = useRef(false);
323
+ useEffect(() => {
324
+ if (shareViewFiredRef.current) return;
325
+ shareViewFiredRef.current = true;
326
+ try {
327
+ void track("share_view", {
328
+ surface: "clip",
329
+ recording_id: recordingId,
330
+ ref: attribution.ref,
331
+ via: attribution.via,
332
+ });
333
+ } catch {
334
+ // Never let analytics break the page render.
335
+ }
336
+ }, [recordingId, attribution.ref, attribution.via]);
337
+
277
338
  const playerRef = useRef<VideoPlayerHandle | null>(null);
278
339
  const [password, setPassword] = useState<string | null>(() => {
279
340
  if (typeof window === "undefined" || !shareId) return null;
@@ -690,7 +751,11 @@ export default function ShareRoute() {
690
751
  </Button>
691
752
  ) : session ? null : (
692
753
  <Button variant="ghost" size="sm" asChild>
693
- <a href={appPath("/")} className="gap-1.5">
754
+ <a
755
+ href={appPath("/")}
756
+ className="gap-1.5"
757
+ onClick={() => fireShareCtaClick("try_clips")}
758
+ >
694
759
  Try Clips
695
760
  <IconExternalLink className="h-3.5 w-3.5" />
696
761
  </a>
@@ -879,7 +944,10 @@ export default function ShareRoute() {
879
944
  browserTabId={getBrowserTabId()}
880
945
  />
881
946
  ) : (
882
- <PublicAgentEmptyState />
947
+ <PublicAgentEmptyState
948
+ signupHref={signupHref}
949
+ onCtaClick={fireShareCtaClick}
950
+ />
883
951
  )}
884
952
  </TabsContent>
885
953
  <TabsContent
@@ -932,6 +1000,7 @@ export default function ShareRoute() {
932
1000
  if (!open) setSignInIntent(null);
933
1001
  }}
934
1002
  intent={signInIntent ?? "comment"}
1003
+ onSignIn={() => fireShareCtaClick("signin")}
935
1004
  />
936
1005
  </div>
937
1006
  );
@@ -947,7 +1016,13 @@ function sanitizeFilename(name: string): string {
947
1016
  );
948
1017
  }
949
1018
 
950
- function PublicAgentEmptyState() {
1019
+ function PublicAgentEmptyState({
1020
+ signupHref,
1021
+ onCtaClick,
1022
+ }: {
1023
+ signupHref: string;
1024
+ onCtaClick: (cta: "signup" | "download" | "try_clips" | "signin") => void;
1025
+ }) {
951
1026
  const [platform, setPlatform] = useState<ViewerPlatform | null>(null);
952
1027
 
953
1028
  useEffect(() => {
@@ -1005,12 +1080,18 @@ function PublicAgentEmptyState() {
1005
1080
  Loom alternative
1006
1081
  </p>
1007
1082
  <div className="mt-7 flex w-full max-w-[220px] flex-col gap-2">
1008
- <CaptureInstallButton className="w-full gap-2" align="center">
1083
+ <CaptureInstallButton
1084
+ className="w-full gap-2"
1085
+ align="center"
1086
+ onClick={() => onCtaClick("download")}
1087
+ >
1009
1088
  <IconDownload className="h-4 w-4" />
1010
1089
  {downloadLabel}
1011
1090
  </CaptureInstallButton>
1012
1091
  <Button asChild variant="outline" className="w-full">
1013
- <a href={appPath("/signup")}>Sign up</a>
1092
+ <a href={signupHref} onClick={() => onCtaClick("signup")}>
1093
+ Sign up
1094
+ </a>
1014
1095
  </Button>
1015
1096
  </div>
1016
1097
  </div>
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ Clips shared in Slack no longer show a 'Could not start playback' error in the inline preview — they autoplay muted where allowed and play on click otherwise
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ Made the play button on shared and embedded clips scale with the player size so it's no longer oversized in small previews like Slack unfurls
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ Public clip share links now show whether they'll play inline in Slack, with a one-click link to connect a workspace
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ Removed Select button from library — hover a clip to select it
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ Screen + camera recordings now keep the presenter's face in the thumbnail shown on the library card, video poster, and Slack unfurl
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ Shared video links now play for anyone without signing in
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ Skip or cancel the recording countdown with buttons beside the number
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ The desktop camera bubble now looks sharp the instant it opens instead of staying blurry for the first several seconds
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ The desktop recording widget now grows downward only when you hover it, so its buttons stay in place instead of shifting up under your cursor
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-23
4
+ ---
5
+
6
+ The recording-start sound is now a softer, more modern chime
@@ -18,18 +18,27 @@
18
18
  "32": "icons/icon-32.png",
19
19
  "128": "icons/icon-128.png"
20
20
  },
21
- "permissions": [
22
- "activeTab",
23
- "debugger",
24
- "offscreen",
25
- "storage",
26
- "tabCapture"
27
- ],
21
+ "permissions": ["activeTab", "debugger", "offscreen", "scripting", "storage"],
28
22
  "host_permissions": [
29
23
  "https://clips.agent-native.com/*",
30
24
  "https://forms.agent-native.com/*",
31
25
  "http://localhost/*",
32
- "http://127.0.0.1/*"
26
+ "http://127.0.0.1/*",
27
+ "<all_urls>"
28
+ ],
29
+ "content_scripts": [
30
+ {
31
+ "matches": ["<all_urls>"],
32
+ "js": ["assets/content-script.js"],
33
+ "run_at": "document_idle",
34
+ "all_frames": false
35
+ }
36
+ ],
37
+ "web_accessible_resources": [
38
+ {
39
+ "resources": ["src/overlay.html", "assets/*", "icons/*"],
40
+ "matches": ["<all_urls>"]
41
+ }
33
42
  ],
34
43
  "externally_connectable": {
35
44
  "matches": [