@agent-native/core 0.141.7 → 0.144.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 (371) hide show
  1. package/agent-native.eject.json +9 -0
  2. package/corpus/README.md +1 -1
  3. package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +19 -0
  4. package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +296 -0
  5. package/corpus/templates/analytics/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  6. package/corpus/templates/analytics/.agents/skills/turn-into-skill/SKILL.md +112 -0
  7. package/corpus/templates/analytics/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  8. package/corpus/templates/analytics/AGENTS.md +35 -38
  9. package/corpus/templates/analytics/actions/ensure-native-v2-dashboards.ts +1 -1
  10. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +17 -22
  11. package/corpus/templates/analytics/actions/migrate-first-party-analytics-to-bigquery.ts +1 -1
  12. package/corpus/templates/analytics/actions/navigate.ts +4 -5
  13. package/corpus/templates/analytics/actions/provider-api-register.ts +50 -0
  14. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +44 -11
  15. package/corpus/templates/analytics/actions/test-custom-api-connection.ts +106 -0
  16. package/corpus/templates/analytics/app/components/CustomApiCard.tsx +430 -0
  17. package/corpus/templates/analytics/app/i18n-data.ts +680 -0
  18. package/corpus/templates/analytics/app/lib/native-mcp-exclusions.ts +6 -0
  19. package/corpus/templates/analytics/app/lib/sql-query.ts +33 -6
  20. package/corpus/templates/analytics/app/pages/DataSources.tsx +4 -0
  21. package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-load-reliably-during-background-data-sw.md +6 -0
  22. package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-remain-responsive-while-historical-data.md +6 -0
  23. package/corpus/templates/analytics/changelog/2026-08-06-analytics-query-results-now-render-as-a-table-with-csv-downl.md +6 -0
  24. package/corpus/templates/analytics/changelog/2026-08-06-connect-public-https-custom-apis-and-hand-tested-endpoints-t.md +6 -0
  25. package/corpus/templates/analytics/changelog/2026-08-06-durable-agent-worker-memory.md +6 -0
  26. package/corpus/templates/analytics/changelog/2026-08-06-live-dashboard-panels-use-the-shared-query-timeout.md +6 -0
  27. package/corpus/templates/analytics/changelog/2026-08-06-on-demand-billing-is-available-as-a-native-dashboard-with-ta.md +6 -0
  28. package/corpus/templates/analytics/changelog/2026-08-06-visible-dashboard-names-are-unique.md +6 -0
  29. package/corpus/templates/analytics/netlify.toml +7 -0
  30. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +4 -0
  31. package/corpus/templates/analytics/server/db/index.ts +27 -0
  32. package/corpus/templates/analytics/server/db/schema.ts +10 -0
  33. package/corpus/templates/analytics/server/lib/dashboards-store.ts +227 -60
  34. package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +156 -45
  35. package/corpus/templates/analytics/server/lib/native-v2-dashboards.ts +227 -1
  36. package/corpus/templates/analytics/server/plugins/agent-chat.ts +5 -0
  37. package/corpus/templates/analytics/server/plugins/analytics-rollup-backfill-jobs.ts +1 -0
  38. package/corpus/templates/analytics/server/plugins/db.ts +52 -18
  39. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +28 -2
  40. package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +16 -1
  41. package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +296 -0
  42. package/corpus/templates/assets/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  43. package/corpus/templates/assets/.agents/skills/turn-into-skill/SKILL.md +112 -0
  44. package/corpus/templates/assets/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  45. package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +296 -0
  46. package/corpus/templates/brain/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  47. package/corpus/templates/brain/.agents/skills/turn-into-skill/SKILL.md +112 -0
  48. package/corpus/templates/brain/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  49. package/corpus/templates/brain/actions/list-connection-providers.ts +24 -3
  50. package/corpus/templates/brain/app/lib/dispatch-links.ts +44 -0
  51. package/corpus/templates/brain/app/routes/sources.tsx +15 -7
  52. package/corpus/templates/brain/changelog/2026-08-06-brain-provider-setup-links-open-dispatch-correctly-in-standa.md +6 -0
  53. package/corpus/templates/brain/server/plugins/agent-chat.ts +1 -0
  54. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +26 -0
  55. package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +296 -0
  56. package/corpus/templates/calendar/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  57. package/corpus/templates/calendar/.agents/skills/turn-into-skill/SKILL.md +112 -0
  58. package/corpus/templates/calendar/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  59. package/corpus/templates/calendar/AGENTS.md +11 -32
  60. package/corpus/templates/calendar/actions/update-event.ts +107 -1
  61. package/corpus/templates/calendar/app/components/calendar/EventCalendarSelect.tsx +83 -0
  62. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +57 -0
  63. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +59 -73
  64. package/corpus/templates/calendar/app/hooks/use-events.ts +4 -1
  65. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  66. package/corpus/templates/calendar/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
  67. package/corpus/templates/calendar/changelog/2026-08-06-existing-events-can-move-between-connected-google-account-ca.md +6 -0
  68. package/corpus/templates/calendar/server/lib/google-calendar.ts +101 -0
  69. package/corpus/templates/calendar/server/plugins/agent-chat.ts +7 -1
  70. package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
  71. package/corpus/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  72. package/corpus/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
  73. package/corpus/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  74. package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +296 -0
  75. package/corpus/templates/clips/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  76. package/corpus/templates/clips/.agents/skills/turn-into-skill/SKILL.md +112 -0
  77. package/corpus/templates/clips/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  78. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +9 -24
  79. package/corpus/templates/clips/app/components/editor/timeline-geometry.ts +15 -0
  80. package/corpus/templates/clips/app/components/editor/waveform.tsx +4 -17
  81. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +14 -3
  82. package/corpus/templates/clips/app/components/player/player-controls.tsx +0 -3
  83. package/corpus/templates/clips/app/components/player/scrubber.tsx +2 -33
  84. package/corpus/templates/clips/app/components/player/video-player.tsx +58 -11
  85. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +28 -38
  86. package/corpus/templates/clips/app/routes/share.$shareId.tsx +21 -27
  87. package/corpus/templates/clips/changelog/2026-08-06-clips-recovers-from-stalled-recording-setup-without-requirin.md +6 -0
  88. package/corpus/templates/clips/changelog/2026-08-06-clips-starts-faster-after-a-deploy-or-idle-period-startup-no.md +6 -0
  89. package/corpus/templates/clips/changelog/2026-08-06-deleting-a-recording-returns-cleanly-to-the-library-and-fit-.md +6 -0
  90. package/corpus/templates/clips/changelog/2026-08-06-hide-clip-insights-from-viewers-without-analytics-access.md +6 -0
  91. package/corpus/templates/clips/changelog/2026-08-06-trimmed-clips-play-on-a-clean-timeline-without-cut-markers.md +6 -0
  92. package/corpus/templates/clips/desktop/src/app.tsx +48 -20
  93. package/corpus/templates/clips/desktop/src/lib/recorder.ts +275 -74
  94. package/corpus/templates/clips/desktop/src/lib/recording-start-guard.ts +84 -0
  95. package/corpus/templates/clips/desktop/src/overlays/toolbar.tsx +14 -4
  96. package/corpus/templates/clips/server/plugins/db.ts +214 -26
  97. package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +296 -0
  98. package/corpus/templates/content/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  99. package/corpus/templates/content/.agents/skills/turn-into-skill/SKILL.md +112 -0
  100. package/corpus/templates/content/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  101. package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +296 -0
  102. package/corpus/templates/crm/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  103. package/corpus/templates/crm/.agents/skills/turn-into-skill/SKILL.md +112 -0
  104. package/corpus/templates/crm/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  105. package/corpus/templates/crm/changelog/2026-08-06-crm-starts-faster-after-a-deploy-or-idle-period-one-time-dat.md +6 -0
  106. package/corpus/templates/crm/server/plugins/db.ts +11 -8
  107. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +36 -1
  108. package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +296 -0
  109. package/corpus/templates/design/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  110. package/corpus/templates/design/.agents/skills/turn-into-skill/SKILL.md +112 -0
  111. package/corpus/templates/design/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  112. package/corpus/templates/design/actions/import-from-url.ts +1 -1
  113. package/corpus/templates/design/app/components/design/LayersPanel.tsx +27 -18
  114. package/corpus/templates/design/app/pages/Index.tsx +6 -2
  115. package/corpus/templates/design/changelog/2026-08-05-deleting-a-design-from-the-home-page-no-longer-leaves-the-ap.md +6 -0
  116. package/corpus/templates/design/changelog/2026-08-05-renaming-a-layer-now-focuses-its-name-field-automatically.md +6 -0
  117. package/corpus/templates/design/server/plugins/agent-chat.ts +2 -0
  118. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +296 -0
  119. package/corpus/templates/dispatch/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  120. package/corpus/templates/dispatch/.agents/skills/turn-into-skill/SKILL.md +112 -0
  121. package/corpus/templates/dispatch/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  122. package/corpus/templates/dispatch/AGENTS.md +8 -1
  123. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +1 -0
  124. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +30 -15
  125. package/corpus/templates/dispatch/app/i18n-data.ts +131 -0
  126. package/corpus/templates/dispatch/app/routes/admin._index.tsx +4 -0
  127. package/corpus/templates/dispatch/app/routes/admin.agents.tsx +1 -0
  128. package/corpus/templates/dispatch/app/routes/admin.approvals.tsx +1 -0
  129. package/corpus/templates/dispatch/app/routes/admin.apps.$appId.tsx +1 -0
  130. package/corpus/templates/dispatch/app/routes/admin.apps.tsx +1 -0
  131. package/corpus/templates/dispatch/app/routes/admin.audit.tsx +1 -0
  132. package/corpus/templates/dispatch/app/routes/admin.automations.tsx +1 -0
  133. package/corpus/templates/dispatch/app/routes/admin.destinations.tsx +4 -0
  134. package/corpus/templates/dispatch/app/routes/admin.dreams.tsx +1 -0
  135. package/corpus/templates/dispatch/app/routes/admin.identities.tsx +1 -0
  136. package/corpus/templates/dispatch/app/routes/admin.integrations.tsx +4 -0
  137. package/corpus/templates/dispatch/app/routes/admin.messaging.tsx +1 -0
  138. package/corpus/templates/dispatch/app/routes/admin.metrics.tsx +1 -0
  139. package/corpus/templates/dispatch/app/routes/admin.new-app.tsx +1 -0
  140. package/corpus/templates/dispatch/app/routes/admin.operations.tsx +1 -0
  141. package/corpus/templates/dispatch/app/routes/admin.thread-debug.tsx +4 -0
  142. package/corpus/templates/dispatch/app/routes/admin.transactional-email.$appId.$id.tsx +4 -0
  143. package/corpus/templates/dispatch/app/routes/admin.transactional-email.tsx +4 -0
  144. package/corpus/templates/dispatch/app/routes/admin.tsx +1 -0
  145. package/corpus/templates/dispatch/app/routes/admin.vault.tsx +1 -0
  146. package/corpus/templates/dispatch/app/routes/admin.workspace.tsx +1 -0
  147. package/corpus/templates/dispatch/changelog/2026-08-06-dispatch-keeps-everyday-navigation-focused-while-management-.md +6 -0
  148. package/corpus/templates/dispatch/changelog/2026-08-06-ready-workspace-apps-stay-one-click-away-in-a-compact-dispat.md +6 -0
  149. package/corpus/templates/dispatch/changelog/2026-08-06-shared-vault-values-and-management-are-now-restricted-to-wor.md +6 -0
  150. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +296 -0
  151. package/corpus/templates/factory/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  152. package/corpus/templates/factory/.agents/skills/turn-into-skill/SKILL.md +112 -0
  153. package/corpus/templates/factory/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  154. package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +296 -0
  155. package/corpus/templates/forms/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  156. package/corpus/templates/forms/.agents/skills/turn-into-skill/SKILL.md +112 -0
  157. package/corpus/templates/forms/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  158. package/corpus/templates/forms/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
  159. package/corpus/templates/forms/server/plugins/agent-chat.ts +4 -0
  160. package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +296 -0
  161. package/corpus/templates/macros/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  162. package/corpus/templates/macros/.agents/skills/turn-into-skill/SKILL.md +112 -0
  163. package/corpus/templates/macros/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  164. package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +296 -0
  165. package/corpus/templates/mail/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  166. package/corpus/templates/mail/.agents/skills/turn-into-skill/SKILL.md +112 -0
  167. package/corpus/templates/mail/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  168. package/corpus/templates/mail/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
  169. package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
  170. package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +296 -0
  171. package/corpus/templates/plan/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  172. package/corpus/templates/plan/.agents/skills/turn-into-skill/SKILL.md +112 -0
  173. package/corpus/templates/plan/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  174. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +48 -5
  175. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +37 -1
  176. package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +6 -0
  177. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +15 -2
  178. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +29 -24
  179. package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +296 -0
  180. package/corpus/templates/slides/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  181. package/corpus/templates/slides/.agents/skills/turn-into-skill/SKILL.md +112 -0
  182. package/corpus/templates/slides/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  183. package/corpus/templates/slides/AGENTS.md +17 -21
  184. package/corpus/templates/slides/_gitignore +1 -0
  185. package/corpus/templates/slides/actions/export-pptx.ts +470 -36
  186. package/corpus/templates/slides/actions/get-deck.ts +12 -0
  187. package/corpus/templates/slides/actions/import-file.ts +175 -139
  188. package/corpus/templates/slides/actions/import-google-slides-reference.ts +271 -12
  189. package/corpus/templates/slides/actions/import-pptx.ts +193 -68
  190. package/corpus/templates/slides/actions/patch-deck.ts +51 -0
  191. package/corpus/templates/slides/actions/update-slide.ts +29 -3
  192. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +10 -13
  193. package/corpus/templates/slides/app/components/editor/AddSlidePopover.tsx +5 -1
  194. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +25 -12
  195. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +112 -57
  196. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +202 -0
  197. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +26 -14
  198. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +173 -0
  199. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +182 -141
  200. package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +1 -0
  201. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +18 -0
  202. package/corpus/templates/slides/app/components/editor/slide-text-targets.ts +85 -0
  203. package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -0
  204. package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +15 -0
  205. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +27 -1
  206. package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
  207. package/corpus/templates/slides/app/lib/create-deck-generation.ts +72 -11
  208. package/corpus/templates/slides/app/lib/deck-preview-frame.ts +15 -0
  209. package/corpus/templates/slides/app/lib/deck-share-links.ts +9 -0
  210. package/corpus/templates/slides/app/lib/export-pptx-client.ts +89 -0
  211. package/corpus/templates/slides/app/lib/import-uploaded-deck.ts +89 -0
  212. package/corpus/templates/slides/app/lib/slide-animation-elements.ts +3 -0
  213. package/corpus/templates/slides/app/pages/Index.tsx +172 -15
  214. package/corpus/templates/slides/changelog/2026-08-06-clicking-the-gray-canvas-around-a-slide-clears-its-selection.md +6 -0
  215. package/corpus/templates/slides/changelog/2026-08-06-deck-thumbnails-keep-a-consistent-listing-frame-across-aspec.md +6 -0
  216. package/corpus/templates/slides/changelog/2026-08-06-deep-linked-decks-open-directly-instead-of-being-interrupted.md +6 -0
  217. package/corpus/templates/slides/changelog/2026-08-06-google-slides-exports-now-show-clear-import-steps-when-direc.md +6 -0
  218. package/corpus/templates/slides/changelog/2026-08-06-import-pdf-google-slides-and-powerpoint-decks-directly-from-.md +6 -0
  219. package/corpus/templates/slides/changelog/2026-08-06-imported-powerpoint-exports-keep-text-and-images-editable-an.md +6 -0
  220. package/corpus/templates/slides/changelog/2026-08-06-presentation-prompts-continue-adding-rendered-slides-until-t.md +6 -0
  221. package/corpus/templates/slides/changelog/2026-08-06-public-decks-now-share-read-only-presentation-links-by-defau.md +6 -0
  222. package/corpus/templates/slides/changelog/2026-08-06-slides-offers-a-direct-connect-google-button-when-a-drive-co.md +6 -0
  223. package/corpus/templates/slides/changelog/2026-08-06-slides-preserve-uploaded-pdf-layouts-accept-larger-reference.md +6 -0
  224. package/corpus/templates/slides/changelog/2026-08-06-styled-words-stay-part-of-their-text-box-instead-of-becoming.md +6 -0
  225. package/corpus/templates/slides/changelog/2026-08-06-uploaded-decks-keep-their-slides-and-visuals-when-you-improv.md +6 -0
  226. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +7 -20
  227. package/corpus/templates/slides/server/handlers/import/html-converter.ts +247 -13
  228. package/corpus/templates/slides/server/handlers/import/pptx-assets.ts +67 -0
  229. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +2 -0
  230. package/corpus/templates/slides/server/handlers/uploads.ts +7 -3
  231. package/corpus/templates/slides/server/lib/chat-attachments.ts +7 -4
  232. package/corpus/templates/slides/server/lib/emails.ts +7 -2
  233. package/corpus/templates/slides/server/lib/google-docs-error.ts +50 -0
  234. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +1 -0
  235. package/corpus/templates/slides/server/lib/import-asset-storage.ts +127 -0
  236. package/corpus/templates/slides/server/lib/source-import.ts +167 -0
  237. package/corpus/templates/slides/server/plugins/agent-chat.ts +12 -3
  238. package/corpus/templates/slides/server/routes/api/import-assets/[token].get.ts +70 -0
  239. package/corpus/templates/slides/shared/upload-types.ts +3 -0
  240. package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +296 -0
  241. package/corpus/templates/tasks/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  242. package/corpus/templates/tasks/.agents/skills/turn-into-skill/SKILL.md +112 -0
  243. package/corpus/templates/tasks/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  244. package/dist/agent/production-agent.d.ts +17 -0
  245. package/dist/agent/production-agent.js +72 -1
  246. package/dist/cli/agent-plugin.d.ts +112 -0
  247. package/dist/cli/agent-plugin.js +1081 -0
  248. package/dist/cli/app-skill.js +39 -1
  249. package/dist/cli/code-agent-executor.d.ts +3 -0
  250. package/dist/cli/code-agent-executor.js +51 -13
  251. package/dist/cli/index.js +13 -0
  252. package/dist/cli/templates-meta.js +1 -1
  253. package/dist/client/AgentPanel.d.ts +3 -1
  254. package/dist/client/AgentPanel.js +9 -2
  255. package/dist/client/AssistantChat.d.ts +8 -0
  256. package/dist/client/AssistantChat.js +23 -8
  257. package/dist/client/NewWorkspaceAppFlow.js +1 -0
  258. package/dist/client/agent-chat-adapter.js +123 -4
  259. package/dist/client/assistant-ui-recovery.d.ts +2 -1
  260. package/dist/client/assistant-ui-recovery.js +7 -3
  261. package/dist/client/onboarding/FirstRunOnboarding.js +11 -4
  262. package/dist/client/org/TeamPage.js +1 -1
  263. package/dist/client/require-session.js +1 -1
  264. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  265. package/dist/client/resources/McpConnectionSuggestion.js +27 -10
  266. package/dist/client/resources/McpIntegrationDialog.js +77 -45
  267. package/dist/client/resources/mcp-integration-catalog.d.ts +13 -1
  268. package/dist/client/resources/mcp-integration-catalog.js +255 -2
  269. package/dist/client/resources/mcp-integration-logos.js +18 -2
  270. package/dist/client/settings/AccountSettingsCard.js +2 -1
  271. package/dist/collab/struct-routes.d.ts +1 -1
  272. package/dist/db/client.d.ts +9 -0
  273. package/dist/db/client.js +51 -16
  274. package/dist/db/create-get-db.js +2 -2
  275. package/dist/db/ddl-guard.d.ts +11 -10
  276. package/dist/db/ddl-guard.js +40 -12
  277. package/dist/deploy/build.d.ts +2 -0
  278. package/dist/deploy/build.js +97 -4
  279. package/dist/deploy/workspace-deploy.js +0 -2
  280. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  281. package/dist/guards/no-env-credentials.js +9 -0
  282. package/dist/ingestion/index.d.ts +1 -1
  283. package/dist/ingestion/pptx.d.ts +68 -0
  284. package/dist/ingestion/pptx.js +660 -213
  285. package/dist/integrations/plugin.js +9 -6
  286. package/dist/jobs/scheduler.js +79 -23
  287. package/dist/localization/default-messages.d.ts +54 -0
  288. package/dist/localization/default-messages.js +57 -2
  289. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  290. package/dist/mcp-client/oauth-routes.d.ts +2 -0
  291. package/dist/mcp-client/oauth-routes.js +73 -6
  292. package/dist/observability/routes.d.ts +5 -5
  293. package/dist/onboarding/app-profile.js +11 -0
  294. package/dist/progress/routes.d.ts +1 -1
  295. package/dist/resources/handlers.d.ts +1 -1
  296. package/dist/resources/store.js +15 -1
  297. package/dist/scripts/call-agent.js +34 -4
  298. package/dist/secrets/routes.d.ts +3 -3
  299. package/dist/server/agent-chat/action-filters-a2a.d.ts +1 -1
  300. package/dist/server/agent-chat/action-filters-a2a.js +36 -1
  301. package/dist/server/agent-chat-plugin.js +29 -8
  302. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  303. package/dist/server/auth.js +47 -11
  304. package/dist/server/better-auth-instance.js +5 -3
  305. package/dist/server/core-routes-plugin.d.ts +8 -1
  306. package/dist/server/core-routes-plugin.js +28 -3
  307. package/dist/server/credential-provider.d.ts +3 -3
  308. package/dist/server/credential-provider.js +90 -4
  309. package/dist/server/onboarding-html.d.ts +2 -0
  310. package/dist/server/onboarding-html.js +115 -29
  311. package/dist/server/realtime-token.d.ts +1 -1
  312. package/dist/server/self-dispatch.d.ts +5 -4
  313. package/dist/server/self-dispatch.js +25 -14
  314. package/dist/server/ssr-handler.d.ts +1 -1
  315. package/dist/server/ssr-handler.js +1 -1
  316. package/dist/server/transcribe-voice.d.ts +1 -1
  317. package/dist/shared/cache-control.d.ts +26 -2
  318. package/dist/shared/cache-control.js +43 -2
  319. package/dist/shared/password-policy.d.ts +3 -0
  320. package/dist/shared/password-policy.js +3 -0
  321. package/dist/sharing/actions/set-resource-visibility.js +16 -4
  322. package/dist/sharing/registry.d.ts +14 -0
  323. package/dist/styles/agent-native.css +6 -0
  324. package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
  325. package/dist/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  326. package/dist/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
  327. package/dist/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  328. package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
  329. package/dist/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  330. package/dist/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
  331. package/dist/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  332. package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
  333. package/dist/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  334. package/dist/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
  335. package/dist/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  336. package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
  337. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
  338. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
  339. package/dist/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  340. package/dist/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
  341. package/dist/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  342. package/dist/templates/workspace-root/AGENTS.md +7 -0
  343. package/dist/user-profile/actions/change-password.js +8 -3
  344. package/dist/user-profile/actions/set-password.js +5 -1
  345. package/dist/vite/action-types-plugin.js +59 -0
  346. package/docs/content/creating-templates.mdx +1 -1
  347. package/docs/content/getting-started-actions.mdx +38 -189
  348. package/docs/content/getting-started-database.mdx +80 -164
  349. package/docs/content/getting-started-pages.mdx +44 -155
  350. package/docs/content/getting-started.mdx +26 -106
  351. package/docs/content/skills-guide.mdx +13 -0
  352. package/package.json +6 -2
  353. package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
  354. package/src/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  355. package/src/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
  356. package/src/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  357. package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
  358. package/src/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  359. package/src/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
  360. package/src/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  361. package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
  362. package/src/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  363. package/src/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
  364. package/src/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  365. package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
  366. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
  367. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
  368. package/src/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  369. package/src/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
  370. package/src/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  371. package/src/templates/workspace-root/AGENTS.md +7 -0
@@ -0,0 +1,167 @@
1
+ export type SourceImportFormat = "pdf" | "pptx";
2
+
3
+ export interface SourceImportSlideSnapshot {
4
+ id: string;
5
+ text: string;
6
+ notes: string;
7
+ imageUrls: string[];
8
+ editableText: boolean;
9
+ }
10
+
11
+ export interface SourceImportMetadata {
12
+ mode: "source-preserving";
13
+ format: SourceImportFormat;
14
+ fidelity: "source-faithful" | "partial";
15
+ importedAt: string;
16
+ slideCount: number;
17
+ slideIds: string[];
18
+ slides: SourceImportSlideSnapshot[];
19
+ imagesSkipped?: number;
20
+ }
21
+
22
+ export function buildSourceImportMetadata(args: {
23
+ format: SourceImportFormat;
24
+ importedAt?: string;
25
+ slides: SourceImportSlideSnapshot[];
26
+ imagesSkipped?: number;
27
+ }): SourceImportMetadata {
28
+ const importedAt = args.importedAt ?? new Date().toISOString();
29
+ const imagesSkipped = args.imagesSkipped ?? 0;
30
+ return {
31
+ mode: "source-preserving",
32
+ format: args.format,
33
+ fidelity: imagesSkipped > 0 ? "partial" : "source-faithful",
34
+ importedAt,
35
+ slideCount: args.slides.length,
36
+ slideIds: args.slides.map((slide) => slide.id),
37
+ slides: args.slides,
38
+ ...(imagesSkipped > 0 ? { imagesSkipped } : {}),
39
+ };
40
+ }
41
+
42
+ export function mergeSourceImportMetadata(
43
+ existing: SourceImportMetadata | null,
44
+ incoming: SourceImportMetadata,
45
+ ): SourceImportMetadata {
46
+ if (!existing) return incoming;
47
+ if (existing.format !== incoming.format) {
48
+ throw new Error(
49
+ `Cannot append a ${incoming.format.toUpperCase()} source import to a ${existing.format.toUpperCase()} source-imported deck. Import matching source formats separately so every slide keeps its provenance.`,
50
+ );
51
+ }
52
+
53
+ const slidesById = new Map<string, SourceImportSlideSnapshot>();
54
+ for (const slide of existing.slides) slidesById.set(slide.id, slide);
55
+ for (const slide of incoming.slides) slidesById.set(slide.id, slide);
56
+ const slides = [...slidesById.values()];
57
+ const imagesSkipped =
58
+ (existing.imagesSkipped ?? 0) + (incoming.imagesSkipped ?? 0);
59
+
60
+ return {
61
+ ...incoming,
62
+ fidelity:
63
+ existing.fidelity === "partial" || incoming.fidelity === "partial"
64
+ ? "partial"
65
+ : "source-faithful",
66
+ slideCount: slides.length,
67
+ slideIds: slides.map((slide) => slide.id),
68
+ slides,
69
+ ...(imagesSkipped > 0 ? { imagesSkipped } : {}),
70
+ };
71
+ }
72
+
73
+ export function sourceImportForDeck(
74
+ value: unknown,
75
+ ): SourceImportMetadata | null {
76
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
77
+ const record = value as Partial<SourceImportMetadata>;
78
+ if (
79
+ record.mode !== "source-preserving" ||
80
+ (record.format !== "pdf" && record.format !== "pptx") ||
81
+ !Array.isArray(record.slides)
82
+ ) {
83
+ return null;
84
+ }
85
+ return record as SourceImportMetadata;
86
+ }
87
+
88
+ function extractImageUrls(content: string): string[] {
89
+ const urls: string[] = [];
90
+ const seen = new Set<string>();
91
+ const imagePattern = /<img\b[^>]*\bsrc=["']([^"']+)["'][^>]*>/gi;
92
+ for (const match of content.matchAll(imagePattern)) {
93
+ const url = match[1]
94
+ ?.replace(/&amp;/g, "&")
95
+ .replace(/&quot;/g, '"')
96
+ .trim();
97
+ if (url && !seen.has(url)) {
98
+ seen.add(url);
99
+ urls.push(url);
100
+ }
101
+ }
102
+ return urls;
103
+ }
104
+
105
+ function sourceWords(value: string): Set<string> {
106
+ return new Set(
107
+ value
108
+ .toLowerCase()
109
+ .match(/[a-z0-9][a-z0-9'-]{3,}/g)
110
+ ?.map((word) => word.replace(/^['-]+|['-]+$/g, "")) ?? [],
111
+ );
112
+ }
113
+
114
+ /**
115
+ * Protects an imported deck from the common "make it prettier" failure mode:
116
+ * the agent replaces a source slide with a generic card and silently drops the
117
+ * original artwork or most of its factual copy. Explicit rewrite requests can
118
+ * opt out with preserveSource=false.
119
+ */
120
+ export function assertSourceSlidePreserved(args: {
121
+ metadata: SourceImportMetadata | null;
122
+ slideId: string;
123
+ nextContent?: string;
124
+ nextNotes?: string;
125
+ preserveSource?: boolean;
126
+ }): void {
127
+ if (args.preserveSource === false || !args.metadata) return;
128
+ const snapshot = args.metadata.slides.find(
129
+ (slide) => slide.id === args.slideId,
130
+ );
131
+ if (!snapshot) return;
132
+
133
+ if (
134
+ args.nextNotes !== undefined &&
135
+ snapshot.notes.length > 0 &&
136
+ args.nextNotes !== snapshot.notes
137
+ ) {
138
+ throw new Error(
139
+ `Source-preserving edit would remove or change imported speaker notes on slide ${args.slideId}. Preserve the source notes, or pass preserveSource=false only when the user explicitly asks for a rewrite.`,
140
+ );
141
+ }
142
+
143
+ if (args.nextContent === undefined) return;
144
+
145
+ const nextImageUrls = new Set(extractImageUrls(args.nextContent));
146
+ const missingImages = snapshot.imageUrls.filter(
147
+ (url) => !nextImageUrls.has(url),
148
+ );
149
+ if (missingImages.length > 0) {
150
+ throw new Error(
151
+ `Source-preserving edit would remove ${missingImages.length} original image(s) from slide ${args.slideId}. Keep every existing source image, or pass preserveSource=false only when the user explicitly asks for a rewrite.`,
152
+ );
153
+ }
154
+
155
+ if (!snapshot.editableText) return;
156
+ const originalWords = sourceWords(snapshot.text);
157
+ if (originalWords.size < 12) return;
158
+ const nextWords = sourceWords(args.nextContent.replace(/<[^>]+>/g, " "));
159
+ const retainedWords = [...originalWords].filter((word) =>
160
+ nextWords.has(word),
161
+ ).length;
162
+ if (retainedWords / originalWords.size < 0.35) {
163
+ throw new Error(
164
+ `Source-preserving edit would drop most of the original factual copy from slide ${args.slideId}. Preserve the source text, or pass preserveSource=false only when the user explicitly asks for a rewrite.`,
165
+ );
166
+ }
167
+ }
@@ -15,12 +15,13 @@ const INITIAL_TOOL_NAMES = [
15
15
  "get-layout-overflows",
16
16
  "list-decks",
17
17
  "get-deck",
18
+ "get-design-system",
19
+ "get-workspace-defaults",
18
20
  "get-deck-reference-context",
19
21
  "create-deck",
20
22
  "add-slide",
21
23
  "update-slide",
22
24
  "patch-deck",
23
- "generate-slides-ai",
24
25
  "generate-image-api",
25
26
  "import-file",
26
27
  "import-google-doc",
@@ -49,7 +50,13 @@ export default createAgentChatPlugin({
49
50
  codeExecution: { production: "sandboxed" },
50
51
  resolveOrgId: async (event) => (await getOrgContext(event)).orgId,
51
52
  prepareRequest: prepareSlidesChatAttachments,
52
- systemPrompt: `You are an AI deck assistant. You create, edit, import, export, style, share, and navigate decks through actions and shared application state.
53
+ systemPrompt: `You are an AI deck assistant. You create, edit, import, export, style, share, and navigate decks through actions and shared application state. For a newly created presentation, use create-deck with slides: [] only when you are creating the deck yourself, then add-slide sequentially with full rendered HTML. The legacy generate-slides-ai action returns Markdown drafts and is not part of the persisted presentation workflow.
54
+
55
+ When the user asks to improve, beautify, restyle, or make an uploaded/existing deck on-brand, treat it as an in-place source-preserving edit unless the user explicitly asks to rewrite the story or change slide count. First call view-screen when the active deck is unclear, then get-deck. If get-deck.sourceImport exists, preserve its slide count, order, IDs, factual copy, notes, images, charts, tables, diagrams, freeform objects, and source aspect ratio. Use update-slide on existing slide IDs. Do not use add-slide, delete, reorder, or replace source imagery with generic cards for this workflow. Verify the same slide IDs and count with get-deck after editing. If sourceImport.fidelity is partial or imagesSkipped is nonzero, stop and report the exact fidelity warning instead of claiming a reliable improvement.
56
+
57
+ For source-faithful PDF slides, keep the original full-page image and style around it with restrained design-system chrome such as a frame, edge treatment, caption, or safe overlay that does not obscure source content; never OCR-reconstruct the page from extracted text. For PPTX slides, preserve the imported positioned HTML and every uploaded source image. The update-slide action enforces these preservation rules by default; pass preserveSource=false only when the user explicitly requests a rewrite of that slide.
58
+
59
+ If the deck has designSystemId, call get-design-system before writing and follow its exact agentContext tokens, assets, and custom instructions. If the user asks for on-brand styling and no design system is linked, call get-workspace-defaults, link its usable design system with patch-deck, then call get-design-system. Do not improvise a generic Builder-like palette when configured Builder.io design-system context is available.
53
60
 
54
61
  Layout-fit workflow is strict. When the user asks to fix overflow, first call view-screen and inspect the deck-wide layout-fit section. If it says measurements are unknown, do not claim the deck fits. Call get-layout-overflows when you need the structured per-slide results. Read the affected slides with get-deck, then make one bounded structural repair pass with one patch-slide operation per affected slide in a single patch-deck call. Wait for the action result and verify the persisted HTML with get-deck before saying it is fixed. If a fresh measurement still reports overflow, make at most one focused follow-up repair based on that measurement; never loop, repeatedly re-measure, or claim success after a chat response alone.
55
62
 
@@ -57,7 +64,9 @@ Fit means the main content fits the native content area. A small outer-wrapper s
57
64
 
58
65
  Provider-specific Slides actions are shortcuts, not limits. If a first-class action cannot express the exact Google Drive endpoint, file metadata field, export format, query, request body, pagination mode, payload shape, or API version needed, call provider-api-catalog and provider-api-docs as needed, then call provider-api-request against the real provider API. Use the raw provider API escape hatch instead of weakening the answer or claiming Slides cannot do something the underlying Google Drive API can do.
59
66
 
60
- Slides' Google Drive provider API uses the user's connected Google Docs OAuth account. The drive.file scope is intentionally limited to files the user selected or the app created. For large Drive file lists or metadata sweeps, pass stageAs and pagination options to provider-api-request, then use query-staged-dataset to count, filter, group, or project the staged rows.`,
67
+ Slides' Google Drive provider API uses the user's connected Google Docs OAuth account. The drive.file scope is intentionally limited to files the user selected or the app created. For large Drive file lists or metadata sweeps, pass stageAs and pagination options to provider-api-request, then use query-staged-dataset to count, filter, group, or project the staged rows.
68
+
69
+ When a Google Drive or Google Slides request needs authentication, tell the user to use the Connect Google button shown in Slides. Do not expose internal routes, API endpoints, OAuth setup instructions, client IDs, or keys in the response, and do not ask the user to configure an API manually.`,
61
70
  mentionProviders: async () => {
62
71
  const { getDb } = await import("../db/index.js");
63
72
  const { decks, deckShares } = await import("../db/schema.js");
@@ -0,0 +1,70 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { stat } from "node:fs/promises";
3
+ import path from "node:path";
4
+
5
+ import { getSession, streamFile } from "@agent-native/core/server";
6
+ import { defineEventHandler, getRouterParam, setResponseStatus } from "h3";
7
+
8
+ import {
9
+ decodeLocalImportedAssetToken,
10
+ isLocalImportAssetFallbackAvailable,
11
+ } from "../../../lib/import-asset-storage.js";
12
+ import { tenantFileKey } from "../../../lib/tenant-files.js";
13
+
14
+ export default defineEventHandler(async (event) => {
15
+ if (!isLocalImportAssetFallbackAvailable()) {
16
+ setResponseStatus(event, 404);
17
+ return { error: "Not found" };
18
+ }
19
+
20
+ const session = await getSession(event);
21
+ if (!session?.email) {
22
+ setResponseStatus(event, 401);
23
+ return { error: "Unauthorized" };
24
+ }
25
+
26
+ const rawToken = getRouterParam(event, "token") ?? "";
27
+ let token = rawToken;
28
+ try {
29
+ token = decodeURIComponent(rawToken);
30
+ } catch {
31
+ setResponseStatus(event, 404);
32
+ return { error: "Not found" };
33
+ }
34
+ let descriptor;
35
+ try {
36
+ descriptor = decodeLocalImportedAssetToken(token);
37
+ } catch {
38
+ setResponseStatus(event, 404);
39
+ return { error: "Not found" };
40
+ }
41
+
42
+ if (descriptor.ownerKey !== tenantFileKey(session.email)) {
43
+ setResponseStatus(event, 403);
44
+ return { error: "Forbidden" };
45
+ }
46
+
47
+ const directory = path.resolve(
48
+ process.cwd(),
49
+ "data",
50
+ "import-assets",
51
+ descriptor.ownerKey,
52
+ );
53
+ const filename = `${descriptor.id}-${descriptor.filename}`;
54
+ const filepath = path.resolve(directory, filename);
55
+ if (!filepath.startsWith(directory + path.sep)) {
56
+ setResponseStatus(event, 403);
57
+ return { error: "Forbidden" };
58
+ }
59
+
60
+ try {
61
+ await stat(filepath);
62
+ } catch {
63
+ setResponseStatus(event, 404);
64
+ return { error: "Not found" };
65
+ }
66
+
67
+ event.node?.res?.setHeader("Content-Type", descriptor.mimeType);
68
+ event.node?.res?.setHeader("Cache-Control", "private, max-age=3600");
69
+ return streamFile(createReadStream(filepath));
70
+ });
@@ -25,6 +25,9 @@ export const SLIDES_REFERENCE_FILE_LABEL =
25
25
  export const SLIDES_REFERENCE_FILE_ERROR_LABEL =
26
26
  "pptx, docx, pdf, fig, text, Markdown, JSON, CSV, and images including SVG";
27
27
 
28
+ export const MAX_REFERENCE_FILE_BYTES = 50 * 1024 * 1024;
29
+ export const MAX_FIG_REFERENCE_FILE_BYTES = 200 * 1024 * 1024;
30
+
28
31
  export function isSlidesReferenceFileExtension(ext: string): boolean {
29
32
  return SLIDES_REFERENCE_FILE_EXTENSIONS.includes(
30
33
  ext.toLowerCase() as (typeof SLIDES_REFERENCE_FILE_EXTENSIONS)[number],
@@ -0,0 +1,296 @@
1
+ ---
2
+ name: turn-into-app
3
+ description: >-
4
+ Turn a proven thread, skill, or workflow into a runnable Agent-Native app
5
+ with simple buttons, visible agent steps, preview, and deployment handoff.
6
+ Use when a user invokes `/turn-into-app` or asks to make a workflow into an
7
+ app.
8
+ user-invocable: true
9
+ scope: both
10
+ metadata:
11
+ internal: true
12
+ ---
13
+
14
+ # Turn Into App
15
+
16
+ ## Default behavior
17
+
18
+ This is an end-to-end build skill, not a request for an app proposal.
19
+
20
+ - With no argument, use the current thread as the source. This is the normal
21
+ invocation at the end of a successful workflow.
22
+ - With a named skill or local workflow, read that source and package it
23
+ immediately, even at the beginning of a thread. For example,
24
+ `/turn-into-app /some-skill` means “turn `/some-skill` into an app.”
25
+ - With an attachment or path, read the supplied artifact as the source.
26
+ - Do not ask the user to restate context that is already in the thread.
27
+ - When invoked from an Agent-Native app, keep the current thread as the source
28
+ and use the available workspace/coding-agent handoff when the current runtime
29
+ cannot edit files. Do not claim the app exists without an actual path and
30
+ verification result.
31
+
32
+ ## Source support
33
+
34
+ Supported source paths today are the current Codex thread, a named skill, or a
35
+ local workflow/transcript supplied as a path or attachment. An exported
36
+ ChatGPT or Claude transcript can use the same local-file path today.
37
+
38
+ ChatGPT shared-conversation import and Claude web conversation/project import
39
+ are **coming soon**. Do not claim private web access, invent an importer, add
40
+ fake OAuth, or scrape a logged-in page without an explicit supported adapter.
41
+ If a user gives one of those URLs before an adapter exists, ask for an export or
42
+ transcript instead and treat it as imported source material.
43
+
44
+ Deliver a fresh app in a new directory, implement the repeatable workflow with
45
+ buttons and agent handoffs, start its dev server, verify the main path, and
46
+ continue through build/deployment handoff. Do not stop at a plan.
47
+
48
+ ## Source selection guard
49
+
50
+ The generated app must implement the concrete workflow found in the source. It
51
+ must not become a generic “what app do you want to make?” intake form.
52
+
53
+ - In a delegated or forked task, read the actual referenced source thread and
54
+ the latest explicit workflow direction in the current task. If they disagree,
55
+ the latest concrete workflow direction wins.
56
+ - Do not treat a thread that merely discusses building this skill as the product
57
+ source unless the user explicitly asks to appify that meta-workflow.
58
+ - If the source contains several workflows, choose the latest successful,
59
+ repeatable job that motivated the request and name it in the handoff. If no
60
+ concrete job can be identified, stop and report what is missing instead of
61
+ inventing an app-builder UI.
62
+
63
+ ## UI contract for generated apps
64
+
65
+ Generated apps must follow the shared Agent-Native surface model:
66
+
67
+ - Keep the domain workflow on a named route (`/workflow`, `/automations`,
68
+ `/block`, or the source's equivalent). Preserve the scaffold's full-page
69
+ chat route instead of replacing it with a domain form while leaving the
70
+ layout configured as a chat page.
71
+ - Use the right `AgentSidebar` for contextual AI. Every button-triggered
72
+ `sendToAgentChat` handoff should open or focus that sidebar and keep the user
73
+ on the current domain page.
74
+ - Use a sans-first SaaS hierarchy for the app shell. Choose a named visual
75
+ direction in `DESIGN.md` before styling: product mode, audience, palette
76
+ family, type treatment, composition, shape language, and anti-references.
77
+ One restrained editorial cue is welcome, but warm beige plus terracotta is
78
+ not the default and serif type belongs in content previews or a deliberate
79
+ brand moment rather than the whole tool.
80
+ - Preserve existing brand tokens. For a new unbranded app, choose a
81
+ product-fitting palette family and compare sibling apps before reusing their
82
+ accent. Keep shared semantic tokens and Agent-Native behavior consistent
83
+ while varying the visual world, density, composition, and shape language.
84
+ - Give the AgentSidebar a subtle surface or divider boundary so it is visually
85
+ distinct from the domain page without becoming a heavy panel wall.
86
+ - Every AI-labeled button must actually call `sendToAgentChat` with bounded
87
+ context and `openSidebar: true`. Keep `submit: true` for direct execution and
88
+ `submit: false` only when the user should edit the staged prompt first. Label
89
+ deterministic local actions as local, preview, or analyze instead of AI.
90
+ - Standalone apps that render `AgentSidebar` must keep one assistant-ui runtime
91
+ context. Pin the versions compatible with the installed core/toolkit peer
92
+ graph, and add Vite dedupe/aliases when linked or transitive packages resolve
93
+ duplicate assistant-ui modules. Verify a fresh AI handoff has no
94
+ `AssistantUiStaleIndexErrorBoundary` or stale-index console error.
95
+ - Make the left navigation describe domain destinations. Chat is a separate
96
+ destination, not the label for every app page.
97
+ - Start with one primary action and one compact state. Put setup choices,
98
+ advanced inputs, diagnostics, and long explanations behind progressive
99
+ disclosure or later workflow steps.
100
+ - Never use sparkle, wand, magic, robot, or similar decorative AI icons. Use a
101
+ message or neutral action icon, or no icon when the button label is enough.
102
+ - Before handoff, inspect the first viewport for text density, repeated cards,
103
+ unrelated forms, and generic helper copy. Remove what the user does not need
104
+ until the next decision.
105
+ - Run a `distill`, `typeset`, `colorize`, `layout`, `polish`, and `audit` pass
106
+ as useful named reviews. Make one intervention at a time and commit the
107
+ chosen direction rather than averaging several options into generic SaaS.
108
+ - For before/after or original/generated review, stack the source first and the
109
+ result second by default. Reserve side-by-side layouts for short content that
110
+ remains comfortable to scan at the target width.
111
+
112
+ ## 1. Extract the workflow
113
+
114
+ Read the full available source before coding. Reduce it to a short working
115
+ brief:
116
+
117
+ - the user and repeatable job;
118
+ - inputs and outputs;
119
+ - the 1-3 judgment-heavy agent moments;
120
+ - the buttons, review points, and retry states a user needs;
121
+ - data, permissions, integrations, and failure boundaries.
122
+
123
+ Preserve useful judgment from the source, but do not turn a one-off answer,
124
+ private data, or an unverified result into a product contract. If the source is
125
+ not available or does not contain a repeatable job, say what is missing rather
126
+ than claiming the app is complete.
127
+
128
+ ## 2. Create a fresh app
129
+
130
+ Choose a short slug from the workflow and create a new directory. Never
131
+ overwrite an existing app. If the user supplied a directory, use it; otherwise
132
+ use `apps/<slug>` inside an existing Agent-Native workspace, or a new sibling
133
+ directory when working outside one.
134
+
135
+ For a new UI-bearing standalone app, use the current Agent-Native scaffold and
136
+ then read the generated `AGENTS.md`:
137
+
138
+ ```bash
139
+ npx @agent-native/core@latest create <app-directory> --template chat
140
+ cd <app-directory>
141
+ pnpm install
142
+ ```
143
+
144
+ When working inside an existing Agent-Native workspace, create the app from
145
+ the workspace root instead:
146
+
147
+ ```bash
148
+ pnpm exec agent-native add-app <slug> --template=chat
149
+ ```
150
+
151
+ Do not use `create` for an existing workspace; it scaffolds a new standalone
152
+ workspace rather than adding an app to the current one.
153
+
154
+ Use a first-party template only when it materially fits the workflow. Keep the
155
+ new app independent from the source thread's working tree unless the user
156
+ explicitly asks to extend an existing app.
157
+
158
+ Read the generated `DESIGN.md` before building the first screen and fill in the
159
+ visual direction as part of the app brief. Do not copy the previous app's
160
+ palette just because its tokens are nearby.
161
+
162
+ ## 3. Turn the workflow into buttons and agent work
163
+
164
+ Implement the smallest useful surface around the extracted brief. The app
165
+ should make the repeated path obvious without hiding the agent's judgment:
166
+
167
+ - Give each important repeated moment a clear button, such as “Analyze,”
168
+ “Suggest options,” “Draft,” “Review,” or “Publish.” Use the source's actual
169
+ vocabulary when it is clear.
170
+ - Put deterministic reads, writes, approvals, and publishing in `actions/`
171
+ with `defineAction`. The UI and agent must call the same action surface.
172
+ - Use application state for the current screen, selected item, and focused
173
+ object so the agent can see where the user is.
174
+ - Use `sendToAgentChat({ message, context, submit: true })` for intentional
175
+ button-triggered agent work. Use `submit: false` when the user should review
176
+ or edit the proposed prompt first.
177
+ - Pass IDs, URLs, and bounded summaries in context. Do not paste large provider
178
+ dumps into prompts, call an LLM directly from the browser, or invent fake
179
+ progress.
180
+ - Make agent results visible, editable, retryable, and attributable. Keep
181
+ irreversible actions behind an explicit review or confirmation point.
182
+
183
+ Use the existing shadcn/ui primitives, Tabler icons, shared composer, and
184
+ optimistic action patterns. Do not add a parallel CRUD API route for an action.
185
+
186
+ ## 4. Keep onboarding shared
187
+
188
+ Use the framework's existing setup experience. The app should offer the normal
189
+ “Connect Builder” and “Add your own keys” paths for AI setup. Do not create a
190
+ second credential form or hardcode a provider key.
191
+
192
+ In local-development instructions, add a brief note that a developer can set
193
+ an environment variable such as `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` before
194
+ starting the app; after restart, the setup prompt is no longer shown when the
195
+ key is available. Keep real secrets out of source, examples, and generated
196
+ content.
197
+
198
+ Turn-into-app apps should commit an `agent-native.json` app configuration so a
199
+ plain `pnpm dev` has the right first-run behavior without extra flags:
200
+
201
+ ```json
202
+ {
203
+ "version": 1,
204
+ "onboarding": {
205
+ "firstRun": {
206
+ "development": "connect",
207
+ "production": "connect-and-integrations"
208
+ }
209
+ }
210
+ }
211
+ ```
212
+
213
+ `connect` keeps the Connect Builder / Add your own keys choice visible and
214
+ skips only the generic “This app is an agent.” integrations catalog. The
215
+ production value includes that catalog for a hosted app. Do not replace this
216
+ with a local credential form or remove the shared onboarding. In development,
217
+ the shared Connect Builder card also explains the deployment-level
218
+ `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` fallback and links to the full
219
+ environment-variable guide.
220
+
221
+ When the onboarding default needs code rather than a static mode map, add an
222
+ optional `agent-native.config.ts` with the same returned shape:
223
+
224
+ ```ts
225
+ import { defineAgentNativeConfig } from "@agent-native/core/config";
226
+
227
+ export default defineAgentNativeConfig(({ isDev }) => ({
228
+ version: 1,
229
+ onboarding: {
230
+ firstRun: isDev ? "connect" : "connect-and-integrations",
231
+ },
232
+ }));
233
+ ```
234
+
235
+ The Vite preset loads this file automatically on supported Node versions. The
236
+ JSON file remains the portable, inspectable fallback. See the [Agent-Native
237
+ app configuration guide](/docs/agent-native-config) for precedence, supported
238
+ modes, and the boundary between committed config and deployment secrets.
239
+
240
+ For an account-free local preview, create the ignored local `.env` file with
241
+ `AUTH_DISABLED=1` before starting the dev server. This is only for loopback
242
+ development; never commit or deploy this setting. AI/provider connections still
243
+ use the normal onboarding flow or the documented environment-variable keys.
244
+
245
+ ## 5. Run it immediately
246
+
247
+ From the new app directory:
248
+
249
+ ```bash
250
+ pnpm dev
251
+ ```
252
+
253
+ For a fresh local test app, use the ignored `.env` with `AUTH_DISABLED=1` so the
254
+ domain UI opens without an account; the committed app config makes shared
255
+ onboarding visible. Keep the process running so the user can try the app. Read
256
+ the actual server output and report the real local URL. If the app needs installation or a setup step,
257
+ complete it when possible and distinguish “not configured” from an unavailable
258
+ credential store.
259
+
260
+ ## 6. Verify, build, and deploy
261
+
262
+ Exercise the actual happy path, not only the source files:
263
+
264
+ 1. Load the reported URL and confirm the main route renders.
265
+ 2. Confirm the shared onboarding state or a configured local key.
266
+ 3. Click the primary workflow button and confirm the intended agent handoff.
267
+ Also click every other AI-labeled button and confirm it opens the same
268
+ contextual sidebar with the expected prompt or staged context.
269
+ 4. Confirm the result, action persistence, application state, and sync path.
270
+ 5. Check the dev output for browser/runtime errors, and capture input, result,
271
+ and agent-sidebar states so the complete flow is reviewable.
272
+
273
+ Then run the supported build. For a standalone app, use the generated app's
274
+ documented build and hosting path. For an app inside a workspace, use the
275
+ workspace deploy command, for example:
276
+
277
+ ```bash
278
+ npx @agent-native/core@latest build
279
+ npx @agent-native/core@latest deploy --preset netlify
280
+ ```
281
+
282
+ Use `vercel` or another supported preset when that is the configured target.
283
+ Attempt deployment when the user requested it or the project already has the
284
+ required provider configuration. If external authentication, a production
285
+ secret, or a hosting decision is missing, finish local verification and report
286
+ the exact remaining handoff without claiming a live deployment.
287
+
288
+ Label evidence separately: locally running, locally verified, build-ready,
289
+ deployed, and live-verified are different states.
290
+
291
+ ## Handoff
292
+
293
+ End with the new app directory, local URL, visual direction, what the buttons do,
294
+ account-free local-preview status, verification performed, deployment URL if it is real,
295
+ and one precise pending step when something could not be completed. Keep the
296
+ handoff short enough to use in a demo or recording.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Turn Into App"
3
+ short_description: "Turn a thread or skill into a runnable app"
4
+ default_prompt: "Scan the current thread, turn the workflow into a new Agent-Native app with clear buttons, run it locally, verify it, and complete the deployment handoff."