@agent-native/core 0.85.7 → 0.86.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 (1019) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +124 -1
  3. package/corpus/core/README.md +0 -11
  4. package/corpus/core/docs/content/cloneable-saas.mdx +0 -1
  5. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
  6. package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
  7. package/corpus/core/docs/content/locales/ar-SA/sharing.mdx +1 -2
  8. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
  9. package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +23 -7
  10. package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +1 -1
  11. package/corpus/core/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
  12. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
  13. package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
  14. package/corpus/core/docs/content/locales/de-DE/sharing.mdx +1 -2
  15. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +2 -3
  16. package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +23 -7
  17. package/corpus/core/docs/content/locales/de-DE/tracking.mdx +1 -1
  18. package/corpus/core/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
  19. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
  20. package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
  21. package/corpus/core/docs/content/locales/es-ES/sharing.mdx +1 -2
  22. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +2 -3
  23. package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +23 -7
  24. package/corpus/core/docs/content/locales/es-ES/tracking.mdx +1 -1
  25. package/corpus/core/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
  26. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
  27. package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
  28. package/corpus/core/docs/content/locales/fr-FR/sharing.mdx +1 -2
  29. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
  30. package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +23 -7
  31. package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +1 -1
  32. package/corpus/core/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
  33. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
  34. package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
  35. package/corpus/core/docs/content/locales/hi-IN/sharing.mdx +1 -2
  36. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
  37. package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +23 -7
  38. package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +1 -1
  39. package/corpus/core/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
  40. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
  41. package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
  42. package/corpus/core/docs/content/locales/ja-JP/sharing.mdx +1 -2
  43. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
  44. package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +23 -7
  45. package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +1 -1
  46. package/corpus/core/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
  47. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
  48. package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
  49. package/corpus/core/docs/content/locales/ko-KR/sharing.mdx +1 -2
  50. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
  51. package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +23 -7
  52. package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +1 -1
  53. package/corpus/core/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
  54. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
  55. package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
  56. package/corpus/core/docs/content/locales/pt-BR/sharing.mdx +1 -2
  57. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
  58. package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +23 -7
  59. package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +1 -1
  60. package/corpus/core/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
  61. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
  62. package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
  63. package/corpus/core/docs/content/locales/zh-CN/sharing.mdx +1 -2
  64. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
  65. package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +23 -7
  66. package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +1 -1
  67. package/corpus/core/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
  68. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
  69. package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
  70. package/corpus/core/docs/content/locales/zh-TW/sharing.mdx +1 -2
  71. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
  72. package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +23 -7
  73. package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +1 -1
  74. package/corpus/core/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
  75. package/corpus/core/docs/content/plan-plugin.mdx +12 -11
  76. package/corpus/core/docs/content/sharing.mdx +1 -2
  77. package/corpus/core/docs/content/skills-guide.mdx +4 -3
  78. package/corpus/core/docs/content/template-plan.mdx +37 -6
  79. package/corpus/core/docs/content/tracking.mdx +1 -1
  80. package/corpus/core/docs/content/workspace-connections.mdx +1 -1
  81. package/corpus/core/package.json +6 -6
  82. package/corpus/core/src/agent/run-store.ts +1 -1
  83. package/corpus/core/src/chat-threads/store.ts +73 -11
  84. package/corpus/core/src/checkpoints/store.ts +13 -2
  85. package/corpus/core/src/cli/create.ts +3 -4
  86. package/corpus/core/src/cli/design-connect.ts +469 -9
  87. package/corpus/core/src/cli/index.ts +13 -0
  88. package/corpus/core/src/cli/plan-local.ts +281 -24
  89. package/corpus/core/src/cli/skills.ts +177 -21
  90. package/corpus/core/src/cli/templates-meta.ts +0 -13
  91. package/corpus/core/src/cli/visualize-repo.ts +715 -0
  92. package/corpus/core/src/client/AssistantChat.tsx +126 -17
  93. package/corpus/core/src/client/agent-chat-adapter.ts +6 -5
  94. package/corpus/core/src/client/app-providers.tsx +2 -2
  95. package/corpus/core/src/client/collab/index.ts +31 -0
  96. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +16 -1
  97. package/corpus/core/src/client/components/PresenceBar.tsx +14 -1
  98. package/corpus/core/src/client/components/RecentEditHighlights.tsx +219 -0
  99. package/corpus/core/src/client/components/RemoteSelectionRings.tsx +40 -6
  100. package/corpus/core/src/client/index.ts +48 -0
  101. package/corpus/core/src/client/org/OrgSwitcher.tsx +0 -4
  102. package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +49 -32
  103. package/corpus/core/src/client/rich-markdown-editor/index.ts +6 -0
  104. package/corpus/core/src/client/rich-markdown-editor/surgical-apply.ts +192 -0
  105. package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +59 -8
  106. package/corpus/core/src/client/session-replay.ts +181 -15
  107. package/corpus/core/src/client/sse-event-processor.ts +90 -1
  108. package/corpus/core/src/client/use-action.ts +123 -25
  109. package/corpus/core/src/client/use-agent-engine-configured.ts +7 -1
  110. package/corpus/core/src/client/use-chat-threads.ts +18 -7
  111. package/corpus/core/src/client/use-db-sync.ts +104 -19
  112. package/corpus/core/src/client/visual-style-controls.tsx +475 -0
  113. package/corpus/core/src/collab/agent-presence.ts +191 -62
  114. package/corpus/core/src/collab/awareness.ts +83 -6
  115. package/corpus/core/src/collab/client.ts +89 -146
  116. package/corpus/core/src/collab/index.ts +34 -0
  117. package/corpus/core/src/collab/recent-edits.ts +171 -0
  118. package/corpus/core/src/collab/undo.ts +432 -0
  119. package/corpus/core/src/collab/ydoc-manager.ts +68 -0
  120. package/corpus/core/src/connections/catalog.ts +2 -3
  121. package/corpus/core/src/db/create-get-db.ts +86 -1
  122. package/corpus/core/src/db/ensure-additive-columns.ts +430 -0
  123. package/corpus/core/src/db/index.ts +6 -0
  124. package/corpus/core/src/db/migrations.ts +236 -35
  125. package/corpus/core/src/jobs/scheduler.ts +17 -14
  126. package/corpus/core/src/observability/traces.ts +182 -1
  127. package/corpus/core/src/org/context.ts +79 -2
  128. package/corpus/core/src/server/agent-chat-plugin.ts +10 -6
  129. package/corpus/core/src/server/auth-marketing.ts +0 -11
  130. package/corpus/core/src/server/auth.ts +11 -4
  131. package/corpus/core/src/server/collab-plugin.ts +56 -13
  132. package/corpus/core/src/server/design-token-utils.ts +1 -1
  133. package/corpus/core/src/server/fusion-app.ts +447 -0
  134. package/corpus/core/src/server/index.ts +13 -0
  135. package/corpus/core/src/server/onboarding-html.ts +3 -4
  136. package/corpus/core/src/server/poll-events.ts +14 -2
  137. package/corpus/core/src/server/poll.ts +219 -12
  138. package/corpus/core/src/server/schema-prompt.ts +28 -9
  139. package/corpus/core/src/settings/store.ts +33 -2
  140. package/corpus/core/src/sharing/actions/set-resource-visibility.ts +2 -0
  141. package/corpus/core/src/sharing/actions/share-resource.ts +3 -0
  142. package/corpus/core/src/sharing/actions/unshare-resource.ts +2 -0
  143. package/corpus/core/src/styles/agent-native.css +0 -5
  144. package/corpus/core/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
  145. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
  146. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
  147. package/corpus/core/src/templates/default/package.json +3 -3
  148. package/corpus/core/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
  149. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
  150. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
  151. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
  152. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
  153. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
  154. package/corpus/core/src/tracking/providers.ts +22 -1
  155. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +15 -0
  156. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +20 -5
  157. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +8 -0
  158. package/corpus/templates/analytics/AGENTS.md +33 -6
  159. package/corpus/templates/analytics/actions/navigate.ts +14 -4
  160. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
  161. package/corpus/templates/analytics/actions/view-screen.ts +57 -0
  162. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +23 -1
  163. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
  164. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +21 -0
  165. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +7 -0
  166. package/corpus/templates/analytics/app/i18n/zh-TW.ts +15 -1
  167. package/corpus/templates/analytics/app/i18n-data.ts +151 -10
  168. package/corpus/templates/analytics/app/pages/Agents.tsx +118 -0
  169. package/corpus/templates/analytics/app/pages/DataSources.tsx +11 -1
  170. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +76 -40
  171. package/corpus/templates/analytics/app/pages/sessions/session-replay-devtools.ts +5 -0
  172. package/corpus/templates/analytics/app/routes/agents.tsx +10 -0
  173. package/corpus/templates/analytics/changelog/2026-07-03-agent-admin-tools-page.md +6 -0
  174. package/corpus/templates/analytics/changelog/2026-07-03-agent-llm-observability-dashboard.md +6 -0
  175. package/corpus/templates/analytics/changelog/2026-07-03-session-recordings-now-include-response-bodies-for-5xx-error.md +6 -0
  176. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +34 -0
  177. package/corpus/templates/analytics/docs/schemas/tracked-events.md +6 -0
  178. package/corpus/templates/analytics/package.json +3 -3
  179. package/corpus/templates/analytics/seeds/dashboards/agent-observability-llm.json +173 -0
  180. package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +23 -5
  181. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +58 -13
  182. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +23 -0
  183. package/corpus/templates/analytics/server/lib/dashboard-seeds.ts +5 -0
  184. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +120 -8
  185. package/corpus/templates/analytics/server/lib/session-replay.ts +3 -2
  186. package/corpus/templates/analytics/server/plugins/db.ts +93 -2
  187. package/corpus/templates/analytics/server/routes/api/session-replay/agent-diagnostics.json.get.ts +45 -1
  188. package/corpus/templates/analytics/shared/session-replay-diagnostics.ts +10 -0
  189. package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +82 -19
  190. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +15 -0
  191. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +8 -0
  192. package/corpus/templates/assets/package.json +3 -3
  193. package/corpus/templates/assets/server/plugins/db.ts +63 -2
  194. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +15 -0
  195. package/corpus/templates/brain/package.json +3 -3
  196. package/corpus/templates/brain/server/plugins/db.ts +75 -2
  197. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +15 -0
  198. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +8 -0
  199. package/corpus/templates/calendar/package.json +3 -3
  200. package/corpus/templates/calendar/server/plugins/db.ts +64 -2
  201. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +15 -0
  202. package/corpus/templates/chat/package.json +3 -3
  203. package/corpus/templates/clips/actions/finalize-recording.ts +50 -40
  204. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +8 -6
  205. package/corpus/templates/clips/app/routes/share.$shareId.tsx +3 -3
  206. package/corpus/templates/clips/changelog/2026-07-03-mobile-recording-pages-keep-videos-in-a-16-9-player-with-act.md +6 -0
  207. package/corpus/templates/clips/package.json +3 -3
  208. package/corpus/templates/clips/server/lib/recording-upload-state.ts +56 -0
  209. package/corpus/templates/clips/server/plugins/db.ts +68 -1
  210. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +27 -3
  211. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +15 -0
  212. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +8 -0
  213. package/corpus/templates/content/actions/edit-document.ts +48 -1
  214. package/corpus/templates/content/actions/list-documents.ts +101 -94
  215. package/corpus/templates/content/actions/search-documents.ts +19 -3
  216. package/corpus/templates/content/actions/update-document.ts +54 -1
  217. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +127 -7
  218. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +97 -2
  219. package/corpus/templates/content/changelog/2026-07-03-agent-document-edits-now-appear-as-a-live-collaborator-prese.md +6 -0
  220. package/corpus/templates/content/changelog/2026-07-03-document-search-and-list-views-load-faster-on-large-workspac.md +6 -0
  221. package/corpus/templates/content/package.json +3 -3
  222. package/corpus/templates/content/server/plugins/db.ts +57 -1
  223. package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +140 -0
  224. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +20 -0
  225. package/corpus/templates/design/AGENTS.md +50 -12
  226. package/corpus/templates/design/actions/add-fusion-screens.ts +91 -0
  227. package/corpus/templates/design/actions/apply-a11y-fix.ts +5 -1
  228. package/corpus/templates/design/actions/apply-component-prop-edit.ts +10 -2
  229. package/corpus/templates/design/actions/apply-fusion-edits.ts +161 -0
  230. package/corpus/templates/design/actions/apply-visual-edit.ts +34 -1
  231. package/corpus/templates/design/actions/create-component.ts +5 -1
  232. package/corpus/templates/design/actions/create-fusion-app.ts +202 -0
  233. package/corpus/templates/design/actions/deploy-fusion-app.ts +123 -0
  234. package/corpus/templates/design/actions/edit-design.ts +13 -16
  235. package/corpus/templates/design/actions/get-fusion-deploy-status.ts +86 -0
  236. package/corpus/templates/design/actions/list-fusion-edits.ts +96 -0
  237. package/corpus/templates/design/actions/list-local-files.ts +133 -0
  238. package/corpus/templates/design/actions/push-fusion-app.ts +62 -0
  239. package/corpus/templates/design/actions/queue-fusion-edit.ts +112 -0
  240. package/corpus/templates/design/actions/read-local-file.ts +139 -0
  241. package/corpus/templates/design/actions/send-fusion-message.ts +69 -0
  242. package/corpus/templates/design/actions/sync-fusion-app.ts +196 -0
  243. package/corpus/templates/design/actions/write-local-file.ts +115 -14
  244. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +12 -0
  245. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +379 -0
  246. package/corpus/templates/design/app/components/design/EditPanel.tsx +149 -73
  247. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +328 -0
  248. package/corpus/templates/design/app/components/design/LayersPanel.tsx +148 -30
  249. package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +1 -1
  250. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +567 -6
  251. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -98
  252. package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +85 -0
  253. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +466 -0
  254. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +53 -0
  255. package/corpus/templates/design/app/components/design/code-workbench/commands.ts +339 -0
  256. package/corpus/templates/design/app/components/design/code-workbench/editor/Breadcrumbs.tsx +42 -0
  257. package/corpus/templates/design/app/components/design/code-workbench/editor/BufferSync.tsx +128 -0
  258. package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +363 -0
  259. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +268 -0
  260. package/corpus/templates/design/app/components/design/code-workbench/editor/StatusBar.tsx +208 -0
  261. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-setup.ts +61 -0
  262. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme-palette.ts +191 -0
  263. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme.ts +29 -0
  264. package/corpus/templates/design/app/components/design/code-workbench/editor/status-bar-lang.ts +21 -0
  265. package/corpus/templates/design/app/components/design/code-workbench/editor/tab-drag.ts +27 -0
  266. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +155 -0
  267. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +551 -0
  268. package/corpus/templates/design/app/components/design/code-workbench/explorer/file-icons.tsx +115 -0
  269. package/corpus/templates/design/app/components/design/code-workbench/format/format-on-open.ts +65 -0
  270. package/corpus/templates/design/app/components/design/code-workbench/format/prettier-format.ts +182 -0
  271. package/corpus/templates/design/app/components/design/code-workbench/model-registry.ts +133 -0
  272. package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +563 -0
  273. package/corpus/templates/design/app/components/design/code-workbench/quickinput/fuzzy.ts +170 -0
  274. package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +508 -0
  275. package/corpus/templates/design/app/components/design/code-workbench/search/search-engine.ts +280 -0
  276. package/corpus/templates/design/app/components/design/code-workbench/store.tsx +734 -0
  277. package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +39 -0
  278. package/corpus/templates/design/app/components/design/code-workbench/workspace/inline-provider.ts +196 -0
  279. package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +177 -0
  280. package/corpus/templates/design/app/components/design/code-workbench/workspace/tree.ts +110 -0
  281. package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +103 -0
  282. package/corpus/templates/design/app/components/design/code-workbench-theme.ts +68 -0
  283. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +127 -10
  284. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +52 -29
  285. package/corpus/templates/design/app/components/design/inspector/index.ts +9 -0
  286. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +56 -0
  287. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +80 -1
  288. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +6 -16
  289. package/corpus/templates/design/app/i18n/zh-TW.ts +2 -1
  290. package/corpus/templates/design/app/i18n-data.ts +31 -18
  291. package/corpus/templates/design/app/pages/DesignEditor.tsx +1474 -175
  292. package/corpus/templates/design/app/pages/Index.tsx +90 -17
  293. package/corpus/templates/design/changelog/2026-07-03-the-ai-now-edits-like-a-collaborator-on-canvas-its-cursor-gl.md +6 -0
  294. package/corpus/templates/design/changelog/2026-07-03-the-code-panel-is-now-a-full-vs-code-style-editor-with-a-fil.md +6 -0
  295. package/corpus/templates/design/package.json +4 -3
  296. package/corpus/templates/design/server/db/schema.ts +31 -0
  297. package/corpus/templates/design/server/lib/fusion-screens.ts +246 -0
  298. package/corpus/templates/design/server/plugins/db.ts +89 -2
  299. package/corpus/templates/design/shared/collab-selection.ts +52 -0
  300. package/corpus/templates/design/shared/full-app.ts +126 -0
  301. package/corpus/templates/design/shared/pen-path.ts +296 -0
  302. package/corpus/templates/dispatch/package.json +3 -3
  303. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +15 -0
  304. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +8 -0
  305. package/corpus/templates/forms/package.json +3 -3
  306. package/corpus/templates/forms/server/plugins/db.ts +62 -2
  307. package/corpus/templates/macros/package.json +3 -3
  308. package/corpus/templates/macros/server/plugins/db.ts +63 -2
  309. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +15 -0
  310. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +8 -0
  311. package/corpus/templates/mail/package.json +3 -3
  312. package/corpus/templates/mail/server/lib/contact-frequency.ts +42 -15
  313. package/corpus/templates/mail/server/plugins/db.ts +63 -2
  314. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +15 -0
  315. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +9 -3
  316. package/corpus/templates/plan/.agents/skills/visualize-repo/SKILL.md +92 -0
  317. package/corpus/templates/plan/actions/export-visual-plan.ts +5 -0
  318. package/corpus/templates/plan/actions/get-local-plan-folder.ts +4 -22
  319. package/corpus/templates/plan/actions/get-plan-version.ts +6 -16
  320. package/corpus/templates/plan/actions/list-plan-versions.ts +48 -20
  321. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +41 -1
  322. package/corpus/templates/plan/actions/promote-local-plan-folder.ts +4 -22
  323. package/corpus/templates/plan/actions/update-local-plan-comments.ts +4 -2
  324. package/corpus/templates/plan/actions/update-local-plan-folder.ts +4 -22
  325. package/corpus/templates/plan/actions/update-visual-plan.ts +60 -1
  326. package/corpus/templates/plan/agent-native.app-skill.json +10 -0
  327. package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +138 -39
  328. package/corpus/templates/plan/app/components/editor/usePlanUndoStack.ts +165 -23
  329. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +80 -4
  330. package/corpus/templates/plan/app/global.css +11 -9
  331. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +10 -1
  332. package/corpus/templates/plan/app/hooks/use-plan-presence.ts +66 -0
  333. package/corpus/templates/plan/app/pages/PlansPage.tsx +215 -63
  334. package/corpus/templates/plan/changelog/2026-07-03-local-visual-plans-and-recaps-can-save-comments-without-sign.md +6 -0
  335. package/corpus/templates/plan/changelog/2026-07-03-plan-tabs-render-nested-text-instead-of-raw-json.md +6 -0
  336. package/corpus/templates/plan/changelog/2026-07-03-plans-are-now-fully-real-time-collaborative-multiple-people-.md +6 -0
  337. package/corpus/templates/plan/changelog/2026-07-03-plans-open-and-refresh-faster-especially-long-lived-plans-wi.md +6 -0
  338. package/corpus/templates/plan/changelog/2026-07-03-undo-now-survives-agent-edits-cmd-z-keeps-working-on-your-ow.md +6 -0
  339. package/corpus/templates/plan/package.json +5 -3
  340. package/corpus/templates/plan/server/db/schema.ts +12 -0
  341. package/corpus/templates/plan/server/lib/local-plan-kind.ts +25 -0
  342. package/corpus/templates/plan/server/lib/plan-versions.ts +83 -1
  343. package/corpus/templates/plan/server/lib/public-action-paths.ts +0 -2
  344. package/corpus/templates/plan/server/plans.ts +26 -3
  345. package/corpus/templates/plan/server/plugins/db.ts +105 -2
  346. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +8 -4
  347. package/corpus/templates/slides/AGENTS.md +4 -0
  348. package/corpus/templates/slides/actions/_agent-presence.ts +48 -0
  349. package/corpus/templates/slides/actions/add-slide.ts +16 -18
  350. package/corpus/templates/slides/actions/patch-deck.ts +4 -2
  351. package/corpus/templates/slides/actions/update-slide.ts +114 -77
  352. package/corpus/templates/slides/actions/view-screen.ts +39 -0
  353. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +47 -3
  354. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +32 -35
  355. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +625 -199
  356. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +342 -0
  357. package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +46 -96
  358. package/corpus/templates/slides/app/components/visual-editor/SaveStatusIndicator.tsx +8 -1
  359. package/corpus/templates/slides/app/context/DeckContext.tsx +589 -176
  360. package/corpus/templates/slides/app/hooks/use-deck-presence.ts +84 -42
  361. package/corpus/templates/slides/app/i18n/ar-SA.ts +46 -0
  362. package/corpus/templates/slides/app/i18n/de-DE.ts +46 -0
  363. package/corpus/templates/slides/app/i18n/en-US.ts +46 -0
  364. package/corpus/templates/slides/app/i18n/es-ES.ts +46 -0
  365. package/corpus/templates/slides/app/i18n/fr-FR.ts +46 -0
  366. package/corpus/templates/slides/app/i18n/hi-IN.ts +46 -0
  367. package/corpus/templates/slides/app/i18n/ja-JP.ts +46 -0
  368. package/corpus/templates/slides/app/i18n/ko-KR.ts +46 -0
  369. package/corpus/templates/slides/app/i18n/pt-BR.ts +46 -0
  370. package/corpus/templates/slides/app/i18n/zh-CN.ts +46 -0
  371. package/corpus/templates/slides/app/i18n/zh-TW.ts +46 -0
  372. package/corpus/templates/slides/app/pages/DeckEditor.tsx +25 -13
  373. package/corpus/templates/slides/changelog/2026-07-03-figma-style-slide-editing.md +6 -0
  374. package/corpus/templates/slides/changelog/2026-07-03-see-the-ai-working-with-you-when-the-agent-edits-a-slide-it-.md +6 -0
  375. package/corpus/templates/slides/changelog/2026-07-03-undo-redo-is-now-precise-and-safe-with-collaborators-it-only.md +6 -0
  376. package/corpus/templates/slides/package.json +3 -3
  377. package/corpus/templates/slides/server/handlers/decks.ts +31 -3
  378. package/corpus/templates/slides/server/plugins/db.ts +65 -2
  379. package/corpus/templates/videos/netlify.toml +1 -12
  380. package/dist/agent/run-store.js +1 -1
  381. package/dist/agent/run-store.js.map +1 -1
  382. package/dist/chat-threads/store.d.ts +9 -1
  383. package/dist/chat-threads/store.d.ts.map +1 -1
  384. package/dist/chat-threads/store.js +63 -11
  385. package/dist/chat-threads/store.js.map +1 -1
  386. package/dist/checkpoints/store.d.ts.map +1 -1
  387. package/dist/checkpoints/store.js +10 -2
  388. package/dist/checkpoints/store.js.map +1 -1
  389. package/dist/cli/create.d.ts.map +1 -1
  390. package/dist/cli/create.js +3 -5
  391. package/dist/cli/create.js.map +1 -1
  392. package/dist/cli/design-connect.d.ts +49 -1
  393. package/dist/cli/design-connect.d.ts.map +1 -1
  394. package/dist/cli/design-connect.js +414 -9
  395. package/dist/cli/design-connect.js.map +1 -1
  396. package/dist/cli/index.js +12 -0
  397. package/dist/cli/index.js.map +1 -1
  398. package/dist/cli/plan-local.d.ts +24 -0
  399. package/dist/cli/plan-local.d.ts.map +1 -1
  400. package/dist/cli/plan-local.js +188 -20
  401. package/dist/cli/plan-local.js.map +1 -1
  402. package/dist/cli/skills.d.ts +3 -1
  403. package/dist/cli/skills.d.ts.map +1 -1
  404. package/dist/cli/skills.js +173 -21
  405. package/dist/cli/skills.js.map +1 -1
  406. package/dist/cli/templates-meta.d.ts.map +1 -1
  407. package/dist/cli/templates-meta.js +0 -14
  408. package/dist/cli/templates-meta.js.map +1 -1
  409. package/dist/cli/visualize-repo.d.ts +49 -0
  410. package/dist/cli/visualize-repo.d.ts.map +1 -0
  411. package/dist/cli/visualize-repo.js +561 -0
  412. package/dist/cli/visualize-repo.js.map +1 -0
  413. package/dist/client/AssistantChat.d.ts.map +1 -1
  414. package/dist/client/AssistantChat.js +120 -15
  415. package/dist/client/AssistantChat.js.map +1 -1
  416. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  417. package/dist/client/agent-chat-adapter.js +6 -5
  418. package/dist/client/agent-chat-adapter.js.map +1 -1
  419. package/dist/client/app-providers.d.ts +2 -2
  420. package/dist/client/app-providers.js.map +1 -1
  421. package/dist/client/collab/index.d.ts +4 -1
  422. package/dist/client/collab/index.d.ts.map +1 -1
  423. package/dist/client/collab/index.js +3 -0
  424. package/dist/client/collab/index.js.map +1 -1
  425. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  426. package/dist/client/components/LiveCursorOverlay.js +11 -3
  427. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  428. package/dist/client/components/PresenceBar.d.ts.map +1 -1
  429. package/dist/client/components/PresenceBar.js +6 -1
  430. package/dist/client/components/PresenceBar.js.map +1 -1
  431. package/dist/client/components/RecentEditHighlights.d.ts +43 -0
  432. package/dist/client/components/RecentEditHighlights.d.ts.map +1 -0
  433. package/dist/client/components/RecentEditHighlights.js +146 -0
  434. package/dist/client/components/RecentEditHighlights.js.map +1 -0
  435. package/dist/client/components/RemoteSelectionRings.d.ts +9 -0
  436. package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
  437. package/dist/client/components/RemoteSelectionRings.js +22 -8
  438. package/dist/client/components/RemoteSelectionRings.js.map +1 -1
  439. package/dist/client/index.d.ts +6 -1
  440. package/dist/client/index.d.ts.map +1 -1
  441. package/dist/client/index.js +7 -0
  442. package/dist/client/index.js.map +1 -1
  443. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  444. package/dist/client/org/OrgSwitcher.js +1 -3
  445. package/dist/client/org/OrgSwitcher.js.map +1 -1
  446. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +8 -1
  447. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  448. package/dist/client/rich-markdown-editor/SharedRichEditor.js +8 -2
  449. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  450. package/dist/client/rich-markdown-editor/index.d.ts +1 -0
  451. package/dist/client/rich-markdown-editor/index.d.ts.map +1 -1
  452. package/dist/client/rich-markdown-editor/index.js +1 -0
  453. package/dist/client/rich-markdown-editor/index.js.map +1 -1
  454. package/dist/client/rich-markdown-editor/surgical-apply.d.ts +66 -0
  455. package/dist/client/rich-markdown-editor/surgical-apply.d.ts.map +1 -0
  456. package/dist/client/rich-markdown-editor/surgical-apply.js +147 -0
  457. package/dist/client/rich-markdown-editor/surgical-apply.js.map +1 -0
  458. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +18 -2
  459. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  460. package/dist/client/rich-markdown-editor/useCollabReconcile.js +39 -8
  461. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  462. package/dist/client/session-replay.d.ts +10 -1
  463. package/dist/client/session-replay.d.ts.map +1 -1
  464. package/dist/client/session-replay.js +134 -7
  465. package/dist/client/session-replay.js.map +1 -1
  466. package/dist/client/sse-event-processor.d.ts.map +1 -1
  467. package/dist/client/sse-event-processor.js +81 -1
  468. package/dist/client/sse-event-processor.js.map +1 -1
  469. package/dist/client/use-action.d.ts +24 -0
  470. package/dist/client/use-action.d.ts.map +1 -1
  471. package/dist/client/use-action.js +109 -27
  472. package/dist/client/use-action.js.map +1 -1
  473. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  474. package/dist/client/use-agent-engine-configured.js +7 -1
  475. package/dist/client/use-agent-engine-configured.js.map +1 -1
  476. package/dist/client/use-chat-threads.d.ts.map +1 -1
  477. package/dist/client/use-chat-threads.js +11 -3
  478. package/dist/client/use-chat-threads.js.map +1 -1
  479. package/dist/client/use-db-sync.d.ts +36 -0
  480. package/dist/client/use-db-sync.d.ts.map +1 -1
  481. package/dist/client/use-db-sync.js +68 -12
  482. package/dist/client/use-db-sync.js.map +1 -1
  483. package/dist/client/visual-style-controls.d.ts +79 -0
  484. package/dist/client/visual-style-controls.d.ts.map +1 -0
  485. package/dist/client/visual-style-controls.js +150 -0
  486. package/dist/client/visual-style-controls.js.map +1 -0
  487. package/dist/collab/agent-presence.d.ts +51 -5
  488. package/dist/collab/agent-presence.d.ts.map +1 -1
  489. package/dist/collab/agent-presence.js +144 -58
  490. package/dist/collab/agent-presence.js.map +1 -1
  491. package/dist/collab/awareness-store.d.ts +32 -0
  492. package/dist/collab/awareness-store.d.ts.map +1 -0
  493. package/dist/collab/awareness-store.js +0 -0
  494. package/dist/collab/awareness-store.js.map +1 -0
  495. package/dist/collab/awareness.d.ts +12 -1
  496. package/dist/collab/awareness.d.ts.map +1 -1
  497. package/dist/collab/awareness.js +53 -5
  498. package/dist/collab/awareness.js.map +1 -1
  499. package/dist/collab/client.d.ts +2 -0
  500. package/dist/collab/client.d.ts.map +1 -1
  501. package/dist/collab/client.js +79 -119
  502. package/dist/collab/client.js.map +1 -1
  503. package/dist/collab/index.d.ts +3 -1
  504. package/dist/collab/index.d.ts.map +1 -1
  505. package/dist/collab/index.js +5 -1
  506. package/dist/collab/index.js.map +1 -1
  507. package/dist/collab/recent-edits.d.ts +87 -0
  508. package/dist/collab/recent-edits.d.ts.map +1 -0
  509. package/dist/collab/recent-edits.js +116 -0
  510. package/dist/collab/recent-edits.js.map +1 -0
  511. package/dist/collab/routes.d.ts +2 -2
  512. package/dist/collab/struct-routes.d.ts +1 -1
  513. package/dist/collab/undo.d.ts +121 -0
  514. package/dist/collab/undo.d.ts.map +1 -0
  515. package/dist/collab/undo.js +244 -0
  516. package/dist/collab/undo.js.map +1 -0
  517. package/dist/collab/ydoc-manager.d.ts +10 -0
  518. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  519. package/dist/collab/ydoc-manager.js +57 -0
  520. package/dist/collab/ydoc-manager.js.map +1 -1
  521. package/dist/connections/catalog.d.ts +2 -2
  522. package/dist/connections/catalog.d.ts.map +1 -1
  523. package/dist/connections/catalog.js +1 -1
  524. package/dist/connections/catalog.js.map +1 -1
  525. package/dist/db/create-get-db.d.ts +22 -0
  526. package/dist/db/create-get-db.d.ts.map +1 -1
  527. package/dist/db/create-get-db.js +73 -1
  528. package/dist/db/create-get-db.js.map +1 -1
  529. package/dist/db/ensure-additive-columns.d.ts +93 -0
  530. package/dist/db/ensure-additive-columns.d.ts.map +1 -0
  531. package/dist/db/ensure-additive-columns.js +355 -0
  532. package/dist/db/ensure-additive-columns.js.map +1 -0
  533. package/dist/db/index.d.ts +1 -0
  534. package/dist/db/index.d.ts.map +1 -1
  535. package/dist/db/index.js +1 -0
  536. package/dist/db/index.js.map +1 -1
  537. package/dist/db/migrations.d.ts +70 -0
  538. package/dist/db/migrations.d.ts.map +1 -1
  539. package/dist/db/migrations.js +196 -33
  540. package/dist/db/migrations.js.map +1 -1
  541. package/dist/jobs/scheduler.js +17 -10
  542. package/dist/jobs/scheduler.js.map +1 -1
  543. package/dist/notifications/routes.d.ts +3 -3
  544. package/dist/observability/routes.d.ts +2 -2
  545. package/dist/observability/traces.d.ts.map +1 -1
  546. package/dist/observability/traces.js +155 -1
  547. package/dist/observability/traces.js.map +1 -1
  548. package/dist/org/context.d.ts +7 -0
  549. package/dist/org/context.d.ts.map +1 -1
  550. package/dist/org/context.js +54 -2
  551. package/dist/org/context.js.map +1 -1
  552. package/dist/resources/handlers.d.ts +1 -1
  553. package/dist/secrets/routes.d.ts +9 -9
  554. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  555. package/dist/server/agent-chat-plugin.js +10 -6
  556. package/dist/server/agent-chat-plugin.js.map +1 -1
  557. package/dist/server/auth-marketing.d.ts.map +1 -1
  558. package/dist/server/auth-marketing.js +0 -10
  559. package/dist/server/auth-marketing.js.map +1 -1
  560. package/dist/server/auth.d.ts.map +1 -1
  561. package/dist/server/auth.js +6 -4
  562. package/dist/server/auth.js.map +1 -1
  563. package/dist/server/collab-plugin.d.ts.map +1 -1
  564. package/dist/server/collab-plugin.js +45 -13
  565. package/dist/server/collab-plugin.js.map +1 -1
  566. package/dist/server/design-token-utils.d.ts +1 -1
  567. package/dist/server/design-token-utils.js +1 -1
  568. package/dist/server/design-token-utils.js.map +1 -1
  569. package/dist/server/fusion-app.d.ts +107 -0
  570. package/dist/server/fusion-app.d.ts.map +1 -0
  571. package/dist/server/fusion-app.js +371 -0
  572. package/dist/server/fusion-app.js.map +1 -0
  573. package/dist/server/index.d.ts +1 -0
  574. package/dist/server/index.d.ts.map +1 -1
  575. package/dist/server/index.js +1 -0
  576. package/dist/server/index.js.map +1 -1
  577. package/dist/server/onboarding-html.d.ts.map +1 -1
  578. package/dist/server/onboarding-html.js +3 -4
  579. package/dist/server/onboarding-html.js.map +1 -1
  580. package/dist/server/poll-events.d.ts +2 -0
  581. package/dist/server/poll-events.d.ts.map +1 -1
  582. package/dist/server/poll-events.js +7 -2
  583. package/dist/server/poll-events.js.map +1 -1
  584. package/dist/server/poll.d.ts +47 -3
  585. package/dist/server/poll.d.ts.map +1 -1
  586. package/dist/server/poll.js +176 -10
  587. package/dist/server/poll.js.map +1 -1
  588. package/dist/server/schema-prompt.d.ts.map +1 -1
  589. package/dist/server/schema-prompt.js +24 -7
  590. package/dist/server/schema-prompt.js.map +1 -1
  591. package/dist/server/transcribe-voice.d.ts +1 -1
  592. package/dist/settings/store.d.ts.map +1 -1
  593. package/dist/settings/store.js +32 -3
  594. package/dist/settings/store.js.map +1 -1
  595. package/dist/sharing/actions/set-resource-visibility.js +2 -0
  596. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  597. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  598. package/dist/sharing/actions/share-resource.js +3 -0
  599. package/dist/sharing/actions/share-resource.js.map +1 -1
  600. package/dist/sharing/actions/unshare-resource.js +2 -0
  601. package/dist/sharing/actions/unshare-resource.js.map +1 -1
  602. package/dist/styles/agent-native.css +0 -5
  603. package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
  604. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
  605. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
  606. package/dist/templates/default/package.json +3 -3
  607. package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
  608. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
  609. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
  610. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
  611. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
  612. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
  613. package/dist/tracking/providers.d.ts.map +1 -1
  614. package/dist/tracking/providers.js +17 -1
  615. package/dist/tracking/providers.js.map +1 -1
  616. package/docs/content/cloneable-saas.mdx +0 -1
  617. package/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
  618. package/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
  619. package/docs/content/locales/ar-SA/sharing.mdx +1 -2
  620. package/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
  621. package/docs/content/locales/ar-SA/template-plan.mdx +23 -7
  622. package/docs/content/locales/ar-SA/tracking.mdx +1 -1
  623. package/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
  624. package/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
  625. package/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
  626. package/docs/content/locales/de-DE/sharing.mdx +1 -2
  627. package/docs/content/locales/de-DE/skills-guide.mdx +2 -3
  628. package/docs/content/locales/de-DE/template-plan.mdx +23 -7
  629. package/docs/content/locales/de-DE/tracking.mdx +1 -1
  630. package/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
  631. package/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
  632. package/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
  633. package/docs/content/locales/es-ES/sharing.mdx +1 -2
  634. package/docs/content/locales/es-ES/skills-guide.mdx +2 -3
  635. package/docs/content/locales/es-ES/template-plan.mdx +23 -7
  636. package/docs/content/locales/es-ES/tracking.mdx +1 -1
  637. package/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
  638. package/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
  639. package/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
  640. package/docs/content/locales/fr-FR/sharing.mdx +1 -2
  641. package/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
  642. package/docs/content/locales/fr-FR/template-plan.mdx +23 -7
  643. package/docs/content/locales/fr-FR/tracking.mdx +1 -1
  644. package/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
  645. package/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
  646. package/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
  647. package/docs/content/locales/hi-IN/sharing.mdx +1 -2
  648. package/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
  649. package/docs/content/locales/hi-IN/template-plan.mdx +23 -7
  650. package/docs/content/locales/hi-IN/tracking.mdx +1 -1
  651. package/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
  652. package/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
  653. package/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
  654. package/docs/content/locales/ja-JP/sharing.mdx +1 -2
  655. package/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
  656. package/docs/content/locales/ja-JP/template-plan.mdx +23 -7
  657. package/docs/content/locales/ja-JP/tracking.mdx +1 -1
  658. package/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
  659. package/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
  660. package/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
  661. package/docs/content/locales/ko-KR/sharing.mdx +1 -2
  662. package/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
  663. package/docs/content/locales/ko-KR/template-plan.mdx +23 -7
  664. package/docs/content/locales/ko-KR/tracking.mdx +1 -1
  665. package/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
  666. package/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
  667. package/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
  668. package/docs/content/locales/pt-BR/sharing.mdx +1 -2
  669. package/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
  670. package/docs/content/locales/pt-BR/template-plan.mdx +23 -7
  671. package/docs/content/locales/pt-BR/tracking.mdx +1 -1
  672. package/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
  673. package/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
  674. package/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
  675. package/docs/content/locales/zh-CN/sharing.mdx +1 -2
  676. package/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
  677. package/docs/content/locales/zh-CN/template-plan.mdx +23 -7
  678. package/docs/content/locales/zh-CN/tracking.mdx +1 -1
  679. package/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
  680. package/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
  681. package/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
  682. package/docs/content/locales/zh-TW/sharing.mdx +1 -2
  683. package/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
  684. package/docs/content/locales/zh-TW/template-plan.mdx +23 -7
  685. package/docs/content/locales/zh-TW/tracking.mdx +1 -1
  686. package/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
  687. package/docs/content/plan-plugin.mdx +12 -11
  688. package/docs/content/sharing.mdx +1 -2
  689. package/docs/content/skills-guide.mdx +4 -3
  690. package/docs/content/template-plan.mdx +37 -6
  691. package/docs/content/tracking.mdx +1 -1
  692. package/docs/content/workspace-connections.mdx +1 -1
  693. package/package.json +6 -6
  694. package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
  695. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
  696. package/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
  697. package/src/templates/default/package.json +3 -3
  698. package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
  699. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
  700. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
  701. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
  702. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
  703. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
  704. package/corpus/core/docs/content/locales/ar-SA/template-videos.mdx +0 -336
  705. package/corpus/core/docs/content/locales/de-DE/template-videos.mdx +0 -336
  706. package/corpus/core/docs/content/locales/es-ES/template-videos.mdx +0 -336
  707. package/corpus/core/docs/content/locales/fr-FR/template-videos.mdx +0 -336
  708. package/corpus/core/docs/content/locales/hi-IN/template-videos.mdx +0 -336
  709. package/corpus/core/docs/content/locales/ja-JP/template-videos.mdx +0 -336
  710. package/corpus/core/docs/content/locales/ko-KR/template-videos.mdx +0 -336
  711. package/corpus/core/docs/content/locales/pt-BR/template-videos.mdx +0 -336
  712. package/corpus/core/docs/content/locales/zh-CN/template-videos.mdx +0 -334
  713. package/corpus/core/docs/content/locales/zh-TW/template-videos.mdx +0 -334
  714. package/corpus/core/docs/content/template-videos.mdx +0 -332
  715. package/corpus/templates/design/app/components/design/CodeWorkbenchHost.tsx +0 -697
  716. package/corpus/templates/slides/app/components/editor/CodeEditor.tsx +0 -49
  717. package/corpus/templates/videos/.agents/skills/actions/SKILL.md +0 -432
  718. package/corpus/templates/videos/.agents/skills/animation-tracks/SKILL.md +0 -99
  719. package/corpus/templates/videos/.agents/skills/capture-learnings/SKILL.md +0 -76
  720. package/corpus/templates/videos/.agents/skills/composition-management/SKILL.md +0 -106
  721. package/corpus/templates/videos/.agents/skills/create-skill/SKILL.md +0 -221
  722. package/corpus/templates/videos/.agents/skills/delegate-to-agent/SKILL.md +0 -263
  723. package/corpus/templates/videos/.agents/skills/frontend-design/SKILL.md +0 -112
  724. package/corpus/templates/videos/.agents/skills/security/SKILL.md +0 -263
  725. package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +0 -88
  726. package/corpus/templates/videos/.agents/skills/shadcn-ui/SKILL.md +0 -95
  727. package/corpus/templates/videos/.builder/ANIMATED_PROPERTIES.md +0 -335
  728. package/corpus/templates/videos/.builder/KEYFRAME_SYNC.md +0 -166
  729. package/corpus/templates/videos/.builder/SEAMLESS_SYNC.md +0 -211
  730. package/corpus/templates/videos/.builder/rules/deploy-app.mdc +0 -22
  731. package/corpus/templates/videos/.builder/rules/organize-ui.mdc +0 -9
  732. package/corpus/templates/videos/.builder/skills/remotion/SKILL.md +0 -29
  733. package/corpus/templates/videos/.builder/skills/remotion/rules/animations.md +0 -27
  734. package/corpus/templates/videos/.builder/skills/remotion/rules/assets.md +0 -43
  735. package/corpus/templates/videos/.builder/skills/remotion/rules/audio.md +0 -58
  736. package/corpus/templates/videos/.builder/skills/remotion/rules/compositions.md +0 -129
  737. package/corpus/templates/videos/.builder/skills/remotion/rules/fonts.md +0 -47
  738. package/corpus/templates/videos/.builder/skills/remotion/rules/images.md +0 -41
  739. package/corpus/templates/videos/.builder/skills/remotion/rules/parameters.md +0 -59
  740. package/corpus/templates/videos/.builder/skills/remotion/rules/sequencing.md +0 -54
  741. package/corpus/templates/videos/.builder/skills/remotion/rules/tailwind.md +0 -11
  742. package/corpus/templates/videos/.builder/skills/remotion/rules/text-animations.md +0 -18
  743. package/corpus/templates/videos/.builder/skills/remotion/rules/timing.md +0 -103
  744. package/corpus/templates/videos/.builder/skills/remotion/rules/transparent-videos.md +0 -35
  745. package/corpus/templates/videos/.builder/skills/remotion/rules/trimming.md +0 -38
  746. package/corpus/templates/videos/.builder/skills/remotion/rules/videos.md +0 -54
  747. package/corpus/templates/videos/.dockerignore +0 -62
  748. package/corpus/templates/videos/.env.example +0 -4
  749. package/corpus/templates/videos/.oxfmtrc.json +0 -8
  750. package/corpus/templates/videos/AGENTS.md +0 -46
  751. package/corpus/templates/videos/CHANGELOG.md +0 -10
  752. package/corpus/templates/videos/DEVELOPING.md +0 -143
  753. package/corpus/templates/videos/README.md +0 -33
  754. package/corpus/templates/videos/actions/analyze-brand-assets.ts +0 -151
  755. package/corpus/templates/videos/actions/apply-design-system.ts +0 -35
  756. package/corpus/templates/videos/actions/create-design-system.ts +0 -84
  757. package/corpus/templates/videos/actions/create-folder.ts +0 -48
  758. package/corpus/templates/videos/actions/db-connect.ts +0 -45
  759. package/corpus/templates/videos/actions/db-health.ts +0 -24
  760. package/corpus/templates/videos/actions/db-status.ts +0 -28
  761. package/corpus/templates/videos/actions/delete-composition.ts +0 -272
  762. package/corpus/templates/videos/actions/delete-folder.ts +0 -27
  763. package/corpus/templates/videos/actions/generate-animated-component.ts +0 -470
  764. package/corpus/templates/videos/actions/get-composition.ts +0 -36
  765. package/corpus/templates/videos/actions/get-design-system.ts +0 -35
  766. package/corpus/templates/videos/actions/import-code.ts +0 -67
  767. package/corpus/templates/videos/actions/import-design-project.ts +0 -42
  768. package/corpus/templates/videos/actions/import-document.ts +0 -125
  769. package/corpus/templates/videos/actions/import-from-url.ts +0 -18
  770. package/corpus/templates/videos/actions/import-github.ts +0 -182
  771. package/corpus/templates/videos/actions/list-compositions.ts +0 -32
  772. package/corpus/templates/videos/actions/list-design-systems.ts +0 -66
  773. package/corpus/templates/videos/actions/list-folders.ts +0 -61
  774. package/corpus/templates/videos/actions/move-composition-to-folder.ts +0 -59
  775. package/corpus/templates/videos/actions/navigate.ts +0 -40
  776. package/corpus/templates/videos/actions/rename-folder.ts +0 -41
  777. package/corpus/templates/videos/actions/run.ts +0 -2
  778. package/corpus/templates/videos/actions/save-composition.ts +0 -114
  779. package/corpus/templates/videos/actions/set-default-design-system.ts +0 -40
  780. package/corpus/templates/videos/actions/update-composition.ts +0 -81
  781. package/corpus/templates/videos/actions/update-design-system.ts +0 -68
  782. package/corpus/templates/videos/actions/validate-compositions.ts +0 -502
  783. package/corpus/templates/videos/actions/view-screen.ts +0 -48
  784. package/corpus/templates/videos/app/components/CameraControls.tsx +0 -442
  785. package/corpus/templates/videos/app/components/CameraToolbar.tsx +0 -437
  786. package/corpus/templates/videos/app/components/CloudUpgrade.tsx +0 -287
  787. package/corpus/templates/videos/app/components/CollabPresenceBar.tsx +0 -81
  788. package/corpus/templates/videos/app/components/CompSettingsEditor.tsx +0 -107
  789. package/corpus/templates/videos/app/components/ComponentLibrarySidebar.tsx +0 -457
  790. package/corpus/templates/videos/app/components/ComponentPropsPanel.tsx +0 -227
  791. package/corpus/templates/videos/app/components/ComponentsSidebar.tsx +0 -70
  792. package/corpus/templates/videos/app/components/CompositionCard.tsx +0 -147
  793. package/corpus/templates/videos/app/components/CurrentElementPanel.tsx +0 -835
  794. package/corpus/templates/videos/app/components/CursorControls.tsx +0 -664
  795. package/corpus/templates/videos/app/components/CursorPositioningOverlay.tsx +0 -238
  796. package/corpus/templates/videos/app/components/LibraryFolderRow.tsx +0 -235
  797. package/corpus/templates/videos/app/components/MotionCurveSelect.tsx +0 -61
  798. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +0 -192
  799. package/corpus/templates/videos/app/components/PropsEditor.tsx +0 -210
  800. package/corpus/templates/videos/app/components/QuestionFlow.tsx +0 -40
  801. package/corpus/templates/videos/app/components/Sidebar.tsx +0 -609
  802. package/corpus/templates/videos/app/components/StudioHeader.tsx +0 -109
  803. package/corpus/templates/videos/app/components/Timeline.tsx +0 -2067
  804. package/corpus/templates/videos/app/components/TrackPropertiesPanel.tsx +0 -922
  805. package/corpus/templates/videos/app/components/TweaksPanel.tsx +0 -277
  806. package/corpus/templates/videos/app/components/VideoPlayer.tsx +0 -487
  807. package/corpus/templates/videos/app/components/design-system/DesignSystemCard.tsx +0 -134
  808. package/corpus/templates/videos/app/components/design-system/DesignSystemPreview.tsx +0 -176
  809. package/corpus/templates/videos/app/components/design-system/DesignSystemSetup.tsx +0 -707
  810. package/corpus/templates/videos/app/components/keyframes/KeyframeActionButtons.tsx +0 -78
  811. package/corpus/templates/videos/app/components/keyframes/KeyframeNavigation.tsx +0 -59
  812. package/corpus/templates/videos/app/components/keyframes/PropertyNumberInput.tsx +0 -56
  813. package/corpus/templates/videos/app/components/layout/Header.tsx +0 -64
  814. package/corpus/templates/videos/app/components/layout/HeaderActions.tsx +0 -84
  815. package/corpus/templates/videos/app/components/layout/Layout.tsx +0 -132
  816. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +0 -180
  817. package/corpus/templates/videos/app/components/ui/accordion.tsx +0 -56
  818. package/corpus/templates/videos/app/components/ui/alert-dialog.tsx +0 -139
  819. package/corpus/templates/videos/app/components/ui/alert.tsx +0 -59
  820. package/corpus/templates/videos/app/components/ui/aspect-ratio.tsx +0 -5
  821. package/corpus/templates/videos/app/components/ui/avatar.tsx +0 -48
  822. package/corpus/templates/videos/app/components/ui/badge.tsx +0 -37
  823. package/corpus/templates/videos/app/components/ui/breadcrumb.tsx +0 -115
  824. package/corpus/templates/videos/app/components/ui/button.tsx +0 -57
  825. package/corpus/templates/videos/app/components/ui/calendar.tsx +0 -68
  826. package/corpus/templates/videos/app/components/ui/card.tsx +0 -86
  827. package/corpus/templates/videos/app/components/ui/carousel.tsx +0 -260
  828. package/corpus/templates/videos/app/components/ui/chart.tsx +0 -375
  829. package/corpus/templates/videos/app/components/ui/checkbox.tsx +0 -28
  830. package/corpus/templates/videos/app/components/ui/collapsible.tsx +0 -9
  831. package/corpus/templates/videos/app/components/ui/command.tsx +0 -154
  832. package/corpus/templates/videos/app/components/ui/context-menu.tsx +0 -202
  833. package/corpus/templates/videos/app/components/ui/dialog.tsx +0 -130
  834. package/corpus/templates/videos/app/components/ui/drawer.tsx +0 -116
  835. package/corpus/templates/videos/app/components/ui/dropdown-menu.tsx +0 -212
  836. package/corpus/templates/videos/app/components/ui/form.tsx +0 -177
  837. package/corpus/templates/videos/app/components/ui/hover-card.tsx +0 -27
  838. package/corpus/templates/videos/app/components/ui/input-otp.tsx +0 -69
  839. package/corpus/templates/videos/app/components/ui/input.tsx +0 -22
  840. package/corpus/templates/videos/app/components/ui/label.tsx +0 -24
  841. package/corpus/templates/videos/app/components/ui/menubar.tsx +0 -234
  842. package/corpus/templates/videos/app/components/ui/navigation-menu.tsx +0 -128
  843. package/corpus/templates/videos/app/components/ui/pagination.tsx +0 -121
  844. package/corpus/templates/videos/app/components/ui/popover.tsx +0 -44
  845. package/corpus/templates/videos/app/components/ui/progress.tsx +0 -26
  846. package/corpus/templates/videos/app/components/ui/radio-group.tsx +0 -42
  847. package/corpus/templates/videos/app/components/ui/resizable.tsx +0 -43
  848. package/corpus/templates/videos/app/components/ui/scroll-area.tsx +0 -46
  849. package/corpus/templates/videos/app/components/ui/select.tsx +0 -158
  850. package/corpus/templates/videos/app/components/ui/separator.tsx +0 -29
  851. package/corpus/templates/videos/app/components/ui/sheet.tsx +0 -160
  852. package/corpus/templates/videos/app/components/ui/sidebar.tsx +0 -782
  853. package/corpus/templates/videos/app/components/ui/skeleton.tsx +0 -15
  854. package/corpus/templates/videos/app/components/ui/slider.tsx +0 -26
  855. package/corpus/templates/videos/app/components/ui/sonner.tsx +0 -58
  856. package/corpus/templates/videos/app/components/ui/spinner.tsx +0 -17
  857. package/corpus/templates/videos/app/components/ui/switch.tsx +0 -27
  858. package/corpus/templates/videos/app/components/ui/table.tsx +0 -117
  859. package/corpus/templates/videos/app/components/ui/tabs.tsx +0 -53
  860. package/corpus/templates/videos/app/components/ui/textarea.tsx +0 -23
  861. package/corpus/templates/videos/app/components/ui/toast.tsx +0 -127
  862. package/corpus/templates/videos/app/components/ui/toaster.tsx +0 -33
  863. package/corpus/templates/videos/app/components/ui/toggle-group.tsx +0 -59
  864. package/corpus/templates/videos/app/components/ui/toggle.tsx +0 -43
  865. package/corpus/templates/videos/app/components/ui/tooltip.tsx +0 -30
  866. package/corpus/templates/videos/app/components/ui/use-toast.ts +0 -3
  867. package/corpus/templates/videos/app/config/constants.ts +0 -204
  868. package/corpus/templates/videos/app/contexts/CompositionContext.tsx +0 -437
  869. package/corpus/templates/videos/app/contexts/CurrentElementContext.tsx +0 -247
  870. package/corpus/templates/videos/app/contexts/PlaybackContext.tsx +0 -65
  871. package/corpus/templates/videos/app/contexts/TimelineContext.tsx +0 -433
  872. package/corpus/templates/videos/app/entry.client.tsx +0 -19
  873. package/corpus/templates/videos/app/entry.server.tsx +0 -10
  874. package/corpus/templates/videos/app/global.css +0 -171
  875. package/corpus/templates/videos/app/hooks/use-composition-collab.ts +0 -269
  876. package/corpus/templates/videos/app/hooks/use-composition-design-system.ts +0 -47
  877. package/corpus/templates/videos/app/hooks/use-database-compositions.ts +0 -144
  878. package/corpus/templates/videos/app/hooks/use-db-status.ts +0 -30
  879. package/corpus/templates/videos/app/hooks/use-design-systems.ts +0 -21
  880. package/corpus/templates/videos/app/hooks/use-folders.ts +0 -199
  881. package/corpus/templates/videos/app/hooks/use-mobile.tsx +0 -21
  882. package/corpus/templates/videos/app/hooks/use-navigation-state.ts +0 -52
  883. package/corpus/templates/videos/app/hooks/use-question-flow.ts +0 -14
  884. package/corpus/templates/videos/app/hooks/use-toast.ts +0 -188
  885. package/corpus/templates/videos/app/hooks/useUnsavedChanges.ts +0 -48
  886. package/corpus/templates/videos/app/i18n/ar-SA.ts +0 -446
  887. package/corpus/templates/videos/app/i18n/de-DE.ts +0 -470
  888. package/corpus/templates/videos/app/i18n/en-US.ts +0 -452
  889. package/corpus/templates/videos/app/i18n/es-ES.ts +0 -468
  890. package/corpus/templates/videos/app/i18n/fr-FR.ts +0 -469
  891. package/corpus/templates/videos/app/i18n/hi-IN.ts +0 -446
  892. package/corpus/templates/videos/app/i18n/index.ts +0 -34
  893. package/corpus/templates/videos/app/i18n/ja-JP.ts +0 -460
  894. package/corpus/templates/videos/app/i18n/ko-KR.ts +0 -453
  895. package/corpus/templates/videos/app/i18n/pt-BR.ts +0 -461
  896. package/corpus/templates/videos/app/i18n/zh-CN.ts +0 -437
  897. package/corpus/templates/videos/app/i18n/zh-TW.ts +0 -437
  898. package/corpus/templates/videos/app/lib/database-compositions.ts +0 -67
  899. package/corpus/templates/videos/app/lib/design-systems.ts +0 -234
  900. package/corpus/templates/videos/app/lib/tab-id.ts +0 -1
  901. package/corpus/templates/videos/app/lib/utils.ts +0 -1
  902. package/corpus/templates/videos/app/pages/ComponentLibrary.tsx +0 -134
  903. package/corpus/templates/videos/app/pages/ComponentLibraryView.tsx +0 -362
  904. package/corpus/templates/videos/app/pages/CompositionView.tsx +0 -715
  905. package/corpus/templates/videos/app/pages/DesignSystems.tsx +0 -180
  906. package/corpus/templates/videos/app/pages/Index.tsx +0 -258
  907. package/corpus/templates/videos/app/pages/NewComposition.tsx +0 -95
  908. package/corpus/templates/videos/app/pages/NotFound.tsx +0 -36
  909. package/corpus/templates/videos/app/remotion/CameraHost.tsx +0 -223
  910. package/corpus/templates/videos/app/remotion/animations/useElementAnimations.ts +0 -231
  911. package/corpus/templates/videos/app/remotion/componentRegistry.ts +0 -473
  912. package/corpus/templates/videos/app/remotion/components/AnimatedElement.tsx +0 -436
  913. package/corpus/templates/videos/app/remotion/components/InteractiveElement.tsx +0 -159
  914. package/corpus/templates/videos/app/remotion/components/InteractiveZoneEditor.tsx +0 -273
  915. package/corpus/templates/videos/app/remotion/compositions/BlankComposition.tsx +0 -204
  916. package/corpus/templates/videos/app/remotion/compositions/index.ts +0 -2
  917. package/corpus/templates/videos/app/remotion/createComponentCursorTrack.ts +0 -132
  918. package/corpus/templates/videos/app/remotion/docs/CURSOR_TRACKS.md +0 -285
  919. package/corpus/templates/videos/app/remotion/easingFunctions.ts +0 -255
  920. package/corpus/templates/videos/app/remotion/hooks/createInteractiveComposition.tsx +0 -283
  921. package/corpus/templates/videos/app/remotion/hooks/useCursorHistory.ts +0 -72
  922. package/corpus/templates/videos/app/remotion/hooks/useCursorTypeFromHover.ts +0 -35
  923. package/corpus/templates/videos/app/remotion/hooks/useEditableZones.tsx +0 -267
  924. package/corpus/templates/videos/app/remotion/hooks/useHoverAnimation.ts +0 -90
  925. package/corpus/templates/videos/app/remotion/hooks/useHoverAnimationSmooth.ts +0 -146
  926. package/corpus/templates/videos/app/remotion/hooks/useInteractiveComponent.ts +0 -711
  927. package/corpus/templates/videos/app/remotion/hooks/useRegisterInteractiveElement.ts +0 -56
  928. package/corpus/templates/videos/app/remotion/library-components/Button.tsx +0 -252
  929. package/corpus/templates/videos/app/remotion/library-components/Card.tsx +0 -241
  930. package/corpus/templates/videos/app/remotion/library-components/CodePanel.tsx +0 -1005
  931. package/corpus/templates/videos/app/remotion/library-components/FileItem.tsx +0 -196
  932. package/corpus/templates/videos/app/remotion/library-components/FolderItem.tsx +0 -199
  933. package/corpus/templates/videos/app/remotion/library-components/PrimaryButton.tsx +0 -177
  934. package/corpus/templates/videos/app/remotion/library-components/SecondaryButton.tsx +0 -167
  935. package/corpus/templates/videos/app/remotion/library-components/SectionHeader.tsx +0 -108
  936. package/corpus/templates/videos/app/remotion/library-components/TEMPLATE.tsx +0 -211
  937. package/corpus/templates/videos/app/remotion/library-components/index.ts +0 -10
  938. package/corpus/templates/videos/app/remotion/registry.ts +0 -91
  939. package/corpus/templates/videos/app/remotion/testing/animationTestUtils.ts +0 -366
  940. package/corpus/templates/videos/app/remotion/trackAnimation.ts +0 -179
  941. package/corpus/templates/videos/app/remotion/trackHelpers.ts +0 -110
  942. package/corpus/templates/videos/app/remotion/ui-components/Cursor.tsx +0 -182
  943. package/corpus/templates/videos/app/remotion/ui-components/InteractiveButton.tsx +0 -116
  944. package/corpus/templates/videos/app/remotion/ui-components/InteractiveCard.tsx +0 -126
  945. package/corpus/templates/videos/app/remotion/ui-components/index.ts +0 -16
  946. package/corpus/templates/videos/app/remotion/utils/animationHelpers.ts +0 -444
  947. package/corpus/templates/videos/app/remotion/utils/interactiveElements.ts +0 -235
  948. package/corpus/templates/videos/app/remotion/utils/springAnimation.ts +0 -76
  949. package/corpus/templates/videos/app/root.tsx +0 -165
  950. package/corpus/templates/videos/app/routes/$.tsx +0 -10
  951. package/corpus/templates/videos/app/routes/_index.tsx +0 -25
  952. package/corpus/templates/videos/app/routes/c.$compositionId.tsx +0 -10
  953. package/corpus/templates/videos/app/routes/components.tsx +0 -10
  954. package/corpus/templates/videos/app/routes/design-systems.tsx +0 -10
  955. package/corpus/templates/videos/app/routes/extensions.$id.$slug.tsx +0 -2
  956. package/corpus/templates/videos/app/routes/extensions.$id.tsx +0 -5
  957. package/corpus/templates/videos/app/routes/extensions._index.tsx +0 -5
  958. package/corpus/templates/videos/app/routes/extensions.tsx +0 -5
  959. package/corpus/templates/videos/app/routes/settings.tsx +0 -88
  960. package/corpus/templates/videos/app/routes/team.tsx +0 -11
  961. package/corpus/templates/videos/app/routes.ts +0 -4
  962. package/corpus/templates/videos/app/state.ts +0 -77
  963. package/corpus/templates/videos/app/types/elementAnimations.ts +0 -121
  964. package/corpus/templates/videos/app/types.ts +0 -200
  965. package/corpus/templates/videos/app/utils/compositionHelpers.ts +0 -445
  966. package/corpus/templates/videos/app/utils/debug.ts +0 -63
  967. package/corpus/templates/videos/app/utils/keyframeUtils.ts +0 -331
  968. package/corpus/templates/videos/app/utils/timelineCoordinates.ts +0 -79
  969. package/corpus/templates/videos/app/vite-env.d.ts +0 -6
  970. package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +0 -6
  971. package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +0 -6
  972. package/corpus/templates/videos/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +0 -6
  973. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +0 -6
  974. package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +0 -6
  975. package/corpus/templates/videos/components.json +0 -20
  976. package/corpus/templates/videos/data/sync-config.json +0 -3
  977. package/corpus/templates/videos/docs/examples/create-composition.example.ts +0 -128
  978. package/corpus/templates/videos/drizzle.config.ts +0 -3
  979. package/corpus/templates/videos/learnings.defaults.md +0 -5
  980. package/corpus/templates/videos/package.json +0 -114
  981. package/corpus/templates/videos/public/agent-native-icon-dark.svg +0 -10
  982. package/corpus/templates/videos/public/agent-native-icon-light.svg +0 -10
  983. package/corpus/templates/videos/public/agent-native-logo-dark.svg +0 -21
  984. package/corpus/templates/videos/public/agent-native-logo-light.svg +0 -21
  985. package/corpus/templates/videos/public/favicon.svg +0 -1
  986. package/corpus/templates/videos/public/icon-180.svg +0 -1
  987. package/corpus/templates/videos/public/icon-192.svg +0 -1
  988. package/corpus/templates/videos/public/icon-512.svg +0 -1
  989. package/corpus/templates/videos/public/manifest.json +0 -21
  990. package/corpus/templates/videos/public/placeholder.svg +0 -1
  991. package/corpus/templates/videos/public/robots.txt +0 -14
  992. package/corpus/templates/videos/react-router.config.ts +0 -7
  993. package/corpus/templates/videos/server/db/index.ts +0 -37
  994. package/corpus/templates/videos/server/db/schema.ts +0 -55
  995. package/corpus/templates/videos/server/middleware/auth.ts +0 -15
  996. package/corpus/templates/videos/server/plugins/agent-chat.ts +0 -29
  997. package/corpus/templates/videos/server/plugins/auth.ts +0 -14
  998. package/corpus/templates/videos/server/plugins/collab.ts +0 -11
  999. package/corpus/templates/videos/server/plugins/core-routes.ts +0 -22
  1000. package/corpus/templates/videos/server/plugins/db.ts +0 -160
  1001. package/corpus/templates/videos/server/routes/[...page].get.ts +0 -5
  1002. package/corpus/templates/videos/server/routes/[...page].head.ts +0 -1
  1003. package/corpus/templates/videos/server/routes/api/save-composition-defaults.post.ts +0 -274
  1004. package/corpus/templates/videos/shared/api.ts +0 -75
  1005. package/corpus/templates/videos/ssr-entry.ts +0 -15
  1006. package/corpus/templates/videos/tsconfig.json +0 -21
  1007. package/corpus/templates/videos/vite.config.ts +0 -19
  1008. package/corpus/templates/videos/vitest.config.ts +0 -16
  1009. package/docs/content/locales/ar-SA/template-videos.mdx +0 -336
  1010. package/docs/content/locales/de-DE/template-videos.mdx +0 -336
  1011. package/docs/content/locales/es-ES/template-videos.mdx +0 -336
  1012. package/docs/content/locales/fr-FR/template-videos.mdx +0 -336
  1013. package/docs/content/locales/hi-IN/template-videos.mdx +0 -336
  1014. package/docs/content/locales/ja-JP/template-videos.mdx +0 -336
  1015. package/docs/content/locales/ko-KR/template-videos.mdx +0 -336
  1016. package/docs/content/locales/pt-BR/template-videos.mdx +0 -336
  1017. package/docs/content/locales/zh-CN/template-videos.mdx +0 -334
  1018. package/docs/content/locales/zh-TW/template-videos.mdx +0 -334
  1019. package/docs/content/template-videos.mdx +0 -332
@@ -249,34 +249,97 @@ type PatchDeckOp =
249
249
  Concurrent edits to different slides both succeed at the action level; there
250
250
  is no whole-deck LWW. Forms use the same shape with field-level ops.
251
251
 
252
- ## Collaborative Undo Scoping (Y.UndoManager)
252
+ ## Agent Presence & Lingering Edit Highlights
253
+
254
+ The agent is a *visible* collaborator, not a silent content-swapper. Core
255
+ handles most of this automatically:
256
+
257
+ - **Auto-presence on agent writes** — any `applyText` / `searchAndReplace` /
258
+ `applyJson` / `applyPatchOps` call with `requestSource: "agent"` publishes
259
+ an agent awareness entry plus a `recentEdits` attribution describing what
260
+ changed. Actions that route writes through the collab layer get full
261
+ presence UX with zero extra wiring.
262
+ - **Linger** — `agentLeaveDocument` (and the auto-presence path) keeps the
263
+ agent's awareness entry alive for ~6s (`AGENT_PRESENCE_LINGER_MS`) after the
264
+ last edit so viewers see who just changed what. Pass `{ lingerMs: 0 }` to
265
+ clear immediately. On serverless the linger degrades to the 30s awareness
266
+ expiry.
267
+ - **`agentTouchDocument(docId, { edit, metadata })`** — refcount-neutral
268
+ presence + attribution for actions that write SQL directly (no collab doc).
269
+ `edit.descriptor` is one of `{kind:"text",quote}`, `{kind:"selector",selector}`,
270
+ `{kind:"paths",paths}`, `{kind:"doc"}`.
271
+ - **Durable across instances** — awareness is mirrored to the additive
272
+ `_collab_awareness` table, so presence written by an action in one
273
+ serverless invocation is visible to clients polling any other instance.
274
+
275
+ Client rendering:
276
+
277
+ ```tsx
278
+ import {
279
+ usePresence, useRecentEdits, RecentEditHighlights,
280
+ PresenceBar, LiveCursorOverlay, RemoteSelectionRings,
281
+ } from "@agent-native/core/client";
282
+
283
+ const { others, setPresence } = usePresence(awareness, ydoc?.clientID);
284
+ const recentEdits = useRecentEdits(others); // non-expired, ~6s TTL
285
+
286
+ <RecentEditHighlights
287
+ edits={recentEdits}
288
+ containerRef={containerRef}
289
+ resolveRect={(edit) => /* map descriptor → DOMRect, or null */ null}
290
+ />
291
+ ```
292
+
293
+ Humans get the same treatment: call `publishRecentEdit(awareness, { descriptor })`
294
+ from local mutation paths so peers see lingering highlights for human edits
295
+ too. `CollabUser.avatarUrl` puts faces on avatars, cursors, and edit tags.
296
+
297
+ ## Per-User Undo (never revert someone else's work)
253
298
 
254
- Scope undo/redo to the local user's own edits so peer and agent changes are
255
- never accidentally reversed:
299
+ Undo must only reverse the local user's edits and must never restore a
300
+ whole-document snapshot (that clobbers concurrent edits by peers/the agent).
301
+ Core ships two primitives:
302
+
303
+ **Yjs surfaces — `useCollabUndo`** (wraps `Y.UndoManager` lifecycle):
256
304
 
257
305
  ```ts
258
- import * as Y from "yjs";
306
+ import { useCollabUndo } from "@agent-native/core/client";
307
+
308
+ const { undo, redo, canUndo, canRedo, transactLocal, localOrigin } =
309
+ useCollabUndo({
310
+ ydoc,
311
+ scope: (doc) => doc.getText("content"),
312
+ captureTimeout: 500,
313
+ enableKeyboardShortcuts: true, // Mod+Z / Shift+Mod+Z / Mod+Y
314
+ });
259
315
 
260
- const LOCAL_EDIT_ORIGIN = "local";
316
+ // Tag every local mutation so it is captured:
317
+ transactLocal(() => { /* mutate shared types */ });
318
+ ```
261
319
 
262
- const undoManager = new Y.UndoManager(ydoc.getText("content"), {
263
- trackedOrigins: new Set([LOCAL_EDIT_ORIGIN]),
264
- captureTimeout: 800, // coalesces rapid slider drags into one undo step
265
- });
320
+ Remote (`"remote"`) and agent (`"agent"`/`"server"`) origins are never
321
+ captured. The manager is recreated/destroyed automatically when `ydoc`
322
+ changes. (TipTap's Collaboration extension already provides this behavior
323
+ for its own editor content.)
266
324
 
267
- // Mark local edits with the tracked origin
268
- ydoc.transact(() => {
269
- // apply local change
270
- }, LOCAL_EDIT_ORIGIN);
325
+ **Op-based surfaces (slides/forms) `useLocalOpUndo`**: record inverse
326
+ granular ops for each local mutation; undo replays the inverse ops through
327
+ your normal granular mutation path:
271
328
 
272
- undoManager.undo(); // only reverses LOCAL_EDIT_ORIGIN transactions
273
- undoManager.redo();
329
+ ```ts
330
+ const { push, undo, redo, canUndo, canRedo } = useLocalOpUndo({
331
+ apply: (ops) => applyGranularOps(ops), // your patch path
332
+ });
333
+
334
+ push({
335
+ undo: [{ type: "patch", slideId, fields: prevFields }],
336
+ redo: [{ type: "patch", slideId, fields: nextFields }],
337
+ coalesceKey: `${slideId}:content`, // merge rapid bursts into one step
338
+ });
274
339
  ```
275
340
 
276
- Rules:
277
- - Pass a `Set` to `trackedOrigins` not an array.
278
- - Remote (`"remote"`) and agent (`"agent"`) origins are never captured.
279
- - Recreate and destroy the manager when the active document changes.
341
+ Entries whose target no longer exists should fail soft (skip), never reset
342
+ the whole history external/agent edits must not wipe the user's undo stack.
280
343
 
281
344
  ## Common Pitfalls
282
345
 
@@ -58,6 +58,21 @@ The agent modifies data in SQL, but the UI runs in the browser. SSE bridges same
58
58
 
59
59
  - Don't create manual polling loops — `useDbSync()` handles SSE plus fallback polling
60
60
  - Don't create your own fetch-based polling alongside `useDbSync` — use the `onEvent` callback for custom handling
61
+ - Don't open your own `EventSource` to `/_agent-native/events`. A tab must hold exactly ONE SSE connection no matter how many features listen — extra streams eat the browser's per-origin connection budget and can starve ordinary data fetches (worst on HTTP/1.1 dev servers). Subscribe to the shared transport instead:
62
+
63
+ ```ts
64
+ import { subscribeSyncEvents } from "@agent-native/core/client";
65
+
66
+ const unsubscribe = subscribeSyncEvents({
67
+ onEvents: (events) => {
68
+ // filter by event.source and handle push-style updates
69
+ },
70
+ // Optional: relax your own fallback cadence while push is healthy.
71
+ onSseStateChange: (connected) => {},
72
+ });
73
+ ```
74
+
75
+ `useDbSync` and every `subscribeSyncEvents` subscriber share one `EventSource` and one fallback poll loop per tab — this is how collaborative documents receive doc updates and cursor/awareness events.
61
76
 
62
77
  ## Which sources to depend on
63
78
 
@@ -25,6 +25,14 @@ Agent-native apps use Drizzle ORM over the configured SQL backend. Local develop
25
25
 
26
26
  For app code, use Drizzle's schema/query DSL by default. Raw SQL is an escape hatch for additive migrations, health checks, or one-off maintenance, not the normal way to build features.
27
27
 
28
+ ### Naming migrations
29
+
30
+ When you add an entry to a `runMigrations([...])` list (`@agent-native/core/db`), always give it a unique `name:` slug (e.g. `name: "analytics-alert-rules-table"`) alongside its `version`. Never renumber or reuse version numbers on existing entries.
31
+
32
+ Why: version numbers alone are not a safe identity. Two branches that each independently extend the same migration list can ship different DDL under the same version numbers — whichever branch deploys first "claims" those version numbers in the bookkeeping table, and the other branch's DDL is silently treated as already applied even though it never ran. This exact collision took down analytics: parallel branches both extended their migration list through v75-v83 with different DDL, so `analytics_alert_rules`, `analytics_alert_incidents`, and `session_recordings.network_error_count` never made it to production despite the bookkeeping table showing every version as applied. A `name:` slug is tracked independently of version numbers, so it applies exactly once per database regardless of what any other branch already recorded.
33
+
34
+ Existing unnamed migrations don't need to be renamed retroactively (the two gating strategies coexist), but any new entry should always carry a name.
35
+
28
36
  ### Core SQL Stores (auto-created, available in all templates)
29
37
 
30
38
  | Store | Purpose | Access |
@@ -23,8 +23,8 @@
23
23
  "zod": "^4.4.3"
24
24
  },
25
25
  "devDependencies": {
26
- "@react-router/dev": "^8.0.1",
27
- "@react-router/fs-routes": "^8.0.1",
26
+ "@react-router/dev": "^8.1.0",
27
+ "@react-router/fs-routes": "^8.1.0",
28
28
  "@tailwindcss/typography": "^0.5.20",
29
29
  "@tailwindcss/vite": "^4.1.18",
30
30
  "@tanstack/react-query": "^5.99.2",
@@ -38,7 +38,7 @@
38
38
  "oxfmt": "catalog:",
39
39
  "react": "catalog:",
40
40
  "react-dom": "catalog:",
41
- "react-router": "^8.0.1",
41
+ "react-router": "^8.1.0",
42
42
  "sonner": "^2.0.7",
43
43
  "tailwind-merge": "^3.5.0",
44
44
  "tailwindcss": "^4.1.18",
@@ -36,8 +36,16 @@ method gives the UI, docs, and future agents one stable contract.
36
36
  | Agent chat context | Agent chat client helpers from `@agent-native/core/client` |
37
37
  | Ask the user a multiple-choice question from app code | `askUserQuestion` from `@agent-native/core/client` (renders inline in the agent panel; answer goes to the agent — do not build a custom modal) |
38
38
  | Live sync | `useDbSync`, `useChangeVersion`, `useChangeVersions` |
39
+ | Listen to the shared SSE/poll change stream | `subscribeSyncEvents` from `@agent-native/core/client` — never open a second `EventSource` to `/_agent-native/events` |
39
40
  | Extension iframe calls | `appAction`, `appFetch`, `extensionFetch` from the extension runtime |
40
41
 
42
+ Action fetch behavior: every `useActionQuery` / `useActionMutation` /
43
+ `callAction` request is bounded by a 60s timeout, and timeouts surface as
44
+ errors instead of retrying silently. `useActionQuery` cancels superseded
45
+ requests automatically via React Query's abort signal. For imperative
46
+ calls, `callAction(name, params, { method, signal, timeoutMs })` accepts an
47
+ `AbortSignal` and a `timeoutMs` override for legitimately long operations.
48
+
41
49
  2. If no client API exists, add the narrowest helper at the boundary.
42
50
 
43
51
  - Put shared framework helpers in `packages/core/src/client/*`.
@@ -232,3 +232,25 @@ This layer is optional and **no-op by default**:
232
232
  - Even with the api package installed, it ships a default no-op tracer. Spans become real only once the **host registers a `TracerProvider`** (via `@opentelemetry/sdk-node` or similar). The framework deliberately does not depend on the heavy SDK/exporter packages and never registers a provider itself — instrumentation is opt-in by the embedding app.
233
233
 
234
234
  The loop emits `agent.run` (with `agent.run_id`, `agent.thread_id`, `agent.user_id`, `agent.model`), `tool.call` (`tool.name` + status), and `llm.call` spans, each finished with OK/ERROR status. This is purely additive to the in-house `agent_trace_spans` / `agent_trace_summaries` tables. Source: `packages/core/src/observability/tracing.ts` + `traces.ts`. See the Observability doc for the full table.
235
+
236
+ ## Tracking Bridge
237
+
238
+ Instrumented agent loops also emit one server-side tracking event per completed
239
+ LLM generation:
240
+
241
+ - Event name: `$ai_generation`
242
+ - Provider path: `track()` from `@agent-native/core/tracking`, so configured
243
+ PostHog, Agent Native Analytics, Mixpanel, Amplitude, and webhook providers
244
+ receive it through the same best-effort fan-out as other tracking events.
245
+ - PostHog shape: uses AI Observability properties such as `$ai_trace_id`,
246
+ `$ai_session_id`, `$ai_model`, `$ai_provider`, `$ai_input_tokens`,
247
+ `$ai_output_tokens`, `$ai_latency`, `$ai_total_cost_usd`, and `$ai_is_error`.
248
+ - Agent Native Analytics shape: the same event lands in `analytics_events` with
249
+ mirrored query-friendly properties such as `run_id`, `thread_id`,
250
+ `cost_cents_x100`, `duration_ms`, `tool_calls`, `successful_tools`,
251
+ `failed_tools`, and `status`.
252
+
253
+ Do not build a separate LLM-observability ingestion API unless there is a clear
254
+ reason the tracking provider registry cannot express the use case. Keep prompt,
255
+ tool input, and model output content out of tracking by default; use the existing
256
+ observability config flags for local trace content capture.
@@ -249,34 +249,97 @@ type PatchDeckOp =
249
249
  Concurrent edits to different slides both succeed at the action level; there
250
250
  is no whole-deck LWW. Forms use the same shape with field-level ops.
251
251
 
252
- ## Collaborative Undo Scoping (Y.UndoManager)
252
+ ## Agent Presence & Lingering Edit Highlights
253
+
254
+ The agent is a *visible* collaborator, not a silent content-swapper. Core
255
+ handles most of this automatically:
256
+
257
+ - **Auto-presence on agent writes** — any `applyText` / `searchAndReplace` /
258
+ `applyJson` / `applyPatchOps` call with `requestSource: "agent"` publishes
259
+ an agent awareness entry plus a `recentEdits` attribution describing what
260
+ changed. Actions that route writes through the collab layer get full
261
+ presence UX with zero extra wiring.
262
+ - **Linger** — `agentLeaveDocument` (and the auto-presence path) keeps the
263
+ agent's awareness entry alive for ~6s (`AGENT_PRESENCE_LINGER_MS`) after the
264
+ last edit so viewers see who just changed what. Pass `{ lingerMs: 0 }` to
265
+ clear immediately. On serverless the linger degrades to the 30s awareness
266
+ expiry.
267
+ - **`agentTouchDocument(docId, { edit, metadata })`** — refcount-neutral
268
+ presence + attribution for actions that write SQL directly (no collab doc).
269
+ `edit.descriptor` is one of `{kind:"text",quote}`, `{kind:"selector",selector}`,
270
+ `{kind:"paths",paths}`, `{kind:"doc"}`.
271
+ - **Durable across instances** — awareness is mirrored to the additive
272
+ `_collab_awareness` table, so presence written by an action in one
273
+ serverless invocation is visible to clients polling any other instance.
274
+
275
+ Client rendering:
276
+
277
+ ```tsx
278
+ import {
279
+ usePresence, useRecentEdits, RecentEditHighlights,
280
+ PresenceBar, LiveCursorOverlay, RemoteSelectionRings,
281
+ } from "@agent-native/core/client";
282
+
283
+ const { others, setPresence } = usePresence(awareness, ydoc?.clientID);
284
+ const recentEdits = useRecentEdits(others); // non-expired, ~6s TTL
285
+
286
+ <RecentEditHighlights
287
+ edits={recentEdits}
288
+ containerRef={containerRef}
289
+ resolveRect={(edit) => /* map descriptor → DOMRect, or null */ null}
290
+ />
291
+ ```
292
+
293
+ Humans get the same treatment: call `publishRecentEdit(awareness, { descriptor })`
294
+ from local mutation paths so peers see lingering highlights for human edits
295
+ too. `CollabUser.avatarUrl` puts faces on avatars, cursors, and edit tags.
296
+
297
+ ## Per-User Undo (never revert someone else's work)
253
298
 
254
- Scope undo/redo to the local user's own edits so peer and agent changes are
255
- never accidentally reversed:
299
+ Undo must only reverse the local user's edits and must never restore a
300
+ whole-document snapshot (that clobbers concurrent edits by peers/the agent).
301
+ Core ships two primitives:
302
+
303
+ **Yjs surfaces — `useCollabUndo`** (wraps `Y.UndoManager` lifecycle):
256
304
 
257
305
  ```ts
258
- import * as Y from "yjs";
306
+ import { useCollabUndo } from "@agent-native/core/client";
307
+
308
+ const { undo, redo, canUndo, canRedo, transactLocal, localOrigin } =
309
+ useCollabUndo({
310
+ ydoc,
311
+ scope: (doc) => doc.getText("content"),
312
+ captureTimeout: 500,
313
+ enableKeyboardShortcuts: true, // Mod+Z / Shift+Mod+Z / Mod+Y
314
+ });
259
315
 
260
- const LOCAL_EDIT_ORIGIN = "local";
316
+ // Tag every local mutation so it is captured:
317
+ transactLocal(() => { /* mutate shared types */ });
318
+ ```
261
319
 
262
- const undoManager = new Y.UndoManager(ydoc.getText("content"), {
263
- trackedOrigins: new Set([LOCAL_EDIT_ORIGIN]),
264
- captureTimeout: 800, // coalesces rapid slider drags into one undo step
265
- });
320
+ Remote (`"remote"`) and agent (`"agent"`/`"server"`) origins are never
321
+ captured. The manager is recreated/destroyed automatically when `ydoc`
322
+ changes. (TipTap's Collaboration extension already provides this behavior
323
+ for its own editor content.)
266
324
 
267
- // Mark local edits with the tracked origin
268
- ydoc.transact(() => {
269
- // apply local change
270
- }, LOCAL_EDIT_ORIGIN);
325
+ **Op-based surfaces (slides/forms) `useLocalOpUndo`**: record inverse
326
+ granular ops for each local mutation; undo replays the inverse ops through
327
+ your normal granular mutation path:
271
328
 
272
- undoManager.undo(); // only reverses LOCAL_EDIT_ORIGIN transactions
273
- undoManager.redo();
329
+ ```ts
330
+ const { push, undo, redo, canUndo, canRedo } = useLocalOpUndo({
331
+ apply: (ops) => applyGranularOps(ops), // your patch path
332
+ });
333
+
334
+ push({
335
+ undo: [{ type: "patch", slideId, fields: prevFields }],
336
+ redo: [{ type: "patch", slideId, fields: nextFields }],
337
+ coalesceKey: `${slideId}:content`, // merge rapid bursts into one step
338
+ });
274
339
  ```
275
340
 
276
- Rules:
277
- - Pass a `Set` to `trackedOrigins` not an array.
278
- - Remote (`"remote"`) and agent (`"agent"`) origins are never captured.
279
- - Recreate and destroy the manager when the active document changes.
341
+ Entries whose target no longer exists should fail soft (skip), never reset
342
+ the whole history external/agent edits must not wipe the user's undo stack.
280
343
 
281
344
  ## Common Pitfalls
282
345
 
@@ -58,6 +58,21 @@ The agent modifies data in SQL, but the UI runs in the browser. SSE bridges same
58
58
 
59
59
  - Don't create manual polling loops — `useDbSync()` handles SSE plus fallback polling
60
60
  - Don't create your own fetch-based polling alongside `useDbSync` — use the `onEvent` callback for custom handling
61
+ - Don't open your own `EventSource` to `/_agent-native/events`. A tab must hold exactly ONE SSE connection no matter how many features listen — extra streams eat the browser's per-origin connection budget and can starve ordinary data fetches (worst on HTTP/1.1 dev servers). Subscribe to the shared transport instead:
62
+
63
+ ```ts
64
+ import { subscribeSyncEvents } from "@agent-native/core/client";
65
+
66
+ const unsubscribe = subscribeSyncEvents({
67
+ onEvents: (events) => {
68
+ // filter by event.source and handle push-style updates
69
+ },
70
+ // Optional: relax your own fallback cadence while push is healthy.
71
+ onSseStateChange: (connected) => {},
72
+ });
73
+ ```
74
+
75
+ `useDbSync` and every `subscribeSyncEvents` subscriber share one `EventSource` and one fallback poll loop per tab — this is how collaborative documents receive doc updates and cursor/awareness events.
61
76
 
62
77
  ## Which sources to depend on
63
78
 
@@ -25,6 +25,14 @@ Agent-native apps use Drizzle ORM over the configured SQL backend. Local develop
25
25
 
26
26
  For app code, use Drizzle's schema/query DSL by default. Raw SQL is an escape hatch for additive migrations, health checks, or one-off maintenance, not the normal way to build features.
27
27
 
28
+ ### Naming migrations
29
+
30
+ When you add an entry to a `runMigrations([...])` list (`@agent-native/core/db`), always give it a unique `name:` slug (e.g. `name: "analytics-alert-rules-table"`) alongside its `version`. Never renumber or reuse version numbers on existing entries.
31
+
32
+ Why: version numbers alone are not a safe identity. Two branches that each independently extend the same migration list can ship different DDL under the same version numbers — whichever branch deploys first "claims" those version numbers in the bookkeeping table, and the other branch's DDL is silently treated as already applied even though it never ran. This exact collision took down analytics: parallel branches both extended their migration list through v75-v83 with different DDL, so `analytics_alert_rules`, `analytics_alert_incidents`, and `session_recordings.network_error_count` never made it to production despite the bookkeeping table showing every version as applied. A `name:` slug is tracked independently of version numbers, so it applies exactly once per database regardless of what any other branch already recorded.
33
+
34
+ Existing unnamed migrations don't need to be renamed retroactively (the two gating strategies coexist), but any new entry should always carry a name.
35
+
28
36
  ### Core SQL Stores (auto-created, available in all templates)
29
37
 
30
38
  | Store | Purpose | Access |
@@ -141,6 +141,7 @@ Other framework-level baseline events:
141
141
  - `signup` from Better Auth user creation, with `auth_provider`, `auth_user_id`, and first-touch referral attribution (`referral_source`, `referrer_user`, `referral_medium`, `referral_campaign`, `utm_*`, `first_touch_path`, `landing_referrer` — see "Referral / viral attribution" above)
142
142
  - `builder connect clicked` and `builder connect popup blocked` from browser Connect Builder CTAs
143
143
  - `builder connect started`, `builder connect succeeded`, `builder connect failed`, `builder disconnect succeeded`, and `builder disconnect failed` from the Builder connection routes, with LLM connection context when resolvable
144
+ - `$ai_generation` from instrumented agent loops, with PostHog AI Observability fields such as `$ai_trace_id`, `$ai_session_id`, `$ai_model`, `$ai_provider`, `$ai_input_tokens`, `$ai_output_tokens`, `$ai_latency`, `$ai_total_cost_usd`, and mirrored Agent Native query fields such as `run_id`, `thread_id`, `cost_cents_x100`, `duration_ms`, `tool_calls`, and `status`. Prompt, tool argument, and output content is not included by default.
144
145
 
145
146
  For new lifecycle events, call `track()` server-side when the server is the source of truth, and `trackEvent()` client-side only for browser interactions.
146
147
 
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/tracking/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAuTH,wBAAgB,wBAAwB,IAAI,IAAI,CA6C/C"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/tracking/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA4UH,wBAAgB,wBAAwB,IAAI,IAAI,CA6C/C"}
@@ -100,14 +100,30 @@ function shouldSkipAgentNativeAnalyticsForLocalhost() {
100
100
  ].some(isLocalhostUrl);
101
101
  }
102
102
  // ─── PostHog ───────────────────────────────────────────────────────────────
103
+ function isPostHogAiObservabilityEvent(eventName) {
104
+ return eventName.startsWith("$ai_");
105
+ }
103
106
  function createPostHogProvider(apiKey, host) {
104
107
  return {
105
108
  name: "posthog",
106
109
  track(event) {
110
+ const distinctId = event.userId || "anonymous";
111
+ if (isPostHogAiObservabilityEvent(event.name)) {
112
+ enqueue(`${host}/i/v0/e/`, JSON.stringify({
113
+ api_key: apiKey,
114
+ event: event.name,
115
+ properties: {
116
+ distinct_id: distinctId,
117
+ ...event.properties,
118
+ timestamp: event.timestamp,
119
+ },
120
+ }));
121
+ return;
122
+ }
107
123
  enqueue(`${host}/capture/`, JSON.stringify({
108
124
  api_key: apiKey,
109
125
  event: event.name,
110
- distinct_id: event.userId || "anonymous",
126
+ distinct_id: distinctId,
111
127
  properties: {
112
128
  ...event.properties,
113
129
  timestamp: event.timestamp,
@@ -1 +1 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/tracking/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAGzD,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AACxD,MAAM,uCAAuC,GAC3C,0CAA0C,CAAC;AAC7C,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,MAAM,cAAc,GAAG,EAAE,CAAC;AAU1B,6EAA6E;AAC7E,uEAAuE;AACvE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AAClE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AAOlE,SAAS,QAAQ;IACf,MAAM,CAAC,GAAG,UAAwC,CAAC;IACnD,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAAE,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;IACrC,OAAO,CAAC,CAAC,SAAS,CAAE,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,CAAC,GAAG,UAAwC,CAAC;IACnD,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,SAAS,QAAQ,CAAC,CAAuC;IACtD,UAAyC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,OAAO,CACd,GAAW,EACX,IAAY,EACZ,OAAgC;IAEhC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;QACnC,KAAK,UAAU,EAAE,CAAC;IACpB,CAAC;SAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,UAAU,EAAE,CAAC;QACpB,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,CAAC;QACN,YAAY,CAAC,CAAC,CAAC,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjB,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;QACd,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC,IAAI,CACL,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CACF,CACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,YAAY,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC;QACvD,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjC,OAAO,CACL,CAAC,KAAK,WAAW;YACjB,CAAC,KAAK,WAAW;YACjB,CAAC,KAAK,KAAK;YACX,CAAC,KAAK,OAAO;YACb,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;YACxB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACrB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,0CAA0C;IACjD,IAAI,OAAO,CAAC,GAAG,CAAC,sCAAsC,KAAK,MAAM,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO;QACL,OAAO,CAAC,GAAG,CAAC,OAAO;QACnB,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,OAAO,CAAC,GAAG,CAAC,GAAG;QACf,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,6BAA6B;QACzC,OAAO,CAAC,GAAG,CAAC,UAAU;KACvB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACzB,CAAC;AAED,8EAA8E;AAE9E,SAAS,qBAAqB,CAAC,MAAc,EAAE,IAAY;IACzD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,KAAK,CAAC,KAAoB;YACxB,OAAO,CACL,GAAG,IAAI,WAAW,EAClB,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,WAAW,EAAE,KAAK,CAAC,MAAM,IAAI,WAAW;gBACxC,UAAU,EAAE;oBACV,GAAG,KAAK,CAAC,UAAU;oBACnB,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B;aACF,CAAC,CACH,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,MAAM,EAAE,MAAM;YACrB,OAAO,CACL,GAAG,IAAI,WAAW,EAClB,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,WAAW;gBAClB,WAAW,EAAE,MAAM;gBACnB,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;aAC7B,CAAC,CACH,CAAC;QACJ,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,OAAO,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,SAAS,sBAAsB,CAAC,KAAa;IAC3C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,KAAK,CAAC,KAAoB;YACxB,MAAM,IAAI,GAAG;gBACX,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,UAAU,EAAE;oBACV,KAAK;oBACL,WAAW,EAAE,KAAK,CAAC,MAAM,IAAI,WAAW;oBACxC,IAAI,EAAE,KAAK,CAAC,SAAS;wBACnB,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI;wBAC5C,CAAC,CAAC,SAAS;oBACb,GAAG,KAAK,CAAC,UAAU;iBACpB;aACF,CAAC;YACF,OAAO,CAAC,gCAAgC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,QAAQ,CAAC,MAAM,EAAE,MAAM;YACrB,MAAM,IAAI,GAAG;gBACX,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,MAAM;gBACpB,IAAI,EAAE,MAAM;aACb,CAAC;YACF,OAAO,CAAC,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,OAAO,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,SAAS,uBAAuB,CAAC,MAAc;IAC7C,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,KAAK,CAAC,KAAoB;YACxB,MAAM,IAAI,GAAG;gBACX,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE;oBACN;wBACE,UAAU,EAAE,KAAK,CAAC,IAAI;wBACtB,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,WAAW;wBACpC,gBAAgB,EAAE,KAAK,CAAC,UAAU;wBAClC,IAAI,EAAE,KAAK,CAAC,SAAS;4BACnB,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;4BACrC,CAAC,CAAC,SAAS;qBACd;iBACF;aACF,CAAC;YACF,OAAO,CAAC,sCAAsC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,QAAQ,CAAC,MAAM,EAAE,MAAM;YACrB,MAAM,IAAI,GAAG;gBACX,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE;oBACN;wBACE,UAAU,EAAE,WAAW;wBACvB,OAAO,EAAE,MAAM;wBACf,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;qBAClC;iBACF;aACF,CAAC;YACF,OAAO,CAAC,sCAAsC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,OAAO,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAE7E,SAAS,qBAAqB,CAC5B,GAAW,EACX,UAAmB;IAEnB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,OAAO;QACL,IAAI,EAAE,SAAS;QACf,KAAK,CAAC,KAAoB;YACxB,OAAO,CACL,GAAG,EACH,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC,EACF,KAAK,CACN,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,MAAM,EAAE,MAAM;YACrB,OAAO,CACL,GAAG,EACH,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,WAAW;gBAClB,MAAM;gBACN,MAAM;gBACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,EACF,KAAK,CACN,CAAC;QACJ,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,OAAO,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAE7E,SAAS,kCAAkC,CACzC,SAAiB,EACjB,QAAgB;IAEhB,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,KAAK,CAAC,KAAoB;YACxB,OAAO,CACL,QAAQ,EACR,IAAI,CAAC,SAAS,CAAC;gBACb,SAAS;gBACT,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;gBAClC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC,CACH,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,MAAM,EAAE,MAAM;YACrB,OAAO,CACL,QAAQ,EACR,IAAI,CAAC,SAAS,CAAC;gBACb,SAAS;gBACT,KAAK,EAAE,WAAW;gBAClB,MAAM;gBACN,UAAU,EAAE,MAAM,IAAI,EAAE;gBACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,OAAO,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAE7E,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,UAAU,wBAAwB;IACtC,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IAEnB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC/C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,oBAAoB,CAAC,CAAC,OAAO,CACrE,MAAM,EACN,EAAE,CACH,CAAC;QACF,wBAAwB,CAAC,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACjD,IAAI,aAAa,EAAE,CAAC;QAClB,wBAAwB,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACnD,IAAI,YAAY,EAAE,CAAC;QACjB,wBAAwB,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,uBAAuB,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC;IAC9E,IACE,uBAAuB;QACvB,CAAC,0CAA0C,EAAE,EAC7C,CAAC;QACD,wBAAwB,CACtB,kCAAkC,CAChC,uBAAuB,EACvB,CACE,OAAO,CAAC,GAAG,CAAC,+BAA+B;YAC3C,uCAAuC,CACxC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CACtB,CACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACpD,IAAI,UAAU,EAAE,CAAC;QACf,wBAAwB,CACtB,qBAAqB,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CACrE,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["/**\n * Built-in tracking providers that auto-register from env vars.\n *\n * No SDK dependencies — uses raw HTTP to keep core lightweight.\n * Set the env var and tracking starts automatically.\n *\n * POSTHOG_API_KEY + POSTHOG_HOST → PostHog\n * MIXPANEL_TOKEN → Mixpanel\n * AMPLITUDE_API_KEY → Amplitude\n * AGENT_NATIVE_ANALYTICS_PUBLIC_KEY → Agent Native Analytics\n *\n * Call `registerBuiltinProviders()` at server startup (done\n * automatically by the core-routes plugin).\n */\n\nimport { registerTrackingProvider } from \"./registry.js\";\nimport type { TrackingProvider, TrackingEvent } from \"./types.js\";\n\nconst POSTHOG_DEFAULT_HOST = \"https://us.i.posthog.com\";\nconst AGENT_NATIVE_ANALYTICS_DEFAULT_ENDPOINT =\n \"https://analytics.agent-native.com/track\";\nconst BATCH_INTERVAL_MS = 10_000;\nconst MAX_BATCH_SIZE = 50;\n\n// ─── Batched sender ────────────────────────────────────────────────────────\n\ninterface QueuedEvent {\n url: string;\n body: string;\n headers?: Record<string, string>;\n}\n\n// Use globalThis so multiple ESM graph instances (Vite dev + Nitro symlinks)\n// share one queue, matching the same pattern as the tracking registry.\nconst QUEUE_KEY = Symbol.for(\"@agent-native/core/tracking.queue\");\nconst TIMER_KEY = Symbol.for(\"@agent-native/core/tracking.timer\");\n\ninterface GlobalWithQueue {\n [QUEUE_KEY]?: QueuedEvent[];\n [TIMER_KEY]?: ReturnType<typeof setTimeout> | null;\n}\n\nfunction getQueue(): QueuedEvent[] {\n const g = globalThis as unknown as GlobalWithQueue;\n if (!g[QUEUE_KEY]) g[QUEUE_KEY] = [];\n return g[QUEUE_KEY]!;\n}\n\nfunction getTimer(): ReturnType<typeof setTimeout> | null {\n const g = globalThis as unknown as GlobalWithQueue;\n return g[TIMER_KEY] ?? null;\n}\n\nfunction setTimer(t: ReturnType<typeof setTimeout> | null): void {\n (globalThis as unknown as GlobalWithQueue)[TIMER_KEY] = t;\n}\n\nfunction enqueue(\n url: string,\n body: string,\n headers?: Record<string, string>,\n): void {\n const queue = getQueue();\n queue.push({ url, body, headers });\n if (queue.length >= MAX_BATCH_SIZE) {\n void drainQueue();\n } else if (!getTimer()) {\n const timer = setTimeout(() => {\n void drainQueue();\n }, BATCH_INTERVAL_MS);\n if (timer.unref) timer.unref();\n setTimer(timer);\n }\n}\n\nfunction drainQueue(): Promise<void[]> {\n const t = getTimer();\n if (t) {\n clearTimeout(t);\n setTimer(null);\n }\n const queue = getQueue();\n const batch = queue.splice(0, queue.length);\n return Promise.all(\n batch.map((item) =>\n fetch(item.url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...item.headers },\n body: item.body,\n }).then(\n () => undefined,\n () => undefined,\n ),\n ),\n );\n}\n\nfunction isLocalhostUrl(value: string | undefined): boolean {\n if (!value || !value.trim()) return false;\n const raw = value.trim();\n const withProtocol = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw)\n ? raw\n : `https://${raw}`;\n try {\n const { hostname } = new URL(withProtocol);\n const h = hostname.toLowerCase();\n return (\n h === \"localhost\" ||\n h === \"127.0.0.1\" ||\n h === \"::1\" ||\n h === \"[::1]\" ||\n h.endsWith(\".localhost\") ||\n h.endsWith(\".local\")\n );\n } catch {\n return false;\n }\n}\n\nfunction shouldSkipAgentNativeAnalyticsForLocalhost(): boolean {\n if (process.env.AGENT_NATIVE_ANALYTICS_ALLOW_LOCALHOST === \"true\") {\n return false;\n }\n if (process.env.NODE_ENV === \"development\") return true;\n return [\n process.env.APP_URL,\n process.env.BETTER_AUTH_URL,\n process.env.URL,\n process.env.DEPLOY_URL,\n process.env.VERCEL_PROJECT_PRODUCTION_URL,\n process.env.VERCEL_URL,\n ].some(isLocalhostUrl);\n}\n\n// ─── PostHog ───────────────────────────────────────────────────────────────\n\nfunction createPostHogProvider(apiKey: string, host: string): TrackingProvider {\n return {\n name: \"posthog\",\n track(event: TrackingEvent) {\n enqueue(\n `${host}/capture/`,\n JSON.stringify({\n api_key: apiKey,\n event: event.name,\n distinct_id: event.userId || \"anonymous\",\n properties: {\n ...event.properties,\n timestamp: event.timestamp,\n },\n }),\n );\n },\n identify(userId, traits) {\n enqueue(\n `${host}/capture/`,\n JSON.stringify({\n api_key: apiKey,\n event: \"$identify\",\n distinct_id: userId,\n properties: { $set: traits },\n }),\n );\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Mixpanel ──────────────────────────────────────────────────────────────\n\nfunction createMixpanelProvider(token: string): TrackingProvider {\n return {\n name: \"mixpanel\",\n track(event: TrackingEvent) {\n const data = {\n event: event.name,\n properties: {\n token,\n distinct_id: event.userId || \"anonymous\",\n time: event.timestamp\n ? new Date(event.timestamp).getTime() / 1000\n : undefined,\n ...event.properties,\n },\n };\n enqueue(\"https://api.mixpanel.com/track\", JSON.stringify([data]));\n },\n identify(userId, traits) {\n const data = {\n $token: token,\n $distinct_id: userId,\n $set: traits,\n };\n enqueue(\"https://api.mixpanel.com/engage\", JSON.stringify([data]));\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Amplitude ─────────────────────────────────────────────────────────────\n\nfunction createAmplitudeProvider(apiKey: string): TrackingProvider {\n return {\n name: \"amplitude\",\n track(event: TrackingEvent) {\n const data = {\n api_key: apiKey,\n events: [\n {\n event_type: event.name,\n user_id: event.userId || \"anonymous\",\n event_properties: event.properties,\n time: event.timestamp\n ? new Date(event.timestamp).getTime()\n : undefined,\n },\n ],\n };\n enqueue(\"https://api2.amplitude.com/2/httpapi\", JSON.stringify(data));\n },\n identify(userId, traits) {\n const data = {\n api_key: apiKey,\n events: [\n {\n event_type: \"$identify\",\n user_id: userId,\n user_properties: { $set: traits },\n },\n ],\n };\n enqueue(\"https://api2.amplitude.com/2/httpapi\", JSON.stringify(data));\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Webhook (custom HTTP endpoint) ───────────────────────────────────────\n\nfunction createWebhookProvider(\n url: string,\n authHeader?: string,\n): TrackingProvider {\n const extra = authHeader ? { Authorization: authHeader } : undefined;\n return {\n name: \"webhook\",\n track(event: TrackingEvent) {\n enqueue(\n url,\n JSON.stringify({\n event: event.name,\n properties: event.properties,\n userId: event.userId,\n timestamp: event.timestamp,\n }),\n extra,\n );\n },\n identify(userId, traits) {\n enqueue(\n url,\n JSON.stringify({\n event: \"$identify\",\n userId,\n traits,\n timestamp: new Date().toISOString(),\n }),\n extra,\n );\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Agent Native Analytics ───────────────────────────────────────────────\n\nfunction createAgentNativeAnalyticsProvider(\n publicKey: string,\n endpoint: string,\n): TrackingProvider {\n return {\n name: \"agent-native-analytics\",\n track(event: TrackingEvent) {\n enqueue(\n endpoint,\n JSON.stringify({\n publicKey,\n event: event.name,\n properties: event.properties ?? {},\n userId: event.userId,\n timestamp: event.timestamp,\n }),\n );\n },\n identify(userId, traits) {\n enqueue(\n endpoint,\n JSON.stringify({\n publicKey,\n event: \"$identify\",\n userId,\n properties: traits ?? {},\n timestamp: new Date().toISOString(),\n }),\n );\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Auto-registration ────────────────────────────────────────────────────\n\nlet _registered = false;\n\nexport function registerBuiltinProviders(): void {\n if (_registered) return;\n _registered = true;\n\n const posthogKey = process.env.POSTHOG_API_KEY;\n if (posthogKey) {\n const host = (process.env.POSTHOG_HOST || POSTHOG_DEFAULT_HOST).replace(\n /\\/+$/,\n \"\",\n );\n registerTrackingProvider(createPostHogProvider(posthogKey, host));\n }\n\n const mixpanelToken = process.env.MIXPANEL_TOKEN;\n if (mixpanelToken) {\n registerTrackingProvider(createMixpanelProvider(mixpanelToken));\n }\n\n const amplitudeKey = process.env.AMPLITUDE_API_KEY;\n if (amplitudeKey) {\n registerTrackingProvider(createAmplitudeProvider(amplitudeKey));\n }\n\n const agentNativeAnalyticsKey = process.env.AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (\n agentNativeAnalyticsKey &&\n !shouldSkipAgentNativeAnalyticsForLocalhost()\n ) {\n registerTrackingProvider(\n createAgentNativeAnalyticsProvider(\n agentNativeAnalyticsKey,\n (\n process.env.AGENT_NATIVE_ANALYTICS_ENDPOINT ||\n AGENT_NATIVE_ANALYTICS_DEFAULT_ENDPOINT\n ).replace(/\\/+$/, \"\"),\n ),\n );\n }\n\n const webhookUrl = process.env.TRACKING_WEBHOOK_URL;\n if (webhookUrl) {\n registerTrackingProvider(\n createWebhookProvider(webhookUrl, process.env.TRACKING_WEBHOOK_AUTH),\n );\n }\n}\n"]}
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/tracking/providers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Built-in tracking providers that auto-register from env vars.\n *\n * No SDK dependencies — uses raw HTTP to keep core lightweight.\n * Set the env var and tracking starts automatically.\n *\n * POSTHOG_API_KEY + POSTHOG_HOST → PostHog\n * MIXPANEL_TOKEN → Mixpanel\n * AMPLITUDE_API_KEY → Amplitude\n * AGENT_NATIVE_ANALYTICS_PUBLIC_KEY → Agent Native Analytics\n *\n * Call `registerBuiltinProviders()` at server startup (done\n * automatically by the core-routes plugin).\n */\n\nimport { registerTrackingProvider } from \"./registry.js\";\nimport type { TrackingProvider, TrackingEvent } from \"./types.js\";\n\nconst POSTHOG_DEFAULT_HOST = \"https://us.i.posthog.com\";\nconst AGENT_NATIVE_ANALYTICS_DEFAULT_ENDPOINT =\n \"https://analytics.agent-native.com/track\";\nconst BATCH_INTERVAL_MS = 10_000;\nconst MAX_BATCH_SIZE = 50;\n\n// ─── Batched sender ────────────────────────────────────────────────────────\n\ninterface QueuedEvent {\n url: string;\n body: string;\n headers?: Record<string, string>;\n}\n\n// Use globalThis so multiple ESM graph instances (Vite dev + Nitro symlinks)\n// share one queue, matching the same pattern as the tracking registry.\nconst QUEUE_KEY = Symbol.for(\"@agent-native/core/tracking.queue\");\nconst TIMER_KEY = Symbol.for(\"@agent-native/core/tracking.timer\");\n\ninterface GlobalWithQueue {\n [QUEUE_KEY]?: QueuedEvent[];\n [TIMER_KEY]?: ReturnType<typeof setTimeout> | null;\n}\n\nfunction getQueue(): QueuedEvent[] {\n const g = globalThis as unknown as GlobalWithQueue;\n if (!g[QUEUE_KEY]) g[QUEUE_KEY] = [];\n return g[QUEUE_KEY]!;\n}\n\nfunction getTimer(): ReturnType<typeof setTimeout> | null {\n const g = globalThis as unknown as GlobalWithQueue;\n return g[TIMER_KEY] ?? null;\n}\n\nfunction setTimer(t: ReturnType<typeof setTimeout> | null): void {\n (globalThis as unknown as GlobalWithQueue)[TIMER_KEY] = t;\n}\n\nfunction enqueue(\n url: string,\n body: string,\n headers?: Record<string, string>,\n): void {\n const queue = getQueue();\n queue.push({ url, body, headers });\n if (queue.length >= MAX_BATCH_SIZE) {\n void drainQueue();\n } else if (!getTimer()) {\n const timer = setTimeout(() => {\n void drainQueue();\n }, BATCH_INTERVAL_MS);\n if (timer.unref) timer.unref();\n setTimer(timer);\n }\n}\n\nfunction drainQueue(): Promise<void[]> {\n const t = getTimer();\n if (t) {\n clearTimeout(t);\n setTimer(null);\n }\n const queue = getQueue();\n const batch = queue.splice(0, queue.length);\n return Promise.all(\n batch.map((item) =>\n fetch(item.url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...item.headers },\n body: item.body,\n }).then(\n () => undefined,\n () => undefined,\n ),\n ),\n );\n}\n\nfunction isLocalhostUrl(value: string | undefined): boolean {\n if (!value || !value.trim()) return false;\n const raw = value.trim();\n const withProtocol = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw)\n ? raw\n : `https://${raw}`;\n try {\n const { hostname } = new URL(withProtocol);\n const h = hostname.toLowerCase();\n return (\n h === \"localhost\" ||\n h === \"127.0.0.1\" ||\n h === \"::1\" ||\n h === \"[::1]\" ||\n h.endsWith(\".localhost\") ||\n h.endsWith(\".local\")\n );\n } catch {\n return false;\n }\n}\n\nfunction shouldSkipAgentNativeAnalyticsForLocalhost(): boolean {\n if (process.env.AGENT_NATIVE_ANALYTICS_ALLOW_LOCALHOST === \"true\") {\n return false;\n }\n if (process.env.NODE_ENV === \"development\") return true;\n return [\n process.env.APP_URL,\n process.env.BETTER_AUTH_URL,\n process.env.URL,\n process.env.DEPLOY_URL,\n process.env.VERCEL_PROJECT_PRODUCTION_URL,\n process.env.VERCEL_URL,\n ].some(isLocalhostUrl);\n}\n\n// ─── PostHog ───────────────────────────────────────────────────────────────\n\nfunction isPostHogAiObservabilityEvent(eventName: string): boolean {\n return eventName.startsWith(\"$ai_\");\n}\n\nfunction createPostHogProvider(apiKey: string, host: string): TrackingProvider {\n return {\n name: \"posthog\",\n track(event: TrackingEvent) {\n const distinctId = event.userId || \"anonymous\";\n if (isPostHogAiObservabilityEvent(event.name)) {\n enqueue(\n `${host}/i/v0/e/`,\n JSON.stringify({\n api_key: apiKey,\n event: event.name,\n properties: {\n distinct_id: distinctId,\n ...event.properties,\n timestamp: event.timestamp,\n },\n }),\n );\n return;\n }\n\n enqueue(\n `${host}/capture/`,\n JSON.stringify({\n api_key: apiKey,\n event: event.name,\n distinct_id: distinctId,\n properties: {\n ...event.properties,\n timestamp: event.timestamp,\n },\n }),\n );\n },\n identify(userId, traits) {\n enqueue(\n `${host}/capture/`,\n JSON.stringify({\n api_key: apiKey,\n event: \"$identify\",\n distinct_id: userId,\n properties: { $set: traits },\n }),\n );\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Mixpanel ──────────────────────────────────────────────────────────────\n\nfunction createMixpanelProvider(token: string): TrackingProvider {\n return {\n name: \"mixpanel\",\n track(event: TrackingEvent) {\n const data = {\n event: event.name,\n properties: {\n token,\n distinct_id: event.userId || \"anonymous\",\n time: event.timestamp\n ? new Date(event.timestamp).getTime() / 1000\n : undefined,\n ...event.properties,\n },\n };\n enqueue(\"https://api.mixpanel.com/track\", JSON.stringify([data]));\n },\n identify(userId, traits) {\n const data = {\n $token: token,\n $distinct_id: userId,\n $set: traits,\n };\n enqueue(\"https://api.mixpanel.com/engage\", JSON.stringify([data]));\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Amplitude ─────────────────────────────────────────────────────────────\n\nfunction createAmplitudeProvider(apiKey: string): TrackingProvider {\n return {\n name: \"amplitude\",\n track(event: TrackingEvent) {\n const data = {\n api_key: apiKey,\n events: [\n {\n event_type: event.name,\n user_id: event.userId || \"anonymous\",\n event_properties: event.properties,\n time: event.timestamp\n ? new Date(event.timestamp).getTime()\n : undefined,\n },\n ],\n };\n enqueue(\"https://api2.amplitude.com/2/httpapi\", JSON.stringify(data));\n },\n identify(userId, traits) {\n const data = {\n api_key: apiKey,\n events: [\n {\n event_type: \"$identify\",\n user_id: userId,\n user_properties: { $set: traits },\n },\n ],\n };\n enqueue(\"https://api2.amplitude.com/2/httpapi\", JSON.stringify(data));\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Webhook (custom HTTP endpoint) ───────────────────────────────────────\n\nfunction createWebhookProvider(\n url: string,\n authHeader?: string,\n): TrackingProvider {\n const extra = authHeader ? { Authorization: authHeader } : undefined;\n return {\n name: \"webhook\",\n track(event: TrackingEvent) {\n enqueue(\n url,\n JSON.stringify({\n event: event.name,\n properties: event.properties,\n userId: event.userId,\n timestamp: event.timestamp,\n }),\n extra,\n );\n },\n identify(userId, traits) {\n enqueue(\n url,\n JSON.stringify({\n event: \"$identify\",\n userId,\n traits,\n timestamp: new Date().toISOString(),\n }),\n extra,\n );\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Agent Native Analytics ───────────────────────────────────────────────\n\nfunction createAgentNativeAnalyticsProvider(\n publicKey: string,\n endpoint: string,\n): TrackingProvider {\n return {\n name: \"agent-native-analytics\",\n track(event: TrackingEvent) {\n enqueue(\n endpoint,\n JSON.stringify({\n publicKey,\n event: event.name,\n properties: event.properties ?? {},\n userId: event.userId,\n timestamp: event.timestamp,\n }),\n );\n },\n identify(userId, traits) {\n enqueue(\n endpoint,\n JSON.stringify({\n publicKey,\n event: \"$identify\",\n userId,\n properties: traits ?? {},\n timestamp: new Date().toISOString(),\n }),\n );\n },\n flush: () => {\n return drainQueue().then(() => undefined);\n },\n };\n}\n\n// ─── Auto-registration ────────────────────────────────────────────────────\n\nlet _registered = false;\n\nexport function registerBuiltinProviders(): void {\n if (_registered) return;\n _registered = true;\n\n const posthogKey = process.env.POSTHOG_API_KEY;\n if (posthogKey) {\n const host = (process.env.POSTHOG_HOST || POSTHOG_DEFAULT_HOST).replace(\n /\\/+$/,\n \"\",\n );\n registerTrackingProvider(createPostHogProvider(posthogKey, host));\n }\n\n const mixpanelToken = process.env.MIXPANEL_TOKEN;\n if (mixpanelToken) {\n registerTrackingProvider(createMixpanelProvider(mixpanelToken));\n }\n\n const amplitudeKey = process.env.AMPLITUDE_API_KEY;\n if (amplitudeKey) {\n registerTrackingProvider(createAmplitudeProvider(amplitudeKey));\n }\n\n const agentNativeAnalyticsKey = process.env.AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (\n agentNativeAnalyticsKey &&\n !shouldSkipAgentNativeAnalyticsForLocalhost()\n ) {\n registerTrackingProvider(\n createAgentNativeAnalyticsProvider(\n agentNativeAnalyticsKey,\n (\n process.env.AGENT_NATIVE_ANALYTICS_ENDPOINT ||\n AGENT_NATIVE_ANALYTICS_DEFAULT_ENDPOINT\n ).replace(/\\/+$/, \"\"),\n ),\n );\n }\n\n const webhookUrl = process.env.TRACKING_WEBHOOK_URL;\n if (webhookUrl) {\n registerTrackingProvider(\n createWebhookProvider(webhookUrl, process.env.TRACKING_WEBHOOK_AUTH),\n );\n }\n}\n"]}
@@ -22,7 +22,6 @@ Each one is a real app you could use today, and the launching pad for your own v
22
22
  | [**Brain**](/docs/template-brain) | Clean company chat backed by cited institutional memory, approved sources, review gates, and citations. |
23
23
  | [**Assets**](/docs/template-assets) | Digital asset manager for brand libraries, uploads, references, and on-brand image/video generation. |
24
24
  | [**Slides**](/docs/template-slides) | An agent-native Google Slides. React-based decks the agent generates and edits directly. |
25
- | [**Video**](/docs/template-videos) | Programmatic motion graphics and product-demo videos on Remotion. |
26
25
  | [**Analytics**](/docs/template-analytics) | An agent-native Amplitude/Mixpanel. Connect data sources, prompt for charts, pin to dashboards. |
27
26
  | [**Clips**](/docs/template-clips) | Async screen + camera recording with transcription, chapters, and AI summaries. |
28
27
  | [**Design**](/docs/template-design) | Agent-native HTML prototyping studio for interactive Alpine/Tailwind designs. |
@@ -22,7 +22,6 @@ description: "ابتكر منتج SaaS فعالاً واجعله ملكك - بم
22
22
  | [**Brain**](/docs/template-brain) | دردشة واضحة للشركة مدعومة بالذاكرة المؤسسية المستشهد بها، والمصادر المعتمدة، وبوابات المراجعة، والاستشهادات. |
23
23
  | [**Assets**](/docs/template-assets) | مدير الأصول الرقمية لمكتبات العلامات التجارية، والتحميلات، والمراجع، وإنشاء الصور/مقاطع الفيديو المتعلقة بالعلامة التجارية. |
24
24
  | [**Slides**](/docs/template-slides) | عروض Google التقديمية الأصلية للوكيل. التشكيلات المستندة إلى React يقوم الوكيل بإنشائها وتحريرها مباشرة. |
25
- | [**Video**](/docs/template-videos) | رسومات متحركة آلية ومقاطع فيديو توضيحية للمنتج على Remotion. |
26
25
  | [**Analytics**](/docs/template-analytics) | السعة/Mixpanel الأصلية للوكيل. قم بتوصيل مصادر البيانات، والمطالبة بالمخططات، والتثبيت على لوحات المعلومات. |
27
26
  | [**Clips**](/docs/template-clips) | شاشة غير متزامنة + تسجيل بالكاميرا مع النسخ والفصول وملخصات الذكاء الاصطناعي. |
28
27
  | [**Design**](/docs/template-design) | استوديو النماذج الأولية HTML للوكيل الأصلي لتصميمات Alpine/Tailwind التفاعلية. |
@@ -1,20 +1,20 @@
1
1
  ---
2
2
  title: "المكون الإضافي للخطة والسوق"
3
- description: "قم بتثبيت خطة Agent-Native skills (/visual-plan، /visual-recap) بالإضافة إلى موصل Plan MCP المستضاف كرمز Claude أو مكون إضافي Codex، أو باستخدام CLI العام. كيفية عمل التحديثات وما إذا كنت بحاجة إلى إرسال أي شيء."
3
+ description: "قم بتثبيت مهارات Agent-Native Plan (/visual-plan، /visual-recap، /visualize-repo) بالإضافة إلى موصل Plan MCP المستضاف كمكوّن Claude Code أو Codex، أو باستخدام CLI العام. كيفية عمل التحديثات وما إذا كنت بحاجة إلى إرسال أي شيء."
4
4
  ---
5
5
 
6
6
  # المكون الإضافي للخطة والسوق
7
7
 
8
- يأتي تطبيق Agent-Native **Plan** كحزمة واحدة قابلة للتثبيت. يؤدي التثبيت الفردي إلى إضافة أمر الشرطة المائلة للخطة skills ** و** إلى موصل Plan MCP المستضاف، حتى يتمكن الوكيل من إنشاء الخطط ويمكن لـ skills نشرها مباشرة في تطبيق الخطة.
8
+ يأتي تطبيق Agent-Native **Plan** كحزمة واحدة قابلة للتثبيت. يضيف التثبيت الواحد مهارات أوامر Plan المائلة **و** يوصّل موصل Plan MCP المستضاف، حتى يتمكن الوكيل من إنشاء الخطط ويمكن للمهارات نشرها مباشرة في تطبيق Plan.
9
9
 
10
10
  ## ما تحصل عليه {#what-you-get}
11
11
 
12
12
  تمنحك عملية التثبيت الواحدة ما يلي:
13
13
 
14
- - **اثنان skills** — `/visual-plan` (نقطة الدخول الأساسية) و`/visual-recap`.
14
+ - **ثلاث skills** — `/visual-plan` (نقطة الدخول الأساسية)، و`/visual-recap`، و`/visualize-repo`.
15
15
  - **موصل Plan MCP** — مسجل في التطبيق المستضاف على `https://plan.agent-native.com` (نقطة نهاية MCP `https://plan.agent-native.com/_agent-native/mcp`، اسم الخادم `plan`).
16
16
 
17
- <Diagram id="doc-block-10bw7bb" title={"ثلاث طرق، حزمة واحدة"} summary={"يقوم كل من المكون الإضافي CLI، وClaude Code، والمكون الإضافي Codex بتثبيت نفس المهارتين بالإضافة إلى موصل الخطة المستضاف."}>
17
+ <Diagram id="doc-block-10bw7bb" title={"ثلاث طرق، حزمة واحدة"} summary={"يقوم كل من CLI العام ومكوّن Claude Code ومكوّن Codex بتثبيت مهارات Plan نفسها بالإضافة إلى موصل Plan المستضاف."}>
18
18
 
19
19
  ```html
20
20
  <div class="diagram-routes">
@@ -37,7 +37,8 @@ description: "قم بتثبيت خطة Agent-Native skills (/visual-plan، /visu
37
37
  <div class="diagram-panel center">
38
38
  <span class="diagram-pill accent">/visual-plan</span
39
39
  ><span class="diagram-pill accent">/visual-recap</span
40
- ><small class="diagram-muted">two skills</small>
40
+ ><span class="diagram-pill accent">/visualize-repo</span
41
+ ><small class="diagram-muted">three skills</small>
41
42
  </div>
42
43
  <div class="diagram-arrow diagram-muted" aria-hidden="true">&rarr;</div>
43
44
  <div class="diagram-box">
@@ -78,7 +79,7 @@ description: "قم بتثبيت خطة Agent-Native skills (/visual-plan، /visu
78
79
 
79
80
  </Diagram>
80
81
 
81
- افتراضيًا، يقوم كل من skills بالنشر على تطبيق الخطة المستضاف - حيث يقومان بإنشاء خطة عبر
82
+ افتراضيًا، ينشر `/visual-plan` و`/visual-recap` إلى تطبيق Plan المستضاف فهما ينشئان خطة عبر
82
83
  موصل MCP ويسلمك رابطًا أو خطة مضمنة للمراجعة. إنهم لا يتخلصون أبدًا
83
84
  خطة Markdown/ASCII المضمنة في الدردشة باعتبارها التسليم. إذا كانت أداة الخطة
84
85
  إرجاع `needs auth`، أو `Unauthorized`، أو `Session terminated`، وإعادة المصادقة
@@ -194,13 +195,13 @@ npx @agent-native/core@latest plan local serve --dir plans/<slug> --kind plan --
194
195
 
195
196
  ### مسار المهارة العالمي (أي مضيف MCP) {#universal}
196
197
 
197
- يعمل مع أي مضيف - Claude Code، وCodex، وCursor، وCline، وGoose، وتطبيقات ChatGPT المخصصة MCP، وClaude Cowork، وأي شيء آخر متوافق مع MCP. يقوم Agent-Native CLI بتثبيت كل من skills، وتسجيل موصل الخطة المستضافة MCP، ** وتشغيل المصادقة للعميل (العملاء) المحليين المحددين في نفس الخطوة **، بحيث لا يصل استدعاء الأداة الأول إلى جدار OAuth:
198
+ يعمل مع أي مضيف Claude Code وCodex وCursor وCline وGoose وتطبيقات ChatGPT المخصصة MCP وClaude Cowork وأي شيء آخر متوافق مع MCP. يثبت Agent-Native CLI مهارات Plan، ويسجل موصل Plan MCP المستضاف، **ويشغل المصادقة للعميل (العملاء) المحليين المحددين في نفس الخطوة**، حتى لا يصطدم أول استدعاء للأداة بجدار OAuth:
198
199
 
199
200
  ```bash
200
201
  npx @agent-native/core@latest skills add visual-plan
201
202
  ```
202
203
 
203
- يؤدي هذا إلى تثبيت `visual-plan` بالإضافة إلى مهارة `visual-recap` المصاحبة، ثم تسجيل موصل `plan`، ثم تشغيل المصادقة (مطالبة OAuth بالمشاركة المستضافة/المدعومة بالحساب). إشارات مفيدة:
204
+ يؤدي هذا إلى تثبيت `visual-plan` بالإضافة إلى مهارتي `visual-recap` و`visualize-repo` المصاحبتين، ثم تسجيل موصل `plan`، ثم تشغيل المصادقة (مطالبة OAuth للمشاركة المستضافة/المدعومة بالحساب). إشارات مفيدة:
204
205
 
205
206
  - `--client codex|claude-code|claude-code-cli|cowork|all` — أي الوكلاء المحليين سيكتبون تهيئة MCP لهم (`all` الافتراضي).
206
207
  - `--no-connect` - تسجيل الموصل دون المصادقة؛ قم بتشغيل `npx @agent-native/core@latest connect https://plan.agent-native.com --client all` لاحقًا، أو اختر `--client` الأضيق.
@@ -236,7 +237,7 @@ npx @agent-native/core@latest recap doctor
236
237
  /mcp # authenticate the Plan connector (one OAuth approval)
237
238
  ```
238
239
 
239
- يضيف `/plugin install` كلاً من الخطة skills وتكوين **URL فقط** MCP (لا توجد أسرار في الحزمة)؛ `/mcp` → **المصادقة** تكمل مصافحة OAuth. استخدم المسار CLI العالمي بدلاً من ذلك عندما تريد ملفات محلية أو وضع الاستضافة الذاتية.
240
+ `/plugin install` يضيف مهارات Plan وتكوين MCP **خاصًا بعنوان URL فقط** (لا توجد أسرار في الحزمة)؛ `/mcp` → **المصادقة** تكمل مصافحة OAuth. استخدم مسار CLI العام بدلاً من ذلك عندما تريد الملفات المحلية أو وضع الاستضافة الذاتية.
240
241
 
241
242
  > يُسمى كتالوج السوق `agent-native-apps` والمكون الإضافي للخطة هو `agent-native-visual-plans`، لذا يكون هدف التثبيت دائمًا هو `agent-native-visual-plans@agent-native-apps`.
242
243