@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
@@ -68,6 +68,8 @@ pub fn run() {
68
68
  clips::hide_recording_chrome,
69
69
  clips::show_region_guides,
70
70
  clips::hide_region_guides,
71
+ clips::show_region_record_border,
72
+ clips::hide_region_record_border,
71
73
  clips::show_region_guide_editor,
72
74
  clips::show_region_capture_selector,
73
75
  clips::close_bubble,
@@ -208,7 +208,10 @@ pub fn reapply_capture_exclusion_to_overlays(app: &tauri::AppHandle) {
208
208
  set_window_capture_excluded(window, false);
209
209
  continue;
210
210
  }
211
- let private_guide = matches!(label.as_str(), "region-guides" | "region-guide-editor");
211
+ let private_guide = matches!(
212
+ label.as_str(),
213
+ "region-guides" | "region-guide-editor" | "region-record-border"
214
+ );
212
215
  set_window_capture_excluded(window, private_guide || !visible);
213
216
  }
214
217
  }
@@ -41,6 +41,7 @@ import {
41
41
  setCookie,
42
42
  type H3Event,
43
43
  } from "h3";
44
+ import { eq } from "drizzle-orm";
44
45
  import { readAppState } from "@agent-native/core/application-state";
45
46
  import {
46
47
  createSsrfSafeDispatcher,
@@ -49,6 +50,7 @@ import {
49
50
  import { getOrgContext } from "@agent-native/core/org";
50
51
  import { resolveAccess } from "@agent-native/core/sharing";
51
52
  import {
53
+ captureRouteError,
52
54
  getSession,
53
55
  runWithRequestContext,
54
56
  signShortLivedToken,
@@ -61,6 +63,7 @@ import {
61
63
  loomEmbedUrlForRecording,
62
64
  } from "../../../../shared/loom.js";
63
65
  import { verifySharePassword } from "../../../lib/share-password.js";
66
+ import { getDb, schema } from "../../../db/index.js";
64
67
 
65
68
  interface RecordingRow {
66
69
  expiresAt?: string | null;
@@ -300,12 +303,39 @@ export default defineEventHandler(async (event: H3Event) => {
300
303
  return runWithRequestContext(
301
304
  { userEmail: session?.email, orgId },
302
305
  async () => {
306
+ // Resolve via share grants first (owner / org / shared viewers). When
307
+ // there is no grant — e.g. an anonymous viewer on a public share/embed
308
+ // page — fall back to the public-visibility gate so public clips stay
309
+ // playable without signing in. This mirrors the visibility check in
310
+ // `/api/public-recording.get.ts` (which hands the player its videoUrl) so
311
+ // the metadata endpoint and this media endpoint never disagree about who
312
+ // can play a clip. Without this, anonymous viewers hit a 403 here and the
313
+ // player fails with "Could not start playback. Try again."
303
314
  const access = await resolveAccess("recording", recordingId);
304
- if (!access) {
305
- setResponseStatus(event, 403);
306
- return { error: "Forbidden" };
315
+ let recRow: RecordingRow | null =
316
+ (access?.resource as RecordingRow | undefined) ?? null;
317
+ let role: string | null = access?.role ?? null;
318
+
319
+ if (!recRow) {
320
+ const db = getDb();
321
+ const [row] = await db
322
+ .select()
323
+ .from(schema.recordings)
324
+ .where(eq(schema.recordings.id, recordingId))
325
+ .limit(1);
326
+ if (!row) {
327
+ setResponseStatus(event, 404);
328
+ return { error: "Not found" };
329
+ }
330
+ if (row.visibility !== "public") {
331
+ setResponseStatus(event, 403);
332
+ return { error: "Forbidden" };
333
+ }
334
+ recRow = row as RecordingRow;
335
+ role = "viewer";
307
336
  }
308
- const rec = access.resource as RecordingRow;
337
+
338
+ const rec = recRow;
309
339
 
310
340
  if (rec.expiresAt) {
311
341
  const expires = new Date(rec.expiresAt).getTime();
@@ -332,7 +362,7 @@ export default defineEventHandler(async (event: H3Event) => {
332
362
  password?: string;
333
363
  t?: string;
334
364
  };
335
- if (rec.password && access.role !== "owner") {
365
+ if (rec.password && role !== "owner") {
336
366
  const token = typeof q.t === "string" ? q.t : "";
337
367
  const cookieToken =
338
368
  getCookie(event, protectedMediaCookieName(recordingId)) ?? "";
@@ -404,7 +434,56 @@ export default defineEventHandler(async (event: H3Event) => {
404
434
  setResponseStatus(event, upstream.status);
405
435
  return { error: upstream.error };
406
436
  }
407
- return providerResponse(upstream);
437
+ // The provider answered, but with a server error (e.g. the CDN asset is
438
+ // broken and returns 5xx). Don't proxy an opaque upstream error — and
439
+ // don't risk reconstructing a Response from it, which previously threw
440
+ // and surfaced as an unhandled 500 on every request. Capture it so the
441
+ // broken asset is diagnosable, and return a clean 502.
442
+ if (upstream.status >= 500) {
443
+ captureRouteError(
444
+ new Error(
445
+ `Storage provider returned ${upstream.status} for recording media`,
446
+ ),
447
+ {
448
+ route: "api/video",
449
+ tags: {
450
+ mediaPath: "provider-proxy",
451
+ upstreamStatus: String(upstream.status),
452
+ },
453
+ extra: { recordingId },
454
+ },
455
+ );
456
+ setResponseStatus(event, 502);
457
+ setResponseHeader(
458
+ event,
459
+ "Cache-Control",
460
+ "private, max-age=0, no-store",
461
+ );
462
+ return {
463
+ error: "The recording's media could not be loaded from storage.",
464
+ upstreamStatus: upstream.status,
465
+ };
466
+ }
467
+ try {
468
+ return providerResponse(upstream);
469
+ } catch (err) {
470
+ // Reconstructing the proxied Response should not happen, but if it
471
+ // does, fail cleanly instead of as an unhandled 500.
472
+ captureRouteError(err, {
473
+ route: "api/video",
474
+ tags: { mediaPath: "provider-proxy-response" },
475
+ extra: { recordingId, upstreamStatus: String(upstream.status) },
476
+ });
477
+ setResponseStatus(event, 502);
478
+ setResponseHeader(
479
+ event,
480
+ "Cache-Control",
481
+ "private, max-age=0, no-store",
482
+ );
483
+ return {
484
+ error: "The recording's media could not be loaded from storage.",
485
+ };
486
+ }
408
487
  }
409
488
  const mimeType =
410
489
  typeof blob?.mimeType === "string" ? blob.mimeType : "video/webm";
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Viral attribution contract for shared Clips links.
3
+ *
4
+ * Shared clip URLs self-attribute so the signup funnel can be measured even
5
+ * when `document.referrer` is empty (desktop app, Slack, native clients, etc.).
6
+ * The framework captures first-touch from these params into a cookie and
7
+ * enriches the `signup` event; Clips' job is to (a) tag share/embed URLs and
8
+ * (b) emit funnel events from the public share page.
9
+ *
10
+ * Contract strings are centralized here so the minting side (share dialog) and
11
+ * the measuring side (public share page) cannot drift apart.
12
+ *
13
+ * Privacy: `via` must be a non-PII stable id (e.g. the owner's user id), never
14
+ * an email. Omit `via` rather than leak PII into a public URL or event.
15
+ */
16
+
17
+ /** Fixed referral source for clip shares. */
18
+ export const CLIP_SHARE_REF = "clip_share";
19
+
20
+ /** Query param names that carry attribution. */
21
+ export const REF_PARAM = "ref";
22
+ export const VIA_PARAM = "via";
23
+
24
+ /**
25
+ * Append `ref=clip_share` (and `via=<ownerId>` when a non-PII owner id is
26
+ * known) to an absolute share/embed URL, preserving any existing query params.
27
+ * Returns the input unchanged when it isn't a parseable absolute URL.
28
+ */
29
+ export function withShareAttribution(
30
+ url: string,
31
+ ownerId?: string | null,
32
+ ): string {
33
+ if (!url) return url;
34
+ try {
35
+ const parsed = new URL(url);
36
+ parsed.searchParams.set(REF_PARAM, CLIP_SHARE_REF);
37
+ const owner = (ownerId ?? "").trim();
38
+ if (owner) parsed.searchParams.set(VIA_PARAM, owner);
39
+ return parsed.toString();
40
+ } catch {
41
+ return url;
42
+ }
43
+ }
44
+
45
+ export type ShareAttribution = {
46
+ ref: string | undefined;
47
+ via: string | undefined;
48
+ };
49
+
50
+ /**
51
+ * Read `ref`/`via` from a query string (e.g. `window.location.search`). Falls
52
+ * back to `ref=clip_share` so downstream attribution stays meaningful even when
53
+ * the visitor arrived via a link that lost the param.
54
+ */
55
+ export function readShareAttribution(search: string): ShareAttribution {
56
+ let ref: string | undefined;
57
+ let via: string | undefined;
58
+ try {
59
+ const params = new URLSearchParams(search ?? "");
60
+ ref = params.get(REF_PARAM) ?? undefined;
61
+ via = params.get(VIA_PARAM) ?? undefined;
62
+ } catch {
63
+ // Ignore malformed query strings — fall through to the default below.
64
+ }
65
+ return { ref: ref || CLIP_SHARE_REF, via: via || undefined };
66
+ }
67
+
68
+ /**
69
+ * Build the attribution-forwarding signup path so attribution survives even if
70
+ * cookies are blocked. The framework also captures these params on the
71
+ * `/signup` page load.
72
+ */
73
+ export function buildSignupAttributionQuery(via?: string | null): string {
74
+ const params = new URLSearchParams();
75
+ params.set(REF_PARAM, CLIP_SHARE_REF);
76
+ const owner = (via ?? "").trim();
77
+ if (owner) params.set(VIA_PARAM, owner);
78
+ return params.toString();
79
+ }
@@ -122,7 +122,8 @@ cd templates/content && pnpm action <name> [args]
122
122
  | `configure-document-property` | `--documentId <id> [--id <propertyId>] --name <name> --type <type> [--visibility always_show\|hide_when_empty\|always_hide]` | Create or update a property definition |
123
123
  | `duplicate-document-property` | `--documentId <id> --propertyId <propertyId>` | Duplicate a property definition and its stored values |
124
124
  | `delete-document-property` | `--documentId <id> --propertyId <propertyId>` | Delete a property definition and its stored values |
125
- | `set-document-property` | `--documentId <id> --propertyId <propertyId> --value <json>` | Set a document property value |
125
+ | `set-document-property` | `--documentId <id> --propertyId <propertyId> --value <json>` | Set a document property value (for a `blocks` field, the value is its markdown content) |
126
+ | `reorder-document-property` | `--documentId <id> --propertyId <propertyId> --targetPropertyId <id> [--position before\|after]` | Reorder a property definition within its database (used to reorder Blocks fields on the page) |
126
127
  | `set-document-discoverability` | `--id <id> --hideFromSearch true\|false [--includeChildren true\|false]` | Hide/show an org-accessible document in Organization/search while keeping link access |
127
128
  | `move-document` | `--id <id> [--parentId] [--position]` | Move or reorder a document in the page tree |
128
129
  | `delete-document` | `--id <id>` | Delete with recursive children |
@@ -413,10 +414,26 @@ Document properties are SQL-backed, Notion-style structured metadata rather
413
414
  than YAML embedded in the markdown body. Database property definitions support
414
415
  `text`, `number`, `select`, `multi_select`, `status`, `date`, `person`,
415
416
  `place`, `files_media` (`Files & media`), `checkbox`, `url`, `email`,
416
- `phone`, plus computed `formula`, `id`, `created_time`, `created_by`, and
417
+ `phone`, `blocks` (Capacities-style rich-text body field), plus computed
418
+ `formula`, `id`, `created_time`, `created_by`, and
417
419
  `last_edited_time`, `last_edited_by`, plus property visibility (`always_show`,
418
420
  `hide_when_empty`, `always_hide`). The value table stores per-row-document JSON
419
- values. Formula properties store their expression in property options and support
421
+ values.
422
+
423
+ **Blocks fields.** A `blocks` field is independent rich-text content per row —
424
+ NOT YAML and NOT a pointer to the body. Every database is seeded with one
425
+ primary "Content" Blocks field whose content is backed by `documents.content`
426
+ (so it reuses the collaborative TipTap/Yjs body editor and existing data
427
+ migrates for free). Each additional Blocks field stores its own content in
428
+ `document_block_field_contents`, keyed by `(document_id, property_id)`, so no
429
+ two Blocks fields ever share content — adding a second Blocks field creates a
430
+ new, empty, independent field. On the page: one Blocks field renders chromeless
431
+ (no header, just the body); two or more each show their name as a header and are
432
+ collapsible and reorderable (the surviving lone field keeps its stored name).
433
+ In table views a Blocks column shows a word count (e.g. "412 words"), not the
434
+ body. A Blocks field can only be deleted from the database view's column menu
435
+ (not from the page body); deleting the last Blocks field warns that it removes
436
+ the body for every object of the type. Formula properties store their expression in property options and support
420
437
  `{Property name}` substitution plus simple numeric math such as `{MSV} * 2`.
421
438
  Database views support multiple named table, list, gallery, board, calendar, and timeline views saved in
422
439
  `content_databases.view_config_json`. Each view has its own stacked sorts,
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to Agent-Native Content are documented here. Open it any
4
+ time from the command menu (Cmd+K → "What's new").
5
+
6
+ ## 2026-06-23
7
+
8
+ ### Added
9
+
10
+ - See what's new right inside Agent-Native Content — a changelog now lives in the command menu (Cmd+K).
@@ -123,6 +123,10 @@ export async function getContentDatabaseResponse(
123
123
 
124
124
  if (!database) throw new Error(`Database "${databaseId}" not found`);
125
125
 
126
+ // PURE read: the primary "Content" Blocks field is seeded at create time and
127
+ // by the one-time startup repair — never here. Reading a database (including a
128
+ // shared one a viewer is opening) must not mutate schema.
129
+
126
130
  const { limit, offset } = normalizeContentDatabasePageOptions(options);
127
131
  const [itemCount] = await db
128
132
  .select({ count: sql<number>`COUNT(*)` })
@@ -261,6 +265,11 @@ export async function deleteDatabaseDataForDocument(
261
265
  await db
262
266
  .delete(schema.documentPropertyValues)
263
267
  .where(eq(schema.documentPropertyValues.propertyId, definition.id));
268
+ // Independent Blocks-field content is keyed by property id; drop it so
269
+ // deleting a database leaves no orphaned document_block_field_contents.
270
+ await db
271
+ .delete(schema.documentBlockFieldContents)
272
+ .where(eq(schema.documentBlockFieldContents.propertyId, definition.id));
264
273
  }
265
274
  const sources = await db
266
275
  .select({ id: schema.contentDatabaseSources.id })
@@ -309,6 +318,12 @@ export async function deleteDatabaseDataForDocument(
309
318
  eq(schema.documentPropertyValues.ownerEmail, ownerEmail),
310
319
  ),
311
320
  );
321
+ // A deleted row document's independent Blocks-field content is keyed by
322
+ // document id; drop it so no document_block_field_contents rows are
323
+ // orphaned when the row is removed.
324
+ await db
325
+ .delete(schema.documentBlockFieldContents)
326
+ .where(eq(schema.documentBlockFieldContents.documentId, documentId));
312
327
  await db
313
328
  .delete(schema.contentDatabaseItems)
314
329
  .where(eq(schema.contentDatabaseItems.documentId, documentId));