@agent-native/core 0.106.3 → 0.107.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +23 -0
  3. package/corpus/core/docs/content/integrations.mdx +597 -0
  4. package/corpus/core/docs/content/locales/ar-SA/mcp-clients.mdx +19 -1
  5. package/corpus/core/docs/content/locales/de-DE/mcp-clients.mdx +22 -1
  6. package/corpus/core/docs/content/locales/es-ES/mcp-clients.mdx +23 -1
  7. package/corpus/core/docs/content/locales/fr-FR/mcp-clients.mdx +23 -1
  8. package/corpus/core/docs/content/locales/hi-IN/mcp-clients.mdx +22 -1
  9. package/corpus/core/docs/content/locales/ja-JP/mcp-clients.mdx +21 -1
  10. package/corpus/core/docs/content/locales/ko-KR/mcp-clients.mdx +20 -1
  11. package/corpus/core/docs/content/locales/pt-BR/mcp-clients.mdx +22 -1
  12. package/corpus/core/docs/content/locales/zh-CN/mcp-clients.mdx +17 -1
  13. package/corpus/core/docs/content/locales/zh-TW/mcp-clients.mdx +17 -1
  14. package/corpus/core/docs/content/mcp-clients.mdx +51 -1
  15. package/corpus/core/docs/content/organizations-teams-permissions.mdx +413 -0
  16. package/corpus/core/package.json +1 -1
  17. package/corpus/core/src/agent/production-agent.ts +19 -0
  18. package/corpus/core/src/agent/run-store.ts +98 -2
  19. package/corpus/core/src/client/AssistantChat.tsx +26 -1
  20. package/corpus/core/src/client/CommandMenu.tsx +5 -0
  21. package/corpus/core/src/client/active-run-state.ts +34 -0
  22. package/corpus/core/src/client/agent-chat-adapter.ts +4 -0
  23. package/corpus/core/src/client/chat/message-components.tsx +41 -0
  24. package/corpus/core/src/client/composer/TiptapComposer.tsx +45 -8
  25. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +30 -11
  26. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +270 -0
  27. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +177 -40
  28. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +478 -4
  29. package/corpus/core/src/client/resources/mcp-integration-logos.ts +108 -0
  30. package/corpus/core/src/client/sharing/ShareButton.tsx +30 -9
  31. package/corpus/core/src/client/use-agent-chat-home-handoff.ts +2 -2
  32. package/corpus/core/src/deploy/build.ts +32 -0
  33. package/corpus/core/src/extensions/html-shell.ts +33 -1
  34. package/corpus/core/src/ingestion/office.ts +1 -2
  35. package/corpus/core/src/ingestion/pptx.ts +2 -4
  36. package/corpus/core/src/localization/default-messages.ts +129 -1
  37. package/corpus/core/src/mcp/actions/call-mcp-tool.ts +1 -0
  38. package/corpus/core/src/secrets/register-framework-secrets.ts +28 -0
  39. package/corpus/core/src/server/agent-chat-plugin.ts +29 -1
  40. package/corpus/core/src/server/index.ts +4 -0
  41. package/corpus/core/src/server/org-admin.ts +28 -0
  42. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
  43. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
  44. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
  45. package/corpus/core/src/vite/client.ts +24 -0
  46. package/corpus/templates/analytics/.agents/skills/creative-context/SKILL.md +64 -0
  47. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -21
  48. package/corpus/templates/analytics/AGENTS.md +13 -0
  49. package/corpus/templates/analytics/actions/clone-creative-context-dashboard.ts +86 -0
  50. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
  51. package/corpus/templates/analytics/actions/update-dashboard.ts +6 -2
  52. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +35 -7
  53. package/corpus/templates/analytics/app/components/layout/Layout.tsx +3 -3
  54. package/corpus/templates/analytics/app/i18n/zh-TW.ts +1 -0
  55. package/corpus/templates/analytics/app/i18n-data.ts +1 -0
  56. package/corpus/templates/analytics/app/pages/Ask.tsx +8 -4
  57. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +11 -1
  58. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/extension-slot.ts +11 -0
  59. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +86 -0
  60. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +6 -0
  61. package/corpus/templates/analytics/app/routes/agent.tsx +7 -1
  62. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extension-boxes.md +6 -0
  63. package/corpus/templates/analytics/changelog/2026-07-17-library-now-flags-published-dashboards-with-newer-versions-a.md +6 -0
  64. package/corpus/templates/analytics/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
  65. package/corpus/templates/analytics/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  66. package/corpus/templates/analytics/package.json +1 -0
  67. package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +8 -0
  68. package/corpus/templates/analytics/server/lib/native-creative-context.ts +158 -0
  69. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  70. package/corpus/templates/analytics/server/plugins/creative-context.ts +10 -0
  71. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +12 -3
  72. package/corpus/templates/assets/AGENTS.md +5 -0
  73. package/corpus/templates/assets/actions/clone-creative-context-asset.ts +74 -0
  74. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -1
  75. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +308 -178
  76. package/corpus/templates/assets/app/routes/library.tsx +5 -11
  77. package/corpus/templates/assets/changelog/2026-07-17-library-now-flags-published-assets-with-newer-versions-and-l.md +6 -0
  78. package/corpus/templates/assets/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  79. package/corpus/templates/assets/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  80. package/corpus/templates/assets/server/lib/native-creative-context.ts +198 -0
  81. package/corpus/templates/assets/server/plugins/creative-context.ts +4 -0
  82. package/corpus/templates/brain/actions/provider-api-request.ts +1 -0
  83. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +6 -1
  84. package/corpus/templates/brain/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  85. package/corpus/templates/calendar/actions/provider-api-request.ts +1 -0
  86. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +1 -1
  87. package/corpus/templates/calendar/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  88. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +4 -1
  89. package/corpus/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  90. package/corpus/templates/clips/actions/get-recording-insights.ts +7 -4
  91. package/corpus/templates/clips/actions/list-recordings.ts +48 -0
  92. package/corpus/templates/clips/actions/list-viewers.ts +2 -1
  93. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +3 -1
  94. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  95. package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -3
  96. package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +11 -6
  97. package/corpus/templates/clips/app/hooks/use-view-tracking.ts +6 -1
  98. package/corpus/templates/clips/app/lib/ffmpeg-export.ts +4 -2
  99. package/corpus/templates/clips/app/routes/share.$shareId.tsx +21 -3
  100. package/corpus/templates/clips/changelog/2026-07-17-dictation-keeps-sentence-spacing-and-no-longer-crashes-when-.md +6 -0
  101. package/corpus/templates/clips/changelog/2026-07-17-shared-clips-now-preserve-editor-access-and-show-editor-insi.md +6 -0
  102. package/corpus/templates/clips/changelog/2026-07-17-stitching-clips-no-longer-fails-when-editor-media-metadata-i.md +6 -0
  103. package/corpus/templates/clips/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  104. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -8
  105. package/corpus/templates/clips/shared/view-analytics.ts +4 -0
  106. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +12 -3
  107. package/corpus/templates/content/AGENTS.md +5 -0
  108. package/corpus/templates/content/actions/_content-space-access.ts +45 -2
  109. package/corpus/templates/content/actions/clone-creative-context-document.ts +61 -0
  110. package/corpus/templates/content/actions/create-content-database.ts +41 -7
  111. package/corpus/templates/content/actions/provider-api-request.ts +1 -0
  112. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +21 -0
  113. package/corpus/templates/content/app/components/layout/Layout.tsx +1 -1
  114. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +29 -0
  115. package/corpus/templates/content/app/root.tsx +1 -10
  116. package/corpus/templates/content/changelog/2026-07-17-creating-a-database-now-completes-reliably-in-hosted-workspa.md +6 -0
  117. package/corpus/templates/content/changelog/2026-07-17-library-now-flags-published-documents-with-newer-versions-an.md +6 -0
  118. package/corpus/templates/content/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
  119. package/corpus/templates/content/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  120. package/corpus/templates/content/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  121. package/corpus/templates/content/parity/matrix.md +1 -1
  122. package/corpus/templates/content/parity/matrix.ts +1 -0
  123. package/corpus/templates/content/server/lib/native-creative-context.ts +191 -0
  124. package/corpus/templates/content/server/plugins/creative-context.ts +8 -1
  125. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +11 -3
  126. package/corpus/templates/design/AGENTS.md +5 -0
  127. package/corpus/templates/design/actions/clone-creative-context-design-native.ts +111 -0
  128. package/corpus/templates/design/actions/provider-api-request.ts +1 -0
  129. package/corpus/templates/design/app/pages/Index.tsx +44 -0
  130. package/corpus/templates/design/app/pages/design-editor/types.ts +1 -0
  131. package/corpus/templates/design/changelog/2026-07-17-library-now-flags-published-designs-with-newer-versions-and-.md +6 -0
  132. package/corpus/templates/design/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
  133. package/corpus/templates/design/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  134. package/corpus/templates/design/server/lib/native-creative-context.ts +265 -0
  135. package/corpus/templates/design/server/plugins/creative-context.ts +8 -1
  136. package/corpus/templates/dispatch/actions/provider-api-request.ts +1 -0
  137. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +4 -1
  138. package/corpus/templates/dispatch/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  139. package/corpus/templates/forms/app/components/layout/Layout.tsx +2 -4
  140. package/corpus/templates/forms/app/components/ui/popover.tsx +25 -1
  141. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +6 -1
  142. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +13 -10
  143. package/corpus/templates/forms/app/root.tsx +6 -1
  144. package/corpus/templates/forms/changelog/2026-07-17-form-builder-popovers-stay-within-the-viewport.md +6 -0
  145. package/corpus/templates/forms/changelog/2026-07-17-form-editor-loading-matches-current-sidebar-free-layout.md +6 -0
  146. package/corpus/templates/forms/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  147. package/corpus/templates/mail/actions/provider-api-request.ts +1 -0
  148. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +1 -1
  149. package/corpus/templates/mail/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  150. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +14 -3
  151. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +8 -1
  152. package/corpus/templates/plan/app/root.tsx +0 -2
  153. package/corpus/templates/plan/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  154. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +11 -3
  155. package/corpus/templates/slides/AGENTS.md +5 -0
  156. package/corpus/templates/slides/actions/clone-creative-context-deck.ts +96 -0
  157. package/corpus/templates/slides/actions/extract-pdf.ts +3 -2
  158. package/corpus/templates/slides/actions/import-file.ts +3 -2
  159. package/corpus/templates/slides/actions/provider-api-request.ts +1 -0
  160. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +27 -0
  161. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -0
  162. package/corpus/templates/slides/app/components/layout/Layout.tsx +1 -1
  163. package/corpus/templates/slides/app/context/DeckContext.tsx +23 -23
  164. package/corpus/templates/slides/changelog/2026-07-17-duplicated-slides-now-stay-in-the-deck.md +6 -0
  165. package/corpus/templates/slides/changelog/2026-07-17-library-now-flags-published-decks-with-newer-versions-and-le.md +6 -0
  166. package/corpus/templates/slides/changelog/2026-07-17-pdf-and-powerpoint-imports-now-work-reliably-in-hosted-decks.md +6 -0
  167. package/corpus/templates/slides/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
  168. package/corpus/templates/slides/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  169. package/corpus/templates/slides/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  170. package/corpus/templates/slides/server/lib/native-creative-context.ts +288 -0
  171. package/corpus/templates/slides/server/plugins/creative-context.ts +4 -0
  172. package/corpus/templates/tasks/app/components/layout/Layout.tsx +2 -13
  173. package/corpus/templates/tasks/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it.md +6 -0
  174. package/dist/agent/production-agent.d.ts.map +1 -1
  175. package/dist/agent/production-agent.js +13 -1
  176. package/dist/agent/production-agent.js.map +1 -1
  177. package/dist/agent/run-store.d.ts +17 -0
  178. package/dist/agent/run-store.d.ts.map +1 -1
  179. package/dist/agent/run-store.js +84 -2
  180. package/dist/agent/run-store.js.map +1 -1
  181. package/dist/client/AssistantChat.d.ts.map +1 -1
  182. package/dist/client/AssistantChat.js +18 -3
  183. package/dist/client/AssistantChat.js.map +1 -1
  184. package/dist/client/CommandMenu.d.ts.map +1 -1
  185. package/dist/client/CommandMenu.js +4 -0
  186. package/dist/client/CommandMenu.js.map +1 -1
  187. package/dist/client/active-run-state.d.ts +7 -0
  188. package/dist/client/active-run-state.d.ts.map +1 -1
  189. package/dist/client/active-run-state.js +28 -0
  190. package/dist/client/active-run-state.js.map +1 -1
  191. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  192. package/dist/client/agent-chat-adapter.js +4 -1
  193. package/dist/client/agent-chat-adapter.js.map +1 -1
  194. package/dist/client/chat/message-components.d.ts.map +1 -1
  195. package/dist/client/chat/message-components.js +35 -1
  196. package/dist/client/chat/message-components.js.map +1 -1
  197. package/dist/client/composer/TiptapComposer.d.ts +7 -0
  198. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  199. package/dist/client/composer/TiptapComposer.js +37 -8
  200. package/dist/client/composer/TiptapComposer.js.map +1 -1
  201. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  202. package/dist/client/integrations/IntegrationsPanel.js +3 -2
  203. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  204. package/dist/client/resources/McpConnectionSuggestion.d.ts +9 -0
  205. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -0
  206. package/dist/client/resources/McpConnectionSuggestion.js +134 -0
  207. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -0
  208. package/dist/client/resources/McpIntegrationDialog.d.ts +2 -1
  209. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  210. package/dist/client/resources/McpIntegrationDialog.js +51 -21
  211. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  212. package/dist/client/resources/mcp-integration-catalog.d.ts +15 -0
  213. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  214. package/dist/client/resources/mcp-integration-catalog.js +420 -4
  215. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  216. package/dist/client/resources/mcp-integration-logos.d.ts +2 -0
  217. package/dist/client/resources/mcp-integration-logos.d.ts.map +1 -0
  218. package/dist/client/resources/mcp-integration-logos.js +109 -0
  219. package/dist/client/resources/mcp-integration-logos.js.map +1 -0
  220. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  221. package/dist/client/sharing/ShareButton.js +15 -12
  222. package/dist/client/sharing/ShareButton.js.map +1 -1
  223. package/dist/client/use-agent-chat-home-handoff.d.ts +1 -1
  224. package/dist/client/use-agent-chat-home-handoff.d.ts.map +1 -1
  225. package/dist/client/use-agent-chat-home-handoff.js +1 -1
  226. package/dist/client/use-agent-chat-home-handoff.js.map +1 -1
  227. package/dist/collab/routes.d.ts +1 -1
  228. package/dist/collab/struct-routes.d.ts +1 -1
  229. package/dist/deploy/build.d.ts.map +1 -1
  230. package/dist/deploy/build.js +23 -0
  231. package/dist/deploy/build.js.map +1 -1
  232. package/dist/extensions/html-shell.d.ts.map +1 -1
  233. package/dist/extensions/html-shell.js +33 -1
  234. package/dist/extensions/html-shell.js.map +1 -1
  235. package/dist/ingestion/office.d.ts.map +1 -1
  236. package/dist/ingestion/office.js +1 -2
  237. package/dist/ingestion/office.js.map +1 -1
  238. package/dist/ingestion/pptx.js +2 -4
  239. package/dist/ingestion/pptx.js.map +1 -1
  240. package/dist/localization/default-messages.d.ts +100 -0
  241. package/dist/localization/default-messages.d.ts.map +1 -1
  242. package/dist/localization/default-messages.js +101 -1
  243. package/dist/localization/default-messages.js.map +1 -1
  244. package/dist/mcp/actions/call-mcp-tool.js +1 -0
  245. package/dist/mcp/actions/call-mcp-tool.js.map +1 -1
  246. package/dist/notifications/routes.d.ts +1 -1
  247. package/dist/observability/routes.d.ts +5 -5
  248. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  249. package/dist/resources/handlers.d.ts +1 -1
  250. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  251. package/dist/secrets/register-framework-secrets.js +25 -0
  252. package/dist/secrets/register-framework-secrets.js.map +1 -1
  253. package/dist/secrets/routes.d.ts +9 -9
  254. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  255. package/dist/server/agent-chat-plugin.js +23 -1
  256. package/dist/server/agent-chat-plugin.js.map +1 -1
  257. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  258. package/dist/server/index.d.ts +1 -0
  259. package/dist/server/index.d.ts.map +1 -1
  260. package/dist/server/index.js +1 -0
  261. package/dist/server/index.js.map +1 -1
  262. package/dist/server/org-admin.d.ts +3 -0
  263. package/dist/server/org-admin.d.ts.map +1 -0
  264. package/dist/server/org-admin.js +24 -0
  265. package/dist/server/org-admin.js.map +1 -0
  266. package/dist/templates/chat/app/hooks/use-navigation-state.ts +4 -1
  267. package/dist/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  268. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
  269. package/dist/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
  270. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
  271. package/dist/vite/client.d.ts.map +1 -1
  272. package/dist/vite/client.js +20 -0
  273. package/dist/vite/client.js.map +1 -1
  274. package/docs/content/integrations.mdx +597 -0
  275. package/docs/content/locales/ar-SA/mcp-clients.mdx +19 -1
  276. package/docs/content/locales/de-DE/mcp-clients.mdx +22 -1
  277. package/docs/content/locales/es-ES/mcp-clients.mdx +23 -1
  278. package/docs/content/locales/fr-FR/mcp-clients.mdx +23 -1
  279. package/docs/content/locales/hi-IN/mcp-clients.mdx +22 -1
  280. package/docs/content/locales/ja-JP/mcp-clients.mdx +21 -1
  281. package/docs/content/locales/ko-KR/mcp-clients.mdx +20 -1
  282. package/docs/content/locales/pt-BR/mcp-clients.mdx +22 -1
  283. package/docs/content/locales/zh-CN/mcp-clients.mdx +17 -1
  284. package/docs/content/locales/zh-TW/mcp-clients.mdx +17 -1
  285. package/docs/content/mcp-clients.mdx +51 -1
  286. package/docs/content/organizations-teams-permissions.mdx +413 -0
  287. package/package.json +1 -1
  288. package/src/templates/chat/app/hooks/use-navigation-state.ts +4 -1
  289. package/src/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  290. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
  291. package/src/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
  292. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
@@ -6,11 +6,11 @@
6
6
  * authenticated `/_agent-native/actions/get-recording-player-data` route.
7
7
  *
8
8
  * Only returns data when:
9
- * - recording.visibility === 'public' (or the signed-in viewer is owner), AND
9
+ * - recording.visibility === 'public', or the signed-in viewer has org/share access, AND
10
10
  * - either no password is set, the viewer is owner, or the provided password matches
11
11
  *
12
- * For `org` or `private` visibility, returns 401 (viewer must sign in and use
13
- * the authenticated player route).
12
+ * For `org` or `private` visibility, signed-in org members and explicit shares
13
+ * may load the same player payload as the authenticated route.
14
14
  */
15
15
 
16
16
  import {
@@ -467,11 +467,17 @@ export default defineEventHandler(async (event) => {
467
467
  placement: c.placement,
468
468
  })),
469
469
  viewer: session?.email
470
- ? {
471
- canEdit: viewerIsOwner,
472
- isOwner: viewerIsOwner,
473
- role: viewerIsOwner ? "owner" : "viewer",
474
- }
470
+ ? (() => {
471
+ const role =
472
+ viewerAccess?.role ?? (viewerIsOrgMember ? "viewer" : null);
473
+ const canEdit =
474
+ role === "owner" || role === "admin" || role === "editor";
475
+ return {
476
+ canEdit,
477
+ isOwner: role === "owner",
478
+ role: role ?? "viewer",
479
+ };
480
+ })()
475
481
  : null,
476
482
  };
477
483
  });
@@ -0,0 +1,4 @@
1
+ export function clampCompletionPct(value: number | null | undefined): number {
2
+ if (typeof value !== "number" || !Number.isFinite(value)) return 0;
3
+ return Math.min(100, Math.max(0, value));
4
+ }
@@ -35,9 +35,11 @@ role cannot silently stand in for another:
35
35
 
36
36
  1. Follow the user's explicit instructions and the object currently selected in
37
37
  the app.
38
- 2. Read the `creative-context` application-state record. If
39
- `pinnedPackId` is set, prefer that immutable pack. Otherwise use
40
- `currentPackId` when it records context already selected for this session.
38
+ 2. Read the `creative-context` application-state record. If `pinnedPackId` is
39
+ set, replay that immutable pack. Otherwise honor `selectedContextId`; when it
40
+ is unset, let retrieval use Default plus at most one app-bound or
41
+ semantically matching specialty context. `currentPackId` is the receipt from
42
+ the latest materialized generation, not a replacement for context selection.
41
43
  3. Call `search-creative-context` with a narrow query for exact facts, visual
42
44
  language, audience guidance, prior decisions, or reusable references.
43
45
  4. Call `get-context-item` only for the specific search result versions
@@ -60,6 +62,7 @@ The single state key is `creative-context`:
60
62
  ```json
61
63
  {
62
64
  "contextMode": "auto",
65
+ "selectedContextId": null,
63
66
  "currentPackId": null,
64
67
  "pinnedPackId": null
65
68
  }
@@ -83,3 +86,9 @@ versions may support factual claims. Preserve the returned `contextPackId`
83
86
  and short reuse labels with the document generation provenance. A published
84
87
  brand profile can guide tone automatically; it never overrides the user's
85
88
  current brief, and it must not turn an unsupported prior claim into a fact.
89
+
90
+ When an approved app-created document already fits, call
91
+ `clone-creative-context-document` with its exact item and version ids before
92
+ rewriting from excerpts. The typed action resolves the approved private
93
+ Markdown/document payload through Content's normal create path; generic context
94
+ actions never expose that payload.
@@ -43,6 +43,11 @@ Detailed document editing, Notion, storage, and UI rules live in
43
43
  document first, then a pinned/current pack, then narrow library search.
44
44
  Respect `creative-context.contextMode: "off"` without silently restoring a
45
45
  pack.
46
+ - To submit a document to a governed Creative Context, use the Context tab or
47
+ `manage-context-membership`; the app flushes live collaboration and captures
48
+ one immutable Markdown version. Reuse only its opaque native clone reference.
49
+ Use `operation="submit-latest"` with a Library membership id when its native
50
+ update status reports `update-available`.
46
51
 
47
52
  - `navigation` exposes document, selected block, comment, media, and Notion view
48
53
  context.
@@ -1,9 +1,25 @@
1
1
  import { getDbExec } from "@agent-native/core/db";
2
+ import { table, text } from "@agent-native/core/db/schema";
2
3
  import { getRequestUserEmail } from "@agent-native/core/server/request-context";
3
- import { eq } from "drizzle-orm";
4
+ import { and, eq, sql } from "drizzle-orm";
4
5
 
5
6
  import { getDb, schema } from "../server/db/index.js";
6
7
 
8
+ // Keep these lightweight table references local. Importing the public org
9
+ // barrel also initializes auth's long-lived cleanup timer, which breaks test
10
+ // suites that intentionally drain fake timers.
11
+ const organizations = table("organizations", {
12
+ id: text("id").primaryKey(),
13
+ name: text("name").notNull(),
14
+ createdBy: text("created_by").notNull(),
15
+ });
16
+
17
+ const orgMembers = table("org_members", {
18
+ orgId: text("org_id").notNull(),
19
+ email: text("email").notNull(),
20
+ role: text("role").notNull(),
21
+ });
22
+
7
23
  export type ContentSpaceRole = "viewer" | "editor" | "owner";
8
24
 
9
25
  export type ContentSpaceAccess = {
@@ -21,7 +37,32 @@ export function normalizeContentSpaceEmail(email: string): string {
21
37
  export async function getContentOrganizationMembership(
22
38
  orgId: string,
23
39
  userEmail: string,
40
+ options: { db?: any } = {},
24
41
  ): Promise<{ role: string; name: string; createdBy: string } | null> {
42
+ if (options.db) {
43
+ const [row] = await options.db
44
+ .select({
45
+ role: orgMembers.role,
46
+ name: organizations.name,
47
+ createdBy: organizations.createdBy,
48
+ })
49
+ .from(orgMembers)
50
+ .innerJoin(organizations, eq(organizations.id, orgMembers.orgId))
51
+ .where(
52
+ and(
53
+ eq(orgMembers.orgId, orgId),
54
+ sql`LOWER(${orgMembers.email}) = ${normalizeContentSpaceEmail(userEmail)}`,
55
+ ),
56
+ )
57
+ .limit(1);
58
+ return row
59
+ ? {
60
+ role: String(row.role ?? "member").toLowerCase(),
61
+ name: row.name,
62
+ createdBy: row.createdBy,
63
+ }
64
+ : null;
65
+ }
25
66
  const result = await getDbExec().execute({
26
67
  sql: `SELECT m.role AS role, o.name AS name, o.created_by AS "createdBy"
27
68
  FROM org_members m
@@ -90,11 +131,12 @@ export async function listContentOrganizationMemberships(userEmail: string) {
90
131
  export async function resolveContentSpaceAccess(
91
132
  spaceId: string,
92
133
  requiredRole: "viewer" | "editor" = "viewer",
134
+ options: { db?: any } = {},
93
135
  ): Promise<ContentSpaceAccess> {
94
136
  const userEmail = getRequestUserEmail();
95
137
  if (!userEmail) throw new Error("no authenticated user");
96
138
  const normalizedUserEmail = normalizeContentSpaceEmail(userEmail);
97
- const [space] = await getDb()
139
+ const [space] = await (options.db ?? getDb())
98
140
  .select()
99
141
  .from(schema.contentSpaces)
100
142
  .where(eq(schema.contentSpaces.id, spaceId));
@@ -115,6 +157,7 @@ export async function resolveContentSpaceAccess(
115
157
  const membership = await getContentOrganizationMembership(
116
158
  space.orgId,
117
159
  normalizedUserEmail,
160
+ options,
118
161
  );
119
162
  if (!membership)
120
163
  throw new Error(`Not authorized for Content space "${spaceId}"`);
@@ -0,0 +1,61 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ import { defineAction } from "@agent-native/core";
4
+ import {
5
+ readPrivateBlob,
6
+ type PrivateBlobHandle,
7
+ } from "@agent-native/core/private-blob";
8
+ import { resolveNativeContextCloneReference } from "@agent-native/creative-context/server";
9
+ import { z } from "zod";
10
+
11
+ import createDocument from "./create-document.js";
12
+
13
+ export default defineAction({
14
+ description:
15
+ "Clone one exact governed Markdown document without returning its private source payload.",
16
+ schema: z.object({
17
+ contextId: z.string(),
18
+ artifactKey: z.string(),
19
+ resourceId: z.string(),
20
+ expectedUpdatedAt: z.string().optional(),
21
+ title: z.string().optional(),
22
+ parentId: z.string().optional(),
23
+ }),
24
+ publicAgent: { expose: true, readOnly: false, requiresAuth: true },
25
+ run: async (args) => {
26
+ const reference = await resolveNativeContextCloneReference({
27
+ appId: "content",
28
+ resourceType: "document",
29
+ resourceId: args.resourceId,
30
+ expectedUpdatedAt: args.expectedUpdatedAt,
31
+ contextId: args.contextId,
32
+ artifactKey: args.artifactKey,
33
+ });
34
+ const raw = await readPrivateBlob(
35
+ reference.cloneHandle as PrivateBlobHandle,
36
+ );
37
+ const content = Buffer.from(raw.data).toString("utf8");
38
+ const hash = createHash("sha256").update(content).digest("hex");
39
+ if (
40
+ raw.metadata?.appId !== "content" ||
41
+ raw.metadata?.resourceType !== "document" ||
42
+ raw.metadata?.resourceId !== args.resourceId ||
43
+ raw.metadata?.contentHash !== hash
44
+ )
45
+ throw new Error(
46
+ "Governed document clone payload failed integrity verification.",
47
+ );
48
+ const result = await createDocument.run({
49
+ title: args.title?.trim() || "Context document",
50
+ content,
51
+ ...(args.parentId ? { parentId: args.parentId } : {}),
52
+ });
53
+ if (!result?.id) throw new Error("Document clone did not persist.");
54
+ return {
55
+ id: result.id,
56
+ title: result.title,
57
+ urlPath: result.urlPath,
58
+ clonedExactVersion: reference.publishedItemVersionId,
59
+ };
60
+ },
61
+ });
@@ -5,7 +5,13 @@ import {
5
5
  getRequestOrgId,
6
6
  getRequestUserEmail,
7
7
  } from "@agent-native/core/server/request-context";
8
- import { assertAccess, type ShareRole } from "@agent-native/core/sharing";
8
+ import {
9
+ accessFilter,
10
+ assertAccess,
11
+ currentAccess,
12
+ ForbiddenError,
13
+ type ShareRole,
14
+ } from "@agent-native/core/sharing";
9
15
  import { and, eq, sql } from "drizzle-orm";
10
16
  import { z } from "zod";
11
17
 
@@ -158,9 +164,34 @@ export async function resolveContentDatabaseSpace(
158
164
  return spaceId;
159
165
  }
160
166
 
167
+ async function assertDocumentEditorAccess(db: any, documentId: string) {
168
+ const [document] = await db
169
+ .select()
170
+ .from(schema.documents)
171
+ .where(
172
+ and(
173
+ eq(schema.documents.id, documentId),
174
+ accessFilter(
175
+ schema.documents,
176
+ schema.documentShares,
177
+ currentAccess(),
178
+ "editor",
179
+ ),
180
+ ),
181
+ );
182
+ if (!document) {
183
+ throw new ForbiddenError(`No editor access to document ${documentId}`);
184
+ }
185
+ return document;
186
+ }
187
+
161
188
  export async function createContentDatabaseRecord(
162
189
  args: CreateDatabaseRequest,
163
- options: { db?: any; spaceId?: string } = {},
190
+ options: {
191
+ db?: any;
192
+ spaceId?: string;
193
+ resolveSpaceAccess?: typeof resolveContentSpaceAccess;
194
+ } = {},
164
195
  ): Promise<string> {
165
196
  const db = options.db ?? getDb();
166
197
  const now = new Date().toISOString();
@@ -178,8 +209,7 @@ export async function createContentDatabaseRecord(
178
209
  }> = [];
179
210
 
180
211
  if (documentId) {
181
- const access = await assertAccess("document", documentId, "editor");
182
- const document = access.resource;
212
+ const document = await assertDocumentEditorAccess(db, documentId);
183
213
  ownerEmail = document.ownerEmail as string;
184
214
  orgId = (document.orgId as string | null) ?? null;
185
215
  spaceId = (document.spaceId as string | null) ?? spaceId;
@@ -230,8 +260,7 @@ export async function createContentDatabaseRecord(
230
260
  let hideFromSearch = 0;
231
261
 
232
262
  if (parentId) {
233
- const parentAccess = await assertAccess("document", parentId, "editor");
234
- const parent = parentAccess.resource;
263
+ const parent = await assertDocumentEditorAccess(db, parentId);
235
264
  ownerEmail = parent.ownerEmail as string;
236
265
  orgId = (parent.orgId as string | null) ?? null;
237
266
  spaceId = (parent.spaceId as string | null) ?? spaceId;
@@ -257,7 +286,12 @@ export async function createContentDatabaseRecord(
257
286
  "A top-level database requires a resolved Content space",
258
287
  );
259
288
  }
260
- const spaceAccess = await resolveContentSpaceAccess(spaceId, "editor");
289
+ const spaceAccess = await (
290
+ options.resolveSpaceAccess ?? resolveContentSpaceAccess
291
+ )(spaceId, "editor", { db });
292
+ if (spaceAccess.space.id !== spaceId) {
293
+ throw new Error("Resolved Content space does not match the request");
294
+ }
261
295
  ownerEmail = getRequestUserEmail() ?? ownerEmail;
262
296
  orgId = spaceAccess.space.orgId;
263
297
  visibility = orgId ? "org" : "private";
@@ -202,6 +202,7 @@ export default defineAction({
202
202
  ),
203
203
  }),
204
204
  http: false,
205
+ toolCallable: false,
205
206
  run: async (args) => {
206
207
  if (args.stageAs) {
207
208
  const ctx = getCredentialContext();
@@ -7,6 +7,7 @@ import {
7
7
  type CollabUser,
8
8
  } from "@agent-native/core/client";
9
9
  import { ShareButton } from "@agent-native/core/client";
10
+ import { CreativeContextShareTab } from "@agent-native/creative-context/client";
10
11
  import type { DocumentSourceInfo } from "@shared/api";
11
12
  import {
12
13
  IconArrowBarDown,
@@ -711,6 +712,26 @@ export function DocumentToolbar({
711
712
  onCheckedChange: handleHideFromSearchChange,
712
713
  }}
713
714
  variant="compact"
715
+ shareTabs={{
716
+ tabs: [
717
+ {
718
+ value: "context",
719
+ label: "Context",
720
+ content: (
721
+ <CreativeContextShareTab
722
+ resource={{
723
+ appId: "content",
724
+ resourceType: "document",
725
+ resourceId: documentId,
726
+ title: documentTitle || "Untitled",
727
+ updatedAt: documentUpdatedAt ?? undefined,
728
+ preview: { kind: "document", label: "Document" },
729
+ }}
730
+ />
731
+ ),
732
+ },
733
+ ],
734
+ }}
714
735
  />
715
736
 
716
737
  <VersionHistoryPanel
@@ -189,7 +189,7 @@ export function Layout({ children }: LayoutProps) {
189
189
  )}
190
190
  <AgentSidebar
191
191
  position="right"
192
- defaultOpen={!isMobile && !isNarrowDesktop}
192
+ defaultOpen={false}
193
193
  agentPageHref="/agent"
194
194
  emptyStateText={t("chat.emptyState")}
195
195
  suggestions={[
@@ -1,4 +1,5 @@
1
1
  import { useT } from "@agent-native/core/client";
2
+ import { CreativeContextShareSheet } from "@agent-native/creative-context/client";
2
3
  import {
3
4
  SortableContext,
4
5
  useSortable,
@@ -114,6 +115,7 @@ export function DocumentTreeItem({
114
115
  const hasMenuActions = canEdit || canManage;
115
116
  const canCreateChild = canEdit && !isLocalFileNode;
116
117
  const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
118
+ const [contextSheetOpen, setContextSheetOpen] = useState(false);
117
119
  const indent = depth * 12 + 12;
118
120
  const rowWidth =
119
121
  sidebarWidth === undefined ? undefined : Math.max(0, sidebarWidth - 8);
@@ -250,6 +252,18 @@ export function DocumentTreeItem({
250
252
  </DropdownMenuItem>
251
253
  )}
252
254
  {canEdit && canManage && <DropdownMenuSeparator />}
255
+ {canEdit && !isLocalFileNode && (
256
+ <DropdownMenuItem
257
+ onSelect={(event) => {
258
+ event.preventDefault();
259
+ event.stopPropagation();
260
+ setContextSheetOpen(true);
261
+ }}
262
+ >
263
+ <IconPlus size={14} className="me-2" />
264
+ {t("creativeContext.addToContext" /* i18n-key-ignore */)}
265
+ </DropdownMenuItem>
266
+ )}
253
267
  {canManage && (
254
268
  <DropdownMenuItem
255
269
  className="text-destructive"
@@ -310,6 +324,21 @@ export function DocumentTreeItem({
310
324
  </div>
311
325
  </div>
312
326
 
327
+ <CreativeContextShareSheet
328
+ open={contextSheetOpen}
329
+ onOpenChange={setContextSheetOpen}
330
+ resource={{
331
+ appId: "content",
332
+ resourceType: "document",
333
+ resourceId: node.id,
334
+ title: node.title || "Untitled",
335
+ updatedAt: node.updatedAt,
336
+ visibility: node.visibility,
337
+ preview: { kind: "document", label: "Document" },
338
+ }}
339
+ canManage={canManage}
340
+ />
341
+
313
342
  {hasChildren && expanded && (
314
343
  <SortableContext
315
344
  items={node.children.map((child) => child.id)}
@@ -479,15 +479,6 @@ function PublicAgentShell({ children }: { children: React.ReactNode }) {
479
479
 
480
480
  useEffect(() => setMounted(true), []);
481
481
 
482
- useEffect(() => {
483
- if (!mounted) return;
484
- if (!window.matchMedia("(min-width: 768px)").matches) return;
485
- const id = window.setTimeout(() => {
486
- window.dispatchEvent(new Event("agent-panel:open"));
487
- }, 0);
488
- return () => window.clearTimeout(id);
489
- }, [mounted]);
490
-
491
482
  const content = <>{children}</>;
492
483
 
493
484
  if (!mounted) {
@@ -503,7 +494,7 @@ function PublicAgentShell({ children }: { children: React.ReactNode }) {
503
494
  return (
504
495
  <AgentSidebar
505
496
  position="right"
506
- defaultOpen
497
+ defaultOpen={false}
507
498
  defaultSidebarWidth={420}
508
499
  emptyStateText={t("chat.publicEmptyState")}
509
500
  suggestions={[
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-17
4
+ ---
5
+
6
+ Creating a database now completes reliably in hosted workspaces
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-17
4
+ ---
5
+
6
+ Library now flags published documents with newer versions and lets you submit the update in place.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-17
4
+ ---
5
+
6
+ Resources can be added to Creative Context from their action menus.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-17
4
+ ---
5
+
6
+ The agent chat sidebar stays closed until you open it or start a chat handoff.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-17
4
+ ---
5
+
6
+ You can add exact, approved artifact versions to governed Creative Contexts for safe reuse.
@@ -20,7 +20,7 @@ This generated matrix tracks whether high-value Content UI operations use the sa
20
20
  | sharing.document-discoverability-and-export | sharing | Share, hide from search, export, and reveal documents | action-backed | `export-document`, `reveal-local-source-file`, `set-document-discoverability`, `share-local-file-document` | `app/components/editor/DocumentToolbar.tsx`, `app/hooks/use-documents.ts` | Search discoverability, shareable copies, exports, and OS reveal requests are managed through Content actions. | - | - | P0 | covered | `actions/_local-file-documents.test.ts` | `local-file-source-truth` | - |
21
21
  | sharing.os-reveal-local-source | sharing | Reveal a local source file in the system file manager | host-only | `reveal-local-source-file` | `app/components/editor/DocumentToolbar.tsx`, `actions/reveal-local-source-file.ts` | - | OS reveal depends on trusted local host capabilities and should not spend agent tool surface or imply portable hosted behavior. | - | P2 | seeded | - | - | Local folder exception/docs PR |
22
22
  | sidebar.chrome-state | sidebar | Collapse sections and resize the sidebar | client-only-ephemeral | - | `app/components/sidebar/DocumentSidebar.tsx`, `app/components/layout/Layout.tsx` | - | - | - | P2 | none | - | - | - |
23
- | sidebar.document-tree-crud | sidebar | Create, delete, move, favorite, list, search, and open pages | action-backed | `create-document`, `delete-document`, `get-document`, `list-documents`, `move-document`, `search-documents`, `update-document` | `app/components/sidebar/DocumentSidebar.tsx`, `app/components/sidebar/DocumentTreeItem.tsx`, `app/hooks/use-documents.ts` | Document tree rows and document metadata are created, updated, deleted, moved, searched, or read. | - | - | P0 | covered | `actions/content-database-lifecycle.db.test.ts`, `actions/_local-file-documents.test.ts` | `document-search-edit` | - |
23
+ | sidebar.document-tree-crud | sidebar | Create, delete, move, favorite, list, search, and open pages | action-backed | `create-document`, `clone-creative-context-document`, `delete-document`, `get-document`, `list-documents`, `move-document`, `search-documents`, `update-document` | `app/components/sidebar/DocumentSidebar.tsx`, `app/components/sidebar/DocumentTreeItem.tsx`, `app/hooks/use-documents.ts` | Document tree rows and document metadata are created, updated, deleted, moved, searched, or read. | - | - | P0 | covered | `actions/content-database-lifecycle.db.test.ts`, `actions/_local-file-documents.test.ts` | `document-search-edit` | - |
24
24
  | sidebar.navigation-and-screen-context | sidebar | Navigate between documents and expose current screen context | action-equivalent | `navigate`, `view-screen` | `app/components/sidebar/DocumentSidebar.tsx`, `actions/navigate.ts`, `actions/view-screen.ts` | Application navigation state is updated or read so the agent can reason about the user's current page/view. | Human navigation is router-local, while agent navigation/screen inspection uses application-state actions to produce the same workspace orientation effect. | - | P1 | seeded | - | - | - |
25
25
  | source-sync.builder-body-hydration-worker | source-sync | Process queued Builder CMS body hydration work | action-backed | `process-builder-body-hydration` | `app/components/editor/DocumentEditor.tsx`, `app/components/editor/database/DatabaseView.tsx`, `app/hooks/use-content-database.ts` | Queued Builder body hydration entries are processed into readable Content document/database body state. | This action is intentionally hidden from the model with agentTool: false because it is an internal bounded queue worker; agents should use source refresh, review, and execution actions rather than manually driving hydration internals. | - | P0 | covered | `actions/_database-source-utils.test.ts` | - | - |
26
26
  | source-sync.builder-cms-review-and-write-gates | source-sync | Review, stage, validate, cancel, and execute Builder CMS source writes | action-backed | `cancel-prepared-builder-source-update`, `execute-builder-source-batch`, `execute-builder-source-execution`, `prepare-builder-source-execution`, `prepare-builder-source-review`, `preview-builder-source-review`, `review-content-database-source-change-set`, `set-content-database-source-write-mode`, `stage-builder-source-bulk-update`, `stage-builder-revision`, `validate-builder-source-execution` | `app/components/editor/DocumentDatabase.tsx`, `app/components/editor/database/DatabaseView.tsx`, `app/components/editor/database-sources/BuilderSourceReviewDialog.tsx` | Builder source write mode, staged reviews, pre-dispatch cancellations, validation records, and bounded execution records are created through guarded actions. | - | - | P0 | covered | `actions/builder-source-review-gates.db.test.ts`, `actions/cancel-prepared-builder-source-update.db.test.ts`, `actions/execute-builder-source-execution.test.ts`, `actions/stage-builder-source-bulk-update.db.test.ts` | `builder-source-review-readonly` | - |
@@ -17,6 +17,7 @@ export const parityMatrix: ParityRow[] = [
17
17
  status: "action-backed",
18
18
  actions: [
19
19
  "create-document",
20
+ "clone-creative-context-document",
20
21
  "delete-document",
21
22
  "get-document",
22
23
  "list-documents",