@agent-native/core 0.152.1 → 0.153.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 (907) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/adding-a-feature/SKILL.md +208 -0
  3. package/corpus/templates/analytics/.agents/skills/context-awareness/SKILL.md +206 -0
  4. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +6 -4
  5. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +73 -80
  6. package/corpus/templates/analytics/.agents/skills/portability/SKILL.md +107 -0
  7. package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +339 -0
  8. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +3 -3
  9. package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +1 -1
  10. package/corpus/templates/analytics/.agents/skills/sharing/SKILL.md +1 -0
  11. package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +116 -44
  12. package/corpus/templates/analytics/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  13. package/corpus/templates/analytics/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  14. package/corpus/templates/analytics/.agents/skills/workspace-conventions/SKILL.md +93 -0
  15. package/corpus/templates/analytics/actions/data-source-status.ts +4 -1
  16. package/corpus/templates/analytics/actions/migrate-first-party-analytics-to-bigquery.ts +2 -2
  17. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +7 -2
  18. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +7 -1
  19. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +30 -32
  20. package/corpus/templates/analytics/app/components/layout/layout-route-policy.ts +10 -0
  21. package/corpus/templates/analytics/app/global.css +5 -1
  22. package/corpus/templates/analytics/app/lib/data-source-status.ts +3 -3
  23. package/corpus/templates/analytics/app/lib/resource-access.ts +6 -1
  24. package/corpus/templates/analytics/app/pages/DataSources.tsx +79 -51
  25. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +1 -0
  26. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +1 -0
  27. package/corpus/templates/analytics/changelog/2026-08-12-analytics-sidebar-ask-toggle-and-compact-rail.md +6 -0
  28. package/corpus/templates/analytics/changelog/2026-08-12-data-source-statuses-now-distinguish-workspace-access-from-c.md +6 -0
  29. package/corpus/templates/analytics/server/jobs/analytics-bigquery-backfill.ts +559 -147
  30. package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +79 -5
  31. package/corpus/templates/analytics/server/plugins/db.ts +84 -0
  32. package/corpus/templates/assets/.agents/skills/adding-a-feature/SKILL.md +208 -0
  33. package/corpus/templates/assets/.agents/skills/context-awareness/SKILL.md +206 -0
  34. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +73 -80
  35. package/corpus/templates/assets/.agents/skills/portability/SKILL.md +107 -0
  36. package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +339 -0
  37. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +3 -3
  38. package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +1 -1
  39. package/corpus/templates/assets/.agents/skills/sharing/SKILL.md +1 -0
  40. package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +116 -44
  41. package/corpus/templates/assets/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  42. package/corpus/templates/assets/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  43. package/corpus/templates/assets/.agents/skills/workspace-conventions/SKILL.md +93 -0
  44. package/corpus/templates/assets/app/components/asset/AssetPreviewDialog.tsx +13 -5
  45. package/corpus/templates/assets/app/lib/asset-urls.ts +13 -0
  46. package/corpus/templates/assets/app/routes/asset.$id.tsx +16 -6
  47. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +1 -0
  48. package/corpus/templates/assets/app/routes/library.tsx +336 -78
  49. package/corpus/templates/assets/shared/api.ts +1 -1
  50. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +3 -2
  51. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +8 -6
  52. package/corpus/templates/brain/.agents/skills/context-awareness/SKILL.md +206 -0
  53. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +73 -80
  54. package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +7 -0
  55. package/corpus/templates/brain/.agents/skills/portability/SKILL.md +107 -0
  56. package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +339 -0
  57. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +3 -3
  58. package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +1 -1
  59. package/corpus/templates/brain/.agents/skills/sharing/SKILL.md +1 -0
  60. package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +116 -44
  61. package/corpus/templates/brain/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  62. package/corpus/templates/brain/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  63. package/corpus/templates/brain/.agents/skills/workspace-conventions/SKILL.md +93 -0
  64. package/corpus/templates/brain/AGENTS.md +2 -1
  65. package/corpus/templates/brain/actions/ask-brain.ts +19 -16
  66. package/corpus/templates/brain/actions/create-source.ts +11 -2
  67. package/corpus/templates/brain/actions/import-markdown-files.ts +237 -0
  68. package/corpus/templates/brain/actions/resanitize-captures.ts +3 -1
  69. package/corpus/templates/brain/actions/test-slack-connection.ts +12 -3
  70. package/corpus/templates/brain/actions/update-source.ts +10 -1
  71. package/corpus/templates/brain/app/components/brain/Surface.tsx +1 -11
  72. package/corpus/templates/brain/app/i18n-data.ts +111 -0
  73. package/corpus/templates/brain/app/lib/brain.ts +23 -1
  74. package/corpus/templates/brain/app/routes/knowledge.tsx +0 -2
  75. package/corpus/templates/brain/app/routes/ops.tsx +0 -2
  76. package/corpus/templates/brain/app/routes/review.tsx +0 -2
  77. package/corpus/templates/brain/app/routes/search.tsx +0 -2
  78. package/corpus/templates/brain/app/routes/sources.tsx +354 -6
  79. package/corpus/templates/brain/server/lib/brain-response-guard.ts +63 -1
  80. package/corpus/templates/brain/server/lib/brain.ts +9 -6
  81. package/corpus/templates/brain/server/lib/connectors.ts +20 -6
  82. package/corpus/templates/brain/server/lib/search.ts +9 -1
  83. package/corpus/templates/brain/server/lib/source-credentials.ts +95 -57
  84. package/corpus/templates/brain/server/plugins/agent-chat.ts +5 -2
  85. package/corpus/templates/brain/server/plugins/auth.ts +2 -0
  86. package/corpus/templates/calendar/.agents/skills/adding-a-feature/SKILL.md +208 -0
  87. package/corpus/templates/calendar/.agents/skills/context-awareness/SKILL.md +206 -0
  88. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +73 -80
  89. package/corpus/templates/calendar/.agents/skills/portability/SKILL.md +107 -0
  90. package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +339 -0
  91. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +3 -3
  92. package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +1 -1
  93. package/corpus/templates/calendar/.agents/skills/sharing/SKILL.md +1 -0
  94. package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +116 -44
  95. package/corpus/templates/calendar/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  96. package/corpus/templates/calendar/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  97. package/corpus/templates/calendar/.agents/skills/workspace-conventions/SKILL.md +93 -0
  98. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +1 -0
  99. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +3 -2
  100. package/corpus/templates/chat/.agents/skills/context-awareness/SKILL.md +206 -0
  101. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +73 -80
  102. package/corpus/templates/chat/.agents/skills/portability/SKILL.md +107 -0
  103. package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +339 -0
  104. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +3 -3
  105. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +1 -1
  106. package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +1 -0
  107. package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +116 -44
  108. package/corpus/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  109. package/corpus/templates/chat/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  110. package/corpus/templates/chat/.agents/skills/workspace-conventions/SKILL.md +93 -0
  111. package/corpus/templates/chat/AGENTS.md +4 -5
  112. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +73 -80
  113. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  114. package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +339 -0
  115. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +3 -3
  116. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +1 -1
  117. package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +116 -44
  118. package/corpus/templates/clips/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  119. package/corpus/templates/clips/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  120. package/corpus/templates/clips/.agents/skills/workspace-conventions/SKILL.md +93 -0
  121. package/corpus/templates/clips/actions/add-comment.ts +1 -2
  122. package/corpus/templates/clips/actions/delete-comment.ts +2 -0
  123. package/corpus/templates/clips/actions/get-recording-insights.ts +9 -8
  124. package/corpus/templates/clips/actions/get-recording-player-data.ts +4 -1
  125. package/corpus/templates/clips/actions/react-to-comment.ts +1 -1
  126. package/corpus/templates/clips/actions/react-to-recording.ts +1 -1
  127. package/corpus/templates/clips/actions/reply-to-comment.ts +1 -1
  128. package/corpus/templates/clips/actions/resolve-comment.ts +1 -2
  129. package/corpus/templates/clips/actions/update-comment.ts +1 -1
  130. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +1 -0
  131. package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +59 -16
  132. package/corpus/templates/clips/app/components/player/comments-panel.tsx +88 -39
  133. package/corpus/templates/clips/app/components/player/share-dialog.tsx +12 -8
  134. package/corpus/templates/clips/app/components/player/timestamped-comment-button.tsx +3 -1
  135. package/corpus/templates/clips/app/components/player/video-player.tsx +1 -1
  136. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +2 -1
  137. package/corpus/templates/clips/app/i18n/en-US.ts +2 -1
  138. package/corpus/templates/clips/app/lib/public-meeting.ts +1 -1
  139. package/corpus/templates/clips/app/lib/thumbnail-capture.ts +71 -0
  140. package/corpus/templates/clips/app/lib/thumbnail-picker-state.ts +93 -0
  141. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +1 -1
  142. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +25 -19
  143. package/corpus/templates/clips/app/routes/share.$shareId.tsx +8 -0
  144. package/corpus/templates/clips/changelog/2026-07-23-meeting-recording-meters-and-dismissed-prompts.md +1 -1
  145. package/corpus/templates/clips/changelog/2026-08-11-clips-asks-to-take-notes-again-when-you-join-an-adhoc-zoom-o.md +6 -0
  146. package/corpus/templates/clips/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  147. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +166 -14
  148. package/corpus/templates/clips/desktop/src-tauri/src/call_activity.rs +146 -0
  149. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -0
  150. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +2 -122
  151. package/corpus/templates/clips/server/lib/recording-page-access.ts +6 -1
  152. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +5 -0
  153. package/corpus/templates/clips/shared/share-meta.ts +19 -3
  154. package/corpus/templates/content/.agents/skills/adding-a-feature/SKILL.md +208 -0
  155. package/corpus/templates/content/.agents/skills/context-awareness/SKILL.md +206 -0
  156. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +73 -80
  157. package/corpus/templates/content/.agents/skills/portability/SKILL.md +107 -0
  158. package/corpus/templates/content/.agents/skills/secrets/SKILL.md +339 -0
  159. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +3 -3
  160. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +1 -1
  161. package/corpus/templates/content/.agents/skills/sharing/SKILL.md +1 -0
  162. package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +116 -44
  163. package/corpus/templates/content/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  164. package/corpus/templates/content/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  165. package/corpus/templates/content/.agents/skills/workspace-conventions/SKILL.md +93 -0
  166. package/corpus/templates/content/actions/_database-utils.ts +10 -0
  167. package/corpus/templates/content/actions/add-comment.ts +1 -1
  168. package/corpus/templates/content/actions/attach-content-database-source.ts +158 -61
  169. package/corpus/templates/content/actions/create-document.ts +1 -0
  170. package/corpus/templates/content/actions/delete-comment.ts +1 -1
  171. package/corpus/templates/content/actions/get-document.ts +9 -1
  172. package/corpus/templates/content/actions/import-content-source.ts +8 -0
  173. package/corpus/templates/content/actions/list-documents.ts +10 -1
  174. package/corpus/templates/content/actions/update-comment.ts +1 -1
  175. package/corpus/templates/content/actions/update-document.ts +11 -0
  176. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +52 -29
  177. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +13 -8
  178. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +62 -2
  179. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +163 -53
  180. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +16 -0
  181. package/corpus/templates/content/app/components/editor/database/settings.tsx +22 -13
  182. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +7 -7
  183. package/corpus/templates/content/app/hooks/use-documents.ts +2 -0
  184. package/corpus/templates/content/app/i18n-data.ts +10 -0
  185. package/corpus/templates/content/app/root.tsx +1 -21
  186. package/corpus/templates/content/changelog/2026-08-05-connect-sources-from-add-column.md +6 -0
  187. package/corpus/templates/content/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  188. package/corpus/templates/content/shared/api.ts +7 -1
  189. package/corpus/templates/crm/.agents/skills/actions/SKILL.md +146 -0
  190. package/corpus/templates/crm/.agents/skills/actions/references/action-fields.md +136 -0
  191. package/corpus/templates/crm/.agents/skills/actions/references/examples.md +94 -0
  192. package/corpus/templates/crm/.agents/skills/actions/references/provider-apis.md +95 -0
  193. package/corpus/templates/crm/.agents/skills/adding-a-feature/SKILL.md +208 -0
  194. package/corpus/templates/crm/.agents/skills/context-awareness/SKILL.md +206 -0
  195. package/corpus/templates/crm/.agents/skills/delegate-to-agent/SKILL.md +289 -0
  196. package/corpus/templates/crm/.agents/skills/frontend-design/SKILL.md +296 -0
  197. package/corpus/templates/crm/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  198. package/corpus/templates/crm/.agents/skills/portability/SKILL.md +107 -0
  199. package/corpus/templates/crm/.agents/skills/real-time-sync/SKILL.md +232 -0
  200. package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +339 -0
  201. package/corpus/templates/crm/.agents/skills/security/SKILL.md +324 -0
  202. package/corpus/templates/crm/.agents/skills/self-modifying-code/SKILL.md +123 -0
  203. package/corpus/templates/crm/.agents/skills/shadcn-ui/SKILL.md +123 -0
  204. package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +1 -0
  205. package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +116 -44
  206. package/corpus/templates/crm/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  207. package/corpus/templates/crm/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  208. package/corpus/templates/crm/.agents/skills/workspace-conventions/SKILL.md +93 -0
  209. package/corpus/templates/design/.agents/skills/adding-a-feature/SKILL.md +208 -0
  210. package/corpus/templates/design/.agents/skills/context-awareness/SKILL.md +206 -0
  211. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +73 -80
  212. package/corpus/templates/design/.agents/skills/portability/SKILL.md +107 -0
  213. package/corpus/templates/design/.agents/skills/real-time-sync/SKILL.md +232 -0
  214. package/corpus/templates/design/.agents/skills/secrets/SKILL.md +339 -0
  215. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +3 -3
  216. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +1 -1
  217. package/corpus/templates/design/.agents/skills/sharing/SKILL.md +1 -0
  218. package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +116 -44
  219. package/corpus/templates/design/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  220. package/corpus/templates/design/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  221. package/corpus/templates/design/.agents/skills/workspace-conventions/SKILL.md +93 -0
  222. package/corpus/templates/design/actions/index-design-system-with-builder.ts +16 -2
  223. package/corpus/templates/design/app/components/design-system/ProductionDesignSystemShowcase.tsx +6 -18
  224. package/corpus/templates/design/app/i18n/en-US.ts +1 -1
  225. package/corpus/templates/design/app/i18n-data.ts +40 -0
  226. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +153 -131
  227. package/corpus/templates/design/app/pages/DesignSystems.tsx +7 -61
  228. package/corpus/templates/design/app/pages/Present.tsx +8 -2
  229. package/corpus/templates/design/app/pages/Templates.tsx +1 -0
  230. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +4 -1
  231. package/corpus/templates/design/app/pages/design-editor/types.ts +6 -1
  232. package/corpus/templates/design/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  233. package/corpus/templates/dispatch/.agents/skills/adding-a-feature/SKILL.md +208 -0
  234. package/corpus/templates/dispatch/.agents/skills/context-awareness/SKILL.md +206 -0
  235. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +73 -80
  236. package/corpus/templates/dispatch/.agents/skills/portability/SKILL.md +107 -0
  237. package/corpus/templates/dispatch/.agents/skills/real-time-sync/SKILL.md +232 -0
  238. package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +339 -0
  239. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +3 -3
  240. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +1 -1
  241. package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +1 -0
  242. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +116 -44
  243. package/corpus/templates/dispatch/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  244. package/corpus/templates/dispatch/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  245. package/corpus/templates/dispatch/.agents/skills/workspace-conventions/SKILL.md +93 -0
  246. package/corpus/templates/dispatch/actions/apply-workspace-connection-setup.ts +97 -15
  247. package/corpus/templates/dispatch/actions/connection-permissions.ts +77 -0
  248. package/corpus/templates/dispatch/actions/delete-workspace-connection.ts +12 -2
  249. package/corpus/templates/dispatch/actions/list-workspace-user-groups.ts +19 -0
  250. package/corpus/templates/dispatch/actions/plan-workspace-connection-setup.ts +9 -2
  251. package/corpus/templates/dispatch/actions/set-workspace-connection-grant.ts +21 -2
  252. package/corpus/templates/dispatch/actions/upsert-workspace-connection.ts +66 -1
  253. package/corpus/templates/dispatch/actions/upsert-workspace-user-group.ts +27 -0
  254. package/corpus/templates/dispatch/app/chat-first-pages.ts +84 -0
  255. package/corpus/templates/dispatch/app/i18n-data.ts +3989 -3527
  256. package/corpus/templates/dispatch/app/routes/integrations.tsx +1568 -685
  257. package/corpus/templates/dispatch/app/routes/settings.tsx +14 -9
  258. package/corpus/templates/dispatch/changelog/2026-08-12-search-and-pin-workspace-apps-from-the-app-catalog.md +6 -0
  259. package/corpus/templates/dispatch/changelog/2026-08-12-workspace-integration-access-now-shows-exactly-which-apps-ca.md +6 -0
  260. package/corpus/templates/dispatch/server/lib/app-roles.ts +5 -0
  261. package/corpus/templates/dispatch/shared/app-roles.ts +1 -0
  262. package/corpus/templates/factory/.agents/skills/adding-a-feature/SKILL.md +3 -2
  263. package/corpus/templates/factory/.agents/skills/context-awareness/SKILL.md +206 -0
  264. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +73 -80
  265. package/corpus/templates/factory/.agents/skills/portability/SKILL.md +107 -0
  266. package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +339 -0
  267. package/corpus/templates/factory/.agents/skills/self-modifying-code/SKILL.md +3 -3
  268. package/corpus/templates/factory/.agents/skills/shadcn-ui/SKILL.md +1 -1
  269. package/corpus/templates/factory/.agents/skills/sharing/SKILL.md +1 -0
  270. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +116 -44
  271. package/corpus/templates/factory/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  272. package/corpus/templates/factory/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  273. package/corpus/templates/factory/.agents/skills/workspace-conventions/SKILL.md +93 -0
  274. package/corpus/templates/factory/AGENTS.md +10 -1
  275. package/corpus/templates/factory/README.md +18 -7
  276. package/corpus/templates/factory/actions/list-triage-items.ts +10 -4
  277. package/corpus/templates/factory/actions/poll-github-sources.ts +53 -14
  278. package/corpus/templates/factory/actions/poll-sentry-errors.ts +31 -13
  279. package/corpus/templates/factory/actions/poll-slack-channel.ts +41 -5
  280. package/corpus/templates/factory/actions/provider-api-catalog.ts +13 -0
  281. package/corpus/templates/factory/actions/provider-api-docs.ts +11 -0
  282. package/corpus/templates/factory/actions/provider-api-request.ts +17 -0
  283. package/corpus/templates/factory/actions/save-triage-config.ts +87 -38
  284. package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +14 -12
  285. package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +60 -77
  286. package/corpus/templates/factory/app/components/factory/FactoryInspector.tsx +66 -125
  287. package/corpus/templates/factory/app/components/layout/Header.tsx +1 -0
  288. package/corpus/templates/factory/app/components/layout/Layout.tsx +8 -3
  289. package/corpus/templates/factory/app/components/layout/Sidebar.tsx +9 -5
  290. package/corpus/templates/factory/app/components/ui/input.tsx +15 -1
  291. package/corpus/templates/factory/app/components/ui/popover.tsx +1 -0
  292. package/corpus/templates/factory/app/components/ui/switch.tsx +1 -0
  293. package/corpus/templates/factory/app/components/ui/textarea.tsx +20 -1
  294. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +5 -3
  295. package/corpus/templates/factory/app/i18n/en-US.ts +17 -0
  296. package/corpus/templates/factory/app/routes/_index.tsx +5 -87
  297. package/corpus/templates/factory/app/routes/chat.$threadId.tsx +1 -1
  298. package/corpus/templates/factory/app/routes/chat.tsx +91 -0
  299. package/corpus/templates/factory/app/routes/factory.tsx +554 -427
  300. package/corpus/templates/factory/app/routes/settings.tsx +1 -1
  301. package/corpus/templates/factory/server/connectors/credentials.ts +25 -0
  302. package/corpus/templates/factory/server/lib/provider-api.ts +34 -0
  303. package/corpus/templates/factory/server/plugins/agent-chat.ts +15 -3
  304. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +96 -24
  305. package/corpus/templates/factory/server/triage/review-state.ts +33 -0
  306. package/corpus/templates/factory/server/triage/slack-poller.ts +1 -0
  307. package/corpus/templates/forms/.agents/skills/adding-a-feature/SKILL.md +208 -0
  308. package/corpus/templates/forms/.agents/skills/context-awareness/SKILL.md +206 -0
  309. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +73 -80
  310. package/corpus/templates/forms/.agents/skills/portability/SKILL.md +107 -0
  311. package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +339 -0
  312. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +3 -3
  313. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +1 -1
  314. package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +1 -0
  315. package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +116 -44
  316. package/corpus/templates/forms/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  317. package/corpus/templates/forms/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  318. package/corpus/templates/forms/.agents/skills/workspace-conventions/SKILL.md +93 -0
  319. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +1 -0
  320. package/corpus/templates/forms/shared/types.ts +1 -1
  321. package/corpus/templates/macros/.agents/skills/adding-a-feature/SKILL.md +208 -0
  322. package/corpus/templates/macros/.agents/skills/context-awareness/SKILL.md +206 -0
  323. package/corpus/templates/macros/.agents/skills/delegate-to-agent/SKILL.md +289 -0
  324. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +73 -80
  325. package/corpus/templates/macros/.agents/skills/portability/SKILL.md +107 -0
  326. package/corpus/templates/macros/.agents/skills/real-time-sync/SKILL.md +232 -0
  327. package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +339 -0
  328. package/corpus/templates/macros/.agents/skills/self-modifying-code/SKILL.md +123 -0
  329. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +1 -1
  330. package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +1 -0
  331. package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +116 -44
  332. package/corpus/templates/macros/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  333. package/corpus/templates/macros/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  334. package/corpus/templates/macros/.agents/skills/workspace-conventions/SKILL.md +93 -0
  335. package/corpus/templates/mail/.agents/skills/adding-a-feature/SKILL.md +208 -0
  336. package/corpus/templates/mail/.agents/skills/context-awareness/SKILL.md +206 -0
  337. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +73 -80
  338. package/corpus/templates/mail/.agents/skills/portability/SKILL.md +107 -0
  339. package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +339 -0
  340. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +3 -3
  341. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +1 -1
  342. package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +1 -0
  343. package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +116 -44
  344. package/corpus/templates/mail/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  345. package/corpus/templates/mail/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  346. package/corpus/templates/mail/.agents/skills/workspace-conventions/SKILL.md +93 -0
  347. package/corpus/templates/mail/actions/send-email.ts +9 -0
  348. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +4 -4
  349. package/corpus/templates/mail/changelog/2026-08-12-agent-sent-messages-appear-immediately.md +6 -0
  350. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +3 -2
  351. package/corpus/templates/plan/.agents/skills/context-awareness/SKILL.md +206 -0
  352. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +73 -80
  353. package/corpus/templates/plan/.agents/skills/portability/SKILL.md +107 -0
  354. package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +339 -0
  355. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +3 -3
  356. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +1 -1
  357. package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +1 -0
  358. package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +116 -44
  359. package/corpus/templates/plan/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  360. package/corpus/templates/plan/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  361. package/corpus/templates/plan/.agents/skills/workspace-conventions/SKILL.md +93 -0
  362. package/corpus/templates/plan/actions/delete-plan-comment.ts +6 -0
  363. package/corpus/templates/plan/actions/reply-to-plan-comment.ts +7 -1
  364. package/corpus/templates/plan/actions/resolve-plan-comment.ts +7 -1
  365. package/corpus/templates/plan/actions/update-visual-plan.ts +6 -0
  366. package/corpus/templates/plan/app/hooks/use-plans.ts +1 -1
  367. package/corpus/templates/plan/app/pages/PlansPage.tsx +51 -23
  368. package/corpus/templates/plan/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  369. package/corpus/templates/plan/server/plans.ts +2 -2
  370. package/corpus/templates/plan/shared/types.ts +1 -1
  371. package/corpus/templates/slides/.agents/skills/adding-a-feature/SKILL.md +208 -0
  372. package/corpus/templates/slides/.agents/skills/context-awareness/SKILL.md +206 -0
  373. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +6 -0
  374. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +73 -80
  375. package/corpus/templates/slides/.agents/skills/portability/SKILL.md +107 -0
  376. package/corpus/templates/slides/.agents/skills/real-time-sync/SKILL.md +232 -0
  377. package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +339 -0
  378. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +3 -3
  379. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +1 -1
  380. package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +1 -0
  381. package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +116 -44
  382. package/corpus/templates/slides/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  383. package/corpus/templates/slides/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  384. package/corpus/templates/slides/.agents/skills/workspace-conventions/SKILL.md +93 -0
  385. package/corpus/templates/slides/AGENTS.md +4 -0
  386. package/corpus/templates/slides/actions/add-slide-comment.ts +1 -1
  387. package/corpus/templates/slides/actions/delete-slide-comment.ts +1 -1
  388. package/corpus/templates/slides/actions/get-layout-overflows.ts +67 -2
  389. package/corpus/templates/slides/actions/update-slide-comment.ts +1 -1
  390. package/corpus/templates/slides/actions/view-screen.ts +76 -26
  391. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +30 -8
  392. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +2 -1
  393. package/corpus/templates/slides/app/components/editor/AlignmentGuides.tsx +75 -0
  394. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +80 -80
  395. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +125 -10
  396. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +244 -9
  397. package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +1 -1
  398. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +3 -3
  399. package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +218 -0
  400. package/corpus/templates/slides/app/context/DeckContext.tsx +56 -30
  401. package/corpus/templates/slides/app/hooks/use-deck-role.ts +13 -5
  402. package/corpus/templates/slides/app/hooks/use-design-systems.ts +1 -1
  403. package/corpus/templates/slides/app/i18n/en-US.ts +6 -2
  404. package/corpus/templates/slides/app/lib/create-deck-generation.ts +1 -0
  405. package/corpus/templates/slides/app/lib/pending-deck-changes.ts +32 -0
  406. package/corpus/templates/slides/app/pages/DeckEditor.tsx +85 -4
  407. package/corpus/templates/slides/app/pages/Index.tsx +65 -66
  408. package/corpus/templates/slides/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  409. package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +3 -2
  410. package/corpus/templates/tasks/.agents/skills/context-awareness/SKILL.md +206 -0
  411. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +73 -80
  412. package/corpus/templates/tasks/.agents/skills/portability/SKILL.md +107 -0
  413. package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +339 -0
  414. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +3 -3
  415. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +1 -1
  416. package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +1 -0
  417. package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +116 -44
  418. package/corpus/templates/tasks/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  419. package/corpus/templates/tasks/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  420. package/corpus/templates/tasks/.agents/skills/workspace-conventions/SKILL.md +93 -0
  421. package/corpus/templates/tasks/app/components/custom-fields/FieldsPage.tsx +1 -4
  422. package/corpus/templates/tasks/app/components/inbox/InboxList.tsx +0 -1
  423. package/corpus/templates/tasks/app/components/inbox/InboxListPage.tsx +0 -1
  424. package/corpus/templates/tasks/app/components/shared/ListViewHeader.tsx +0 -3
  425. package/corpus/templates/tasks/app/components/shared/PageHeader.tsx +1 -4
  426. package/corpus/templates/tasks/app/components/tasks/TaskList.tsx +0 -1
  427. package/corpus/templates/tasks/app/components/tasks/TaskListPage.tsx +0 -1
  428. package/dist/agent/engine/ai-sdk-engine.js +5 -0
  429. package/dist/agent/engine/anthropic-engine.js +8 -0
  430. package/dist/agent/engine/registry.js +24 -19
  431. package/dist/agent/engine/translate-anthropic.js +16 -1
  432. package/dist/automations/service.d.ts +2 -0
  433. package/dist/automations/service.js +5 -1
  434. package/dist/chat-threads/schema.d.ts +2 -2
  435. package/dist/cli/changelog.js +21 -4
  436. package/dist/cli/create.d.ts +12 -1
  437. package/dist/cli/create.js +99 -11
  438. package/dist/cli/index.js +6 -6
  439. package/dist/cli/process.d.ts +7 -0
  440. package/dist/cli/process.js +12 -0
  441. package/dist/cli/workspace-skill-policy.d.ts +15 -0
  442. package/dist/cli/workspace-skill-policy.js +62 -0
  443. package/dist/cli/workspacify.js +36 -0
  444. package/dist/client/AgentPanel.d.ts +14 -2
  445. package/dist/client/AgentPanel.js +40 -24
  446. package/dist/client/AssistantChat.js +90 -182
  447. package/dist/client/FeedbackButton.js +15 -2
  448. package/dist/client/RouteTransitionIndicator.d.ts +14 -2
  449. package/dist/client/RouteTransitionIndicator.js +16 -5
  450. package/dist/client/agent-page/AgentTabsPage.js +19 -6
  451. package/dist/client/app-config.d.ts +3 -0
  452. package/dist/client/app-config.js +6 -0
  453. package/dist/client/app-providers.js +2 -1
  454. package/dist/client/changelog/Changelog.d.ts +2 -1
  455. package/dist/client/changelog/Changelog.js +7 -5
  456. package/dist/client/chat/markdown-renderer.d.ts +3 -1
  457. package/dist/client/chat/markdown-renderer.js +24 -24
  458. package/dist/client/chat/message-components.d.ts +23 -0
  459. package/dist/client/chat/message-components.js +27 -44
  460. package/dist/client/chat/tool-call-display.d.ts +2 -2
  461. package/dist/client/chat/tool-call-display.js +6 -3
  462. package/dist/client/chat-first/app-open-actions.d.ts +28 -0
  463. package/dist/client/chat-first/app-open-actions.js +25 -0
  464. package/dist/client/chat-first/index.d.ts +1 -0
  465. package/dist/client/chat-first/index.js +1 -0
  466. package/dist/client/chat-first/primary-nav.d.ts +2 -1
  467. package/dist/client/chat-first/primary-nav.js +12 -5
  468. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +14 -0
  469. package/dist/client/conversation/use-near-bottom-autoscroll.js +14 -0
  470. package/dist/client/error-format.js +32 -3
  471. package/dist/client/extensions/EmbeddedExtension.js +1 -0
  472. package/dist/client/extensions/ExtensionViewer.js +3 -1
  473. package/dist/client/extensions/InlineExtensionFrame.js +1 -0
  474. package/dist/client/extensions/iframe-bridge.d.ts +3 -2
  475. package/dist/client/extensions/iframe-bridge.js +4 -2
  476. package/dist/client/i18n.js +28 -5
  477. package/dist/client/integrations/IntegrationConnectionChoice.d.ts +11 -0
  478. package/dist/client/integrations/IntegrationConnectionChoice.js +6 -0
  479. package/dist/client/integrations/IntegrationGrid.d.ts +23 -0
  480. package/dist/client/integrations/IntegrationGrid.js +12 -0
  481. package/dist/client/integrations/IntegrationsPanel.js +92 -26
  482. package/dist/client/integrations/index.d.ts +2 -0
  483. package/dist/client/integrations/index.js +2 -0
  484. package/dist/client/onboarding/FirstRunOnboarding.d.ts +3 -1
  485. package/dist/client/onboarding/FirstRunOnboarding.js +26 -16
  486. package/dist/client/onboarding/first-run-enabled.js +1 -5
  487. package/dist/client/onboarding/first-run-startup-gate.d.ts +5 -0
  488. package/dist/client/onboarding/first-run-startup-gate.js +51 -0
  489. package/dist/client/onboarding/first-run-status.d.ts +7 -0
  490. package/dist/client/onboarding/first-run-status.js +26 -0
  491. package/dist/client/onboarding/index.d.ts +3 -0
  492. package/dist/client/onboarding/index.js +3 -0
  493. package/dist/client/onboarding/use-onboarding.d.ts +1 -0
  494. package/dist/client/onboarding/use-onboarding.js +13 -11
  495. package/dist/client/org/TeamPage.js +174 -28
  496. package/dist/client/resources/McpConnectionSuggestion.js +29 -72
  497. package/dist/client/resources/McpIntegrationDialog.d.ts +3 -1
  498. package/dist/client/resources/McpIntegrationDialog.js +176 -51
  499. package/dist/client/resources/index.d.ts +1 -0
  500. package/dist/client/resources/index.js +1 -0
  501. package/dist/client/resources/mcp-integration-catalog.d.ts +8 -0
  502. package/dist/client/resources/mcp-integration-catalog.js +28 -0
  503. package/dist/client/settings/ExtensionsSettingsContent.js +2 -2
  504. package/dist/client/settings/SettingsPanel.d.ts +6 -0
  505. package/dist/client/settings/SettingsPanel.js +21 -8
  506. package/dist/client/settings/SettingsRow.d.ts +3 -1
  507. package/dist/client/settings/SettingsRow.js +4 -2
  508. package/dist/client/settings/SettingsSkeleton.js +5 -3
  509. package/dist/client/settings/SettingsTabsPage.js +2 -2
  510. package/dist/client/settings/UsageSection.d.ts +4 -1
  511. package/dist/client/settings/UsageSection.js +187 -93
  512. package/dist/client/settings/agent-settings-search.js +6 -2
  513. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +1 -1
  514. package/dist/client/setup-connections/useBuilderConnectCardController.js +2 -2
  515. package/dist/client/sharing/ShareButton.d.ts +2 -0
  516. package/dist/client/sharing/ShareButton.js +9 -2
  517. package/dist/client/sharing/ShareDialog.js +4 -1
  518. package/dist/client/sharing/useShareButtonController.d.ts +2 -1
  519. package/dist/client/sharing/useShareButtonController.js +8 -0
  520. package/dist/client/sharing/useShareDialogController.d.ts +1 -1
  521. package/dist/client/sharing/useShareDialogController.js +2 -1
  522. package/dist/collab/struct-routes.d.ts +1 -1
  523. package/dist/config.d.ts +13 -0
  524. package/dist/config.js +53 -0
  525. package/dist/dashboard-storage/schema.d.ts +2 -2
  526. package/dist/data-programs/schema.d.ts +2 -2
  527. package/dist/extensions/actions.js +2 -1
  528. package/dist/extensions/html-shell.d.ts +2 -2
  529. package/dist/extensions/routes.js +4 -1
  530. package/dist/extensions/schema.d.ts +2 -2
  531. package/dist/file-upload/pre-upload-attachments.js +1 -1
  532. package/dist/framework-tools.js +3 -0
  533. package/dist/history/types.d.ts +1 -1
  534. package/dist/index.d.ts +2 -1
  535. package/dist/index.js +2 -1
  536. package/dist/jobs/background-automation-runner.d.ts +1 -0
  537. package/dist/jobs/background-automation-runner.js +4 -2
  538. package/dist/jobs/frontmatter.d.ts +4 -0
  539. package/dist/jobs/frontmatter.js +16 -0
  540. package/dist/jobs/run-history.js +1 -1
  541. package/dist/jobs/tools.js +9 -5
  542. package/dist/localization/default-messages.d.ts +27 -0
  543. package/dist/localization/default-messages.js +28 -1
  544. package/dist/notifications/routes.d.ts +5 -5
  545. package/dist/observability/routes.d.ts +3 -3
  546. package/dist/onboarding/plugin.js +17 -2
  547. package/dist/org/context.js +16 -0
  548. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  549. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  550. package/dist/review/actions/create-review-comment.js +1 -1
  551. package/dist/review/actions/delete-review-comment.js +4 -1
  552. package/dist/review/actions/list-review-comments.js +4 -2
  553. package/dist/review/actions/reply-review-comment.js +1 -1
  554. package/dist/review/types.d.ts +1 -1
  555. package/dist/secrets/routes.d.ts +9 -9
  556. package/dist/server/action-discovery.js +29 -0
  557. package/dist/server/agent-chat/plugin-options.d.ts +7 -0
  558. package/dist/server/agent-chat-plugin.d.ts +2 -0
  559. package/dist/server/agent-chat-plugin.js +12 -4
  560. package/dist/server/builder-browser.js +31 -0
  561. package/dist/server/onboarding-html.js +1 -1
  562. package/dist/server/transcribe-voice.d.ts +1 -1
  563. package/dist/server/workspace-provider-oauth.js +38 -26
  564. package/dist/setup-connections/index.d.ts +1 -1
  565. package/dist/setup-connections/index.js +1 -1
  566. package/dist/shared/first-run-onboarding.d.ts +6 -0
  567. package/dist/shared/first-run-onboarding.js +6 -0
  568. package/dist/sharing/access.d.ts +1 -1
  569. package/dist/sharing/access.js +4 -1
  570. package/dist/sharing/actions/share-resource.d.ts +1 -1
  571. package/dist/sharing/actions/share-resource.js +2 -2
  572. package/dist/sharing/registry.d.ts +2 -2
  573. package/dist/sharing/schema.d.ts +5 -5
  574. package/dist/sharing/schema.js +9 -6
  575. package/dist/styles/agent-native.css +21 -0
  576. package/dist/styles/chat-history-list.css +1 -1
  577. package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +3 -2
  578. package/dist/templates/chat/.agents/skills/context-awareness/SKILL.md +206 -0
  579. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +73 -80
  580. package/dist/templates/chat/.agents/skills/portability/SKILL.md +107 -0
  581. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +339 -0
  582. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +3 -3
  583. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +1 -1
  584. package/dist/templates/chat/.agents/skills/sharing/SKILL.md +1 -0
  585. package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +116 -44
  586. package/dist/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  587. package/dist/templates/chat/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  588. package/dist/templates/chat/.agents/skills/workspace-conventions/SKILL.md +93 -0
  589. package/dist/templates/chat/AGENTS.md +4 -5
  590. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +3 -2
  591. package/dist/templates/default/.agents/skills/context-awareness/SKILL.md +206 -0
  592. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +73 -80
  593. package/dist/templates/default/.agents/skills/portability/SKILL.md +107 -0
  594. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +3 -3
  595. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +1 -1
  596. package/dist/templates/default/.agents/skills/sharing/SKILL.md +233 -0
  597. package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +116 -44
  598. package/dist/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  599. package/dist/templates/default/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  600. package/dist/templates/default/.agents/skills/workspace-conventions/SKILL.md +93 -0
  601. package/dist/templates/default/AGENTS.md +17 -2
  602. package/dist/templates/default/agent-native.config.ts +6 -0
  603. package/dist/templates/default/app/i18n/ar-SA.ts +2 -0
  604. package/dist/templates/default/app/i18n/de-DE.ts +2 -0
  605. package/dist/templates/default/app/i18n/en-US.ts +3 -1
  606. package/dist/templates/default/app/i18n/es-ES.ts +2 -0
  607. package/dist/templates/default/app/i18n/fr-FR.ts +2 -0
  608. package/dist/templates/default/app/i18n/hi-IN.ts +2 -0
  609. package/dist/templates/default/app/i18n/ja-JP.ts +2 -0
  610. package/dist/templates/default/app/i18n/ko-KR.ts +2 -0
  611. package/dist/templates/default/app/i18n/pt-BR.ts +2 -0
  612. package/dist/templates/default/app/i18n/zh-CN.ts +2 -0
  613. package/dist/templates/default/app/i18n/zh-TW.ts +2 -0
  614. package/dist/templates/headless/.agents/skills/delegate-to-agent/SKILL.md +289 -0
  615. package/dist/templates/headless/.agents/skills/security/SKILL.md +324 -0
  616. package/dist/templates/headless/.agents/skills/storing-data/SKILL.md +178 -0
  617. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +3 -2
  618. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +73 -80
  619. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +3 -3
  620. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +1 -1
  621. package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +1 -0
  622. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +116 -44
  623. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  624. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  625. package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +3 -2
  626. package/dist/templates/workspace-core/AGENTS.md +9 -3
  627. package/dist/templates/workspace-root/AGENTS.md +26 -1
  628. package/dist/templates/workspace-root/agent-native.config.ts +8 -0
  629. package/dist/triggers/actions.js +2 -2
  630. package/dist/usage/actions/get-usage-alerts.d.ts +5 -0
  631. package/dist/usage/actions/get-usage-alerts.js +16 -0
  632. package/dist/usage/actions/get-usage-metrics.d.ts +7 -0
  633. package/dist/usage/actions/get-usage-metrics.js +26 -0
  634. package/dist/usage/actions/manage-usage-alert.d.ts +14 -0
  635. package/dist/usage/actions/manage-usage-alert.js +48 -0
  636. package/dist/usage/alerts-store.d.ts +78 -0
  637. package/dist/usage/alerts-store.js +592 -0
  638. package/dist/usage/metrics-store.d.ts +95 -0
  639. package/dist/usage/metrics-store.js +386 -0
  640. package/dist/usage/store.js +10 -0
  641. package/dist/vite/action-types-plugin.js +28 -0
  642. package/dist/vite/agent-native-config-loader.d.ts +6 -0
  643. package/dist/vite/agent-native-config-loader.js +54 -2
  644. package/dist/vite/client.js +11 -5
  645. package/dist/workspace-connections/actions/bulk-update-workspace-user-groups.d.ts +6 -0
  646. package/dist/workspace-connections/actions/bulk-update-workspace-user-groups.js +24 -0
  647. package/dist/workspace-connections/actions/delete-workspace-user-group.d.ts +7 -0
  648. package/dist/workspace-connections/actions/delete-workspace-user-group.js +29 -0
  649. package/dist/workspace-connections/actions/list-workspace-user-groups.d.ts +2 -0
  650. package/dist/workspace-connections/actions/list-workspace-user-groups.js +13 -0
  651. package/dist/workspace-connections/actions/upsert-workspace-user-group.d.ts +6 -0
  652. package/dist/workspace-connections/actions/upsert-workspace-user-group.js +22 -0
  653. package/dist/workspace-connections/credential-key-aliases.d.ts +3 -0
  654. package/dist/workspace-connections/credential-key-aliases.js +31 -0
  655. package/dist/workspace-connections/credentials.js +1 -25
  656. package/dist/workspace-connections/groups.d.ts +32 -0
  657. package/dist/workspace-connections/groups.js +288 -0
  658. package/dist/workspace-connections/index.d.ts +3 -1
  659. package/dist/workspace-connections/index.js +3 -1
  660. package/dist/workspace-connections/store.d.ts +9 -0
  661. package/dist/workspace-connections/store.js +68 -8
  662. package/docs/content/components.mdx +2 -2
  663. package/docs/content/sharing.mdx +2 -1
  664. package/package.json +10 -2
  665. package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +3 -2
  666. package/src/templates/chat/.agents/skills/context-awareness/SKILL.md +206 -0
  667. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +73 -80
  668. package/src/templates/chat/.agents/skills/portability/SKILL.md +107 -0
  669. package/src/templates/chat/.agents/skills/secrets/SKILL.md +339 -0
  670. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +3 -3
  671. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +1 -1
  672. package/src/templates/chat/.agents/skills/sharing/SKILL.md +1 -0
  673. package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +116 -44
  674. package/src/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  675. package/src/templates/chat/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  676. package/src/templates/chat/.agents/skills/workspace-conventions/SKILL.md +93 -0
  677. package/src/templates/chat/AGENTS.md +4 -5
  678. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +3 -2
  679. package/src/templates/default/.agents/skills/context-awareness/SKILL.md +206 -0
  680. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +73 -80
  681. package/src/templates/default/.agents/skills/portability/SKILL.md +107 -0
  682. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +3 -3
  683. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +1 -1
  684. package/src/templates/default/.agents/skills/sharing/SKILL.md +233 -0
  685. package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +116 -44
  686. package/src/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  687. package/src/templates/default/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  688. package/src/templates/default/.agents/skills/workspace-conventions/SKILL.md +93 -0
  689. package/src/templates/default/AGENTS.md +17 -2
  690. package/src/templates/default/agent-native.config.ts +6 -0
  691. package/src/templates/default/app/i18n/ar-SA.ts +2 -0
  692. package/src/templates/default/app/i18n/de-DE.ts +2 -0
  693. package/src/templates/default/app/i18n/en-US.ts +3 -1
  694. package/src/templates/default/app/i18n/es-ES.ts +2 -0
  695. package/src/templates/default/app/i18n/fr-FR.ts +2 -0
  696. package/src/templates/default/app/i18n/hi-IN.ts +2 -0
  697. package/src/templates/default/app/i18n/ja-JP.ts +2 -0
  698. package/src/templates/default/app/i18n/ko-KR.ts +2 -0
  699. package/src/templates/default/app/i18n/pt-BR.ts +2 -0
  700. package/src/templates/default/app/i18n/zh-CN.ts +2 -0
  701. package/src/templates/default/app/i18n/zh-TW.ts +2 -0
  702. package/src/templates/headless/.agents/skills/delegate-to-agent/SKILL.md +289 -0
  703. package/src/templates/headless/.agents/skills/security/SKILL.md +324 -0
  704. package/src/templates/headless/.agents/skills/storing-data/SKILL.md +178 -0
  705. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +3 -2
  706. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +73 -80
  707. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +3 -3
  708. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +1 -1
  709. package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +1 -0
  710. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +116 -44
  711. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  712. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  713. package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +3 -2
  714. package/src/templates/workspace-core/AGENTS.md +9 -3
  715. package/src/templates/workspace-root/AGENTS.md +26 -1
  716. package/src/templates/workspace-root/agent-native.config.ts +8 -0
  717. package/corpus/templates/analytics/.agents/skills/capture-learnings/SKILL.md +0 -89
  718. package/corpus/templates/analytics/.agents/skills/create-skill/SKILL.md +0 -195
  719. package/corpus/templates/analytics/.agents/skills/feature-flags/SKILL.md +0 -169
  720. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  721. package/corpus/templates/assets/.agents/skills/capture-learnings/SKILL.md +0 -89
  722. package/corpus/templates/assets/.agents/skills/create-skill/SKILL.md +0 -195
  723. package/corpus/templates/assets/.agents/skills/feature-flags/SKILL.md +0 -169
  724. package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +0 -392
  725. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  726. package/corpus/templates/brain/.agents/skills/capture-learnings/SKILL.md +0 -89
  727. package/corpus/templates/brain/.agents/skills/create-skill/SKILL.md +0 -195
  728. package/corpus/templates/brain/.agents/skills/feature-flags/SKILL.md +0 -169
  729. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  730. package/corpus/templates/calendar/.agents/skills/capture-learnings/SKILL.md +0 -89
  731. package/corpus/templates/calendar/.agents/skills/create-skill/SKILL.md +0 -195
  732. package/corpus/templates/calendar/.agents/skills/feature-flags/SKILL.md +0 -169
  733. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  734. package/corpus/templates/chat/.agents/skills/capture-learnings/SKILL.md +0 -89
  735. package/corpus/templates/chat/.agents/skills/create-skill/SKILL.md +0 -195
  736. package/corpus/templates/chat/.agents/skills/feature-flags/SKILL.md +0 -169
  737. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  738. package/corpus/templates/clips/.agents/skills/capture-learnings/SKILL.md +0 -89
  739. package/corpus/templates/clips/.agents/skills/create-skill/SKILL.md +0 -195
  740. package/corpus/templates/clips/.agents/skills/feature-flags/SKILL.md +0 -169
  741. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  742. package/corpus/templates/content/.agents/skills/capture-learnings/SKILL.md +0 -89
  743. package/corpus/templates/content/.agents/skills/create-skill/SKILL.md +0 -195
  744. package/corpus/templates/content/.agents/skills/feature-flags/SKILL.md +0 -169
  745. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  746. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
  747. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  748. package/corpus/templates/design/.agents/skills/capture-learnings/SKILL.md +0 -89
  749. package/corpus/templates/design/.agents/skills/create-skill/SKILL.md +0 -195
  750. package/corpus/templates/design/.agents/skills/feature-flags/SKILL.md +0 -169
  751. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  752. package/corpus/templates/dispatch/.agents/skills/capture-learnings/SKILL.md +0 -89
  753. package/corpus/templates/dispatch/.agents/skills/create-skill/SKILL.md +0 -195
  754. package/corpus/templates/dispatch/.agents/skills/feature-flags/SKILL.md +0 -169
  755. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  756. package/corpus/templates/factory/.agents/skills/capture-learnings/SKILL.md +0 -89
  757. package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +0 -195
  758. package/corpus/templates/factory/.agents/skills/feature-flags/SKILL.md +0 -169
  759. package/corpus/templates/factory/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  760. package/corpus/templates/forms/.agents/skills/capture-learnings/SKILL.md +0 -89
  761. package/corpus/templates/forms/.agents/skills/create-skill/SKILL.md +0 -195
  762. package/corpus/templates/forms/.agents/skills/feature-flags/SKILL.md +0 -169
  763. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  764. package/corpus/templates/macros/.agents/skills/feature-flags/SKILL.md +0 -169
  765. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  766. package/corpus/templates/mail/.agents/skills/capture-learnings/SKILL.md +0 -89
  767. package/corpus/templates/mail/.agents/skills/create-skill/SKILL.md +0 -195
  768. package/corpus/templates/mail/.agents/skills/feature-flags/SKILL.md +0 -169
  769. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  770. package/corpus/templates/plan/.agents/skills/capture-learnings/SKILL.md +0 -89
  771. package/corpus/templates/plan/.agents/skills/create-skill/SKILL.md +0 -195
  772. package/corpus/templates/plan/.agents/skills/feature-flags/SKILL.md +0 -169
  773. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  774. package/corpus/templates/slides/.agents/skills/capture-learnings/SKILL.md +0 -89
  775. package/corpus/templates/slides/.agents/skills/create-skill/SKILL.md +0 -195
  776. package/corpus/templates/slides/.agents/skills/feature-flags/SKILL.md +0 -169
  777. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  778. package/corpus/templates/tasks/.agents/skills/capture-learnings/SKILL.md +0 -89
  779. package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +0 -195
  780. package/corpus/templates/tasks/.agents/skills/feature-flags/SKILL.md +0 -169
  781. package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  782. package/dist/templates/chat/.agents/skills/capture-learnings/SKILL.md +0 -89
  783. package/dist/templates/chat/.agents/skills/create-skill/SKILL.md +0 -195
  784. package/dist/templates/chat/.agents/skills/feature-flags/SKILL.md +0 -169
  785. package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  786. package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +0 -89
  787. package/dist/templates/default/.agents/skills/create-skill/SKILL.md +0 -195
  788. package/dist/templates/default/.agents/skills/feature-flags/SKILL.md +0 -169
  789. package/dist/templates/default/.agents/skills/integration-webhooks/SKILL.md +0 -364
  790. package/dist/templates/default/.agents/skills/internationalization/SKILL.md +0 -82
  791. package/dist/templates/default/.agents/skills/onboarding/SKILL.md +0 -56
  792. package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +0 -392
  793. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  794. package/dist/templates/headless/.agents/skills/feature-flags/SKILL.md +0 -169
  795. package/dist/templates/headless/.agents/skills/integration-webhooks/SKILL.md +0 -364
  796. package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +0 -402
  797. package/dist/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +0 -4
  798. package/dist/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +0 -90
  799. package/dist/templates/headless/.agents/skills/turn-into-skill/SKILL.md +0 -112
  800. package/dist/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +0 -4
  801. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  802. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +0 -411
  803. package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +0 -107
  804. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +0 -176
  805. package/dist/templates/workspace-core/.agents/skills/agent-page/SKILL.md +0 -63
  806. package/dist/templates/workspace-core/.agents/skills/audit-log/SKILL.md +0 -96
  807. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +0 -295
  808. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +0 -242
  809. package/dist/templates/workspace-core/.agents/skills/browser-sessions/SKILL.md +0 -131
  810. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +0 -89
  811. package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +0 -114
  812. package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +0 -115
  813. package/dist/templates/workspace-core/.agents/skills/client-methods/references/legacy-client-fetch-audit-2026-06-03.md +0 -62
  814. package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +0 -87
  815. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +0 -139
  816. package/dist/templates/workspace-core/.agents/skills/context-xray/SKILL.md +0 -72
  817. package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +0 -195
  818. package/dist/templates/workspace-core/.agents/skills/data-programs/SKILL.md +0 -128
  819. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +0 -219
  820. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +0 -533
  821. package/dist/templates/workspace-core/.agents/skills/extensions/references/api.md +0 -340
  822. package/dist/templates/workspace-core/.agents/skills/extensions/references/examples.md +0 -259
  823. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +0 -547
  824. package/dist/templates/workspace-core/.agents/skills/external-agents/references/mcp-apps-embedding.md +0 -157
  825. package/dist/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +0 -169
  826. package/dist/templates/workspace-core/.agents/skills/generative-ui/SKILL.md +0 -117
  827. package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +0 -170
  828. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +0 -364
  829. package/dist/templates/workspace-core/.agents/skills/internationalization/SKILL.md +0 -82
  830. package/dist/templates/workspace-core/.agents/skills/mvp-followup/SKILL.md +0 -52
  831. package/dist/templates/workspace-core/.agents/skills/native-navigation/SKILL.md +0 -67
  832. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -329
  833. package/dist/templates/workspace-core/.agents/skills/onboarding/SKILL.md +0 -56
  834. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +0 -299
  835. package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +0 -333
  836. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +0 -392
  837. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +0 -74
  838. package/dist/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +0 -70
  839. package/dist/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +0 -84
  840. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +0 -278
  841. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  842. package/dist/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +0 -101
  843. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +0 -222
  844. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +0 -363
  845. package/src/templates/chat/.agents/skills/capture-learnings/SKILL.md +0 -89
  846. package/src/templates/chat/.agents/skills/create-skill/SKILL.md +0 -195
  847. package/src/templates/chat/.agents/skills/feature-flags/SKILL.md +0 -169
  848. package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  849. package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +0 -89
  850. package/src/templates/default/.agents/skills/create-skill/SKILL.md +0 -195
  851. package/src/templates/default/.agents/skills/feature-flags/SKILL.md +0 -169
  852. package/src/templates/default/.agents/skills/integration-webhooks/SKILL.md +0 -364
  853. package/src/templates/default/.agents/skills/internationalization/SKILL.md +0 -82
  854. package/src/templates/default/.agents/skills/onboarding/SKILL.md +0 -56
  855. package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +0 -392
  856. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  857. package/src/templates/headless/.agents/skills/feature-flags/SKILL.md +0 -169
  858. package/src/templates/headless/.agents/skills/integration-webhooks/SKILL.md +0 -364
  859. package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +0 -402
  860. package/src/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +0 -4
  861. package/src/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +0 -90
  862. package/src/templates/headless/.agents/skills/turn-into-skill/SKILL.md +0 -112
  863. package/src/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +0 -4
  864. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  865. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +0 -411
  866. package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +0 -107
  867. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +0 -176
  868. package/src/templates/workspace-core/.agents/skills/agent-page/SKILL.md +0 -63
  869. package/src/templates/workspace-core/.agents/skills/audit-log/SKILL.md +0 -96
  870. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +0 -295
  871. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +0 -242
  872. package/src/templates/workspace-core/.agents/skills/browser-sessions/SKILL.md +0 -131
  873. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +0 -89
  874. package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +0 -114
  875. package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +0 -115
  876. package/src/templates/workspace-core/.agents/skills/client-methods/references/legacy-client-fetch-audit-2026-06-03.md +0 -62
  877. package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +0 -87
  878. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +0 -139
  879. package/src/templates/workspace-core/.agents/skills/context-xray/SKILL.md +0 -72
  880. package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +0 -195
  881. package/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +0 -128
  882. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +0 -219
  883. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +0 -533
  884. package/src/templates/workspace-core/.agents/skills/extensions/references/api.md +0 -340
  885. package/src/templates/workspace-core/.agents/skills/extensions/references/examples.md +0 -259
  886. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +0 -547
  887. package/src/templates/workspace-core/.agents/skills/external-agents/references/mcp-apps-embedding.md +0 -157
  888. package/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +0 -169
  889. package/src/templates/workspace-core/.agents/skills/generative-ui/SKILL.md +0 -117
  890. package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +0 -170
  891. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +0 -364
  892. package/src/templates/workspace-core/.agents/skills/internationalization/SKILL.md +0 -82
  893. package/src/templates/workspace-core/.agents/skills/mvp-followup/SKILL.md +0 -52
  894. package/src/templates/workspace-core/.agents/skills/native-navigation/SKILL.md +0 -67
  895. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -329
  896. package/src/templates/workspace-core/.agents/skills/onboarding/SKILL.md +0 -56
  897. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +0 -299
  898. package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +0 -333
  899. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +0 -392
  900. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +0 -74
  901. package/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +0 -70
  902. package/src/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +0 -84
  903. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +0 -278
  904. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  905. package/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +0 -101
  906. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +0 -222
  907. package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +0 -363
@@ -1,112 +1,206 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { IconLoader2, IconRefresh } from "@tabler/icons-react";
3
- import { useEffect, useState } from "react";
4
- import { agentNativePath } from "../api-path.js";
5
- const RANGES = [
6
- { value: 1, label: "24h" },
2
+ import { Skeleton } from "@agent-native/toolkit/design-system";
3
+ import { Badge } from "@agent-native/toolkit/ui/badge";
4
+ import { Button } from "@agent-native/toolkit/ui/button";
5
+ import { Checkbox } from "@agent-native/toolkit/ui/checkbox";
6
+ import { Input } from "@agent-native/toolkit/ui/input";
7
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@agent-native/toolkit/ui/select";
8
+ import { IconArrowUpRight, IconBell, IconChartLine, IconChevronDown, IconLoader2, IconMail, IconPencil, IconPlus, IconRefresh, IconUsers, IconX, } from "@tabler/icons-react";
9
+ import { useState } from "react";
10
+ import { Link } from "react-router";
11
+ import { useActionMutation, useActionQuery } from "../use-action.js";
12
+ const LOOKBACKS = [
7
13
  { value: 7, label: "7d" },
8
14
  { value: 30, label: "30d" },
9
15
  { value: 90, label: "90d" },
10
16
  ];
11
- const USD_BILLING = {
12
- unit: "usd",
13
- label: "Estimated spend",
14
- shortLabel: "Cost",
15
- source: "estimated-provider-cost",
16
- };
17
- function displayAmountFromCostCents(cents, billing) {
18
- if (billing.unit !== "builder-credits")
19
- return cents;
20
- const margin = billing.hardCostMarginMultiplier ?? 1.25;
21
- const creditsPerUsd = billing.creditsPerUsd ?? 20;
22
- const credits = (cents / 100) * margin * creditsPerUsd;
23
- return credits <= 0 ? 0 : Math.ceil(credits * 1000) / 1000;
17
+ function asAlertRules(value) {
18
+ if (Array.isArray(value))
19
+ return value;
20
+ if (value && typeof value === "object") {
21
+ const rules = value.rules;
22
+ if (Array.isArray(rules))
23
+ return rules;
24
+ }
25
+ return [];
24
26
  }
25
- function formatCredits(credits) {
26
- if (!Number.isFinite(credits) || credits === 0)
27
- return "0 credits";
28
- const maximumFractionDigits = credits < 1 ? 3 : credits < 10 ? 2 : 1;
29
- const value = credits.toLocaleString(undefined, {
30
- maximumFractionDigits,
31
- });
32
- return `${value} ${credits === 1 ? "credit" : "credits"}`;
27
+ function compactNumber(value) {
28
+ if (!Number.isFinite(value) || value === 0)
29
+ return "0";
30
+ if (value >= 1_000_000)
31
+ return `${(value / 1_000_000).toFixed(1)}M`;
32
+ if (value >= 1_000)
33
+ return `${(value / 1_000).toFixed(1)}K`;
34
+ return Math.round(value).toLocaleString();
33
35
  }
34
- function formatSpend(cents, billing) {
36
+ function formatCost(cents, billing) {
35
37
  if (billing.unit === "builder-credits") {
36
- return formatCredits(displayAmountFromCostCents(cents, billing));
38
+ const credits = (cents / 100) *
39
+ (billing.hardCostMarginMultiplier ?? 1.25) *
40
+ (billing.creditsPerUsd ?? 20);
41
+ return `${credits.toLocaleString(undefined, { maximumFractionDigits: 1 })} credits`;
37
42
  }
38
- // Sub-cent values (e.g. a single LLM call at $0.0045 = 0.45¢) — keep
39
- // three decimals so tiny calls don't round to 0.00¢. The prior impl
40
- // multiplied by 100 in this branch, overstating small costs 100×.
41
- if (cents < 1)
42
- return `${cents.toFixed(3)}¢`;
43
43
  if (cents < 100)
44
44
  return `${cents.toFixed(2)}¢`;
45
- return `$${(cents / 100).toFixed(2)}`;
45
+ return `$${(cents / 100).toLocaleString(undefined, {
46
+ minimumFractionDigits: 2,
47
+ maximumFractionDigits: 2,
48
+ })}`;
46
49
  }
47
- function formatAggregateCost(cost, billing) {
48
- if (cost.status === "known")
49
- return formatSpend(cost.knownCents, billing);
50
- if (cost.status === "unavailable")
51
- return "Unknown";
52
- return `${formatSpend(cost.knownCents, billing)} + ${cost.unavailableCalls} unpriced`;
50
+ function formatAlertValue(rule, value) {
51
+ if (rule.unit === "usd") {
52
+ return value.toLocaleString(undefined, {
53
+ style: "currency",
54
+ currency: "USD",
55
+ maximumFractionDigits: 2,
56
+ });
57
+ }
58
+ return `${value.toLocaleString(undefined, {
59
+ maximumFractionDigits: rule.unit === "tokens" ? 0 : 2,
60
+ })} ${rule.unit === "builder-credits" ? "credits" : "tokens"}`;
53
61
  }
54
- function formatTokens(n) {
55
- if (n >= 1_000_000)
56
- return `${(n / 1_000_000).toFixed(1)}M`;
57
- if (n >= 1_000)
58
- return `${(n / 1_000).toFixed(1)}K`;
59
- return String(n);
62
+ function appLabel(value) {
63
+ if (!value)
64
+ return "All apps";
65
+ const normalized = value.replace(/^agent-native-/i, "").replaceAll("-", " ");
66
+ return normalized.replace(/\b\w/g, (letter) => letter.toUpperCase());
60
67
  }
61
- function BucketBars({ buckets, emptyMessage, billing, }) {
62
- if (buckets.length === 0) {
63
- return (_jsx("p", { className: "text-[10px] text-muted-foreground py-1.5", children: emptyMessage }));
68
+ function Trend({ daily, billing, }) {
69
+ if (daily.length === 0) {
70
+ return (_jsx("div", { className: "flex h-32 items-center justify-center rounded-lg border border-dashed border-border/70 text-sm text-muted-foreground", children: "No usage recorded in this lookback." }));
64
71
  }
65
- const max = Math.max(...buckets.map((b) => displayAmountFromCostCents(b.cents, billing)), 0.0001);
66
- return (_jsx("div", { className: "space-y-1", children: buckets.map((b) => (_jsxs("div", { className: "text-[10px]", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 mb-0.5", children: [_jsx("span", { className: "truncate text-foreground", title: b.key || "(none)", children: b.key || "(none)" }), _jsxs("span", { className: "shrink-0 text-muted-foreground tabular-nums", children: [formatAggregateCost(b.cost, billing), _jsxs("span", { className: "ms-1 opacity-60", children: ["\u00B7 ", formatTokens(b.inputTokens + b.outputTokens), " tok"] })] })] }), _jsx("div", { className: "h-1 rounded-full bg-accent/40 overflow-hidden", children: _jsx("div", { className: "h-full bg-foreground/70", style: {
67
- width: `${(displayAmountFromCostCents(b.cents, billing) / max) * 100}%`,
68
- } }) })] }, b.key))) }));
72
+ const values = daily.map((day) => billing.unit === "builder-credits"
73
+ ? (day.costCents / 100) *
74
+ (billing.hardCostMarginMultiplier ?? 1.25) *
75
+ (billing.creditsPerUsd ?? 20)
76
+ : day.costCents);
77
+ const max = Math.max(...values, 0.01);
78
+ const points = values.map((value, index) => {
79
+ const x = daily.length === 1 ? 50 : (index / (daily.length - 1)) * 100;
80
+ const y = 88 - (value / max) * 72;
81
+ return `${x.toFixed(2)},${y.toFixed(2)}`;
82
+ });
83
+ const line = points
84
+ .map((point, index) => `${index === 0 ? "M" : "L"} ${point}`)
85
+ .join(" ");
86
+ const area = `${line} L 100,96 L 0,96 Z`;
87
+ return (_jsxs("div", { className: "overflow-hidden rounded-lg border border-border/70 bg-muted/20 px-3 pb-2 pt-3", children: [_jsxs("svg", { "aria-label": "Daily usage trend", className: "h-32 w-full text-primary", viewBox: "0 0 100 96", preserveAspectRatio: "none", role: "img", children: [_jsx("path", { d: area, className: "fill-current opacity-10" }), _jsx("path", { d: line, className: "fill-none stroke-current", strokeWidth: "1.5", vectorEffect: "non-scaling-stroke" })] }), _jsxs("div", { className: "flex justify-between text-[11px] text-muted-foreground", children: [_jsx("span", { children: new Date(`${daily[0].date}T00:00:00`).toLocaleDateString(undefined, { month: "short", day: "numeric" }) }), _jsx("span", { children: new Date(`${daily.at(-1).date}T00:00:00`).toLocaleDateString(undefined, { month: "short", day: "numeric" }) })] })] }));
88
+ }
89
+ function MetricCard({ label, value, detail, accent = false, }) {
90
+ return (_jsxs("div", { className: "min-w-0 rounded-lg border border-border/70 bg-card px-4 py-4", children: [_jsx("div", { className: "text-xs font-medium text-muted-foreground", children: label }), _jsx("div", { className: `mt-1 truncate text-xl font-semibold tracking-[-0.02em] tabular-nums ${accent ? "text-primary" : "text-foreground"}`, children: value }), _jsx("div", { className: "mt-1 truncate text-xs text-muted-foreground", children: detail })] }));
91
+ }
92
+ function DriverList({ title, rows, billing, }) {
93
+ const max = Math.max(...rows.map((row) => row.costCents), 1);
94
+ return (_jsxs("div", { children: [_jsxs("div", { className: "mb-3 flex items-center justify-between gap-3", children: [_jsx("h3", { className: "text-sm font-semibold text-foreground", children: title }), _jsx("span", { className: "text-[11px] uppercase tracking-[0.08em] text-muted-foreground", children: "Spend" })] }), rows.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "No usage recorded yet." })) : (_jsx("div", { className: "space-y-3", children: rows.slice(0, 5).map((row) => (_jsxs("div", { children: [_jsxs("div", { className: "flex items-center justify-between gap-3 text-sm", children: [_jsx("span", { className: "min-w-0 truncate text-foreground", title: row.label, children: row.label }), _jsx("span", { className: "shrink-0 tabular-nums text-muted-foreground", children: formatCost(row.costCents, billing) })] }), _jsx("div", { className: "mt-1.5 h-1 overflow-hidden rounded-full bg-muted", children: _jsx("div", { className: "h-full rounded-full bg-primary/70", style: {
95
+ width: `${Math.max(4, (row.costCents / max) * 100)}%`,
96
+ } }) })] }, row.key))) }))] }));
69
97
  }
70
- function DailySparkline({ days, billing, }) {
71
- if (days.length === 0)
72
- return null;
73
- const max = Math.max(...days.map((d) => displayAmountFromCostCents(d.cents, billing)), 0.0001);
74
- return (_jsx("div", { className: "flex items-end gap-[2px] h-8 pt-2", children: days.map((d) => (_jsx("div", { className: "flex-1 bg-foreground/60 rounded-sm min-h-[1px]", style: {
75
- height: `${Math.max(2, (displayAmountFromCostCents(d.cents, billing) / max) * 100)}%`,
76
- }, title: `${d.date}: ${formatAggregateCost(d.cost, billing)} (${d.calls} calls)` }, d.date))) }));
98
+ function UsageLoadingState() {
99
+ return (_jsxs("div", { className: "space-y-5", role: "status", "aria-label": "Loading usage", children: [_jsx("div", { className: "grid gap-3 sm:grid-cols-3", children: ["w-24", "w-16", "w-20"].map((width) => (_jsxs("div", { className: "rounded-lg border border-border/70 p-4", children: [_jsx(Skeleton, { className: `h-3 ${width}` }), _jsx(Skeleton, { className: "mt-3 h-6 w-24" }), _jsx(Skeleton, { className: "mt-2 h-3 w-28" })] }, width))) }), _jsxs("div", { className: "rounded-lg border border-border/70 p-4", children: [_jsx(Skeleton, { className: "h-4 w-32" }), _jsx(Skeleton, { className: "mt-3 h-32 w-full" })] })] }));
77
100
  }
78
- export function UsageSection() {
79
- const [days, setDays] = useState(30);
80
- const [data, setData] = useState(null);
81
- const [loading, setLoading] = useState(false);
82
- const [error, setError] = useState(null);
83
- const billing = data?.billing ?? USD_BILLING;
84
- const load = async (rangeDays) => {
85
- setLoading(true);
86
- setError(null);
87
- try {
88
- const res = await fetch(agentNativePath(`/_agent-native/usage?sinceDays=${rangeDays}`));
89
- if (!res.ok) {
90
- throw new Error(`Failed (${res.status})`);
91
- }
92
- const json = (await res.json());
93
- setData(json);
94
- }
95
- catch (err) {
96
- setError(err?.message || "Failed to load usage");
97
- }
98
- finally {
99
- setLoading(false);
100
- }
101
+ function AlertEditor({ draft, onChange, onSave, onCancel, isPending, }) {
102
+ const channelCount = Number(draft.inApp) + Number(draft.email);
103
+ return (_jsxs("div", { className: "mt-3 rounded-lg border border-border/70 bg-muted/20 p-3", children: [_jsxs("div", { className: "grid gap-3 sm:grid-cols-[1fr_1fr_1fr]", children: [_jsxs("label", { className: "space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: "Unit" }), _jsxs(Select, { value: draft.unit, onValueChange: (value) => onChange({ unit: value }), children: [_jsx(SelectTrigger, { className: "h-9 bg-background text-sm", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "usd", children: "Dollars" }), _jsx(SelectItem, { value: "builder-credits", children: "Builder credits" }), _jsx(SelectItem, { value: "tokens", children: "Tokens" })] })] })] }), _jsxs("label", { className: "space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: "Threshold" }), _jsx(Input, { type: "number", min: "0.01", step: draft.unit === "tokens" ? "1" : "0.01", value: draft.limit, onChange: (event) => onChange({ limit: event.target.value }), className: "h-9 bg-background text-sm" })] }), _jsxs("label", { className: "space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: "Window" }), _jsxs(Select, { value: draft.period, onValueChange: (value) => onChange({ period: value }), children: [_jsx(SelectTrigger, { className: "h-9 bg-background text-sm", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "day", children: "Per day" }), _jsx(SelectItem, { value: "month", children: "Per month" })] })] })] })] }), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-4 text-xs text-muted-foreground", children: [_jsx("span", { className: "font-medium text-foreground", children: "Deliver via" }), _jsxs("label", { className: "inline-flex items-center gap-2", children: [_jsx(Checkbox, { checked: draft.inApp, onCheckedChange: (checked) => onChange({ inApp: checked === true }) }), _jsx(IconBell, { className: "size-3.5" }), " In app"] }), _jsxs("label", { className: "inline-flex items-center gap-2", children: [_jsx(Checkbox, { checked: draft.email, onCheckedChange: (checked) => onChange({ email: checked === true }) }), _jsx(IconMail, { className: "size-3.5" }), " Email"] }), _jsxs("div", { className: "ms-auto flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onCancel, children: "Cancel" }), _jsxs(Button, { type: "button", size: "sm", onClick: onSave, disabled: isPending || channelCount === 0, children: [isPending ? _jsx(IconLoader2, { className: "animate-spin" }) : null, "Save alert"] })] })] })] }));
104
+ }
105
+ function UsageAlertsSection({ appId }) {
106
+ const query = useActionQuery("get-usage-alerts", {
107
+ scope: "user",
108
+ appId,
109
+ });
110
+ const mutation = useActionMutation("manage-usage-alert");
111
+ const [editing, setEditing] = useState(null);
112
+ const rules = asAlertRules(query.data);
113
+ function saveDraft() {
114
+ if (!editing)
115
+ return;
116
+ const limit = Number(editing.limit);
117
+ const channels = [];
118
+ if (editing.inApp)
119
+ channels.push("in-app");
120
+ if (editing.email)
121
+ channels.push("email");
122
+ if (!Number.isFinite(limit) || limit <= 0 || channels.length === 0)
123
+ return;
124
+ mutation.mutate({
125
+ operation: "save",
126
+ scope: "user",
127
+ ruleId: editing.ruleId,
128
+ appId: editing.appId,
129
+ unit: editing.unit,
130
+ period: editing.period,
131
+ limit,
132
+ channels,
133
+ enabled: true,
134
+ });
135
+ setEditing(null);
136
+ }
137
+ function editRule(rule) {
138
+ setEditing({
139
+ ruleId: rule.id,
140
+ appId: rule.appId,
141
+ unit: rule.unit,
142
+ period: rule.period,
143
+ limit: String(rule.limit),
144
+ inApp: rule.channels.includes("in-app"),
145
+ email: rule.channels.includes("email"),
146
+ });
147
+ }
148
+ return (_jsxs("section", { className: "rounded-lg border border-border/70 bg-card", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3 border-b border-border/70 px-4 py-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-0.5 rounded-md bg-primary/10 p-2 text-primary", children: _jsx(IconBell, { className: "size-4" }) }), _jsxs("div", { children: [_jsx("h2", { className: "text-sm font-semibold text-foreground", children: "Usage alerts" }), _jsx("p", { className: "mt-1 max-w-xl text-xs leading-5 text-muted-foreground", children: "Inherited defaults and app-specific thresholds for this app." })] })] }), appId ? (_jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setEditing({
149
+ appId,
150
+ unit: "usd",
151
+ period: "day",
152
+ limit: "100",
153
+ inApp: true,
154
+ email: true,
155
+ }), disabled: mutation.isPending, children: [_jsx(IconPlus, {}), " Add app alert"] })) : null] }), _jsxs("div", { className: "divide-y divide-border/70", children: [query.isLoading && rules.length === 0 ? (_jsxs("div", { className: "space-y-3 px-4 py-5", children: [_jsx(Skeleton, { className: "h-4 w-40" }), _jsx(Skeleton, { className: "h-3 w-72" })] })) : null, query.isError ? (_jsx("div", { className: "px-4 py-5 text-sm text-destructive", children: "Usage alerts are unavailable for this account." })) : null, !query.isLoading && !query.isError && rules.length === 0 ? (_jsx("div", { className: "px-4 py-5 text-sm text-muted-foreground", children: "No alert rules are configured." })) : null, rules.map((rule) => {
156
+ const isEditing = editing?.ruleId === rule.id;
157
+ const statusLabel = rule.status === "triggered"
158
+ ? "Over limit"
159
+ : rule.status === "dismissed"
160
+ ? "Dismissed"
161
+ : "On track";
162
+ return (_jsxs("div", { className: "px-4 py-4", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: rule.isDefault ? "All apps" : appLabel(rule.appId) }), rule.isDefault ? (_jsx(Badge, { variant: "secondary", children: "Inherited default" })) : null, _jsx(Badge, { variant: rule.status === "triggered"
163
+ ? "destructive"
164
+ : rule.status === "dismissed"
165
+ ? "secondary"
166
+ : "outline", children: statusLabel })] }), _jsxs("p", { className: "mt-1 text-xs text-muted-foreground", children: [formatAlertValue(rule, rule.current), " of", " ", formatAlertValue(rule, rule.limit), " \u00B7 per ", rule.period, rule.percent > 0 ? ` · ${rule.percent}%` : ""] }), _jsxs("div", { className: "mt-2 flex flex-wrap gap-3 text-[11px] text-muted-foreground", children: [rule.channels.includes("in-app") ? (_jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(IconBell, { className: "size-3.5" }), " In app"] })) : null, rule.channels.includes("email") ? (_jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(IconMail, { className: "size-3.5" }), " Email"] })) : null] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { checked: rule.enabled, onCheckedChange: (checked) => mutation.mutate({
167
+ operation: "set-enabled",
168
+ scope: "user",
169
+ ruleId: rule.id,
170
+ enabled: checked === true,
171
+ }), "aria-label": `${rule.enabled ? "Disable" : "Enable"} usage alert`, disabled: mutation.isPending }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => editRule(rule), "aria-label": "Edit usage alert", disabled: mutation.isPending, children: _jsx(IconPencil, {}) }), rule.status === "triggered" ? (_jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => mutation.mutate({
172
+ operation: "dismiss",
173
+ scope: "user",
174
+ ruleId: rule.id,
175
+ }), "aria-label": "Dismiss usage alert", disabled: mutation.isPending, children: _jsx(IconX, {}) })) : null] })] }), isEditing && editing ? (_jsx(AlertEditor, { draft: editing, onChange: (patch) => setEditing((current) => current ? { ...current, ...patch } : current), onSave: saveDraft, onCancel: () => setEditing(null), isPending: mutation.isPending })) : null] }, rule.id));
176
+ }), editing && !editing.ruleId ? (_jsxs("div", { className: "px-4 py-4", children: [_jsx("div", { className: "mb-2 text-xs font-medium text-muted-foreground", children: appLabel(editing.appId) }), _jsx(AlertEditor, { draft: editing, onChange: (patch) => setEditing((current) => current ? { ...current, ...patch } : current), onSave: saveDraft, onCancel: () => setEditing(null), isPending: mutation.isPending })] })) : null] })] }));
177
+ }
178
+ export function UsageSection({ appId = null, viewAllHref, }) {
179
+ const [sinceDays, setSinceDays] = useState(30);
180
+ const [scope, setScope] = useState("me");
181
+ const [selectedUserEmail, setSelectedUserEmail] = useState(null);
182
+ const query = useActionQuery("get-usage-metrics", {
183
+ sinceDays,
184
+ scope,
185
+ userEmail: scope === "workspace" ? (selectedUserEmail ?? undefined) : undefined,
186
+ appId: appId ?? undefined,
187
+ });
188
+ const data = query.data;
189
+ const billing = data?.billing ?? {
190
+ unit: "usd",
191
+ label: "Estimated spend",
101
192
  };
102
- useEffect(() => {
103
- load(days);
104
- }, [days]);
105
- return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "flex gap-1 rounded-md border border-border p-0.5", children: RANGES.map((r) => (_jsx("button", { onClick: () => setDays(r.value), className: `px-2 py-0.5 text-[10px] rounded ${days === r.value
106
- ? "bg-accent text-foreground"
107
- : "text-muted-foreground hover:text-foreground"}`, children: r.label }, r.value))) }), _jsx("button", { onClick: () => load(days), className: "flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground", disabled: loading, children: loading ? (_jsx(IconLoader2, { size: 11, className: "animate-spin" })) : (_jsx(IconRefresh, { size: 11 })) })] }), error && _jsx("p", { className: "text-[10px] text-red-500", children: error }), data && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "rounded-md border border-border px-2.5 py-2", children: [_jsxs("div", { className: "flex items-baseline justify-between", children: [_jsxs("div", { children: [_jsx("div", { className: "text-[10px] text-muted-foreground", children: billing.unit === "builder-credits"
108
- ? "Builder.io credit spend"
109
- : "Total spend" }), _jsx("div", { className: "text-[18px] font-semibold tabular-nums", children: formatAggregateCost(data.totalCost, billing) })] }), _jsxs("div", { className: "text-end", children: [_jsxs("div", { className: "text-[10px] text-muted-foreground", children: [data.totalCalls, " calls"] }), _jsxs("div", { className: "text-[10px] text-muted-foreground", children: [formatTokens(data.totalInputTokens), " in \u00B7", " ", formatTokens(data.totalOutputTokens), " out"] }), data.totalCacheReadTokens > 0 && (_jsxs("div", { className: "text-[10px] text-green-500/80", children: [formatTokens(data.totalCacheReadTokens), " cached"] }))] })] }), _jsx(DailySparkline, { days: data.byDay, billing: billing })] }), _jsxs("div", { children: [_jsx("div", { className: "text-[10px] font-medium text-foreground mb-1", children: "By label" }), _jsx(BucketBars, { buckets: data.byLabel, emptyMessage: "No labeled calls yet.", billing: billing })] }), _jsxs("div", { children: [_jsx("div", { className: "text-[10px] font-medium text-foreground mb-1", children: "By model" }), _jsx(BucketBars, { buckets: data.byModel, emptyMessage: "No calls recorded.", billing: billing })] }), data.byApp.filter((b) => b.key).length > 1 && (_jsxs("div", { children: [_jsx("div", { className: "text-[10px] font-medium text-foreground mb-1", children: "By app" }), _jsx(BucketBars, { buckets: data.byApp, emptyMessage: "", billing: billing })] })), data.recent.length > 0 && (_jsxs("details", { children: [_jsxs("summary", { className: "text-[10px] font-medium text-foreground cursor-pointer select-none hover:text-foreground/80", children: ["Recent calls (", data.recent.length, ")"] }), _jsx("div", { className: "mt-1.5 max-h-48 overflow-y-auto space-y-0.5 rounded border border-border", children: data.recent.map((r) => (_jsxs("div", { className: "flex items-center justify-between gap-2 px-2 py-1 text-[10px] border-b border-border last:border-b-0", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "truncate text-foreground", title: r.label, children: [r.label, r.app ? (_jsxs("span", { className: "text-muted-foreground", children: [" ", "\u00B7 ", r.app] })) : null] }), _jsxs("div", { className: "truncate text-muted-foreground", children: [new Date(r.createdAt).toLocaleString(), " \u00B7 ", r.model] })] }), _jsx("div", { className: "shrink-0 text-end tabular-nums text-muted-foreground", children: r.costSource === "unavailable"
110
- ? "Unknown"
111
- : formatSpend(r.cents, billing) })] }, r.id))) })] })), billing.unit === "builder-credits" ? (_jsxs("p", { className: "text-[10px] text-muted-foreground", children: ["Builder.io credits are estimated from hard token cost, a", " ", billing.hardCostMarginMultiplier ?? 1.25, "x margin, and", " ", billing.creditsPerUsd ?? 20, " credits per dollar."] })) : (_jsx("p", { className: "text-[10px] text-muted-foreground", children: "Spend is estimated from published Anthropic pricing and your own recorded token counts. Cached input is priced at ~10% of regular input. Calls without provider pricing are marked unknown and excluded from known-cost subtotals." }))] }))] }));
193
+ const totalTokens = data
194
+ ? data.totals.inputTokens +
195
+ data.totals.outputTokens +
196
+ (data.totals.cacheReadTokens ?? 0) +
197
+ (data.totals.cacheWriteTokens ?? 0)
198
+ : 0;
199
+ return (_jsxs("div", { className: "mx-auto w-full max-w-5xl space-y-6", children: [_jsxs("header", { className: "flex flex-col gap-4 border-b border-border/70 pb-5 lg:flex-row lg:items-end lg:justify-between", children: [_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2 text-xs font-medium uppercase tracking-[0.1em] text-primary", children: [_jsx(IconChartLine, { className: "size-4" }), " Usage"] }), _jsxs("h1", { className: "mt-2 text-xl font-semibold tracking-[-0.02em] text-foreground", children: [appLabel(appId), " usage"] }), _jsx("p", { className: "mt-1 max-w-xl text-sm leading-6 text-muted-foreground", children: "A focused view of spend, capacity, and the prompts driving this app." })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [data?.access.canViewWorkspace ? (_jsxs(Select, { value: scope, onValueChange: (value) => {
200
+ setScope(value);
201
+ setSelectedUserEmail(null);
202
+ }, children: [_jsx(SelectTrigger, { className: "h-9 w-32 text-xs", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "me", children: "My usage" }), _jsx(SelectItem, { value: "workspace", children: "Workspace" })] })] })) : null, scope === "workspace" && data ? (_jsxs(Select, { value: selectedUserEmail ?? "all", onValueChange: (value) => setSelectedUserEmail(value === "all" ? null : value), children: [_jsx(SelectTrigger, { className: "h-9 w-44 text-xs", children: _jsx(SelectValue, { placeholder: "All users" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "all", children: "All users" }), data.availableUsers.map((user) => (_jsx(SelectItem, { value: user.email, children: user.email }, user.email)))] })] })) : null, _jsx("div", { className: "flex items-center rounded-md border border-border/70 p-0.5", children: LOOKBACKS.map((range) => (_jsx(Button, { type: "button", variant: sinceDays === range.value ? "secondary" : "ghost", size: "sm", className: "h-8 px-2.5 text-xs", onClick: () => setSinceDays(range.value), children: range.label }, range.value))) }), _jsx(Button, { type: "button", variant: "outline", size: "icon", onClick: () => void query.refetch(), disabled: query.isFetching, "aria-label": "Refresh usage", title: "Refresh usage", children: query.isFetching ? (_jsx(IconLoader2, { className: "animate-spin" })) : (_jsx(IconRefresh, {})) })] })] }), query.isError && !data ? (_jsxs("div", { className: "rounded-lg border border-destructive/30 bg-destructive/5 px-4 py-4 text-sm", role: "alert", children: [_jsx("div", { className: "font-medium text-destructive", children: "Usage data couldn\u2019t be loaded." }), _jsx(Button, { type: "button", variant: "link", size: "sm", className: "mt-1 h-auto p-0", onClick: () => void query.refetch(), children: "Try again" })] })) : null, !data && query.isLoading ? _jsx(UsageLoadingState, {}) : null, data ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid gap-3 sm:grid-cols-3", children: [_jsx(MetricCard, { label: billing.label, value: formatCost(data.totals.costCents, billing), detail: `${sinceDays} day lookback`, accent: true }), _jsx(MetricCard, { label: "Calls", value: data.totals.calls.toLocaleString(), detail: `${data.currentDay.calls.toLocaleString()} today` }), _jsx(MetricCard, { label: "Tokens", value: compactNumber(totalTokens), detail: `${compactNumber(data.currentDay.tokens)} today` })] }), _jsxs("section", { className: "rounded-lg border border-border/70 bg-card p-4", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-sm font-semibold text-foreground", children: "Daily trend" }), _jsxs("p", { className: "mt-1 text-xs text-muted-foreground", children: [formatCost(data.currentDay.costCents, billing), " used today \u00B7", " ", data.currentDay.calls.toLocaleString(), " calls"] })] }), _jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [scope === "workspace" ? (_jsx(IconUsers, { className: "size-3.5" })) : null, scope === "workspace"
203
+ ? (selectedUserEmail ?? "All users")
204
+ : "Your usage"] })] }), _jsx("div", { className: "mt-4", children: _jsx(Trend, { daily: data.daily, billing: billing }) })] }), _jsxs("details", { className: "group rounded-lg border border-border/70 bg-card", children: [_jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-4 outline-none transition-colors hover:bg-accent/30 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset [&::-webkit-details-marker]:hidden", children: [_jsxs("span", { children: [_jsx("span", { className: "block text-sm font-semibold text-foreground", children: "Top usage drivers" }), _jsx("span", { className: "mt-1 block text-xs text-muted-foreground", children: "Breakdowns stay collapsed until you need them." })] }), _jsx(IconChevronDown, { className: "size-4 text-muted-foreground transition-transform group-open:rotate-180" })] }), _jsxs("div", { className: "grid gap-6 border-t border-border/70 px-4 py-4 md:grid-cols-2", children: [_jsx(DriverList, { title: "By workflow", rows: data.byLabel, billing: billing }), _jsx(DriverList, { title: "By model", rows: data.byModel, billing: billing })] })] }), _jsxs("details", { className: "group rounded-lg border border-border/70 bg-card", children: [_jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-4 outline-none transition-colors hover:bg-accent/30 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset [&::-webkit-details-marker]:hidden", children: [_jsxs("span", { children: [_jsx("span", { className: "block text-sm font-semibold text-foreground", children: "Recent prompts" }), _jsx("span", { className: "mt-1 block text-xs text-muted-foreground", children: "Latest recorded prompts for the selected app and user scope." })] }), _jsxs("span", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [data.recent.length, _jsx(IconChevronDown, { className: "size-4 transition-transform group-open:rotate-180" })] })] }), _jsx("div", { className: "border-t border-border/70", children: data.recent.length === 0 ? (_jsx("p", { className: "px-4 py-5 text-sm text-muted-foreground", children: "No recent prompts recorded." })) : (_jsx("div", { className: "divide-y divide-border/60", children: data.recent.map((entry) => (_jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground", children: [_jsxs("span", { children: [entry.label, " \u00B7 ", entry.model] }), _jsx("span", { children: entry.ownerEmail })] }), _jsx("p", { className: "mt-1 line-clamp-2 text-sm text-foreground", children: entry.prompt ??
205
+ "Prompt text was not captured for this call." })] }, entry.id))) })) })] }), _jsx(UsageAlertsSection, { appId: appId }), viewAllHref ? (_jsx("div", { className: "flex justify-end", children: _jsx(Button, { asChild: true, variant: "link", size: "sm", className: "gap-1.5", children: _jsxs(Link, { to: viewAllHref, children: ["View all usage", _jsx(IconArrowUpRight, {})] }) }) })) : null] })) : null] }));
112
206
  }
@@ -51,7 +51,6 @@ export const INTEGRATION_SETTINGS_SECTIONS = [
51
51
  "secrets",
52
52
  "email",
53
53
  "browser",
54
- "usage",
55
54
  ];
56
55
  export const WORKSPACE_SETTINGS_SECTIONS = [
57
56
  "demo-mode",
@@ -157,9 +156,14 @@ export function getAgentSettingsSearchTabs() {
157
156
  {
158
157
  id: "integrations",
159
158
  label: "Integrations",
160
- keywords: "integrations agent integrations connections secrets email browser usage tools",
159
+ keywords: "integrations agent integrations connections secrets email browser tools",
161
160
  searchEntries: buildSectionSearchEntries(INTEGRATION_SETTINGS_SECTIONS),
162
161
  },
162
+ {
163
+ id: "usage",
164
+ label: "Usage",
165
+ keywords: "usage tokens cost spend billing consumption credits calls",
166
+ },
163
167
  {
164
168
  id: "organization",
165
169
  label: "Organization",
@@ -15,7 +15,7 @@ export type BuilderConnectCardStatus = {
15
15
  label: string;
16
16
  };
17
17
  export interface BuilderConnectCardAction {
18
- label: "Connect Builder";
18
+ label: "Connect Builder.io";
19
19
  pending: boolean;
20
20
  disabled: boolean;
21
21
  onPress: () => void;
@@ -1,7 +1,7 @@
1
1
  import { useCallback } from "react";
2
2
  import { useBuilderConnectFlow } from "../settings/useBuilderStatus.js";
3
3
  const DEFAULT_TITLE = "Builder connect";
4
- const DEFAULT_DESCRIPTION = "Connect Builder for managed model access, browser automation, and workspace identity. Free tier available.";
4
+ const DEFAULT_DESCRIPTION = "Connect Builder.io for managed model access, browser automation, and workspace identity. Free tier available.";
5
5
  const DEFAULT_TRACKING_SOURCE = "setup_connections_page";
6
6
  export function useBuilderConnectCardController({ title = DEFAULT_TITLE, description = DEFAULT_DESCRIPTION, trackingSource = DEFAULT_TRACKING_SOURCE, onConnected, } = {}) {
7
7
  const handleConnected = useCallback(({ orgName }) => onConnected?.(orgName), [onConnected]);
@@ -29,7 +29,7 @@ export function useBuilderConnectCardController({ title = DEFAULT_TITLE, descrip
29
29
  action: flow.configured
30
30
  ? null
31
31
  : {
32
- label: "Connect Builder",
32
+ label: "Connect Builder.io",
33
33
  pending: flow.connecting,
34
34
  disabled: flow.connecting,
35
35
  onPress: handlePress,
@@ -66,6 +66,8 @@ export interface ShareButtonProps {
66
66
  label?: string;
67
67
  description?: string;
68
68
  }>>;
69
+ /** Optional role capability boundary for resources without comment support. */
70
+ allowedRoles?: readonly Role[];
69
71
  /** Optional label for the explicit per-person access list. */
70
72
  peopleAccessLabel?: ReactNode;
71
73
  /** Optional label for the coarse visibility control. */
@@ -43,6 +43,11 @@ function visibilityMeta(visibility, copy) {
43
43
  }
44
44
  const ROLE_OPTIONS = [
45
45
  { value: "viewer", label: "Viewer", description: "Can view" },
46
+ {
47
+ value: "commenter",
48
+ label: "Commenter",
49
+ description: "Can view and add comments",
50
+ },
46
51
  { value: "editor", label: "Editor", description: "Can edit" },
47
52
  {
48
53
  value: "admin",
@@ -83,6 +88,7 @@ export function ShareButton(props) {
83
88
  onOpenChange: props.onOpenChange,
84
89
  shareTabs: props.shareTabs,
85
90
  shareUrl: props.shareUrl,
91
+ allowedRoles: props.allowedRoles,
86
92
  hideInSearchControl: props.hideInSearchControl,
87
93
  });
88
94
  const triggerVisibility = controller.triggerVisibility;
@@ -126,7 +132,7 @@ function SharePanel(props) {
126
132
  setShareError(null);
127
133
  }, onSubmit: handleAdd, placeholder: policy.requireOrgMemberForUserShares
128
134
  ? "Add people from your organization"
129
- : "Add people by email", suggestions: memberSuggestions, search: memberSearch }), _jsx(RoleSelect, { value: role, onChange: setRole, roleCopy: props.roleCopy }), _jsx("button", { type: "button", onClick: handleAdd, disabled: !hasInviteEmail, className: BUTTON_PRIMARY_SM, children: "Add" })] }), shareError ? (_jsx("div", { role: "alert", className: "rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive", children: shareError })) : null, hasInviteEmail ? (_jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-2 text-xs text-muted-foreground", children: [_jsxs("label", { className: "inline-flex items-center gap-2", children: [_jsx("input", { type: "checkbox", checked: notifyPeople, onChange: (e) => setNotifyPeople(e.target.checked), className: "h-4 w-4 rounded border-input accent-primary" }), "Notify people"] }), notifyPeople ? (_jsx("button", { type: "button", "aria-expanded": messageOpen, onClick: () => setMessageOpen(!messageOpen), className: "rounded-sm px-1 py-0.5 font-medium text-foreground underline decoration-border underline-offset-2 transition-colors hover:bg-accent hover:text-accent-foreground", children: messageOpen ? "Hide message" : "Add a message" })) : null] })) : null, hasInviteEmail && notifyPeople && messageOpen ? (_jsx("div", { className: "rounded-md border border-border/70 bg-muted/20 p-2.5", children: _jsx("textarea", { "aria-label": "Message", placeholder: "Add a short note (optional)", value: shareMessage, onChange: (event) => setShareMessage(event.target.value), maxLength: 500, rows: 3, className: "w-full resize-y rounded-md border border-input bg-card px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background" }) })) : null] })) : null, _jsx("div", { className: "mb-2 text-sm font-semibold", children: peopleAccessLabel }), _jsxs("ul", { className: "mb-4 flex flex-col gap-1 list-none p-0 m-0", children: [data?.ownerEmail ? (_jsxs("li", { className: "flex items-center gap-3 px-1 py-1.5 text-sm", children: [_jsx(Avatar, { label: displayName(data.ownerEmail, knownMembers) }), _jsx("span", { className: "flex-1 min-w-0 truncate", children: displayName(data.ownerEmail, knownMembers) }), _jsx("span", { className: "text-xs text-muted-foreground", children: "Owner" })] })) : null, shares.map((s) => (_jsxs("li", { className: cn("flex items-center gap-3 px-1 py-1.5 text-sm", inFlight.has(keyOf(s)) && "opacity-60"), children: [_jsx(Avatar, { label: principalLabel(s, knownMembers), org: s.principalType === "org" }), _jsx("span", { className: "flex-1 min-w-0 truncate", children: principalLabel(s, knownMembers) }), canManage ? (_jsx(RoleSelect, { value: s.role, onChange: (r) => handleChangeRole(s, r), disabled: inFlight.has(keyOf(s)), plain: true, roleCopy: props.roleCopy })) : (_jsx("span", { className: "text-xs text-muted-foreground", children: roleMeta(s.role, props.roleCopy).label })), canManage ? (_jsx("button", { type: "button", "aria-label": "Remove", onClick: () => handleRemove(s), disabled: inFlight.has(keyOf(s)), className: BUTTON_GHOST_ICON, children: _jsx(IconTrash, { size: 14 }) })) : null] }, keyOf(s)))), !shares.length && !data?.ownerEmail ? (_jsx("li", { className: "px-1 py-1.5 text-sm text-muted-foreground", children: "No one has access yet." })) : null] }), _jsx("div", { className: "mb-2 text-sm font-semibold", children: generalAccessLabel }), _jsxs("div", { className: "mb-4 flex items-center gap-3", children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: _jsx(meta.Icon, { size: 16, strokeWidth: 1.75 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(VisibilitySelect, { value: visibility, onChange: handleVisibility, disabled: !canManage, visibilityCopy: props.visibilityCopy, allowPublic: policy.allowPublic }), _jsxs("div", { className: "mt-0.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted-foreground", children: [_jsx("span", { children: meta.description }), visibility === "org" && props.hideInSearchControl ? (_jsx(AdvancedAccessPopover, { control: props.hideInSearchControl, canManage: canManage, onToggle: handleHideInSearch })) : null] })] })] }), shareError && !canManage ? (_jsx("div", { role: "alert", className: "mb-4 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive", children: shareError })) : null, props.accessNote ? (_jsx("div", { className: "mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground", children: props.accessNote })) : null, showShareLinks && shareUrlPlacement === "bottom" ? shareLinks : null, props.shareFooterContent] }));
135
+ : "Add people by email", suggestions: memberSuggestions, search: memberSearch }), _jsx(RoleSelect, { value: role, onChange: setRole, roleCopy: props.roleCopy, allowedRoles: props.allowedRoles }), _jsx("button", { type: "button", onClick: handleAdd, disabled: !hasInviteEmail, className: BUTTON_PRIMARY_SM, children: "Add" })] }), shareError ? (_jsx("div", { role: "alert", className: "rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive", children: shareError })) : null, hasInviteEmail ? (_jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-2 text-xs text-muted-foreground", children: [_jsxs("label", { className: "inline-flex items-center gap-2", children: [_jsx("input", { type: "checkbox", checked: notifyPeople, onChange: (e) => setNotifyPeople(e.target.checked), className: "h-4 w-4 rounded border-input accent-primary" }), "Notify people"] }), notifyPeople ? (_jsx("button", { type: "button", "aria-expanded": messageOpen, onClick: () => setMessageOpen(!messageOpen), className: "rounded-sm px-1 py-0.5 font-medium text-foreground underline decoration-border underline-offset-2 transition-colors hover:bg-accent hover:text-accent-foreground", children: messageOpen ? "Hide message" : "Add a message" })) : null] })) : null, hasInviteEmail && notifyPeople && messageOpen ? (_jsx("div", { className: "rounded-md border border-border/70 bg-muted/20 p-2.5", children: _jsx("textarea", { "aria-label": "Message", placeholder: "Add a short note (optional)", value: shareMessage, onChange: (event) => setShareMessage(event.target.value), maxLength: 500, rows: 3, className: "w-full resize-y rounded-md border border-input bg-card px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background" }) })) : null] })) : null, _jsx("div", { className: "mb-2 text-sm font-semibold", children: peopleAccessLabel }), _jsxs("ul", { className: "mb-4 flex flex-col gap-1 list-none p-0 m-0", children: [data?.ownerEmail ? (_jsxs("li", { className: "flex items-center gap-3 px-1 py-1.5 text-sm", children: [_jsx(Avatar, { label: displayName(data.ownerEmail, knownMembers) }), _jsx("span", { className: "flex-1 min-w-0 truncate", children: displayName(data.ownerEmail, knownMembers) }), _jsx("span", { className: "text-xs text-muted-foreground", children: "Owner" })] })) : null, shares.map((s) => (_jsxs("li", { className: cn("flex items-center gap-3 px-1 py-1.5 text-sm", inFlight.has(keyOf(s)) && "opacity-60"), children: [_jsx(Avatar, { label: principalLabel(s, knownMembers), org: s.principalType === "org" }), _jsx("span", { className: "flex-1 min-w-0 truncate", children: principalLabel(s, knownMembers) }), canManage ? (_jsx(RoleSelect, { value: s.role, onChange: (r) => handleChangeRole(s, r), disabled: inFlight.has(keyOf(s)), plain: true, roleCopy: props.roleCopy, allowedRoles: props.allowedRoles })) : (_jsx("span", { className: "text-xs text-muted-foreground", children: roleMeta(s.role, props.roleCopy).label })), canManage ? (_jsx("button", { type: "button", "aria-label": "Remove", onClick: () => handleRemove(s), disabled: inFlight.has(keyOf(s)), className: BUTTON_GHOST_ICON, children: _jsx(IconTrash, { size: 14 }) })) : null] }, keyOf(s)))), !shares.length && !data?.ownerEmail ? (_jsx("li", { className: "px-1 py-1.5 text-sm text-muted-foreground", children: "No one has access yet." })) : null] }), _jsx("div", { className: "mb-2 text-sm font-semibold", children: generalAccessLabel }), _jsxs("div", { className: "mb-4 flex items-center gap-3", children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: _jsx(meta.Icon, { size: 16, strokeWidth: 1.75 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(VisibilitySelect, { value: visibility, onChange: handleVisibility, disabled: !canManage, visibilityCopy: props.visibilityCopy, allowPublic: policy.allowPublic }), _jsxs("div", { className: "mt-0.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted-foreground", children: [_jsx("span", { children: meta.description }), visibility === "org" && props.hideInSearchControl ? (_jsx(AdvancedAccessPopover, { control: props.hideInSearchControl, canManage: canManage, onToggle: handleHideInSearch })) : null] })] })] }), shareError && !canManage ? (_jsx("div", { role: "alert", className: "mb-4 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive", children: shareError })) : null, props.accessNote ? (_jsx("div", { className: "mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground", children: props.accessNote })) : null, showShareLinks && shareUrlPlacement === "bottom" ? shareLinks : null, props.shareFooterContent] }));
130
136
  if (!hasTabs)
131
137
  return sharePanel;
132
138
  const tabs = [
@@ -281,7 +287,8 @@ function SelectItems({ items }) {
281
287
  }
282
288
  function RoleSelect(props) {
283
289
  const current = roleMeta(props.value, props.roleCopy);
284
- const options = ROLE_OPTIONS.map((option) => roleMeta(option.value, props.roleCopy));
290
+ const allowedRoles = props.allowedRoles ?? ROLE_OPTIONS.map((item) => item.value);
291
+ const options = ROLE_OPTIONS.filter((option) => option.value === props.value || allowedRoles.includes(option.value)).map((option) => roleMeta(option.value, props.roleCopy));
285
292
  return (_jsxs(Select.Root, { value: props.value, onValueChange: (v) => props.onChange(v), disabled: props.disabled, children: [_jsxs(Select.Trigger, { className: props.plain
286
293
  ? cn(BUTTON_BASE, "h-7 px-2 bg-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground")
287
294
  : cn(BUTTON_BASE, "h-9 px-3 border border-input bg-card hover:bg-accent hover:text-accent-foreground"), "aria-label": "Role", children: [_jsx(Select.Value, { children: current.label }), _jsx(Select.Icon, { children: _jsx(IconChevronDown, { size: 14 }) })] }), _jsx(Select.Portal, { children: _jsx(Select.Content, { "data-agent-native-share-overlay": "", className: selectContentClass, position: "popper", sideOffset: 4, children: _jsx(Select.Viewport, { children: _jsx(SelectItems, { items: options }) }) }) })] }));
@@ -74,7 +74,10 @@ function CopyField({ field, label, value, controller, multiline, }) {
74
74
  }
75
75
  function RoleSelect({ controller }) {
76
76
  return (_jsx(Picker, { mode: "select", options: controller.invite.roleOptions, value: controller.invite.role, onChange: (value) => {
77
- if (value === "viewer" || value === "editor" || value === "admin") {
77
+ if (value === "viewer" ||
78
+ value === "commenter" ||
79
+ value === "editor" ||
80
+ value === "admin") {
78
81
  controller.invite.setRole(value);
79
82
  }
80
83
  }, "aria-label": controller.labels.role, className: "w-auto" }));
@@ -1,6 +1,6 @@
1
1
  import type { useActionQuery } from "../use-action.js";
2
2
  export type ShareButtonVisibility = "private" | "org" | "public";
3
- export type ShareButtonRole = "viewer" | "editor" | "admin";
3
+ export type ShareButtonRole = "viewer" | "commenter" | "editor" | "admin";
4
4
  export interface ShareButtonShare {
5
5
  id: string;
6
6
  principalType: "user" | "org";
@@ -43,6 +43,7 @@ export interface ShareButtonControllerOptions {
43
43
  onValueChange?: (value: string) => void;
44
44
  };
45
45
  shareUrl?: string;
46
+ allowedRoles?: readonly ShareButtonRole[];
46
47
  hideInSearchControl?: {
47
48
  checked: boolean;
48
49
  pending?: boolean;
@@ -103,6 +103,14 @@ export function useShareButtonController(options) {
103
103
  // Keep draft and optimistic state in the controller so closing and reopening
104
104
  // the popover cannot drop an in-flight mutation or an unsent invite.
105
105
  const [role, setRole] = useState("viewer");
106
+ useEffect(() => {
107
+ const allowedRoles = options.allowedRoles;
108
+ if (!allowedRoles || allowedRoles.includes(role))
109
+ return;
110
+ const fallbackRole = allowedRoles[0];
111
+ if (fallbackRole)
112
+ setRole(fallbackRole);
113
+ }, [options.allowedRoles, role]);
106
114
  const [notifyPeople, setNotifyPeople] = useState(true);
107
115
  const [shareMessage, setShareMessage] = useState("");
108
116
  const [messageOpen, setMessageOpen] = useState(false);
@@ -1,5 +1,5 @@
1
1
  export type ShareVisibility = "private" | "org" | "public";
2
- export type ShareRole = "viewer" | "editor" | "admin";
2
+ export type ShareRole = "viewer" | "commenter" | "editor" | "admin";
3
3
  export type ShareDialogTab = "link" | "invite" | "embed";
4
4
  export interface ResourceShare {
5
5
  id: string;
@@ -41,7 +41,7 @@ export function useShareDialogController({ open, onClose, resourceType, resource
41
41
  value === visibility ||
42
42
  data?.policy?.allowPublic !== false)
43
43
  .map((value) => visibilityOption(value, t)), [data?.policy?.allowPublic, t, visibility]);
44
- const roleOptions = useMemo(() => ["viewer", "editor", "admin"].map((value) => roleOption(value, t)), [t]);
44
+ const roleOptions = useMemo(() => ["viewer", "commenter", "editor", "admin"].map((value) => roleOption(value, t)), [t]);
45
45
  const refetch = useCallback(() => sharesQuery.refetch(), [sharesQuery]);
46
46
  const setVisibility = useCallback((next) => {
47
47
  if (!canManage || next === visibility)
@@ -292,6 +292,7 @@ function visibilityOption(visibility, t) {
292
292
  function roleOption(role, t) {
293
293
  const keys = {
294
294
  viewer: ["share.viewer", "share.viewerDescription"],
295
+ commenter: ["share.commenter", "share.commenterDescription"],
295
296
  editor: ["share.editor", "share.editorDescription"],
296
297
  admin: ["share.admin", "share.adminDescription"],
297
298
  };
@@ -13,8 +13,8 @@
13
13
  * Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
14
14
  */
15
15
  export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
16
- ok?: undefined;
17
16
  error: string;
17
+ ok?: undefined;
18
18
  } | {
19
19
  error?: undefined;
20
20
  ok: boolean;
package/dist/config.d.ts CHANGED
@@ -48,12 +48,25 @@ export interface AgentNativeInstructionsConfig {
48
48
  /** Relative Markdown file loaded by development/coding agents. */
49
49
  development?: string;
50
50
  }
51
+ export interface AgentNativeTranslationsConfig {
52
+ /**
53
+ * Locales the app intentionally ships translations for. `en-US` is the
54
+ * default source locale; additional locales are opt-in.
55
+ */
56
+ locales?: string[];
57
+ }
58
+ export interface AgentNativeChangelogConfig {
59
+ /** Whether agents should create and surface user-facing changelog entries. */
60
+ enabled?: boolean;
61
+ }
51
62
  export interface AgentNativeConfig {
52
63
  version?: typeof AGENT_NATIVE_CONFIG_VERSION;
53
64
  onboarding?: AgentNativeOnboardingConfig;
54
65
  runtime?: AgentNativeRuntimeConfig;
55
66
  diagnostics?: AgentNativeDiagnosticsConfig;
56
67
  instructions?: AgentNativeInstructionsConfig;
68
+ translations?: AgentNativeTranslationsConfig;
69
+ changelog?: AgentNativeChangelogConfig;
57
70
  }
58
71
  export interface AgentNativeConfigContext {
59
72
  command: "serve" | "build";