@agent-native/core 0.107.2 → 0.109.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 (502) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +24 -0
  3. package/corpus/core/docs/content/actions.mdx +48 -0
  4. package/corpus/core/docs/content/locales/ar-SA/actions.mdx +38 -0
  5. package/corpus/core/docs/content/locales/de-DE/actions.mdx +38 -0
  6. package/corpus/core/docs/content/locales/es-ES/actions.mdx +38 -0
  7. package/corpus/core/docs/content/locales/fr-FR/actions.mdx +38 -0
  8. package/corpus/core/docs/content/locales/hi-IN/actions.mdx +38 -0
  9. package/corpus/core/docs/content/locales/ja-JP/actions.mdx +38 -0
  10. package/corpus/core/docs/content/locales/ko-KR/actions.mdx +38 -0
  11. package/corpus/core/docs/content/locales/pt-BR/actions.mdx +38 -0
  12. package/corpus/core/docs/content/locales/zh-CN/actions.mdx +38 -0
  13. package/corpus/core/docs/content/locales/zh-TW/actions.mdx +38 -0
  14. package/corpus/core/package.json +5 -1
  15. package/corpus/core/src/a2a/client.ts +140 -17
  16. package/corpus/core/src/a2a/handlers.ts +60 -0
  17. package/corpus/core/src/a2a/index.ts +6 -1
  18. package/corpus/core/src/a2a/invoke.ts +68 -1
  19. package/corpus/core/src/a2a/server.ts +13 -1
  20. package/corpus/core/src/a2a/types.ts +16 -0
  21. package/corpus/core/src/a2a-claims.ts +52 -0
  22. package/corpus/core/src/action.ts +7 -2
  23. package/corpus/core/src/agent/production-agent.ts +10 -4
  24. package/corpus/core/src/audit/record.ts +6 -0
  25. package/corpus/core/src/client/AssistantChat.tsx +648 -603
  26. package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
  27. package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
  28. package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
  29. package/corpus/core/src/client/analytics.ts +84 -0
  30. package/corpus/core/src/client/chat/message-components.tsx +94 -22
  31. package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
  32. package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  33. package/corpus/core/src/client/chat-thread-url.ts +11 -0
  34. package/corpus/core/src/client/error-capture.ts +12 -0
  35. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
  36. package/corpus/core/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
  37. package/corpus/core/src/client/feature-flags/helpers.ts +77 -0
  38. package/corpus/core/src/client/feature-flags/index.ts +13 -0
  39. package/corpus/core/src/client/feature-flags/types.ts +29 -0
  40. package/corpus/core/src/client/feature-flags/use-feature-flag.ts +26 -0
  41. package/corpus/core/src/client/index.ts +13 -0
  42. package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
  43. package/corpus/core/src/client/session-replay.ts +31 -0
  44. package/corpus/core/src/extensions/actions.ts +2 -14
  45. package/corpus/core/src/extensions/routes.ts +1 -1
  46. package/corpus/core/src/extensions/store.ts +1 -1
  47. package/corpus/core/src/feature-flags/a2a-action-route.ts +56 -0
  48. package/corpus/core/src/feature-flags/actions/get-feature-flags.ts +24 -0
  49. package/corpus/core/src/feature-flags/actions/list-feature-flags.ts +69 -0
  50. package/corpus/core/src/feature-flags/actions/set-feature-flag.ts +89 -0
  51. package/corpus/core/src/feature-flags/index.ts +21 -0
  52. package/corpus/core/src/feature-flags/permissions.ts +53 -0
  53. package/corpus/core/src/feature-flags/plugin.ts +44 -0
  54. package/corpus/core/src/feature-flags/registry.ts +96 -0
  55. package/corpus/core/src/feature-flags/store.ts +176 -0
  56. package/corpus/core/src/index.ts +15 -0
  57. package/corpus/core/src/localization/default-messages.ts +50 -0
  58. package/corpus/core/src/mcp/build-server.ts +2 -2
  59. package/corpus/core/src/progress/actions.ts +4 -2
  60. package/corpus/core/src/provider-api/index.ts +205 -105
  61. package/corpus/core/src/scripts/call-agent.ts +137 -17
  62. package/corpus/core/src/server/action-discovery.ts +12 -0
  63. package/corpus/core/src/server/action-routes.ts +47 -5
  64. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +40 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +31 -0
  66. package/corpus/core/src/server/index.ts +1 -0
  67. package/corpus/core/src/settings/org-settings.ts +13 -0
  68. package/corpus/core/src/settings/store.ts +57 -0
  69. package/corpus/core/src/styles/agent-conversation.css +7 -0
  70. package/corpus/core/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  71. package/corpus/core/src/templates/default/AGENTS.md +1 -0
  72. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
  73. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
  74. package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
  75. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
  76. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  77. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
  78. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
  79. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
  80. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
  81. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
  82. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  83. package/corpus/core/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  84. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  85. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  86. package/corpus/core/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  87. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  88. package/corpus/core/src/templates/workspace-core/AGENTS.md +1 -1
  89. package/corpus/core/src/templates/workspace-root/AGENTS.md +1 -1
  90. package/corpus/core/src/vite/action-types-plugin.ts +12 -0
  91. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
  92. package/corpus/templates/analytics/.agents/skills/feature-flags/SKILL.md +169 -0
  93. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
  94. package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
  95. package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
  96. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
  97. package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
  98. package/corpus/templates/analytics/AGENTS.md +37 -16
  99. package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
  100. package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
  101. package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
  102. package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
  103. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
  104. package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
  105. package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
  106. package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
  107. package/corpus/templates/analytics/actions/list-workspace-feature-flags.ts +15 -0
  108. package/corpus/templates/analytics/actions/navigate.ts +2 -2
  109. package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
  110. package/corpus/templates/analytics/actions/set-workspace-feature-flag.ts +45 -0
  111. package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
  112. package/corpus/templates/analytics/actions/view-screen.ts +13 -0
  113. package/corpus/templates/analytics/app/components/agents/FeatureFlagsFleetPanel.tsx +243 -0
  114. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
  115. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +11 -3
  116. package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
  117. package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
  118. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +3 -1
  119. package/corpus/templates/analytics/app/i18n/zh-TW.ts +30 -0
  120. package/corpus/templates/analytics/app/i18n-data.ts +385 -0
  121. package/corpus/templates/analytics/app/pages/Agents.tsx +22 -2
  122. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
  123. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  124. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
  125. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
  126. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
  127. package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
  128. package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
  130. package/corpus/templates/analytics/changelog/2026-07-17-manage-feature-flag-rollouts-across-your-organization-s-apps.md +6 -0
  131. package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
  133. package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
  134. package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
  135. package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
  136. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
  137. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
  138. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +13 -5
  139. package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
  140. package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
  141. package/corpus/templates/analytics/server/lib/gong.ts +54 -66
  142. package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
  143. package/corpus/templates/analytics/server/lib/notion.ts +83 -8
  144. package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
  145. package/corpus/templates/analytics/server/lib/slack.ts +242 -90
  146. package/corpus/templates/analytics/server/lib/workspace-feature-flags.ts +347 -0
  147. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
  148. package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
  149. package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
  150. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
  151. package/corpus/templates/assets/.agents/skills/feature-flags/SKILL.md +169 -0
  152. package/corpus/templates/brain/.agents/skills/feature-flags/SKILL.md +169 -0
  153. package/corpus/templates/calendar/.agents/skills/feature-flags/SKILL.md +169 -0
  154. package/corpus/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  155. package/corpus/templates/clips/.agents/skills/feature-flags/SKILL.md +169 -0
  156. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
  157. package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
  158. package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
  159. package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
  160. package/corpus/templates/clips/app/entry.client.tsx +6 -1
  161. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
  162. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
  163. package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
  164. package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
  165. package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
  166. package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
  167. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
  168. package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
  169. package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
  170. package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
  171. package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
  172. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
  173. package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
  176. package/corpus/templates/clips/desktop/src/app.tsx +1 -1
  177. package/corpus/templates/clips/server/plugins/feature-flags.ts +11 -0
  178. package/corpus/templates/clips/shared/feature-flags.ts +30 -37
  179. package/corpus/templates/content/.agents/skills/feature-flags/SKILL.md +169 -0
  180. package/corpus/templates/content/app/entry.client.tsx +6 -1
  181. package/corpus/templates/design/.agents/skills/feature-flags/SKILL.md +169 -0
  182. package/corpus/templates/design/AGENTS.md +5 -3
  183. package/corpus/templates/design/actions/add-fusion-screens.ts +4 -6
  184. package/corpus/templates/design/actions/apply-fusion-edits.ts +4 -6
  185. package/corpus/templates/design/actions/create-fusion-app.ts +5 -4
  186. package/corpus/templates/design/actions/deploy-fusion-app.ts +4 -3
  187. package/corpus/templates/design/actions/get-fusion-deploy-status.ts +4 -6
  188. package/corpus/templates/design/actions/list-fusion-edits.ts +4 -3
  189. package/corpus/templates/design/actions/push-fusion-app.ts +4 -6
  190. package/corpus/templates/design/actions/queue-fusion-edit.ts +4 -3
  191. package/corpus/templates/design/actions/send-fusion-message.ts +4 -6
  192. package/corpus/templates/design/actions/sync-fusion-app.ts +4 -3
  193. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +1 -1
  194. package/corpus/templates/design/app/pages/Index.tsx +8 -6
  195. package/corpus/templates/design/server/plugins/feature-flags.ts +5 -0
  196. package/corpus/templates/design/shared/full-app.ts +10 -7
  197. package/corpus/templates/dispatch/.agents/skills/feature-flags/SKILL.md +169 -0
  198. package/corpus/templates/dispatch/AGENTS.md +5 -0
  199. package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
  200. package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
  201. package/corpus/templates/forms/.agents/skills/feature-flags/SKILL.md +169 -0
  202. package/corpus/templates/macros/.agents/skills/feature-flags/SKILL.md +169 -0
  203. package/corpus/templates/mail/.agents/skills/feature-flags/SKILL.md +169 -0
  204. package/corpus/templates/mail/app/entry.client.tsx +6 -1
  205. package/corpus/templates/plan/.agents/skills/feature-flags/SKILL.md +169 -0
  206. package/corpus/templates/slides/.agents/skills/feature-flags/SKILL.md +169 -0
  207. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
  208. package/corpus/templates/slides/.env.example +0 -1
  209. package/corpus/templates/slides/AGENTS.md +4 -0
  210. package/corpus/templates/slides/DEVELOPING.md +2 -2
  211. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  212. package/corpus/templates/slides/actions/logo-config.ts +6 -7
  213. package/corpus/templates/slides/actions/search-images.ts +11 -39
  214. package/corpus/templates/slides/actions/search-logos.ts +5 -52
  215. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
  216. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
  217. package/corpus/templates/slides/app/entry.client.tsx +6 -1
  218. package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
  219. package/corpus/templates/slides/server/register-secrets.ts +30 -0
  220. package/corpus/templates/tasks/.agents/skills/feature-flags/SKILL.md +169 -0
  221. package/dist/a2a/client.d.ts +38 -1
  222. package/dist/a2a/client.d.ts.map +1 -1
  223. package/dist/a2a/client.js +81 -12
  224. package/dist/a2a/client.js.map +1 -1
  225. package/dist/a2a/handlers.d.ts.map +1 -1
  226. package/dist/a2a/handlers.js +47 -0
  227. package/dist/a2a/handlers.js.map +1 -1
  228. package/dist/a2a/index.d.ts +4 -4
  229. package/dist/a2a/index.d.ts.map +1 -1
  230. package/dist/a2a/index.js +2 -2
  231. package/dist/a2a/index.js.map +1 -1
  232. package/dist/a2a/invoke.d.ts +26 -2
  233. package/dist/a2a/invoke.d.ts.map +1 -1
  234. package/dist/a2a/invoke.js +30 -1
  235. package/dist/a2a/invoke.js.map +1 -1
  236. package/dist/a2a/server.d.ts.map +1 -1
  237. package/dist/a2a/server.js +14 -1
  238. package/dist/a2a/server.js.map +1 -1
  239. package/dist/a2a/types.d.ts +12 -0
  240. package/dist/a2a/types.d.ts.map +1 -1
  241. package/dist/a2a/types.js.map +1 -1
  242. package/dist/a2a-claims.d.ts +10 -0
  243. package/dist/a2a-claims.d.ts.map +1 -0
  244. package/dist/a2a-claims.js +41 -0
  245. package/dist/a2a-claims.js.map +1 -0
  246. package/dist/action.d.ts +7 -2
  247. package/dist/action.d.ts.map +1 -1
  248. package/dist/action.js.map +1 -1
  249. package/dist/agent/production-agent.d.ts +5 -0
  250. package/dist/agent/production-agent.d.ts.map +1 -1
  251. package/dist/agent/production-agent.js +5 -3
  252. package/dist/agent/production-agent.js.map +1 -1
  253. package/dist/audit/record.d.ts +3 -0
  254. package/dist/audit/record.d.ts.map +1 -1
  255. package/dist/audit/record.js +3 -0
  256. package/dist/audit/record.js.map +1 -1
  257. package/dist/client/AssistantChat.d.ts +14 -1
  258. package/dist/client/AssistantChat.d.ts.map +1 -1
  259. package/dist/client/AssistantChat.js +158 -136
  260. package/dist/client/AssistantChat.js.map +1 -1
  261. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  262. package/dist/client/MultiTabAssistantChat.js +27 -4
  263. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  264. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  265. package/dist/client/agent-chat-adapter.js +21 -39
  266. package/dist/client/agent-chat-adapter.js.map +1 -1
  267. package/dist/client/agent-sidebar-state.d.ts +1 -0
  268. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  269. package/dist/client/agent-sidebar-state.js +4 -0
  270. package/dist/client/agent-sidebar-state.js.map +1 -1
  271. package/dist/client/analytics.d.ts +14 -0
  272. package/dist/client/analytics.d.ts.map +1 -1
  273. package/dist/client/analytics.js +67 -0
  274. package/dist/client/analytics.js.map +1 -1
  275. package/dist/client/chat/message-components.d.ts +8 -0
  276. package/dist/client/chat/message-components.d.ts.map +1 -1
  277. package/dist/client/chat/message-components.js +62 -19
  278. package/dist/client/chat/message-components.js.map +1 -1
  279. package/dist/client/chat/tool-call-display.d.ts +6 -0
  280. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  281. package/dist/client/chat/tool-call-display.js +83 -14
  282. package/dist/client/chat/tool-call-display.js.map +1 -1
  283. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
  284. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
  285. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
  286. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
  287. package/dist/client/chat-thread-url.d.ts +2 -0
  288. package/dist/client/chat-thread-url.d.ts.map +1 -0
  289. package/dist/client/chat-thread-url.js +12 -0
  290. package/dist/client/chat-thread-url.js.map +1 -0
  291. package/dist/client/error-capture.d.ts.map +1 -1
  292. package/dist/client/error-capture.js +7 -0
  293. package/dist/client/error-capture.js.map +1 -1
  294. package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
  295. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  296. package/dist/client/extensions/ExtensionSlot.js +28 -3
  297. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  298. package/dist/client/feature-flags/FeatureFlagsPanel.d.ts +10 -0
  299. package/dist/client/feature-flags/FeatureFlagsPanel.d.ts.map +1 -0
  300. package/dist/client/feature-flags/FeatureFlagsPanel.js +143 -0
  301. package/dist/client/feature-flags/FeatureFlagsPanel.js.map +1 -0
  302. package/dist/client/feature-flags/helpers.d.ts +16 -0
  303. package/dist/client/feature-flags/helpers.d.ts.map +1 -0
  304. package/dist/client/feature-flags/helpers.js +50 -0
  305. package/dist/client/feature-flags/helpers.js.map +1 -0
  306. package/dist/client/feature-flags/index.d.ts +5 -0
  307. package/dist/client/feature-flags/index.d.ts.map +1 -0
  308. package/dist/client/feature-flags/index.js +4 -0
  309. package/dist/client/feature-flags/index.js.map +1 -0
  310. package/dist/client/feature-flags/types.d.ts +27 -0
  311. package/dist/client/feature-flags/types.d.ts.map +1 -0
  312. package/dist/client/feature-flags/types.js +2 -0
  313. package/dist/client/feature-flags/types.js.map +1 -0
  314. package/dist/client/feature-flags/use-feature-flag.d.ts +8 -0
  315. package/dist/client/feature-flags/use-feature-flag.d.ts.map +1 -0
  316. package/dist/client/feature-flags/use-feature-flag.js +15 -0
  317. package/dist/client/feature-flags/use-feature-flag.js.map +1 -0
  318. package/dist/client/index.d.ts +2 -1
  319. package/dist/client/index.d.ts.map +1 -1
  320. package/dist/client/index.js +2 -1
  321. package/dist/client/index.js.map +1 -1
  322. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  323. package/dist/client/route-chunk-recovery.js +14 -9
  324. package/dist/client/route-chunk-recovery.js.map +1 -1
  325. package/dist/client/session-replay.d.ts +15 -0
  326. package/dist/client/session-replay.d.ts.map +1 -1
  327. package/dist/client/session-replay.js +20 -0
  328. package/dist/client/session-replay.js.map +1 -1
  329. package/dist/collab/struct-routes.d.ts +1 -1
  330. package/dist/extensions/actions.d.ts.map +1 -1
  331. package/dist/extensions/actions.js +2 -10
  332. package/dist/extensions/actions.js.map +1 -1
  333. package/dist/extensions/routes.d.ts.map +1 -1
  334. package/dist/extensions/routes.js +1 -1
  335. package/dist/extensions/routes.js.map +1 -1
  336. package/dist/extensions/store.js +1 -1
  337. package/dist/extensions/store.js.map +1 -1
  338. package/dist/feature-flags/a2a-action-route.d.ts +14 -0
  339. package/dist/feature-flags/a2a-action-route.d.ts.map +1 -0
  340. package/dist/feature-flags/a2a-action-route.js +50 -0
  341. package/dist/feature-flags/a2a-action-route.js.map +1 -0
  342. package/dist/feature-flags/actions/get-feature-flags.d.ts +3 -0
  343. package/dist/feature-flags/actions/get-feature-flags.d.ts.map +1 -0
  344. package/dist/feature-flags/actions/get-feature-flags.js +18 -0
  345. package/dist/feature-flags/actions/get-feature-flags.js.map +1 -0
  346. package/dist/feature-flags/actions/list-feature-flags.d.ts +28 -0
  347. package/dist/feature-flags/actions/list-feature-flags.d.ts.map +1 -0
  348. package/dist/feature-flags/actions/list-feature-flags.js +60 -0
  349. package/dist/feature-flags/actions/list-feature-flags.js.map +1 -0
  350. package/dist/feature-flags/actions/set-feature-flag.d.ts +26 -0
  351. package/dist/feature-flags/actions/set-feature-flag.d.ts.map +1 -0
  352. package/dist/feature-flags/actions/set-feature-flag.js +78 -0
  353. package/dist/feature-flags/actions/set-feature-flag.js.map +1 -0
  354. package/dist/feature-flags/index.d.ts +5 -0
  355. package/dist/feature-flags/index.d.ts.map +1 -0
  356. package/dist/feature-flags/index.js +5 -0
  357. package/dist/feature-flags/index.js.map +1 -0
  358. package/dist/feature-flags/permissions.d.ts +13 -0
  359. package/dist/feature-flags/permissions.d.ts.map +1 -0
  360. package/dist/feature-flags/permissions.js +37 -0
  361. package/dist/feature-flags/permissions.js.map +1 -0
  362. package/dist/feature-flags/plugin.d.ts +17 -0
  363. package/dist/feature-flags/plugin.d.ts.map +1 -0
  364. package/dist/feature-flags/plugin.js +29 -0
  365. package/dist/feature-flags/plugin.js.map +1 -0
  366. package/dist/feature-flags/registry.d.ts +23 -0
  367. package/dist/feature-flags/registry.d.ts.map +1 -0
  368. package/dist/feature-flags/registry.js +59 -0
  369. package/dist/feature-flags/registry.js.map +1 -0
  370. package/dist/feature-flags/store.d.ts +31 -0
  371. package/dist/feature-flags/store.d.ts.map +1 -0
  372. package/dist/feature-flags/store.js +124 -0
  373. package/dist/feature-flags/store.js.map +1 -0
  374. package/dist/index.d.ts +1 -0
  375. package/dist/index.d.ts.map +1 -1
  376. package/dist/index.js +1 -0
  377. package/dist/index.js.map +1 -1
  378. package/dist/localization/default-messages.d.ts +45 -0
  379. package/dist/localization/default-messages.d.ts.map +1 -1
  380. package/dist/localization/default-messages.js +45 -0
  381. package/dist/localization/default-messages.js.map +1 -1
  382. package/dist/mcp/build-server.d.ts +2 -0
  383. package/dist/mcp/build-server.d.ts.map +1 -1
  384. package/dist/mcp/build-server.js +2 -2
  385. package/dist/mcp/build-server.js.map +1 -1
  386. package/dist/notifications/routes.d.ts +2 -2
  387. package/dist/progress/actions.d.ts.map +1 -1
  388. package/dist/progress/actions.js +3 -2
  389. package/dist/progress/actions.js.map +1 -1
  390. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  391. package/dist/provider-api/index.d.ts.map +1 -1
  392. package/dist/provider-api/index.js +91 -8
  393. package/dist/provider-api/index.js.map +1 -1
  394. package/dist/resources/handlers.d.ts +3 -3
  395. package/dist/scripts/call-agent.d.ts.map +1 -1
  396. package/dist/scripts/call-agent.js +107 -16
  397. package/dist/scripts/call-agent.js.map +1 -1
  398. package/dist/server/action-discovery.d.ts.map +1 -1
  399. package/dist/server/action-discovery.js +12 -0
  400. package/dist/server/action-discovery.js.map +1 -1
  401. package/dist/server/action-routes.d.ts +3 -0
  402. package/dist/server/action-routes.d.ts.map +1 -1
  403. package/dist/server/action-routes.js +45 -5
  404. package/dist/server/action-routes.js.map +1 -1
  405. package/dist/server/agent-chat/action-filters-a2a.d.ts +6 -0
  406. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  407. package/dist/server/agent-chat/action-filters-a2a.js +27 -0
  408. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  409. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  410. package/dist/server/agent-chat-plugin.js +27 -1
  411. package/dist/server/agent-chat-plugin.js.map +1 -1
  412. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  413. package/dist/server/index.d.ts +1 -0
  414. package/dist/server/index.d.ts.map +1 -1
  415. package/dist/server/index.js +1 -0
  416. package/dist/server/index.js.map +1 -1
  417. package/dist/server/transcribe-voice.d.ts +1 -1
  418. package/dist/settings/org-settings.d.ts +2 -0
  419. package/dist/settings/org-settings.d.ts.map +1 -1
  420. package/dist/settings/org-settings.js +5 -1
  421. package/dist/settings/org-settings.js.map +1 -1
  422. package/dist/settings/store.d.ts +8 -0
  423. package/dist/settings/store.d.ts.map +1 -1
  424. package/dist/settings/store.js +48 -0
  425. package/dist/settings/store.js.map +1 -1
  426. package/dist/styles/agent-conversation.css +7 -0
  427. package/dist/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  428. package/dist/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  429. package/dist/templates/default/AGENTS.md +1 -0
  430. package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
  431. package/dist/templates/default/app/i18n/de-DE.ts +20 -0
  432. package/dist/templates/default/app/i18n/en-US.ts +20 -0
  433. package/dist/templates/default/app/i18n/es-ES.ts +20 -0
  434. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  435. package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
  436. package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
  437. package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
  438. package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
  439. package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
  440. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  441. package/dist/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  442. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  443. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  444. package/dist/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  445. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  446. package/dist/templates/workspace-core/AGENTS.md +1 -1
  447. package/dist/templates/workspace-root/AGENTS.md +1 -1
  448. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  449. package/dist/vite/action-types-plugin.js +12 -0
  450. package/dist/vite/action-types-plugin.js.map +1 -1
  451. package/docs/content/actions.mdx +48 -0
  452. package/docs/content/locales/ar-SA/actions.mdx +38 -0
  453. package/docs/content/locales/de-DE/actions.mdx +38 -0
  454. package/docs/content/locales/es-ES/actions.mdx +38 -0
  455. package/docs/content/locales/fr-FR/actions.mdx +38 -0
  456. package/docs/content/locales/hi-IN/actions.mdx +38 -0
  457. package/docs/content/locales/ja-JP/actions.mdx +38 -0
  458. package/docs/content/locales/ko-KR/actions.mdx +38 -0
  459. package/docs/content/locales/pt-BR/actions.mdx +38 -0
  460. package/docs/content/locales/zh-CN/actions.mdx +38 -0
  461. package/docs/content/locales/zh-TW/actions.mdx +38 -0
  462. package/package.json +5 -1
  463. package/src/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  464. package/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  465. package/src/templates/default/AGENTS.md +1 -0
  466. package/src/templates/default/app/i18n/ar-SA.ts +20 -0
  467. package/src/templates/default/app/i18n/de-DE.ts +20 -0
  468. package/src/templates/default/app/i18n/en-US.ts +20 -0
  469. package/src/templates/default/app/i18n/es-ES.ts +20 -0
  470. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  471. package/src/templates/default/app/i18n/hi-IN.ts +19 -0
  472. package/src/templates/default/app/i18n/ja-JP.ts +20 -0
  473. package/src/templates/default/app/i18n/ko-KR.ts +19 -0
  474. package/src/templates/default/app/i18n/pt-BR.ts +20 -0
  475. package/src/templates/default/app/i18n/zh-CN.ts +19 -0
  476. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  477. package/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  478. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  479. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  480. package/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  481. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  482. package/src/templates/workspace-core/AGENTS.md +1 -1
  483. package/src/templates/workspace-root/AGENTS.md +1 -1
  484. package/corpus/templates/analytics/server/handlers/github.ts +0 -200
  485. package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
  486. package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
  487. package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
  488. package/corpus/templates/analytics/server/lib/github.ts +0 -660
  489. package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
  490. package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
  491. package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
  492. package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
  493. package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
  494. package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
  495. package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
  496. package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
  497. package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
  498. package/corpus/templates/clips/actions/get-feature-flags.ts +0 -30
  499. package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
  500. package/corpus/templates/slides/actions/image-search.ts +0 -64
  501. package/corpus/templates/slides/actions/import-github.ts +0 -182
  502. package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
@@ -0,0 +1,169 @@
1
+ ---
2
+ name: feature-flags
3
+ description: >-
4
+ Declare, evaluate, manage, and remove framework feature flags. Use when
5
+ shipping a capability gradually, targeting users or organizations, or
6
+ replacing a compile-time rollout switch with a production-safe runtime flag.
7
+ scope: dev
8
+ metadata:
9
+ internal: true
10
+ ---
11
+
12
+ # Feature Flags
13
+
14
+ A feature flag is a boolean declared in app code, evaluated locally by Core,
15
+ and managed from the Analytics fleet control plane. Code owns whether a flag
16
+ exists. Runtime settings own only its rollout state.
17
+
18
+ Flags let an app deploy dormant code and turn it on in the real environment
19
+ without another deployment. They are not experiments: do not add variants,
20
+ hypotheses, conversion metrics, exposure tracking, or lifecycle states.
21
+
22
+ ## When to use one
23
+
24
+ Use a flag for a reversible rollout of a user-facing capability whose dormant
25
+ code is safe to deploy. Flags are useful for production dogfooding, exact-user
26
+ or organization pilots, and deterministic percentage rollouts.
27
+
28
+ Do not use a flag for authentication, authorization, secrets, audit enablement,
29
+ SSR cache behavior, or another security boundary. Client hiding is presentation
30
+ only; every guarded server action must evaluate the same registered flag.
31
+
32
+ ## Agent workflow
33
+
34
+ ### 1. Declare
35
+
36
+ Keep definitions in a shared TypeScript module so server and client code use the
37
+ same stable key. Flags are boolean and default-off.
38
+
39
+ ```ts
40
+ import { defineFeatureFlag } from "@agent-native/core/feature-flags";
41
+
42
+ export const FULL_APP_BUILDING = defineFeatureFlag({
43
+ key: "full-app-building",
44
+ displayName: "Full app building",
45
+ description: "Create and edit Fusion-backed applications.",
46
+ });
47
+ ```
48
+
49
+ Keys are immutable, never reused, and contain only letters, numbers, dots,
50
+ underscores, or hyphens. Prefer a concise app-owned name. Do not create flag
51
+ definitions or rollout rows from Analytics.
52
+
53
+ ### 2. Register
54
+
55
+ Register app definitions from a Nitro plugin before actions are discovered.
56
+ Do not add app-specific flags to a Core registry.
57
+
58
+ ```ts
59
+ import { createFeatureFlagsPlugin } from "@agent-native/core/server";
60
+
61
+ import { FULL_APP_BUILDING } from "../../shared/feature-flags.js";
62
+
63
+ export default createFeatureFlagsPlugin({ flags: [FULL_APP_BUILDING] });
64
+ ```
65
+
66
+ ### 3. Guard server and client
67
+
68
+ The server action is the enforcement boundary:
69
+
70
+ ```ts
71
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
72
+
73
+ run: async (args, ctx) => {
74
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
75
+ throw new Error("Full app building is not enabled for this account.");
76
+ }
77
+ // guarded operation
78
+ }
79
+ ```
80
+
81
+ Use the client hook only to hide or reveal hydrated UI:
82
+
83
+ ```tsx
84
+ import { useFeatureFlag } from "@agent-native/core/client";
85
+
86
+ const enabled = useFeatureFlag(FULL_APP_BUILDING.key);
87
+ return enabled ? <FullAppOption /> : null;
88
+ ```
89
+
90
+ The client hook intentionally returns false while loading or for an unknown
91
+ flag. Never replace that fail-closed behavior with app-local bucketing or a
92
+ compile-time fallback. Never evaluate personalized flags in the public SSR
93
+ shell; it is shared and cached for every visitor.
94
+
95
+ ### 4. Verify and roll out
96
+
97
+ 1. Verify the off path before changing rollout state.
98
+ 2. Confirm the registered flag appears in **Analytics → Feature flags** for the
99
+ app and is Off by default.
100
+ 3. Use **Enable for me** for initial production dogfood.
101
+ 4. Expand to exact emails, organization IDs, or a percentage only from
102
+ Analytics.
103
+ 5. Confirm the client presentation and authoritative server action agree.
104
+
105
+ ## Management contract
106
+
107
+ Core mounts three actions in registered apps:
108
+
109
+ | Action | Purpose |
110
+ | --- | --- |
111
+ | `get-feature-flags` | Return the current caller's evaluated boolean values. |
112
+ | `list-feature-flags` | Return definitions and rollout metadata to an authorized operator. |
113
+ | `set-feature-flag` | Atomically turn a flag off, enable it for the operator, or replace targeting rules. |
114
+
115
+ Analytics calls the app-local operator actions through narrowly scoped A2A
116
+ delegation. Tokens require an exact audience, organization, scope, operator
117
+ role, and audit correlation id. Management is permission-checked and audited
118
+ by the target app. Never manage flags through generic settings routes, raw SQL,
119
+ or per-app toggle UIs.
120
+
121
+ ## Rollout semantics
122
+
123
+ The operator modes are **Off**, **Targeted**, and **Everyone**. Core stores them
124
+ as `off`, `rules`, and `on`.
125
+
126
+ Targeted rules combine exact normalized emails, exact organization IDs, and a
127
+ percentage with OR semantics. Exact matches are checked first. Percentage
128
+ buckets use Core's stable hash of the flag key and authenticated user identity;
129
+ anonymous callers fail closed. Raising a percentage preserves the users already
130
+ included at a lower percentage. Do not implement bucketing in app code.
131
+
132
+ Unknown definitions, missing state, malformed state, storage errors, and
133
+ evaluation errors all return the code default (`false` in v1). Explicit Off
134
+ wins over every target; Everyone enables every authenticated caller.
135
+
136
+ ## Remove a flag
137
+
138
+ After a rollout is permanent:
139
+
140
+ 1. Replace guarded branches with the chosen behavior.
141
+ 2. Delete the server and client gates.
142
+ 3. Delete the definition and registration entry.
143
+ 4. Verify the flag disappears from the Analytics fleet.
144
+ 5. Remove stale tests and rollout instructions.
145
+
146
+ A permanent flag is just an if statement with a pension plan.
147
+
148
+ ## Verification checklist
149
+
150
+ - Unknown and unregistered keys evaluate false.
151
+ - UI hiding and server enforcement use the same registered key.
152
+ - Exact-user, organization, deterministic percentage, Everyone, and Off paths
153
+ have focused tests.
154
+ - Increasing a percentage is monotonic; anonymous percentage evaluation is off.
155
+ - Unauthorized callers cannot list targeting details or mutate flags.
156
+ - Mutations are atomic, read back stored state, emit refresh, and appear in the
157
+ audit log with the flag key.
158
+ - Analytics represents ready, no-definition, unsupported, forbidden, legacy,
159
+ and unreachable directory apps honestly.
160
+ - Future agents can find this skill from root `AGENTS.md`, and
161
+ `pnpm guard:workspace-skills` passes after syncing generated copies.
162
+
163
+ ## Related skills
164
+
165
+ - **adding-a-feature** — preserve UI/action/instruction/application-state parity
166
+ - **actions** — define and call guarded app operations
167
+ - **audit-log** — inspect automatic action mutation history
168
+ - **reliable-mutations** — make rollout changes atomic and provable
169
+ - **security** — keep security controls out of feature flags
@@ -261,7 +261,8 @@ patterns live in `.agents/skills/`.
261
261
  `connect-localhost`; list them with `list-localhost-connections` before
262
262
  creating or resolving local-code artboards. Fusion designs are full-app
263
263
  designs backed by a running Builder Fusion container, created via
264
- `create-fusion-app` when `FULL_APP_BUILDING_ENABLED` is on; preserve the
264
+ `create-fusion-app` when the `full-app-building` feature flag is enabled;
265
+ preserve the
265
266
  design's `fusionApp` linkage data whenever present and never invent it.
266
267
  - Localhost route manifests are scaffolding for URL-backed Flow Canvas
267
268
  artboards. Use `add-localhost-screens` to place routes or path/query states as
@@ -431,8 +432,9 @@ patterns live in `.agents/skills/`.
431
432
 
432
433
  ## Full App Building
433
434
 
434
- Flag-gated (`FULL_APP_BUILDING_ENABLED` in `shared/full-app.ts`, default off)
435
- and requires Builder connected. See `full-app-build` skill for the full flow.
435
+ Flag-gated by `FULL_APP_BUILDING` in `shared/full-app.ts` (key
436
+ `full-app-building`, default off) and requires Builder connected. See
437
+ `full-app-build` skill for the full flow.
436
438
 
437
439
  - `create-fusion-app`: creates the app branch via the Builder cloud agent; one
438
440
  branch per design; returns existing linkage if already created.
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  import { defineAction } from "@agent-native/core";
11
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
11
12
  import { assertAccess } from "@agent-native/core/sharing";
12
13
  import { z } from "zod";
13
14
 
@@ -18,10 +19,7 @@ import {
18
19
  DEFAULT_FUSION_SCREEN_WIDTH,
19
20
  upsertFusionScreens,
20
21
  } from "../server/lib/fusion-screens.js";
21
- import {
22
- FULL_APP_BUILDING_ENABLED,
23
- readFusionApp,
24
- } from "../shared/full-app.js";
22
+ import { FULL_APP_BUILDING, readFusionApp } from "../shared/full-app.js";
25
23
 
26
24
  export default defineAction({
27
25
  description:
@@ -49,8 +47,8 @@ export default defineAction({
49
47
  .optional()
50
48
  .describe("Iframe viewport height. Defaults to 900."),
51
49
  }),
52
- run: async ({ designId, paths, width, height }) => {
53
- if (!FULL_APP_BUILDING_ENABLED) {
50
+ run: async ({ designId, paths, width, height }, ctx) => {
51
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
54
52
  throw new Error("Full app building is not enabled");
55
53
  }
56
54
 
@@ -10,6 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineAction } from "@agent-native/core";
13
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
13
14
  import { sendFusionBranchMessage } from "@agent-native/core/server";
14
15
  import { getRequestUserEmail } from "@agent-native/core/server/request-context";
15
16
  import { assertAccess } from "@agent-native/core/sharing";
@@ -19,10 +20,7 @@ import { z } from "zod";
19
20
 
20
21
  import { getDb, schema } from "../server/db/index.js";
21
22
  import "../server/db/index.js"; // ensure registerShareableResource runs
22
- import {
23
- FULL_APP_BUILDING_ENABLED,
24
- readFusionApp,
25
- } from "../shared/full-app.js";
23
+ import { FULL_APP_BUILDING, readFusionApp } from "../shared/full-app.js";
26
24
 
27
25
  function parseTarget(raw: string | null): Record<string, unknown> | null {
28
26
  if (!raw) return null;
@@ -72,8 +70,8 @@ export default defineAction({
72
70
  "Omit to apply all pending edits for this design.",
73
71
  ),
74
72
  }),
75
- run: async ({ designId, editIds }) => {
76
- if (!FULL_APP_BUILDING_ENABLED) {
73
+ run: async ({ designId, editIds }, ctx) => {
74
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
77
75
  throw new Error("Full app building is not enabled");
78
76
  }
79
77
 
@@ -7,13 +7,14 @@
7
7
  * necessarily ready immediately — call `sync-fusion-app` to poll the
8
8
  * container and pick up the preview URL once it boots.
9
9
  *
10
- * Gated behind `FULL_APP_BUILDING_ENABLED`. When Builder is not configured
10
+ * Gated behind the full-app-building runtime feature flag. When Builder is not configured
11
11
  * (no credentials or no branch project ID), returns the same graceful
12
12
  * `{ status: "not-configured", cta, message }` shape as
13
13
  * `migrate-inline-design-to-app` instead of throwing.
14
14
  */
15
15
 
16
16
  import { defineAction } from "@agent-native/core";
17
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
17
18
  import {
18
19
  runBuilderAgent,
19
20
  resolveBuilderBranchProjectId,
@@ -27,7 +28,7 @@ import "../server/db/index.js"; // ensure registerShareableResource runs
27
28
  import { mutateDesignData } from "../server/lib/design-data-mutation.js";
28
29
  import { resolveBuilderStatus } from "../shared/builder-app.js";
29
30
  import {
30
- FULL_APP_BUILDING_ENABLED,
31
+ FULL_APP_BUILDING,
31
32
  readFusionApp,
32
33
  writeFusionApp,
33
34
  } from "../shared/full-app.js";
@@ -73,8 +74,8 @@ export default defineAction({
73
74
  "Optional branch name for the Builder agent to use. If omitted, Builder generates one.",
74
75
  ),
75
76
  }),
76
- run: async ({ designId, prompt, branchName }) => {
77
- if (!FULL_APP_BUILDING_ENABLED) {
77
+ run: async ({ designId, prompt, branchName }, ctx) => {
78
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
78
79
  throw new Error("Full app building is not enabled");
79
80
  }
80
81
 
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  import { defineAction } from "@agent-native/core";
14
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
14
15
  import {
15
16
  deployFusionProject,
16
17
  getFusionHostingUrl,
@@ -23,7 +24,7 @@ import { schema } from "../server/db/index.js";
23
24
  import "../server/db/index.js"; // ensure registerShareableResource runs
24
25
  import { mutateDesignData } from "../server/lib/design-data-mutation.js";
25
26
  import {
26
- FULL_APP_BUILDING_ENABLED,
27
+ FULL_APP_BUILDING,
27
28
  readFusionApp,
28
29
  writeFusionApp,
29
30
  } from "../shared/full-app.js";
@@ -58,8 +59,8 @@ export default defineAction({
58
59
  "use the design's already-reserved slug, or derive one from the title.",
59
60
  ),
60
61
  }),
61
- run: async ({ designId, slug }) => {
62
- if (!FULL_APP_BUILDING_ENABLED) {
62
+ run: async ({ designId, slug }, ctx) => {
63
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
63
64
  throw new Error("Full app building is not enabled");
64
65
  }
65
66
 
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { defineAction } from "@agent-native/core";
9
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
9
10
  import { getFusionDeploys } from "@agent-native/core/server";
10
11
  import { accessFilter } from "@agent-native/core/sharing";
11
12
  import { and, eq } from "drizzle-orm";
@@ -13,10 +14,7 @@ import { z } from "zod";
13
14
 
14
15
  import { getDb, schema } from "../server/db/index.js";
15
16
  import "../server/db/index.js"; // ensure registerShareableResource runs
16
- import {
17
- FULL_APP_BUILDING_ENABLED,
18
- readFusionApp,
19
- } from "../shared/full-app.js";
17
+ import { FULL_APP_BUILDING, readFusionApp } from "../shared/full-app.js";
20
18
 
21
19
  function asString(value: unknown): string | undefined {
22
20
  return typeof value === "string" && value.trim() ? value.trim() : undefined;
@@ -33,8 +31,8 @@ export default defineAction({
33
31
  }),
34
32
  readOnly: true,
35
33
  http: { method: "GET" },
36
- run: async ({ designId }) => {
37
- if (!FULL_APP_BUILDING_ENABLED) {
34
+ run: async ({ designId }, ctx) => {
35
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
38
36
  throw new Error("Full app building is not enabled");
39
37
  }
40
38
 
@@ -8,13 +8,14 @@
8
8
  */
9
9
 
10
10
  import { defineAction } from "@agent-native/core";
11
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
11
12
  import { accessFilter } from "@agent-native/core/sharing";
12
13
  import { and, asc, eq } from "drizzle-orm";
13
14
  import { z } from "zod";
14
15
 
15
16
  import { getDb, schema } from "../server/db/index.js";
16
17
  import "../server/db/index.js"; // ensure registerShareableResource runs
17
- import { FULL_APP_BUILDING_ENABLED } from "../shared/full-app.js";
18
+ import { FULL_APP_BUILDING } from "../shared/full-app.js";
18
19
 
19
20
  function parseTarget(raw: string | null): Record<string, unknown> | null {
20
21
  if (!raw) return null;
@@ -43,8 +44,8 @@ export default defineAction({
43
44
  }),
44
45
  readOnly: true,
45
46
  http: { method: "GET" },
46
- run: async ({ designId, status }) => {
47
- if (!FULL_APP_BUILDING_ENABLED) {
47
+ run: async ({ designId, status }, ctx) => {
48
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
48
49
  throw new Error("Full app building is not enabled");
49
50
  }
50
51
 
@@ -7,16 +7,14 @@
7
7
  */
8
8
 
9
9
  import { defineAction } from "@agent-native/core";
10
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
10
11
  import { pushFusionBranch } from "@agent-native/core/server";
11
12
  import { assertAccess } from "@agent-native/core/sharing";
12
13
  import { z } from "zod";
13
14
 
14
15
  import { schema } from "../server/db/index.js";
15
16
  import "../server/db/index.js"; // ensure registerShareableResource runs
16
- import {
17
- FULL_APP_BUILDING_ENABLED,
18
- readFusionApp,
19
- } from "../shared/full-app.js";
17
+ import { FULL_APP_BUILDING, readFusionApp } from "../shared/full-app.js";
20
18
 
21
19
  function asString(value: unknown): string | undefined {
22
20
  return typeof value === "string" && value.trim() ? value.trim() : undefined;
@@ -31,8 +29,8 @@ export default defineAction({
31
29
  schema: z.object({
32
30
  designId: z.string().describe("Design project ID backed by a fusion app."),
33
31
  }),
34
- run: async ({ designId }) => {
35
- if (!FULL_APP_BUILDING_ENABLED) {
32
+ run: async ({ designId }, ctx) => {
33
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
36
34
  throw new Error("Full app building is not enabled");
37
35
  }
38
36
 
@@ -10,6 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineAction } from "@agent-native/core";
13
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
13
14
  import {
14
15
  getRequestOrgId,
15
16
  getRequestUserEmail,
@@ -21,7 +22,7 @@ import { z } from "zod";
21
22
 
22
23
  import { getDb, schema } from "../server/db/index.js";
23
24
  import "../server/db/index.js"; // ensure registerShareableResource runs
24
- import { FULL_APP_BUILDING_ENABLED } from "../shared/full-app.js";
25
+ import { FULL_APP_BUILDING } from "../shared/full-app.js";
25
26
 
26
27
  const targetSchema = z.object({
27
28
  selector: z
@@ -63,8 +64,8 @@ export default defineAction({
63
64
  .optional()
64
65
  .describe("Optional target context for the element/screen being edited."),
65
66
  }),
66
- run: async ({ designId, instruction, screenFileId, target }) => {
67
- if (!FULL_APP_BUILDING_ENABLED) {
67
+ run: async ({ designId, instruction, screenFileId, target }, ctx) => {
68
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
68
69
  throw new Error("Full app building is not enabled");
69
70
  }
70
71
 
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  import { defineAction } from "@agent-native/core";
14
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
14
15
  import { sendFusionBranchMessage } from "@agent-native/core/server";
15
16
  import { getRequestUserEmail } from "@agent-native/core/server/request-context";
16
17
  import { assertAccess } from "@agent-native/core/sharing";
@@ -18,10 +19,7 @@ import { z } from "zod";
18
19
 
19
20
  import { schema } from "../server/db/index.js";
20
21
  import "../server/db/index.js"; // ensure registerShareableResource runs
21
- import {
22
- FULL_APP_BUILDING_ENABLED,
23
- readFusionApp,
24
- } from "../shared/full-app.js";
22
+ import { FULL_APP_BUILDING, readFusionApp } from "../shared/full-app.js";
25
23
 
26
24
  export default defineAction({
27
25
  description:
@@ -38,8 +36,8 @@ export default defineAction({
38
36
  .min(1)
39
37
  .describe("The message to send to the app's coding agent."),
40
38
  }),
41
- run: async ({ designId, prompt }) => {
42
- if (!FULL_APP_BUILDING_ENABLED) {
39
+ run: async ({ designId, prompt }, ctx) => {
40
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
43
41
  throw new Error("Full app building is not enabled");
44
42
  }
45
43
 
@@ -10,6 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineAction } from "@agent-native/core";
13
+ import { isFeatureFlagEnabled } from "@agent-native/core/feature-flags";
13
14
  import { ensureFusionContainer } from "@agent-native/core/server";
14
15
  import { assertAccess } from "@agent-native/core/sharing";
15
16
  import { and, count, eq } from "drizzle-orm";
@@ -24,7 +25,7 @@ import {
24
25
  upsertFusionScreens,
25
26
  } from "../server/lib/fusion-screens.js";
26
27
  import {
27
- FULL_APP_BUILDING_ENABLED,
28
+ FULL_APP_BUILDING,
28
29
  parseDesignDataBlob,
29
30
  readFusionApp,
30
31
  writeFusionApp,
@@ -70,8 +71,8 @@ export default defineAction({
70
71
  "Defaults to the design's existing fusion screen paths, or ['/'] if none exist.",
71
72
  ),
72
73
  }),
73
- run: async ({ designId, paths }) => {
74
- if (!FULL_APP_BUILDING_ENABLED) {
74
+ run: async ({ designId, paths }, ctx) => {
75
+ if (!(await isFeatureFlagEnabled(FULL_APP_BUILDING, ctx))) {
75
76
  throw new Error("Full app building is not enabled");
76
77
  }
77
78
 
@@ -1182,7 +1182,7 @@ function PromptAttachmentMenu({
1182
1182
  /**
1183
1183
  * Compact segmented "Design" / "Full app" pill selector shown in the new-design
1184
1184
  * popover title row. Only rendered by the caller when full-app building is
1185
- * flag-enabled (see FULL_APP_BUILDING_ENABLED in shared/full-app.ts) — when
1185
+ * flag-enabled by the Design page — when
1186
1186
  * absent the popover renders with no mode control at all.
1187
1187
  */
1188
1188
  function CreationModeToggle({
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  useActionQuery,
3
3
  useActionMutation,
4
+ useFeatureFlag,
4
5
  useT,
5
6
  } from "@agent-native/core/client";
6
7
  import type { PromptComposerSubmitOptions } from "@agent-native/core/client";
@@ -13,7 +14,7 @@ import {
13
14
  useSetHeaderActions,
14
15
  useSetPageTitle,
15
16
  } from "@agent-native/toolkit/app-shell";
16
- import { FULL_APP_BUILDING_ENABLED } from "@shared/full-app";
17
+ import { FULL_APP_BUILDING } from "@shared/full-app";
17
18
  import { derivePromptTitle } from "@shared/prompt-title";
18
19
  import {
19
20
  IconChecks,
@@ -96,13 +97,14 @@ export default function Index() {
96
97
  () => new Set(),
97
98
  );
98
99
  const [showNewPrompt, setShowNewPrompt] = useState(false);
100
+ const fullAppBuildingEnabled = useFeatureFlag(FULL_APP_BUILDING.key);
99
101
  const [newDesignHandoffPending, setNewDesignHandoffPending] = useState(false);
100
102
  const [newDesignSystemId, setNewDesignSystemId] = useState<
101
103
  string | null | undefined
102
104
  >(undefined);
103
105
  const [newTemplateId, setNewTemplateId] = useState<string | null>(null);
104
106
  // "Design" (default, inline prototype) vs "Full app" (Builder Fusion
105
- // cloud container). Only reachable behind FULL_APP_BUILDING_ENABLED — the
107
+ // cloud container). Only reachable behind the full-app-building flag — the
106
108
  // popover renders no mode control at all when the flag is off, so this
107
109
  // state is always "design" in that case.
108
110
  const [newDesignMode, setNewDesignMode] = useState<"design" | "app">(
@@ -136,7 +138,7 @@ export default function Index() {
136
138
  "create-design-from-template",
137
139
  );
138
140
  // Fires the fusion-backed cloud container build; only ever called when
139
- // FULL_APP_BUILDING_ENABLED is true and the user picked "Full app".
141
+ // runtime flag is true and the user picked "Full app".
140
142
  const createFusionAppMutation = useActionMutation("create-fusion-app");
141
143
  const deleteMutation = useActionMutation("delete-design");
142
144
  const duplicateMutation = useActionMutation("duplicate-design");
@@ -482,7 +484,7 @@ export default function Index() {
482
484
  const { id, title, ready } = createDesign(derivedTitle, designSystemId);
483
485
  handleGenerateDesignTitle(id, prompt, title);
484
486
 
485
- if (FULL_APP_BUILDING_ENABLED && newDesignMode === "app") {
487
+ if (fullAppBuildingEnabled && newDesignMode === "app") {
486
488
  // Full-app designs are backed by a real running container, not a
487
489
  // queued inline generation — skip writePendingGeneration and let the
488
490
  // fusion app mutation (and its own status/progress banner in the
@@ -1030,9 +1032,9 @@ export default function Index() {
1030
1032
  handleNewPromptOpenChange(false);
1031
1033
  navigate("/design-systems/setup");
1032
1034
  }}
1033
- creationMode={FULL_APP_BUILDING_ENABLED ? newDesignMode : undefined}
1035
+ creationMode={fullAppBuildingEnabled ? newDesignMode : undefined}
1034
1036
  onCreationModeChange={
1035
- FULL_APP_BUILDING_ENABLED ? setNewDesignMode : undefined
1037
+ fullAppBuildingEnabled ? setNewDesignMode : undefined
1036
1038
  }
1037
1039
  />
1038
1040
 
@@ -0,0 +1,5 @@
1
+ import { createFeatureFlagsPlugin } from "@agent-native/core/server";
2
+
3
+ import { FULL_APP_BUILDING } from "../../shared/full-app.js";
4
+
5
+ export default createFeatureFlagsPlugin({ flags: [FULL_APP_BUILDING] });
@@ -13,16 +13,19 @@
13
13
  * a design as app-backed.
14
14
  */
15
15
 
16
+ import { defineFeatureFlag } from "@agent-native/core/feature-flags";
17
+
16
18
  /**
17
- * Master switch for full app building in the Design app.
18
- *
19
- * Deliberately a plain code boolean for now: flip to `true` to expose the
20
- * "Full app" creation option and enable the fusion app actions. Builder
19
+ * Runtime rollout for full app building in the Design app. Builder
21
20
  * credentials plus a branch project id (DISPATCH_BUILDER_PROJECT_ID /
22
- * BUILDER_BRANCH_PROJECT_ID / BUILDER_PROJECT_ID) are still required at
23
- * runtime without them the actions return the standard connect CTA.
21
+ * BUILDER_BRANCH_PROJECT_ID / BUILDER_PROJECT_ID) remain separate setup
22
+ * requirements; without them the actions return the standard connect CTA.
24
23
  */
25
- export const FULL_APP_BUILDING_ENABLED = false;
24
+ export const FULL_APP_BUILDING = defineFeatureFlag({
25
+ key: "full-app-building",
26
+ displayName: "Full app building",
27
+ description: "Create and edit Builder Fusion-backed applications.",
28
+ });
26
29
 
27
30
  export type DesignFusionAppStatus = "building" | "ready" | "error";
28
31