@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,11 +1,17 @@
1
- import { useChatModels } from "@agent-native/core/client/agent-chat";
1
+ import {
2
+ AgentToggleButton,
3
+ useChatModels,
4
+ } from "@agent-native/core/client/agent-chat";
2
5
  import {
3
6
  useActionMutation,
4
7
  useActionQuery,
5
8
  } from "@agent-native/core/client/hooks";
6
9
  import { useT } from "@agent-native/core/client/i18n";
10
+ import { buildSettingsRoute } from "@agent-native/core/client/navigation";
11
+ import { SettingsGroup, SettingsRow } from "@agent-native/core/client/settings";
7
12
  import {
8
13
  IconAlertCircle,
14
+ IconArrowLeft,
9
15
  IconExternalLink,
10
16
  IconLoader2,
11
17
  IconPlayerPlay,
@@ -13,7 +19,7 @@ import {
13
19
  IconRefresh,
14
20
  } from "@tabler/icons-react";
15
21
  import { useEffect, useMemo, useState } from "react";
16
- import { useSearchParams } from "react-router";
22
+ import { Link, useSearchParams } from "react-router";
17
23
 
18
24
  import { FactoryAuditView } from "@/components/factory/FactoryAuditView";
19
25
  import {
@@ -22,16 +28,14 @@ import {
22
28
  type FactoryCanvasGraph,
23
29
  type FactoryCanvasNode,
24
30
  } from "@/components/factory/FactoryCanvas";
25
- import {
26
- FactoryInspector,
27
- type FactoryComment,
28
- } from "@/components/factory/FactoryInspector";
31
+ import { FactoryInspector } from "@/components/factory/FactoryInspector";
29
32
  import { TriageStatusPill } from "@/components/triage/triage-status-pill";
30
33
  import { Button } from "@/components/ui/button";
31
34
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
32
35
  import { Checkbox } from "@/components/ui/checkbox";
33
36
  import { Input } from "@/components/ui/input";
34
37
  import { Label } from "@/components/ui/label";
38
+ import { Switch } from "@/components/ui/switch";
35
39
  import { Textarea } from "@/components/ui/textarea";
36
40
 
37
41
  type FactoryGraphResponse = {
@@ -114,6 +118,7 @@ type TriageConfig = {
114
118
 
115
119
  type Verdict = "correct" | "incorrect" | "uncertain";
116
120
  type WorkspaceTab =
121
+ | "overview"
117
122
  | "map"
118
123
  | "inbox"
119
124
  | "rules"
@@ -166,7 +171,8 @@ export default function FactoryRoute() {
166
171
  const t = useT();
167
172
  const [searchParams, setSearchParams] = useSearchParams();
168
173
  const activeTab = parseWorkspaceTab(searchParams.get("tab"));
169
- const factoryId = searchParams.get("factoryId") || DEFAULT_FACTORY_ID;
174
+ const selectedFactoryId = searchParams.get("factoryId");
175
+ const factoryId = selectedFactoryId ?? DEFAULT_FACTORY_ID;
170
176
  const [creating, setCreating] = useState(false);
171
177
  const [draftGraph, setDraftGraph] = useState<FactoryCanvasGraph | null>(null);
172
178
  const [dirty, setDirty] = useState(false);
@@ -178,7 +184,7 @@ export default function FactoryRoute() {
178
184
  setSearchParams(
179
185
  (current) => {
180
186
  const next = new URLSearchParams(current);
181
- if (tab === "map") next.delete("tab");
187
+ if (tab === "overview") next.delete("tab");
182
188
  else next.set("tab", tab);
183
189
  return next;
184
190
  },
@@ -186,12 +192,45 @@ export default function FactoryRoute() {
186
192
  );
187
193
  }
188
194
 
189
- function setFactoryId(nextFactoryId: string) {
195
+ function openFactory(
196
+ nextFactoryId: string,
197
+ options?: { tab?: WorkspaceTab; replace?: boolean },
198
+ ) {
199
+ setCreating(false);
200
+ setDraftGraph(null);
201
+ setDirty(false);
202
+ setSelectedNodeId(null);
203
+ setSelectedEdgeId(null);
204
+ setSearchParams(
205
+ (current) => {
206
+ const next = new URLSearchParams(current);
207
+ next.set("factoryId", nextFactoryId);
208
+ next.delete("node");
209
+ next.delete("edge");
210
+ next.delete("itemId");
211
+ next.delete("automationId");
212
+ next.delete("auditRunId");
213
+ if (options?.tab) {
214
+ if (options.tab === "overview") next.delete("tab");
215
+ else next.set("tab", options.tab);
216
+ }
217
+ return next;
218
+ },
219
+ { replace: options?.replace ?? true },
220
+ );
221
+ }
222
+
223
+ function goToFactoryList() {
190
224
  setSearchParams(
191
225
  (current) => {
192
226
  const next = new URLSearchParams(current);
193
- if (nextFactoryId === DEFAULT_FACTORY_ID) next.delete("factoryId");
194
- else next.set("factoryId", nextFactoryId);
227
+ next.delete("factoryId");
228
+ next.delete("tab");
229
+ next.delete("node");
230
+ next.delete("edge");
231
+ next.delete("itemId");
232
+ next.delete("automationId");
233
+ next.delete("auditRunId");
195
234
  return next;
196
235
  },
197
236
  { replace: true },
@@ -199,19 +238,18 @@ export default function FactoryRoute() {
199
238
  }
200
239
 
201
240
  const factoryListQuery = useActionQuery("list-factories", {});
202
- const graphQuery = useActionQuery("get-factory-graph", { factoryId });
203
- const graphData = graphQuery.data as FactoryGraphResponse | undefined;
241
+ const graphQuery = useActionQuery(
242
+ "get-factory-graph",
243
+ selectedFactoryId ? { factoryId: selectedFactoryId } : undefined,
244
+ { enabled: Boolean(selectedFactoryId) },
245
+ );
246
+ const rawGraphData = graphQuery.data as FactoryGraphResponse | undefined;
247
+ const graphData =
248
+ rawGraphData?.factory.id === factoryId ? rawGraphData : undefined;
204
249
  const graph = draftGraph ?? graphData?.graph ?? null;
205
250
  const graphVersion = graphData?.factory.graphVersion ?? graph?.version ?? 1;
206
- const commentsQuery = useActionQuery(
207
- "list-factory-comments",
208
- { factoryId, graphVersion },
209
- { enabled: Boolean(graph) },
210
- );
211
251
  const saveGraphMutation = useActionMutation("save-factory-graph");
212
- const addCommentMutation = useActionMutation("add-factory-comment");
213
252
  const factoryList = (factoryListQuery.data ?? []) as FactorySummary[];
214
- const comments = (commentsQuery.data ?? []) as FactoryComment[];
215
253
 
216
254
  useEffect(() => {
217
255
  if (!graphData || creating) return;
@@ -226,16 +264,17 @@ export default function FactoryRoute() {
226
264
  setSelectedEdgeId(searchParams.get("edge"));
227
265
  }, [searchParams]);
228
266
 
267
+ useEffect(() => {
268
+ if (selectedFactoryId) return;
269
+ setCreating(false);
270
+ setDraftGraph(null);
271
+ setDirty(false);
272
+ setSelectedNodeId(null);
273
+ setSelectedEdgeId(null);
274
+ }, [selectedFactoryId]);
275
+
229
276
  const selectedNode = graph?.nodes.find((node) => node.id === selectedNodeId);
230
277
  const selectedEdge = graph?.edges.find((edge) => edge.id === selectedEdgeId);
231
- const commentCounts = useMemo(() => {
232
- const counts: Record<string, number> = {};
233
- for (const comment of comments) {
234
- if (comment.targetId)
235
- counts[comment.targetId] = (counts[comment.targetId] ?? 0) + 1;
236
- }
237
- return counts;
238
- }, [comments]);
239
278
 
240
279
  function selectNode(nodeId: string) {
241
280
  setSelectedNodeId(nodeId);
@@ -322,30 +361,38 @@ export default function FactoryRoute() {
322
361
  }
323
362
 
324
363
  function startNewFactory() {
325
- const base = graph ?? graphData?.graph;
326
- if (!base) return;
327
364
  const id = `factory-${Date.now().toString(36)}`;
328
- setFactoryId(id);
365
+ openFactory(id, { tab: "overview" });
329
366
  setCreating(true);
330
367
  setDraftGraph({
331
- ...structuredClone(base),
332
368
  version: 1,
333
369
  name: t("factoryRoute.newFactory"),
334
370
  description: t("factoryRoute.newFactoryDescription"),
371
+ executionMode: "blueprint",
372
+ nodes: [
373
+ {
374
+ id: "start",
375
+ label: t("factoryRoute.newStep"),
376
+ description: t("factoryRoute.newStepDescription"),
377
+ kind: "decision",
378
+ provider: "factory",
379
+ position: { x: 240, y: 220 },
380
+ },
381
+ ],
382
+ edges: [],
335
383
  });
336
384
  setDirty(true);
337
385
  setSelectedNodeId(null);
338
386
  setSelectedEdgeId(null);
339
- setActiveTab("map");
340
387
  }
341
388
 
342
389
  async function saveGraph() {
343
- if (!graph) return;
390
+ if (!graph || !selectedFactoryId) return;
344
391
  await saveGraphMutation.mutateAsync({
345
- factoryId,
392
+ factoryId: selectedFactoryId,
346
393
  name: graph.name,
347
394
  description: graph.description,
348
- prompt: graphData?.factory.prompt ?? "",
395
+ prompt: creating ? "" : (graphData?.factory.prompt ?? ""),
349
396
  source: "manual",
350
397
  changeSummary: creating
351
398
  ? "Created from the Factory visual editor."
@@ -357,65 +404,164 @@ export default function FactoryRoute() {
357
404
  await Promise.all([graphQuery.refetch(), factoryListQuery.refetch()]);
358
405
  }
359
406
 
360
- async function addComment(
361
- targetType: "canvas" | "node" | "edge",
362
- targetId?: string,
363
- body?: string,
364
- ) {
365
- if (!body || !graph) return;
366
- await addCommentMutation.mutateAsync({
367
- factoryId,
368
- graphVersion,
369
- targetType,
370
- ...(targetId ? { targetId } : {}),
371
- body,
372
- });
373
- await commentsQuery.refetch();
407
+ if (!selectedFactoryId) {
408
+ return (
409
+ <div className="flex h-full min-h-0 flex-col overflow-y-auto bg-background">
410
+ <section className="mx-auto flex w-full max-w-6xl flex-1 flex-col gap-6 p-4 lg:p-6">
411
+ <div className="flex flex-wrap items-end justify-between gap-4">
412
+ <h1 className="text-2xl font-semibold tracking-tight">Factories</h1>
413
+ <div className="flex items-center gap-2">
414
+ <Button type="button" size="sm" onClick={startNewFactory}>
415
+ <IconPlus className="size-4" />
416
+ {t("factoryRoute.newFactory")}
417
+ </Button>
418
+ <AgentToggleButton />
419
+ </div>
420
+ </div>
421
+
422
+ {factoryListQuery.isError ? (
423
+ <Card>
424
+ <CardContent className="p-0">
425
+ <ErrorState
426
+ message="Could not load factories."
427
+ onRetry={() => void factoryListQuery.refetch()}
428
+ />
429
+ </CardContent>
430
+ </Card>
431
+ ) : factoryListQuery.isLoading ? (
432
+ <div className="grid gap-2">
433
+ {Array.from({ length: 4 }).map((_, index) => (
434
+ <div
435
+ key={`factory-skeleton-${index}`}
436
+ className="grid gap-3 rounded-xl bg-card px-3 py-3 shadow-sm md:grid-cols-[minmax(0,2fr)_minmax(120px,0.8fr)_minmax(70px,auto)_auto] md:items-center"
437
+ >
438
+ <div className="min-w-0 space-y-2">
439
+ <div className="h-4 w-2/3 animate-pulse rounded bg-muted" />
440
+ </div>
441
+ <div className="h-4 w-24 animate-pulse rounded bg-muted" />
442
+ <div className="h-4 w-12 animate-pulse rounded bg-muted" />
443
+ <div className="h-9 w-20 animate-pulse rounded bg-muted md:ms-auto" />
444
+ </div>
445
+ ))}
446
+ </div>
447
+ ) : (
448
+ <div className="grid gap-2">
449
+ {factoryList.map((factory) => (
450
+ <div
451
+ key={factory.id}
452
+ className="group grid cursor-pointer gap-3 rounded-xl bg-card px-3 py-3 shadow-sm transition-colors hover:bg-accent/25 md:grid-cols-[minmax(0,2fr)_minmax(120px,0.8fr)_minmax(70px,auto)_auto] md:items-center"
453
+ role="button"
454
+ tabIndex={0}
455
+ onClick={() => openFactory(factory.id, { tab: "overview" })}
456
+ onKeyDown={(event) => {
457
+ if (event.key !== "Enter" && event.key !== " ") return;
458
+ event.preventDefault();
459
+ openFactory(factory.id, { tab: "overview" });
460
+ }}
461
+ >
462
+ <div className="min-w-0">
463
+ <h2 className="truncate text-sm font-medium">
464
+ {factory.name}
465
+ </h2>
466
+ </div>
467
+ <div className="flex min-w-0 items-center text-xs text-muted-foreground">
468
+ {factory.virtual
469
+ ? t("factoryRoute.defaultFactoryLabel")
470
+ : t("factoryRoute.savedFactoryLabel")}
471
+ </div>
472
+ <div className="text-xs text-muted-foreground">
473
+ v{factory.graphVersion}
474
+ </div>
475
+ <div className="flex justify-end">
476
+ <Button
477
+ type="button"
478
+ size="sm"
479
+ className="md:opacity-0 md:transition-opacity md:group-hover:opacity-100"
480
+ onClick={(event) => {
481
+ event.stopPropagation();
482
+ openFactory(factory.id, { tab: "overview" });
483
+ }}
484
+ >
485
+ Open
486
+ </Button>
487
+ </div>
488
+ </div>
489
+ ))}
490
+ </div>
491
+ )}
492
+ </section>
493
+ </div>
494
+ );
374
495
  }
375
496
 
376
497
  if (!graph) {
377
498
  return (
378
- <div className="flex h-full items-center justify-center p-8 text-sm text-muted-foreground">
379
- {graphQuery.isError
380
- ? "Could not load this Factory."
381
- : "Loading Factory..."}
499
+ <div className="flex h-full min-h-0 flex-col overflow-hidden bg-background">
500
+ <header className="shrink-0 bg-background px-2 sm:px-4 lg:px-6">
501
+ <div className="flex h-14 items-center justify-between gap-3">
502
+ <div className="flex min-w-0 items-center gap-1 sm:gap-2">
503
+ <Button
504
+ type="button"
505
+ variant="ghost"
506
+ size="icon"
507
+ className="size-10 shrink-0"
508
+ onClick={goToFactoryList}
509
+ aria-label={t("factoryRoute.backToFactories")}
510
+ >
511
+ <IconArrowLeft className="size-4" />
512
+ </Button>
513
+ <div className="h-5 w-48 animate-pulse rounded bg-muted" />
514
+ </div>
515
+ <div className="flex items-center gap-2">
516
+ <div className="h-9 w-28 animate-pulse rounded bg-muted" />
517
+ <AgentToggleButton />
518
+ </div>
519
+ </div>
520
+ </header>
521
+ <main className="flex flex-1 items-center justify-center p-6">
522
+ {graphQuery.isError ? (
523
+ <Card className="w-full max-w-lg">
524
+ <CardContent className="p-0">
525
+ <ErrorState
526
+ message="Could not load this factory."
527
+ onRetry={() => void graphQuery.refetch()}
528
+ />
529
+ </CardContent>
530
+ </Card>
531
+ ) : (
532
+ <div className="grid w-full max-w-5xl gap-4 xl:grid-cols-[minmax(0,1fr)_360px]">
533
+ <div className="h-[420px] animate-pulse rounded-xl bg-card shadow-sm" />
534
+ <div className="h-[420px] animate-pulse rounded-xl bg-card shadow-sm" />
535
+ </div>
536
+ )}
537
+ </main>
382
538
  </div>
383
539
  );
384
540
  }
385
541
 
386
542
  return (
387
543
  <div className="flex h-full min-h-0 flex-col overflow-hidden bg-background">
388
- <header className="shrink-0 border-b bg-background px-4 py-2.5 lg:px-6">
389
- <div className="flex flex-wrap items-center justify-between gap-3">
390
- <div className="min-w-0 flex-1">
391
- <div className="flex items-center gap-2">
392
- <h1 className="truncate text-base font-semibold">{graph.name}</h1>
393
- <span className="shrink-0 text-xs text-muted-foreground">
394
- v{graphVersion}
395
- </span>
396
- </div>
397
- <p className="hidden truncate text-xs text-muted-foreground md:block">
398
- {graph.description}
399
- </p>
544
+ <header className="shrink-0 bg-background">
545
+ <div className="flex h-14 items-center justify-between gap-3 px-2 sm:px-4 lg:px-6">
546
+ <div className="flex min-w-0 items-center gap-1 sm:gap-2">
547
+ <Button
548
+ type="button"
549
+ variant="ghost"
550
+ size="icon"
551
+ className="size-10 shrink-0"
552
+ onClick={goToFactoryList}
553
+ aria-label={t("factoryRoute.backToFactories")}
554
+ >
555
+ <IconArrowLeft className="size-4" />
556
+ </Button>
557
+ <h1 className="truncate text-sm font-medium sm:text-base">
558
+ {graph.name}
559
+ </h1>
560
+ <span className="shrink-0 text-xs text-muted-foreground">
561
+ v{graphVersion}
562
+ </span>
400
563
  </div>
401
564
  <div className="flex items-center gap-2">
402
- <select
403
- aria-label={t("factoryRoute.selectFactory")}
404
- value={factoryId}
405
- onChange={(event) => {
406
- setFactoryId(event.target.value);
407
- setCreating(false);
408
- setDraftGraph(null);
409
- setDirty(false);
410
- }}
411
- className="h-9 max-w-[220px] rounded-md border bg-background px-3 text-sm"
412
- >
413
- {factoryList.map((factory) => (
414
- <option key={factory.id} value={factory.id}>
415
- {factory.name}
416
- </option>
417
- ))}
418
- </select>
419
565
  <Button
420
566
  type="button"
421
567
  variant="outline"
@@ -423,26 +569,33 @@ export default function FactoryRoute() {
423
569
  onClick={startNewFactory}
424
570
  >
425
571
  <IconPlus className="size-4" />
426
- New
572
+ {t("factoryRoute.newFactory")}
427
573
  </Button>
574
+ <AgentToggleButton />
428
575
  </div>
429
576
  </div>
430
- <div className="mt-4 flex items-center gap-2">
577
+ <div className="flex items-center gap-2 overflow-x-auto px-2 py-2 sm:px-4 lg:px-6">
431
578
  <nav
432
- className="flex min-w-0 flex-1 items-center gap-1 overflow-x-auto"
579
+ className="flex min-w-0 flex-1 items-center gap-1"
433
580
  aria-label={t("factoryRoute.factoryViews")}
434
581
  >
582
+ <TabButton
583
+ active={activeTab === "overview"}
584
+ onClick={() => setActiveTab("overview")}
585
+ >
586
+ Overview
587
+ </TabButton>
435
588
  <TabButton
436
589
  active={activeTab === "map"}
437
590
  onClick={() => setActiveTab("map")}
438
591
  >
439
- Map
592
+ Flow
440
593
  </TabButton>
441
594
  <TabButton
442
595
  active={activeTab === "inbox"}
443
596
  onClick={() => setActiveTab("inbox")}
444
597
  >
445
- Inbox
598
+ Review
446
599
  </TabButton>
447
600
  <TabButton
448
601
  active={activeTab === "rules"}
@@ -460,7 +613,7 @@ export default function FactoryRoute() {
460
613
  active={activeTab === "audit"}
461
614
  onClick={() => setActiveTab("audit")}
462
615
  >
463
- {t("factoryRoute.auditTab")}
616
+ Activity
464
617
  </TabButton>
465
618
  <TabButton
466
619
  active={activeTab === "settings"}
@@ -486,32 +639,24 @@ export default function FactoryRoute() {
486
639
  </header>
487
640
 
488
641
  <main className="min-h-0 flex-1 overflow-y-auto">
489
- {activeTab === "map" ? (
490
- <div className="grid min-h-full gap-0 xl:grid-cols-[minmax(0,1fr)_360px]">
491
- <section className="min-w-0 p-4 lg:p-6">
492
- <div className="mb-3 flex flex-wrap items-center justify-between gap-3">
493
- <span className="text-xs font-medium text-muted-foreground">
494
- {t("factoryRoute.mapEyebrow")}
495
- </span>
496
- <div className="flex items-center gap-2 text-xs text-muted-foreground">
497
- <Metric
498
- label={t("factoryRoute.metricSignals")}
499
- value={graphData?.metrics.totalItems ?? 0}
500
- />
501
- <Metric
502
- label={t("factoryRoute.metricDecisions")}
503
- value={graphData?.metrics.decisions ?? 0}
504
- />
505
- <Metric
506
- label={t("factoryRoute.metricRuns")}
507
- value={graphData?.metrics.runs ?? 0}
508
- />
509
- </div>
510
- </div>
642
+ {activeTab === "overview" ? (
643
+ <OverviewView
644
+ graph={graph}
645
+ t={t}
646
+ metrics={graphData?.metrics}
647
+ nodeMetrics={graphData?.nodeMetrics}
648
+ onOpenReview={() => setActiveTab("inbox")}
649
+ onOpenAutomations={() => setActiveTab("automations")}
650
+ onOpenActivity={() => setActiveTab("audit")}
651
+ onOpenSettings={() => setActiveTab("settings")}
652
+ onOpenFlow={() => setActiveTab("map")}
653
+ />
654
+ ) : activeTab === "map" ? (
655
+ <div className="grid min-h-full gap-4 p-4 lg:p-6 xl:grid-cols-[minmax(0,1fr)_360px]">
656
+ <section className="min-w-0 rounded-xl bg-card p-4 shadow-sm lg:p-6">
511
657
  <FactoryCanvas
512
658
  graph={graph}
513
659
  nodeMetrics={graphData?.nodeMetrics}
514
- commentCounts={commentCounts}
515
660
  selectedNodeId={selectedNodeId}
516
661
  selectedEdgeId={selectedEdgeId}
517
662
  onSelectNode={selectNode}
@@ -524,27 +669,22 @@ export default function FactoryRoute() {
524
669
  ),
525
670
  });
526
671
  }}
527
- onComment={addComment}
528
672
  />
529
- <div className="mt-4 flex flex-wrap items-center justify-between gap-3 text-xs text-muted-foreground">
530
- <span>{t("factoryRoute.mapHint")}</span>
531
- {dirty && (
532
- <span className="text-amber-700 dark:text-amber-300">
533
- {t("factoryRoute.unsavedChanges")}
534
- </span>
535
- )}
536
- </div>
673
+ {dirty && (
674
+ <p className="mt-3 text-xs text-amber-700 dark:text-amber-300">
675
+ {t("factoryRoute.unsavedChanges")}
676
+ </p>
677
+ )}
537
678
  </section>
538
679
  <FactoryInspector
539
680
  graph={graph}
540
681
  selectedNode={selectedNode}
541
682
  selectedEdge={selectedEdge}
542
- comments={comments}
683
+ factoryId={factoryId}
543
684
  dirty={dirty}
544
685
  saving={saveGraphMutation.isPending}
545
686
  onGraphChange={updateGraph}
546
687
  onSave={() => void saveGraph()}
547
- onAddComment={addComment}
548
688
  onAddNode={addNode}
549
689
  onDeleteNode={deleteNode}
550
690
  onConnect={connectNodes}
@@ -591,23 +731,122 @@ function TabButton({
591
731
  }
592
732
 
593
733
  function parseWorkspaceTab(value: string | null): WorkspaceTab {
594
- return value === "inbox" ||
734
+ return value === "map" ||
735
+ value === "inbox" ||
595
736
  value === "rules" ||
596
737
  value === "automations" ||
597
738
  value === "audit" ||
598
739
  value === "settings"
599
740
  ? value
600
- : "map";
741
+ : "overview";
601
742
  }
602
743
 
603
- function Metric({ label, value }: { label: string; value: number }) {
744
+ function OverviewView({
745
+ graph,
746
+ t,
747
+ metrics,
748
+ nodeMetrics,
749
+ onOpenReview,
750
+ onOpenAutomations,
751
+ onOpenActivity,
752
+ onOpenSettings,
753
+ onOpenFlow,
754
+ }: {
755
+ graph: FactoryCanvasGraph;
756
+ t: ReturnType<typeof useT>;
757
+ metrics?: FactoryGraphResponse["metrics"];
758
+ nodeMetrics?: Record<string, number>;
759
+ onOpenReview: () => void;
760
+ onOpenAutomations: () => void;
761
+ onOpenActivity: () => void;
762
+ onOpenSettings: () => void;
763
+ onOpenFlow: () => void;
764
+ }) {
604
765
  return (
605
- <span className="rounded-md border bg-card px-2.5 py-1.5">
606
- <span className="font-medium text-foreground">
607
- {value.toLocaleString()}
608
- </span>{" "}
609
- {label}
610
- </span>
766
+ <div className="mx-auto flex w-full max-w-5xl flex-col gap-4 p-4 lg:p-6">
767
+ <div className="grid gap-3 md:grid-cols-3">
768
+ <Card>
769
+ <CardContent className="space-y-1 p-4">
770
+ <p className="text-sm text-muted-foreground">Signals</p>
771
+ <p className="text-2xl font-semibold tracking-tight">
772
+ {(metrics?.totalItems ?? 0).toLocaleString()}
773
+ </p>
774
+ </CardContent>
775
+ </Card>
776
+ <Card>
777
+ <CardContent className="space-y-1 p-4">
778
+ <p className="text-sm text-muted-foreground">Decisions</p>
779
+ <p className="text-2xl font-semibold tracking-tight">
780
+ {(metrics?.decisions ?? 0).toLocaleString()}
781
+ </p>
782
+ </CardContent>
783
+ </Card>
784
+ <Card>
785
+ <CardContent className="space-y-1 p-4">
786
+ <p className="text-sm text-muted-foreground">Runs</p>
787
+ <p className="text-2xl font-semibold tracking-tight">
788
+ {(metrics?.runs ?? 0).toLocaleString()}
789
+ </p>
790
+ </CardContent>
791
+ </Card>
792
+ </div>
793
+
794
+ <Card className="border-0 bg-muted/20 shadow-none">
795
+ <CardHeader className="flex-row items-center justify-between gap-3 px-4 pb-0 pt-4">
796
+ <CardTitle className="text-base">Flow</CardTitle>
797
+ <Button type="button" variant="ghost" size="sm" onClick={onOpenFlow}>
798
+ {t("factoryRoute.editFlow")}
799
+ </Button>
800
+ </CardHeader>
801
+ <CardContent className="p-3">
802
+ <FactoryCanvas graph={graph} nodeMetrics={nodeMetrics} preview />
803
+ </CardContent>
804
+ </Card>
805
+
806
+ <Card>
807
+ <CardContent className="flex flex-col gap-4 p-4 lg:flex-row lg:items-center lg:justify-between">
808
+ <div className="flex flex-wrap items-center gap-x-5 gap-y-2 text-sm">
809
+ <span>
810
+ <span className="text-muted-foreground">Nodes </span>
811
+ <span className="font-medium">
812
+ {graph.nodes.length.toLocaleString()}
813
+ </span>
814
+ </span>
815
+ <span>
816
+ <span className="text-muted-foreground">Connections </span>
817
+ <span className="font-medium">
818
+ {graph.edges.length.toLocaleString()}
819
+ </span>
820
+ </span>
821
+ <span>
822
+ <span className="text-muted-foreground">
823
+ {t("factoryRoute.auditRuns")}{" "}
824
+ </span>
825
+ <span className="font-medium">
826
+ {(metrics?.completedRuns ?? 0).toLocaleString()}
827
+ </span>
828
+ </span>
829
+ </div>
830
+ <div className="flex flex-wrap gap-2">
831
+ <Button type="button" variant="outline" onClick={onOpenReview}>
832
+ Review
833
+ </Button>
834
+ <Button type="button" variant="outline" onClick={onOpenAutomations}>
835
+ Automations
836
+ </Button>
837
+ <Button type="button" variant="outline" onClick={onOpenActivity}>
838
+ Activity
839
+ </Button>
840
+ <Button type="button" variant="outline" onClick={onOpenSettings}>
841
+ Settings
842
+ </Button>
843
+ <Button type="button" onClick={onOpenFlow}>
844
+ {t("factoryRoute.editFlow")}
845
+ </Button>
846
+ </div>
847
+ </CardContent>
848
+ </Card>
849
+ </div>
611
850
  );
612
851
  }
613
852
 
@@ -747,7 +986,7 @@ function AutomationsView({
747
986
  </p>
748
987
  ) : (
749
988
  <div
750
- className="divide-y"
989
+ className="grid gap-1.5 p-2"
751
990
  role="tablist"
752
991
  aria-label={t("factoryRoute.automationsTitle")}
753
992
  >
@@ -759,7 +998,7 @@ function AutomationsView({
759
998
  role="tab"
760
999
  aria-selected={activeAutomationId === automation.id}
761
1000
  aria-controls="factory-automation-panel"
762
- className={`w-full cursor-pointer p-4 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring ${activeAutomationId === automation.id ? "bg-muted/60" : ""}`}
1001
+ className={`w-full cursor-pointer rounded-lg bg-muted/20 p-4 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring ${activeAutomationId === automation.id ? "bg-muted/60" : ""}`}
763
1002
  onClick={() => selectAutomation(automation.id)}
764
1003
  >
765
1004
  <span className="block truncate text-sm font-medium">
@@ -786,7 +1025,7 @@ function AutomationsView({
786
1025
  : undefined
787
1026
  }
788
1027
  >
789
- <CardHeader className="border-b sm:flex-row sm:items-center sm:justify-between">
1028
+ <CardHeader className="sm:flex-row sm:items-center sm:justify-between">
790
1029
  <div>
791
1030
  <CardTitle className="text-base">
792
1031
  {t("factoryRoute.automationEditorTitle")}
@@ -843,7 +1082,7 @@ function AutomationsView({
843
1082
  setDraft({ ...draft, model: event.target.value })
844
1083
  }
845
1084
  disabled={modelsLoading && modelOptions.length === 0}
846
- className="h-9 rounded-md border bg-background px-3 text-sm"
1085
+ className="h-9 rounded-md border bg-card px-3 text-sm"
847
1086
  >
848
1087
  <option value="auto">{autoModelLabel}</option>
849
1088
  {draft.model &&
@@ -922,7 +1161,7 @@ function AutomationsView({
922
1161
  {t("factoryRoute.promptEditorHint")}
923
1162
  </p>
924
1163
  </div>
925
- <div className="border-t pt-5">
1164
+ <div className="rounded-lg bg-muted/20 p-3 shadow-sm">
926
1165
  <h3 className="text-sm font-medium">
927
1166
  {t("factoryRoute.pastRuns")}
928
1167
  </h3>
@@ -931,12 +1170,12 @@ function AutomationsView({
931
1170
  {t("factoryRoute.pastRunsEmpty")}
932
1171
  </p>
933
1172
  ) : (
934
- <div className="mt-3 divide-y rounded-md border">
1173
+ <div className="mt-3 grid gap-2">
935
1174
  {(draft.runs ?? draft.pastRuns ?? []).map(
936
1175
  (run, index) => (
937
1176
  <div
938
1177
  key={run.id ?? `${draft.id}-run-${index}`}
939
- className="flex flex-wrap items-center justify-between gap-2 px-3 py-2 text-sm"
1178
+ className="flex flex-wrap items-center justify-between gap-2 rounded-md bg-card px-3 py-2 text-sm shadow-sm"
940
1179
  >
941
1180
  <span className="font-medium">
942
1181
  {run.status ?? "-"}
@@ -1049,14 +1288,9 @@ function InboxView({ t }: { t: ReturnType<typeof useT> }) {
1049
1288
  return (
1050
1289
  <div className="grid gap-4 p-4 lg:grid-cols-[minmax(0,1.3fr)_minmax(320px,.7fr)] lg:p-6">
1051
1290
  <Card>
1052
- <CardHeader className="gap-3 border-b sm:flex-row sm:items-end sm:justify-between">
1291
+ <CardHeader className="gap-3 sm:flex-row sm:items-end sm:justify-between">
1053
1292
  <div>
1054
- <CardTitle className="text-base">
1055
- {t("factoryRoute.inboxTitle")}
1056
- </CardTitle>
1057
- <p className="mt-1 text-sm text-muted-foreground">
1058
- {t("factoryRoute.inboxDescription")}
1059
- </p>
1293
+ <CardTitle className="text-base">Review</CardTitle>
1060
1294
  </div>
1061
1295
  <div className="flex items-end gap-2">
1062
1296
  <div className="grid gap-1.5">
@@ -1095,14 +1329,14 @@ function InboxView({ t }: { t: ReturnType<typeof useT> }) {
1095
1329
  {t("triage.empty")}
1096
1330
  </p>
1097
1331
  ) : (
1098
- <div className="divide-y">
1332
+ <div className="grid gap-1.5 p-2">
1099
1333
  {normalizedItems.map((item) => {
1100
1334
  const id = item.itemId ?? item.id ?? "";
1101
1335
  return (
1102
1336
  <button
1103
1337
  key={id}
1104
1338
  type="button"
1105
- className={`grid w-full gap-3 p-4 text-left transition-colors hover:bg-muted/50 sm:grid-cols-[1.1fr_.7fr_.9fr_1.6fr] ${selectedId === id ? "bg-muted/60" : ""}`}
1339
+ className={`grid w-full gap-3 rounded-lg bg-muted/20 p-4 text-left transition-colors hover:bg-muted/50 sm:grid-cols-[1.1fr_.7fr_.9fr_1.6fr] ${selectedId === id ? "bg-muted/60" : ""}`}
1106
1340
  onClick={() => selectItem(id)}
1107
1341
  >
1108
1342
  <span className="min-w-0">
@@ -1199,13 +1433,13 @@ function InboxView({ t }: { t: ReturnType<typeof useT> }) {
1199
1433
  {selectedItem.decisionSummary}
1200
1434
  </p>
1201
1435
  )}
1202
- <div className="border-t pt-4">
1436
+ <div className="rounded-lg bg-muted/20 p-3 shadow-sm">
1203
1437
  <p className="text-sm font-medium">{t("triage.decisions")}</p>
1204
1438
  {selectedItem.decisions?.length ? (
1205
1439
  selectedItem.decisions.map((decision) => (
1206
1440
  <div
1207
1441
  key={decision.decisionId}
1208
- className="mt-3 space-y-3 rounded-md border p-3"
1442
+ className="mt-3 space-y-3 rounded-lg bg-card p-3 shadow-sm"
1209
1443
  >
1210
1444
  <p className="text-sm">
1211
1445
  {decision.summary ?? decision.reason}
@@ -1279,7 +1513,9 @@ function RulesView({ t }: { t: ReturnType<typeof useT> }) {
1279
1513
  <div className="grid gap-4 p-4 lg:grid-cols-[280px_minmax(0,1fr)] lg:p-6">
1280
1514
  <Card>
1281
1515
  <CardHeader>
1282
- <CardTitle className="text-base">Rules</CardTitle>
1516
+ <CardTitle className="text-base">
1517
+ {t("factoryRoute.rulesTitle")}
1518
+ </CardTitle>
1283
1519
  <p className="text-sm text-muted-foreground">
1284
1520
  {t("factoryRoute.rulesDescription")}
1285
1521
  </p>
@@ -1305,7 +1541,9 @@ function RulesView({ t }: { t: ReturnType<typeof useT> }) {
1305
1541
  onClick={() => selectRule(rule)}
1306
1542
  >
1307
1543
  <span className="min-w-0 truncate">{rule.name}</span>
1308
- <span className="text-xs text-muted-foreground">Shadow</span>
1544
+ <span className="text-xs text-muted-foreground">
1545
+ {t("factoryRoute.shadowLabel")}
1546
+ </span>
1309
1547
  </Button>
1310
1548
  ))}
1311
1549
  </CardContent>
@@ -1317,13 +1555,15 @@ function RulesView({ t }: { t: ReturnType<typeof useT> }) {
1317
1555
  {t("factoryRoute.editRule")}
1318
1556
  </CardTitle>
1319
1557
  <p className="mt-1 text-sm text-muted-foreground">
1320
- Use prompts for classification; keep safety in structured guards.
1558
+ {t("factoryRoute.rulesGuidance")}
1321
1559
  </p>
1322
1560
  </div>
1323
1561
  </CardHeader>
1324
1562
  <CardContent className="space-y-4">
1325
1563
  <div className="grid gap-1.5">
1326
- <Label htmlFor="factory-rule-name">Name</Label>
1564
+ <Label htmlFor="factory-rule-name">
1565
+ {t("factoryRoute.ruleNameLabel")}
1566
+ </Label>
1327
1567
  <Input
1328
1568
  id="factory-rule-name"
1329
1569
  value={name}
@@ -1361,7 +1601,7 @@ function RulesView({ t }: { t: ReturnType<typeof useT> }) {
1361
1601
  disabled={!name.trim() || !prompt.trim() || saveMutation.isPending}
1362
1602
  >
1363
1603
  {saveMutation.isPending && <IconLoader2 className="animate-spin" />}
1364
- Save rule
1604
+ {t("factoryRoute.saveRule")}
1365
1605
  </Button>
1366
1606
  </CardContent>
1367
1607
  </Card>
@@ -1370,18 +1610,6 @@ function RulesView({ t }: { t: ReturnType<typeof useT> }) {
1370
1610
  }
1371
1611
 
1372
1612
  function SettingsView({ t }: { t: ReturnType<typeof useT> }) {
1373
- const [workspace, setWorkspace] = useState<"primary" | "secondary">(
1374
- "primary",
1375
- );
1376
- const [channelId, setChannelId] = useState("");
1377
- const [channelName, setChannelName] = useState("");
1378
- const [repository, setRepository] = useState("");
1379
- const [polling, setPolling] = useState(false);
1380
- const [githubPolling, setGithubPolling] = useState(false);
1381
- const [sentryPolling, setSentryPolling] = useState(false);
1382
- const [sentryOrgSlug, setSentryOrgSlug] = useState("");
1383
- const [sentryProjectSlug, setSentryProjectSlug] = useState("");
1384
- const [sentryEnvironment, setSentryEnvironment] = useState("");
1385
1613
  const [automationFailureAlertsEnabled, setAutomationFailureAlertsEnabled] =
1386
1614
  useState(true);
1387
1615
  const [automationFailureAlertEmail, setAutomationFailureAlertEmail] =
@@ -1393,219 +1621,125 @@ function SettingsView({ t }: { t: ReturnType<typeof useT> }) {
1393
1621
  { refetchInterval: 60_000 },
1394
1622
  );
1395
1623
  const mutation = useActionMutation("save-triage-config");
1624
+
1396
1625
  useEffect(() => {
1397
1626
  const data = query.data as TriageConfig | undefined;
1398
1627
  if (!data) return;
1399
- setWorkspace(data.slackWorkspace ?? "primary");
1400
- setChannelId(data.slackChannelId ?? "");
1401
- setChannelName(data.slackChannelName ?? "");
1402
- setRepository(data.repository ?? "");
1403
- setPolling(data.pollingEnabled ?? false);
1404
- setGithubPolling(data.githubPollingEnabled ?? false);
1405
- setSentryPolling(data.sentryPollingEnabled ?? false);
1406
- setSentryOrgSlug(data.sentryOrgSlug ?? "");
1407
- setSentryProjectSlug(data.sentryProjectSlug ?? "");
1408
- setSentryEnvironment(data.sentryEnvironment ?? "");
1409
1628
  setAutomationFailureAlertsEnabled(
1410
1629
  data.automationFailureAlertsEnabled ?? true,
1411
1630
  );
1412
1631
  setAutomationFailureAlertEmail(data.automationFailureAlertEmail ?? "");
1413
1632
  }, [query.data]);
1633
+
1634
+ const saveSettings = () => {
1635
+ mutation.mutate({
1636
+ automationFailureAlertsEnabled,
1637
+ ...(automationFailureAlertEmail.trim()
1638
+ ? { automationFailureAlertEmail: automationFailureAlertEmail.trim() }
1639
+ : {}),
1640
+ });
1641
+ };
1642
+
1643
+ if (query.isLoading) {
1644
+ return (
1645
+ <div className="mx-auto w-full max-w-3xl space-y-6 p-4 lg:p-6">
1646
+ <FactorySettingsSkeleton t={t} />
1647
+ </div>
1648
+ );
1649
+ }
1650
+
1414
1651
  return (
1415
- <div className="max-w-4xl space-y-4 p-4 lg:p-6">
1416
- <Card>
1417
- <CardHeader>
1418
- <CardTitle className="text-base">
1419
- {t("triage.settingsTitle")}
1420
- </CardTitle>
1421
- <p className="text-sm text-muted-foreground">
1422
- {t("factoryRoute.settingsDescription")}
1423
- </p>
1424
- </CardHeader>
1425
- <CardContent className="grid gap-4 sm:grid-cols-2">
1426
- <div className="grid gap-1.5">
1427
- <Label htmlFor="factory-slack-workspace">
1428
- {t("triage.slackWorkspace")}
1429
- </Label>
1430
- <select
1431
- id="factory-slack-workspace"
1432
- value={workspace}
1433
- onChange={(event) =>
1434
- setWorkspace(event.target.value as "primary" | "secondary")
1652
+ <div className="mx-auto w-full max-w-3xl space-y-6 p-4 lg:p-6">
1653
+ <SettingsGroup variant="soft">
1654
+ <SettingsRow
1655
+ label={t("factoryRoute.workspaceIntegrations")}
1656
+ description={t("settings.workspaceDescription")}
1657
+ control={
1658
+ <Button asChild type="button" variant="outline">
1659
+ <Link to={buildSettingsRoute("integrations")}>Manage</Link>
1660
+ </Button>
1661
+ }
1662
+ />
1663
+ <SettingsRow
1664
+ label={t("factoryRoute.agentAccess")}
1665
+ description={t("settings.agentDescription")}
1666
+ control={
1667
+ <Button asChild type="button" variant="outline">
1668
+ <Link to={buildSettingsRoute("agent")}>Manage</Link>
1669
+ </Button>
1670
+ }
1671
+ />
1672
+ </SettingsGroup>
1673
+
1674
+ <SettingsGroup variant="soft">
1675
+ <SettingsRow
1676
+ label={t("factoryRoute.automationFailureAlertsTitle")}
1677
+ description={t("factoryRoute.automationFailureAlertsDescription")}
1678
+ control={
1679
+ <Switch
1680
+ aria-label={t("factoryRoute.automationFailureAlertsEnabled")}
1681
+ checked={automationFailureAlertsEnabled}
1682
+ onCheckedChange={(checked) =>
1683
+ setAutomationFailureAlertsEnabled(checked === true)
1435
1684
  }
1436
- className="h-9 rounded-md border bg-background px-3 text-sm"
1437
- >
1438
- <option value="primary">primary</option>
1439
- <option value="secondary">secondary</option>
1440
- </select>
1441
- </div>
1442
- <div className="grid gap-1.5">
1443
- <Label htmlFor="factory-slack-channel-id">
1444
- {t("triage.slackChannelId")}
1445
- </Label>
1446
- <Input
1447
- id="factory-slack-channel-id"
1448
- value={channelId}
1449
- onChange={(event) => setChannelId(event.target.value)}
1450
- placeholder="C0123456789"
1451
- />
1452
- </div>
1453
- <div className="grid gap-1.5">
1454
- <Label htmlFor="factory-slack-channel-name">
1455
- {t("triage.slackChannelName")}
1456
- </Label>
1457
- <Input
1458
- id="factory-slack-channel-name"
1459
- value={channelName}
1460
- onChange={(event) => setChannelName(event.target.value)}
1461
- placeholder="product-agent-native-feedback"
1462
- />
1463
- </div>
1464
- <div className="grid gap-1.5">
1465
- <Label htmlFor="factory-repository">{t("triage.repository")}</Label>
1466
- <Input
1467
- id="factory-repository"
1468
- value={repository}
1469
- onChange={(event) => setRepository(event.target.value)}
1470
- placeholder={t("triage.repositoryPlaceholder")}
1471
- />
1472
- </div>
1473
- <label className="flex items-center gap-2 text-sm sm:col-span-2">
1474
- <Checkbox
1475
- checked={polling}
1476
- onCheckedChange={(checked) => setPolling(checked === true)}
1477
- />
1478
- {t("triage.enablePolling")}
1479
- </label>
1480
- <label className="flex items-center gap-2 text-sm sm:col-span-2">
1481
- <Checkbox
1482
- checked={githubPolling}
1483
- onCheckedChange={(checked) => setGithubPolling(checked === true)}
1484
1685
  />
1485
- {t("triage.enableGithubPolling")}
1486
- </label>
1487
- <div className="grid gap-1.5">
1488
- <Label htmlFor="factory-sentry-org">
1489
- {t("triage.sentryOrgSlug")}
1490
- </Label>
1491
- <Input
1492
- id="factory-sentry-org"
1493
- value={sentryOrgSlug}
1494
- onChange={(event) => setSentryOrgSlug(event.target.value)}
1495
- placeholder={t("triage.sentryOrgPlaceholder")}
1496
- />
1497
- </div>
1498
- <div className="grid gap-1.5">
1499
- <Label htmlFor="factory-sentry-project">
1500
- {t("triage.sentryProjectSlug")}
1501
- </Label>
1502
- <Input
1503
- id="factory-sentry-project"
1504
- value={sentryProjectSlug}
1505
- onChange={(event) => setSentryProjectSlug(event.target.value)}
1506
- placeholder={t("triage.sentryProjectPlaceholder")}
1507
- />
1508
- </div>
1509
- <div className="grid gap-1.5">
1510
- <Label htmlFor="factory-sentry-environment">
1511
- {t("triage.sentryEnvironment")}
1512
- </Label>
1686
+ }
1687
+ />
1688
+ <SettingsRow
1689
+ label={t("factoryRoute.automationFailureAlertEmail")}
1690
+ description={t("factoryRoute.automationFailureAlertEmailPlaceholder")}
1691
+ control={
1513
1692
  <Input
1514
- id="factory-sentry-environment"
1515
- value={sentryEnvironment}
1516
- onChange={(event) => setSentryEnvironment(event.target.value)}
1517
- placeholder={t("triage.sentryEnvironmentPlaceholder")}
1518
- />
1519
- </div>
1520
- <label className="flex items-center gap-2 text-sm sm:col-span-2">
1521
- <Checkbox
1522
- checked={sentryPolling}
1523
- onCheckedChange={(checked) => setSentryPolling(checked === true)}
1693
+ aria-label={t("factoryRoute.automationFailureAlertEmail")}
1694
+ type="email"
1695
+ value={automationFailureAlertEmail}
1696
+ onChange={(event) =>
1697
+ setAutomationFailureAlertEmail(event.target.value)
1698
+ }
1699
+ placeholder={t(
1700
+ "factoryRoute.automationFailureAlertEmailPlaceholder",
1701
+ )}
1702
+ className="h-9 w-full sm:w-64"
1524
1703
  />
1525
- {t("triage.enableSentryPolling")}
1526
- </label>
1527
- <div className="space-y-3 border-t pt-4 sm:col-span-2">
1528
- <div>
1529
- <h3 className="text-sm font-medium">
1530
- {t("factoryRoute.automationFailureAlertsTitle")}
1531
- </h3>
1532
- <p className="mt-1 text-sm text-muted-foreground">
1533
- {t("factoryRoute.automationFailureAlertsDescription")}
1534
- </p>
1535
- </div>
1536
- <label className="flex items-center gap-2 text-sm">
1537
- <Checkbox
1538
- checked={automationFailureAlertsEnabled}
1539
- onCheckedChange={(checked) =>
1540
- setAutomationFailureAlertsEnabled(checked === true)
1541
- }
1542
- />
1543
- {t("factoryRoute.automationFailureAlertsEnabled")}
1544
- </label>
1545
- <div className="grid gap-1.5 sm:max-w-md">
1546
- <Label htmlFor="factory-automation-failure-email">
1547
- {t("factoryRoute.automationFailureAlertEmail")}
1548
- </Label>
1549
- <Input
1550
- id="factory-automation-failure-email"
1551
- type="email"
1552
- value={automationFailureAlertEmail}
1553
- onChange={(event) =>
1554
- setAutomationFailureAlertEmail(event.target.value)
1555
- }
1556
- placeholder={t(
1557
- "factoryRoute.automationFailureAlertEmailPlaceholder",
1558
- )}
1559
- />
1560
- </div>
1561
- <p className="text-xs text-muted-foreground">
1562
- {t("factoryRoute.automationFailureEmailReadiness")}:{" "}
1704
+ }
1705
+ />
1706
+ <SettingsRow
1707
+ label={t("factoryRoute.automationFailureEmailReadiness")}
1708
+ description={t("factoryRoute.automationEmailReadinessHint")}
1709
+ control={
1710
+ <span className="rounded-full bg-muted px-2.5 py-1 text-xs font-medium text-muted-foreground">
1563
1711
  {(query.data as TriageConfig | undefined)?.emailReadiness
1564
1712
  ?.status ?? "unknown"}
1565
- </p>
1566
- <p className="text-xs text-muted-foreground">
1567
- {t("factoryRoute.automationEmailReadinessHint")}
1568
- </p>
1569
- {query.isError && (
1570
- <p className="text-xs text-destructive">
1571
- {t("factoryRoute.automationDiagnosticsLoadError")}{" "}
1572
- {query.error instanceof Error
1573
- ? query.error.message
1574
- : String(query.error)}
1575
- </p>
1576
- )}
1577
- </div>
1578
- <div className="sm:col-span-2">
1579
- <Button
1580
- onClick={() =>
1581
- mutation.mutate({
1582
- slackWorkspace: workspace,
1583
- slackChannelId: channelId,
1584
- slackChannelName: channelName,
1585
- repository,
1586
- pollingEnabled: polling,
1587
- githubPollingEnabled: githubPolling,
1588
- sentryPollingEnabled: sentryPolling,
1589
- sentryOrgSlug,
1590
- sentryProjectSlug,
1591
- sentryEnvironment,
1592
- automationFailureAlertsEnabled,
1593
- ...(automationFailureAlertEmail.trim()
1594
- ? {
1595
- automationFailureAlertEmail:
1596
- automationFailureAlertEmail.trim(),
1597
- }
1598
- : {}),
1599
- })
1600
- }
1601
- disabled={mutation.isPending}
1602
- >
1603
- {mutation.isPending && <IconLoader2 className="animate-spin" />}
1604
- {t("triage.saveSettings")}
1605
- </Button>
1713
+ </span>
1714
+ }
1715
+ />
1716
+ {query.isError && (
1717
+ <div className="px-5 py-3 text-xs text-destructive sm:px-6">
1718
+ {t("factoryRoute.automationDiagnosticsLoadError")}{" "}
1719
+ {query.error instanceof Error
1720
+ ? query.error.message
1721
+ : String(query.error)}
1606
1722
  </div>
1607
- </CardContent>
1608
- </Card>
1723
+ )}
1724
+ </SettingsGroup>
1725
+
1726
+ <div className="flex flex-wrap items-center justify-end gap-3">
1727
+ {mutation.isError && (
1728
+ <p className="text-sm text-destructive" role="alert">
1729
+ {t("triage.settingsError")}
1730
+ </p>
1731
+ )}
1732
+ {mutation.isSuccess && (
1733
+ <p className="text-sm text-muted-foreground" role="status">
1734
+ {t("triage.settingsSaved")}
1735
+ </p>
1736
+ )}
1737
+ <Button onClick={saveSettings} disabled={mutation.isPending}>
1738
+ {mutation.isPending && <IconLoader2 className="animate-spin" />}
1739
+ {t("triage.saveSettings")}
1740
+ </Button>
1741
+ </div>
1742
+
1609
1743
  <SchedulerHealthStatus
1610
1744
  health={schedulerHealthQuery.data}
1611
1745
  isError={schedulerHealthQuery.isError}
@@ -1616,6 +1750,27 @@ function SettingsView({ t }: { t: ReturnType<typeof useT> }) {
1616
1750
  );
1617
1751
  }
1618
1752
 
1753
+ function FactorySettingsSkeleton({ t }: { t: ReturnType<typeof useT> }) {
1754
+ return (
1755
+ <div className="space-y-6" aria-label={t("triage.loading")}>
1756
+ {Array.from({ length: 2 }).map((_, index) => (
1757
+ <div key={index} className="grid gap-2">
1758
+ <div className="grid gap-2">
1759
+ {Array.from({ length: index === 0 ? 5 : 3 }).map((_, rowIndex) => (
1760
+ <div
1761
+ key={rowIndex}
1762
+ className="flex min-h-20 items-center justify-between gap-4 rounded-xl bg-card px-5 py-4 shadow-sm sm:px-6"
1763
+ >
1764
+ <div className="h-3.5 w-36 animate-pulse rounded bg-muted" />
1765
+ <div className="h-9 w-24 animate-pulse rounded bg-muted" />
1766
+ </div>
1767
+ ))}
1768
+ </div>
1769
+ </div>
1770
+ ))}
1771
+ </div>
1772
+ );
1773
+ }
1619
1774
  function SchedulerHealthStatus({
1620
1775
  health,
1621
1776
  isError,
@@ -1641,72 +1796,44 @@ function SchedulerHealthStatus({
1641
1796
  !isError &&
1642
1797
  (!health || health.status === "no-data") &&
1643
1798
  !health?.lastCheckedAt;
1644
- const hasDiagnostics =
1645
- isError ||
1646
- hasNoHeartbeat ||
1647
- health?.status === "stale" ||
1648
- health?.status === "error" ||
1649
- Boolean(health?.lastError);
1799
+ const healthDescription = isError
1800
+ ? `${t("factoryRoute.automationDiagnosticsLoadError")} ${error instanceof Error ? error.message : String(error)}`
1801
+ : health?.lastError
1802
+ ? `${t("factoryRoute.automationHealthErrorDetail")}: ${health.lastError}`
1803
+ : health?.status === "stale"
1804
+ ? t("factoryRoute.automationHealthStaleHint")
1805
+ : hasNoHeartbeat
1806
+ ? t("factoryRoute.automationHealthNoDataHint")
1807
+ : undefined;
1650
1808
 
1651
1809
  return (
1652
- <section
1653
- aria-labelledby="factory-scheduler-health"
1654
- className="border-t px-1 pt-4"
1655
- >
1656
- <div className="flex flex-wrap items-center justify-between gap-x-4 gap-y-2">
1657
- <div className="flex flex-wrap items-center gap-2">
1658
- <h2
1659
- id="factory-scheduler-health"
1660
- className="text-sm font-medium text-muted-foreground"
1661
- >
1662
- {t("factoryRoute.automationHealthTitle")}
1663
- </h2>
1664
- <span className="rounded-full border px-2 py-0.5 text-xs font-medium">
1665
- {healthLabel}
1666
- </span>
1667
- </div>
1668
- <div className="flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground">
1669
- {health?.lastCheckedAt && (
1670
- <span>
1671
- {t("factoryRoute.automationLastCheck")}:{" "}
1672
- {formatAutomationDate(health.lastCheckedAt)}
1673
- </span>
1674
- )}
1675
- {health?.lastDispatchedAt && (
1676
- <span>
1677
- {t("factoryRoute.automationLastDispatch")}:{" "}
1678
- {formatAutomationDate(health.lastDispatchedAt)}
1810
+ <SettingsGroup variant="soft">
1811
+ <SettingsRow
1812
+ label={t("factoryRoute.automationHealthTitle")}
1813
+ description={
1814
+ healthDescription ?? t("factoryRoute.automationHealthDescription")
1815
+ }
1816
+ control={
1817
+ <div className="flex flex-wrap items-center justify-end gap-x-4 gap-y-1">
1818
+ <span className="rounded-full bg-muted px-2.5 py-1 text-xs font-medium">
1819
+ {healthLabel}
1679
1820
  </span>
1680
- )}
1681
- </div>
1682
- </div>
1683
- {hasDiagnostics && (
1684
- <div className="mt-2 grid gap-1 text-xs">
1685
- {hasNoHeartbeat && (
1686
- <p className="text-muted-foreground">
1687
- {t("factoryRoute.automationHealthNoDataHint")}
1688
- </p>
1689
- )}
1690
- {health?.status === "stale" && (
1691
- <p className="text-destructive">
1692
- {t("factoryRoute.automationHealthStaleHint")}
1693
- </p>
1694
- )}
1695
- {health?.lastError && (
1696
- <p className="text-destructive">
1697
- {t("factoryRoute.automationHealthErrorDetail")}:{" "}
1698
- {health.lastError}
1699
- </p>
1700
- )}
1701
- {isError && (
1702
- <p className="text-destructive">
1703
- {t("factoryRoute.automationDiagnosticsLoadError")}{" "}
1704
- {error instanceof Error ? error.message : String(error)}
1705
- </p>
1706
- )}
1707
- </div>
1708
- )}
1709
- </section>
1821
+ {health?.lastCheckedAt && (
1822
+ <span className="text-xs text-muted-foreground">
1823
+ {t("factoryRoute.automationLastCheck")}:{" "}
1824
+ {formatAutomationDate(health.lastCheckedAt)}
1825
+ </span>
1826
+ )}
1827
+ {health?.lastDispatchedAt && (
1828
+ <span className="text-xs text-muted-foreground">
1829
+ {t("factoryRoute.automationLastDispatch")}:{" "}
1830
+ {formatAutomationDate(health.lastDispatchedAt)}
1831
+ </span>
1832
+ )}
1833
+ </div>
1834
+ }
1835
+ />
1836
+ </SettingsGroup>
1710
1837
  );
1711
1838
  }
1712
1839